aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/ivtv/ivtv-driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-driver.c')
-rw-r--r--drivers/media/video/ivtv/ivtv-driver.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/media/video/ivtv/ivtv-driver.c b/drivers/media/video/ivtv/ivtv-driver.c
index 1b79475ca134..49e0b1cc3544 100644
--- a/drivers/media/video/ivtv/ivtv-driver.c
+++ b/drivers/media/video/ivtv/ivtv-driver.c
@@ -695,6 +695,8 @@ done:
695 */ 695 */
696static int __devinit ivtv_init_struct1(struct ivtv *itv) 696static int __devinit ivtv_init_struct1(struct ivtv *itv)
697{ 697{
698 struct sched_param param = { .sched_priority = 99 };
699
698 itv->base_addr = pci_resource_start(itv->pdev, 0); 700 itv->base_addr = pci_resource_start(itv->pdev, 0);
699 itv->enc_mbox.max_mbox = 2; /* the encoder has 3 mailboxes (0-2) */ 701 itv->enc_mbox.max_mbox = 2; /* the encoder has 3 mailboxes (0-2) */
700 itv->dec_mbox.max_mbox = 1; /* the decoder has 2 mailboxes (0-1) */ 702 itv->dec_mbox.max_mbox = 1; /* the decoder has 2 mailboxes (0-1) */
@@ -706,13 +708,17 @@ static int __devinit ivtv_init_struct1(struct ivtv *itv)
706 spin_lock_init(&itv->lock); 708 spin_lock_init(&itv->lock);
707 spin_lock_init(&itv->dma_reg_lock); 709 spin_lock_init(&itv->dma_reg_lock);
708 710
709 itv->irq_work_queues = create_singlethread_workqueue(itv->v4l2_dev.name); 711 init_kthread_worker(&itv->irq_worker);
710 if (itv->irq_work_queues == NULL) { 712 itv->irq_worker_task = kthread_run(kthread_worker_fn, &itv->irq_worker,
711 IVTV_ERR("Could not create ivtv workqueue\n"); 713 itv->v4l2_dev.name);
714 if (IS_ERR(itv->irq_worker_task)) {
715 IVTV_ERR("Could not create ivtv task\n");
712 return -1; 716 return -1;
713 } 717 }
718 /* must use the FIFO scheduler as it is realtime sensitive */
719 sched_setscheduler(itv->irq_worker_task, SCHED_FIFO, &param);
714 720
715 INIT_WORK(&itv->irq_work_queue, ivtv_irq_work_handler); 721 init_kthread_work(&itv->irq_work, ivtv_irq_work_handler);
716 722
717 /* start counting open_id at 1 */ 723 /* start counting open_id at 1 */
718 itv->open_id = 1; 724 itv->open_id = 1;
@@ -996,7 +1002,7 @@ static int __devinit ivtv_probe(struct pci_dev *pdev,
996 /* PCI Device Setup */ 1002 /* PCI Device Setup */
997 retval = ivtv_setup_pci(itv, pdev, pci_id); 1003 retval = ivtv_setup_pci(itv, pdev, pci_id);
998 if (retval == -EIO) 1004 if (retval == -EIO)
999 goto free_workqueue; 1005 goto free_worker;
1000 if (retval == -ENXIO) 1006 if (retval == -ENXIO)
1001 goto free_mem; 1007 goto free_mem;
1002 1008
@@ -1208,8 +1214,8 @@ free_mem:
1208 release_mem_region(itv->base_addr + IVTV_REG_OFFSET, IVTV_REG_SIZE); 1214 release_mem_region(itv->base_addr + IVTV_REG_OFFSET, IVTV_REG_SIZE);
1209 if (itv->has_cx23415) 1215 if (itv->has_cx23415)
1210 release_mem_region(itv->base_addr + IVTV_DECODER_OFFSET, IVTV_DECODER_SIZE); 1216 release_mem_region(itv->base_addr + IVTV_DECODER_OFFSET, IVTV_DECODER_SIZE);
1211free_workqueue: 1217free_worker:
1212 destroy_workqueue(itv->irq_work_queues); 1218 kthread_stop(itv->irq_worker_task);
1213err: 1219err:
1214 if (retval == 0) 1220 if (retval == 0)
1215 retval = -ENODEV; 1221 retval = -ENODEV;
@@ -1353,9 +1359,9 @@ static void ivtv_remove(struct pci_dev *pdev)
1353 ivtv_set_irq_mask(itv, 0xffffffff); 1359 ivtv_set_irq_mask(itv, 0xffffffff);
1354 del_timer_sync(&itv->dma_timer); 1360 del_timer_sync(&itv->dma_timer);
1355 1361
1356 /* Stop all Work Queues */ 1362 /* Kill irq worker */
1357 flush_workqueue(itv->irq_work_queues); 1363 flush_kthread_worker(&itv->irq_worker);
1358 destroy_workqueue(itv->irq_work_queues); 1364 kthread_stop(itv->irq_worker_task);
1359 1365
1360 ivtv_streams_cleanup(itv, 1); 1366 ivtv_streams_cleanup(itv, 1);
1361 ivtv_udma_free(itv); 1367 ivtv_udma_free(itv);