aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/davinci
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-12-13 22:22:22 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-13 22:22:22 -0500
commitd8c532c40721f7507896d202b8cae3b3642d2b0d (patch)
tree42b1ce76671eb85324281ed93491432f4523f983 /drivers/media/platform/davinci
parente777d192ffb9f2929d547a2f8a5f65b7db7a9552 (diff)
parent77c53d0b56264a8fc5844e087ad15fffe20c299d (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/Kconfig2
-rw-r--r--drivers/media/platform/davinci/dm355_ccdc.c8
-rw-r--r--drivers/media/platform/davinci/dm644x_ccdc.c16
-rw-r--r--drivers/media/platform/davinci/isif.c5
-rw-r--r--drivers/media/platform/davinci/vpbe.c10
-rw-r--r--drivers/media/platform/davinci/vpbe_display.c303
-rw-r--r--drivers/media/platform/davinci/vpbe_osd.c9
-rw-r--r--drivers/media/platform/davinci/vpif.c8
-rw-r--r--drivers/media/platform/davinci/vpif_capture.c34
-rw-r--r--drivers/media/platform/davinci/vpif_display.c28
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;
1036fail_sclk: 1036fail_sclk:
1037 clk_disable_unprepare(ccdc_cfg.sclk);
1037 clk_put(ccdc_cfg.sclk); 1038 clk_put(ccdc_cfg.sclk);
1038fail_mclk: 1039fail_mclk:
1040 clk_disable_unprepare(ccdc_cfg.mclk);
1039 clk_put(ccdc_cfg.mclk); 1041 clk_put(ccdc_cfg.mclk);
1040fail_nomap: 1042fail_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;
1015fail_sclk: 1015fail_sclk:
1016 clk_disable_unprepare(ccdc_cfg.sclk);
1016 clk_put(ccdc_cfg.sclk); 1017 clk_put(ccdc_cfg.sclk);
1017fail_mclk: 1018fail_mclk:
1019 clk_disable_unprepare(ccdc_cfg.mclk);
1018 clk_put(ccdc_cfg.mclk); 1020 clk_put(ccdc_cfg.mclk);
1019fail_nomap: 1021fail_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)
1055static int dm644x_ccdc_resume(struct device *dev) 1059static 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 }
1127fail_mclk: 1127fail_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:
759fail_dev_unregister: 759fail_dev_unregister:
760 v4l2_device_unregister(&vpbe_dev->v4l2_dev); 760 v4l2_device_unregister(&vpbe_dev->v4l2_dev);
761fail_clk_put: 761fail_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 }
764fail_mutex_unlock: 766fail_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:
777static void vpbe_deinitialize(struct device *dev, struct vpbe_device *vpbe_dev) 779static 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
48module_param(debug, int, 0644); 48module_param(debug, int, 0644);
49 49
50static int vpbe_set_osd_display_params(struct vpbe_display *disp_dev,
51 struct vpbe_layer *layer);
52
50static int venc_is_second_field(struct vpbe_display *disp_dev) 53static 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 */
206static int vpbe_buffer_prepare(struct videobuf_queue *q, 208static 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 */
252static int vpbe_buffer_setup(struct videobuf_queue *q, 243static int
253 unsigned int *count, 244vpbe_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 */
276static void vpbe_buffer_queue(struct videobuf_queue *q, 271static 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 */
302static void vpbe_buffer_release(struct videobuf_queue *q, 296static 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
315static 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
323static 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
331static 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
340static 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
377static 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
319static struct videobuf_queue_ops video_qops = { 396static 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
326static 408static
@@ -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;
1240streamoff:
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
1301static int vpbe_display_querybuf(struct file *file, void *priv, 1355static 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
1324static int vpbe_display_reqbufs(struct file *file, void *priv, 1374static 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:
460static int __devexit vpif_remove(struct platform_device *pdev) 460static 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
473static int vpif_suspend(struct device *dev) 473static 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
479static int vpif_resume(struct device *dev) 479static 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}