aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/marvell-ccic
diff options
context:
space:
mode:
authorLibin Yang <lbyang@marvell.com>2013-07-03 00:56:00 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-07-26 12:24:18 -0400
commit7c269f454e7a51b151d94f99344120efa1cd0acb (patch)
treec5960c5e8b6b90fab06750ffbfe653a60da50d3f /drivers/media/platform/marvell-ccic
parent0e394f44fbd6d6bf87afd37cee74bc341019f86b (diff)
[media] marvell-ccic: reset ccic phy when stop streaming for stability
This patch adds the reset ccic phy operation when stop streaming. Stop streaming without reset ccic phy, the next start streaming may be unstable. Also need add CCIC2 definition when PXA688/PXA2128 support dual ccics. Signed-off-by: Albert Wang <twang13@marvell.com> Signed-off-by: Libin Yang <lbyang@marvell.com> Acked-by: Jonathan Corbet <corbet@lwn.net> Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/platform/marvell-ccic')
-rw-r--r--drivers/media/platform/marvell-ccic/mcam-core.c6
-rw-r--r--drivers/media/platform/marvell-ccic/mcam-core.h2
-rw-r--r--drivers/media/platform/marvell-ccic/mmp-driver.c25
3 files changed, 33 insertions, 0 deletions
diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c b/drivers/media/platform/marvell-ccic/mcam-core.c
index a256804ec40c..56d489bab39b 100644
--- a/drivers/media/platform/marvell-ccic/mcam-core.c
+++ b/drivers/media/platform/marvell-ccic/mcam-core.c
@@ -1041,6 +1041,12 @@ static int mcam_vb_stop_streaming(struct vb2_queue *vq)
1041 return -EINVAL; 1041 return -EINVAL;
1042 mcam_ctlr_stop_dma(cam); 1042 mcam_ctlr_stop_dma(cam);
1043 /* 1043 /*
1044 * Reset the CCIC PHY after stopping streaming,
1045 * otherwise, the CCIC may be unstable.
1046 */
1047 if (cam->ctlr_reset)
1048 cam->ctlr_reset(cam);
1049 /*
1044 * VB2 reclaims the buffers, so we need to forget 1050 * VB2 reclaims the buffers, so we need to forget
1045 * about them. 1051 * about them.
1046 */ 1052 */
diff --git a/drivers/media/platform/marvell-ccic/mcam-core.h b/drivers/media/platform/marvell-ccic/mcam-core.h
index 0de7e5fda836..39c6786ef83a 100644
--- a/drivers/media/platform/marvell-ccic/mcam-core.h
+++ b/drivers/media/platform/marvell-ccic/mcam-core.h
@@ -115,6 +115,7 @@ struct mcam_camera {
115 int mclk_src; /* which clock source the mclk derives from */ 115 int mclk_src; /* which clock source the mclk derives from */
116 int mclk_div; /* Clock Divider Value for MCLK */ 116 int mclk_div; /* Clock Divider Value for MCLK */
117 117
118 int ccic_id;
118 enum v4l2_mbus_type bus_type; 119 enum v4l2_mbus_type bus_type;
119 /* MIPI support */ 120 /* MIPI support */
120 /* The dphy config value, allocated in board file 121 /* The dphy config value, allocated in board file
@@ -135,6 +136,7 @@ struct mcam_camera {
135 int (*plat_power_up) (struct mcam_camera *cam); 136 int (*plat_power_up) (struct mcam_camera *cam);
136 void (*plat_power_down) (struct mcam_camera *cam); 137 void (*plat_power_down) (struct mcam_camera *cam);
137 void (*calc_dphy) (struct mcam_camera *cam); 138 void (*calc_dphy) (struct mcam_camera *cam);
139 void (*ctlr_reset) (struct mcam_camera *cam);
138 140
139 /* 141 /*
140 * Everything below here is private to the mcam core and 142 * Everything below here is private to the mcam core and
diff --git a/drivers/media/platform/marvell-ccic/mmp-driver.c b/drivers/media/platform/marvell-ccic/mmp-driver.c
index e7be4109797c..3665fbbf9ee7 100644
--- a/drivers/media/platform/marvell-ccic/mmp-driver.c
+++ b/drivers/media/platform/marvell-ccic/mmp-driver.c
@@ -105,6 +105,7 @@ static struct mmp_camera *mmpcam_find_device(struct platform_device *pdev)
105#define CPU_SUBSYS_PMU_BASE 0xd4282800 105#define CPU_SUBSYS_PMU_BASE 0xd4282800
106#define REG_CCIC_DCGCR 0x28 /* CCIC dyn clock gate ctrl reg */ 106#define REG_CCIC_DCGCR 0x28 /* CCIC dyn clock gate ctrl reg */
107#define REG_CCIC_CRCR 0x50 /* CCIC clk reset ctrl reg */ 107#define REG_CCIC_CRCR 0x50 /* CCIC clk reset ctrl reg */
108#define REG_CCIC2_CRCR 0xf4 /* CCIC2 clk reset ctrl reg */
108 109
109static void mcam_clk_enable(struct mcam_camera *mcam) 110static void mcam_clk_enable(struct mcam_camera *mcam)
110{ 111{
@@ -194,6 +195,28 @@ static void mmpcam_power_down(struct mcam_camera *mcam)
194 mcam_clk_disable(mcam); 195 mcam_clk_disable(mcam);
195} 196}
196 197
198void mcam_ctlr_reset(struct mcam_camera *mcam)
199{
200 unsigned long val;
201 struct mmp_camera *cam = mcam_to_cam(mcam);
202
203 if (mcam->ccic_id) {
204 /*
205 * Using CCIC2
206 */
207 val = ioread32(cam->power_regs + REG_CCIC2_CRCR);
208 iowrite32(val & ~0x2, cam->power_regs + REG_CCIC2_CRCR);
209 iowrite32(val | 0x2, cam->power_regs + REG_CCIC2_CRCR);
210 } else {
211 /*
212 * Using CCIC1
213 */
214 val = ioread32(cam->power_regs + REG_CCIC_CRCR);
215 iowrite32(val & ~0x2, cam->power_regs + REG_CCIC_CRCR);
216 iowrite32(val | 0x2, cam->power_regs + REG_CCIC_CRCR);
217 }
218}
219
197/* 220/*
198 * calc the dphy register values 221 * calc the dphy register values
199 * There are three dphy registers being used. 222 * There are three dphy registers being used.
@@ -354,9 +377,11 @@ static int mmpcam_probe(struct platform_device *pdev)
354 mcam = &cam->mcam; 377 mcam = &cam->mcam;
355 mcam->plat_power_up = mmpcam_power_up; 378 mcam->plat_power_up = mmpcam_power_up;
356 mcam->plat_power_down = mmpcam_power_down; 379 mcam->plat_power_down = mmpcam_power_down;
380 mcam->ctlr_reset = mcam_ctlr_reset;
357 mcam->calc_dphy = mmpcam_calc_dphy; 381 mcam->calc_dphy = mmpcam_calc_dphy;
358 mcam->dev = &pdev->dev; 382 mcam->dev = &pdev->dev;
359 mcam->use_smbus = 0; 383 mcam->use_smbus = 0;
384 mcam->ccic_id = pdev->id;
360 mcam->mclk_min = pdata->mclk_min; 385 mcam->mclk_min = pdata->mclk_min;
361 mcam->mclk_src = pdata->mclk_src; 386 mcam->mclk_src = pdata->mclk_src;
362 mcam->mclk_div = pdata->mclk_div; 387 mcam->mclk_div = pdata->mclk_div;