<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:"Malgun Gothic";
        panose-1:2 11 5 3 2 0 0 2 0 4;}
@font-face
        {font-family:"Malgun Gothic";
        panose-1:2 11 5 3 2 0 0 2 0 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        text-autospace:none;
        word-break:break-hangul;
        font-size:10.0pt;
        font-family:"Malgun Gothic";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Malgun Gothic";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
 /* Page Definitions */
 @page Section1
        {size:612.0pt 792.0pt;
        margin:3.0cm 72.0pt 72.0pt 72.0pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=KO link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span lang=EN-US>This patch supports regulator power control
in the driver.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>Current ld9040 driver was controlled power
on/off sequence by callback function<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>in the board file. But, by doing this,
there's no need to register lcd power<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>on/off callback function in the board file.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US>Signed-off-by: Donghwa Lee
<dh09.lee@samsung.com><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>Signed-off-by: Kyungmin Park
<kyungmin.park@samsung.com><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>Signed-off-by: Inki Dae <inki.dae@samsung.com><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>---<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> drivers/video/backlight/ld9040.c
|   88 ++++++++++++++++++++++++++++++++-----<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> 1 files changed, 76 insertions(+), 12
deletions(-)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US>diff --git
a/drivers/video/backlight/ld9040.c b/drivers/video/backlight/ld9040.c<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>index da9a5ce..9698f48 100644<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>--- a/drivers/video/backlight/ld9040.c<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+++ b/drivers/video/backlight/ld9040.c<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>@@ -31,6 +31,7 @@<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> #include <linux/lcd.h><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> #include <linux/backlight.h><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> #include <linux/module.h><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+#include
<linux/regulator/consumer.h><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> #include "ld9040_gamma.h"<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>@@ -53,8 +54,60 @@ struct ld9040 {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          struct
lcd_device            *ld;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          struct
backlight_device               *bd;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          struct
lcd_platform_data  *lcd_pd;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         struct
mutex                           lock;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         struct
regulator             *reg_vdd3;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         struct
regulator             *reg_vci;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         bool 
enabled;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> };<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+static void ld9040_regulator_enable(struct
ld9040 *lcd)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         int
ret = 0;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         struct
lcd_platform_data *pd = NULL;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         pd
= lcd->lcd_pd;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         mutex_lock(&lcd->lock);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         if
(!lcd->enabled) {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   if
(lcd->reg_vdd3)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                              ret
= regulator_enable(lcd->reg_vdd3);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   if
(ret)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                              goto
out;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   if
(lcd->reg_vci)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                              ret
= regulator_enable(lcd->reg_vci);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   if
(ret)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                              goto
out;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   lcd->enabled
= true;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         mdelay(pd->power_on_delay);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+out:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         mutex_unlock(&lcd->lock);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+static void
ld9040_regulator_disable(struct ld9040 *lcd)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         int
ret = 0;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         mutex_lock(&lcd->lock);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         if
(lcd->enabled) {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   if
(lcd->reg_vci)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                              regulator_disable(lcd->reg_vci);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   if
(ret)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                              goto
out;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   if
(lcd->reg_vdd3)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                              regulator_disable(lcd->reg_vdd3);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   if
(ret)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                              goto
out;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   lcd->enabled
= false;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+out:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         mutex_unlock(&lcd->lock);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> static const unsigned short
seq_swreset[] = {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          0x01,
COMMAND_ONLY,<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          ENDDEF,
0x00<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>@@ -532,13 +585,8 @@ static int
ld9040_power_on(struct ld9040 *lcd)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>                     return
-EFAULT;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-          if
(!pd->power_on) {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-                    dev_err(lcd->dev,
"power_on is NULL.\n");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-                    return
-EFAULT;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-          }
else {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-                    pd->power_on(lcd->ld,
1);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-                    mdelay(pd->power_on_delay);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-          }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         /*
lcd power on */<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         ld9040_regulator_enable(lcd);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          if
(!pd->reset) {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>                     dev_err(lcd->dev,
"reset is NULL.\n");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>@@ -582,11 +630,8 @@ static int
ld9040_power_off(struct ld9040 *lcd)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          mdelay(pd->power_off_delay);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-          if
(!pd->power_on) {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-                    dev_err(lcd->dev,
"power_on is NULL.\n");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-                    return
-EFAULT;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-          }
else<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-                    pd->power_on(lcd->ld,
0);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         /*
lcd power off */<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         ld9040_regulator_disable(lcd);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          return
0;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>@@ -693,6 +738,20 @@ static int
ld9040_probe(struct spi_device *spi)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>                     goto
out_free_lcd;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         mutex_init(&lcd->lock);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         lcd->reg_vdd3
= regulator_get(lcd->dev, "vdd");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         if
(IS_ERR(lcd->reg_vdd3)) {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   dev_info(lcd->dev,
"no %s regulator found\n", "vdd");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   lcd->reg_vdd3
= NULL;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         lcd->reg_vci
= regulator_get(lcd->dev, "vci");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         if
(IS_ERR(lcd->reg_vci)) {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   dev_info(lcd->dev,
"no %s regulator found\n", "vci");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+                   lcd->reg_vci
= NULL;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          ld
= lcd_device_register("ld9040", &spi->dev, lcd,
&ld9040_lcd_ops);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          if
(IS_ERR(ld)) {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>                     ret
= PTR_ERR(ld);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>@@ -739,6 +798,9 @@ static int ld9040_probe(struct
spi_device *spi)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> out_unregister_lcd:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          lcd_device_unregister(lcd->ld);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> out_free_lcd:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         regulator_put(lcd->reg_vci);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         regulator_put(lcd->reg_vdd3);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          kfree(lcd);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          return
ret;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>@@ -750,6 +812,8 @@ static int __devexit
ld9040_remove(struct spi_device *spi)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          ld9040_power(lcd,
FB_BLANK_POWERDOWN);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          backlight_device_unregister(lcd->bd);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          lcd_device_unregister(lcd->ld);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         regulator_put(lcd->reg_vci);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>+         regulator_put(lcd->reg_vdd3);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          kfree(lcd);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>          return
0;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>-- <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>1.7.4.1<o:p></o:p></span></p>

</div>

</body>

</html>