The N950's display requires two regulators.

Signed-off-by: Sebastian Reichel <sre at kernel.org>
---
 drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 57 +++++++++++++++++++++++--
 1 file changed, 53 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c 
b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 3414c2609320..768e92d1ec8b 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -24,6 +24,7 @@
 #include <linux/workqueue.h>
 #include <linux/of_device.h>
 #include <linux/of_gpio.h>
+#include <linux/regulator/consumer.h>

 #include <video/omapdss.h>
 #include <video/omap-panel-data.h>
@@ -60,6 +61,9 @@ struct panel_drv_data {
        int reset_gpio;
        int ext_te_gpio;

+       struct regulator *vpnl;
+       struct regulator *vddi;
+
        bool use_dsi_backlight;

        struct omap_dsi_pin_config pin_config;
@@ -597,25 +601,43 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
                .lp_clk_max = 10000000,
        };

+       if (ddata->vpnl) {
+               r = regulator_enable(ddata->vpnl);
+               if (r) {
+                       dev_err(&ddata->pdev->dev,
+                               "failed to enable VPNL: %d\n", r);
+                       goto err0;
+               }
+       }
+
+       if (ddata->vddi) {
+               r = regulator_enable(ddata->vddi);
+               if (r) {
+                       dev_err(&ddata->pdev->dev,
+                               "failed to enable VDDI: %d\n", r);
+                       goto err1;
+               }
+       }
+
        if (ddata->pin_config.num_pins > 0) {
                r = in->ops.dsi->configure_pins(in, &ddata->pin_config);
                if (r) {
                        dev_err(&ddata->pdev->dev,
                                "failed to configure DSI pins\n");
-                       goto err0;
+                       goto err2;
                }
        }

        r = in->ops.dsi->set_config(in, &dsi_config);
        if (r) {
                dev_err(&ddata->pdev->dev, "failed to configure DSI\n");
-               goto err0;
+               goto err2;
        }

        r = in->ops.dsi->enable(in);
        if (r) {
                dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
-               goto err0;
+               goto err2;
        }

        dsicm_hw_reset(ddata);
@@ -673,6 +695,12 @@ err:
        dsicm_hw_reset(ddata);

        in->ops.dsi->disable(in, true, false);
+err2:
+       if (ddata->vddi)
+               regulator_disable(ddata->vddi);
+err1:
+       if (ddata->vpnl)
+               regulator_disable(ddata->vpnl);
 err0:
        return r;
 }
@@ -696,6 +724,11 @@ static void dsicm_power_off(struct panel_drv_data *ddata)

        in->ops.dsi->disable(in, true, false);

+       if (ddata->vddi)
+               regulator_disable(ddata->vddi);
+       if (ddata->vpnl)
+               regulator_disable(ddata->vpnl);
+
        ddata->enabled = 0;
 }

@@ -1166,7 +1199,7 @@ static int dsicm_probe_of(struct platform_device *pdev)
        struct device_node *node = pdev->dev.of_node;
        struct panel_drv_data *ddata = platform_get_drvdata(pdev);
        struct omap_dss_device *in;
-       int gpio;
+       int gpio, err;

        gpio = of_get_named_gpio(node, "reset-gpios", 0);
        if (!gpio_is_valid(gpio)) {
@@ -1189,6 +1222,22 @@ static int dsicm_probe_of(struct platform_device *pdev)
                return PTR_ERR(in);
        }

+       ddata->vpnl = devm_regulator_get_optional(&pdev->dev, "vpnl");
+       if (IS_ERR(ddata->vpnl)) {
+               err = PTR_ERR(ddata->vpnl);
+               if (err == -EPROBE_DEFER)
+                       return err;
+               ddata->vpnl = NULL;
+       }
+
+       ddata->vddi = devm_regulator_get_optional(&pdev->dev, "vddi");
+       if (IS_ERR(ddata->vddi)) {
+               err = PTR_ERR(ddata->vddi);
+               if (err == -EPROBE_DEFER)
+                       return err;
+               ddata->vddi = NULL;
+       }
+
        ddata->in = in;

        /* TODO: ulps, backlight */
-- 
2.7.0

Reply via email to