diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-13 22:22:22 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-13 22:22:22 -0500 |
commit | d8c532c40721f7507896d202b8cae3b3642d2b0d (patch) | |
tree | 42b1ce76671eb85324281ed93491432f4523f983 /drivers/media/platform/davinci | |
parent | e777d192ffb9f2929d547a2f8a5f65b7db7a9552 (diff) | |
parent | 77c53d0b56264a8fc5844e087ad15fffe20c299d (diff) |
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab:
- Missing MAINTAINERS entries were added for several drivers
- Adds V4L2 support for DMABUF handling, allowing zero-copy buffer
sharing between V4L2 devices and GPU
- Got rid of all warnings when compiling with W=1 on x86
- Add a new driver for Exynos hardware (s3c-camif)
- Several bug fixes, cleanups and driver improvements
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (243 commits)
[media] omap3isp: Replace cpu_is_omap3630() with ISP revision check
[media] omap3isp: Prepare/unprepare clocks before/after enable/disable
[media] omap3isp: preview: Add support for 8-bit formats at the sink pad
[media] omap3isp: Replace printk with dev_*
[media] omap3isp: Find source pad from external entity
[media] omap3isp: Configure CSI-2 phy based on platform data
[media] omap3isp: Add PHY routing configuration
[media] omap3isp: Add CSI configuration registers from control block to ISP resources
[media] omap3isp: Remove unneeded module memory address definitions
[media] omap3isp: Use monotonic timestamps for statistics buffers
[media] uvcvideo: Fix control value clamping for unsigned integer controls
[media] uvcvideo: Mark first output terminal as default video node
[media] uvcvideo: Add VIDIOC_[GS]_PRIORITY support
[media] uvcvideo: Return -ENOTTY for unsupported ioctls
[media] uvcvideo: Set device_caps in VIDIOC_QUERYCAP
[media] uvcvideo: Don't fail when an unsupported format is requested
[media] uvcvideo: Return -EACCES when trying to access a read/write-only control
[media] uvcvideo: Set error_idx properly for extended controls API failures
[media] rtl28xxu: add NOXON DAB/DAB+ USB dongle rev 2
[media] fc2580: write some registers conditionally
...
Diffstat (limited to 'drivers/media/platform/davinci')
-rw-r--r-- | drivers/media/platform/davinci/Kconfig | 2 | ||||
-rw-r--r-- | drivers/media/platform/davinci/dm355_ccdc.c | 8 | ||||
-rw-r--r-- | drivers/media/platform/davinci/dm644x_ccdc.c | 16 | ||||
-rw-r--r-- | drivers/media/platform/davinci/isif.c | 5 | ||||
-rw-r--r-- | drivers/media/platform/davinci/vpbe.c | 10 | ||||
-rw-r--r-- | drivers/media/platform/davinci/vpbe_display.c | 303 | ||||
-rw-r--r-- | drivers/media/platform/davinci/vpbe_osd.c | 9 | ||||
-rw-r--r-- | drivers/media/platform/davinci/vpif.c | 8 | ||||
-rw-r--r-- | drivers/media/platform/davinci/vpif_capture.c | 34 | ||||
-rw-r--r-- | drivers/media/platform/davinci/vpif_display.c | 28 |
10 files changed, 267 insertions, 156 deletions
diff --git a/drivers/media/platform/davinci/Kconfig b/drivers/media/platform/davinci/Kconfig index 78e26d24f637..3c56037c82fc 100644 --- a/drivers/media/platform/davinci/Kconfig +++ b/drivers/media/platform/davinci/Kconfig | |||
@@ -101,7 +101,7 @@ config VIDEO_DM644X_VPBE | |||
101 | tristate "DM644X VPBE HW module" | 101 | tristate "DM644X VPBE HW module" |
102 | depends on ARCH_DAVINCI_DM644x | 102 | depends on ARCH_DAVINCI_DM644x |
103 | select VIDEO_VPSS_SYSTEM | 103 | select VIDEO_VPSS_SYSTEM |
104 | select VIDEOBUF_DMA_CONTIG | 104 | select VIDEOBUF2_DMA_CONTIG |
105 | help | 105 | help |
106 | Enables VPBE modules used for display on a DM644x | 106 | Enables VPBE modules used for display on a DM644x |
107 | SoC. | 107 | SoC. |
diff --git a/drivers/media/platform/davinci/dm355_ccdc.c b/drivers/media/platform/davinci/dm355_ccdc.c index ce0e4131c067..030950dcfb16 100644 --- a/drivers/media/platform/davinci/dm355_ccdc.c +++ b/drivers/media/platform/davinci/dm355_ccdc.c | |||
@@ -1003,7 +1003,7 @@ static int __devinit dm355_ccdc_probe(struct platform_device *pdev) | |||
1003 | status = PTR_ERR(ccdc_cfg.mclk); | 1003 | status = PTR_ERR(ccdc_cfg.mclk); |
1004 | goto fail_nomap; | 1004 | goto fail_nomap; |
1005 | } | 1005 | } |
1006 | if (clk_enable(ccdc_cfg.mclk)) { | 1006 | if (clk_prepare_enable(ccdc_cfg.mclk)) { |
1007 | status = -ENODEV; | 1007 | status = -ENODEV; |
1008 | goto fail_mclk; | 1008 | goto fail_mclk; |
1009 | } | 1009 | } |
@@ -1014,7 +1014,7 @@ static int __devinit dm355_ccdc_probe(struct platform_device *pdev) | |||
1014 | status = PTR_ERR(ccdc_cfg.sclk); | 1014 | status = PTR_ERR(ccdc_cfg.sclk); |
1015 | goto fail_mclk; | 1015 | goto fail_mclk; |
1016 | } | 1016 | } |
1017 | if (clk_enable(ccdc_cfg.sclk)) { | 1017 | if (clk_prepare_enable(ccdc_cfg.sclk)) { |
1018 | status = -ENODEV; | 1018 | status = -ENODEV; |
1019 | goto fail_sclk; | 1019 | goto fail_sclk; |
1020 | } | 1020 | } |
@@ -1034,8 +1034,10 @@ static int __devinit dm355_ccdc_probe(struct platform_device *pdev) | |||
1034 | printk(KERN_NOTICE "%s is registered with vpfe.\n", ccdc_hw_dev.name); | 1034 | printk(KERN_NOTICE "%s is registered with vpfe.\n", ccdc_hw_dev.name); |
1035 | return 0; | 1035 | return 0; |
1036 | fail_sclk: | 1036 | fail_sclk: |
1037 | clk_disable_unprepare(ccdc_cfg.sclk); | ||
1037 | clk_put(ccdc_cfg.sclk); | 1038 | clk_put(ccdc_cfg.sclk); |
1038 | fail_mclk: | 1039 | fail_mclk: |
1040 | clk_disable_unprepare(ccdc_cfg.mclk); | ||
1039 | clk_put(ccdc_cfg.mclk); | 1041 | clk_put(ccdc_cfg.mclk); |
1040 | fail_nomap: | 1042 | fail_nomap: |
1041 | iounmap(ccdc_cfg.base_addr); | 1043 | iounmap(ccdc_cfg.base_addr); |
@@ -1050,6 +1052,8 @@ static int dm355_ccdc_remove(struct platform_device *pdev) | |||
1050 | { | 1052 | { |
1051 | struct resource *res; | 1053 | struct resource *res; |
1052 | 1054 | ||
1055 | clk_disable_unprepare(ccdc_cfg.sclk); | ||
1056 | clk_disable_unprepare(ccdc_cfg.mclk); | ||
1053 | clk_put(ccdc_cfg.mclk); | 1057 | clk_put(ccdc_cfg.mclk); |
1054 | clk_put(ccdc_cfg.sclk); | 1058 | clk_put(ccdc_cfg.sclk); |
1055 | iounmap(ccdc_cfg.base_addr); | 1059 | iounmap(ccdc_cfg.base_addr); |
diff --git a/drivers/media/platform/davinci/dm644x_ccdc.c b/drivers/media/platform/davinci/dm644x_ccdc.c index ee7942b1996e..0215ab6ebc90 100644 --- a/drivers/media/platform/davinci/dm644x_ccdc.c +++ b/drivers/media/platform/davinci/dm644x_ccdc.c | |||
@@ -994,7 +994,7 @@ static int __devinit dm644x_ccdc_probe(struct platform_device *pdev) | |||
994 | status = PTR_ERR(ccdc_cfg.mclk); | 994 | status = PTR_ERR(ccdc_cfg.mclk); |
995 | goto fail_nomap; | 995 | goto fail_nomap; |
996 | } | 996 | } |
997 | if (clk_enable(ccdc_cfg.mclk)) { | 997 | if (clk_prepare_enable(ccdc_cfg.mclk)) { |
998 | status = -ENODEV; | 998 | status = -ENODEV; |
999 | goto fail_mclk; | 999 | goto fail_mclk; |
1000 | } | 1000 | } |
@@ -1005,7 +1005,7 @@ static int __devinit dm644x_ccdc_probe(struct platform_device *pdev) | |||
1005 | status = PTR_ERR(ccdc_cfg.sclk); | 1005 | status = PTR_ERR(ccdc_cfg.sclk); |
1006 | goto fail_mclk; | 1006 | goto fail_mclk; |
1007 | } | 1007 | } |
1008 | if (clk_enable(ccdc_cfg.sclk)) { | 1008 | if (clk_prepare_enable(ccdc_cfg.sclk)) { |
1009 | status = -ENODEV; | 1009 | status = -ENODEV; |
1010 | goto fail_sclk; | 1010 | goto fail_sclk; |
1011 | } | 1011 | } |
@@ -1013,8 +1013,10 @@ static int __devinit dm644x_ccdc_probe(struct platform_device *pdev) | |||
1013 | printk(KERN_NOTICE "%s is registered with vpfe.\n", ccdc_hw_dev.name); | 1013 | printk(KERN_NOTICE "%s is registered with vpfe.\n", ccdc_hw_dev.name); |
1014 | return 0; | 1014 | return 0; |
1015 | fail_sclk: | 1015 | fail_sclk: |
1016 | clk_disable_unprepare(ccdc_cfg.sclk); | ||
1016 | clk_put(ccdc_cfg.sclk); | 1017 | clk_put(ccdc_cfg.sclk); |
1017 | fail_mclk: | 1018 | fail_mclk: |
1019 | clk_disable_unprepare(ccdc_cfg.mclk); | ||
1018 | clk_put(ccdc_cfg.mclk); | 1020 | clk_put(ccdc_cfg.mclk); |
1019 | fail_nomap: | 1021 | fail_nomap: |
1020 | iounmap(ccdc_cfg.base_addr); | 1022 | iounmap(ccdc_cfg.base_addr); |
@@ -1029,6 +1031,8 @@ static int dm644x_ccdc_remove(struct platform_device *pdev) | |||
1029 | { | 1031 | { |
1030 | struct resource *res; | 1032 | struct resource *res; |
1031 | 1033 | ||
1034 | clk_disable_unprepare(ccdc_cfg.mclk); | ||
1035 | clk_disable_unprepare(ccdc_cfg.sclk); | ||
1032 | clk_put(ccdc_cfg.mclk); | 1036 | clk_put(ccdc_cfg.mclk); |
1033 | clk_put(ccdc_cfg.sclk); | 1037 | clk_put(ccdc_cfg.sclk); |
1034 | iounmap(ccdc_cfg.base_addr); | 1038 | iounmap(ccdc_cfg.base_addr); |
@@ -1046,8 +1050,8 @@ static int dm644x_ccdc_suspend(struct device *dev) | |||
1046 | /* Disable CCDC */ | 1050 | /* Disable CCDC */ |
1047 | ccdc_enable(0); | 1051 | ccdc_enable(0); |
1048 | /* Disable both master and slave clock */ | 1052 | /* Disable both master and slave clock */ |
1049 | clk_disable(ccdc_cfg.mclk); | 1053 | clk_disable_unprepare(ccdc_cfg.mclk); |
1050 | clk_disable(ccdc_cfg.sclk); | 1054 | clk_disable_unprepare(ccdc_cfg.sclk); |
1051 | 1055 | ||
1052 | return 0; | 1056 | return 0; |
1053 | } | 1057 | } |
@@ -1055,8 +1059,8 @@ static int dm644x_ccdc_suspend(struct device *dev) | |||
1055 | static int dm644x_ccdc_resume(struct device *dev) | 1059 | static int dm644x_ccdc_resume(struct device *dev) |
1056 | { | 1060 | { |
1057 | /* Enable both master and slave clock */ | 1061 | /* Enable both master and slave clock */ |
1058 | clk_enable(ccdc_cfg.mclk); | 1062 | clk_prepare_enable(ccdc_cfg.mclk); |
1059 | clk_enable(ccdc_cfg.sclk); | 1063 | clk_prepare_enable(ccdc_cfg.sclk); |
1060 | /* Restore CCDC context */ | 1064 | /* Restore CCDC context */ |
1061 | ccdc_restore_context(); | 1065 | ccdc_restore_context(); |
1062 | 1066 | ||
diff --git a/drivers/media/platform/davinci/isif.c b/drivers/media/platform/davinci/isif.c index b99d5423e3a8..2c26c3e1837e 100644 --- a/drivers/media/platform/davinci/isif.c +++ b/drivers/media/platform/davinci/isif.c | |||
@@ -1053,7 +1053,7 @@ static int __devinit isif_probe(struct platform_device *pdev) | |||
1053 | status = PTR_ERR(isif_cfg.mclk); | 1053 | status = PTR_ERR(isif_cfg.mclk); |
1054 | goto fail_mclk; | 1054 | goto fail_mclk; |
1055 | } | 1055 | } |
1056 | if (clk_enable(isif_cfg.mclk)) { | 1056 | if (clk_prepare_enable(isif_cfg.mclk)) { |
1057 | status = -ENODEV; | 1057 | status = -ENODEV; |
1058 | goto fail_mclk; | 1058 | goto fail_mclk; |
1059 | } | 1059 | } |
@@ -1125,6 +1125,7 @@ fail_nobase_res: | |||
1125 | i--; | 1125 | i--; |
1126 | } | 1126 | } |
1127 | fail_mclk: | 1127 | fail_mclk: |
1128 | clk_disable_unprepare(isif_cfg.mclk); | ||
1128 | clk_put(isif_cfg.mclk); | 1129 | clk_put(isif_cfg.mclk); |
1129 | vpfe_unregister_ccdc_device(&isif_hw_dev); | 1130 | vpfe_unregister_ccdc_device(&isif_hw_dev); |
1130 | return status; | 1131 | return status; |
@@ -1145,6 +1146,8 @@ static int isif_remove(struct platform_device *pdev) | |||
1145 | i++; | 1146 | i++; |
1146 | } | 1147 | } |
1147 | vpfe_unregister_ccdc_device(&isif_hw_dev); | 1148 | vpfe_unregister_ccdc_device(&isif_hw_dev); |
1149 | clk_disable_unprepare(isif_cfg.mclk); | ||
1150 | clk_put(isif_cfg.mclk); | ||
1148 | return 0; | 1151 | return 0; |
1149 | } | 1152 | } |
1150 | 1153 | ||
diff --git a/drivers/media/platform/davinci/vpbe.c b/drivers/media/platform/davinci/vpbe.c index 69d7a58c92c3..7f5cf9b347b2 100644 --- a/drivers/media/platform/davinci/vpbe.c +++ b/drivers/media/platform/davinci/vpbe.c | |||
@@ -612,7 +612,7 @@ static int vpbe_initialize(struct device *dev, struct vpbe_device *vpbe_dev) | |||
612 | ret = PTR_ERR(vpbe_dev->dac_clk); | 612 | ret = PTR_ERR(vpbe_dev->dac_clk); |
613 | goto fail_mutex_unlock; | 613 | goto fail_mutex_unlock; |
614 | } | 614 | } |
615 | if (clk_enable(vpbe_dev->dac_clk)) { | 615 | if (clk_prepare_enable(vpbe_dev->dac_clk)) { |
616 | ret = -ENODEV; | 616 | ret = -ENODEV; |
617 | goto fail_mutex_unlock; | 617 | goto fail_mutex_unlock; |
618 | } | 618 | } |
@@ -759,8 +759,10 @@ fail_kfree_encoders: | |||
759 | fail_dev_unregister: | 759 | fail_dev_unregister: |
760 | v4l2_device_unregister(&vpbe_dev->v4l2_dev); | 760 | v4l2_device_unregister(&vpbe_dev->v4l2_dev); |
761 | fail_clk_put: | 761 | fail_clk_put: |
762 | if (strcmp(vpbe_dev->cfg->module_name, "dm644x-vpbe-display") != 0) | 762 | if (strcmp(vpbe_dev->cfg->module_name, "dm644x-vpbe-display") != 0) { |
763 | clk_disable_unprepare(vpbe_dev->dac_clk); | ||
763 | clk_put(vpbe_dev->dac_clk); | 764 | clk_put(vpbe_dev->dac_clk); |
765 | } | ||
764 | fail_mutex_unlock: | 766 | fail_mutex_unlock: |
765 | mutex_unlock(&vpbe_dev->lock); | 767 | mutex_unlock(&vpbe_dev->lock); |
766 | return ret; | 768 | return ret; |
@@ -777,8 +779,10 @@ fail_mutex_unlock: | |||
777 | static void vpbe_deinitialize(struct device *dev, struct vpbe_device *vpbe_dev) | 779 | static void vpbe_deinitialize(struct device *dev, struct vpbe_device *vpbe_dev) |
778 | { | 780 | { |
779 | v4l2_device_unregister(&vpbe_dev->v4l2_dev); | 781 | v4l2_device_unregister(&vpbe_dev->v4l2_dev); |
780 | if (strcmp(vpbe_dev->cfg->module_name, "dm644x-vpbe-display") != 0) | 782 | if (strcmp(vpbe_dev->cfg->module_name, "dm644x-vpbe-display") != 0) { |
783 | clk_disable_unprepare(vpbe_dev->dac_clk); | ||
781 | clk_put(vpbe_dev->dac_clk); | 784 | clk_put(vpbe_dev->dac_clk); |
785 | } | ||
782 | 786 | ||
783 | kfree(vpbe_dev->amp); | 787 | kfree(vpbe_dev->amp); |
784 | kfree(vpbe_dev->encoders); | 788 | kfree(vpbe_dev->encoders); |
diff --git a/drivers/media/platform/davinci/vpbe_display.c b/drivers/media/platform/davinci/vpbe_display.c index 161c77650e2f..2bfde7958fef 100644 --- a/drivers/media/platform/davinci/vpbe_display.c +++ b/drivers/media/platform/davinci/vpbe_display.c | |||
@@ -47,6 +47,9 @@ static int debug; | |||
47 | 47 | ||
48 | module_param(debug, int, 0644); | 48 | module_param(debug, int, 0644); |
49 | 49 | ||
50 | static int vpbe_set_osd_display_params(struct vpbe_display *disp_dev, | ||
51 | struct vpbe_layer *layer); | ||
52 | |||
50 | static int venc_is_second_field(struct vpbe_display *disp_dev) | 53 | static int venc_is_second_field(struct vpbe_display *disp_dev) |
51 | { | 54 | { |
52 | struct vpbe_device *vpbe_dev = disp_dev->vpbe_dev; | 55 | struct vpbe_device *vpbe_dev = disp_dev->vpbe_dev; |
@@ -73,10 +76,11 @@ static void vpbe_isr_even_field(struct vpbe_display *disp_obj, | |||
73 | if (layer->cur_frm == layer->next_frm) | 76 | if (layer->cur_frm == layer->next_frm) |
74 | return; | 77 | return; |
75 | ktime_get_ts(&timevalue); | 78 | ktime_get_ts(&timevalue); |
76 | layer->cur_frm->ts.tv_sec = timevalue.tv_sec; | 79 | layer->cur_frm->vb.v4l2_buf.timestamp.tv_sec = |
77 | layer->cur_frm->ts.tv_usec = timevalue.tv_nsec / NSEC_PER_USEC; | 80 | timevalue.tv_sec; |
78 | layer->cur_frm->state = VIDEOBUF_DONE; | 81 | layer->cur_frm->vb.v4l2_buf.timestamp.tv_usec = |
79 | wake_up_interruptible(&layer->cur_frm->done); | 82 | timevalue.tv_nsec / NSEC_PER_USEC; |
83 | vb2_buffer_done(&layer->cur_frm->vb, VB2_BUF_STATE_DONE); | ||
80 | /* Make cur_frm pointing to next_frm */ | 84 | /* Make cur_frm pointing to next_frm */ |
81 | layer->cur_frm = layer->next_frm; | 85 | layer->cur_frm = layer->next_frm; |
82 | } | 86 | } |
@@ -99,16 +103,14 @@ static void vpbe_isr_odd_field(struct vpbe_display *disp_obj, | |||
99 | * otherwise hold on current frame | 103 | * otherwise hold on current frame |
100 | * Get next from the buffer queue | 104 | * Get next from the buffer queue |
101 | */ | 105 | */ |
102 | layer->next_frm = list_entry( | 106 | layer->next_frm = list_entry(layer->dma_queue.next, |
103 | layer->dma_queue.next, | 107 | struct vpbe_disp_buffer, list); |
104 | struct videobuf_buffer, | ||
105 | queue); | ||
106 | /* Remove that from the buffer queue */ | 108 | /* Remove that from the buffer queue */ |
107 | list_del(&layer->next_frm->queue); | 109 | list_del(&layer->next_frm->list); |
108 | spin_unlock(&disp_obj->dma_queue_lock); | 110 | spin_unlock(&disp_obj->dma_queue_lock); |
109 | /* Mark state of the frame to active */ | 111 | /* Mark state of the frame to active */ |
110 | layer->next_frm->state = VIDEOBUF_ACTIVE; | 112 | layer->next_frm->vb.state = VB2_BUF_STATE_ACTIVE; |
111 | addr = videobuf_to_dma_contig(layer->next_frm); | 113 | addr = vb2_dma_contig_plane_dma_addr(&layer->next_frm->vb, 0); |
112 | osd_device->ops.start_layer(osd_device, | 114 | osd_device->ops.start_layer(osd_device, |
113 | layer->layer_info.id, | 115 | layer->layer_info.id, |
114 | addr, | 116 | addr, |
@@ -199,39 +201,29 @@ static irqreturn_t venc_isr(int irq, void *arg) | |||
199 | 201 | ||
200 | /* | 202 | /* |
201 | * vpbe_buffer_prepare() | 203 | * vpbe_buffer_prepare() |
202 | * This is the callback function called from videobuf_qbuf() function | 204 | * This is the callback function called from vb2_qbuf() function |
203 | * the buffer is prepared and user space virtual address is converted into | 205 | * the buffer is prepared and user space virtual address is converted into |
204 | * physical address | 206 | * physical address |
205 | */ | 207 | */ |
206 | static int vpbe_buffer_prepare(struct videobuf_queue *q, | 208 | static int vpbe_buffer_prepare(struct vb2_buffer *vb) |
207 | struct videobuf_buffer *vb, | ||
208 | enum v4l2_field field) | ||
209 | { | 209 | { |
210 | struct vpbe_fh *fh = q->priv_data; | 210 | struct vpbe_fh *fh = vb2_get_drv_priv(vb->vb2_queue); |
211 | struct vb2_queue *q = vb->vb2_queue; | ||
211 | struct vpbe_layer *layer = fh->layer; | 212 | struct vpbe_layer *layer = fh->layer; |
212 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; | 213 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; |
213 | unsigned long addr; | 214 | unsigned long addr; |
214 | int ret; | ||
215 | 215 | ||
216 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, | 216 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, |
217 | "vpbe_buffer_prepare\n"); | 217 | "vpbe_buffer_prepare\n"); |
218 | 218 | ||
219 | /* If buffer is not initialized, initialize it */ | 219 | if (vb->state != VB2_BUF_STATE_ACTIVE && |
220 | if (VIDEOBUF_NEEDS_INIT == vb->state) { | 220 | vb->state != VB2_BUF_STATE_PREPARED) { |
221 | vb->width = layer->pix_fmt.width; | 221 | vb2_set_plane_payload(vb, 0, layer->pix_fmt.sizeimage); |
222 | vb->height = layer->pix_fmt.height; | 222 | if (vb2_plane_vaddr(vb, 0) && |
223 | vb->size = layer->pix_fmt.sizeimage; | 223 | vb2_get_plane_payload(vb, 0) > vb2_plane_size(vb, 0)) |
224 | vb->field = field; | ||
225 | |||
226 | ret = videobuf_iolock(q, vb, NULL); | ||
227 | if (ret < 0) { | ||
228 | v4l2_err(&vpbe_dev->v4l2_dev, "Failed to map \ | ||
229 | user address\n"); | ||
230 | return -EINVAL; | 224 | return -EINVAL; |
231 | } | ||
232 | |||
233 | addr = videobuf_to_dma_contig(vb); | ||
234 | 225 | ||
226 | addr = vb2_dma_contig_plane_dma_addr(vb, 0); | ||
235 | if (q->streaming) { | 227 | if (q->streaming) { |
236 | if (!IS_ALIGNED(addr, 8)) { | 228 | if (!IS_ALIGNED(addr, 8)) { |
237 | v4l2_err(&vpbe_dev->v4l2_dev, | 229 | v4l2_err(&vpbe_dev->v4l2_dev, |
@@ -240,7 +232,6 @@ static int vpbe_buffer_prepare(struct videobuf_queue *q, | |||
240 | return -EINVAL; | 232 | return -EINVAL; |
241 | } | 233 | } |
242 | } | 234 | } |
243 | vb->state = VIDEOBUF_PREPARED; | ||
244 | } | 235 | } |
245 | return 0; | 236 | return 0; |
246 | } | 237 | } |
@@ -249,22 +240,26 @@ static int vpbe_buffer_prepare(struct videobuf_queue *q, | |||
249 | * vpbe_buffer_setup() | 240 | * vpbe_buffer_setup() |
250 | * This function allocates memory for the buffers | 241 | * This function allocates memory for the buffers |
251 | */ | 242 | */ |
252 | static int vpbe_buffer_setup(struct videobuf_queue *q, | 243 | static int |
253 | unsigned int *count, | 244 | vpbe_buffer_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt, |
254 | unsigned int *size) | 245 | unsigned int *nbuffers, unsigned int *nplanes, |
246 | unsigned int sizes[], void *alloc_ctxs[]) | ||
247 | |||
255 | { | 248 | { |
256 | /* Get the file handle object and layer object */ | 249 | /* Get the file handle object and layer object */ |
257 | struct vpbe_fh *fh = q->priv_data; | 250 | struct vpbe_fh *fh = vb2_get_drv_priv(vq); |
258 | struct vpbe_layer *layer = fh->layer; | 251 | struct vpbe_layer *layer = fh->layer; |
259 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; | 252 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; |
260 | 253 | ||
261 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_buffer_setup\n"); | 254 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_buffer_setup\n"); |
262 | 255 | ||
263 | *size = layer->pix_fmt.sizeimage; | ||
264 | |||
265 | /* Store number of buffers allocated in numbuffer member */ | 256 | /* Store number of buffers allocated in numbuffer member */ |
266 | if (*count < VPBE_DEFAULT_NUM_BUFS) | 257 | if (*nbuffers < VPBE_DEFAULT_NUM_BUFS) |
267 | *count = layer->numbuffers = VPBE_DEFAULT_NUM_BUFS; | 258 | *nbuffers = layer->numbuffers = VPBE_DEFAULT_NUM_BUFS; |
259 | |||
260 | *nplanes = 1; | ||
261 | sizes[0] = layer->pix_fmt.sizeimage; | ||
262 | alloc_ctxs[0] = layer->alloc_ctx; | ||
268 | 263 | ||
269 | return 0; | 264 | return 0; |
270 | } | 265 | } |
@@ -273,11 +268,12 @@ static int vpbe_buffer_setup(struct videobuf_queue *q, | |||
273 | * vpbe_buffer_queue() | 268 | * vpbe_buffer_queue() |
274 | * This function adds the buffer to DMA queue | 269 | * This function adds the buffer to DMA queue |
275 | */ | 270 | */ |
276 | static void vpbe_buffer_queue(struct videobuf_queue *q, | 271 | static void vpbe_buffer_queue(struct vb2_buffer *vb) |
277 | struct videobuf_buffer *vb) | ||
278 | { | 272 | { |
279 | /* Get the file handle object and layer object */ | 273 | /* Get the file handle object and layer object */ |
280 | struct vpbe_fh *fh = q->priv_data; | 274 | struct vpbe_fh *fh = vb2_get_drv_priv(vb->vb2_queue); |
275 | struct vpbe_disp_buffer *buf = container_of(vb, | ||
276 | struct vpbe_disp_buffer, vb); | ||
281 | struct vpbe_layer *layer = fh->layer; | 277 | struct vpbe_layer *layer = fh->layer; |
282 | struct vpbe_display *disp = fh->disp_dev; | 278 | struct vpbe_display *disp = fh->disp_dev; |
283 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; | 279 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; |
@@ -288,39 +284,125 @@ static void vpbe_buffer_queue(struct videobuf_queue *q, | |||
288 | 284 | ||
289 | /* add the buffer to the DMA queue */ | 285 | /* add the buffer to the DMA queue */ |
290 | spin_lock_irqsave(&disp->dma_queue_lock, flags); | 286 | spin_lock_irqsave(&disp->dma_queue_lock, flags); |
291 | list_add_tail(&vb->queue, &layer->dma_queue); | 287 | list_add_tail(&buf->list, &layer->dma_queue); |
292 | spin_unlock_irqrestore(&disp->dma_queue_lock, flags); | 288 | spin_unlock_irqrestore(&disp->dma_queue_lock, flags); |
293 | /* Change state of the buffer */ | ||
294 | vb->state = VIDEOBUF_QUEUED; | ||
295 | } | 289 | } |
296 | 290 | ||
297 | /* | 291 | /* |
298 | * vpbe_buffer_release() | 292 | * vpbe_buf_cleanup() |
299 | * This function is called from the videobuf layer to free memory allocated to | 293 | * This function is called from the vb2 layer to free memory allocated to |
300 | * the buffers | 294 | * the buffers |
301 | */ | 295 | */ |
302 | static void vpbe_buffer_release(struct videobuf_queue *q, | 296 | static void vpbe_buf_cleanup(struct vb2_buffer *vb) |
303 | struct videobuf_buffer *vb) | ||
304 | { | 297 | { |
305 | /* Get the file handle object and layer object */ | 298 | /* Get the file handle object and layer object */ |
306 | struct vpbe_fh *fh = q->priv_data; | 299 | struct vpbe_fh *fh = vb2_get_drv_priv(vb->vb2_queue); |
307 | struct vpbe_layer *layer = fh->layer; | 300 | struct vpbe_layer *layer = fh->layer; |
308 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; | 301 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; |
302 | struct vpbe_disp_buffer *buf = container_of(vb, | ||
303 | struct vpbe_disp_buffer, vb); | ||
304 | unsigned long flags; | ||
309 | 305 | ||
310 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, | 306 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, |
311 | "vpbe_buffer_release\n"); | 307 | "vpbe_buf_cleanup\n"); |
308 | |||
309 | spin_lock_irqsave(&layer->irqlock, flags); | ||
310 | if (vb->state == VB2_BUF_STATE_ACTIVE) | ||
311 | list_del_init(&buf->list); | ||
312 | spin_unlock_irqrestore(&layer->irqlock, flags); | ||
313 | } | ||
314 | |||
315 | static void vpbe_wait_prepare(struct vb2_queue *vq) | ||
316 | { | ||
317 | struct vpbe_fh *fh = vb2_get_drv_priv(vq); | ||
318 | struct vpbe_layer *layer = fh->layer; | ||
319 | |||
320 | mutex_unlock(&layer->opslock); | ||
321 | } | ||
322 | |||
323 | static void vpbe_wait_finish(struct vb2_queue *vq) | ||
324 | { | ||
325 | struct vpbe_fh *fh = vb2_get_drv_priv(vq); | ||
326 | struct vpbe_layer *layer = fh->layer; | ||
327 | |||
328 | mutex_lock(&layer->opslock); | ||
329 | } | ||
330 | |||
331 | static int vpbe_buffer_init(struct vb2_buffer *vb) | ||
332 | { | ||
333 | struct vpbe_disp_buffer *buf = container_of(vb, | ||
334 | struct vpbe_disp_buffer, vb); | ||
335 | |||
336 | INIT_LIST_HEAD(&buf->list); | ||
337 | return 0; | ||
338 | } | ||
339 | |||
340 | static int vpbe_start_streaming(struct vb2_queue *vq, unsigned int count) | ||
341 | { | ||
342 | struct vpbe_fh *fh = vb2_get_drv_priv(vq); | ||
343 | struct vpbe_layer *layer = fh->layer; | ||
344 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; | ||
345 | int ret; | ||
346 | |||
347 | /* If buffer queue is empty, return error */ | ||
348 | if (list_empty(&layer->dma_queue)) { | ||
349 | v4l2_err(&vpbe_dev->v4l2_dev, "buffer queue is empty\n"); | ||
350 | return -EINVAL; | ||
351 | } | ||
352 | /* Get the next frame from the buffer queue */ | ||
353 | layer->next_frm = layer->cur_frm = list_entry(layer->dma_queue.next, | ||
354 | struct vpbe_disp_buffer, list); | ||
355 | /* Remove buffer from the buffer queue */ | ||
356 | list_del(&layer->cur_frm->list); | ||
357 | /* Mark state of the current frame to active */ | ||
358 | layer->cur_frm->vb.state = VB2_BUF_STATE_ACTIVE; | ||
359 | /* Initialize field_id and started member */ | ||
360 | layer->field_id = 0; | ||
361 | |||
362 | /* Set parameters in OSD and VENC */ | ||
363 | ret = vpbe_set_osd_display_params(fh->disp_dev, layer); | ||
364 | if (ret < 0) | ||
365 | return ret; | ||
312 | 366 | ||
313 | if (V4L2_MEMORY_USERPTR != layer->memory) | 367 | /* |
314 | videobuf_dma_contig_free(q, vb); | 368 | * if request format is yuv420 semiplanar, need to |
369 | * enable both video windows | ||
370 | */ | ||
371 | layer->started = 1; | ||
372 | layer->layer_first_int = 1; | ||
373 | |||
374 | return ret; | ||
375 | } | ||
376 | |||
377 | static int vpbe_stop_streaming(struct vb2_queue *vq) | ||
378 | { | ||
379 | struct vpbe_fh *fh = vb2_get_drv_priv(vq); | ||
380 | struct vpbe_layer *layer = fh->layer; | ||
381 | |||
382 | if (!vb2_is_streaming(vq)) | ||
383 | return 0; | ||
384 | |||
385 | /* release all active buffers */ | ||
386 | while (!list_empty(&layer->dma_queue)) { | ||
387 | layer->next_frm = list_entry(layer->dma_queue.next, | ||
388 | struct vpbe_disp_buffer, list); | ||
389 | list_del(&layer->next_frm->list); | ||
390 | vb2_buffer_done(&layer->next_frm->vb, VB2_BUF_STATE_ERROR); | ||
391 | } | ||
315 | 392 | ||
316 | vb->state = VIDEOBUF_NEEDS_INIT; | 393 | return 0; |
317 | } | 394 | } |
318 | 395 | ||
319 | static struct videobuf_queue_ops video_qops = { | 396 | static struct vb2_ops video_qops = { |
320 | .buf_setup = vpbe_buffer_setup, | 397 | .queue_setup = vpbe_buffer_queue_setup, |
398 | .wait_prepare = vpbe_wait_prepare, | ||
399 | .wait_finish = vpbe_wait_finish, | ||
400 | .buf_init = vpbe_buffer_init, | ||
321 | .buf_prepare = vpbe_buffer_prepare, | 401 | .buf_prepare = vpbe_buffer_prepare, |
402 | .start_streaming = vpbe_start_streaming, | ||
403 | .stop_streaming = vpbe_stop_streaming, | ||
404 | .buf_cleanup = vpbe_buf_cleanup, | ||
322 | .buf_queue = vpbe_buffer_queue, | 405 | .buf_queue = vpbe_buffer_queue, |
323 | .buf_release = vpbe_buffer_release, | ||
324 | }; | 406 | }; |
325 | 407 | ||
326 | static | 408 | static |
@@ -345,7 +427,7 @@ static int vpbe_set_osd_display_params(struct vpbe_display *disp_dev, | |||
345 | unsigned long addr; | 427 | unsigned long addr; |
346 | int ret; | 428 | int ret; |
347 | 429 | ||
348 | addr = videobuf_to_dma_contig(layer->cur_frm); | 430 | addr = vb2_dma_contig_plane_dma_addr(&layer->cur_frm->vb, 0); |
349 | /* Set address in the display registers */ | 431 | /* Set address in the display registers */ |
350 | osd_device->ops.start_layer(osd_device, | 432 | osd_device->ops.start_layer(osd_device, |
351 | layer->layer_info.id, | 433 | layer->layer_info.id, |
@@ -620,9 +702,12 @@ static int vpbe_display_querycap(struct file *file, void *priv, | |||
620 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; | 702 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; |
621 | 703 | ||
622 | cap->version = VPBE_DISPLAY_VERSION_CODE; | 704 | cap->version = VPBE_DISPLAY_VERSION_CODE; |
623 | cap->capabilities = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; | 705 | cap->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; |
624 | strlcpy(cap->driver, VPBE_DISPLAY_DRIVER, sizeof(cap->driver)); | 706 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; |
625 | strlcpy(cap->bus_info, "platform", sizeof(cap->bus_info)); | 707 | snprintf(cap->driver, sizeof(cap->driver), "%s", |
708 | dev_name(vpbe_dev->pdev)); | ||
709 | snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s", | ||
710 | dev_name(vpbe_dev->pdev)); | ||
626 | strlcpy(cap->card, vpbe_dev->cfg->module_name, sizeof(cap->card)); | 711 | strlcpy(cap->card, vpbe_dev->cfg->module_name, sizeof(cap->card)); |
627 | 712 | ||
628 | return 0; | 713 | return 0; |
@@ -1161,7 +1246,7 @@ static int vpbe_display_streamoff(struct file *file, void *priv, | |||
1161 | osd_device->ops.disable_layer(osd_device, | 1246 | osd_device->ops.disable_layer(osd_device, |
1162 | layer->layer_info.id); | 1247 | layer->layer_info.id); |
1163 | layer->started = 0; | 1248 | layer->started = 0; |
1164 | ret = videobuf_streamoff(&layer->buffer_queue); | 1249 | ret = vb2_streamoff(&layer->buffer_queue, buf_type); |
1165 | 1250 | ||
1166 | return ret; | 1251 | return ret; |
1167 | } | 1252 | } |
@@ -1199,46 +1284,15 @@ static int vpbe_display_streamon(struct file *file, void *priv, | |||
1199 | } | 1284 | } |
1200 | 1285 | ||
1201 | /* | 1286 | /* |
1202 | * Call videobuf_streamon to start streaming | 1287 | * Call vb2_streamon to start streaming |
1203 | * in videobuf | 1288 | * in videobuf |
1204 | */ | 1289 | */ |
1205 | ret = videobuf_streamon(&layer->buffer_queue); | 1290 | ret = vb2_streamon(&layer->buffer_queue, buf_type); |
1206 | if (ret) { | 1291 | if (ret) { |
1207 | v4l2_err(&vpbe_dev->v4l2_dev, | 1292 | v4l2_err(&vpbe_dev->v4l2_dev, |
1208 | "error in videobuf_streamon\n"); | 1293 | "error in vb2_streamon\n"); |
1209 | return ret; | 1294 | return ret; |
1210 | } | 1295 | } |
1211 | /* If buffer queue is empty, return error */ | ||
1212 | if (list_empty(&layer->dma_queue)) { | ||
1213 | v4l2_err(&vpbe_dev->v4l2_dev, "buffer queue is empty\n"); | ||
1214 | goto streamoff; | ||
1215 | } | ||
1216 | /* Get the next frame from the buffer queue */ | ||
1217 | layer->next_frm = layer->cur_frm = list_entry(layer->dma_queue.next, | ||
1218 | struct videobuf_buffer, queue); | ||
1219 | /* Remove buffer from the buffer queue */ | ||
1220 | list_del(&layer->cur_frm->queue); | ||
1221 | /* Mark state of the current frame to active */ | ||
1222 | layer->cur_frm->state = VIDEOBUF_ACTIVE; | ||
1223 | /* Initialize field_id and started member */ | ||
1224 | layer->field_id = 0; | ||
1225 | |||
1226 | /* Set parameters in OSD and VENC */ | ||
1227 | ret = vpbe_set_osd_display_params(disp_dev, layer); | ||
1228 | if (ret < 0) | ||
1229 | goto streamoff; | ||
1230 | |||
1231 | /* | ||
1232 | * if request format is yuv420 semiplanar, need to | ||
1233 | * enable both video windows | ||
1234 | */ | ||
1235 | layer->started = 1; | ||
1236 | |||
1237 | layer->layer_first_int = 1; | ||
1238 | |||
1239 | return ret; | ||
1240 | streamoff: | ||
1241 | ret = videobuf_streamoff(&layer->buffer_queue); | ||
1242 | return ret; | 1296 | return ret; |
1243 | } | 1297 | } |
1244 | 1298 | ||
@@ -1265,10 +1319,10 @@ static int vpbe_display_dqbuf(struct file *file, void *priv, | |||
1265 | } | 1319 | } |
1266 | if (file->f_flags & O_NONBLOCK) | 1320 | if (file->f_flags & O_NONBLOCK) |
1267 | /* Call videobuf_dqbuf for non blocking mode */ | 1321 | /* Call videobuf_dqbuf for non blocking mode */ |
1268 | ret = videobuf_dqbuf(&layer->buffer_queue, buf, 1); | 1322 | ret = vb2_dqbuf(&layer->buffer_queue, buf, 1); |
1269 | else | 1323 | else |
1270 | /* Call videobuf_dqbuf for blocking mode */ | 1324 | /* Call videobuf_dqbuf for blocking mode */ |
1271 | ret = videobuf_dqbuf(&layer->buffer_queue, buf, 0); | 1325 | ret = vb2_dqbuf(&layer->buffer_queue, buf, 0); |
1272 | 1326 | ||
1273 | return ret; | 1327 | return ret; |
1274 | } | 1328 | } |
@@ -1295,7 +1349,7 @@ static int vpbe_display_qbuf(struct file *file, void *priv, | |||
1295 | return -EACCES; | 1349 | return -EACCES; |
1296 | } | 1350 | } |
1297 | 1351 | ||
1298 | return videobuf_qbuf(&layer->buffer_queue, p); | 1352 | return vb2_qbuf(&layer->buffer_queue, p); |
1299 | } | 1353 | } |
1300 | 1354 | ||
1301 | static int vpbe_display_querybuf(struct file *file, void *priv, | 1355 | static int vpbe_display_querybuf(struct file *file, void *priv, |
@@ -1304,7 +1358,6 @@ static int vpbe_display_querybuf(struct file *file, void *priv, | |||
1304 | struct vpbe_fh *fh = file->private_data; | 1358 | struct vpbe_fh *fh = file->private_data; |
1305 | struct vpbe_layer *layer = fh->layer; | 1359 | struct vpbe_layer *layer = fh->layer; |
1306 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; | 1360 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; |
1307 | int ret; | ||
1308 | 1361 | ||
1309 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, | 1362 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, |
1310 | "VIDIOC_QUERYBUF, layer id = %d\n", | 1363 | "VIDIOC_QUERYBUF, layer id = %d\n", |
@@ -1314,11 +1367,8 @@ static int vpbe_display_querybuf(struct file *file, void *priv, | |||
1314 | v4l2_err(&vpbe_dev->v4l2_dev, "Invalid buffer type\n"); | 1367 | v4l2_err(&vpbe_dev->v4l2_dev, "Invalid buffer type\n"); |
1315 | return -EINVAL; | 1368 | return -EINVAL; |
1316 | } | 1369 | } |
1317 | 1370 | /* Call vb2_querybuf to get information */ | |
1318 | /* Call videobuf_querybuf to get information */ | 1371 | return vb2_querybuf(&layer->buffer_queue, buf); |
1319 | ret = videobuf_querybuf(&layer->buffer_queue, buf); | ||
1320 | |||
1321 | return ret; | ||
1322 | } | 1372 | } |
1323 | 1373 | ||
1324 | static int vpbe_display_reqbufs(struct file *file, void *priv, | 1374 | static int vpbe_display_reqbufs(struct file *file, void *priv, |
@@ -1327,8 +1377,8 @@ static int vpbe_display_reqbufs(struct file *file, void *priv, | |||
1327 | struct vpbe_fh *fh = file->private_data; | 1377 | struct vpbe_fh *fh = file->private_data; |
1328 | struct vpbe_layer *layer = fh->layer; | 1378 | struct vpbe_layer *layer = fh->layer; |
1329 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; | 1379 | struct vpbe_device *vpbe_dev = fh->disp_dev->vpbe_dev; |
1380 | struct vb2_queue *q; | ||
1330 | int ret; | 1381 | int ret; |
1331 | |||
1332 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_display_reqbufs\n"); | 1382 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_display_reqbufs\n"); |
1333 | 1383 | ||
1334 | if (V4L2_BUF_TYPE_VIDEO_OUTPUT != req_buf->type) { | 1384 | if (V4L2_BUF_TYPE_VIDEO_OUTPUT != req_buf->type) { |
@@ -1342,15 +1392,26 @@ static int vpbe_display_reqbufs(struct file *file, void *priv, | |||
1342 | return -EBUSY; | 1392 | return -EBUSY; |
1343 | } | 1393 | } |
1344 | /* Initialize videobuf queue as per the buffer type */ | 1394 | /* Initialize videobuf queue as per the buffer type */ |
1345 | videobuf_queue_dma_contig_init(&layer->buffer_queue, | 1395 | layer->alloc_ctx = vb2_dma_contig_init_ctx(vpbe_dev->pdev); |
1346 | &video_qops, | 1396 | if (!layer->alloc_ctx) { |
1347 | vpbe_dev->pdev, | 1397 | v4l2_err(&vpbe_dev->v4l2_dev, "Failed to get the context\n"); |
1348 | &layer->irqlock, | 1398 | return -EINVAL; |
1349 | V4L2_BUF_TYPE_VIDEO_OUTPUT, | 1399 | } |
1350 | layer->pix_fmt.field, | 1400 | q = &layer->buffer_queue; |
1351 | sizeof(struct videobuf_buffer), | 1401 | memset(q, 0, sizeof(*q)); |
1352 | fh, NULL); | 1402 | q->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; |
1403 | q->io_modes = VB2_MMAP | VB2_USERPTR; | ||
1404 | q->drv_priv = fh; | ||
1405 | q->ops = &video_qops; | ||
1406 | q->mem_ops = &vb2_dma_contig_memops; | ||
1407 | q->buf_struct_size = sizeof(struct vpbe_disp_buffer); | ||
1353 | 1408 | ||
1409 | ret = vb2_queue_init(q); | ||
1410 | if (ret) { | ||
1411 | v4l2_err(&vpbe_dev->v4l2_dev, "vb2_queue_init() failed\n"); | ||
1412 | vb2_dma_contig_cleanup_ctx(layer->alloc_ctx); | ||
1413 | return ret; | ||
1414 | } | ||
1354 | /* Set io allowed member of file handle to TRUE */ | 1415 | /* Set io allowed member of file handle to TRUE */ |
1355 | fh->io_allowed = 1; | 1416 | fh->io_allowed = 1; |
1356 | /* Increment io usrs member of layer object to 1 */ | 1417 | /* Increment io usrs member of layer object to 1 */ |
@@ -1360,9 +1421,7 @@ static int vpbe_display_reqbufs(struct file *file, void *priv, | |||
1360 | /* Initialize buffer queue */ | 1421 | /* Initialize buffer queue */ |
1361 | INIT_LIST_HEAD(&layer->dma_queue); | 1422 | INIT_LIST_HEAD(&layer->dma_queue); |
1362 | /* Allocate buffers */ | 1423 | /* Allocate buffers */ |
1363 | ret = videobuf_reqbufs(&layer->buffer_queue, req_buf); | 1424 | return vb2_reqbufs(q, req_buf); |
1364 | |||
1365 | return ret; | ||
1366 | } | 1425 | } |
1367 | 1426 | ||
1368 | /* | 1427 | /* |
@@ -1381,7 +1440,7 @@ static int vpbe_display_mmap(struct file *filep, struct vm_area_struct *vma) | |||
1381 | 1440 | ||
1382 | if (mutex_lock_interruptible(&layer->opslock)) | 1441 | if (mutex_lock_interruptible(&layer->opslock)) |
1383 | return -ERESTARTSYS; | 1442 | return -ERESTARTSYS; |
1384 | ret = videobuf_mmap_mapper(&layer->buffer_queue, vma); | 1443 | ret = vb2_mmap(&layer->buffer_queue, vma); |
1385 | mutex_unlock(&layer->opslock); | 1444 | mutex_unlock(&layer->opslock); |
1386 | return ret; | 1445 | return ret; |
1387 | } | 1446 | } |
@@ -1398,7 +1457,7 @@ static unsigned int vpbe_display_poll(struct file *filep, poll_table *wait) | |||
1398 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_display_poll\n"); | 1457 | v4l2_dbg(1, debug, &vpbe_dev->v4l2_dev, "vpbe_display_poll\n"); |
1399 | if (layer->started) { | 1458 | if (layer->started) { |
1400 | mutex_lock(&layer->opslock); | 1459 | mutex_lock(&layer->opslock); |
1401 | err = videobuf_poll_stream(filep, &layer->buffer_queue, wait); | 1460 | err = vb2_poll(&layer->buffer_queue, filep, wait); |
1402 | mutex_unlock(&layer->opslock); | 1461 | mutex_unlock(&layer->opslock); |
1403 | } | 1462 | } |
1404 | return err; | 1463 | return err; |
@@ -1488,8 +1547,8 @@ static int vpbe_display_release(struct file *file) | |||
1488 | layer->layer_info.id); | 1547 | layer->layer_info.id); |
1489 | layer->started = 0; | 1548 | layer->started = 0; |
1490 | /* Free buffers allocated */ | 1549 | /* Free buffers allocated */ |
1491 | videobuf_queue_cancel(&layer->buffer_queue); | 1550 | vb2_queue_release(&layer->buffer_queue); |
1492 | videobuf_mmap_free(&layer->buffer_queue); | 1551 | vb2_dma_contig_cleanup_ctx(&layer->buffer_queue); |
1493 | } | 1552 | } |
1494 | 1553 | ||
1495 | /* Decrement layer usrs counter */ | 1554 | /* Decrement layer usrs counter */ |
diff --git a/drivers/media/platform/davinci/vpbe_osd.c b/drivers/media/platform/davinci/vpbe_osd.c index bba299dbf396..707f243f810d 100644 --- a/drivers/media/platform/davinci/vpbe_osd.c +++ b/drivers/media/platform/davinci/vpbe_osd.c | |||
@@ -62,7 +62,7 @@ static inline u32 osd_set(struct osd_state *sd, u32 mask, u32 offset) | |||
62 | { | 62 | { |
63 | struct osd_state *osd = sd; | 63 | struct osd_state *osd = sd; |
64 | 64 | ||
65 | u32 addr = osd->osd_base + offset; | 65 | void __iomem *addr = osd->osd_base + offset; |
66 | u32 val = readl(addr) | mask; | 66 | u32 val = readl(addr) | mask; |
67 | 67 | ||
68 | writel(val, addr); | 68 | writel(val, addr); |
@@ -74,7 +74,7 @@ static inline u32 osd_clear(struct osd_state *sd, u32 mask, u32 offset) | |||
74 | { | 74 | { |
75 | struct osd_state *osd = sd; | 75 | struct osd_state *osd = sd; |
76 | 76 | ||
77 | u32 addr = osd->osd_base + offset; | 77 | void __iomem *addr = osd->osd_base + offset; |
78 | u32 val = readl(addr) & ~mask; | 78 | u32 val = readl(addr) & ~mask; |
79 | 79 | ||
80 | writel(val, addr); | 80 | writel(val, addr); |
@@ -87,7 +87,7 @@ static inline u32 osd_modify(struct osd_state *sd, u32 mask, u32 val, | |||
87 | { | 87 | { |
88 | struct osd_state *osd = sd; | 88 | struct osd_state *osd = sd; |
89 | 89 | ||
90 | u32 addr = osd->osd_base + offset; | 90 | void __iomem *addr = osd->osd_base + offset; |
91 | u32 new_val = (readl(addr) & ~mask) | (val & mask); | 91 | u32 new_val = (readl(addr) & ~mask) | (val & mask); |
92 | 92 | ||
93 | writel(new_val, addr); | 93 | writel(new_val, addr); |
@@ -1559,8 +1559,7 @@ static int osd_probe(struct platform_device *pdev) | |||
1559 | ret = -ENODEV; | 1559 | ret = -ENODEV; |
1560 | goto free_mem; | 1560 | goto free_mem; |
1561 | } | 1561 | } |
1562 | osd->osd_base = (unsigned long)ioremap_nocache(res->start, | 1562 | osd->osd_base = ioremap_nocache(res->start, osd->osd_size); |
1563 | osd->osd_size); | ||
1564 | if (!osd->osd_base) { | 1563 | if (!osd->osd_base) { |
1565 | dev_err(osd->dev, "Unable to map the OSD region\n"); | 1564 | dev_err(osd->dev, "Unable to map the OSD region\n"); |
1566 | ret = -ENODEV; | 1565 | ret = -ENODEV; |
diff --git a/drivers/media/platform/davinci/vpif.c b/drivers/media/platform/davinci/vpif.c index cff3c0ab501f..0d6cc8e4deb2 100644 --- a/drivers/media/platform/davinci/vpif.c +++ b/drivers/media/platform/davinci/vpif.c | |||
@@ -444,7 +444,7 @@ static int __devinit vpif_probe(struct platform_device *pdev) | |||
444 | status = PTR_ERR(vpif_clk); | 444 | status = PTR_ERR(vpif_clk); |
445 | goto clk_fail; | 445 | goto clk_fail; |
446 | } | 446 | } |
447 | clk_enable(vpif_clk); | 447 | clk_prepare_enable(vpif_clk); |
448 | 448 | ||
449 | spin_lock_init(&vpif_lock); | 449 | spin_lock_init(&vpif_lock); |
450 | dev_info(&pdev->dev, "vpif probe success\n"); | 450 | dev_info(&pdev->dev, "vpif probe success\n"); |
@@ -460,7 +460,7 @@ fail: | |||
460 | static int __devexit vpif_remove(struct platform_device *pdev) | 460 | static int __devexit vpif_remove(struct platform_device *pdev) |
461 | { | 461 | { |
462 | if (vpif_clk) { | 462 | if (vpif_clk) { |
463 | clk_disable(vpif_clk); | 463 | clk_disable_unprepare(vpif_clk); |
464 | clk_put(vpif_clk); | 464 | clk_put(vpif_clk); |
465 | } | 465 | } |
466 | 466 | ||
@@ -472,13 +472,13 @@ static int __devexit vpif_remove(struct platform_device *pdev) | |||
472 | #ifdef CONFIG_PM | 472 | #ifdef CONFIG_PM |
473 | static int vpif_suspend(struct device *dev) | 473 | static int vpif_suspend(struct device *dev) |
474 | { | 474 | { |
475 | clk_disable(vpif_clk); | 475 | clk_disable_unprepare(vpif_clk); |
476 | return 0; | 476 | return 0; |
477 | } | 477 | } |
478 | 478 | ||
479 | static int vpif_resume(struct device *dev) | 479 | static int vpif_resume(struct device *dev) |
480 | { | 480 | { |
481 | clk_enable(vpif_clk); | 481 | clk_prepare_enable(vpif_clk); |
482 | return 0; | 482 | return 0; |
483 | } | 483 | } |
484 | 484 | ||
diff --git a/drivers/media/platform/davinci/vpif_capture.c b/drivers/media/platform/davinci/vpif_capture.c index fcabc023885d..a409ccefb380 100644 --- a/drivers/media/platform/davinci/vpif_capture.c +++ b/drivers/media/platform/davinci/vpif_capture.c | |||
@@ -201,13 +201,16 @@ static void vpif_buffer_queue(struct vb2_buffer *vb) | |||
201 | struct vpif_cap_buffer *buf = container_of(vb, | 201 | struct vpif_cap_buffer *buf = container_of(vb, |
202 | struct vpif_cap_buffer, vb); | 202 | struct vpif_cap_buffer, vb); |
203 | struct common_obj *common; | 203 | struct common_obj *common; |
204 | unsigned long flags; | ||
204 | 205 | ||
205 | common = &ch->common[VPIF_VIDEO_INDEX]; | 206 | common = &ch->common[VPIF_VIDEO_INDEX]; |
206 | 207 | ||
207 | vpif_dbg(2, debug, "vpif_buffer_queue\n"); | 208 | vpif_dbg(2, debug, "vpif_buffer_queue\n"); |
208 | 209 | ||
210 | spin_lock_irqsave(&common->irqlock, flags); | ||
209 | /* add the buffer to the DMA queue */ | 211 | /* add the buffer to the DMA queue */ |
210 | list_add_tail(&buf->list, &common->dma_queue); | 212 | list_add_tail(&buf->list, &common->dma_queue); |
213 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
211 | } | 214 | } |
212 | 215 | ||
213 | /** | 216 | /** |
@@ -278,10 +281,13 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count) | |||
278 | struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX]; | 281 | struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX]; |
279 | struct vpif_params *vpif = &ch->vpifparams; | 282 | struct vpif_params *vpif = &ch->vpifparams; |
280 | unsigned long addr = 0; | 283 | unsigned long addr = 0; |
284 | unsigned long flags; | ||
281 | int ret; | 285 | int ret; |
282 | 286 | ||
283 | /* If buffer queue is empty, return error */ | 287 | /* If buffer queue is empty, return error */ |
288 | spin_lock_irqsave(&common->irqlock, flags); | ||
284 | if (list_empty(&common->dma_queue)) { | 289 | if (list_empty(&common->dma_queue)) { |
290 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
285 | vpif_dbg(1, debug, "buffer queue is empty\n"); | 291 | vpif_dbg(1, debug, "buffer queue is empty\n"); |
286 | return -EIO; | 292 | return -EIO; |
287 | } | 293 | } |
@@ -291,6 +297,7 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count) | |||
291 | struct vpif_cap_buffer, list); | 297 | struct vpif_cap_buffer, list); |
292 | /* Remove buffer from the buffer queue */ | 298 | /* Remove buffer from the buffer queue */ |
293 | list_del(&common->cur_frm->list); | 299 | list_del(&common->cur_frm->list); |
300 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
294 | /* Mark state of the current frame to active */ | 301 | /* Mark state of the current frame to active */ |
295 | common->cur_frm->vb.state = VB2_BUF_STATE_ACTIVE; | 302 | common->cur_frm->vb.state = VB2_BUF_STATE_ACTIVE; |
296 | /* Initialize field_id and started member */ | 303 | /* Initialize field_id and started member */ |
@@ -362,6 +369,7 @@ static int vpif_stop_streaming(struct vb2_queue *vq) | |||
362 | struct vpif_fh *fh = vb2_get_drv_priv(vq); | 369 | struct vpif_fh *fh = vb2_get_drv_priv(vq); |
363 | struct channel_obj *ch = fh->channel; | 370 | struct channel_obj *ch = fh->channel; |
364 | struct common_obj *common; | 371 | struct common_obj *common; |
372 | unsigned long flags; | ||
365 | 373 | ||
366 | if (!vb2_is_streaming(vq)) | 374 | if (!vb2_is_streaming(vq)) |
367 | return 0; | 375 | return 0; |
@@ -369,12 +377,14 @@ static int vpif_stop_streaming(struct vb2_queue *vq) | |||
369 | common = &ch->common[VPIF_VIDEO_INDEX]; | 377 | common = &ch->common[VPIF_VIDEO_INDEX]; |
370 | 378 | ||
371 | /* release all active buffers */ | 379 | /* release all active buffers */ |
380 | spin_lock_irqsave(&common->irqlock, flags); | ||
372 | while (!list_empty(&common->dma_queue)) { | 381 | while (!list_empty(&common->dma_queue)) { |
373 | common->next_frm = list_entry(common->dma_queue.next, | 382 | common->next_frm = list_entry(common->dma_queue.next, |
374 | struct vpif_cap_buffer, list); | 383 | struct vpif_cap_buffer, list); |
375 | list_del(&common->next_frm->list); | 384 | list_del(&common->next_frm->list); |
376 | vb2_buffer_done(&common->next_frm->vb, VB2_BUF_STATE_ERROR); | 385 | vb2_buffer_done(&common->next_frm->vb, VB2_BUF_STATE_ERROR); |
377 | } | 386 | } |
387 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
378 | 388 | ||
379 | return 0; | 389 | return 0; |
380 | } | 390 | } |
@@ -420,10 +430,12 @@ static void vpif_schedule_next_buffer(struct common_obj *common) | |||
420 | { | 430 | { |
421 | unsigned long addr = 0; | 431 | unsigned long addr = 0; |
422 | 432 | ||
433 | spin_lock(&common->irqlock); | ||
423 | common->next_frm = list_entry(common->dma_queue.next, | 434 | common->next_frm = list_entry(common->dma_queue.next, |
424 | struct vpif_cap_buffer, list); | 435 | struct vpif_cap_buffer, list); |
425 | /* Remove that buffer from the buffer queue */ | 436 | /* Remove that buffer from the buffer queue */ |
426 | list_del(&common->next_frm->list); | 437 | list_del(&common->next_frm->list); |
438 | spin_unlock(&common->irqlock); | ||
427 | common->next_frm->vb.state = VB2_BUF_STATE_ACTIVE; | 439 | common->next_frm->vb.state = VB2_BUF_STATE_ACTIVE; |
428 | addr = vb2_dma_contig_plane_dma_addr(&common->next_frm->vb, 0); | 440 | addr = vb2_dma_contig_plane_dma_addr(&common->next_frm->vb, 0); |
429 | 441 | ||
@@ -468,8 +480,12 @@ static irqreturn_t vpif_channel_isr(int irq, void *dev_id) | |||
468 | /* Check the field format */ | 480 | /* Check the field format */ |
469 | if (1 == ch->vpifparams.std_info.frm_fmt) { | 481 | if (1 == ch->vpifparams.std_info.frm_fmt) { |
470 | /* Progressive mode */ | 482 | /* Progressive mode */ |
471 | if (list_empty(&common->dma_queue)) | 483 | spin_lock(&common->irqlock); |
484 | if (list_empty(&common->dma_queue)) { | ||
485 | spin_unlock(&common->irqlock); | ||
472 | continue; | 486 | continue; |
487 | } | ||
488 | spin_unlock(&common->irqlock); | ||
473 | 489 | ||
474 | if (!channel_first_int[i][channel_id]) | 490 | if (!channel_first_int[i][channel_id]) |
475 | vpif_process_buffer_complete(common); | 491 | vpif_process_buffer_complete(common); |
@@ -513,9 +529,13 @@ static irqreturn_t vpif_channel_isr(int irq, void *dev_id) | |||
513 | vpif_process_buffer_complete(common); | 529 | vpif_process_buffer_complete(common); |
514 | } else if (1 == fid) { | 530 | } else if (1 == fid) { |
515 | /* odd field */ | 531 | /* odd field */ |
532 | spin_lock(&common->irqlock); | ||
516 | if (list_empty(&common->dma_queue) || | 533 | if (list_empty(&common->dma_queue) || |
517 | (common->cur_frm != common->next_frm)) | 534 | (common->cur_frm != common->next_frm)) { |
535 | spin_unlock(&common->irqlock); | ||
518 | continue; | 536 | continue; |
537 | } | ||
538 | spin_unlock(&common->irqlock); | ||
519 | 539 | ||
520 | vpif_schedule_next_buffer(common); | 540 | vpif_schedule_next_buffer(common); |
521 | } | 541 | } |
@@ -1004,9 +1024,9 @@ static int vpif_reqbufs(struct file *file, void *priv, | |||
1004 | 1024 | ||
1005 | /* Initialize videobuf2 queue as per the buffer type */ | 1025 | /* Initialize videobuf2 queue as per the buffer type */ |
1006 | common->alloc_ctx = vb2_dma_contig_init_ctx(vpif_dev); | 1026 | common->alloc_ctx = vb2_dma_contig_init_ctx(vpif_dev); |
1007 | if (!common->alloc_ctx) { | 1027 | if (IS_ERR(common->alloc_ctx)) { |
1008 | vpif_err("Failed to get the context\n"); | 1028 | vpif_err("Failed to get the context\n"); |
1009 | return -EINVAL; | 1029 | return PTR_ERR(common->alloc_ctx); |
1010 | } | 1030 | } |
1011 | q = &common->buffer_queue; | 1031 | q = &common->buffer_queue; |
1012 | q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | 1032 | q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
@@ -1715,7 +1735,7 @@ vpif_enum_dv_timings(struct file *file, void *priv, | |||
1715 | int ret; | 1735 | int ret; |
1716 | 1736 | ||
1717 | ret = v4l2_subdev_call(ch->sd, video, enum_dv_timings, timings); | 1737 | ret = v4l2_subdev_call(ch->sd, video, enum_dv_timings, timings); |
1718 | if (ret == -ENOIOCTLCMD && ret == -ENODEV) | 1738 | if (ret == -ENOIOCTLCMD || ret == -ENODEV) |
1719 | return -EINVAL; | 1739 | return -EINVAL; |
1720 | return ret; | 1740 | return ret; |
1721 | } | 1741 | } |
@@ -1735,7 +1755,7 @@ vpif_query_dv_timings(struct file *file, void *priv, | |||
1735 | int ret; | 1755 | int ret; |
1736 | 1756 | ||
1737 | ret = v4l2_subdev_call(ch->sd, video, query_dv_timings, timings); | 1757 | ret = v4l2_subdev_call(ch->sd, video, query_dv_timings, timings); |
1738 | if (ret == -ENOIOCTLCMD && ret == -ENODEV) | 1758 | if (ret == -ENOIOCTLCMD || ret == -ENODEV) |
1739 | return -ENODATA; | 1759 | return -ENODATA; |
1740 | return ret; | 1760 | return ret; |
1741 | } | 1761 | } |
diff --git a/drivers/media/platform/davinci/vpif_display.c b/drivers/media/platform/davinci/vpif_display.c index b716fbd4241f..9f2b603be9c9 100644 --- a/drivers/media/platform/davinci/vpif_display.c +++ b/drivers/media/platform/davinci/vpif_display.c | |||
@@ -177,11 +177,14 @@ static void vpif_buffer_queue(struct vb2_buffer *vb) | |||
177 | struct vpif_disp_buffer, vb); | 177 | struct vpif_disp_buffer, vb); |
178 | struct channel_obj *ch = fh->channel; | 178 | struct channel_obj *ch = fh->channel; |
179 | struct common_obj *common; | 179 | struct common_obj *common; |
180 | unsigned long flags; | ||
180 | 181 | ||
181 | common = &ch->common[VPIF_VIDEO_INDEX]; | 182 | common = &ch->common[VPIF_VIDEO_INDEX]; |
182 | 183 | ||
183 | /* add the buffer to the DMA queue */ | 184 | /* add the buffer to the DMA queue */ |
185 | spin_lock_irqsave(&common->irqlock, flags); | ||
184 | list_add_tail(&buf->list, &common->dma_queue); | 186 | list_add_tail(&buf->list, &common->dma_queue); |
187 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
185 | } | 188 | } |
186 | 189 | ||
187 | /* | 190 | /* |
@@ -246,10 +249,13 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count) | |||
246 | struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX]; | 249 | struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX]; |
247 | struct vpif_params *vpif = &ch->vpifparams; | 250 | struct vpif_params *vpif = &ch->vpifparams; |
248 | unsigned long addr = 0; | 251 | unsigned long addr = 0; |
252 | unsigned long flags; | ||
249 | int ret; | 253 | int ret; |
250 | 254 | ||
251 | /* If buffer queue is empty, return error */ | 255 | /* If buffer queue is empty, return error */ |
256 | spin_lock_irqsave(&common->irqlock, flags); | ||
252 | if (list_empty(&common->dma_queue)) { | 257 | if (list_empty(&common->dma_queue)) { |
258 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
253 | vpif_err("buffer queue is empty\n"); | 259 | vpif_err("buffer queue is empty\n"); |
254 | return -EIO; | 260 | return -EIO; |
255 | } | 261 | } |
@@ -260,6 +266,7 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count) | |||
260 | struct vpif_disp_buffer, list); | 266 | struct vpif_disp_buffer, list); |
261 | 267 | ||
262 | list_del(&common->cur_frm->list); | 268 | list_del(&common->cur_frm->list); |
269 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
263 | /* Mark state of the current frame to active */ | 270 | /* Mark state of the current frame to active */ |
264 | common->cur_frm->vb.state = VB2_BUF_STATE_ACTIVE; | 271 | common->cur_frm->vb.state = VB2_BUF_STATE_ACTIVE; |
265 | 272 | ||
@@ -330,6 +337,7 @@ static int vpif_stop_streaming(struct vb2_queue *vq) | |||
330 | struct vpif_fh *fh = vb2_get_drv_priv(vq); | 337 | struct vpif_fh *fh = vb2_get_drv_priv(vq); |
331 | struct channel_obj *ch = fh->channel; | 338 | struct channel_obj *ch = fh->channel; |
332 | struct common_obj *common; | 339 | struct common_obj *common; |
340 | unsigned long flags; | ||
333 | 341 | ||
334 | if (!vb2_is_streaming(vq)) | 342 | if (!vb2_is_streaming(vq)) |
335 | return 0; | 343 | return 0; |
@@ -337,12 +345,14 @@ static int vpif_stop_streaming(struct vb2_queue *vq) | |||
337 | common = &ch->common[VPIF_VIDEO_INDEX]; | 345 | common = &ch->common[VPIF_VIDEO_INDEX]; |
338 | 346 | ||
339 | /* release all active buffers */ | 347 | /* release all active buffers */ |
348 | spin_lock_irqsave(&common->irqlock, flags); | ||
340 | while (!list_empty(&common->dma_queue)) { | 349 | while (!list_empty(&common->dma_queue)) { |
341 | common->next_frm = list_entry(common->dma_queue.next, | 350 | common->next_frm = list_entry(common->dma_queue.next, |
342 | struct vpif_disp_buffer, list); | 351 | struct vpif_disp_buffer, list); |
343 | list_del(&common->next_frm->list); | 352 | list_del(&common->next_frm->list); |
344 | vb2_buffer_done(&common->next_frm->vb, VB2_BUF_STATE_ERROR); | 353 | vb2_buffer_done(&common->next_frm->vb, VB2_BUF_STATE_ERROR); |
345 | } | 354 | } |
355 | spin_unlock_irqrestore(&common->irqlock, flags); | ||
346 | 356 | ||
347 | return 0; | 357 | return 0; |
348 | } | 358 | } |
@@ -363,11 +373,13 @@ static void process_progressive_mode(struct common_obj *common) | |||
363 | { | 373 | { |
364 | unsigned long addr = 0; | 374 | unsigned long addr = 0; |
365 | 375 | ||
376 | spin_lock(&common->irqlock); | ||
366 | /* Get the next buffer from buffer queue */ | 377 | /* Get the next buffer from buffer queue */ |
367 | common->next_frm = list_entry(common->dma_queue.next, | 378 | common->next_frm = list_entry(common->dma_queue.next, |
368 | struct vpif_disp_buffer, list); | 379 | struct vpif_disp_buffer, list); |
369 | /* Remove that buffer from the buffer queue */ | 380 | /* Remove that buffer from the buffer queue */ |
370 | list_del(&common->next_frm->list); | 381 | list_del(&common->next_frm->list); |
382 | spin_unlock(&common->irqlock); | ||
371 | /* Mark status of the buffer as active */ | 383 | /* Mark status of the buffer as active */ |
372 | common->next_frm->vb.state = VB2_BUF_STATE_ACTIVE; | 384 | common->next_frm->vb.state = VB2_BUF_STATE_ACTIVE; |
373 | 385 | ||
@@ -398,16 +410,18 @@ static void process_interlaced_mode(int fid, struct common_obj *common) | |||
398 | common->cur_frm = common->next_frm; | 410 | common->cur_frm = common->next_frm; |
399 | 411 | ||
400 | } else if (1 == fid) { /* odd field */ | 412 | } else if (1 == fid) { /* odd field */ |
413 | spin_lock(&common->irqlock); | ||
401 | if (list_empty(&common->dma_queue) | 414 | if (list_empty(&common->dma_queue) |
402 | || (common->cur_frm != common->next_frm)) { | 415 | || (common->cur_frm != common->next_frm)) { |
416 | spin_unlock(&common->irqlock); | ||
403 | return; | 417 | return; |
404 | } | 418 | } |
419 | spin_unlock(&common->irqlock); | ||
405 | /* one field is displayed configure the next | 420 | /* one field is displayed configure the next |
406 | * frame if it is available else hold on current | 421 | * frame if it is available else hold on current |
407 | * frame */ | 422 | * frame */ |
408 | /* Get next from the buffer queue */ | 423 | /* Get next from the buffer queue */ |
409 | process_progressive_mode(common); | 424 | process_progressive_mode(common); |
410 | |||
411 | } | 425 | } |
412 | } | 426 | } |
413 | 427 | ||
@@ -437,8 +451,12 @@ static irqreturn_t vpif_channel_isr(int irq, void *dev_id) | |||
437 | continue; | 451 | continue; |
438 | 452 | ||
439 | if (1 == ch->vpifparams.std_info.frm_fmt) { | 453 | if (1 == ch->vpifparams.std_info.frm_fmt) { |
440 | if (list_empty(&common->dma_queue)) | 454 | spin_lock(&common->irqlock); |
455 | if (list_empty(&common->dma_queue)) { | ||
456 | spin_unlock(&common->irqlock); | ||
441 | continue; | 457 | continue; |
458 | } | ||
459 | spin_unlock(&common->irqlock); | ||
442 | 460 | ||
443 | /* Progressive mode */ | 461 | /* Progressive mode */ |
444 | if (!channel_first_int[i][channel_id]) { | 462 | if (!channel_first_int[i][channel_id]) { |
@@ -972,9 +990,9 @@ static int vpif_reqbufs(struct file *file, void *priv, | |||
972 | } | 990 | } |
973 | /* Initialize videobuf2 queue as per the buffer type */ | 991 | /* Initialize videobuf2 queue as per the buffer type */ |
974 | common->alloc_ctx = vb2_dma_contig_init_ctx(vpif_dev); | 992 | common->alloc_ctx = vb2_dma_contig_init_ctx(vpif_dev); |
975 | if (!common->alloc_ctx) { | 993 | if (IS_ERR(common->alloc_ctx)) { |
976 | vpif_err("Failed to get the context\n"); | 994 | vpif_err("Failed to get the context\n"); |
977 | return -EINVAL; | 995 | return PTR_ERR(common->alloc_ctx); |
978 | } | 996 | } |
979 | q = &common->buffer_queue; | 997 | q = &common->buffer_queue; |
980 | q->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; | 998 | q->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; |
@@ -1380,7 +1398,7 @@ vpif_enum_dv_timings(struct file *file, void *priv, | |||
1380 | int ret; | 1398 | int ret; |
1381 | 1399 | ||
1382 | ret = v4l2_subdev_call(ch->sd, video, enum_dv_timings, timings); | 1400 | ret = v4l2_subdev_call(ch->sd, video, enum_dv_timings, timings); |
1383 | if (ret == -ENOIOCTLCMD && ret == -ENODEV) | 1401 | if (ret == -ENOIOCTLCMD || ret == -ENODEV) |
1384 | return -EINVAL; | 1402 | return -EINVAL; |
1385 | return ret; | 1403 | return ret; |
1386 | } | 1404 | } |