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 90daa6e751d8..07c5c18a25cb 100644
--- a/drivers/media/video/ivtv/ivtv-driver.c
+++ b/drivers/media/video/ivtv/ivtv-driver.c
@@ -705,6 +705,8 @@ done:
705 */ 705 */
706static int __devinit ivtv_init_struct1(struct ivtv *itv) 706static int __devinit ivtv_init_struct1(struct ivtv *itv)
707{ 707{
708 struct sched_param param = { .sched_priority = 99 };
709
708 itv->base_addr = pci_resource_start(itv->pdev, 0); 710 itv->base_addr = pci_resource_start(itv->pdev, 0);
709 itv->enc_mbox.max_mbox = 2; /* the encoder has 3 mailboxes (0-2) */ 711 itv->enc_mbox.max_mbox = 2; /* the encoder has 3 mailboxes (0-2) */
710 itv->dec_mbox.max_mbox = 1; /* the decoder has 2 mailboxes (0-1) */ 712 itv->dec_mbox.max_mbox = 1; /* the decoder has 2 mailboxes (0-1) */
@@ -716,13 +718,17 @@ static int __devinit ivtv_init_struct1(struct ivtv *itv)
716 spin_lock_init(&itv->lock); 718 spin_lock_init(&itv->lock);
717 spin_lock_init(&itv->dma_reg_lock); 719 spin_lock_init(&itv->dma_reg_lock);
718 720
719 itv->irq_work_queues = create_singlethread_workqueue(itv->v4l2_dev.name); 721 init_kthread_worker(&itv->irq_worker);
720 if (itv->irq_work_queues == NULL) { 722 itv->irq_worker_task = kthread_run(kthread_worker_fn, &itv->irq_worker,
721 IVTV_ERR("Could not create ivtv workqueue\n"); 723 itv->v4l2_dev.name);
724 if (IS_ERR(itv->irq_worker_task)) {
725 IVTV_ERR("Could not create ivtv task\n");
722 return -1; 726 return -1;
723 } 727 }
728 /* must use the FIFO scheduler as it is realtime sensitive */
729 sched_setscheduler(itv->irq_worker_task, SCHED_FIFO, &param);
724 730
725 INIT_WORK(&itv->irq_work_queue, ivtv_irq_work_handler); 731 init_kthread_work(&itv->irq_work, ivtv_irq_work_handler);
726 732
727 /* start counting open_id at 1 */ 733 /* start counting open_id at 1 */
728 itv->open_id = 1; 734 itv->open_id = 1;
@@ -1006,7 +1012,7 @@ static int __devinit ivtv_probe(struct pci_dev *pdev,
1006 /* PCI Device Setup */ 1012 /* PCI Device Setup */
1007 retval = ivtv_setup_pci(itv, pdev, pci_id); 1013 retval = ivtv_setup_pci(itv, pdev, pci_id);
1008 if (retval == -EIO) 1014 if (retval == -EIO)
1009 goto free_workqueue; 1015 goto free_worker;
1010 if (retval == -ENXIO) 1016 if (retval == -ENXIO)
1011 goto free_mem; 1017 goto free_mem;
1012 1018
@@ -1218,8 +1224,8 @@ free_mem:
1218 release_mem_region(itv->base_addr + IVTV_REG_OFFSET, IVTV_REG_SIZE); 1224 release_mem_region(itv->base_addr + IVTV_REG_OFFSET, IVTV_REG_SIZE);
1219 if (itv->has_cx23415) 1225 if (itv->has_cx23415)
1220 release_mem_region(itv->base_addr + IVTV_DECODER_OFFSET, IVTV_DECODER_SIZE); 1226 release_mem_region(itv->base_addr + IVTV_DECODER_OFFSET, IVTV_DECODER_SIZE);
1221free_workqueue: 1227free_worker:
1222 destroy_workqueue(itv->irq_work_queues); 1228 kthread_stop(itv->irq_worker_task);
1223err: 1229err:
1224 if (retval == 0) 1230 if (retval == 0)
1225 retval = -ENODEV; 1231 retval = -ENODEV;
@@ -1363,9 +1369,9 @@ static void ivtv_remove(struct pci_dev *pdev)
1363 ivtv_set_irq_mask(itv, 0xffffffff); 1369 ivtv_set_irq_mask(itv, 0xffffffff);
1364 del_timer_sync(&itv->dma_timer); 1370 del_timer_sync(&itv->dma_timer);
1365 1371
1366 /* Stop all Work Queues */ 1372 /* Kill irq worker */
1367 flush_workqueue(itv->irq_work_queues); 1373 flush_kthread_worker(&itv->irq_worker);
1368 destroy_workqueue(itv->irq_work_queues); 1374 kthread_stop(itv->irq_worker_task);
1369 1375
1370 ivtv_streams_cleanup(itv, 1); 1376 ivtv_streams_cleanup(itv, 1);
1371 ivtv_udma_free(itv); 1377 ivtv_udma_free(itv);