Commit 13595a51 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB (6247): Fix bug #8689: Fixes IR stop/start during suspend/resume

IR workqueue should be disabled during suspend. This avoids some troubles, like
the one reported on bug #8689:

"The Hauppauge HVR 1100 ir-remote control does not work after resume from
suspend to ram or disk."

This patch disables IR before suspending, re-enabling it after resume.

Thanks to Peter Poklop <Peter.Poklop@gmx.at> for reporting it and helping with
the fix.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
Reviewed-by: default avatarPeter Poklop <Peter.Poklop@gmx.at>
parent b25be979
...@@ -1084,6 +1084,9 @@ EXPORT_SYMBOL(cx88_vdev_init); ...@@ -1084,6 +1084,9 @@ EXPORT_SYMBOL(cx88_vdev_init);
EXPORT_SYMBOL(cx88_core_get); EXPORT_SYMBOL(cx88_core_get);
EXPORT_SYMBOL(cx88_core_put); EXPORT_SYMBOL(cx88_core_put);
EXPORT_SYMBOL(cx88_ir_start);
EXPORT_SYMBOL(cx88_ir_stop);
/* /*
* Local variables: * Local variables:
* c-basic-offset: 8 * c-basic-offset: 8
......
...@@ -158,7 +158,7 @@ static void cx88_ir_work(struct work_struct *work) ...@@ -158,7 +158,7 @@ static void cx88_ir_work(struct work_struct *work)
mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling)); mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling));
} }
static void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir) void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir)
{ {
if (ir->polling) { if (ir->polling) {
setup_timer(&ir->timer, ir_timer, (unsigned long)ir); setup_timer(&ir->timer, ir_timer, (unsigned long)ir);
...@@ -172,7 +172,7 @@ static void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir) ...@@ -172,7 +172,7 @@ static void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir)
} }
} }
static void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir) void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir)
{ {
if (ir->sampling) { if (ir->sampling) {
cx_write(MO_DDSCFG_IO, 0x0); cx_write(MO_DDSCFG_IO, 0x0);
......
...@@ -1954,6 +1954,8 @@ static int cx8800_suspend(struct pci_dev *pci_dev, pm_message_t state) ...@@ -1954,6 +1954,8 @@ static int cx8800_suspend(struct pci_dev *pci_dev, pm_message_t state)
} }
spin_unlock(&dev->slock); spin_unlock(&dev->slock);
if (core->ir)
cx88_ir_stop(core, core->ir);
/* FIXME -- shutdown device */ /* FIXME -- shutdown device */
cx88_shutdown(core); cx88_shutdown(core);
...@@ -1993,6 +1995,10 @@ static int cx8800_resume(struct pci_dev *pci_dev) ...@@ -1993,6 +1995,10 @@ static int cx8800_resume(struct pci_dev *pci_dev)
/* FIXME: re-initialize hardware */ /* FIXME: re-initialize hardware */
cx88_reset(core); cx88_reset(core);
if (core->ir)
cx88_ir_start(core, core->ir);
cx_set(MO_PCI_INTMSK, core->pci_irqmask);
/* restart video+vbi capture */ /* restart video+vbi capture */
spin_lock(&dev->slock); spin_lock(&dev->slock);
......
...@@ -614,6 +614,8 @@ struct cx8802_driver * cx8802_get_driver(struct cx8802_dev *dev, enum cx88_board ...@@ -614,6 +614,8 @@ struct cx8802_driver * cx8802_get_driver(struct cx8802_dev *dev, enum cx88_board
int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci); int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci);
int cx88_ir_fini(struct cx88_core *core); int cx88_ir_fini(struct cx88_core *core);
void cx88_ir_irq(struct cx88_core *core); void cx88_ir_irq(struct cx88_core *core);
void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir);
void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir);
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
/* cx88-mpeg.c */ /* cx88-mpeg.c */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment