Index: linux-2.6.21.7/arch/arm/mach-at91/board-vlink.c =================================================================== --- linux-2.6.21.7.orig/arch/arm/mach-at91/board-vlink.c +++ linux-2.6.21.7/arch/arm/mach-at91/board-vlink.c @@ -61,7 +61,7 @@ static void __init vlink_map_io(void) at91rm9200_initialize(18432000, AT91RM9200_PQFP); /* Setup the LEDs */ -// at91_init_leds(AT91_PIN_PB1, AT91_PIN_PB2); + at91_init_leds(AT91_PIN_PC14, AT91_PIN_PC15); /* Setup the serial ports and console */ at91_init_serial(&vlink_uart_config); @@ -81,10 +81,12 @@ static struct at91_usbh_data __initdata .ports = 1, }; +/* static struct at91_udc_data __initdata vlink_udc_data = { .vbus_pin = AT91_PIN_PD4, .pullup_pin = AT91_PIN_PD5, }; +*/ static struct at91_mmc_data __initdata vlink_mmc_data = { // .det_pin = AT91_PIN_PB27, @@ -108,18 +110,19 @@ static struct spi_board_info vlink_spi_d #endif }; -static struct at91_gpio_led vlink_leds[] = { +/*static struct at91_gpio_led vlink_leds[] = { { .name = "led0", - .gpio = AT91_PIN_PB1, + .gpio = AT91_PIN_PC14, .trigger = "heartbeat", }, { .name = "led1", - .gpio = AT91_PIN_PB2, + .gpio = AT91_PIN_PC15, .trigger = "timer", } }; +*/ static void __init vlink_board_init(void) { @@ -130,8 +133,8 @@ static void __init vlink_board_init(void /* USB Host */ at91_add_device_usbh(&vlink_usbh_data); /* USB Device */ - at91_add_device_udc(&vlink_udc_data); - at91_set_multi_drive(vlink_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */ +// at91_add_device_udc(&vlink_udc_data); +// at91_set_multi_drive(vlink_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */ /* I2C */ at91_add_device_i2c(); /* SPI */ @@ -145,7 +148,7 @@ static void __init vlink_board_init(void at91_add_device_mmc(0, &vlink_mmc_data); #endif /* LEDs */ - at91_gpio_leds(vlink_leds, ARRAY_SIZE(vlink_leds)); +// at91_gpio_leds(vlink_leds, ARRAY_SIZE(vlink_leds)); } MACHINE_START(VLINK, "FDL VersaLink") Index: linux-2.6.21.7/arch/arm/mach-at91/Makefile =================================================================== --- linux-2.6.21.7.orig/arch/arm/mach-at91/Makefile +++ linux-2.6.21.7/arch/arm/mach-at91/Makefile @@ -52,7 +52,7 @@ led-$(CONFIG_MACH_CSB337) += leds.o led-$(CONFIG_MACH_CSB637) += leds.o led-$(CONFIG_MACH_KB9200) += leds.o led-$(CONFIG_MACH_KAFA) += leds.o -led-$(CONFIG_MACH_VLINK) += leds.o +led-$(CONFIG_MACH_VLINK) += vlink_leds.o obj-$(CONFIG_LEDS) += $(led-y) # VGA support Index: linux-2.6.21.7/arch/arm/mach-at91/vlink_leds.c =================================================================== --- /dev/null +++ linux-2.6.21.7/arch/arm/mach-at91/vlink_leds.c @@ -0,0 +1,105 @@ +/* + * LED driver for Atmel AT91-based boards. + * + * Copyright (C) SAN People (Pty) Ltd + * Modified for FDL VersaLink Copyright (C) Guthrie Consulting + * + * 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. +*/ + +#include +#include +#include + +#include +#include +#include +#include + + +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); + at91_led_off(at91_leds_cpu); + } + else { + at91_led_on(at91_leds_cpu); + at91_led_off(led); + } +} + + +/* + * Handle LED events. + */ + +/* + * VersaLink has a single bi-coloured LED which changes colour when the + * polarity is reversed + */ +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_toggle(at91_leds_timer); + break; + + case led_stop: /* System stop / suspend */ + at91_led_toggle(at91_leds_timer); + 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_toggle(at91_leds_timer); + break; + + case led_idle_end: /* Exit idle state */ + at91_led_toggle(at91_leds_timer); + break; +#endif + + default: + break; + } + + local_irq_restore(flags); +} + + +static int __init leds_init(void) +{ + if (!at91_leds_timer || !at91_leds_cpu) + return -ENODEV; + + leds_event = at91_leds_event; + + leds_event(led_start); + return 0; +} + +__initcall(leds_init);