The power source to the lcd panel or the lcd interface such as lvds transmitters could be controlled by a regulator supply. Add support for enabling/disabling the regulator when switching power to lcd. Two new elements 'min_uV' and 'max_uV' in the platform data are added to allow platform code to specifiy the desired output voltage from the regulator. Cc: Ben Dooks <ben-linux@xxxxxxxxx> Signed-off-by: Thomas Abraham <thomas.abraham@xxxxxxxxxx> --- drivers/video/backlight/platform_lcd.c | 29 +++++++++++++++++++++++++++++ include/video/platform_lcd.h | 7 +++++++ 2 files changed, 36 insertions(+), 0 deletions(-) diff --git a/drivers/video/backlight/platform_lcd.c b/drivers/video/backlight/platform_lcd.c index 302330a..ffa8108 100644 --- a/drivers/video/backlight/platform_lcd.c +++ b/drivers/video/backlight/platform_lcd.c @@ -17,6 +17,8 @@ #include <linux/backlight.h> #include <linux/lcd.h> #include <linux/slab.h> +#include <linux/regulator/consumer.h> +#include <linux/regulator/machine.h> #include <video/platform_lcd.h> @@ -44,11 +46,38 @@ static int platform_lcd_get_power(struct lcd_device *lcd) static int platform_lcd_set_power(struct lcd_device *lcd, int power) { struct platform_lcd *plcd = to_our_lcd(lcd); + struct regulator *lcd_regulator; int lcd_power = 1; if (power == FB_BLANK_POWERDOWN || plcd->suspended) lcd_power = 0; + /* + * If power to lcd and/or lcd interface is controlled using a regulator, + * enable or disable the regulator based in the power setting. + */ + lcd_regulator = regulator_get(plcd->us, "vcc_lcd"); + if (IS_ERR(lcd_regulator)) { + dev_info(plcd->us, "could not get regulator\n"); + goto set_power; + } + + if (lcd_power) { + if (plcd->pdata->min_uV || plcd->pdata->max_uV) + if (regulator_set_voltage(lcd_regulator, + plcd->pdata->min_uV, plcd->pdata->max_uV)) + dev_info(plcd->us, + "regulator voltage set failed\n"); + + if (regulator_enable(lcd_regulator)) + dev_info(plcd->us, "failed to enable regulator\n"); + } else { + regulator_disable(lcd_regulator); + } + + regulator_put(lcd_regulator); + +set_power: plcd->pdata->set_power(plcd->pdata, lcd_power); plcd->power = power; diff --git a/include/video/platform_lcd.h b/include/video/platform_lcd.h index ad3bdfe..acd5d21 100644 --- a/include/video/platform_lcd.h +++ b/include/video/platform_lcd.h @@ -14,8 +14,15 @@ struct plat_lcd_data; struct fb_info; +/** + * struct plat_lcd_data - platform data for platform_lcd driver. + * @min_uV: Minimum required voltage output from the regulator. + * @max_uV: Maximum acceptable voltage output from the regulator. + */ struct plat_lcd_data { void (*set_power)(struct plat_lcd_data *, unsigned int power); int (*match_fb)(struct plat_lcd_data *, struct fb_info *); + int min_uV; + int max_uV; }; -- 1.6.6.rc2 -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html