diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/configs/at91sam9260ek_defconfig linux-2.6/arch/arm/configs/at91sam9260ek_defconfig --- linux-2.6.20-rc1.orig/arch/arm/configs/at91sam9260ek_defconfig Fri Dec 15 08:35:47 2006 +++ linux-2.6/arch/arm/configs/at91sam9260ek_defconfig Fri Dec 15 08:57:38 2006 @@ -923,7 +923,6 @@ # CONFIG_HEADERS_CHECK is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_DEBUG_USER=y -# CONFIG_DEBUG_WAITQ is not set # CONFIG_DEBUG_ERRORS is not set CONFIG_DEBUG_LL=y # CONFIG_DEBUG_ICEDCC is not set diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/configs/at91sam9261ek_defconfig linux-2.6/arch/arm/configs/at91sam9261ek_defconfig --- linux-2.6.20-rc1.orig/arch/arm/configs/at91sam9261ek_defconfig Fri Dec 15 08:35:47 2006 +++ linux-2.6/arch/arm/configs/at91sam9261ek_defconfig Fri Dec 15 08:57:49 2006 @@ -1079,7 +1079,6 @@ # CONFIG_HEADERS_CHECK is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_DEBUG_USER=y -# CONFIG_DEBUG_WAITQ is not set # CONFIG_DEBUG_ERRORS is not set CONFIG_DEBUG_LL=y # CONFIG_DEBUG_ICEDCC is not set diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/Kconfig linux-2.6/arch/arm/mach-at91rm9200/Kconfig --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/Kconfig Fri Dec 15 08:35:48 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/Kconfig Fri Dec 15 08:59:15 2006 @@ -143,6 +143,13 @@ Select this if you need to program one or more of the PCK0..PCK3 programmable clock outputs. +config AT91_SLOW_CLOCK + bool "Suspend-to-RAM uses slow clock mode (EXPERIMENTAL)" + depends on PM && EXPERIMENTAL + help + Select this if you wish to put the CPU into slow clock mode + while in the "Suspend to RAM" state, to save more power. + endmenu endif diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/Makefile linux-2.6/arch/arm/mach-at91rm9200/Makefile --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/Makefile Fri Dec 15 08:35:48 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/Makefile Thu Nov 16 11:45:54 2006 @@ -8,6 +8,7 @@ obj- := obj-$(CONFIG_PM) += pm.o +obj-$(CONFIG_AT91_SLOW_CLOCK) += pm_slowclock.o # CPU-specific support obj-$(CONFIG_ARCH_AT91RM9200) += at91rm9200.o at91rm9200_time.o at91rm9200_devices.o @@ -41,7 +42,7 @@ obj-$(CONFIG_LEDS) += $(led-y) # VGA support -#obj-$(CONFIG_FB_S1D13XXX) += ics1523.o +obj-$(CONFIG_FB_S1D13XXX) += ics1523.o ifeq ($(CONFIG_PM_DEBUG),y) diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/at91rm9200_devices.c linux-2.6/arch/arm/mach-at91rm9200/at91rm9200_devices.c --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/at91rm9200_devices.c Fri Dec 15 08:35:48 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/at91rm9200_devices.c Tue Dec 12 13:01:13 2006 @@ -128,7 +128,7 @@ #if defined(CONFIG_ARM_AT91_ETHER) || defined(CONFIG_ARM_AT91_ETHER_MODULE) static u64 eth_dmamask = 0xffffffffUL; -static struct at91_eth_data eth_data; +static struct eth_platform_data eth_data; static struct resource eth_resources[] = { [0] = { @@ -155,7 +155,7 @@ .num_resources = ARRAY_SIZE(eth_resources), }; -void __init at91_add_device_eth(struct at91_eth_data *data) +void __init at91_add_device_eth(struct eth_platform_data *data) { if (!data) return; @@ -192,7 +192,7 @@ platform_device_register(&at91rm9200_eth_device); } #else -void __init at91_add_device_eth(struct at91_eth_data *data) {} +void __init at91_add_device_eth(struct eth_platform_data *data) {} #endif @@ -272,7 +272,7 @@ at91_set_A_periph(AT91_PIN_PC12, 0); /* NCS6/CFCE2 */ /* nWAIT is _not_ a default setting */ - at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */ + at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */ cf_data = *data; platform_device_register(&at91rm9200_cf_device); @@ -602,6 +602,32 @@ #endif +#if defined(CONFIG_NEW_LEDS) + +static struct platform_device at91_leds = { + .name = "at91_leds", + .id = -1, +}; + +void __init at91_gpio_leds(struct at91_gpio_led *leds, int nr) +{ + if (!nr) + return; + + at91_leds.dev.platform_data = leds; + + for ( ; nr; nr--, leds++) { + leds->index = nr; /* first record stores number of leds */ + at91_set_gpio_output(leds->gpio, (leds->flags & 1) == 0); + } + + platform_device_register(&at91_leds); +} +#else +void __init at91_gpio_leds(struct at91_gpio_led *leds, int nr) {} +#endif + + /* -------------------------------------------------------------------- * UART * -------------------------------------------------------------------- */ diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/at91sam9260_devices.c linux-2.6/arch/arm/mach-at91rm9200/at91sam9260_devices.c --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/at91sam9260_devices.c Fri Dec 15 08:35:48 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/at91sam9260_devices.c Tue Dec 12 13:01:54 2006 @@ -523,6 +523,32 @@ #endif +#if defined(CONFIG_NEW_LEDS) + +static struct platform_device at91_leds = { + .name = "at91_leds", + .id = -1, +}; + +void __init at91_gpio_leds(struct at91_gpio_led *leds, int nr) +{ + if (!nr) + return; + + at91_leds.dev.platform_data = leds; + + for ( ; nr; nr--, leds++) { + leds->index = nr; /* first record stores number of leds */ + at91_set_gpio_output(leds->gpio, (leds->flags & 1) == 0); + } + + platform_device_register(&at91_leds); +} +#else +void __init at91_gpio_leds(struct at91_gpio_led *leds, int nr) {} +#endif + + /* -------------------------------------------------------------------- * UART * -------------------------------------------------------------------- */ diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/at91sam9261_devices.c linux-2.6/arch/arm/mach-at91rm9200/at91sam9261_devices.c --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/at91sam9261_devices.c Fri Dec 15 08:35:48 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/at91sam9261_devices.c Sat Nov 25 11:14:00 2006 @@ -521,6 +521,32 @@ #endif +#if defined(CONFIG_NEW_LEDS) + +static struct platform_device at91_leds = { + .name = "at91_leds", + .id = -1, +}; + +void __init at91_gpio_leds(struct at91_gpio_led *leds, int nr) +{ + if (!nr) + return; + + at91_leds.dev.platform_data = leds; + + for ( ; nr; nr--, leds++) { + leds->index = nr; /* first record stores number of leds */ + at91_set_gpio_output(leds->gpio, (leds->flags & 1) == 0); + } + + platform_device_register(&at91_leds); +} +#else +void __init at91_gpio_leds(struct at91_gpio_led *leds, int nr) {} +#endif + + /* -------------------------------------------------------------------- * UART * -------------------------------------------------------------------- */ diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-1arm.c linux-2.6/arch/arm/mach-at91rm9200/board-1arm.c --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-1arm.c Fri Dec 15 08:33:10 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/board-1arm.c Thu Nov 23 15:50:12 2006 @@ -64,7 +64,7 @@ at91rm9200_init_interrupts(NULL); } -static struct at91_eth_data __initdata onearm_eth_data = { +static struct eth_platform_data __initdata onearm_eth_data = { .phy_irq_pin = AT91_PIN_PC4, .is_rmii = 1, }; diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-carmeva.c linux-2.6/arch/arm/mach-at91rm9200/board-carmeva.c --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-carmeva.c Fri Dec 15 08:35:48 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/board-carmeva.c Thu Dec 14 14:51:06 2006 @@ -65,7 +65,7 @@ at91rm9200_init_interrupts(NULL); } -static struct at91_eth_data __initdata carmeva_eth_data = { +static struct eth_platform_data __initdata carmeva_eth_data = { .phy_irq_pin = AT91_PIN_PC4, .is_rmii = 1, }; diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-csb337.c linux-2.6/arch/arm/mach-at91rm9200/board-csb337.c --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-csb337.c Fri Dec 15 08:35:48 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/board-csb337.c Thu Nov 23 15:50:12 2006 @@ -68,7 +68,7 @@ at91rm9200_init_interrupts(NULL); } -static struct at91_eth_data __initdata csb337_eth_data = { +static struct eth_platform_data __initdata csb337_eth_data = { .phy_irq_pin = AT91_PIN_PC2, .is_rmii = 0, }; @@ -112,6 +112,23 @@ }, }; +static struct at91_gpio_led csb337_leds[] = { + { + .name = "led0", + .gpio = AT91_PIN_PB0, + .trigger = "heartbeat", + }, + { + .name = "led1", + .gpio = AT91_PIN_PB1, + .trigger = "timer", + }, + { + .name = "led2", + .gpio = AT91_PIN_PB2, + } +}; + static void __init csb337_board_init(void) { /* Serial */ @@ -131,6 +148,8 @@ at91_add_device_spi(csb337_spi_devices, ARRAY_SIZE(csb337_spi_devices)); /* MMC */ at91_add_device_mmc(&csb337_mmc_data); + /* LEDS */ + at91_gpio_leds(csb337_leds, ARRAY_SIZE(csb337_leds)); } MACHINE_START(CSB337, "Cogent CSB337") diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-csb637.c linux-2.6/arch/arm/mach-at91rm9200/board-csb637.c --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-csb637.c Fri Dec 15 08:33:10 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/board-csb637.c Thu Nov 23 15:50:12 2006 @@ -67,7 +67,7 @@ at91rm9200_init_interrupts(NULL); } -static struct at91_eth_data __initdata csb637_eth_data = { +static struct eth_platform_data __initdata csb637_eth_data = { .phy_irq_pin = AT91_PIN_PC0, .is_rmii = 0, }; diff -urN -x CVS linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-dk.c linux-2.6/arch/arm/mach-at91rm9200/board-dk.c --- linux-2.6.20-rc1.orig/arch/arm/mach-at91rm9200/board-dk.c Fri Dec 15 08:35:48 2006 +++ linux-2.6/arch/arm/mach-at91rm9200/board-dk.c Tue Dec 5 09:43:26 2006 @@ -73,7 +73,186 @@ at91rm9200_init_interrupts(NULL); } -static struct at91_eth_data __initdata dk_eth_data = { +#if defined(CONFIG_FB_S1D13XXX) || defined(CONFIG_FB_S1D13XXX_MODULE) +#include