Re: [PATCH V3 04/15] [media] marvell-ccic: reset ccic phy when stop streaming for stability

2013-01-01 Thread Guennadi Liakhovetski
On Sat, 15 Dec 2012, Albert Wang wrote:

 From: Libin Yang lby...@marvell.com
 
 This patch adds the reset ccic phy operation when 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 twan...@marvell.com
 Signed-off-by: Libin Yang lby...@marvell.com

Acked-by: Guennadi Liakhovetski g.liakhovet...@gmx.de

Thanks
Guennadi

 ---
  drivers/media/platform/marvell-ccic/mcam-core.c  |6 ++
  drivers/media/platform/marvell-ccic/mcam-core.h  |2 ++
  drivers/media/platform/marvell-ccic/mmp-driver.c |   25 
 ++
  3 files changed, 33 insertions(+)
 
 diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c 
 b/drivers/media/platform/marvell-ccic/mcam-core.c
 index f6ae06d..19e91c5 100755
 --- a/drivers/media/platform/marvell-ccic/mcam-core.c
 +++ b/drivers/media/platform/marvell-ccic/mcam-core.c
 @@ -1058,6 +1058,12 @@ static int mcam_vb_stop_streaming(struct vb2_queue *vq)
   return -EINVAL;
   mcam_ctlr_stop_dma(cam);
   /*
 +  * Reset the CCIC PHY after stopping streaming,
 +  * otherwise, the CCIC may be unstable.
 +  */
 + if (cam-ctlr_reset)
 + cam-ctlr_reset(cam);
 + /*
* VB2 reclaims the buffers, so we need to forget
* about them.
*/
 diff --git a/drivers/media/platform/marvell-ccic/mcam-core.h 
 b/drivers/media/platform/marvell-ccic/mcam-core.h
 index 86e634e..7c42cbe 100755
 --- a/drivers/media/platform/marvell-ccic/mcam-core.h
 +++ b/drivers/media/platform/marvell-ccic/mcam-core.h
 @@ -103,6 +103,7 @@ struct mcam_camera {
   short int use_smbus;/* SMBUS or straight I2c? */
   enum mcam_buffer_mode buffer_mode;
  
 + int ccic_id;
   enum v4l2_mbus_type bus_type;
   /* MIPI support */
   int *dphy;
 @@ -120,6 +121,7 @@ struct mcam_camera {
   void (*plat_power_up) (struct mcam_camera *cam);
   void (*plat_power_down) (struct mcam_camera *cam);
   void (*calc_dphy)(struct mcam_camera *cam);
 + void (*ctlr_reset)(struct mcam_camera *cam);
  
   /*
* 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 2c4dce3..fec7cd8 100755
 --- a/drivers/media/platform/marvell-ccic/mmp-driver.c
 +++ b/drivers/media/platform/marvell-ccic/mmp-driver.c
 @@ -103,6 +103,7 @@ static struct mmp_camera *mmpcam_find_device(struct 
 platform_device *pdev)
  #define CPU_SUBSYS_PMU_BASE  0xd4282800
  #define REG_CCIC_DCGCR   0x28/* CCIC dyn clock gate ctrl reg 
 */
  #define REG_CCIC_CRCR0x50/* CCIC clk reset ctrl reg  
 */
 +#define REG_CCIC2_CRCR   0xf4/* CCIC2 clk reset ctrl reg 
 */
  
  static void mcam_clk_set(struct mcam_camera *mcam, int on)
  {
 @@ -174,6 +175,28 @@ static void mmpcam_power_down(struct mcam_camera *mcam)
   mcam_clk_set(mcam, 0);
  }
  
 +void mcam_ctlr_reset(struct mcam_camera *mcam)
 +{
 + unsigned long val;
 + struct mmp_camera *cam = mcam_to_cam(mcam);
 +
 + if (mcam-ccic_id) {
 + /*
 +  * Using CCIC2
 +  */
 + val = ioread32(cam-power_regs + REG_CCIC2_CRCR);
 + iowrite32(val  ~0x2, cam-power_regs + REG_CCIC2_CRCR);
 + iowrite32(val | 0x2, cam-power_regs + REG_CCIC2_CRCR);
 + } else {
 + /*
 +  * Using CCIC1
 +  */
 + val = ioread32(cam-power_regs + REG_CCIC_CRCR);
 + iowrite32(val  ~0x2, cam-power_regs + REG_CCIC_CRCR);
 + iowrite32(val | 0x2, cam-power_regs + REG_CCIC_CRCR);
 + }
 +}
 +
  /*
   * calc the dphy register values
   * There are three dphy registers being used.
 @@ -301,10 +324,12 @@ static int mmpcam_probe(struct platform_device *pdev)
   mcam = cam-mcam;
   mcam-plat_power_up = mmpcam_power_up;
   mcam-plat_power_down = mmpcam_power_down;
 + mcam-ctlr_reset = mcam_ctlr_reset;
   mcam-calc_dphy = mmpcam_calc_dphy;
   mcam-pll1 = NULL;
   mcam-dev = pdev-dev;
   mcam-use_smbus = 0;
 + mcam-ccic_id = pdev-id;
   mcam-bus_type = pdata-bus_type;
   mcam-dphy = pdata-dphy;
   mcam-mipi_enabled = 0;
 -- 
 1.7.9.5
 

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH V3 04/15] [media] marvell-ccic: reset ccic phy when stop streaming for stability

2012-12-16 Thread Jonathan Corbet
On Sat, 15 Dec 2012 17:57:53 +0800
Albert Wang twan...@marvell.com wrote:

 From: Libin Yang lby...@marvell.com
 
 This patch adds the reset ccic phy operation when stop streaming.
 
 Without reset ccic phy, the next start streaming may be unstable.
 
 Also need add CCIC2 definition when PXA688/PXA2128 support dual ccics.
 
As with all of these, I've not been able to test it, but it looks OK to
me.

Acked-by: Jonathan Corbet cor...@lwn.net

jon
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V3 04/15] [media] marvell-ccic: reset ccic phy when stop streaming for stability

2012-12-15 Thread Albert Wang
From: Libin Yang lby...@marvell.com

This patch adds the reset ccic phy operation when 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 twan...@marvell.com
Signed-off-by: Libin Yang lby...@marvell.com
---
 drivers/media/platform/marvell-ccic/mcam-core.c  |6 ++
 drivers/media/platform/marvell-ccic/mcam-core.h  |2 ++
 drivers/media/platform/marvell-ccic/mmp-driver.c |   25 ++
 3 files changed, 33 insertions(+)

diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c 
b/drivers/media/platform/marvell-ccic/mcam-core.c
index f6ae06d..19e91c5 100755
--- a/drivers/media/platform/marvell-ccic/mcam-core.c
+++ b/drivers/media/platform/marvell-ccic/mcam-core.c
@@ -1058,6 +1058,12 @@ static int mcam_vb_stop_streaming(struct vb2_queue *vq)
return -EINVAL;
mcam_ctlr_stop_dma(cam);
/*
+* Reset the CCIC PHY after stopping streaming,
+* otherwise, the CCIC may be unstable.
+*/
+   if (cam-ctlr_reset)
+   cam-ctlr_reset(cam);
+   /*
 * VB2 reclaims the buffers, so we need to forget
 * about them.
 */
diff --git a/drivers/media/platform/marvell-ccic/mcam-core.h 
b/drivers/media/platform/marvell-ccic/mcam-core.h
index 86e634e..7c42cbe 100755
--- a/drivers/media/platform/marvell-ccic/mcam-core.h
+++ b/drivers/media/platform/marvell-ccic/mcam-core.h
@@ -103,6 +103,7 @@ struct mcam_camera {
short int use_smbus;/* SMBUS or straight I2c? */
enum mcam_buffer_mode buffer_mode;
 
+   int ccic_id;
enum v4l2_mbus_type bus_type;
/* MIPI support */
int *dphy;
@@ -120,6 +121,7 @@ struct mcam_camera {
void (*plat_power_up) (struct mcam_camera *cam);
void (*plat_power_down) (struct mcam_camera *cam);
void (*calc_dphy)(struct mcam_camera *cam);
+   void (*ctlr_reset)(struct mcam_camera *cam);
 
/*
 * 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 2c4dce3..fec7cd8 100755
--- a/drivers/media/platform/marvell-ccic/mmp-driver.c
+++ b/drivers/media/platform/marvell-ccic/mmp-driver.c
@@ -103,6 +103,7 @@ static struct mmp_camera *mmpcam_find_device(struct 
platform_device *pdev)
 #define CPU_SUBSYS_PMU_BASE0xd4282800
 #define REG_CCIC_DCGCR 0x28/* CCIC dyn clock gate ctrl reg */
 #define REG_CCIC_CRCR  0x50/* CCIC clk reset ctrl reg  */
+#define REG_CCIC2_CRCR 0xf4/* CCIC2 clk reset ctrl reg */
 
 static void mcam_clk_set(struct mcam_camera *mcam, int on)
 {
@@ -174,6 +175,28 @@ static void mmpcam_power_down(struct mcam_camera *mcam)
mcam_clk_set(mcam, 0);
 }
 
+void mcam_ctlr_reset(struct mcam_camera *mcam)
+{
+   unsigned long val;
+   struct mmp_camera *cam = mcam_to_cam(mcam);
+
+   if (mcam-ccic_id) {
+   /*
+* Using CCIC2
+*/
+   val = ioread32(cam-power_regs + REG_CCIC2_CRCR);
+   iowrite32(val  ~0x2, cam-power_regs + REG_CCIC2_CRCR);
+   iowrite32(val | 0x2, cam-power_regs + REG_CCIC2_CRCR);
+   } else {
+   /*
+* Using CCIC1
+*/
+   val = ioread32(cam-power_regs + REG_CCIC_CRCR);
+   iowrite32(val  ~0x2, cam-power_regs + REG_CCIC_CRCR);
+   iowrite32(val | 0x2, cam-power_regs + REG_CCIC_CRCR);
+   }
+}
+
 /*
  * calc the dphy register values
  * There are three dphy registers being used.
@@ -301,10 +324,12 @@ static int mmpcam_probe(struct platform_device *pdev)
mcam = cam-mcam;
mcam-plat_power_up = mmpcam_power_up;
mcam-plat_power_down = mmpcam_power_down;
+   mcam-ctlr_reset = mcam_ctlr_reset;
mcam-calc_dphy = mmpcam_calc_dphy;
mcam-pll1 = NULL;
mcam-dev = pdev-dev;
mcam-use_smbus = 0;
+   mcam-ccic_id = pdev-id;
mcam-bus_type = pdata-bus_type;
mcam-dphy = pdata-dphy;
mcam-mipi_enabled = 0;
-- 
1.7.9.5

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html