diff options
Diffstat (limited to 'arch/arm/mach-at91/leds.c')
| -rw-r--r-- | arch/arm/mach-at91/leds.c | 120 |
1 files changed, 26 insertions, 94 deletions
diff --git a/arch/arm/mach-at91/leds.c b/arch/arm/mach-at91/leds.c index 9cdcda500fe..77c4d8fd03f 100644 --- a/arch/arm/mach-at91/leds.c +++ b/arch/arm/mach-at91/leds.c @@ -9,28 +9,27 @@ * 2 of the License, or (at your option) any later version. */ +#include <linux/gpio.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> +#include <linux/platform_device.h> -#include <asm/mach-types.h> -#include <asm/arch/board.h> -#include <asm/arch/gpio.h> +#include "board.h" +#include "gpio.h" /* ------------------------------------------------------------------------- */ #if defined(CONFIG_NEW_LEDS) -#include <linux/platform_device.h> - /* * New cross-platform LED support. */ static struct gpio_led_platform_data led_data; -static struct platform_device at91_leds = { +static struct platform_device at91_gpio_leds_device = { .name = "leds-gpio", .id = -1, .dev.platform_data = &led_data, @@ -48,7 +47,7 @@ void __init at91_gpio_leds(struct gpio_led *leds, int nr) led_data.leds = leds; led_data.num_leds = nr; - platform_device_register(&at91_leds); + platform_device_register(&at91_gpio_leds_device); } #else @@ -58,104 +57,37 @@ void __init at91_gpio_leds(struct gpio_led *leds, int nr) {} /* ------------------------------------------------------------------------- */ -#if defined(CONFIG_LEDS) - -#include <asm/leds.h> - -/* - * Old ARM-specific LED framework; not fully functional when generic time is - * in use. - */ - -static u8 at91_leds_cpu; -static u8 at91_leds_timer; - -static inline void at91_led_on(unsigned int led) -{ - at91_set_gpio_value(led, 0); -} - -static inline void at91_led_off(unsigned int led) -{ - at91_set_gpio_value(led, 1); -} - -static inline void at91_led_toggle(unsigned int led) -{ - unsigned long is_off = at91_get_gpio_value(led); - if (is_off) - at91_led_on(led); - else - at91_led_off(led); -} - +#if defined (CONFIG_LEDS_ATMEL_PWM) /* - * Handle LED events. + * PWM Leds */ -static void at91_leds_event(led_event_t evt) -{ - unsigned long flags; - - local_irq_save(flags); - switch(evt) { - case led_start: /* System startup */ - at91_led_on(at91_leds_cpu); - break; - - case led_stop: /* System stop / suspend */ - at91_led_off(at91_leds_cpu); - break; - -#ifdef CONFIG_LEDS_TIMER - case led_timer: /* Every 50 timer ticks */ - at91_led_toggle(at91_leds_timer); - break; -#endif - -#ifdef CONFIG_LEDS_CPU - case led_idle_start: /* Entering idle state */ - at91_led_off(at91_leds_cpu); - break; - - case led_idle_end: /* Exit idle state */ - at91_led_on(at91_leds_cpu); - break; -#endif - - default: - break; - } - - local_irq_restore(flags); -} +static struct gpio_led_platform_data pwm_led_data; +static struct platform_device at91_pwm_leds_device = { + .name = "leds-atmel-pwm", + .id = -1, + .dev.platform_data = &pwm_led_data, +}; -static int __init leds_init(void) +void __init at91_pwm_leds(struct gpio_led *leds, int nr) { - if (!at91_leds_timer || !at91_leds_cpu) - return -ENODEV; - - leds_event = at91_leds_event; - - leds_event(led_start); - return 0; -} + int i; + u32 pwm_mask = 0; -__initcall(leds_init); + if (!nr) + return; + for (i = 0; i < nr; i++) + pwm_mask |= (1 << leds[i].gpio); -void __init at91_init_leds(u8 cpu_led, u8 timer_led) -{ - /* Enable GPIO to access the LEDs */ - at91_set_gpio_output(cpu_led, 1); - at91_set_gpio_output(timer_led, 1); + pwm_led_data.leds = leds; + pwm_led_data.num_leds = nr; - at91_leds_cpu = cpu_led; - at91_leds_timer = timer_led; + at91_add_device_pwm(pwm_mask); + platform_device_register(&at91_pwm_leds_device); } - #else -void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} +void __init at91_pwm_leds(struct gpio_led *leds, int nr){} #endif |
