mirror of https://github.com/parazyd/arm-sdk.git
136 lines
3.3 KiB
Diff
136 lines
3.3 KiB
Diff
From 594f7f466237d32323f63c04e92f7ce7be2f2a4f Mon Sep 17 00:00:00 2001
|
|
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
|
Date: Mon, 24 Jul 2017 19:33:06 +0200
|
|
Subject: [PATCH 09/17] drm/omap: panel-dsi-cm: add regulator support
|
|
|
|
Add support for regulators used by panels found inside
|
|
of the Nokia N950, N9 and Motorola Droid 4.
|
|
|
|
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
|
---
|
|
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 905b717..b98ea9e 100644
|
|
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
|
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
|
@@ -23,6 +23,7 @@
|
|
#include <linux/workqueue.h>
|
|
#include <linux/of_device.h>
|
|
#include <linux/of_gpio.h>
|
|
+#include <linux/regulator/consumer.h>
|
|
|
|
#include <video/mipi_display.h>
|
|
#include <video/of_display_timing.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;
|
|
@@ -590,25 +594,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);
|
|
+ return r;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (ddata->vddi) {
|
|
+ r = regulator_enable(ddata->vddi);
|
|
+ if (r) {
|
|
+ dev_err(&ddata->pdev->dev,
|
|
+ "failed to enable VDDI: %d\n", r);
|
|
+ goto err_vpnl;
|
|
+ }
|
|
+ }
|
|
+
|
|
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 err_vddi;
|
|
}
|
|
}
|
|
|
|
r = in->ops.dsi->set_config(in, &dsi_config);
|
|
if (r) {
|
|
dev_err(&ddata->pdev->dev, "failed to configure DSI\n");
|
|
- goto err0;
|
|
+ goto err_vddi;
|
|
}
|
|
|
|
r = in->ops.dsi->enable(in);
|
|
if (r) {
|
|
dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
|
|
- goto err0;
|
|
+ goto err_vddi;
|
|
}
|
|
|
|
dsicm_hw_reset(ddata);
|
|
@@ -666,7 +688,13 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
|
|
dsicm_hw_reset(ddata);
|
|
|
|
in->ops.dsi->disable(in, true, false);
|
|
-err0:
|
|
+err_vddi:
|
|
+ if (ddata->vddi)
|
|
+ regulator_disable(ddata->vddi);
|
|
+err_vpnl:
|
|
+ if (ddata->vpnl)
|
|
+ regulator_disable(ddata->vpnl);
|
|
+
|
|
return r;
|
|
}
|
|
|
|
@@ -689,6 +717,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;
|
|
}
|
|
|
|
@@ -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.1.4
|
|
|