diff options
| author | Doug Zobel <dzobel1@motorola.com> | 2014-02-03 14:46:22 -0600 |
|---|---|---|
| committer | James Wylder <jwylder@motorola.com> | 2014-03-05 17:47:14 -0600 |
| commit | 448cd1ef9dfb050ee9fcd4eecc2abe9fa0ce187d (patch) | |
| tree | 97efed0037be443852a3afd38d21166f723c4a13 | |
| parent | 78a9d8de6bbc527f72abbfbcaf12268f0b9e13c2 (diff) | |
| download | olio-linux-3.10-448cd1ef9dfb050ee9fcd4eecc2abe9fa0ce187d.tar.xz olio-linux-3.10-448cd1ef9dfb050ee9fcd4eecc2abe9fa0ce187d.zip | |
IKXCLOCK-158 Display driver should dynamically enable/disable regulators
Panel and bridge IC regulators need to be enabled and disabled
dynamicly by the display driver instead of depending on them
being on all the time.
Change-Id: I3df350844443e71320c56471bbf2a45f631d6f2f
Reviewed-on: http://gerrit.pcs.mot.com/607910
SLTApproved: Slta Waiver <sltawvr@motorola.com>
Tested-by: Jira Key <jirakey@motorola.com>
Reviewed-by: Jee Su Chang <w20740@motorola.com>
Submit-Approved: Jira Key <jirakey@motorola.com>
| -rw-r--r-- | arch/arm/boot/dts/omap3-minnow-p0.dts | 27 | ||||
| -rw-r--r-- | arch/arm/boot/dts/omap3-minnow.dtsi | 25 | ||||
| -rw-r--r-- | drivers/video/omap2/displays/panel-minnow.c | 37 |
3 files changed, 64 insertions, 25 deletions
diff --git a/arch/arm/boot/dts/omap3-minnow-p0.dts b/arch/arm/boot/dts/omap3-minnow-p0.dts index 09b1714a7a8..8a588a43372 100644 --- a/arch/arm/boot/dts/omap3-minnow-p0.dts +++ b/arch/arm/boot/dts/omap3-minnow-p0.dts @@ -18,6 +18,33 @@ 0x02 /* Minnow P1B portable */ >; + Display@0 { + compatible = "mot,minnow-panel-dsi-cm"; + bridge-supply = <&ldo1_reg>; + panel-supply = <&ldo7_reg>; + /* 0: MINNOW_PANEL_CM_220X176 + * 1: MINNOW_PANEL_CM_220X220 + * 2: MINNOW_PANEL_CM_BRIDGE_320X320 + */ + id_panel = <2>; + gpio_panel_reset = <&gpio1 14 0>; /* RESET gpio-14 */ + gpio_bridge_reset = <&gpio1 23 0>; /* RESET gpio-23 */ + gpio_clk_en = <&gpio6 17 0>; /* RESET gpio-177 */ + /* declare it if ext_te enable */ + //gpio_te = <&gpio1 0 0>; /* EXT_TE gpio-0 */ + //pins = <0 1 2 3>; /* DSI Pin config */ + //esd_interval = <0>; /* ESD_INTERVAL */ + //pixel_clock = <4608>; /* kHZ = 320*240*60/1000*/ + /* 0: RGB888 + * 1: RGB666 + * 2: RGB666_PACKED + * 3: RGB565 + */ + //pixel_format = <1>; + //hs_clk = <90000000 150000000>; /* min max*/ + //lp_clk = <7000000 9000000>; /* min max*/ + }; + c55-ctrl@0 { compatible = "ti,c55-ctrl"; reg = <0 0>; diff --git a/arch/arm/boot/dts/omap3-minnow.dtsi b/arch/arm/boot/dts/omap3-minnow.dtsi index aa0e16abd1d..a387d98b01d 100644 --- a/arch/arm/boot/dts/omap3-minnow.dtsi +++ b/arch/arm/boot/dts/omap3-minnow.dtsi @@ -11,31 +11,6 @@ model = "Motorola OMAP3 Platform"; compatible = "mot,omap3-minnow", "ti,omap3"; - Display@0 { - compatible = "mot,minnow-panel-dsi-cm"; - /* 0: MINNOW_PANEL_CM_220X176 - * 1: MINNOW_PANEL_CM_220X220 - * 2: MINNOW_PANEL_CM_BRIDGE_320X320 - */ - id_panel = <2>; - gpio_panel_reset = <&gpio1 14 0>; /* RESET gpio-14 */ - gpio_bridge_reset = <&gpio1 23 0>; /* RESET gpio-23 */ - gpio_clk_en = <&gpio6 17 0>; /* RESET gpio-177 */ - /* declare it if ext_te enable */ - //gpio_te = <&gpio1 0 0>; /* EXT_TE gpio-0 */ - //pins = <0 1 2 3>; /* DSI Pin config */ - //esd_interval = <0>; /* ESD_INTERVAL */ - //pixel_clock = <4608>; /* kHZ = 320*240*60/1000*/ - /* 0: RGB888 - * 1: RGB666 - * 2: RGB666_PACKED - * 3: RGB565 - */ - //pixel_format = <1>; - //hs_clk = <90000000 150000000>; /* min max*/ - //lp_clk = <7000000 9000000>; /* min max*/ - }; - /* FIXME: this dummy regulator is only needed as a reference, but is enough to let devices reference something. The regulator_get will diff --git a/drivers/video/omap2/displays/panel-minnow.c b/drivers/video/omap2/displays/panel-minnow.c index 1ac9125034d..be78aea50b3 100644 --- a/drivers/video/omap2/displays/panel-minnow.c +++ b/drivers/video/omap2/displays/panel-minnow.c @@ -31,6 +31,7 @@ #include <linux/workqueue.h> #include <linux/slab.h> #include <linux/mutex.h> +#include <linux/regulator/consumer.h> #include <video/omapdss.h> #include <video/omap-panel-data.h> @@ -309,6 +310,8 @@ struct minnow_panel_data { int clk_en_gpio; struct minnow_panel_hw_reset hw_reset[MINNOW_RESET_MAX]; struct minnow_panel_hw_reset bridge_reset; + struct regulator *bridge_regulator; + struct regulator *panel_regulator; bool use_dsi_backlight; @@ -1192,6 +1195,9 @@ static int minnow_panel_dt_init(struct minnow_panel_data *mpd) return -ENODEV; } + /* Save the dt node entry to the device */ + mpd->dssdev->dev.of_node = dt_node; + if (of_property_read_u32(dt_node, "id_panel", &value) \ || (value >= MINNOW_PANEL_MAX)) { dev_err(&mpd->dssdev->dev, \ @@ -1400,6 +1406,18 @@ static int minnow_panel_probe(struct omap_dss_device *dssdev) dev_dbg(&dssdev->dev, "Using GPIO TE\n"); } + mpd->bridge_regulator = devm_regulator_get(&dssdev->dev, "bridge"); + if (IS_ERR(mpd->bridge_regulator)) { + mpd->bridge_regulator = NULL; + dev_info(&dssdev->dev, "Could not get bridge regulator\n"); + } + + mpd->panel_regulator = devm_regulator_get(&dssdev->dev, "panel"); + if (IS_ERR(mpd->panel_regulator)) { + mpd->panel_regulator = NULL; + dev_info(&dssdev->dev, "Could not get panel regulator\n"); + } + mpd->workqueue = create_singlethread_workqueue("minnow_panel_esd"); if (mpd->workqueue == NULL) { dev_err(&dssdev->dev, "can't create ESD workqueue\n"); @@ -1610,6 +1628,19 @@ static int minnow_panel_enable(struct omap_dss_device *dssdev) goto err; } + if (mpd->bridge_regulator) { + if (regulator_enable(mpd->bridge_regulator)) { + r = -ENODEV; + goto err; + } + } + if (mpd->panel_regulator) { + if (regulator_enable(mpd->panel_regulator)) { + r = -ENODEV; + goto err; + } + } + dsi_bus_lock(dssdev); r = minnow_panel_power_on(dssdev); @@ -1657,6 +1688,12 @@ static void minnow_panel_disable(struct omap_dss_device *dssdev) dssdev->state = OMAP_DSS_DISPLAY_DISABLED; + if (mpd->panel_regulator) + regulator_disable(mpd->panel_regulator); + + if (mpd->bridge_regulator) + regulator_disable(mpd->bridge_regulator); + mutex_unlock(&mpd->lock); } |