From 7f668cf0ba4e0ec9d2da6b1675e121d3ed927026 Mon Sep 17 00:00:00 2001 From: Shreshtha Kumar Sahu Date: Fri, 29 Apr 2011 20:04:47 +0530 Subject: u5500: leds: add regulator to lm3530 backlight driver add regulator ("vin") support to lm3530 backlight driver Change-Id: Ib594117271b4e01fdd232d19aad8e031a1177012 Signed-off-by: Shreshtha Kumar Sahu Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/21967 Reviewed-by: QATEST Reviewed-by: Jonas ABERG --- drivers/leds/leds-lm3530.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/leds/leds-lm3530.c b/drivers/leds/leds-lm3530.c index e7089a1f6cb..01ba7395cd1 100644 --- a/drivers/leds/leds-lm3530.c +++ b/drivers/leds/leds-lm3530.c @@ -17,6 +17,7 @@ #include #include #include +#include #define LM3530_LED_DEV "lcd-backlight" #define LM3530_NAME "lm3530-led" @@ -96,12 +97,16 @@ static struct lm3530_mode_map mode_map[] = { * @client: i2c client * @pdata: LM3530 platform data * @mode: mode of operation - manual, ALS, PWM + * @regulator: regulator + * @enable: regulator is enabled */ struct lm3530_data { struct led_classdev led_dev; struct i2c_client *client; struct lm3530_platform_data *pdata; enum lm3530_mode mode; + struct regulator *regulator; + bool enable; }; static const u8 lm3530_reg[LM3530_REG_MAX] = { @@ -210,12 +215,36 @@ static void lm3530_brightness_set(struct led_classdev *led_cdev, switch (drvdata->mode) { case LM3530_BL_MODE_MANUAL: + if (!drvdata->enable) { + err = regulator_enable(drvdata->regulator); + if (err) { + dev_err(&drvdata->client->dev, + "Unable to enable regulator\n"); + break; + } + drvdata->enable = true; + lm3530_init_registers(drvdata); + if (err) { + dev_err(&drvdata->client->dev, + "Register Init failed: %d\n", err); + break; + } + } + /* set the brightness in brightness control register*/ err = i2c_smbus_write_byte_data(drvdata->client, LM3530_BRT_CTRL_REG, brt_val / 2); if (err) dev_err(&drvdata->client->dev, "Unable to set brightness: %d\n", err); + + if (brt_val == 0 && drvdata->enable) { + err = regulator_disable(drvdata->regulator); + if (err) + dev_err(&drvdata->client->dev, + "Unable to disable regulator\n"); + drvdata->enable = false; + } break; case LM3530_BL_MODE_ALS: break; @@ -297,11 +326,20 @@ static int __devinit lm3530_probe(struct i2c_client *client, drvdata->mode = pdata->mode; drvdata->client = client; drvdata->pdata = pdata; + drvdata->enable = false; drvdata->led_dev.name = LM3530_LED_DEV; drvdata->led_dev.brightness_set = lm3530_brightness_set; i2c_set_clientdata(client, drvdata); + drvdata->regulator = regulator_get(&client->dev, "vin"); + if (IS_ERR(drvdata->regulator)) { + dev_err(&client->dev, "regulator get failed\n"); + err = PTR_ERR(drvdata->regulator); + drvdata->regulator = NULL; + goto err_regulator_get; + } + err = lm3530_init_registers(drvdata); if (err < 0) { dev_err(&client->dev, "Register Init failed: %d\n", err); @@ -327,6 +365,8 @@ static int __devinit lm3530_probe(struct i2c_client *client, return 0; err_create_file: + regulator_put(drvdata->regulator); +err_regulator_get: led_classdev_unregister(&drvdata->led_dev); err_class_register: err_reg_init: @@ -340,6 +380,10 @@ static int __devexit lm3530_remove(struct i2c_client *client) struct lm3530_data *drvdata = i2c_get_clientdata(client); device_remove_file(drvdata->led_dev.dev, &dev_attr_mode); + + if (drvdata->enable) + regulator_disable(drvdata->regulator); + regulator_put(drvdata->regulator); led_classdev_unregister(&drvdata->led_dev); kfree(drvdata); return 0; -- cgit v1.2.3