diff options
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-driver.c')
-rw-r--r-- | drivers/media/video/ivtv/ivtv-driver.c | 26 |
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 | */ |
706 | static int __devinit ivtv_init_struct1(struct ivtv *itv) | 706 | static 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, ¶m); | ||
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); |
1221 | free_workqueue: | 1227 | free_worker: |
1222 | destroy_workqueue(itv->irq_work_queues); | 1228 | kthread_stop(itv->irq_worker_task); |
1223 | err: | 1229 | err: |
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); |