rendered paste bodyIndex: Kconfig===================================================================RCS file: /cvs/linux/kernel26/arch/arm/mach-pxa/htcblueangel/Kconfig,vretrieving revision 1.12diff -u -r1.12 Kconfig--- Kconfig 8 Apr 2007 23:05:18 -0000 1.12+++ Kconfig 11 Apr 2007 20:01:34 -0000@@ -39,6 +39,16 @@ Support for right led (colors red+green+(yellow)) Off/on hook keys ilumination Keyboard ilumination+ Phone key ilumination+ Vibra on/off++menuconfig MACH_BLUEANGEL_ASIC3_LEDS+ tristate "HTC Blueangel Asic3 LED support"+ depends on MACH_BLUEANGEL+ ---help---+ Support for right led (colors wifi+bt)+ Off/on hook keys ilumination+ Keyboard ilumination Vibra on/off menuconfig MACH_BLUEANGEL_KEYPADIndex: Makefile===================================================================RCS file: /cvs/linux/kernel26/arch/arm/mach-pxa/htcblueangel/Makefile,vretrieving revision 1.7diff -u -r1.7 Makefile--- Makefile 17 Dec 2006 12:23:37 -0000 1.7+++ Makefile 11 Apr 2007 20:01:34 -0000@@ -10,6 +10,7 @@ obj-$(CONFIG_MACH_BLUEANGEL_PCMCIA) += blueangel_pcmcia.o obj-$(CONFIG_MACH_BLUEANGEL_SUSPEND) += blueangel_suspend.o obj-$(CONFIG_MACH_BLUEANGEL_LEDS) += blueangel_leds.o+obj-$(CONFIG_MACH_BLUEANGEL_ASIC3_LEDS) += blueangel_asic3_leds.o obj-$(CONFIG_MACH_BLUEANGEL_KEYPAD) += blueangel_kp.o obj-$(CONFIG_MACH_BLUEANGEL_AUDIO) += blueangel_audio.o obj-$(CONFIG_MACH_BLUEANGEL_BATTERY) += blueangel_battery.oIndex: blueangel_leds.c===================================================================RCS file: /cvs/linux/kernel26/arch/arm/mach-pxa/htcblueangel/blueangel_leds.c,vretrieving revision 1.4diff -u -r1.4 blueangel_leds.c--- blueangel_leds.c 4 Dec 2006 11:34:45 -0000 1.4+++ blueangel_leds.c 11 Apr 2007 20:01:35 -0000@@ -1,15 +1,10 @@ /*- * LED interface for Himalaya, the HTC PocketPC.+ * non-ASIC3 LED interface for HTC Universal. *- * License: GPL- *- * Author: Luke Kenneth Casson Leighton, Copyright(C) 2004- *- * Copyright(C) 2004, Luke Kenneth Casson Leighton.- *- * History:- *- * 2004-02-19 Luke Kenneth Casson Leighton created.+ * This program is free software; you can redistribute it and/or modify+ * it under the terms of the GNU General Public License as published by+ * the Free Software Foundation; either version 2 of the License, or (at+ * your option) any later version. * */ @@ -20,41 +15,38 @@ #include <linux/soc/asic3_base.h> #include <asm/io.h>+#include <asm/hardware/ipaq-asic3.h>+#include <asm/arch/htcblueangel-gpio.h> #include <asm/arch/htcblueangel-asic.h> #include <asm/mach-types.h> +#include "blueangel_leds.h" -#ifdef DEBUG-#define dprintk(x...) printk(x)-#else-#define dprintk(x...)-#endif--extern struct platform_device blueangel_asic3; static volatile void *virt;--#define RED_LED 0-#define GREEN_LED 1-#define YELLOW_LED 2-#define BLUE_LED 6-#define WIFI_LED 7-#define PHONE_LED 8-#define KEYB_LED 9-#define VIBRA 10--#define CLOCK_CDEX_LED0 (1 << 6) /* clock for led 0? */-#define CLOCK_CDEX_LED1 (1 << 7) /* clock for led 1? */+extern struct platform_device blueangel_asic3; struct blueangel_led_data {- int hw_num; // 0 (amber), 1 (green), 2 (blue)- int duty_time;- int cycle_time;- int registered;- int brightness;- int color;+ int hw_num;+ int registered;+ struct led_classdev props; }; -#define to_blueangel_led_data(d) container_of(d, struct blueangel_led_data, props)+static struct blueangel_led_data leds[] = {+ {+ .hw_num=HTC_WIFI_LED,+ .props = {+ .name = "blueangel:wifi",+ .brightness_set = blueangel_led_brightness_set,+ }+ },+ {+ .hw_num=HTC_BT_LED,+ .props = {+ .name = "blueangel:bt",+ .brightness_set = blueangel_led_brightness_set,+ }+ },+}; static int led_read(int reg)@@ -65,7 +57,6 @@ *addr |= 0x80; *addr = (*addr & 0xff80) | (reg & 0x7f); - dprintk("led_read[0x%x]=0x%x\n", reg, *data); return *data; } @@ -75,7 +66,6 @@ volatile unsigned short *addr=((volatile unsigned short *)(virt+0xa)); volatile unsigned short *data=((volatile unsigned short *)(virt+0xc)); - dprintk("led_write[0x%x]=0x%x\n", reg, val); *addr = (*addr & 0xff80) | (reg & 0x7f); *addr &= 0xff7f; @@ -83,20 +73,13 @@ } -void blueangel_set_led (int led, int brightness, int duty_time, int cycle_time)++void blueangel_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness value) {- dprintk("blueangel_set_led\n");- if (led <= 2) {- if (brightness) {- duty_time=(duty_time*128+500)/1000;- cycle_time=(cycle_time*128+500)/1000;- } else {- duty_time=0;- cycle_time=1;- }- }- if (led == 6 || led == 7 || led==8) {- if (brightness) {+ int i, hw_num=-1, duty_time=100, cycle_time=100;++ if (hw_num == HTC_BT_LED || hw_num == HTC_WIFI_LED) {+ if (value) { duty_time=(duty_time*16+500)/1000; cycle_time=(cycle_time*16+500)/1000; } else {@@ -104,32 +87,26 @@ cycle_time=1; } }- switch(led) {- case 0:- asic3_set_led(&blueangel_asic3.dev, 0, duty_time, cycle_time);- break;- case 1:- asic3_set_led(&blueangel_asic3.dev, 1, duty_time, cycle_time);+ + for (i = 0; i < ARRAY_SIZE(leds); i++)+ if (!strcmp(leds[i].props.name,led_cdev->name)) + hw_num=leds[i].hw_num;++ switch (hw_num) + {+ case HTC_PHONE_BL_LED:+ asic3_set_gpio_out_b(&blueangel_asic3.dev, 1<<GPIOB_PHONEL_PWR_ON, (value > LED_OFF) ? (1<<GPIOB_PHONEL_PWR_ON) : 0); break;- case 2:- asic3_set_led(&blueangel_asic3.dev, 0, duty_time, cycle_time);- asic3_set_led(&blueangel_asic3.dev, 1, duty_time, cycle_time);+ case HTC_KEYBD_BL_LED:+ asic3_set_gpio_out_c(&blueangel_asic3.dev, 1<<GPIOC_KEYBL_PWR_ON, (value > LED_OFF) ? (1<<GPIOC_KEYBL_PWR_ON) : 0); break;- case 6:- led_write(0, duty_time);- led_write(1, cycle_time-duty_time);- if (brightness) {- led_write(4, led_read(4) | 0x1);- led_write(0x20, led_read(0x20) & ~0x4);- } else {- led_write(4, led_read(4) & ~0x1);- led_write(0x20, led_read(0x20) | 0x4);- }+ case HTC_VIBRA:+ asic3_set_gpio_out_b(&blueangel_asic3.dev, 1<<GPIOB_VIBRA_PWR_ON, (value > LED_OFF) ? (1<<GPIOB_VIBRA_PWR_ON) : 0); break;- case 7:+ case HTC_WIFI_LED: led_write(2, duty_time); led_write(3, cycle_time-duty_time);- if (brightness) {+ if (value) { led_write(4, led_read(4) | 0x2); led_write(0x20, led_read(0x20) & ~0x8); } else {@@ -137,267 +114,101 @@ led_write(0x20, led_read(0x20) | 0x8); } break;- case 8:- asic3_set_gpio_out_b(&blueangel_asic3.dev, 1<<GPIOB_PHONEL_PWR_ON, (brightness > 0) ? (1<<GPIOB_PHONEL_PWR_ON) : 0);- break;- case 9:- asic3_set_gpio_out_c(&blueangel_asic3.dev, 1<<GPIOC_KEYBL_PWR_ON, (brightness > 0) ? (1<<GPIOC_KEYBL_PWR_ON) : 0);- break;- case 10:- asic3_set_gpio_out_b(&blueangel_asic3.dev, 1<<GPIOB_VIBRA_PWR_ON, (brightness > 0) ? (1<<GPIOB_VIBRA_PWR_ON) : 0);+ case HTC_BT_LED:+ led_write(0, duty_time);+ led_write(1, cycle_time-duty_time);+ if (value) {+ led_write(4, led_read(4) | 0x1);+ led_write(0x20, led_read(0x20) & ~0x4);+ } else {+ led_write(4, led_read(4) & ~0x1);+ led_write(0x20, led_read(0x20) | 0x4);+ } break; }-} -EXPORT_SYMBOL(blueangel_set_led);--static void htcblueangel_led_red_set(struct led_classdev *led_cdev,- enum led_brightness value)-{- if (value)- blueangel_set_led(RED_LED,100,1000,1000);- else- blueangel_set_led(RED_LED,0,1000,1000);+ printk("brightness=%d for the led=%d\n",value, hw_num); } -static void htcblueangel_led_green_set(struct led_classdev *led_cdev,- enum led_brightness value)+static int blueangel_led_probe(struct platform_device *dev) {- if (value)- blueangel_set_led(GREEN_LED,100,1000,1000);- else- blueangel_set_led(GREEN_LED,0,1000,1000);-}--static void htcblueangel_led_yellow_set(struct led_classdev *led_cdev,- enum led_brightness value)-{- if (value)- blueangel_set_led(YELLOW_LED,100,1000,1000);- else- blueangel_set_led(YELLOW_LED,0,1000,1000);-}--static void htcblueangel_led_blue_set(struct led_classdev *led_cdev,- enum led_brightness value)-{- if (value)- blueangel_set_led(BLUE_LED,100,1000,1000);- else- blueangel_set_led(BLUE_LED,0,1000,1000);-}-static void htcblueangel_led_wifi_set(struct led_classdev *led_cdev,- enum led_brightness value)-{- if (value)- blueangel_set_led(WIFI_LED,100,1000,1000);- else- blueangel_set_led(WIFI_LED,0,1000,1000);-}--static void htcblueangel_led_phone_set(struct led_classdev *led_cdev,- enum led_brightness value)-{- if (value)- blueangel_set_led(PHONE_LED,100,1000,1000);- else- blueangel_set_led(PHONE_LED,0,1000,1000);-}--static void htcblueangel_led_keyb_set(struct led_classdev *led_cdev,- enum led_brightness value)-{- if (value)- blueangel_set_led(KEYB_LED,100,1000,1000);- else- blueangel_set_led(KEYB_LED,0,1000,1000);-}--static void htcblueangel_led_vibra_set(struct led_classdev *led_cdev,- enum led_brightness value)-{- if (value)- blueangel_set_led(VIBRA,100,1000,1000);- else- blueangel_set_led(VIBRA,0,1000,1000);-}--static struct led_classdev htcblueangel_yellow_led = {- .name = "yellow",- .default_trigger = "charge",- .brightness_set = htcblueangel_led_yellow_set,-};--static struct led_classdev htcblueangel_red_led = {- .name = "red",- .default_trigger = "message",- .brightness_set = htcblueangel_led_red_set,-};-static struct led_classdev htcblueangel_green_led = {- .name = "green",- .default_trigger = "phone",- .brightness_set = htcblueangel_led_green_set,-};-static struct led_classdev htcblueangel_blue_led = {- .name = "blue",- .default_trigger = "bluetooth",- .brightness_set = htcblueangel_led_blue_set,-};-static struct led_classdev htcblueangel_wifi_led = {- .name = "wifi",- .default_trigger = "wifi",- .brightness_set = htcblueangel_led_wifi_set,-};-static struct led_classdev htcblueangel_phone_led = {- .name = "phone",- .default_trigger = "call",- .brightness_set = htcblueangel_led_phone_set,-};-static struct led_classdev htcblueangel_keyb_led = {- .name = "keyboard",- .default_trigger = "keyboard",- .brightness_set = htcblueangel_led_keyb_set,-};-static struct led_classdev htcblueangel_vibra_led = {- .name = "vibra",-// .default_trigger = "keyboard",- .brightness_set = htcblueangel_led_vibra_set,-};--static int blueangel_led_probe(struct platform_device *pdev)-{- int ret=0;+ int i,ret=0; printk("blueangel_led_probe\n");- /* Turn on the LED controllers in CDEX */- asic3_set_clock_cdex(&blueangel_asic3.dev,- CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2,- CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2- );- blueangel_set_led(RED_LED, 0, 0, 0);- blueangel_set_led(GREEN_LED, 0, 0, 0);- blueangel_set_led(YELLOW_LED, 0, 0, 0);- blueangel_set_led(BLUE_LED, 0, 0, 0);- blueangel_set_led(WIFI_LED, 0, 0, 0);- blueangel_set_led(PHONE_LED, 0, 0, 0);- blueangel_set_led(KEYB_LED, 0, 0, 0);- blueangel_set_led(VIBRA, 0, 0, 0);-- ret = led_classdev_register(&pdev->dev, &htcblueangel_red_led);- if (ret < 0)- led_classdev_unregister(&htcblueangel_red_led);-- ret = led_classdev_register(&pdev->dev, &htcblueangel_green_led);- if (ret < 0)- led_classdev_unregister(&htcblueangel_green_led);-- ret = led_classdev_register(&pdev->dev, &htcblueangel_yellow_led);- if (ret < 0)- led_classdev_unregister(&htcblueangel_yellow_led);-- ret = led_classdev_register(&pdev->dev, &htcblueangel_blue_led);- if (ret < 0)- led_classdev_unregister(&htcblueangel_blue_led);-- ret = led_classdev_register(&pdev->dev, &htcblueangel_wifi_led);- if (ret < 0)- led_classdev_unregister(&htcblueangel_wifi_led);-- ret = led_classdev_register(&pdev->dev, &htcblueangel_phone_led);- if (ret < 0)- led_classdev_unregister(&htcblueangel_phone_led);-- ret = led_classdev_register(&pdev->dev, &htcblueangel_keyb_led);- if (ret < 0)- led_classdev_unregister(&htcblueangel_keyb_led);-- ret = led_classdev_register(&pdev->dev, &htcblueangel_vibra_led);- if (ret < 0)- led_classdev_unregister(&htcblueangel_vibra_led); + for (i = 0; i < ARRAY_SIZE(leds); i++) {+ ret = led_classdev_register(&dev->dev, &leds[i].props);+ leds[i].registered = 1;++ leds[i].props.brightness_set(&leds[i].props,LED_OFF);++ if (unlikely(ret)) {+ printk(KERN_WARNING "Unable to register blueangel_led %s\n", leds[i].props.name);+ leds[i].registered = 0;+ }+ } return ret; } -static int blueangel_led_remove(struct platform_device *pdev)+static int blueangel_led_remove(struct platform_device *dev) {+ int i;++ printk("blueangel_led_remove\n");++ for (i = 0; i < ARRAY_SIZE(leds); i++)+ if (leds[i].registered)+ led_classdev_unregister(&leds[i].props); - dprintk("blueangel_led_remove\n");- led_classdev_unregister(&htcblueangel_yellow_led);- led_classdev_unregister(&htcblueangel_green_led);- led_classdev_unregister(&htcblueangel_red_led);- led_classdev_unregister(&htcblueangel_blue_led);- led_classdev_unregister(&htcblueangel_wifi_led);- led_classdev_unregister(&htcblueangel_phone_led);- led_classdev_unregister(&htcblueangel_keyb_led);- led_classdev_unregister(&htcblueangel_vibra_led); return 0; } -static int -blueangel_led_suspend(struct platform_device *dev, pm_message_t state)+static int blueangel_led_suspend(struct platform_device *dev, pm_message_t state) {- asic3_set_gpio_out_b(&blueangel_asic3.dev, 1<<GPIOB_PHONEL_PWR_ON, 0);- asic3_set_gpio_out_c(&blueangel_asic3.dev, 1<<GPIOC_KEYBL_PWR_ON, 0);- asic3_set_gpio_out_b(&blueangel_asic3.dev, 1<<GPIOB_VIBRA_PWR_ON, 0);- led_classdev_suspend(&htcblueangel_red_led);- led_classdev_suspend(&htcblueangel_green_led);- led_classdev_suspend(&htcblueangel_yellow_led);- led_classdev_suspend(&htcblueangel_blue_led);- led_classdev_suspend(&htcblueangel_wifi_led);- led_classdev_suspend(&htcblueangel_phone_led);- led_classdev_suspend(&htcblueangel_keyb_led);- led_classdev_suspend(&htcblueangel_vibra_led);+ int i;++ for (i = 0; i < ARRAY_SIZE(leds); i++)+ led_classdev_suspend(&leds[i].props); return 0; } -static int-blueangel_led_resume(struct platform_device *pdev)+static int blueangel_led_resume(struct platform_device *dev) {- led_classdev_resume(&htcblueangel_red_led);- led_classdev_resume(&htcblueangel_green_led);- led_classdev_resume(&htcblueangel_yellow_led);- led_classdev_resume(&htcblueangel_blue_led);- led_classdev_resume(&htcblueangel_wifi_led);- led_classdev_resume(&htcblueangel_phone_led);- led_classdev_resume(&htcblueangel_keyb_led);- led_classdev_resume(&htcblueangel_vibra_led);-// }+ int i;++ for (i = 0; i < ARRAY_SIZE(leds); i++)+ led_classdev_resume(&leds[i].props); return 0; } static struct platform_driver blueangel_led_driver = {- .probe = blueangel_led_probe,- .remove = blueangel_led_remove,+ .driver = {+ .name = "blueangel-leds",+ },+ .probe = blueangel_led_probe,+ .remove = blueangel_led_remove,+#ifdef CONFIG_PM .suspend = blueangel_led_suspend,- .resume = blueangel_led_resume,- .driver = {- .name = "htcblueangel-led",- }, -+ .resume = blueangel_led_resume,+#endif }; static int blueangel_led_init (void) {- int ret = 0;-- if (! machine_is_blueangel() )+ if (!machine_is_blueangel() ) return -ENODEV;-- printk("Register HTC Blueangel LED class module\r\n"); virt=ioremap(0x11000000, 4096);- //printk("0x%x 0x%x 0x%x 0x%x 0x%x\n", led_read(0), led_read(1), led_read(2), led_read(3), led_read(4));- //printk("0x%x 0x%x 0x%x\n", led_read(0x20), led_read(0x21), led_read(0x22));- return platform_driver_register(&blueangel_led_driver);++ return platform_driver_register(&blueangel_led_driver); } static void blueangel_led_exit (void) {- printk("Unregister HTC Blueangel LED class module\r\n"); iounmap(virt);- platform_driver_unregister(&blueangel_led_driver);+ platform_driver_unregister(&blueangel_led_driver); } module_init (blueangel_led_init);