[media] OMAP3: ISP: Add regulator control for omap34xx
authorKalle Jokiniemi <kalle.jokiniemi@nokia.com>
Tue, 3 May 2011 10:41:22 +0000 (07:41 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 27 Jul 2011 20:56:06 +0000 (17:56 -0300)
The current omap3isp driver is missing regulator handling
for CSIb complex in omap34xx based devices. This patch
adds a mechanism for this to the omap3isp driver.

Signed-off-by: Kalle Jokiniemi <kalle.jokiniemi@nokia.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Sakari Ailus <sakari.ailus@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/omap3isp/ispccp2.c
drivers/media/video/omap3isp/ispccp2.h

index 0e16cab8e0890a64d8b175f4ece607db63951c13..ec9e395f3339dd0ae3f567620574a37149df4eff 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/uaccess.h>
+#include <linux/regulator/consumer.h>
 
 #include "isp.h"
 #include "ispreg.h"
@@ -163,6 +164,9 @@ static void ccp2_if_enable(struct isp_ccp2_device *ccp2, u8 enable)
        struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity);
        int i;
 
+       if (enable && ccp2->vdds_csib)
+               regulator_enable(ccp2->vdds_csib);
+
        /* Enable/Disable all the LCx channels */
        for (i = 0; i < CCP2_LCx_CHANS_NUM; i++)
                isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_CCP2, ISPCCP2_LCx_CTRL(i),
@@ -186,6 +190,9 @@ static void ccp2_if_enable(struct isp_ccp2_device *ccp2, u8 enable)
                                    ISPCCP2_LC01_IRQENABLE,
                                    ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ);
        }
+
+       if (!enable && ccp2->vdds_csib)
+               regulator_disable(ccp2->vdds_csib);
 }
 
 /*
@@ -1137,6 +1144,9 @@ error:
  */
 void omap3isp_ccp2_cleanup(struct isp_device *isp)
 {
+       struct isp_ccp2_device *ccp2 = &isp->isp_ccp2;
+
+       regulator_put(ccp2->vdds_csib);
 }
 
 /*
@@ -1151,14 +1161,27 @@ int omap3isp_ccp2_init(struct isp_device *isp)
 
        init_waitqueue_head(&ccp2->wait);
 
-       /* On the OMAP36xx, the CCP2 uses the CSI PHY1 or PHY2, shared with
+       /*
+        * On the OMAP34xx the CSI1 receiver is operated in the CSIb IO
+        * complex, which is powered by vdds_csib power rail. Hence the
+        * request for the regulator.
+        *
+        * On the OMAP36xx, the CCP2 uses the CSI PHY1 or PHY2, shared with
         * the CSI2c or CSI2a receivers. The PHY then needs to be explicitly
         * configured.
         *
         * TODO: Don't hardcode the usage of PHY1 (shared with CSI2c).
         */
-       if (isp->revision == ISP_REVISION_15_0)
+       if (isp->revision == ISP_REVISION_2_0) {
+               ccp2->vdds_csib = regulator_get(isp->dev, "vdds_csib");
+               if (IS_ERR(ccp2->vdds_csib)) {
+                       dev_dbg(isp->dev,
+                               "Could not get regulator vdds_csib\n");
+                       ccp2->vdds_csib = NULL;
+               }
+       } else if (isp->revision == ISP_REVISION_15_0) {
                ccp2->phy = &isp->isp_csiphy1;
+       }
 
        ret = ccp2_init_entities(ccp2);
        if (ret < 0)
index 5505a86a9a748a04e3b880950ceafab8896e306d..6674e9de2cd7aace79aedb9fbceb958fbb27bf63 100644 (file)
@@ -81,6 +81,7 @@ struct isp_ccp2_device {
        struct isp_interface_mem_config mem_cfg;
        struct isp_video video_in;
        struct isp_csiphy *phy;
+       struct regulator *vdds_csib;
        unsigned int error;
        enum isp_pipeline_stream_state state;
        wait_queue_head_t wait;