diff options
Diffstat (limited to 'packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch')
-rwxr-xr-x | packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch | 287 |
1 files changed, 109 insertions, 178 deletions
diff --git a/packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch b/packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch index 82dc93b611..beffb28a04 100755 --- a/packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch +++ b/packages/linux/linux-ezx-2.6.21/patches/e680-leds.patch @@ -5,8 +5,8 @@ Index: linux-2.6.21/drivers/leds/Kconfig =================================================================== ---- linux-2.6.21.orig/drivers/leds/Kconfig 2007-06-08 18:39:04.000000000 +0200 -+++ linux-2.6.21/drivers/leds/Kconfig 2007-06-08 18:39:12.000000000 +0200 +--- linux-2.6.21.orig/drivers/leds/Kconfig 2007-08-01 20:03:29.000000000 -0300 ++++ linux-2.6.21/drivers/leds/Kconfig 2007-08-01 20:04:02.000000000 -0300 @@ -111,6 +111,13 @@ This option enables support for the LEDs on the Motorola A780 GSM Phone. @@ -23,8 +23,8 @@ Index: linux-2.6.21/drivers/leds/Kconfig depends on LEDS_TRIGGERS Index: linux-2.6.21/drivers/leds/Makefile =================================================================== ---- linux-2.6.21.orig/drivers/leds/Makefile 2007-06-08 18:39:04.000000000 +0200 -+++ linux-2.6.21/drivers/leds/Makefile 2007-06-08 18:39:12.000000000 +0200 +--- linux-2.6.21.orig/drivers/leds/Makefile 2007-08-01 20:03:29.000000000 -0300 ++++ linux-2.6.21/drivers/leds/Makefile 2007-08-01 20:04:02.000000000 -0300 @@ -17,6 +17,7 @@ obj-$(CONFIG_LEDS_H1940) += leds-h1940.o obj-$(CONFIG_LEDS_COBALT) += leds-cobalt.o @@ -36,8 +36,8 @@ Index: linux-2.6.21/drivers/leds/Makefile Index: linux-2.6.21/drivers/leds/leds-e680.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.21/drivers/leds/leds-e680.c 2007-06-08 18:39:12.000000000 +0200 -@@ -0,0 +1,309 @@ ++++ linux-2.6.21/drivers/leds/leds-e680.c 2007-08-01 20:04:02.000000000 -0300 +@@ -0,0 +1,235 @@ +/* + * EZX Platform LED Driver for the Motorola E680(i) GSM Phone + * @@ -73,147 +73,100 @@ Index: linux-2.6.21/drivers/leds/leds-e680.c +extern int ezx_pcap_read(u_int8_t, u_int32_t *); +extern int ezx_pcap_write(u_int8_t, u_int32_t); + -+static enum led_brightness old_red; -+static enum led_brightness old_green; -+static enum led_brightness old_blue; -+ +typedef struct { -+ unsigned char ind_GPIO_red; /*Indicator Red control GPIO 46: 0 active, 1 disactive*/ -+ unsigned char ind_GPIO_green; /*Indicator Green control GPIO 47: 0 active, 1 disactive*/ -+ unsigned char pcap_LEDR_en; /*pcap LEDR_EN bit value: 1 =Red LED(&Green) sink circuit enabled*/ -+ unsigned char pcap_LEDG_en; /*pcap LEDG_EN bit value:1 =Green(->Blue)LED sink circuit enabled*/ -+ unsigned char pcap_LEDR_CTRL; /* 4bits Sets the timing for the red(&Green) LED sink circuit*/ -+ unsigned char pcap_LEDG_CTRL; /* 4bits Sets the timing for the GREEN (->Blue) LED sink circuit*/ -+ unsigned char pcap_LEDR_I; /* 2 bits 00 3mA,01 4mA, 10 5mA, 11 9mA, sets the pulsed current level for LEDR*/ -+ unsigned char pcap_LEDG_I; /* 2 bits 00 3mA,01 4mA, 10 5mA, 11 9mA, sets the pulsed current level for LEDG*/ -+ unsigned char pcap_SKIP_on; /*1=The ON timing sequence defined by LEDx_CTRL is executed on every other cycle*/ ++ u_int8_t ind_GPIO_red; /*Indicator Red control GPIO 46: 0 active, 1 inactive */ ++ u_int8_t ind_GPIO_green; /*Indicator Green control GPIO 47: 0 inactive, 1 active */ ++ u_int8_t pcap_LEDR_en; /*pcap LEDR_EN bit value: 1 =Red LED(&Green) sink circuit enabled*/ ++ u_int8_t pcap_LEDG_en; /*pcap LEDG_EN bit value:1 =Green(->Blue)LED sink circuit enabled*/ ++ u_int8_t pcap_LEDR_CTRL; /* 4bits Sets the timing for the red(&Green) LED sink circuit*/ ++ u_int8_t pcap_LEDG_CTRL; /* 4bits Sets the timing for the GREEN (->Blue) LED sink circuit*/ ++ u_int8_t pcap_LEDR_I; /* 2 bits 00 3mA,01 4mA, 10 5mA, 11 9mA, sets the pulsed current level for LEDR*/ ++ u_int8_t pcap_LEDG_I; /* 2 bits 00 3mA,01 4mA, 10 5mA, 11 9mA, sets the pulsed current level for LEDG*/ ++// u_int8_t pcap_SKIP_on; /*1=The ON timing sequence defined by LEDx_CTRL is executed on every other cycle*/ +} PCAP2_LED_REGISTER_VALUE; + +const PCAP2_LED_REGISTER_VALUE led_register_value[]= +{ -+ /* on/off pulsepower timing intensity */ -+ {0x1,0x1, 0x0,0x0, 0x0,0x0, 0x0,0x0,0x0}, /* OFF */ -+ {0x0,0x1, 0x1,0x0, 0xc,0x0, 0x1,0x0,0x0}, /* RED */ -+ {0x1,0x0, 0x1,0x0, 0xc,0x0, 0x1,0x0,0x0}, /* GREEN */ -+ {0x0,0x0, 0x1,0x0, 0xc,0x0, 0x1,0x0,0x0}, /* ORANGE = RED + GREEN */ -+ {0x1,0x1, 0x0,0x1, 0x0,0xc, 0x0,0x0,0x0}, /* BLUE */ -+ {0x0,0x1, 0x1,0x1, 0xc,0xc, 0x1,0x0,0x0}, /* LIGHT_RED = RED + BLUE */ -+ {0x1,0x0, 0x1,0x1, 0xc,0xc, 0x1,0x0,0x0}, /* LIGHT_GREEN = GREEN + BLUE */ -+ {0x0,0x0, 0x1,0x1, 0xc,0xc, 0x1,0x0,0x0}, /* WHITE = RED + GREEN + BLUE */ ++ {0x1,0x0, 0x0,0x0, 0x0,0x0, 0x1,0x0}, /* 0 OFF */ ++ ++ {0x0,0x0, 0x1,0x0, 0xf,0x0, 0x1,0x0}, /* 1 RED */ ++ {0x1,0x1, 0x1,0x0, 0xf,0x0, 0x1,0x0}, /* 2 GREEN */ ++ {0x0,0x1, 0x1,0x0, 0xf,0x0, 0x1,0x0}, /* 3 ORANGE */ ++ {0x1,0x0, 0x0,0x1, 0x0,0xf, 0x0,0x0}, /* 4 BLUE */ ++ {0x0,0x0, 0x1,0x1, 0xf,0xf, 0x1,0x0}, /* 5 MAGENTA */ ++ {0x1,0x1, 0x1,0x1, 0xf,0xf, 0x1,0x0}, /* 6 CYAN */ ++ {0x0,0x1, 0x1,0x1, 0xf,0xf, 0x1,0x0}, /* 7 WHITE */ +}; + -+static void e680led_led_set( enum led_brightness red, enum led_brightness green, enum led_brightness blue ) ++static void e680led_set(struct led_classdev *led_cdev, enum led_brightness value) +{ -+ unsigned int tempValue = 0; -+ unsigned int value = 0; -+ unsigned int stateIndex = 0; -+ unsigned char gpio_red, gpio_green, ledr_en, ledg_en, ledr_ctrl, ledg_ctrl, ledr_i, ledg_i,skip; -+ -+ printk( KERN_DEBUG "e680led_led_set: red=%d, green=%d, blue=%d", red, green, blue ); -+ stateIndex = ( ( blue << 2 ) | ( green << 1 ) | ( red ) ) & 0x7; -+ printk( KERN_DEBUG "LED stateIndex is %d", stateIndex ); -+ gpio_red = led_register_value[stateIndex].ind_GPIO_red & 0x1; -+ gpio_green = led_register_value[stateIndex].ind_GPIO_green & 0x1; -+ ledr_en = led_register_value[stateIndex].pcap_LEDR_en & 0x1; -+ ledg_en = led_register_value[stateIndex].pcap_LEDG_en & 0x1; -+ ledr_ctrl = led_register_value[stateIndex].pcap_LEDR_CTRL & 0xf; -+ ledg_ctrl = led_register_value[stateIndex].pcap_LEDG_CTRL & 0xf; -+ ledr_i = led_register_value[stateIndex].pcap_LEDR_I & 0x3; -+ ledg_i = led_register_value[stateIndex].pcap_LEDG_I & 0x3; -+ skip = led_register_value[stateIndex].pcap_SKIP_on & 0x1; -+ -+ /* disable LEDs */ -+ if( ezx_pcap_read(SSP_PCAP_ADJ_PERIPH_REGISTER,&tempValue) != SSP_PCAP_SUCCESS ) -+ { -+ printk( KERN_WARNING "LED PCAP Read Failed\n" ); -+ return; ++ unsigned int tempValue; ++ unsigned char gpio_red, gpio_green, ledr_en, ledg_en, ledr_ctrl, ++ ledg_ctrl, ledr_i, ledg_i, skip, t, color; ++ unsigned char t_mask[2] = { 0xc, 0xc }; ++ ++ skip = 0; ++ if (value & 128) { ++ value &= (~128); ++ skip = 1; + } -+ tempValue &= (~SSP_PCAP_LED_MASK); -+ if( ezx_pcap_write(SSP_PCAP_ADJ_PERIPH_REGISTER,tempValue) != SSP_PCAP_SUCCESS ) -+ { -+ printk( KERN_WARNING "LED PCAP Write Failed (Clear Data)\n" ); -+ return; ++ ++ /* 7 colors - simple on */ ++ if (value <= 7) ++ color = value; ++ /* 4 colors - 11 timed on */ ++ else if (value <= 51) { ++ value -= 7; ++ color = ((value-1)%4)+1; ++ t = ((value-1)/4)+1; ++ t_mask[0] = t; ++ t_mask[1] = t; ++ } ++ /* 3 colors - 22 change color */ ++ else if (value <= 84) { ++ value -= 51; ++ color = ((value-1)%3)+5; ++ t = ((value-1)/3)+1; ++ t_mask[1] = t; ++ } ++ else if (value <= 117) { ++ value -= 84; ++ color = ((value-1)%3)+5; ++ t = ((value-1)/3)+1; ++ t_mask[0] = t; + } ++ /* 3 colors - alternate with blue */ ++ else if (value <= 120) { ++ color = value-113; ++ t_mask[0] = 0xa; ++ t_mask[1] = 0xb; ++ } ++ /* invalid value */ ++ else ++ color = 1; + -+ /* configure GPIOs as output */ -+ pxa_gpio_mode(IND_CNTL_R_BUL | GPIO_OUT); -+ pxa_gpio_mode(IND_CNTL_G_BUL | GPIO_OUT); ++ gpio_red = led_register_value[color].ind_GPIO_red; ++ gpio_green = led_register_value[color].ind_GPIO_green; ++ ledr_en = led_register_value[color].pcap_LEDR_en; ++ ledg_en = led_register_value[color].pcap_LEDG_en; ++ ledr_ctrl = led_register_value[color].pcap_LEDR_CTRL & t_mask[0]; ++ ledg_ctrl = led_register_value[color].pcap_LEDG_CTRL & t_mask[1]; ++ ledr_i = led_register_value[color].pcap_LEDR_I; ++ ledg_i = led_register_value[color].pcap_LEDG_I; + -+ //FIXME: Simplify this logic -+ if ( (gpio_green && gpio_red) ) -+ { -+ /*Disable Red & Green signal*/ -+ pxa_gpio_set_value(IND_CNTL_R_BUL, 1); /*IND_CNTL_R_BUL Low active*/ -+ PGSR(IND_CNTL_R_BUL) = PGSR(IND_CNTL_R_BUL) | GPIO_bit(IND_CNTL_R_BUL); -+ -+ pxa_gpio_set_value(IND_CNTL_G_BUL, 0); /*IND_CNTL_G_BUL High active*/ -+ PGSR(IND_CNTL_G_BUL) = PGSR(IND_CNTL_G_BUL) & (~GPIO_bit(IND_CNTL_G_BUL)); -+ -+ printk( KERN_DEBUG "LED GPIO Green & Red Disable\n"); -+ } else if ( gpio_green && !gpio_red ) -+ { -+ /*Green Disable, Red Enable*/ -+ pxa_gpio_set_value(IND_CNTL_R_BUL, 0); -+ PGSR(IND_CNTL_R_BUL) = PGSR(IND_CNTL_R_BUL) & (~GPIO_bit(IND_CNTL_R_BUL)); -+ -+ pxa_gpio_set_value(IND_CNTL_G_BUL, 0); -+ PGSR(IND_CNTL_G_BUL) = PGSR(IND_CNTL_G_BUL) & (~GPIO_bit(IND_CNTL_G_BUL)); -+ -+ printk( KERN_DEBUG "LED GPIO Green Disable, Red Enable\n"); -+ } else if (gpio_red && !gpio_green ) -+ { -+ /*Red Disable, Green Enable*/ -+ pxa_gpio_set_value(IND_CNTL_R_BUL, 1); -+ PGSR(IND_CNTL_R_BUL) = PGSR(IND_CNTL_R_BUL) | GPIO_bit(IND_CNTL_R_BUL); -+ -+ pxa_gpio_set_value(IND_CNTL_G_BUL, 1); -+ PGSR(IND_CNTL_G_BUL) = PGSR(IND_CNTL_G_BUL) | GPIO_bit(IND_CNTL_G_BUL); -+ printk( KERN_DEBUG "LED GPIO Red Disable, Green Enable"); -+ }else -+ { -+ /*Red & Green enable*/ -+ pxa_gpio_set_value(IND_CNTL_R_BUL, 0); -+ PGSR(IND_CNTL_R_BUL) = PGSR(IND_CNTL_R_BUL) & (~GPIO_bit(IND_CNTL_R_BUL)); -+ -+ pxa_gpio_set_value(IND_CNTL_G_BUL, 1); -+ PGSR(IND_CNTL_G_BUL) = PGSR(IND_CNTL_G_BUL) | GPIO_bit(IND_CNTL_G_BUL); -+ printk( KERN_DEBUG "LED GPIO Red & Green Enable\n"); -+ } ++ ezx_pcap_read(SSP_PCAP_ADJ_PERIPH_REGISTER,&tempValue); + -+ /* Write PCAP LED Peripheral Control Register*/ -+ value = ( ledr_en | (ledg_en <<1) | (ledr_ctrl <<2) | (ledg_ctrl <<6) | -+ (ledr_i << 10) | (ledg_i <<12) | (skip <<14) ) & 0x7fff; -+ tempValue |= (value <<SSP_PCAP_LED_SHIFT); -+ -+ if ( ezx_pcap_write(SSP_PCAP_ADJ_PERIPH_REGISTER,tempValue) == SSP_PCAP_SUCCESS ) -+ { -+ printk( KERN_DEBUG "LED PCAP Write Success (0x%x :0x%x)\n",tempValue,value); -+ old_red = red; -+ old_green = green; -+ old_blue = blue; -+ return; -+ } else { -+ printk( KERN_DEBUG "LED PCAP Write Failed (State Change)\n"); -+ return; -+ } -+} ++ tempValue &= (~SSP_PCAP_LED_MASK); + -+static void e680led_red_set(struct led_classdev *led_cdev, enum led_brightness value) -+{ -+ printk( KERN_DEBUG "e680led_red_set: %d\n", value ); -+ e680led_led_set( 1 && value, old_green, old_blue ); -+} ++ pxa_gpio_set_value(IND_CNTL_R_BUL, gpio_red); ++ pxa_gpio_set_value(IND_CNTL_G_BUL, gpio_green); + -+static void e680led_green_set(struct led_classdev *led_cdev, enum led_brightness value) -+{ -+ printk( KERN_DEBUG "e680led_green_set: %d\n", value ); -+ e680led_led_set( old_red, 1 && value, old_blue ); -+} ++ /* Write PCAP LED Peripheral Control Register*/ ++ tempValue = ((ledr_en | (ledg_en << 1) | (ledr_ctrl << 2) | ++ (ledg_ctrl << 6) | (ledr_i << 10) | (ledg_i << 12) | ++ (skip << 14)) & 0x7fff) << SSP_PCAP_LED_SHIFT; + -+static void e680led_blue_set(struct led_classdev *led_cdev, enum led_brightness value) -+{ -+ printk( KERN_DEBUG "e680led_blue_set: %d\n", value ); -+ e680led_led_set( old_red, old_green, 1 && value ); ++ ezx_pcap_write(SSP_PCAP_ADJ_PERIPH_REGISTER,tempValue); +} + +static void e680led_keypad_set(struct led_classdev *led_cdev, enum led_brightness value) @@ -238,25 +191,13 @@ Index: linux-2.6.21/drivers/leds/leds-e680.c +#endif +} + -+static struct led_classdev e680_red_led = { -+ .name = "e680:red", -+ .default_trigger = "none", -+ .brightness_set = e680led_red_set, -+}; -+ -+static struct led_classdev e680_green_led = { -+ .name = "e680:green", ++static struct led_classdev e680_led = { ++ .name = "e680:led", + .default_trigger = "none", -+ .brightness_set = e680led_green_set, ++ .brightness_set = e680led_set, +}; + -+static struct led_classdev e680_blue_led = { -+ .name = "e680:blue", -+ .default_trigger = "none", -+ .brightness_set = e680led_blue_set, -+}; -+ -+static struct led_classdev e680_keypad_led = { ++static struct led_classdev e680_keypad = { + .name = "e680:keypad", + .default_trigger = "none", + .brightness_set = e680led_keypad_set, @@ -265,19 +206,15 @@ Index: linux-2.6.21/drivers/leds/leds-e680.c +#ifdef CONFIG_PM +static int e680led_suspend(struct platform_device *dev, pm_message_t state) +{ -+ led_classdev_suspend(&e680_red_led); -+ led_classdev_suspend(&e680_green_led); -+ led_classdev_suspend(&e680_blue_led); -+ led_classdev_suspend(&e680_keypad_led); ++ led_classdev_suspend(&e680_led); ++ led_classdev_suspend(&e680_keypad); + return 0; +} + +static int e680led_resume(struct platform_device *dev) +{ -+ led_classdev_resume(&e680_red_led); -+ led_classdev_resume(&e680_green_led); -+ led_classdev_resume(&e680_blue_led); -+ led_classdev_resume(&e680_keypad_led); ++ led_classdev_resume(&e680_led); ++ led_classdev_resume(&e680_keypad); + return 0; +} +#endif @@ -286,35 +223,25 @@ Index: linux-2.6.21/drivers/leds/leds-e680.c +{ + int ret; + -+ ret = led_classdev_register(&pdev->dev, &e680_red_led); -+ if (ret < 0) -+ return ret; ++ /* configure GPIOs as output */ ++ pxa_gpio_mode(IND_CNTL_R_BUL | GPIO_OUT); ++ pxa_gpio_mode(IND_CNTL_G_BUL | GPIO_OUT); + -+ ret = led_classdev_register(&pdev->dev, &e680_green_led); ++ ret = led_classdev_register(&pdev->dev, &e680_led); + if (ret < 0) -+ led_classdev_unregister(&e680_red_led); -+ -+ ret = led_classdev_register(&pdev->dev, &e680_blue_led); -+ if (ret < 0) { -+ led_classdev_unregister(&e680_red_led); -+ led_classdev_unregister(&e680_green_led); -+ } ++ return ret; + -+ ret = led_classdev_register(&pdev->dev, &e680_keypad_led); ++ ret = led_classdev_register(&pdev->dev, &e680_keypad); + if (ret < 0) { -+ led_classdev_unregister(&e680_red_led); -+ led_classdev_unregister(&e680_green_led); -+ led_classdev_unregister(&e680_blue_led); ++ led_classdev_unregister(&e680_led); + } + return ret; +} + +static int e680led_remove(struct platform_device *pdev) +{ -+ led_classdev_unregister(&e680_red_led); -+ led_classdev_unregister(&e680_green_led); -+ led_classdev_unregister(&e680_blue_led); -+ led_classdev_unregister(&e680_keypad_led); ++ led_classdev_unregister(&e680_led); ++ led_classdev_unregister(&e680_keypad); + return 0; +} + @@ -337,7 +264,6 @@ Index: linux-2.6.21/drivers/leds/leds-e680.c + +static void __exit e680led_exit(void) +{ -+ e680led_led_set( 0, 0, 0 ); + platform_driver_unregister(&e680led_driver); +} + @@ -349,18 +275,23 @@ Index: linux-2.6.21/drivers/leds/leds-e680.c +MODULE_LICENSE("GPL"); Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c =================================================================== ---- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-06-08 18:38:59.000000000 +0200 -+++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-06-08 18:39:12.000000000 +0200 -@@ -242,9 +242,15 @@ +--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 20:02:32.000000000 -0300 ++++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-08-01 20:04:02.000000000 -0300 +@@ -347,11 +347,20 @@ }, }; +static struct platform_device e680led_device = { + .name = "e680-led", + .id = -1, ++ .dev = { ++ .parent = &e680_pcap_device.dev, ++ }, +}; + static struct platform_device *devices[] __initdata = { + &e680_pcap_device, + &e680_emu_device, &pcap_ts_device, &e680locksw_device, + &e680led_device, |