<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>