diff options
author | Banajit Goswami <banajit.g@samsung.com> | 2011-02-28 10:07:21 -0500 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2011-03-02 20:10:09 -0500 |
commit | baa0c0609307e46531e9d5d6f5b9a510ceb8e30c (patch) | |
tree | 0577f2f10a5967a92eaba750d3d6461515d86515 /arch/arm/mach-s5pc100/mach-smdkc100.c | |
parent | b0fd644f444c680838140aff4e766389ee6ad9a3 (diff) |
ARM: SAMSUNG: Add PWM backlight support on Samsung S5PC100
This patch adds support for LCD backlight using PWM timer for
Samsung SMDKC100 board.
Signed-off-by: Banajit Goswami <banajit.g@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Diffstat (limited to 'arch/arm/mach-s5pc100/mach-smdkc100.c')
-rw-r--r-- | arch/arm/mach-s5pc100/mach-smdkc100.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c index dd192a27524d..0525cb3ef406 100644 --- a/arch/arm/mach-s5pc100/mach-smdkc100.c +++ b/arch/arm/mach-s5pc100/mach-smdkc100.c | |||
@@ -23,12 +23,15 @@ | |||
23 | #include <linux/fb.h> | 23 | #include <linux/fb.h> |
24 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
25 | #include <linux/input.h> | 25 | #include <linux/input.h> |
26 | #include <linux/pwm_backlight.h> | ||
26 | 27 | ||
27 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
28 | #include <asm/mach/map.h> | 29 | #include <asm/mach/map.h> |
29 | 30 | ||
30 | #include <mach/map.h> | 31 | #include <mach/map.h> |
31 | #include <mach/regs-fb.h> | 32 | #include <mach/regs-fb.h> |
33 | #include <mach/regs-gpio.h> | ||
34 | |||
32 | #include <video/platform_lcd.h> | 35 | #include <video/platform_lcd.h> |
33 | 36 | ||
34 | #include <asm/irq.h> | 37 | #include <asm/irq.h> |
@@ -107,9 +110,6 @@ static struct i2c_board_info i2c_devs1[] __initdata = { | |||
107 | static void smdkc100_lcd_power_set(struct plat_lcd_data *pd, | 110 | static void smdkc100_lcd_power_set(struct plat_lcd_data *pd, |
108 | unsigned int power) | 111 | unsigned int power) |
109 | { | 112 | { |
110 | /* backlight */ | ||
111 | gpio_direction_output(S5PC100_GPD(0), power); | ||
112 | |||
113 | if (power) { | 113 | if (power) { |
114 | /* module reset */ | 114 | /* module reset */ |
115 | gpio_direction_output(S5PC100_GPH0(6), 1); | 115 | gpio_direction_output(S5PC100_GPH0(6), 1); |
@@ -179,6 +179,45 @@ static struct samsung_keypad_platdata smdkc100_keypad_data __initdata = { | |||
179 | .cols = 8, | 179 | .cols = 8, |
180 | }; | 180 | }; |
181 | 181 | ||
182 | static int smdkc100_backlight_init(struct device *dev) | ||
183 | { | ||
184 | int ret; | ||
185 | |||
186 | ret = gpio_request(S5PC100_GPD(0), "Backlight"); | ||
187 | if (ret) { | ||
188 | printk(KERN_ERR "failed to request GPF for PWM-OUT0\n"); | ||
189 | return ret; | ||
190 | } | ||
191 | |||
192 | /* Configure GPIO pin with S5PC100_GPD_TOUT_0 */ | ||
193 | s3c_gpio_cfgpin(S5PC100_GPD(0), S3C_GPIO_SFN(2)); | ||
194 | |||
195 | return 0; | ||
196 | } | ||
197 | |||
198 | static void smdkc100_backlight_exit(struct device *dev) | ||
199 | { | ||
200 | s3c_gpio_cfgpin(S5PC100_GPD(0), S3C_GPIO_OUTPUT); | ||
201 | gpio_free(S5PC100_GPD(0)); | ||
202 | } | ||
203 | |||
204 | static struct platform_pwm_backlight_data smdkc100_backlight_data = { | ||
205 | .pwm_id = 0, | ||
206 | .max_brightness = 255, | ||
207 | .dft_brightness = 255, | ||
208 | .pwm_period_ns = 78770, | ||
209 | .init = smdkc100_backlight_init, | ||
210 | .exit = smdkc100_backlight_exit, | ||
211 | }; | ||
212 | |||
213 | static struct platform_device smdkc100_backlight_device = { | ||
214 | .name = "pwm-backlight", | ||
215 | .dev = { | ||
216 | .parent = &s3c_device_timer[0].dev, | ||
217 | .platform_data = &smdkc100_backlight_data, | ||
218 | }, | ||
219 | }; | ||
220 | |||
182 | static struct platform_device *smdkc100_devices[] __initdata = { | 221 | static struct platform_device *smdkc100_devices[] __initdata = { |
183 | &s3c_device_adc, | 222 | &s3c_device_adc, |
184 | &s3c_device_cfcon, | 223 | &s3c_device_cfcon, |
@@ -200,6 +239,8 @@ static struct platform_device *smdkc100_devices[] __initdata = { | |||
200 | &s5p_device_fimc1, | 239 | &s5p_device_fimc1, |
201 | &s5p_device_fimc2, | 240 | &s5p_device_fimc2, |
202 | &s5pc100_device_spdif, | 241 | &s5pc100_device_spdif, |
242 | &s3c_device_timer[0], | ||
243 | &smdkc100_backlight_device, | ||
203 | }; | 244 | }; |
204 | 245 | ||
205 | static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = { | 246 | static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = { |
@@ -233,7 +274,6 @@ static void __init smdkc100_machine_init(void) | |||
233 | s5pc100_spdif_setup_gpio(S5PC100_SPDIF_GPD); | 274 | s5pc100_spdif_setup_gpio(S5PC100_SPDIF_GPD); |
234 | 275 | ||
235 | /* LCD init */ | 276 | /* LCD init */ |
236 | gpio_request(S5PC100_GPD(0), "GPD"); | ||
237 | gpio_request(S5PC100_GPH0(6), "GPH0"); | 277 | gpio_request(S5PC100_GPH0(6), "GPH0"); |
238 | smdkc100_lcd_power_set(&smdkc100_lcd_power_data, 0); | 278 | smdkc100_lcd_power_set(&smdkc100_lcd_power_data, 0); |
239 | platform_add_devices(smdkc100_devices, ARRAY_SIZE(smdkc100_devices)); | 279 | platform_add_devices(smdkc100_devices, ARRAY_SIZE(smdkc100_devices)); |