backlight:add aw9364 backlight driver support for A22
authorroot <root@lw.(none)>
Wed, 4 May 2011 02:56:53 +0000 (10:56 +0800)
committerroot <root@lw.(none)>
Wed, 4 May 2011 02:56:53 +0000 (10:56 +0800)
arch/arm/configs/rk29_a22_defconfig [changed mode: 0755->0644]
arch/arm/mach-rk29/board-rk29-a22.c [changed mode: 0755->0644]
drivers/video/backlight/Kconfig
drivers/video/backlight/Makefile
drivers/video/backlight/aw9364_bl.c [new file with mode: 0755]
drivers/video/backlight/aw9364_bl.h [new file with mode: 0644]
drivers/video/display/screen/lcd_ili9803_cpt4_3.c

old mode 100755 (executable)
new mode 100644 (file)
index 5fd1f85..22a424d
@@ -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
old mode 100755 (executable)
new mode 100644 (file)
index 7f0baac..ae26d3f
@@ -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
index 53ee0f5d2e6acb6509413046485affc271a2f29f..6d7fc6783dcefc7a2fbc1f520dcc4b366a3ce8d0 100644 (file)
@@ -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.       
index b25c5310584073785a14c1c178923d29b4a5c5bb..d38ca546f89d8d065a23591d3088b34e965ca072 100644 (file)
@@ -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 (executable)
index 0000000..0eb4e0e
--- /dev/null
@@ -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 <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/fb.h>
+#include <linux/backlight.h>
+#include <linux/slab.h>
+#include <mach/gpio.h>
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#include <linux/earlysuspend.h>
+#endif
+#include <linux/delay.h>
+#include <linux/ktime.h>
+#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; i<num_clk; i++)
+       {
+               gpio_direction_output(data->pin_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 <lw@rock-chips.com");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:aw9364-backlight");
diff --git a/drivers/video/backlight/aw9364_bl.h b/drivers/video/backlight/aw9364_bl.h
new file mode 100644 (file)
index 0000000..bac874d
--- /dev/null
@@ -0,0 +1,12 @@
+\r
+#ifndef __DRIVERS_TOUCHSCREEN_AW9364_TS_H\r
+#define __DRIVERS_TOUCHSCREEN_AW9364_TS_H\r
+\r
+struct aw9364_platform_data {\r
+       int pin_en;\r
+       int current_brightness;\r
+       int (*io_init)(void);\r
+       int (*io_deinit)(void);\r
+};\r
+#endif\r
+\r
index f93ff48143e044df21cd8dbd7fde5b20ca260e6b..4cb42855b6eb639cbbe995d999d432a9a64f8995 100755 (executable)
@@ -1405,7 +1405,6 @@ else if(OUT_FACE == OUT_P666)
 int init(void)\r
 { \r
        volatile u32 data;\r
-       int i;\r
        printk("lcd init...\n");\r
        /* reset lcd to start init lcd */\r
        gpio_request(RK29_PIN6_PC6, NULL);\r
@@ -1423,21 +1422,19 @@ int init(void)
        if(gLcd_info)\r
        gLcd_info->io_deinit();\r
 \r
-       set_backlight(255);\r
+       //set_backlight(255);\r
 \r
     return 0;\r
 }\r
 \r
 int standby(u8 enable) //***enable =1 means suspend, 0 means resume \r
 {\r
-       int i;\r
-\r
     if(gLcd_info)\r
         gLcd_info->io_init();\r
 \r
        if(enable) {\r
                WriteCommand(0X2800); \r
-               set_backlight(0);\r
+               //set_backlight(0);\r
                mdelay(100);\r
                WriteCommand(0X1000); \r
        } else { \r
@@ -1445,7 +1442,7 @@ int standby(u8 enable)    //***enable =1 means suspend, 0 means resume
                mdelay(120);\r
                WriteCommand(0X2900); \r
                mdelay(100);\r
-               set_backlight(255);\r
+               //set_backlight(255);\r
        }\r
 \r
     if(gLcd_info)\r