Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh...
[pandora-kernel.git] / drivers / video / omap2 / dss / sdi.c
index 12eb404..ee07a3c 100644 (file)
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/err.h>
+#include <linux/regulator/consumer.h>
 
 #include <plat/display.h>
+#include <plat/cpu.h>
 #include "dss.h"
 
 static struct {
        bool skip_init;
        bool update_enabled;
+       struct regulator *vdds_sdi_reg;
 } sdi;
 
 static void sdi_basic_init(void)
@@ -57,6 +60,10 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev)
                goto err0;
        }
 
+       r = regulator_enable(sdi.vdds_sdi_reg);
+       if (r)
+               goto err1;
+
        /* In case of skip_init sdi_init has already enabled the clocks */
        if (!sdi.skip_init)
                dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
@@ -115,19 +122,12 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev)
 
        dssdev->manager->enable(dssdev->manager);
 
-       if (dssdev->driver->enable) {
-               r = dssdev->driver->enable(dssdev);
-               if (r)
-                       goto err3;
-       }
-
        sdi.skip_init = 0;
 
        return 0;
-err3:
-       dssdev->manager->disable(dssdev->manager);
 err2:
        dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+       regulator_disable(sdi.vdds_sdi_reg);
 err1:
        omap_dss_stop_device(dssdev);
 err0:
@@ -137,15 +137,14 @@ EXPORT_SYMBOL(omapdss_sdi_display_enable);
 
 void omapdss_sdi_display_disable(struct omap_dss_device *dssdev)
 {
-       if (dssdev->driver->disable)
-               dssdev->driver->disable(dssdev);
-
        dssdev->manager->disable(dssdev->manager);
 
        dss_sdi_disable();
 
        dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
 
+       regulator_disable(sdi.vdds_sdi_reg);
+
        omap_dss_stop_device(dssdev);
 }
 EXPORT_SYMBOL(omapdss_sdi_display_disable);
@@ -162,6 +161,11 @@ int sdi_init(bool skip_init)
        /* we store this for first display enable, then clear it */
        sdi.skip_init = skip_init;
 
+       sdi.vdds_sdi_reg = dss_get_vdds_sdi();
+       if (IS_ERR(sdi.vdds_sdi_reg)) {
+               DSSERR("can't get VDDS_SDI regulator\n");
+               return PTR_ERR(sdi.vdds_sdi_reg);
+       }
        /*
         * Enable clocks already here, otherwise there would be a toggle
         * of them until sdi_display_enable is called.