diff options
Diffstat (limited to 'drivers/media/video')
-rw-r--r-- | drivers/media/video/cx18/cx18-driver.c | 33 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx18-driver.h | 2 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx18-mailbox.c | 2 |
3 files changed, 14 insertions, 23 deletions
diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c index fbcbb500ca74..a893caff0aa9 100644 --- a/drivers/media/video/cx18/cx18-driver.c +++ b/drivers/media/video/cx18/cx18-driver.c | |||
@@ -56,9 +56,6 @@ struct cx18 *cx18_cards[CX18_MAX_CARDS]; | |||
56 | /* Protects cx18_cards_active */ | 56 | /* Protects cx18_cards_active */ |
57 | DEFINE_SPINLOCK(cx18_cards_lock); | 57 | DEFINE_SPINLOCK(cx18_cards_lock); |
58 | 58 | ||
59 | /* Queue for deferrable IRQ handling work for all cx18 cards in system */ | ||
60 | struct workqueue_struct *cx18_work_queue; | ||
61 | |||
62 | /* add your revision and whatnot here */ | 59 | /* add your revision and whatnot here */ |
63 | static struct pci_device_id cx18_pci_tbl[] __devinitdata = { | 60 | static struct pci_device_id cx18_pci_tbl[] __devinitdata = { |
64 | {PCI_VENDOR_ID_CX, PCI_DEVICE_ID_CX23418, | 61 | {PCI_VENDOR_ID_CX, PCI_DEVICE_ID_CX23418, |
@@ -446,6 +443,12 @@ static int __devinit cx18_init_struct1(struct cx18 *cx) | |||
446 | 443 | ||
447 | spin_lock_init(&cx->lock); | 444 | spin_lock_init(&cx->lock); |
448 | 445 | ||
446 | cx->work_queue = create_singlethread_workqueue(cx->name); | ||
447 | if (cx->work_queue == NULL) { | ||
448 | CX18_ERR("Unable to create work hander thread\n"); | ||
449 | return -ENOMEM; | ||
450 | } | ||
451 | |||
449 | for (i = 0; i < CX18_MAX_EPU_WORK_ORDERS; i++) { | 452 | for (i = 0; i < CX18_MAX_EPU_WORK_ORDERS; i++) { |
450 | cx->epu_work_order[i].cx = cx; | 453 | cx->epu_work_order[i].cx = cx; |
451 | cx->epu_work_order[i].str = cx->epu_debug_str; | 454 | cx->epu_work_order[i].str = cx->epu_debug_str; |
@@ -655,12 +658,9 @@ static int __devinit cx18_probe(struct pci_dev *dev, | |||
655 | 658 | ||
656 | /* PCI Device Setup */ | 659 | /* PCI Device Setup */ |
657 | retval = cx18_setup_pci(cx, dev, pci_id); | 660 | retval = cx18_setup_pci(cx, dev, pci_id); |
658 | if (retval != 0) { | 661 | if (retval != 0) |
659 | if (retval == -EIO) | 662 | goto free_workqueue; |
660 | goto free_workqueue; | 663 | |
661 | else if (retval == -ENXIO) | ||
662 | goto free_mem; | ||
663 | } | ||
664 | /* save cx in the pci struct for later use */ | 664 | /* save cx in the pci struct for later use */ |
665 | pci_set_drvdata(dev, cx); | 665 | pci_set_drvdata(dev, cx); |
666 | 666 | ||
@@ -830,6 +830,7 @@ free_map: | |||
830 | free_mem: | 830 | free_mem: |
831 | release_mem_region(cx->base_addr, CX18_MEM_SIZE); | 831 | release_mem_region(cx->base_addr, CX18_MEM_SIZE); |
832 | free_workqueue: | 832 | free_workqueue: |
833 | destroy_workqueue(cx->work_queue); | ||
833 | err: | 834 | err: |
834 | if (retval == 0) | 835 | if (retval == 0) |
835 | retval = -ENODEV; | 836 | retval = -ENODEV; |
@@ -938,6 +939,8 @@ static void cx18_remove(struct pci_dev *pci_dev) | |||
938 | 939 | ||
939 | cx18_cancel_epu_work_orders(cx); | 940 | cx18_cancel_epu_work_orders(cx); |
940 | 941 | ||
942 | destroy_workqueue(cx->work_queue); | ||
943 | |||
941 | cx18_streams_cleanup(cx, 1); | 944 | cx18_streams_cleanup(cx, 1); |
942 | 945 | ||
943 | exit_cx18_i2c(cx); | 946 | exit_cx18_i2c(cx); |
@@ -979,17 +982,8 @@ static int module_start(void) | |||
979 | printk(KERN_INFO "cx18: Debug value must be >= 0 and <= 511!\n"); | 982 | printk(KERN_INFO "cx18: Debug value must be >= 0 and <= 511!\n"); |
980 | } | 983 | } |
981 | 984 | ||
982 | cx18_work_queue = create_singlethread_workqueue("cx18"); | ||
983 | if (cx18_work_queue == NULL) { | ||
984 | printk(KERN_ERR | ||
985 | "cx18: Unable to create work hander thread\n"); | ||
986 | return -ENOMEM; | ||
987 | } | ||
988 | |||
989 | if (pci_register_driver(&cx18_pci_driver)) { | 985 | if (pci_register_driver(&cx18_pci_driver)) { |
990 | printk(KERN_ERR "cx18: Error detecting PCI card\n"); | 986 | printk(KERN_ERR "cx18: Error detecting PCI card\n"); |
991 | destroy_workqueue(cx18_work_queue); | ||
992 | cx18_work_queue = NULL; | ||
993 | return -ENODEV; | 987 | return -ENODEV; |
994 | } | 988 | } |
995 | printk(KERN_INFO "cx18: End initialization\n"); | 989 | printk(KERN_INFO "cx18: End initialization\n"); |
@@ -1002,9 +996,6 @@ static void module_cleanup(void) | |||
1002 | 996 | ||
1003 | pci_unregister_driver(&cx18_pci_driver); | 997 | pci_unregister_driver(&cx18_pci_driver); |
1004 | 998 | ||
1005 | destroy_workqueue(cx18_work_queue); | ||
1006 | cx18_work_queue = NULL; | ||
1007 | |||
1008 | for (i = 0; i < cx18_cards_active; i++) { | 999 | for (i = 0; i < cx18_cards_active; i++) { |
1009 | if (cx18_cards[i] == NULL) | 1000 | if (cx18_cards[i] == NULL) |
1010 | continue; | 1001 | continue; |
diff --git a/drivers/media/video/cx18/cx18-driver.h b/drivers/media/video/cx18/cx18-driver.h index ca1f43781941..94c196a91295 100644 --- a/drivers/media/video/cx18/cx18-driver.h +++ b/drivers/media/video/cx18/cx18-driver.h | |||
@@ -447,6 +447,7 @@ struct cx18 { | |||
447 | u32 sw2_irq_mask; | 447 | u32 sw2_irq_mask; |
448 | u32 hw2_irq_mask; | 448 | u32 hw2_irq_mask; |
449 | 449 | ||
450 | struct workqueue_struct *work_queue; | ||
450 | struct cx18_epu_work_order epu_work_order[CX18_MAX_EPU_WORK_ORDERS]; | 451 | struct cx18_epu_work_order epu_work_order[CX18_MAX_EPU_WORK_ORDERS]; |
451 | char epu_debug_str[256]; /* CX18_EPU_DEBUG is rare: use shared space */ | 452 | char epu_debug_str[256]; /* CX18_EPU_DEBUG is rare: use shared space */ |
452 | 453 | ||
@@ -478,7 +479,6 @@ extern struct cx18 *cx18_cards[]; | |||
478 | extern int cx18_cards_active; | 479 | extern int cx18_cards_active; |
479 | extern int cx18_first_minor; | 480 | extern int cx18_first_minor; |
480 | extern spinlock_t cx18_cards_lock; | 481 | extern spinlock_t cx18_cards_lock; |
481 | extern struct workqueue_struct *cx18_work_queue; | ||
482 | 482 | ||
483 | /*==============Prototypes==================*/ | 483 | /*==============Prototypes==================*/ |
484 | 484 | ||
diff --git a/drivers/media/video/cx18/cx18-mailbox.c b/drivers/media/video/cx18/cx18-mailbox.c index 70a82721b551..b013e817926a 100644 --- a/drivers/media/video/cx18/cx18-mailbox.c +++ b/drivers/media/video/cx18/cx18-mailbox.c | |||
@@ -454,7 +454,7 @@ void cx18_api_epu_cmd_irq(struct cx18 *cx, int rpu) | |||
454 | */ | 454 | */ |
455 | submit = epu_cmd_irq(cx, order); | 455 | submit = epu_cmd_irq(cx, order); |
456 | if (submit > 0) { | 456 | if (submit > 0) { |
457 | queue_work(cx18_work_queue, &order->work); | 457 | queue_work(cx->work_queue, &order->work); |
458 | } | 458 | } |
459 | } | 459 | } |
460 | 460 | ||