From: Thomas Abraham <hidden> Date: 2012-01-05 15:38:26
Add a lcd panel driver for simple raster-type lcd's which uses a gpio
controlled panel reset. The driver controls the nRESET line of the panel
using a gpio connected from the host system. The Vcc supply to the panel
is (optionally) controlled using a voltage regulator. This driver excludes
support for lcd panels that use a serial command interface or direct
memory mapped IO interface.
Suggested-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Thomas Abraham <redacted>
---
.../devicetree/bindings/lcd/lcd-pwrctrl.txt | 39 ++++
drivers/video/backlight/Kconfig | 7 +
drivers/video/backlight/Makefile | 1 +
drivers/video/backlight/lcd_pwrctrl.c | 231 ++++++++++++++++++++
include/video/lcd_pwrctrl.h | 30 +++
5 files changed, 308 insertions(+), 0 deletions(-)
create mode 100644 Documentation/devicetree/bindings/lcd/lcd-pwrctrl.txt
create mode 100644 drivers/video/backlight/lcd_pwrctrl.c
create mode 100644 include/video/lcd_pwrctrl.h
@@ -0,0 +1,39 @@+* Power controller for simple lcd panels++Some LCD panels provide a simple control interface for the host system. The+control mechanism would include a nRESET line connected to a gpio of the host+system and a Vcc supply line which the host can optionally be controlled using+a voltage regulator. Such simple panels do not support serial command+interface (such as i2c or spi) or memory-mapped-io interface.++Required properties:+- compatible: should be 'lcd,powerctrl'+- gpios: The GPIO number of the host system used to control the nRESET line.+ The format of the gpio specifier depends on the gpio controller of the+ host system.++Optional properties:+- lcd,pwrctrl-nreset-gpio-invert: When the nRESET line is asserted low, the+ lcd panel is reset and stays in reset mode as long as the nRESET line is+ asserted low. This is the default behaviour of most lcd panels. If a lcd+ panel requires the nRESET line to be asserted high for panel reset, then+ this property is used.+- lcd,pwrctrl-min-uV: If a regulator controls the Vcc voltage of the lcd panel,+ this property specifies the minimum voltage the regulator should supply.+ The value of this property should in in micro-volts.+- lcd,pwrctrl-max-uV: If a regulator controls the Vcc voltage of the lcd panel,+ this property specifies the maximum voltage the regulator should limit to+ on the Vcc line. The value of this property should in in micro-volts.+- vcc-lcd-supply: phandle of the regulator that controls the vcc supply to+ the lcd panel.++Example:++ lcd_pwrctrl {+ compatible = "lcd,powerctrl";+ gpios = <&gpe0 4 1 0 0>;+ lcd,pwrctrl-nreset-gpio-invert;+ lcd,pwrctrl-min-uV = <2500000>;+ lcd,pwrctrl-max-uV = <3300000>;+ lcd-vcc-supply - <®ulator7>;+ };
@@ -0,0 +1,231 @@+/*+*Simplelcdpanelpowercontroldriver.+*+*Copyright(c)2011-2012SamsungElectronicsCo.,Ltd.+*Copyright(c)2011-2012LinaroLtd.+*+*Thisdriverisforcontrollingpowerforrastertypelcdpanelsthatrequires+*itsnRESETinterfacelinetobeconnectedandcontrolledbyaGPIOofthe+*hostsystemandtheVcclinecontrolledbyavoltageregulator.This+*excludessupportforlcdpanelsthatuseaserialcommandinterfaceordirect+*memorymappedIOinterface.+*+*ThenRESETinterfacelineofthepanelshouldbeconnectedtoagpioofthe+*hostsystem.TheVccpiniscontrolledusingaexternalvolatageregulator.+*Panelbacklightisnotcontrolledbythisdriver.+*+*Thisdriverisderivedfromplatform-lcd.cwhichwaswrittenby+*BenDooks<ben@simtec.co.uk>+*+*Thisprogramisfreesoftware;youcanredistributeitand/ormodify+*itunderthetermsoftheGNUGeneralPublicLicenseversion2as+*publishedbytheFreeSoftwareFoundation.+*+*/++#include<linux/module.h>+#include<linux/platform_device.h>+#include<linux/fb.h>+#include<linux/lcd.h>+#include<linux/gpio.h>+#include<linux/of.h>+#include<linux/of_gpio.h>+#include<linux/regulator/consumer.h>+#include<video/lcd_pwrctrl.h>++structlcd_pwrctrl{+structdevice*dev;+structlcd_device*lcd;+structlcd_pwrctrl_data*pdata;+structregulator*regulator;+unsignedintpower;+unsignedintsuspended:1;+};++staticintlcd_pwrctrl_get_power(structlcd_device*lcd)+{+structlcd_pwrctrl*lp=lcd_get_data(lcd);+returnlp->power;+}++staticintlcd_pwrctrl_set_power(structlcd_device*lcd,intpower)+{+structlcd_pwrctrl*lp=lcd_get_data(lcd);+structlcd_pwrctrl_data*pd=lp->pdata;+intlcd_enable,lcd_reset;++lcd_enable=(power==FB_BLANK_POWERDOWN||lp->suspended)?0:1;+lcd_reset=(pd->invert)?!lcd_enable:lcd_enable;++if(IS_ERR(lp->regulator))+gotono_regulator;++if(lcd_enable){+if((pd->min_uV||pd->max_uV)&&+regulator_set_voltage(lp->regulator,+pd->min_uV,pd->max_uV))+dev_info(lp->dev,+"regulator voltage set failed\n");+if(regulator_enable(lp->regulator))+dev_info(lp->dev,"failed to enable regulator\n");+}else{+regulator_disable(lp->regulator);+}++no_regulator:+gpio_direction_output(lp->pdata->gpio,lcd_reset);+lp->power=power;+return0;+}++staticintlcd_pwrctrl_check_fb(structlcd_device*lcd,structfb_info*info)+{+structlcd_pwrctrl*lp=lcd_get_data(lcd);+returnlp->dev->parent==info->device;+}++staticstructlcd_opslcd_pwrctrl_ops={+.get_power=lcd_pwrctrl_get_power,+.set_power=lcd_pwrctrl_set_power,+.check_fb=lcd_pwrctrl_check_fb,+};++#ifdef CONFIG_OF+staticvoid__devinitlcd_pwrctrl_parse_dt(structdevice*dev,+structlcd_pwrctrl_data*pdata)+{+structdevice_node*np=dev->of_node;++pdata->gpio=of_get_gpio(np,0);+if(of_get_property(np,"lcd,pwrctrl-nreset-gpio-invert",NULL))+pdata->invert=true;+of_property_read_u32(np,"lcd,pwrctrl-min-uV",&pdata->min_uV);+of_property_read_u32(np,"lcd,pwrctrl-max-uV",&pdata->max_uV);+}+#endif++staticint__devinitlcd_pwrctrl_probe(structplatform_device*pdev)+{+structlcd_pwrctrl*lp;+structlcd_pwrctrl_data*pdata=pdev->dev.platform_data;+structdevice*dev=&pdev->dev;+interr;++#ifdef CONFIG_OF+if(dev->of_node){+pdata=devm_kzalloc(dev,sizeof(*pdata),GFP_KERNEL);+if(!pdata){+dev_err(dev,"memory allocation for pdata failed\n");+return-ENOMEM;+}+lcd_pwrctrl_parse_dt(dev,pdata);+}+#endif++if(!pdata){+dev_err(dev,"platform data not available\n");+return-EINVAL;+}++err=gpio_request(pdata->gpio,"LCD-nRESET");+if(err){+dev_err(dev,"gpio [%d] request failed\n",pdata->gpio);+returnerr;+}++lp=devm_kzalloc(dev,sizeof(structlcd_pwrctrl),GFP_KERNEL);+if(!lp){+dev_err(dev,"memory allocation failed for private data\n");+return-ENOMEM;+}++/*+*Ifpowertolcdand/orlcdinterfaceiscontrolledusingaregulator,+*getthehandletotheregulatorforlateruseduringpowerswitching.+*/+lp->regulator=regulator_get(dev,"vcc-lcd");+if(IS_ERR(lp->regulator))+dev_info(dev,"could not find regulator\n");++lp->dev=dev;+lp->pdata=pdata;+lp->lcd=lcd_device_register(dev_name(dev),dev,lp,&lcd_pwrctrl_ops);+if(IS_ERR(lp->lcd)){+dev_err(dev,"cannot register lcd device\n");+regulator_put(lp->regulator);+returnPTR_ERR(lp->lcd);+}++platform_set_drvdata(pdev,lp);+lcd_pwrctrl_set_power(lp->lcd,FB_BLANK_NORMAL);+return0;+}++staticint__devexitlcd_pwrctrl_remove(structplatform_device*pdev)+{+structlcd_pwrctrl*lp=platform_get_drvdata(pdev);+lcd_device_unregister(lp->lcd);+gpio_free(lp->pdata->gpio);+if(!IS_ERR(lp->regulator))+regulator_put(lp->regulator);+return0;+}++#ifdef CONFIG_PM+staticintlcd_pwrctrl_suspend(structplatform_device*pdev,pm_message_tst)+{+structlcd_pwrctrl*lp=platform_get_drvdata(pdev);++lp->suspended=1;+lcd_pwrctrl_set_power(lp->lcd,FB_BLANK_POWERDOWN);+return0;+}++staticintlcd_pwrctrl_resume(structplatform_device*pdev)+{+structlcd_pwrctrl*lp=platform_get_drvdata(pdev);++lp->suspended=0;+lcd_pwrctrl_set_power(lp->lcd,FB_BLANK_UNBLANK);+return0;+}+#else+#define lcd_pwrctrl_suspend NULL+#define lcd_pwrctrl_resume NULL+#endif /* CONFIG_PM */++#ifdef CONFIG_OF+staticconststructof_device_idlcd_pwrctrl_match[]={+{.compatible="lcd,powerctrl",},+{},+};+#endif++staticstructplatform_driverlcd_pwrctrl_driver={+.driver={+.name="lcd-pwrctrl",+.owner=THIS_MODULE,+.of_match_table=of_match_ptr(lcd_pwrctrl_match),+},+.probe=lcd_pwrctrl_probe,+.remove=lcd_pwrctrl_remove,+.suspend=lcd_pwrctrl_suspend,+.resume=lcd_pwrctrl_resume,+};++staticint__initlcd_pwrctrl_init(void)+{+returnplatform_driver_register(&lcd_pwrctrl_driver);+}++staticvoid__exitlcd_pwrctrl_cleanup(void)+{+platform_driver_unregister(&lcd_pwrctrl_driver);+}++module_init(lcd_pwrctrl_init);+module_exit(lcd_pwrctrl_cleanup);++MODULE_AUTHOR("Thomas Abraham <thomas.ab@samsung.com>");+MODULE_LICENSE("GPL v2");+MODULE_ALIAS("platform:lcd-pwrctrl");
@@ -0,0 +1,39 @@+* Power controller for simple lcd panels++Some LCD panels provide a simple control interface for the host system. The+control mechanism would include a nRESET line connected to a gpio of the host+system and a Vcc supply line which the host can optionally be controlled using+a voltage regulator. Such simple panels do not support serial command+interface (such as i2c or spi) or memory-mapped-io interface.++Required properties:+- compatible: should be 'lcd,powerctrl'+- gpios: The GPIO number of the host system used to control the nRESET line.+ The format of the gpio specifier depends on the gpio controller of the+ host system.++Optional properties:+- lcd,pwrctrl-nreset-gpio-invert: When the nRESET line is asserted low, the+ lcd panel is reset and stays in reset mode as long as the nRESET line is+ asserted low. This is the default behaviour of most lcd panels. If a lcd+ panel requires the nRESET line to be asserted high for panel reset, then+ this property is used.
Maybe use OF_GPIO_ACTIVE_LOW here instead. That would make active high the
default but be a bit more consistent.
+- lcd,pwrctrl-min-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ this property specifies the minimum voltage the regulator should supply.
+ The value of this property should in in micro-volts.
+- lcd,pwrctrl-max-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ this property specifies the maximum voltage the regulator should limit to
+ on the Vcc line. The value of this property should in in micro-volts.
The min and max voltage should rather be specified through the regulator
constraints.
+- vcc-lcd-supply: phandle of the regulator that controls the vcc supply to
+ the lcd panel.
+
+ }
+
+ /*
+ * If power to lcd and/or lcd interface is controlled using a regulator,
+ * get the handle to the regulator for later use during power switching.
+ */
+ lp->regulator = regulator_get(dev, "vcc-lcd");
+ if (IS_ERR(lp->regulator))
+ dev_info(dev, "could not find regulator\n");
+
+ lp->dev = dev;
+ lp->pdata = pdata;
+ lp->lcd = lcd_device_register(dev_name(dev), dev, lp, &lcd_pwrctrl_ops);
+ if (IS_ERR(lp->lcd)) {
+ dev_err(dev, "cannot register lcd device\n");
+ regulator_put(lp->regulator);
From: Jingoo Han <hidden> Date: 2012-01-06 02:16:10
Hi, Thomas.
quoted hunk
-----Original Message-----
From: Thomas Abraham [mailto:thomas.abraham at linaro.org]
Sent: Friday, January 06, 2012 12:42 AM
Subject: [PATCH] backlight: lcd: add driver for raster-type lcd's with gpio controlled panel reset
Add a lcd panel driver for simple raster-type lcd's which uses a gpio
controlled panel reset. The driver controls the nRESET line of the panel
using a gpio connected from the host system. The Vcc supply to the panel
is (optionally) controlled using a voltage regulator. This driver excludes
support for lcd panels that use a serial command interface or direct
memory mapped IO interface.
Suggested-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Thomas Abraham <redacted>
---
.../devicetree/bindings/lcd/lcd-pwrctrl.txt | 39 ++++
drivers/video/backlight/Kconfig | 7 +
drivers/video/backlight/Makefile | 1 +
drivers/video/backlight/lcd_pwrctrl.c | 231 ++++++++++++++++++++
include/video/lcd_pwrctrl.h | 30 +++
5 files changed, 308 insertions(+), 0 deletions(-)
create mode 100644 Documentation/devicetree/bindings/lcd/lcd-pwrctrl.txt
create mode 100644 drivers/video/backlight/lcd_pwrctrl.c
create mode 100644 include/video/lcd_pwrctrl.h
[...]
From: Olof Johansson <hidden> Date: 2012-01-06 06:47:01
Hi,
This looks much better than the previous approach. Some comments on
the binding below.
On Thu, Jan 5, 2012 at 7:42 AM, Thomas Abraham
[off-list ref] wrote:
@@ -0,0 +1,39 @@+* Power controller for simple lcd panels++Some LCD panels provide a simple control interface for the host system. The+control mechanism would include a nRESET line connected to a gpio of the host+system and a Vcc supply line which the host can optionally be controlled using+a voltage regulator. Such simple panels do not support serial command+interface (such as i2c or spi) or memory-mapped-io interface.++Required properties:+- compatible: should be 'lcd,powerctrl'
The convention for names is "vendor,product", so it would be better to
name this something like "lcd-powercontrol"
+- gpios: The GPIO number of the host system used to control the nRESET line.
+ ?The format of the gpio specifier depends on the gpio controller of the
+ ?host system.
+
+Optional properties:
+- lcd,pwrctrl-nreset-gpio-invert: When the nRESET line is asserted low, the
+ ?lcd panel is reset and stays in reset mode as long as the nRESET line is
+ ?asserted low. This is the default behaviour of most lcd panels. If a lcd
+ ?panel requires the nRESET line to be asserted high for panel reset, then
+ ?this property is used.
+- lcd,pwrctrl-min-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ ?this property specifies the minimum voltage the regulator should supply.
+ ?The value of this property should in in micro-volts.
+- lcd,pwrctrl-max-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ ?this property specifies the maximum voltage the regulator should limit to
+ ?on the Vcc line. The value of this property should in in micro-volts.
+- vcc-lcd-supply: phandle of the regulator that controls the vcc supply to
+ ?the lcd panel.
The above names are somewhat inconsistent. Why abbreviate powercontrol
in different ways between compatible and properties, for example.
Also, since there's no vendor to prefix with, it might just be easier
to avoid the prefix alltogether, or use a <word>-<property> prefix
instead, such as:
lcd-reset-gpios
lcd-reset-active-low (some platforms can specify polarity in the
gpio specifier, so I'm not sure if this is needed?
lcd-power-min-uV
lcd-power-max-uV
lcd-power-supply
The usual way of handling this is by checking if pdata is NULL, and if
so, call lcd_pwrctrl_fill_pdata() that returns an allocated pdata
structure (and check pdata for NULL again). That can also be done by
doing a stub that returns NULL and not use ifdef in the C code.
[...]
From: Mark Brown <hidden> Date: 2012-01-06 06:49:42
On Thu, Jan 05, 2012 at 08:07:53PM +0100, Lars-Peter Clausen wrote:
quoted
+- lcd,pwrctrl-min-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ this property specifies the minimum voltage the regulator should supply.
+ The value of this property should in in micro-volts.
+- lcd,pwrctrl-max-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ this property specifies the maximum voltage the regulator should limit to
+ on the Vcc line. The value of this property should in in micro-volts.
The min and max voltage should rather be specified through the regulator
constraints.
In principle it should be specified in both places to account for shared
supplies though for all practical purposes for an LCD panel I can't see
multiple users sharing the same regulator and varying the voltage at
runtime.
quoted
+ if (lcd_enable) {
+ if ((pd->min_uV || pd->max_uV) &&
+ regulator_set_voltage(lp->regulator,
+ pd->min_uV, pd->max_uV))
+ dev_info(lp->dev,
+ "regulator voltage set failed\n");
+ if (regulator_enable(lp->regulator))
+ dev_info(lp->dev, "failed to enable regulator\n");
+ } else {
+ regulator_disable(lp->regulator);
+ }
I think you have to make sure that the regulator enable and disable calls are
balanced.
Yes.
quoted
+#ifdef CONFIG_OF
I think you can remove all the CONFIG_OF ifdefs, the of API should stub itself out.
It's reasonably idiomatic to do this if the parsing code is in a
separate function.
+Optional properties:
+- lcd,pwrctrl-nreset-gpio-invert: When the nRESET line is asserted low, the
+ ?lcd panel is reset and stays in reset mode as long as the nRESET line is
+ ?asserted low. This is the default behaviour of most lcd panels. If a lcd
+ ?panel requires the nRESET line to be asserted high for panel reset, then
+ ?this property is used.
Maybe use OF_GPIO_ACTIVE_LOW here instead. That would make active high the
default but be a bit more consistent.
Thanks for pointing this out. But most of these panels have active low
RESET line. So OF_GPIO_ACTIVE_LOW will need to be added for every lcd
node in dts file. How about adding a new 'OF_GPIO_ACTIVE_HIGH' instead
and keeping active-low the default?
quoted
+- lcd,pwrctrl-min-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ ?this property specifies the minimum voltage the regulator should supply.
+ ?The value of this property should in in micro-volts.
+- lcd,pwrctrl-max-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ ?this property specifies the maximum voltage the regulator should limit to
+ ?on the Vcc line. The value of this property should in in micro-volts.
The min and max voltage should rather be specified through the regulator
constraints.
The min and max voltage is a panel specific property which is used to
configure the regulator. The regulator might be capable of a larger
range but these value is used to setup the regulator to output a
voltage suitable for the panel.
quoted
+- vcc-lcd-supply: phandle of the regulator that controls the vcc supply to
+ ?the lcd panel.
+
From: Thomas Abraham <hidden> Date: 2012-01-07 10:59:38
Hi Olof,
On 6 January 2012 12:16, Olof Johansson [off-list ref] wrote:
Hi,
This looks much better than the previous approach. Some comments on
the binding below.
On Thu, Jan 5, 2012 at 7:42 AM, Thomas Abraham
[off-list ref] wrote:
@@ -0,0 +1,39 @@+* Power controller for simple lcd panels++Some LCD panels provide a simple control interface for the host system. The+control mechanism would include a nRESET line connected to a gpio of the host+system and a Vcc supply line which the host can optionally be controlled using+a voltage regulator. Such simple panels do not support serial command+interface (such as i2c or spi) or memory-mapped-io interface.++Required properties:+- compatible: should be 'lcd,powerctrl'
The convention for names is "vendor,product", so it would be better to
name this something like "lcd-powercontrol"
Ok. I will change this.
quoted
+- gpios: The GPIO number of the host system used to control the nRESET line.
+ ?The format of the gpio specifier depends on the gpio controller of the
+ ?host system.
+
+Optional properties:
+- lcd,pwrctrl-nreset-gpio-invert: When the nRESET line is asserted low, the
+ ?lcd panel is reset and stays in reset mode as long as the nRESET line is
+ ?asserted low. This is the default behaviour of most lcd panels. If a lcd
+ ?panel requires the nRESET line to be asserted high for panel reset, then
+ ?this property is used.
+- lcd,pwrctrl-min-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ ?this property specifies the minimum voltage the regulator should supply.
+ ?The value of this property should in in micro-volts.
+- lcd,pwrctrl-max-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ ?this property specifies the maximum voltage the regulator should limit to
+ ?on the Vcc line. The value of this property should in in micro-volts.
+- vcc-lcd-supply: phandle of the regulator that controls the vcc supply to
+ ?the lcd panel.
The above names are somewhat inconsistent. Why abbreviate powercontrol
in different ways between compatible and properties, for example.
Also, since there's no vendor to prefix with, it might just be easier
to avoid the prefix alltogether, or use a <word>-<property> prefix
instead, such as:
lcd-reset-gpios
lcd-reset-active-low ? (some platforms can specify polarity in the
gpio specifier, so I'm not sure if this is needed?
lcd-power-min-uV
lcd-power-max-uV
lcd-power-supply
The usual way of handling this is by checking if pdata is NULL, and if
so, call lcd_pwrctrl_fill_pdata() that returns an allocated pdata
structure (and check pdata for NULL again). That can also be done by
doing a stub that returns NULL and not use ifdef in the C code.
Ok. In case of kernel image that has support for both dt and non-dt
platforms, the check of pdata == NULL would not be a sufficient
condition to start parsing dt. So the dev->of_node is checked. The
#ifdef is used here to keep this portion of code out if kernel is
compiled only for non-dt platforms.
If this is a pure open firmware driver, then there is no need to
export this, you can just keep it internal to the C file.
This driver does support non-dt platforms as well and platform code
can supply the platform data using this structure.
Thanks Olof for your review.
Regards,
Thomas.
From: Thomas Abraham <hidden> Date: 2012-01-07 11:04:37
Hi Mark,
On 6 January 2012 12:19, Mark Brown [off-list ref] wrote:
On Thu, Jan 05, 2012 at 08:07:53PM +0100, Lars-Peter Clausen wrote:
quoted
quoted
+- lcd,pwrctrl-min-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ ?this property specifies the minimum voltage the regulator should supply.
+ ?The value of this property should in in micro-volts.
+- lcd,pwrctrl-max-uV: If a regulator controls the Vcc voltage of the lcd panel,
+ ?this property specifies the maximum voltage the regulator should limit to
+ ?on the Vcc line. The value of this property should in in micro-volts.
quoted
The min and max voltage should rather be specified through the regulator
constraints.
In principle it should be specified in both places to account for shared
supplies though for all practical purposes for an LCD panel I can't see
multiple users sharing the same regulator and varying the voltage at
runtime.
It is assumed here that the boot loader as not set the output voltage
of the regulator that supports variable voltage ranges. So these
values help in setting up the regulator for LCD display.
From: Mark Brown <hidden> Date: 2012-01-07 17:28:31
On Sat, Jan 07, 2012 at 04:34:34PM +0530, Thomas Abraham wrote:
On 6 January 2012 12:19, Mark Brown [off-list ref] wrote:
quoted
In principle it should be specified in both places to account for shared
supplies though for all practical purposes for an LCD panel I can't see
multiple users sharing the same regulator and varying the voltage at
runtime.
It is assumed here that the boot loader as not set the output voltage
of the regulator that supports variable voltage ranges. So these
values help in setting up the regulator for LCD display.
Remember that the regulator API won't allow consumers to configure
voltages unless there are constraints granting permission. Users will
need to set both the LCD vales and the regulator constraints values to
actually allow configuration to happen.
From: Russell King - ARM Linux <hidden> Date: 2012-01-07 18:23:35
On Thu, Jan 05, 2012 at 09:12:26PM +0530, Thomas Abraham wrote:
Add a lcd panel driver for simple raster-type lcd's which uses a gpio
controlled panel reset. The driver controls the nRESET line of the panel
using a gpio connected from the host system. The Vcc supply to the panel
is (optionally) controlled using a voltage regulator. This driver excludes
support for lcd panels that use a serial command interface or direct
memory mapped IO interface.
I'm trying to work out what kind of LCD panel this is for. I assume
not the panels which would be connected to a SoC, which have a parallel
interface to a frame buffer device (LCD controller)?
If this is for these kinds of LCD panels, how are you handling the
timing required for active panels - some of which must not be powered
up without the LCD controller first being setup and enabled, and must
be powered down before the LCD controller is disabled.
I've seen this requirement with panels connected to ARM Ltd's development
boards, and also some SoCs.
On 01/07/2012 07:23 PM, Russell King - ARM Linux wrote:
On Thu, Jan 05, 2012 at 09:12:26PM +0530, Thomas Abraham wrote:
quoted
Add a lcd panel driver for simple raster-type lcd's which uses a gpio
controlled panel reset. The driver controls the nRESET line of the panel
using a gpio connected from the host system. The Vcc supply to the panel
is (optionally) controlled using a voltage regulator. This driver excludes
support for lcd panels that use a serial command interface or direct
memory mapped IO interface.
I'm trying to work out what kind of LCD panel this is for. I assume
not the panels which would be connected to a SoC, which have a parallel
interface to a frame buffer device (LCD controller)?
If this is for these kinds of LCD panels, how are you handling the
timing required for active panels - some of which must not be powered
up without the LCD controller first being setup and enabled, and must
be powered down before the LCD controller is disabled.
I've seen this requirement with panels connected to ARM Ltd's development
boards, and also some SoCs.
From: Thomas Abraham <hidden> Date: 2012-01-11 10:52:00
Hi Mark,
On 7 January 2012 22:58, Mark Brown [off-list ref] wrote:
On Sat, Jan 07, 2012 at 04:34:34PM +0530, Thomas Abraham wrote:
quoted
On 6 January 2012 12:19, Mark Brown [off-list ref] wrote:
quoted
+ if (lcd_enable) {
+ if ((pd->min_uV || pd->max_uV) &&
+ regulator_set_voltage(lp->regulator,
+ pd->min_uV, pd->max_uV))
+ dev_info(lp->dev,
+ "regulator voltage set failed\n");
+ if (regulator_enable(lp->regulator))
+ dev_info(lp->dev, "failed to enable regulator\n");
+ } else {
+ regulator_disable(lp->regulator);
+ }
quoted
quoted
In principle it should be specified in both places to account for shared
supplies though for all practical purposes for an LCD panel I can't see
multiple users sharing the same regulator and varying the voltage at
runtime.
quoted
It is assumed here that the boot loader as not set the output voltage
of the regulator that supports variable voltage ranges. So these
values help in setting up the regulator for LCD display.
Remember that the regulator API won't allow consumers to configure
voltages unless there are constraints granting permission. ?Users will
need to set both the LCD vales and the regulator constraints values to
actually allow configuration to happen.
In the case of Exynos4 based Origen board, buck7 of max8997 supplies
power to the lcd panel. buck7 is capable of supplying power at
different voltage levels but for Origen board, it is required to
supply only 3.3V. The constraints for buck7 can specify 'apply_uV' and
this will ensure that buck7 is configured to supply 3.3V.
But 'apply_uV' seems to be not ideal for regulators that supply power
to lcd panels. It would be better to power lcd panels only when video
data has to be displayed.
If 'apply_uV' is not used, then regulator_enable() does not set the
correct output voltage. So regulator_set_voltage() call is required.
If the regulator does not support multiple voltage ranges, then in the
above code min_uV and max_uV should be zero which then bypasses
regulator_set_voltage().
Hence, the call to regulator_set_voltage() is required in the above
code fragment.
Thanks,
Thomas.
From: Thomas Abraham <hidden> Date: 2012-01-11 10:58:55
Hi Russell,
On 7 January 2012 23:53, Russell King - ARM Linux
[off-list ref] wrote:
On Thu, Jan 05, 2012 at 09:12:26PM +0530, Thomas Abraham wrote:
quoted
Add a lcd panel driver for simple raster-type lcd's which uses a gpio
controlled panel reset. The driver controls the nRESET line of the panel
using a gpio connected from the host system. The Vcc supply to the panel
is (optionally) controlled using a voltage regulator. This driver excludes
support for lcd panels that use a serial command interface or direct
memory mapped IO interface.
I'm trying to work out what kind of LCD panel this is for. ?I assume
not the panels which would be connected to a SoC, which have a parallel
interface to a frame buffer device (LCD controller)?
If this is for these kinds of LCD panels, how are you handling the
timing required for active panels - some of which must not be powered
up without the LCD controller first being setup and enabled, and must
be powered down before the LCD controller is disabled.
I've seen this requirement with panels connected to ARM Ltd's development
boards, and also some SoCs.
This patch is for passive panels that use a nRESET line controlled by
a SoC GPIO and the panel do not use serial command interface (i2c or
spi) or memory-mapped-io for panel control. Panels that just need a
nRESET to be controlled can be handled by this driver.
Thanks,
Thomas.
From: Mark Brown <hidden> Date: 2012-01-11 17:45:45
On Wed, Jan 11, 2012 at 04:21:57PM +0530, Thomas Abraham wrote:
In the case of Exynos4 based Origen board, buck7 of max8997 supplies
power to the lcd panel. buck7 is capable of supplying power at
different voltage levels but for Origen board, it is required to
supply only 3.3V. The constraints for buck7 can specify 'apply_uV' and
this will ensure that buck7 is configured to supply 3.3V.
But 'apply_uV' seems to be not ideal for regulators that supply power
to lcd panels. It would be better to power lcd panels only when video
data has to be displayed.
What makes you say this? Enabling and disabling a regulator are
entirely orthogonal to setting the regulator voltage.
From: Thomas Abraham <hidden> Date: 2012-01-12 01:34:37
On 11 January 2012 23:15, Mark Brown
[off-list ref] wrote:
On Wed, Jan 11, 2012 at 04:21:57PM +0530, Thomas Abraham wrote:
quoted
In the case of Exynos4 based Origen board, buck7 of max8997 supplies
power to the lcd panel. buck7 is capable of supplying power at
different voltage levels but for Origen board, it is required to
supply only 3.3V. The constraints for buck7 can specify 'apply_uV' and
this will ensure that buck7 is configured to supply 3.3V.
quoted
But 'apply_uV' seems to be not ideal for regulators that supply power
to lcd panels. It would be better to power lcd panels only when video
data has to be displayed.
What makes you say this? ?Enabling and disabling a regulator are
entirely orthogonal to setting the regulator voltage.
Sorry, I got this wrong. I will remove the regulator_set_voltage()
call from the driver.
Thanks,
Thomas.