From 289204a92f8c2fa84696fa089d6679808a988031 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 4 May 2011 10:56:53 +0800 Subject: [PATCH] backlight:add aw9364 backlight driver support for A22 --- arch/arm/configs/rk29_a22_defconfig | 1 + arch/arm/mach-rk29/board-rk29-a22.c | 32 +++ drivers/video/backlight/Kconfig | 7 + drivers/video/backlight/Makefile | 1 + drivers/video/backlight/aw9364_bl.c | 253 ++++++++++++++++++ drivers/video/backlight/aw9364_bl.h | 12 + .../video/display/screen/lcd_ili9803_cpt4_3.c | 9 +- 7 files changed, 309 insertions(+), 6 deletions(-) mode change 100755 => 100644 arch/arm/configs/rk29_a22_defconfig mode change 100755 => 100644 arch/arm/mach-rk29/board-rk29-a22.c create mode 100755 drivers/video/backlight/aw9364_bl.c create mode 100644 drivers/video/backlight/aw9364_bl.h diff --git a/arch/arm/configs/rk29_a22_defconfig b/arch/arm/configs/rk29_a22_defconfig old mode 100755 new mode 100644 index 5fd1f858bf26..22a424d8bf4b --- a/arch/arm/configs/rk29_a22_defconfig +++ b/arch/arm/configs/rk29_a22_defconfig @@ -1260,6 +1260,7 @@ CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_GENERIC is not set # CONFIG_BACKLIGHT_RK29_BL is not set CONFIG_FIH_TOUCHKEY_LED=y +CONFIG_BACKLIGHT_AW9364=y # # Display device support diff --git a/arch/arm/mach-rk29/board-rk29-a22.c b/arch/arm/mach-rk29/board-rk29-a22.c old mode 100755 new mode 100644 index 7f0baacaac62..ae26d3f86ecd --- a/arch/arm/mach-rk29/board-rk29-a22.c +++ b/arch/arm/mach-rk29/board-rk29-a22.c @@ -64,6 +64,7 @@ #include "../../../drivers/headset_observe/rk_headset.h" #include "../../../drivers/staging/android/timed_gpio.h" #include "../../../drivers/input/magnetometer/mmc328x.h" +#include "../../../drivers/video/backlight/aw9364_bl.h" /*set touchscreen different type header*/ #if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI) #include "../../../drivers/input/touchscreen/xpt2046_ts.h" @@ -2162,6 +2163,34 @@ struct rk29_bl_info rk29_bl_info = { .io_deinit = rk29_backlight_io_deinit, }; #endif + +#ifdef CONFIG_BACKLIGHT_AW9364 +static int aw9364_backlight_io_init(void) +{ + return 0; +} + +static int aw9364_backlight_io_deinit(void) +{ + return 0; +} +struct aw9364_platform_data aw9364_bl_info = { + .pin_en = RK29_PIN6_PD2, + .io_init = aw9364_backlight_io_init, + .io_deinit = aw9364_backlight_io_deinit, +}; + +struct platform_device aw9364_device_backlight = { + .name = "aw9364_backlight", + .id = -1, + .dev = { + .platform_data = &aw9364_bl_info, + } + }; + +#endif + + /***************************************************************************************** * pwm voltage regulator devices ******************************************************************************************/ @@ -2664,6 +2693,9 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_BACKLIGHT_RK29_BL &rk29_device_backlight, #endif +#ifdef CONFIG_BACKLIGHT_AW9364 + &aw9364_device_backlight, +#endif #ifdef CONFIG_RK29_VMAC &rk29_device_vmac, #endif diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 53ee0f5d2e6a..6d7fc6783dce 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -281,3 +281,10 @@ config FIH_TOUCHKEY_LED default y help fih touch key led support. + +config BACKLIGHT_AW9364 + bool "aw9364 backlight driver" + depends on BACKLIGHT_CLASS_DEVICE && ARCH_RK29 + default y + help + aw9364 backlight support. diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index b25c53105840..d38ca546f89d 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -30,4 +30,5 @@ obj-$(CONFIG_BACKLIGHT_ADX) += adx_bl.o obj-$(CONFIG_BACKLIGHT_ADP5520) += adp5520_bl.o obj-$(CONFIG_BACKLIGHT_RK2818_BL) += rk2818_backlight.o obj-$(CONFIG_BACKLIGHT_RK29_BL) += rk29_backlight.o +obj-$(CONFIG_BACKLIGHT_AW9364) += aw9364_bl.o obj-$(CONFIG_FIH_TOUCHKEY_LED) += fih_touchkey_led.o diff --git a/drivers/video/backlight/aw9364_bl.c b/drivers/video/backlight/aw9364_bl.c new file mode 100755 index 000000000000..0eb4e0e01d77 --- /dev/null +++ b/drivers/video/backlight/aw9364_bl.c @@ -0,0 +1,253 @@ +/* + * Backlight driver for Wolfson Microelectronics WM831x PMICs + * + * Copyright 2009 Wolfson Microelectonics plc + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +#include +#include +#include "aw9364_bl.h" + +/* + * Debug + */ +#if 0 +#define DBG(x...) printk(KERN_INFO x) +#else +#define DBG(x...) +#endif + +#define BL_SET 255 +#define BL_INIT_VALUE 102 +struct aw9364_backlight_data { + int pin_en; + int current_brightness; +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; + struct delayed_work work; + int suspend_flag; + int shutdown_flag; +#endif +}; + +#ifdef CONFIG_HAS_EARLYSUSPEND +static struct backlight_device *g_aw9364_bl; +static struct aw9364_backlight_data *g_aw9364_data; +#endif + +static int aw9364_backlight_set(struct backlight_device *bl, int brightness) +{ + struct aw9364_backlight_data *data = bl_get_data(bl); + int i,num_clk, num_clk_to, num_clk_from; + + if(data && data->pin_en) + gpio_request(data->pin_en, NULL); + else + return -1; + + brightness = brightness & 0xff; //0-256 + + num_clk_from = 16 -(data->current_brightness>>4); + num_clk_to = 16 -(brightness>>4); + num_clk = (16 + num_clk_to - num_clk_from)%16; + + if(brightness < 16) + { + gpio_direction_output(data->pin_en, GPIO_LOW); + mdelay(2); + } + + for(i=0; ipin_en, GPIO_LOW); + udelay(5); + gpio_direction_output(data->pin_en, GPIO_HIGH); + if(i==0) + udelay(50); + else + udelay(2); + } + + DBG("%s:current_bl=%d,bl=%d,num_clk_to=%d,num_clk_from=%d,num_clk=%d\n",__FUNCTION__, + data->current_brightness,brightness,num_clk_to,num_clk_from,num_clk); + + if(num_clk) + data->current_brightness = brightness; + + return 0; + +} + +static int aw9364_backlight_update_status(struct backlight_device *bl) +{ + + int brightness = bl->props.brightness; + + if(g_aw9364_data->suspend_flag == 1) + brightness = 0; + + if (g_aw9364_data->shutdown_flag == 1) + brightness = 0; + + if (bl->props.power != FB_BLANK_UNBLANK) + brightness = 0; + + if (bl->props.fb_blank != FB_BLANK_UNBLANK) + brightness = 0; + + if (bl->props.state & BL_CORE_SUSPENDED) + brightness = 0; + + printk("backlight brightness=%d\n", brightness); + + return aw9364_backlight_set(bl, brightness); +} + +static int aw9364_backlight_get_brightness(struct backlight_device *bl) +{ + struct aw9364_backlight_data *data = bl_get_data(bl); + return data->current_brightness; +} + +static struct backlight_ops aw9364_backlight_ops = { + .options = BL_CORE_SUSPENDRESUME, + .update_status = aw9364_backlight_update_status, + .get_brightness = aw9364_backlight_get_brightness, +}; +#ifdef CONFIG_HAS_EARLYSUSPEND +static void aw9364_bl_work(struct work_struct *work) +{ + //struct aw9364_backlight_data *aw9364_data = container_of(work, struct aw9364_backlight_data, + //work.work); + backlight_update_status(g_aw9364_bl); +} + +static void aw9364_bl_suspend(struct early_suspend *h) +{ + struct aw9364_backlight_data *aw9364_data; + aw9364_data = container_of(h, struct aw9364_backlight_data, early_suspend); + aw9364_data->suspend_flag = 1; + + schedule_delayed_work(&aw9364_data->work, msecs_to_jiffies(100)); +} + + +static void aw9364_bl_resume(struct early_suspend *h) +{ + struct aw9364_backlight_data *aw9364_data; + aw9364_data = container_of(h, struct aw9364_backlight_data, early_suspend); + aw9364_data->suspend_flag = 0; + + schedule_delayed_work(&aw9364_data->work, msecs_to_jiffies(100)); +} + +#endif +static int aw9364_backlight_probe(struct platform_device *pdev) +{ + struct aw9364_backlight_data *data; + struct aw9364_platform_data *pdata = pdev->dev.platform_data; + struct backlight_device *bl; + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (data == NULL) + return -ENOMEM; + + data->current_brightness = 0; + data->pin_en = pdata->pin_en; + + + bl = backlight_device_register("wm831x", &pdev->dev, data, + &aw9364_backlight_ops); + if (IS_ERR(bl)) { + dev_err(&pdev->dev, "failed to register backlight\n"); + kfree(data); + return PTR_ERR(bl); + } + + bl->props.brightness = BL_INIT_VALUE; + bl->props.max_brightness= BL_SET; + + platform_set_drvdata(pdev, bl); + +#ifdef CONFIG_HAS_EARLYSUSPEND + data->early_suspend.level = ~0x0; + data->early_suspend.suspend = aw9364_bl_suspend; + data->early_suspend.resume = aw9364_bl_resume; + register_early_suspend(&data->early_suspend); + INIT_DELAYED_WORK(&data->work, aw9364_bl_work); + g_aw9364_bl = bl; + g_aw9364_data = data; +#endif + + backlight_update_status(bl); + schedule_delayed_work(&data->work, msecs_to_jiffies(100)); + + printk("%s\n",__FUNCTION__); + + return 0; +} + +static int aw9364_backlight_remove(struct platform_device *pdev) +{ + struct backlight_device *bl = platform_get_drvdata(pdev); + struct aw9364_backlight_data *data = bl_get_data(bl); + + backlight_device_unregister(bl); +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&data->early_suspend); +#endif + kfree(data); + return 0; +} + +static void aw9364_backlight_shutdown(struct platform_device *pdev) +{ + struct backlight_device *bl = platform_get_drvdata(pdev); + struct aw9364_backlight_data *data = bl_get_data(bl); + + printk("%s\n",__FUNCTION__); + data->shutdown_flag = 1; + aw9364_backlight_update_status(bl); + return; +} + +static struct platform_driver aw9364_backlight_driver = { + .driver = { + .name = "aw9364_backlight", + .owner = THIS_MODULE, + }, + .probe = aw9364_backlight_probe, + .remove = aw9364_backlight_remove, + .shutdown = aw9364_backlight_shutdown, +}; + +static int __init aw9364_backlight_init(void) +{ + return platform_driver_register(&aw9364_backlight_driver); +} +module_init(aw9364_backlight_init); + +static void __exit aw9364_backlight_exit(void) +{ + platform_driver_unregister(&aw9364_backlight_driver); +} +module_exit(aw9364_backlight_exit); + +MODULE_DESCRIPTION("Backlight Driver for AW9364"); +MODULE_AUTHOR("luo wei io_deinit(); - set_backlight(255); + //set_backlight(255); return 0; } int standby(u8 enable) //***enable =1 means suspend, 0 means resume { - int i; - if(gLcd_info) gLcd_info->io_init(); if(enable) { WriteCommand(0X2800); - set_backlight(0); + //set_backlight(0); mdelay(100); WriteCommand(0X1000); } else { @@ -1445,7 +1442,7 @@ int standby(u8 enable) //***enable =1 means suspend, 0 means resume mdelay(120); WriteCommand(0X2900); mdelay(100); - set_backlight(255); + //set_backlight(255); } if(gLcd_info) -- 2.34.1