diff options
author | Andy Walls <awalls@md.metrocast.net> | 2010-07-19 00:35:46 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-08-08 22:42:56 -0400 |
commit | e5514f104d875b3d28cbcd5d4f2b96ab2fca1e29 (patch) | |
tree | 8869a2ac0445351e9da7a20304d44d3f5994b3fc /drivers/media/video/cx23885/cx23885-core.c | |
parent | dbe83a3b921328e12b2abe894fc692afba293d7f (diff) |
V4L/DVB: cx23885: Move AV Core irq handling to a work handler
Interrupts from the AV Core are best handled by a workqueue handler
since many I2C transactions are required to service the AV Core
interrupt. The AV_CORE PCI interrupt is disabled by the IRQ handler
and reenabled when the work handler is finished.
Signed-off-by: Andy Walls <awalls@md.metrocast.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/cx23885/cx23885-core.c')
-rw-r--r-- | drivers/media/video/cx23885/cx23885-core.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c index 0765abf4e42e..f6b62e7398af 100644 --- a/drivers/media/video/cx23885/cx23885-core.c +++ b/drivers/media/video/cx23885/cx23885-core.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include "cimax2.h" | 34 | #include "cimax2.h" |
35 | #include "cx23888-ir.h" | 35 | #include "cx23888-ir.h" |
36 | #include "cx23885-ir.h" | 36 | #include "cx23885-ir.h" |
37 | #include "cx23885-av.h" | ||
37 | #include "cx23885-input.h" | 38 | #include "cx23885-input.h" |
38 | 39 | ||
39 | MODULE_DESCRIPTION("Driver for cx23885 based TV cards"); | 40 | MODULE_DESCRIPTION("Driver for cx23885 based TV cards"); |
@@ -1856,13 +1857,13 @@ static irqreturn_t cx23885_irq(int irq, void *dev_id) | |||
1856 | handled++; | 1857 | handled++; |
1857 | } | 1858 | } |
1858 | 1859 | ||
1859 | if (pci_status & PCI_MSK_AV_CORE) { | 1860 | if ((pci_status & pci_mask) & PCI_MSK_AV_CORE) { |
1860 | subdev_handled = false; | 1861 | cx23885_irq_disable(dev, PCI_MSK_AV_CORE); |
1861 | v4l2_subdev_call(dev->sd_cx25840, | 1862 | if (!schedule_work(&dev->cx25840_work)) |
1862 | core, interrupt_service_routine, | 1863 | printk(KERN_ERR "%s: failed to set up deferred work for" |
1863 | pci_status, &subdev_handled); | 1864 | " AV Core/IR interrupt. Interrupt is disabled" |
1864 | if (subdev_handled) | 1865 | " and won't be re-enabled\n", dev->name); |
1865 | handled++; | 1866 | handled++; |
1866 | } | 1867 | } |
1867 | 1868 | ||
1868 | if (handled) | 1869 | if (handled) |
@@ -1882,11 +1883,11 @@ static void cx23885_v4l2_dev_notify(struct v4l2_subdev *sd, | |||
1882 | dev = to_cx23885(sd->v4l2_dev); | 1883 | dev = to_cx23885(sd->v4l2_dev); |
1883 | 1884 | ||
1884 | switch (notification) { | 1885 | switch (notification) { |
1885 | case V4L2_SUBDEV_IR_RX_NOTIFY: /* Called in an IRQ context */ | 1886 | case V4L2_SUBDEV_IR_RX_NOTIFY: /* Possibly called in an IRQ context */ |
1886 | if (sd == dev->sd_ir) | 1887 | if (sd == dev->sd_ir) |
1887 | cx23885_ir_rx_v4l2_dev_notify(sd, *(u32 *)arg); | 1888 | cx23885_ir_rx_v4l2_dev_notify(sd, *(u32 *)arg); |
1888 | break; | 1889 | break; |
1889 | case V4L2_SUBDEV_IR_TX_NOTIFY: /* Called in an IRQ context */ | 1890 | case V4L2_SUBDEV_IR_TX_NOTIFY: /* Possibly called in an IRQ context */ |
1890 | if (sd == dev->sd_ir) | 1891 | if (sd == dev->sd_ir) |
1891 | cx23885_ir_tx_v4l2_dev_notify(sd, *(u32 *)arg); | 1892 | cx23885_ir_tx_v4l2_dev_notify(sd, *(u32 *)arg); |
1892 | break; | 1893 | break; |
@@ -1895,6 +1896,7 @@ static void cx23885_v4l2_dev_notify(struct v4l2_subdev *sd, | |||
1895 | 1896 | ||
1896 | static void cx23885_v4l2_dev_notify_init(struct cx23885_dev *dev) | 1897 | static void cx23885_v4l2_dev_notify_init(struct cx23885_dev *dev) |
1897 | { | 1898 | { |
1899 | INIT_WORK(&dev->cx25840_work, cx23885_av_work_handler); | ||
1898 | INIT_WORK(&dev->ir_rx_work, cx23885_ir_rx_work_handler); | 1900 | INIT_WORK(&dev->ir_rx_work, cx23885_ir_rx_work_handler); |
1899 | INIT_WORK(&dev->ir_tx_work, cx23885_ir_tx_work_handler); | 1901 | INIT_WORK(&dev->ir_tx_work, cx23885_ir_tx_work_handler); |
1900 | dev->v4l2_dev.notify = cx23885_v4l2_dev_notify; | 1902 | dev->v4l2_dev.notify = cx23885_v4l2_dev_notify; |