if (cam->state != S_STREAMING)
                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.
 
        int mclk_src;   /* which clock source the mclk derives from */
        int mclk_div;   /* Clock Divider Value for MCLK */
 
+       int ccic_id;
        enum v4l2_mbus_type bus_type;
        /* MIPI support */
        /* The dphy config value, allocated in board file
        int (*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
 
 #define CPU_SUBSYS_PMU_BASE    0xd4282800
 #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_enable(struct mcam_camera *mcam)
 {
        mcam_clk_disable(mcam);
 }
 
+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.
        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->dev = &pdev->dev;
        mcam->use_smbus = 0;
+       mcam->ccic_id = pdev->id;
        mcam->mclk_min = pdata->mclk_min;
        mcam->mclk_src = pdata->mclk_src;
        mcam->mclk_div = pdata->mclk_div;