All pastes #435143 Raw Edit

Untitled

public c v1 · immutable
·published 2007-04-11 20:03 UTC
rendered paste body
Index: 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);