diff options
author | Jiri Kosina <jkosina@suse.cz> | 2010-08-10 07:22:08 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2010-08-10 07:22:08 -0400 |
commit | fb8231a8b139035476f2a8aaac837d0099b66dad (patch) | |
tree | 2875806beb96ea0cdab292146767a5085721dc6a /drivers/media | |
parent | 426d31071ac476ea62c62656b242930c17b58c00 (diff) | |
parent | f6cec0ae58c17522a7bc4e2f39dae19f199ab534 (diff) |
Merge branch 'master' into for-next
Conflicts:
arch/arm/mach-omap1/board-nokia770.c
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/dvb/firewire/firedtv-fw.c | 4 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-driver.c | 26 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-driver.h | 8 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-irq.c | 15 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-irq.h | 2 |
5 files changed, 26 insertions, 29 deletions
diff --git a/drivers/media/dvb/firewire/firedtv-fw.c b/drivers/media/dvb/firewire/firedtv-fw.c index 75afe4f81e33..7424b0493f9d 100644 --- a/drivers/media/dvb/firewire/firedtv-fw.c +++ b/drivers/media/dvb/firewire/firedtv-fw.c | |||
@@ -194,8 +194,8 @@ static const struct firedtv_backend backend = { | |||
194 | 194 | ||
195 | static void handle_fcp(struct fw_card *card, struct fw_request *request, | 195 | static void handle_fcp(struct fw_card *card, struct fw_request *request, |
196 | int tcode, int destination, int source, int generation, | 196 | int tcode, int destination, int source, int generation, |
197 | int speed, unsigned long long offset, | 197 | unsigned long long offset, void *payload, size_t length, |
198 | void *payload, size_t length, void *callback_data) | 198 | void *callback_data) |
199 | { | 199 | { |
200 | struct firedtv *f, *fdtv = NULL; | 200 | struct firedtv *f, *fdtv = NULL; |
201 | struct fw_device *device; | 201 | struct fw_device *device; |
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); |
diff --git a/drivers/media/video/ivtv/ivtv-driver.h b/drivers/media/video/ivtv/ivtv-driver.h index bd084df4448a..102071246218 100644 --- a/drivers/media/video/ivtv/ivtv-driver.h +++ b/drivers/media/video/ivtv/ivtv-driver.h | |||
@@ -51,7 +51,7 @@ | |||
51 | #include <linux/unistd.h> | 51 | #include <linux/unistd.h> |
52 | #include <linux/pagemap.h> | 52 | #include <linux/pagemap.h> |
53 | #include <linux/scatterlist.h> | 53 | #include <linux/scatterlist.h> |
54 | #include <linux/workqueue.h> | 54 | #include <linux/kthread.h> |
55 | #include <linux/mutex.h> | 55 | #include <linux/mutex.h> |
56 | #include <linux/slab.h> | 56 | #include <linux/slab.h> |
57 | #include <asm/uaccess.h> | 57 | #include <asm/uaccess.h> |
@@ -260,7 +260,6 @@ struct ivtv_mailbox_data { | |||
260 | #define IVTV_F_I_DEC_PAUSED 20 /* the decoder is paused */ | 260 | #define IVTV_F_I_DEC_PAUSED 20 /* the decoder is paused */ |
261 | #define IVTV_F_I_INITED 21 /* set after first open */ | 261 | #define IVTV_F_I_INITED 21 /* set after first open */ |
262 | #define IVTV_F_I_FAILED 22 /* set if first open failed */ | 262 | #define IVTV_F_I_FAILED 22 /* set if first open failed */ |
263 | #define IVTV_F_I_WORK_INITED 23 /* worker thread was initialized */ | ||
264 | 263 | ||
265 | /* Event notifications */ | 264 | /* Event notifications */ |
266 | #define IVTV_F_I_EV_DEC_STOPPED 28 /* decoder stopped event */ | 265 | #define IVTV_F_I_EV_DEC_STOPPED 28 /* decoder stopped event */ |
@@ -666,8 +665,9 @@ struct ivtv { | |||
666 | /* Interrupts & DMA */ | 665 | /* Interrupts & DMA */ |
667 | u32 irqmask; /* active interrupts */ | 666 | u32 irqmask; /* active interrupts */ |
668 | u32 irq_rr_idx; /* round-robin stream index */ | 667 | u32 irq_rr_idx; /* round-robin stream index */ |
669 | struct workqueue_struct *irq_work_queues; /* workqueue for PIO/YUV/VBI actions */ | 668 | struct kthread_worker irq_worker; /* kthread worker for PIO/YUV/VBI actions */ |
670 | struct work_struct irq_work_queue; /* work entry */ | 669 | struct task_struct *irq_worker_task; /* task for irq_worker */ |
670 | struct kthread_work irq_work; /* kthread work entry */ | ||
671 | spinlock_t dma_reg_lock; /* lock access to DMA engine registers */ | 671 | spinlock_t dma_reg_lock; /* lock access to DMA engine registers */ |
672 | int cur_dma_stream; /* index of current stream doing DMA (-1 if none) */ | 672 | int cur_dma_stream; /* index of current stream doing DMA (-1 if none) */ |
673 | int cur_pio_stream; /* index of current stream doing PIO (-1 if none) */ | 673 | int cur_pio_stream; /* index of current stream doing PIO (-1 if none) */ |
diff --git a/drivers/media/video/ivtv/ivtv-irq.c b/drivers/media/video/ivtv/ivtv-irq.c index fea1ec33b0df..9b4faf009196 100644 --- a/drivers/media/video/ivtv/ivtv-irq.c +++ b/drivers/media/video/ivtv/ivtv-irq.c | |||
@@ -71,19 +71,10 @@ static void ivtv_pio_work_handler(struct ivtv *itv) | |||
71 | write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44); | 71 | write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44); |
72 | } | 72 | } |
73 | 73 | ||
74 | void ivtv_irq_work_handler(struct work_struct *work) | 74 | void ivtv_irq_work_handler(struct kthread_work *work) |
75 | { | 75 | { |
76 | struct ivtv *itv = container_of(work, struct ivtv, irq_work_queue); | 76 | struct ivtv *itv = container_of(work, struct ivtv, irq_work); |
77 | 77 | ||
78 | DEFINE_WAIT(wait); | ||
79 | |||
80 | if (test_and_clear_bit(IVTV_F_I_WORK_INITED, &itv->i_flags)) { | ||
81 | struct sched_param param = { .sched_priority = 99 }; | ||
82 | |||
83 | /* This thread must use the FIFO scheduler as it | ||
84 | is realtime sensitive. */ | ||
85 | sched_setscheduler(current, SCHED_FIFO, ¶m); | ||
86 | } | ||
87 | if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags)) | 78 | if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags)) |
88 | ivtv_pio_work_handler(itv); | 79 | ivtv_pio_work_handler(itv); |
89 | 80 | ||
@@ -975,7 +966,7 @@ irqreturn_t ivtv_irq_handler(int irq, void *dev_id) | |||
975 | } | 966 | } |
976 | 967 | ||
977 | if (test_and_clear_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags)) { | 968 | if (test_and_clear_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags)) { |
978 | queue_work(itv->irq_work_queues, &itv->irq_work_queue); | 969 | queue_kthread_work(&itv->irq_worker, &itv->irq_work); |
979 | } | 970 | } |
980 | 971 | ||
981 | spin_unlock(&itv->dma_reg_lock); | 972 | spin_unlock(&itv->dma_reg_lock); |
diff --git a/drivers/media/video/ivtv/ivtv-irq.h b/drivers/media/video/ivtv/ivtv-irq.h index f879a5822e71..1e84433737cc 100644 --- a/drivers/media/video/ivtv/ivtv-irq.h +++ b/drivers/media/video/ivtv/ivtv-irq.h | |||
@@ -46,7 +46,7 @@ | |||
46 | 46 | ||
47 | irqreturn_t ivtv_irq_handler(int irq, void *dev_id); | 47 | irqreturn_t ivtv_irq_handler(int irq, void *dev_id); |
48 | 48 | ||
49 | void ivtv_irq_work_handler(struct work_struct *work); | 49 | void ivtv_irq_work_handler(struct kthread_work *work); |
50 | void ivtv_dma_stream_dec_prepare(struct ivtv_stream *s, u32 offset, int lock); | 50 | void ivtv_dma_stream_dec_prepare(struct ivtv_stream *s, u32 offset, int lock); |
51 | void ivtv_unfinished_dma(unsigned long arg); | 51 | void ivtv_unfinished_dma(unsigned long arg); |
52 | 52 | ||