Index: Kconfig =================================================================== RCS file: /cvs/linux/kernel26/arch/arm/mach-pxa/htcblueangel/Kconfig,v retrieving revision 1.12 diff -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_KEYPAD Index: Makefile =================================================================== RCS file: /cvs/linux/kernel26/arch/arm/mach-pxa/htcblueangel/Makefile,v retrieving revision 1.7 diff -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.o Index: blueangel_leds.c =================================================================== RCS file: /cvs/linux/kernel26/arch/arm/mach-pxa/htcblueangel/blueangel_leds.c,v retrieving revision 1.4 diff -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 #include +#include +#include #include #include +#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< LED_OFF) ? (1< LED_OFF) ? (1< LED_OFF) ? (1< 0) ? (1< 0) ? (1< 0) ? (1<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<