backlight/ld9040.c: regulator control in the lcd driver

leedonghwa dh09.lee at samsung.com
Fri Dec 2 02:45:50 EST 2011


This patch supports regulator power control in the driver.

Current ld9040 driver was controlled power on/off sequence by callback
function

in the board file. But, by doing this, there's no need to register lcd power

on/off callback function in the board file.

 

Signed-off-by: Donghwa Lee <dh09.lee at samsung.com>

Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>

Signed-off-by: Inki Dae <inki.dae at samsung.com>

---

 drivers/video/backlight/ld9040.c |   88
++++++++++++++++++++++++++++++++-----

 1 files changed, 76 insertions(+), 12 deletions(-)

 

diff --git a/drivers/video/backlight/ld9040.c
b/drivers/video/backlight/ld9040.c

index da9a5ce..9698f48 100644

--- a/drivers/video/backlight/ld9040.c

+++ b/drivers/video/backlight/ld9040.c

@@ -31,6 +31,7 @@

 #include <linux/lcd.h>

 #include <linux/backlight.h>

 #include <linux/module.h>

+#include <linux/regulator/consumer.h>

 

 #include "ld9040_gamma.h"

 

@@ -53,8 +54,60 @@ struct ld9040 {

          struct lcd_device            *ld;

          struct backlight_device               *bd;

          struct lcd_platform_data  *lcd_pd;

+

+         struct mutex                           lock;

+         struct regulator             *reg_vdd3;

+         struct regulator             *reg_vci;

+         bool  enabled;

 };

 

+static void ld9040_regulator_enable(struct ld9040 *lcd)

+{

+         int ret = 0;

+         struct lcd_platform_data *pd = NULL;

+

+         pd = lcd->lcd_pd;

+         mutex_lock(&lcd->lock);

+         if (!lcd->enabled) {

+                   if (lcd->reg_vdd3)

+                              ret = regulator_enable(lcd->reg_vdd3);

+                   if (ret)

+                              goto out;

+

+                   if (lcd->reg_vci)

+                              ret = regulator_enable(lcd->reg_vci);

+                   if (ret)

+                              goto out;

+

+                   lcd->enabled = true;

+         }

+         mdelay(pd->power_on_delay);

+out:

+         mutex_unlock(&lcd->lock);

+}

+

+static void ld9040_regulator_disable(struct ld9040 *lcd)

+{

+         int ret = 0;

+

+         mutex_lock(&lcd->lock);

+         if (lcd->enabled) {

+                   if (lcd->reg_vci)

+                              regulator_disable(lcd->reg_vci);

+                   if (ret)

+                              goto out;

+

+                   if (lcd->reg_vdd3)

+                              regulator_disable(lcd->reg_vdd3);

+                   if (ret)

+                              goto out;

+

+                   lcd->enabled = false;

+         }

+out:

+         mutex_unlock(&lcd->lock);

+}

+

 static const unsigned short seq_swreset[] = {

          0x01, COMMAND_ONLY,

          ENDDEF, 0x00

@@ -532,13 +585,8 @@ static int ld9040_power_on(struct ld9040 *lcd)

                     return -EFAULT;

          }

 

-          if (!pd->power_on) {

-                    dev_err(lcd->dev, "power_on is NULL.\n");

-                    return -EFAULT;

-          } else {

-                    pd->power_on(lcd->ld, 1);

-                    mdelay(pd->power_on_delay);

-          }

+         /* lcd power on */

+         ld9040_regulator_enable(lcd);

 

          if (!pd->reset) {

                     dev_err(lcd->dev, "reset is NULL.\n");

@@ -582,11 +630,8 @@ static int ld9040_power_off(struct ld9040 *lcd)

 

          mdelay(pd->power_off_delay);

 

-          if (!pd->power_on) {

-                    dev_err(lcd->dev, "power_on is NULL.\n");

-                    return -EFAULT;

-          } else

-                    pd->power_on(lcd->ld, 0);

+         /* lcd power off */

+         ld9040_regulator_disable(lcd);

 

          return 0;

 }

@@ -693,6 +738,20 @@ static int ld9040_probe(struct spi_device *spi)

                     goto out_free_lcd;

          }

 

+         mutex_init(&lcd->lock);

+

+         lcd->reg_vdd3 = regulator_get(lcd->dev, "vdd");

+         if (IS_ERR(lcd->reg_vdd3)) {

+                   dev_info(lcd->dev, "no %s regulator found\n", "vdd");

+                   lcd->reg_vdd3 = NULL;

+         }

+

+         lcd->reg_vci = regulator_get(lcd->dev, "vci");

+         if (IS_ERR(lcd->reg_vci)) {

+                   dev_info(lcd->dev, "no %s regulator found\n", "vci");

+                   lcd->reg_vci = NULL;

+         }

+

          ld = lcd_device_register("ld9040", &spi->dev, lcd,
&ld9040_lcd_ops);

          if (IS_ERR(ld)) {

                     ret = PTR_ERR(ld);

@@ -739,6 +798,9 @@ static int ld9040_probe(struct spi_device *spi)

 out_unregister_lcd:

          lcd_device_unregister(lcd->ld);

 out_free_lcd:

+         regulator_put(lcd->reg_vci);

+         regulator_put(lcd->reg_vdd3);

+

          kfree(lcd);

          return ret;

 }

@@ -750,6 +812,8 @@ static int __devexit ld9040_remove(struct spi_device
*spi)

          ld9040_power(lcd, FB_BLANK_POWERDOWN);

          backlight_device_unregister(lcd->bd);

          lcd_device_unregister(lcd->ld);

+         regulator_put(lcd->reg_vci);

+         regulator_put(lcd->reg_vdd3);

          kfree(lcd);

 

          return 0;

-- 

1.7.4.1

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20111202/5e869ca5/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-backlight-ld9040.c-regulator-control-in-the-driver.patch
Type: application/octet-stream
Size: 4063 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20111202/5e869ca5/attachment-0001.obj>


More information about the linux-arm-kernel mailing list