summaryrefslogtreecommitdiff
path: root/target/linux/avr32/patches/100-git_sync.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/avr32/patches/100-git_sync.patch')
-rw-r--r--target/linux/avr32/patches/100-git_sync.patch6182
1 files changed, 4643 insertions, 1539 deletions
diff --git a/target/linux/avr32/patches/100-git_sync.patch b/target/linux/avr32/patches/100-git_sync.patch
index bfbc8c1..20c08cf 100644
--- a/target/linux/avr32/patches/100-git_sync.patch
+++ b/target/linux/avr32/patches/100-git_sync.patch
@@ -1,184 +1,7 @@
- Documentation/kernel-parameters.txt | 5 +
- MAINTAINERS | 6 +
- Makefile | 2 +-
- arch/arm/mach-at91/at91sam9261_devices.c | 14 +
- arch/arm/mach-at91/at91sam9rl_devices.c | 14 +
- arch/arm/mach-at91/board-sam9261ek.c | 1 +
- arch/arm/mach-at91/board-sam9263ek.c | 1 +
- arch/avr32/Kconfig | 54 +-
- arch/avr32/Kconfig.debug | 10 -
- arch/avr32/Makefile | 4 +-
- arch/avr32/boards/atngw100/Kconfig | 12 +
- arch/avr32/boards/atngw100/setup.c | 14 +-
- arch/avr32/boards/atstk1000/Kconfig | 101 ++-
- arch/avr32/boards/atstk1000/Makefile | 2 +
- arch/avr32/boards/atstk1000/atstk1000.h | 2 +
- arch/avr32/boards/atstk1000/atstk1002.c | 129 +--
- arch/avr32/boards/atstk1000/atstk1003.c | 181 +++
- arch/avr32/boards/atstk1000/atstk1004.c | 152 +++
- arch/avr32/boards/atstk1000/setup.c | 64 +
- arch/avr32/configs/atngw100_defconfig | 423 +++++---
- arch/avr32/configs/atstk1002_defconfig | 661 ++++++++---
- arch/avr32/configs/atstk1003_defconfig | 1032 ++++++++++++++++
- arch/avr32/configs/atstk1004_defconfig | 627 ++++++++++
- arch/avr32/drivers/Makefile | 1 +
- arch/avr32/drivers/dw-dmac.c | 761 ++++++++++++
- arch/avr32/drivers/dw-dmac.h | 42 +
- arch/avr32/kernel/Makefile | 4 +-
- arch/avr32/kernel/cpu.c | 96 ++-
- arch/avr32/kernel/dma-controller.c | 34 +
- arch/avr32/kernel/irq.c | 11 +
- arch/avr32/kernel/kprobes.c | 5 +-
- arch/avr32/kernel/nmi_debug.c | 82 ++
- arch/avr32/kernel/ocd.c | 163 +++
- arch/avr32/kernel/process.c | 5 +-
- arch/avr32/kernel/ptrace.c | 5 +-
- arch/avr32/kernel/setup.c | 2 +
- arch/avr32/kernel/signal.c | 7 -
- arch/avr32/kernel/traps.c | 21 +-
- arch/avr32/mach-at32ap/Kconfig | 19 +-
- arch/avr32/mach-at32ap/Makefile | 5 +-
- arch/avr32/mach-at32ap/at32ap7000.c | 1730 --------------------------
- arch/avr32/mach-at32ap/at32ap700x.c | 1809 ++++++++++++++++++++++++++++
- arch/avr32/mach-at32ap/extint.c | 59 +-
- arch/avr32/mach-at32ap/gpio-dev.c | 573 +++++++++
- arch/avr32/mach-at32ap/pio.c | 76 ++
- arch/avr32/mm/dma-coherent.c | 7 +
- arch/avr32/mm/tlb.c | 2 +-
- arch/avr32/oprofile/Makefile | 8 +
- arch/avr32/oprofile/op_model_avr32.c | 235 ++++
- drivers/i2c/busses/Kconfig | 8 +
- drivers/i2c/busses/Makefile | 1 +
- drivers/i2c/busses/i2c-atmeltwi.c | 436 +++++++
- drivers/i2c/busses/i2c-atmeltwi.h | 117 ++
- drivers/leds/Kconfig | 7 +
- drivers/leds/Makefile | 1 +
- drivers/leds/leds-atmel-pwm.c | 155 +++
- drivers/misc/Kconfig | 9 +
- drivers/misc/Makefile | 1 +
- drivers/misc/atmel_pwm.c | 409 +++++++
- drivers/mmc/host/Kconfig | 10 +
- drivers/mmc/host/Makefile | 1 +
- drivers/mmc/host/atmel-mci.c | 1176 ++++++++++++++++++
- drivers/mmc/host/atmel-mci.h | 192 +++
- drivers/mtd/chips/cfi_cmdset_0001.c | 43 +
- drivers/mtd/chips/cfi_cmdset_0002.c | 6 +-
- drivers/pcmcia/Kconfig | 7 +
- drivers/pcmcia/Makefile | 1 +
- drivers/pcmcia/at32_cf.c | 533 ++++++++
- drivers/serial/Kconfig | 15 +
- drivers/serial/atmel_serial.c | 884 +++++++++++---
- drivers/spi/atmel_spi.c | 173 ++-
- drivers/video/atmel_lcdfb.c | 149 +++-
- drivers/video/backlight/Kconfig | 13 +
- drivers/video/console/Kconfig | 2 +-
- drivers/watchdog/Kconfig | 2 +-
- include/asm-avr32/arch-at32ap/at32ap7000.h | 35 -
- include/asm-avr32/arch-at32ap/at32ap700x.h | 35 +
- include/asm-avr32/arch-at32ap/board.h | 11 +-
- include/asm-avr32/arch-at32ap/cpu.h | 2 +-
- include/asm-avr32/arch-at32ap/io.h | 4 +-
- include/asm-avr32/arch-at32ap/portmux.h | 12 +
- include/asm-avr32/dma-controller.h | 166 +++
- include/asm-avr32/irq.h | 5 +
- include/asm-avr32/kdebug.h | 1 +
- include/asm-avr32/ocd.h | 5 +
- include/asm-avr32/processor.h | 14 +
- include/asm-avr32/ptrace.h | 13 +-
- include/asm-avr32/thread_info.h | 1 +
- include/linux/atmel_pwm.h | 70 ++
- include/video/atmel_lcdc.h | 25 +-
- kernel/ptrace.c | 2 +
- sound/Kconfig | 2 +
- sound/Makefile | 2 +-
- sound/avr32/Kconfig | 11 +
- sound/avr32/Makefile | 3 +
- sound/avr32/ac97c.c | 914 ++++++++++++++
- sound/avr32/ac97c.h | 71 ++
- sound/oss/Kconfig | 4 +
- sound/oss/Makefile | 1 +
- sound/oss/at32_abdac.c | 722 +++++++++++
- sound/oss/at32_abdac.h | 59 +
- 101 files changed, 13294 insertions(+), 2520 deletions(-)
- create mode 100644 arch/avr32/boards/atngw100/Kconfig
- create mode 100644 arch/avr32/boards/atstk1000/atstk1003.c
- create mode 100644 arch/avr32/boards/atstk1000/atstk1004.c
- create mode 100644 arch/avr32/configs/atstk1003_defconfig
- create mode 100644 arch/avr32/configs/atstk1004_defconfig
- create mode 100644 arch/avr32/drivers/Makefile
- create mode 100644 arch/avr32/drivers/dw-dmac.c
- create mode 100644 arch/avr32/drivers/dw-dmac.h
- create mode 100644 arch/avr32/kernel/dma-controller.c
- create mode 100644 arch/avr32/kernel/nmi_debug.c
- create mode 100644 arch/avr32/kernel/ocd.c
- delete mode 100644 arch/avr32/mach-at32ap/at32ap7000.c
- create mode 100644 arch/avr32/mach-at32ap/at32ap700x.c
- create mode 100644 arch/avr32/mach-at32ap/gpio-dev.c
- create mode 100644 arch/avr32/oprofile/Makefile
- create mode 100644 arch/avr32/oprofile/op_model_avr32.c
- create mode 100644 drivers/i2c/busses/i2c-atmeltwi.c
- create mode 100644 drivers/i2c/busses/i2c-atmeltwi.h
- create mode 100644 drivers/leds/leds-atmel-pwm.c
- create mode 100644 drivers/misc/atmel_pwm.c
- create mode 100644 drivers/mmc/host/atmel-mci.c
- create mode 100644 drivers/mmc/host/atmel-mci.h
- create mode 100644 drivers/pcmcia/at32_cf.c
- delete mode 100644 include/asm-avr32/arch-at32ap/at32ap7000.h
- create mode 100644 include/asm-avr32/arch-at32ap/at32ap700x.h
- create mode 100644 include/asm-avr32/dma-controller.h
- create mode 100644 include/linux/atmel_pwm.h
- create mode 100644 sound/avr32/Kconfig
- create mode 100644 sound/avr32/Makefile
- create mode 100644 sound/avr32/ac97c.c
- create mode 100644 sound/avr32/ac97c.h
- create mode 100644 sound/oss/at32_abdac.c
- create mode 100644 sound/oss/at32_abdac.h
-
-diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
-index c417877..17fc60e 100644
---- a/Documentation/kernel-parameters.txt
-+++ b/Documentation/kernel-parameters.txt
-@@ -34,6 +34,7 @@ parameter is applicable:
- ALSA ALSA sound support is enabled.
- APIC APIC support is enabled.
- APM Advanced Power Management support is enabled.
-+ AVR32 AVR32 architecture is enabled.
- AX25 Appropriate AX.25 support is enabled.
- BLACKFIN Blackfin architecture is enabled.
- DRM Direct Rendering Management support is enabled.
-@@ -1123,6 +1124,10 @@ and is between 256 and 4096 characters. It is defined in the file
- of returning the full 64-bit number.
- The default is to return 64-bit inode numbers.
-
-+ nmi_debug= [KNL,AVR32] Specify one or more actions to take
-+ when a NMI is triggered.
-+ Format: [state][,regs][,debounce][,die]
-+
- nmi_watchdog= [KNL,BUGS=X86-32] Debugging features for SMP kernels
-
- no387 [BUGS=X86-32] Tells the kernel to use the 387 maths
-diff --git a/MAINTAINERS b/MAINTAINERS
-index 2340cfb..e349a9e 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -671,6 +671,12 @@ W: http://www.atmel.com/products/AT91/
- W: http://www.at91.com/
- S: Maintained
-
-+ATMEL AT91 / AT32 SERIAL DRIVER
-+P: Haavard Skinnemoen
-+M: hskinnemoen@atmel.com
-+L: linux-kernel@vger.kernel.org
-+S: Supported
-+
- ATMEL LCDFB DRIVER
- P: Nicolas Ferre
- M: nicolas.ferre@atmel.com
-diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c
-index 64979a9..bfa3d18 100644
---- a/arch/arm/mach-at91/at91sam9261_devices.c
-+++ b/arch/arm/mach-at91/at91sam9261_devices.c
-@@ -530,6 +530,20 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
+diff -urN linux-2.6.24.3/arch/arm/mach-at91/at91sam9261_devices.c avr32-2.6/arch/arm/mach-at91/at91sam9261_devices.c
+--- linux-2.6.24.3/arch/arm/mach-at91/at91sam9261_devices.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/arm/mach-at91/at91sam9261_devices.c 2008-04-23 20:12:35.000000000 +0200
+@@ -530,6 +530,20 @@
at91_set_B_periph(AT91_PIN_PB27, 0); /* LCDD22 */
at91_set_B_periph(AT91_PIN_PB28, 0); /* LCDD23 */
@@ -199,11 +22,10 @@ index 64979a9..bfa3d18 100644
lcdc_data = *data;
platform_device_register(&at91_lcdc_device);
}
-diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c
-index 2bd60a3..84ee029 100644
---- a/arch/arm/mach-at91/at91sam9rl_devices.c
-+++ b/arch/arm/mach-at91/at91sam9rl_devices.c
-@@ -375,6 +375,20 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
+diff -urN linux-2.6.24.3/arch/arm/mach-at91/at91sam9rl_devices.c avr32-2.6/arch/arm/mach-at91/at91sam9rl_devices.c
+--- linux-2.6.24.3/arch/arm/mach-at91/at91sam9rl_devices.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/arm/mach-at91/at91sam9rl_devices.c 2008-04-23 20:12:35.000000000 +0200
+@@ -375,6 +375,20 @@
at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */
at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */
@@ -224,11 +46,10 @@ index 2bd60a3..84ee029 100644
lcdc_data = *data;
platform_device_register(&at91_lcdc_device);
}
-diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c
-index 550ae59..0d275bb 100644
---- a/arch/arm/mach-at91/board-sam9261ek.c
-+++ b/arch/arm/mach-at91/board-sam9261ek.c
-@@ -322,6 +322,7 @@ static void at91_lcdc_power_control(int on)
+diff -urN linux-2.6.24.3/arch/arm/mach-at91/board-sam9261ek.c avr32-2.6/arch/arm/mach-at91/board-sam9261ek.c
+--- linux-2.6.24.3/arch/arm/mach-at91/board-sam9261ek.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/arm/mach-at91/board-sam9261ek.c 2008-04-23 20:12:35.000000000 +0200
+@@ -322,6 +322,7 @@
/* Driver datas */
static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
@@ -236,11 +57,10 @@ index 550ae59..0d275bb 100644
.default_bpp = 16,
.default_dmacon = ATMEL_LCDC_DMAEN,
.default_lcdcon2 = AT91SAM9261_DEFAULT_LCDCON2,
-diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c
-index ab9dcc0..39bded2 100644
---- a/arch/arm/mach-at91/board-sam9263ek.c
-+++ b/arch/arm/mach-at91/board-sam9263ek.c
-@@ -250,6 +250,7 @@ static void at91_lcdc_power_control(int on)
+diff -urN linux-2.6.24.3/arch/arm/mach-at91/board-sam9263ek.c avr32-2.6/arch/arm/mach-at91/board-sam9263ek.c
+--- linux-2.6.24.3/arch/arm/mach-at91/board-sam9263ek.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/arm/mach-at91/board-sam9263ek.c 2008-04-23 20:12:35.000000000 +0200
+@@ -250,6 +250,7 @@
/* Driver datas */
static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
@@ -248,169 +68,49 @@ index ab9dcc0..39bded2 100644
.default_bpp = 16,
.default_dmacon = ATMEL_LCDC_DMAEN,
.default_lcdcon2 = AT91SAM9263_DEFAULT_LCDCON2,
-diff --git a/arch/avr32/Kconfig b/arch/avr32/Kconfig
-index b77abce..3f09270 100644
---- a/arch/avr32/Kconfig
-+++ b/arch/avr32/Kconfig
-@@ -54,6 +54,9 @@ config ARCH_HAS_ILOG2_U32
- config ARCH_HAS_ILOG2_U64
- def_bool n
+diff -urN linux-2.6.24.3/arch/arm/mach-at91/Kconfig avr32-2.6/arch/arm/mach-at91/Kconfig
+--- linux-2.6.24.3/arch/arm/mach-at91/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/arm/mach-at91/Kconfig 2008-04-23 20:12:35.000000000 +0200
+@@ -219,6 +219,36 @@
+ Select this if you need to program one or more of the PCK0..PCK3
+ programmable clock outputs.
-+config ARCH_SUPPORTS_OPROFILE
-+ def_bool y
++choice
++ prompt "Select a UART for early kernel messages"
+
- config GENERIC_HWEIGHT
- def_bool y
-
-@@ -81,19 +84,23 @@ config PLATFORM_AT32AP
- select MMU
- select PERFORMANCE_COUNTERS
-
--choice
-- prompt "AVR32 CPU type"
-- default CPU_AT32AP7000
-+#
-+# CPU types
-+#
-
--config CPU_AT32AP7000
-- bool "AT32AP7000"
-+# AP7000 derivatives
-+config CPU_AT32AP700X
-+ bool
- select PLATFORM_AT32AP
--endchoice
--
--#
--# CPU Daughterboards for ATSTK1000
--config BOARD_ATSTK1002
-+config CPU_AT32AP7000
-+ bool
-+ select CPU_AT32AP700X
-+config CPU_AT32AP7001
-+ bool
-+ select CPU_AT32AP700X
-+config CPU_AT32AP7002
- bool
-+ select CPU_AT32AP700X
-
- choice
- prompt "AVR32 board type"
-@@ -101,15 +108,18 @@ choice
-
- config BOARD_ATSTK1000
- bool "ATSTK1000 evaluation board"
-- select BOARD_ATSTK1002 if CPU_AT32AP7000
-
- config BOARD_ATNGW100
- bool "ATNGW100 Network Gateway"
-+ select CPU_AT32AP7000
- endchoice
-
- if BOARD_ATSTK1000
- source "arch/avr32/boards/atstk1000/Kconfig"
- endif
-+if BOARD_ATNGW100
-+source "arch/avr32/boards/atngw100/Kconfig"
-+endif
-
- choice
- prompt "Boot loader type"
-@@ -123,15 +133,15 @@ source "arch/avr32/mach-at32ap/Kconfig"
-
- config LOAD_ADDRESS
- hex
-- default 0x10000000 if LOADER_U_BOOT=y && CPU_AT32AP7000=y
-+ default 0x10000000 if LOADER_U_BOOT=y && CPU_AT32AP700X=y
-
- config ENTRY_ADDRESS
- hex
-- default 0x90000000 if LOADER_U_BOOT=y && CPU_AT32AP7000=y
-+ default 0x90000000 if LOADER_U_BOOT=y && CPU_AT32AP700X=y
-
- config PHYS_OFFSET
- hex
-- default 0x10000000 if CPU_AT32AP7000=y
-+ default 0x10000000 if CPU_AT32AP700X=y
-
- source "kernel/Kconfig.preempt"
-
-@@ -163,6 +173,20 @@ config OWNERSHIP_TRACE
- enabling Nexus-compliant debuggers to keep track of the PID of the
- currently executing task.
-
-+config NMI_DEBUGGING
-+ bool "NMI Debugging"
-+ default n
-+ help
-+ Say Y here and pass the nmi_debug command-line parameter to
-+ the kernel to turn on NMI debugging. Depending on the value
-+ of the nmi_debug option, various pieces of information will
-+ be dumped to the console when a Non-Maskable Interrupt
-+ happens.
++config AT91_EARLY_DBGU
++ bool "DBGU"
+
-+config DW_DMAC
-+ tristate "Synopsys DesignWare DMA Controller support"
-+ default y if CPU_AT32AP7000
++config AT91_EARLY_USART0
++ bool "USART0"
+
- # FPU emulation goes here
-
- source "kernel/Kconfig.hz"
-@@ -219,6 +243,8 @@ source "drivers/Kconfig"
-
- source "fs/Kconfig"
-
-+source "kernel/Kconfig.instrumentation"
++config AT91_EARLY_USART1
++ bool "USART1"
++
++config AT91_EARLY_USART2
++ bool "USART2"
++ depends on ! ARCH_AT91X40
++
++config AT91_EARLY_USART3
++ bool "USART3"
++ depends on (ARCH_AT91RM9200 || ARCH_AT91SAM9RL || ARCH_AT91SAM9260)
++
++config AT91_EARLY_USART4
++ bool "USART4"
++ depends on ARCH_AT91SAM9260
++
++config AT91_EARLY_USART5
++ bool "USART5"
++ depends on ARCH_AT91SAM9260
++
++endchoice
+
- source "arch/avr32/Kconfig.debug"
-
- source "security/Kconfig"
-diff --git a/arch/avr32/Kconfig.debug b/arch/avr32/Kconfig.debug
-index 64ace00..2283933 100644
---- a/arch/avr32/Kconfig.debug
-+++ b/arch/avr32/Kconfig.debug
-@@ -6,14 +6,4 @@ config TRACE_IRQFLAGS_SUPPORT
-
- source "lib/Kconfig.debug"
-
--config KPROBES
-- bool "Kprobes"
-- depends on DEBUG_KERNEL
-- help
-- Kprobes allows you to trap at almost any kernel address and
-- execute a callback function. register_kprobe() establishes
-- a probepoint and specifies the callback. Kprobes is useful
-- for kernel debugging, non-intrusive instrumentation and testing.
-- If in doubt, say "N".
--
endmenu
-diff --git a/arch/avr32/Makefile b/arch/avr32/Makefile
-index 8791864..2d7bacd 100644
---- a/arch/avr32/Makefile
-+++ b/arch/avr32/Makefile
-@@ -16,7 +16,7 @@ KBUILD_AFLAGS += -mrelax -mno-pic
- CFLAGS_MODULE += -mno-relax
- LDFLAGS_vmlinux += --relax
-
--cpuflags-$(CONFIG_CPU_AT32AP7000) += -mcpu=ap7000
-+cpuflags-$(CONFIG_PLATFORM_AT32AP) += -march=ap
-
- KBUILD_CFLAGS += $(cpuflags-y)
- KBUILD_AFLAGS += $(cpuflags-y)
-@@ -31,6 +31,8 @@ core-$(CONFIG_BOARD_ATNGW100) += arch/avr32/boards/atngw100/
- core-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/
- core-y += arch/avr32/kernel/
- core-y += arch/avr32/mm/
-+drivers-$(CONFIG_OPROFILE) += arch/avr32/oprofile/
-+drivers-y += arch/avr32/drivers/
- libs-y += arch/avr32/lib/
- archincdir-$(CONFIG_PLATFORM_AT32AP) := arch-at32ap
-diff --git a/arch/avr32/boards/atngw100/Kconfig b/arch/avr32/boards/atngw100/Kconfig
-new file mode 100644
-index 0000000..5d922df
---- /dev/null
-+++ b/arch/avr32/boards/atngw100/Kconfig
+ endif
+diff -urN linux-2.6.24.3/arch/avr32/boards/atngw100/Kconfig avr32-2.6/arch/avr32/boards/atngw100/Kconfig
+--- linux-2.6.24.3/arch/avr32/boards/atngw100/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/boards/atngw100/Kconfig 2008-04-23 19:33:28.000000000 +0200
@@ -0,0 +1,12 @@
+# NGW100 customization
+
@@ -424,10 +124,9 @@ index 0000000..5d922df
+
+ Choose 'Y' here if you're having i2c-related problems and
+ want to rule out the i2c bus driver.
-diff --git a/arch/avr32/boards/atngw100/setup.c b/arch/avr32/boards/atngw100/setup.c
-index 52987c8..383b825 100644
---- a/arch/avr32/boards/atngw100/setup.c
-+++ b/arch/avr32/boards/atngw100/setup.c
+diff -urN linux-2.6.24.3/arch/avr32/boards/atngw100/setup.c avr32-2.6/arch/avr32/boards/atngw100/setup.c
+--- linux-2.6.24.3/arch/avr32/boards/atngw100/setup.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/boards/atngw100/setup.c 2008-04-23 20:12:35.000000000 +0200
@@ -20,7 +20,7 @@
#include <asm/io.h>
#include <asm/setup.h>
@@ -437,7 +136,13 @@ index 52987c8..383b825 100644
#include <asm/arch/board.h>
#include <asm/arch/init.h>
#include <asm/arch/portmux.h>
-@@ -42,6 +42,11 @@ static struct spi_board_info spi0_board_info[] __initdata = {
+@@ -37,11 +37,16 @@
+ static struct spi_board_info spi0_board_info[] __initdata = {
+ {
+ .modalias = "mtd_dataflash",
+- .max_speed_hz = 10000000,
++ .max_speed_hz = 8000000,
+ .chip_select = 0,
},
};
@@ -449,7 +154,7 @@ index 52987c8..383b825 100644
/*
* The next two functions should go away as the boot loader is
* supposed to initialize the macb address registers with a valid
-@@ -124,6 +129,7 @@ static struct platform_device ngw_gpio_leds = {
+@@ -124,6 +129,7 @@
}
};
@@ -457,7 +162,7 @@ index 52987c8..383b825 100644
static struct i2c_gpio_platform_data i2c_gpio_data = {
.sda_pin = GPIO_PIN_PA(6),
.scl_pin = GPIO_PIN_PA(7),
-@@ -139,6 +145,7 @@ static struct platform_device i2c_gpio_device = {
+@@ -139,6 +145,7 @@
.platform_data = &i2c_gpio_data,
},
};
@@ -465,7 +170,7 @@ index 52987c8..383b825 100644
static int __init atngw100_init(void)
{
-@@ -157,6 +164,7 @@ static int __init atngw100_init(void)
+@@ -157,6 +164,7 @@
set_hw_addr(at32_add_device_eth(1, &eth_data[1]));
at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
@@ -473,7 +178,7 @@ index 52987c8..383b825 100644
at32_add_device_usba(0, NULL);
for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) {
-@@ -165,11 +173,15 @@ static int __init atngw100_init(void)
+@@ -165,11 +173,15 @@
}
platform_device_register(&ngw_gpio_leds);
@@ -484,193 +189,14 @@ index 52987c8..383b825 100644
AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
platform_device_register(&i2c_gpio_device);
+#else
-+ at32_add_device_twi(0);
++ at32_add_device_twi(0, NULL, 0);
+#endif
return 0;
}
-diff --git a/arch/avr32/boards/atstk1000/Kconfig b/arch/avr32/boards/atstk1000/Kconfig
-index 718578f..56a8d8e 100644
---- a/arch/avr32/boards/atstk1000/Kconfig
-+++ b/arch/avr32/boards/atstk1000/Kconfig
-@@ -1,34 +1,53 @@
- # STK1000 customization
-
--if BOARD_ATSTK1002
-+if BOARD_ATSTK1000
-
--config BOARD_ATSTK1002_CUSTOM
-- bool "Non-default STK-1002 jumper settings"
-+choice
-+ prompt "ATSTK1000 CPU daughterboard type"
-+ default BOARD_ATSTK1002
-+
-+config BOARD_ATSTK1002
-+ bool "ATSTK1002"
-+ select CPU_AT32AP7000
-+
-+config BOARD_ATSTK1003
-+ bool "ATSTK1003"
-+ select CPU_AT32AP7001
-+
-+config BOARD_ATSTK1004
-+ bool "ATSTK1004"
-+ select CPU_AT32AP7002
-+
-+endchoice
-+
-+
-+config BOARD_ATSTK100X_CUSTOM
-+ bool "Non-default STK1002/STK1003/STK1004 jumper settings"
- help
- You will normally leave the jumpers on the CPU card at their
- default settings. If you need to use certain peripherals,
- you will need to change some of those jumpers.
-
--if BOARD_ATSTK1002_CUSTOM
-+if BOARD_ATSTK100X_CUSTOM
-
--config BOARD_ATSTK1002_SW1_CUSTOM
-+config BOARD_ATSTK100X_SW1_CUSTOM
- bool "SW1: use SSC1 (not SPI0)"
- help
- This also prevents using the external DAC as an audio interface,
- and means you can't initialize the on-board QVGA display.
-
--config BOARD_ATSTK1002_SW2_CUSTOM
-+config BOARD_ATSTK100X_SW2_CUSTOM
- bool "SW2: use IRDA or TIMER0 (not UART-A, MMC/SD, and PS2-A)"
- help
- If you change this you'll want an updated boot loader putting
- the console on UART-C not UART-A.
-
--config BOARD_ATSTK1002_SW3_CUSTOM
-+config BOARD_ATSTK100X_SW3_CUSTOM
- bool "SW3: use TIMER1 (not SSC0 and GCLK)"
- help
- This also prevents using the external DAC as an audio interface.
-
--config BOARD_ATSTK1002_SW4_CUSTOM
-+config BOARD_ATSTK100X_SW4_CUSTOM
- bool "SW4: use ISI/Camera (not GPIOs, SPI1, and PS2-B)"
- help
- To use the camera interface you'll need a custom card (on the
-@@ -36,27 +55,29 @@ config BOARD_ATSTK1002_SW4_CUSTOM
-
- config BOARD_ATSTK1002_SW5_CUSTOM
- bool "SW5: use MACB1 (not LCDC)"
-+ depends on BOARD_ATSTK1002
-
- config BOARD_ATSTK1002_SW6_CUSTOM
- bool "SW6: more GPIOs (not MACB0)"
-+ depends on BOARD_ATSTK1002
-
- endif # custom
-
--config BOARD_ATSTK1002_SPI1
-+config BOARD_ATSTK100X_SPI1
- bool "Configure SPI1 controller"
-- depends on !BOARD_ATSTK1002_SW4_CUSTOM
-+ depends on !BOARD_ATSTK100X_SW4_CUSTOM
- help
- All the signals for the second SPI controller are available on
- GPIO lines and accessed through the J1 jumper block. Say "y"
- here to configure that SPI controller.
-
--config BOARD_ATSTK1002_J2_LED
-+config BOARD_ATSTK1000_J2_LED
- bool
-- default BOARD_ATSTK1002_J2_LED8 || BOARD_ATSTK1002_J2_RGB
-+ default BOARD_ATSTK1000_J2_LED8 || BOARD_ATSTK1000_J2_RGB
-
- choice
- prompt "LEDs connected to J2:"
-- depends on LEDS_GPIO && !BOARD_ATSTK1002_SW4_CUSTOM
-+ depends on LEDS_GPIO && !BOARD_ATSTK100X_SW4_CUSTOM
- optional
- help
- Select this if you have jumpered the J2 jumper block to the
-@@ -64,16 +85,64 @@ choice
- IDC cable. A default "heartbeat" trigger is provided, but
- you can of course override this.
-
--config BOARD_ATSTK1002_J2_LED8
-+config BOARD_ATSTK1000_J2_LED8
- bool "LED0..LED7"
- help
- Select this if J2 is jumpered to LED0..LED7 amber leds.
-
--config BOARD_ATSTK1002_J2_RGB
-+config BOARD_ATSTK1000_J2_RGB
- bool "RGB leds"
- help
- Select this if J2 is jumpered to the RGB leds.
-
- endchoice
-
--endif # stk 1002
-+config BOARD_ATSTK1000_EXTDAC
-+ bool
-+ depends on !BOARD_ATSTK100X_SW1_CUSTOM && !BOARD_ATSTK100X_SW3_CUSTOM
-+ default y
-+
-+config BOARD_ATSTK100X_ENABLE_AC97
-+ bool "Use AC97C instead of ABDAC"
-+ help
-+ Select this if you want to use the built-in AC97 controller
-+ instead of the built-in Audio Bitstream DAC. These share
-+ the same I/O pins on the AP7000, so both can't be enabled
-+ at the same time.
-+
-+ Note that the STK1000 kit doesn't ship with an AC97 codec on
-+ board, so say N unless you've got an expansion board with an
-+ AC97 codec on it that you want to use.
-+
-+config BOARD_ATSTK1000_CF_HACKS
-+ bool "ATSTK1000 CompactFlash hacks"
-+ depends on !BOARD_ATSTK100X_SW4_CUSTOM
-+ help
-+ Select this if you have re-routed the CompactFlash RESET and
-+ CD signals to GPIOs on your STK1000. This is necessary for
-+ reset and card detection to work properly, although some CF
-+ cards may be able to cope without reset.
-+
-+config BOARD_ATSTK1000_CF_RESET_PIN
-+ hex "CompactFlash RESET pin"
-+ default 0x30
-+ depends on BOARD_ATSTK1000_CF_HACKS
-+ help
-+ Select which GPIO pin to use for the CompactFlash RESET
-+ signal. This is specified as a hexadecimal number and should
-+ be defined as 0x20 * gpio_port + pin.
-+
-+ The default is 0x30, which is pin 16 on PIOB, aka GPIO14.
-+
-+config BOARD_ATSTK1000_CF_DETECT_PIN
-+ hex "CompactFlash DETECT pin"
-+ default 0x3e
-+ depends on BOARD_ATSTK1000_CF_HACKS
-+ help
-+ Select which GPIO pin to use for the CompactFlash CD
-+ signal. This is specified as a hexadecimal number and should
-+ be defined as 0x20 * gpio_port + pin.
-+
-+ The default is 0x3e, which is pin 30 on PIOB, aka GPIO15.
-+
-+endif # stk 1000
-diff --git a/arch/avr32/boards/atstk1000/Makefile b/arch/avr32/boards/atstk1000/Makefile
-index 8e09922..beead86 100644
---- a/arch/avr32/boards/atstk1000/Makefile
-+++ b/arch/avr32/boards/atstk1000/Makefile
-@@ -1,2 +1,4 @@
- obj-y += setup.o flash.o
- obj-$(CONFIG_BOARD_ATSTK1002) += atstk1002.o
-+obj-$(CONFIG_BOARD_ATSTK1003) += atstk1003.o
-+obj-$(CONFIG_BOARD_ATSTK1004) += atstk1004.o
-diff --git a/arch/avr32/boards/atstk1000/atstk1000.h b/arch/avr32/boards/atstk1000/atstk1000.h
-index 9a49ed0..9392d32 100644
---- a/arch/avr32/boards/atstk1000/atstk1000.h
-+++ b/arch/avr32/boards/atstk1000/atstk1000.h
+diff -urN linux-2.6.24.3/arch/avr32/boards/atstk1000/atstk1000.h avr32-2.6/arch/avr32/boards/atstk1000/atstk1000.h
+--- linux-2.6.24.3/arch/avr32/boards/atstk1000/atstk1000.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/boards/atstk1000/atstk1000.h 2008-04-23 19:33:28.000000000 +0200
@@ -12,4 +12,6 @@
extern struct atmel_lcdfb_info atstk1000_lcdc_data;
@@ -678,10 +204,9 @@ index 9a49ed0..9392d32 100644
+void atstk1000_setup_j2_leds(void);
+
#endif /* __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H */
-diff --git a/arch/avr32/boards/atstk1000/atstk1002.c b/arch/avr32/boards/atstk1000/atstk1002.c
-index 5be0d13..90436fa 100644
---- a/arch/avr32/boards/atstk1000/atstk1002.c
-+++ b/arch/avr32/boards/atstk1000/atstk1002.c
+diff -urN linux-2.6.24.3/arch/avr32/boards/atstk1000/atstk1002.c avr32-2.6/arch/avr32/boards/atstk1000/atstk1002.c
+--- linux-2.6.24.3/arch/avr32/boards/atstk1000/atstk1002.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/boards/atstk1000/atstk1002.c 2008-04-23 20:12:35.000000000 +0200
@@ -11,7 +11,6 @@
#include <linux/etherdevice.h>
#include <linux/init.h>
@@ -699,7 +224,7 @@ index 5be0d13..90436fa 100644
#include <asm/arch/board.h>
#include <asm/arch/init.h>
#include <asm/arch/portmux.h>
-@@ -49,18 +48,16 @@ static struct eth_platform_data __initdata eth_data[2] = {
+@@ -49,18 +48,16 @@
},
};
@@ -721,7 +246,7 @@ index 5be0d13..90436fa 100644
{
/* AT73C213 */
.modalias = "at73c213",
-@@ -80,12 +77,25 @@ static struct spi_board_info spi0_board_info[] __initdata = {
+@@ -80,12 +77,25 @@
};
#endif
@@ -748,7 +273,7 @@ index 5be0d13..90436fa 100644
/*
* The next two functions should go away as the boot loader is
* supposed to initialize the macb address registers with a valid
-@@ -141,68 +151,8 @@ static void __init set_hw_addr(struct platform_device *pdev)
+@@ -141,68 +151,8 @@
clk_put(pclk);
}
@@ -819,7 +344,7 @@ index 5be0d13..90436fa 100644
{
struct clk *gclk;
struct clk *pll;
-@@ -220,7 +170,7 @@ static void __init at73c213_set_clk(struct at73c213_board_info *info)
+@@ -220,7 +170,7 @@
}
at32_select_periph(GPIO_PIN_PA(30), GPIO_PERIPH_A, 0);
@@ -828,7 +353,7 @@ index 5be0d13..90436fa 100644
err_set_clk:
clk_put(pll);
-@@ -229,12 +179,16 @@ err_pll:
+@@ -229,12 +179,16 @@
err_gclk:
return;
}
@@ -848,7 +373,7 @@ index 5be0d13..90436fa 100644
at32_map_usart(0, 1); /* USART 0/B: /dev/ttyS1, IRDA */
#else
at32_map_usart(1, 0); /* USART 1/A: /dev/ttyS0, DB9 */
-@@ -271,7 +225,7 @@ static int __init atstk1002_init(void)
+@@ -271,7 +225,7 @@
at32_add_system_devices();
@@ -857,7 +382,7 @@ index 5be0d13..90436fa 100644
at32_add_device_usart(1);
#else
at32_add_device_usart(0);
-@@ -281,12 +235,16 @@ static int __init atstk1002_init(void)
+@@ -281,12 +235,16 @@
#ifndef CONFIG_BOARD_ATSTK1002_SW6_CUSTOM
set_hw_addr(at32_add_device_eth(0, &eth_data[0]));
#endif
@@ -869,46 +394,49 @@ index 5be0d13..90436fa 100644
+#ifdef CONFIG_BOARD_ATSTK100X_SPI1
at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
#endif
-+ at32_add_device_twi(0);
++ at32_add_device_twi(0, NULL, 0);
+#ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
+ at32_add_device_mci(0, NULL);
+#endif
#ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM
set_hw_addr(at32_add_device_eth(1, &eth_data[1]));
#else
-@@ -294,17 +252,18 @@ static int __init atstk1002_init(void)
+@@ -294,18 +252,23 @@
fbmem_start, fbmem_size);
#endif
at32_add_device_usba(0, NULL);
-#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
+- at32_add_device_ssc(0, ATMEL_SSC_TX);
+#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_AC97
+ at32_add_device_ac97c(0);
+#else
+ at32_add_device_abdac(0);
-+#endif
-+#ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM
- at32_add_device_ssc(0, ATMEL_SSC_TX);
#endif
-+ at32_add_device_cf(0, 2, &cf0_data);
-
+-
- setup_j2_leds();
-
-#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
-#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
- at73c213_set_clk(&at73c213_data);
--#endif
--#endif
++#ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM
++ at32_add_device_ssc(0, ATMEL_SSC_TX);
+ #endif
++ at32_add_device_cf(0, 2, &cf0_data);
++#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_PSIF
++ at32_add_device_psif(0);
++ at32_add_device_psif(1);
+ #endif
+
+ atstk1000_setup_j2_leds();
+ atstk1002_setup_extdac();
-
++
return 0;
}
-diff --git a/arch/avr32/boards/atstk1000/atstk1003.c b/arch/avr32/boards/atstk1000/atstk1003.c
-new file mode 100644
-index 0000000..768d204
---- /dev/null
-+++ b/arch/avr32/boards/atstk1000/atstk1003.c
-@@ -0,0 +1,181 @@
+ postcore_initcall(atstk1002_init);
+diff -urN linux-2.6.24.3/arch/avr32/boards/atstk1000/atstk1003.c avr32-2.6/arch/avr32/boards/atstk1000/atstk1003.c
+--- linux-2.6.24.3/arch/avr32/boards/atstk1000/atstk1003.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/boards/atstk1000/atstk1003.c 2008-04-23 20:12:35.000000000 +0200
+@@ -0,0 +1,185 @@
+/*
+ * ATSTK1003 daughterboard-specific init code
+ *
@@ -1083,6 +611,10 @@ index 0000000..768d204
+ at32_add_device_ssc(0, ATMEL_SSC_TX);
+#endif
+ at32_add_device_cf(0, 2, &cf0_data);
++#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_PSIF
++ at32_add_device_psif(0);
++ at32_add_device_psif(1);
++#endif
+
+ atstk1000_setup_j2_leds();
+ atstk1003_setup_extdac();
@@ -1090,12 +622,10 @@ index 0000000..768d204
+ return 0;
+}
+postcore_initcall(atstk1003_init);
-diff --git a/arch/avr32/boards/atstk1000/atstk1004.c b/arch/avr32/boards/atstk1000/atstk1004.c
-new file mode 100644
-index 0000000..96015dd
---- /dev/null
-+++ b/arch/avr32/boards/atstk1000/atstk1004.c
-@@ -0,0 +1,152 @@
+diff -urN linux-2.6.24.3/arch/avr32/boards/atstk1000/atstk1004.c avr32-2.6/arch/avr32/boards/atstk1000/atstk1004.c
+--- linux-2.6.24.3/arch/avr32/boards/atstk1000/atstk1004.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/boards/atstk1000/atstk1004.c 2008-04-23 20:12:35.000000000 +0200
+@@ -0,0 +1,156 @@
+/*
+ * ATSTK1003 daughterboard-specific init code
+ *
@@ -1241,6 +771,10 @@ index 0000000..96015dd
+#ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM
+ at32_add_device_ssc(0, ATMEL_SSC_TX);
+#endif
++#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_PSIF
++ at32_add_device_psif(0);
++ at32_add_device_psif(1);
++#endif
+
+ atstk1000_setup_j2_leds();
+ atstk1004_setup_extdac();
@@ -1248,10 +782,198 @@ index 0000000..96015dd
+ return 0;
+}
+postcore_initcall(atstk1004_init);
-diff --git a/arch/avr32/boards/atstk1000/setup.c b/arch/avr32/boards/atstk1000/setup.c
-index c9af409..8bedf93 100644
---- a/arch/avr32/boards/atstk1000/setup.c
-+++ b/arch/avr32/boards/atstk1000/setup.c
+diff -urN linux-2.6.24.3/arch/avr32/boards/atstk1000/Kconfig avr32-2.6/arch/avr32/boards/atstk1000/Kconfig
+--- linux-2.6.24.3/arch/avr32/boards/atstk1000/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/boards/atstk1000/Kconfig 2008-04-23 20:12:35.000000000 +0200
+@@ -1,34 +1,53 @@
+ # STK1000 customization
+
+-if BOARD_ATSTK1002
++if BOARD_ATSTK1000
+
+-config BOARD_ATSTK1002_CUSTOM
+- bool "Non-default STK-1002 jumper settings"
++choice
++ prompt "ATSTK1000 CPU daughterboard type"
++ default BOARD_ATSTK1002
++
++config BOARD_ATSTK1002
++ bool "ATSTK1002"
++ select CPU_AT32AP7000
++
++config BOARD_ATSTK1003
++ bool "ATSTK1003"
++ select CPU_AT32AP7001
++
++config BOARD_ATSTK1004
++ bool "ATSTK1004"
++ select CPU_AT32AP7002
++
++endchoice
++
++
++config BOARD_ATSTK100X_CUSTOM
++ bool "Non-default STK1002/STK1003/STK1004 jumper settings"
+ help
+ You will normally leave the jumpers on the CPU card at their
+ default settings. If you need to use certain peripherals,
+ you will need to change some of those jumpers.
+
+-if BOARD_ATSTK1002_CUSTOM
++if BOARD_ATSTK100X_CUSTOM
+
+-config BOARD_ATSTK1002_SW1_CUSTOM
++config BOARD_ATSTK100X_SW1_CUSTOM
+ bool "SW1: use SSC1 (not SPI0)"
+ help
+ This also prevents using the external DAC as an audio interface,
+ and means you can't initialize the on-board QVGA display.
+
+-config BOARD_ATSTK1002_SW2_CUSTOM
++config BOARD_ATSTK100X_SW2_CUSTOM
+ bool "SW2: use IRDA or TIMER0 (not UART-A, MMC/SD, and PS2-A)"
+ help
+ If you change this you'll want an updated boot loader putting
+ the console on UART-C not UART-A.
+
+-config BOARD_ATSTK1002_SW3_CUSTOM
++config BOARD_ATSTK100X_SW3_CUSTOM
+ bool "SW3: use TIMER1 (not SSC0 and GCLK)"
+ help
+ This also prevents using the external DAC as an audio interface.
+
+-config BOARD_ATSTK1002_SW4_CUSTOM
++config BOARD_ATSTK100X_SW4_CUSTOM
+ bool "SW4: use ISI/Camera (not GPIOs, SPI1, and PS2-B)"
+ help
+ To use the camera interface you'll need a custom card (on the
+@@ -36,27 +55,29 @@
+
+ config BOARD_ATSTK1002_SW5_CUSTOM
+ bool "SW5: use MACB1 (not LCDC)"
++ depends on BOARD_ATSTK1002
+
+ config BOARD_ATSTK1002_SW6_CUSTOM
+ bool "SW6: more GPIOs (not MACB0)"
++ depends on BOARD_ATSTK1002
+
+ endif # custom
+
+-config BOARD_ATSTK1002_SPI1
++config BOARD_ATSTK100X_SPI1
+ bool "Configure SPI1 controller"
+- depends on !BOARD_ATSTK1002_SW4_CUSTOM
++ depends on !BOARD_ATSTK100X_SW4_CUSTOM
+ help
+ All the signals for the second SPI controller are available on
+ GPIO lines and accessed through the J1 jumper block. Say "y"
+ here to configure that SPI controller.
+
+-config BOARD_ATSTK1002_J2_LED
++config BOARD_ATSTK1000_J2_LED
+ bool
+- default BOARD_ATSTK1002_J2_LED8 || BOARD_ATSTK1002_J2_RGB
++ default BOARD_ATSTK1000_J2_LED8 || BOARD_ATSTK1000_J2_RGB
+
+ choice
+ prompt "LEDs connected to J2:"
+- depends on LEDS_GPIO && !BOARD_ATSTK1002_SW4_CUSTOM
++ depends on LEDS_GPIO && !BOARD_ATSTK100X_SW4_CUSTOM
+ optional
+ help
+ Select this if you have jumpered the J2 jumper block to the
+@@ -64,16 +85,77 @@
+ IDC cable. A default "heartbeat" trigger is provided, but
+ you can of course override this.
+
+-config BOARD_ATSTK1002_J2_LED8
++config BOARD_ATSTK1000_J2_LED8
+ bool "LED0..LED7"
+ help
+ Select this if J2 is jumpered to LED0..LED7 amber leds.
+
+-config BOARD_ATSTK1002_J2_RGB
++config BOARD_ATSTK1000_J2_RGB
+ bool "RGB leds"
+ help
+ Select this if J2 is jumpered to the RGB leds.
+
+ endchoice
+
+-endif # stk 1002
++config BOARD_ATSTK1000_EXTDAC
++ bool
++ depends on !BOARD_ATSTK100X_SW1_CUSTOM && !BOARD_ATSTK100X_SW3_CUSTOM
++ default y
++
++config BOARD_ATSTK100X_ENABLE_AC97
++ bool "Use AC97C instead of ABDAC"
++ help
++ Select this if you want to use the built-in AC97 controller
++ instead of the built-in Audio Bitstream DAC. These share
++ the same I/O pins on the AP7000, so both can't be enabled
++ at the same time.
++
++ Note that the STK1000 kit doesn't ship with an AC97 codec on
++ board, so say N unless you've got an expansion board with an
++ AC97 codec on it that you want to use.
++
++config BOARD_ATSTK1000_CF_HACKS
++ bool "ATSTK1000 CompactFlash hacks"
++ depends on !BOARD_ATSTK100X_SW4_CUSTOM
++ help
++ Select this if you have re-routed the CompactFlash RESET and
++ CD signals to GPIOs on your STK1000. This is necessary for
++ reset and card detection to work properly, although some CF
++ cards may be able to cope without reset.
++
++config BOARD_ATSTK1000_CF_RESET_PIN
++ hex "CompactFlash RESET pin"
++ default 0x30
++ depends on BOARD_ATSTK1000_CF_HACKS
++ help
++ Select which GPIO pin to use for the CompactFlash RESET
++ signal. This is specified as a hexadecimal number and should
++ be defined as 0x20 * gpio_port + pin.
++
++ The default is 0x30, which is pin 16 on PIOB, aka GPIO14.
++
++config BOARD_ATSTK1000_CF_DETECT_PIN
++ hex "CompactFlash DETECT pin"
++ default 0x3e
++ depends on BOARD_ATSTK1000_CF_HACKS
++ help
++ Select which GPIO pin to use for the CompactFlash CD
++ signal. This is specified as a hexadecimal number and should
++ be defined as 0x20 * gpio_port + pin.
++
++ The default is 0x3e, which is pin 30 on PIOB, aka GPIO15.
++
++config BOARD_ATSTK100X_ENABLE_PSIF
++ bool "Enable PSIF peripheral (PS/2 support)"
++ default n
++ help
++ Select this if you want to use the PSIF peripheral to hook up PS/2
++ devices to your STK1000. This will require a hardware modification to
++ work correctly, since PS/2 devices require 5 volt power and signals,
++ while the STK1000 only provides 3.3 volt.
++
++ Say N if you have not modified the hardware to boost the voltage, say
++ Y if you have level convertion hardware or a PS/2 device capable of
++ operating on 3.3 volt.
++
++endif # stk 1000
+diff -urN linux-2.6.24.3/arch/avr32/boards/atstk1000/Makefile avr32-2.6/arch/avr32/boards/atstk1000/Makefile
+--- linux-2.6.24.3/arch/avr32/boards/atstk1000/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/boards/atstk1000/Makefile 2008-04-23 19:33:28.000000000 +0200
+@@ -1,2 +1,4 @@
+ obj-y += setup.o flash.o
+ obj-$(CONFIG_BOARD_ATSTK1002) += atstk1002.o
++obj-$(CONFIG_BOARD_ATSTK1003) += atstk1003.o
++obj-$(CONFIG_BOARD_ATSTK1004) += atstk1004.o
+diff -urN linux-2.6.24.3/arch/avr32/boards/atstk1000/setup.c avr32-2.6/arch/avr32/boards/atstk1000/setup.c
+--- linux-2.6.24.3/arch/avr32/boards/atstk1000/setup.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/boards/atstk1000/setup.c 2008-04-23 19:33:28.000000000 +0200
@@ -10,13 +10,17 @@
#include <linux/bootmem.h>
#include <linux/fb.h>
@@ -1270,7 +992,7 @@ index c9af409..8bedf93 100644
#include "atstk1000.h"
-@@ -61,3 +65,63 @@ struct atmel_lcdfb_info __initdata atstk1000_lcdc_data = {
+@@ -61,3 +65,63 @@
.default_monspecs = &atstk1000_default_monspecs,
.guard_time = 2,
};
@@ -1334,17 +1056,16 @@ index c9af409..8bedf93 100644
+
+}
+#endif /* CONFIG_BOARD_ATSTK1000_J2_LED */
-diff --git a/arch/avr32/configs/atngw100_defconfig b/arch/avr32/configs/atngw100_defconfig
-index b799a68..2ddc6f5 100644
---- a/arch/avr32/configs/atngw100_defconfig
-+++ b/arch/avr32/configs/atngw100_defconfig
-@@ -1,46 +1,51 @@
+diff -urN linux-2.6.24.3/arch/avr32/configs/atngw100_defconfig avr32-2.6/arch/avr32/configs/atngw100_defconfig
+--- linux-2.6.24.3/arch/avr32/configs/atngw100_defconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/configs/atngw100_defconfig 2008-04-23 20:12:35.000000000 +0200
+@@ -1,46 +1,52 @@
#
# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.22-rc5
-# Sat Jun 23 15:40:05 2007
+# Linux kernel version: 2.6.24
-+# Tue Feb 5 16:37:27 2008
++# Thu Mar 6 12:49:54 2008
#
CONFIG_AVR32=y
CONFIG_GENERIC_GPIO=y
@@ -1356,6 +1077,7 @@ index b799a68..2ddc6f5 100644
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
@@ -1399,7 +1121,7 @@ index b799a68..2ddc6f5 100644
CONFIG_SYSFS_DEPRECATED=y
# CONFIG_RELAY is not set
CONFIG_BLK_DEV_INITRD=y
-@@ -61,35 +66,28 @@ CONFIG_FUTEX=y
+@@ -61,35 +67,28 @@
CONFIG_ANON_INODES=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
@@ -1438,7 +1160,15 @@ index b799a68..2ddc6f5 100644
#
# IO Schedulers
-@@ -111,17 +109,20 @@ CONFIG_SUBARCH_AVR32B=y
+@@ -107,21 +106,28 @@
+ #
+ # System Type and features
+ #
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+ CONFIG_SUBARCH_AVR32B=y
CONFIG_MMU=y
CONFIG_PERFORMANCE_COUNTERS=y
CONFIG_PLATFORM_AT32AP=y
@@ -1462,7 +1192,7 @@ index b799a68..2ddc6f5 100644
CONFIG_LOAD_ADDRESS=0x10000000
CONFIG_ENTRY_ADDRESS=0x90000000
CONFIG_PHYS_OFFSET=0x10000000
-@@ -141,10 +142,14 @@ CONFIG_FLATMEM_MANUAL=y
+@@ -141,10 +147,14 @@
CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_SPARSEMEM_STATIC is not set
@@ -1477,7 +1207,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
-@@ -153,13 +158,31 @@ CONFIG_HZ=250
+@@ -153,13 +163,31 @@
CONFIG_CMDLINE=""
#
@@ -1489,7 +1219,7 @@ index b799a68..2ddc6f5 100644
#
-# PCCARD (PCMCIA/CardBus) support
+# CPU Frequency scaling
- #
++#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+# CONFIG_CPU_FREQ_DEBUG is not set
@@ -1507,12 +1237,12 @@ index b799a68..2ddc6f5 100644
+
+#
+# Bus options
-+#
+ #
+# CONFIG_ARCH_SUPPORTS_MSI is not set
# CONFIG_PCCARD is not set
#
-@@ -213,6 +236,7 @@ CONFIG_INET_TUNNEL=y
+@@ -213,6 +241,7 @@
CONFIG_INET_XFRM_MODE_TRANSPORT=y
CONFIG_INET_XFRM_MODE_TUNNEL=y
CONFIG_INET_XFRM_MODE_BEET=y
@@ -1520,7 +1250,7 @@ index b799a68..2ddc6f5 100644
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not set
-@@ -240,6 +264,7 @@ CONFIG_IPV6_SIT=y
+@@ -240,6 +269,7 @@
# CONFIG_NETWORK_SECMARK is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
@@ -1528,7 +1258,7 @@ index b799a68..2ddc6f5 100644
#
# Core Netfilter Configuration
-@@ -252,6 +277,7 @@ CONFIG_NF_CONNTRACK_MARK=y
+@@ -252,6 +282,7 @@
# CONFIG_NF_CONNTRACK_EVENTS is not set
CONFIG_NF_CT_PROTO_GRE=m
# CONFIG_NF_CT_PROTO_SCTP is not set
@@ -1536,7 +1266,7 @@ index b799a68..2ddc6f5 100644
CONFIG_NF_CONNTRACK_AMANDA=m
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
-@@ -269,9 +295,11 @@ CONFIG_NETFILTER_XT_TARGET_MARK=m
+@@ -269,9 +300,11 @@
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
@@ -1548,7 +1278,7 @@ index b799a68..2ddc6f5 100644
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
-@@ -284,6 +312,7 @@ CONFIG_NETFILTER_XT_MATCH_MAC=m
+@@ -284,6 +317,7 @@
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
@@ -1556,7 +1286,7 @@ index b799a68..2ddc6f5 100644
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
-@@ -292,6 +321,8 @@ CONFIG_NETFILTER_XT_MATCH_STATE=m
+@@ -292,6 +326,8 @@
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
@@ -1565,7 +1295,7 @@ index b799a68..2ddc6f5 100644
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
#
-@@ -359,13 +390,19 @@ CONFIG_IP6_NF_TARGET_REJECT=m
+@@ -359,13 +395,19 @@
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_TARGET_HL=m
CONFIG_IP6_NF_RAW=m
@@ -1586,7 +1316,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
-@@ -373,10 +410,6 @@ CONFIG_VLAN_8021Q=m
+@@ -373,10 +415,6 @@
# CONFIG_LAPB is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
@@ -1597,7 +1327,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_NET_SCHED is not set
CONFIG_NET_CLS_ROUTE=y
-@@ -384,6 +417,7 @@ CONFIG_NET_CLS_ROUTE=y
+@@ -384,6 +422,7 @@
# Network testing
#
# CONFIG_NET_PKTGEN is not set
@@ -1605,7 +1335,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
-@@ -397,6 +431,7 @@ CONFIG_NET_CLS_ROUTE=y
+@@ -397,6 +436,7 @@
# CONFIG_MAC80211 is not set
# CONFIG_IEEE80211 is not set
# CONFIG_RFKILL is not set
@@ -1613,7 +1343,7 @@ index b799a68..2ddc6f5 100644
#
# Device Drivers
-@@ -405,16 +440,13 @@ CONFIG_NET_CLS_ROUTE=y
+@@ -405,16 +445,13 @@
#
# Generic Driver Options
#
@@ -1631,7 +1361,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_CONNECTOR is not set
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
-@@ -434,6 +466,7 @@ CONFIG_MTD_BLOCK=y
+@@ -434,6 +471,7 @@
# CONFIG_INFTL is not set
# CONFIG_RFD_FTL is not set
# CONFIG_SSFDC is not set
@@ -1639,7 +1369,7 @@ index b799a68..2ddc6f5 100644
#
# RAM/ROM/Flash chip drivers
-@@ -493,20 +526,8 @@ CONFIG_MTD_DATAFLASH=y
+@@ -493,20 +531,8 @@
# UBI - Unsorted block images
#
# CONFIG_MTD_UBI is not set
@@ -1661,7 +1391,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=m
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-@@ -517,11 +538,7 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
+@@ -517,11 +543,13 @@
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
# CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set
@@ -1670,11 +1400,17 @@ index b799a68..2ddc6f5 100644
-# Misc devices
-#
-# CONFIG_BLINK is not set
-+# CONFIG_MISC_DEVICES is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_ATMEL_PWM is not set
++CONFIG_ATMEL_TCLIB=y
++CONFIG_ATMEL_TCB_CLKSRC=y
++CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_ATMEL_SSC is not set
# CONFIG_IDE is not set
#
-@@ -529,30 +546,42 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+@@ -529,30 +557,42 @@
#
# CONFIG_RAID_ATTRS is not set
# CONFIG_SCSI is not set
@@ -1698,16 +1434,13 @@ index b799a68..2ddc6f5 100644
# CONFIG_EQUALIZER is not set
CONFIG_TUN=m
-# CONFIG_PHYLIB is not set
--
--#
--# Ethernet (10 or 100Mbit)
--#
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=y
-+
-+#
+
+ #
+-# Ethernet (10 or 100Mbit)
+# MII PHY device drivers
-+#
+ #
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
@@ -1731,7 +1464,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_NETDEV_1000 is not set
# CONFIG_NETDEV_10000 is not set
-@@ -571,21 +600,14 @@ CONFIG_PPP_DEFLATE=m
+@@ -571,21 +611,14 @@
CONFIG_PPP_BSDCOMP=m
CONFIG_PPP_MPPE=m
CONFIG_PPPOE=m
@@ -1754,7 +1487,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_PHONE is not set
#
-@@ -615,28 +637,57 @@ CONFIG_SLHC=m
+@@ -615,28 +648,57 @@
#
CONFIG_SERIAL_ATMEL=y
CONFIG_SERIAL_ATMEL_CONSOLE=y
@@ -1775,17 +1508,19 @@ index b799a68..2ddc6f5 100644
# CONFIG_GEN_RTC is not set
# CONFIG_R3964 is not set
# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
+-
+-#
+-# TPM devices
+-#
+ # CONFIG_TCG_TPM is not set
+-# CONFIG_I2C is not set
+CONFIG_I2C=m
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=m
-
- #
--# TPM devices
++
++#
+# I2C Algorithms
- #
--# CONFIG_TCG_TPM is not set
--# CONFIG_I2C is not set
++#
+CONFIG_I2C_ALGOBIT=m
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
@@ -1820,7 +1555,7 @@ index b799a68..2ddc6f5 100644
#
# SPI support
-@@ -655,13 +706,25 @@ CONFIG_SPI_ATMEL=y
+@@ -655,13 +717,25 @@
# SPI Protocol Masters
#
# CONFIG_SPI_AT25 is not set
@@ -1850,7 +1585,7 @@ index b799a68..2ddc6f5 100644
#
# Multifunction device drivers
-@@ -678,23 +741,21 @@ CONFIG_SPI_ATMEL=y
+@@ -678,23 +752,21 @@
#
# Graphics support
#
@@ -1878,16 +1613,12 @@ index b799a68..2ddc6f5 100644
# CONFIG_USB_ARCH_HAS_HCD is not set
# CONFIG_USB_ARCH_HAS_OHCI is not set
# CONFIG_USB_ARCH_HAS_EHCI is not set
-@@ -706,12 +767,48 @@ CONFIG_SPI_ATMEL=y
+@@ -706,12 +778,48 @@
#
# USB Gadget Support
#
-# CONFIG_USB_GADGET is not set
-# CONFIG_MMC is not set
--
--#
--# LED devices
--#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG is not set
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
@@ -1924,24 +1655,21 @@ index b799a68..2ddc6f5 100644
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_BLOCK_BOUNCE is not set
+# CONFIG_SDIO_UART is not set
-+
-+#
+
+ #
+-# LED devices
+# MMC/SD Host Controller Drivers
-+#
+ #
+CONFIG_MMC_ATMELMCI=y
+CONFIG_MMC_SPI=m
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
-@@ -726,53 +823,71 @@ CONFIG_LEDS_GPIO=y
+@@ -726,53 +834,71 @@
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
-
--
--#
--# LED drivers
--#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
@@ -1949,6 +1677,10 @@ index b799a68..2ddc6f5 100644
+# CONFIG_RTC_DEBUG is not set
#
+-# LED drivers
+-#
+-
+-#
-# LED Triggers
-#
-
@@ -2026,7 +1758,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
# CONFIG_FS_POSIX_ACL is not set
-@@ -781,7 +896,8 @@ CONFIG_JBD=y
+@@ -781,7 +907,8 @@
# CONFIG_OCFS2_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set
@@ -2036,7 +1768,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_QUOTA is not set
# CONFIG_DNOTIFY is not set
# CONFIG_AUTOFS_FS is not set
-@@ -814,7 +930,6 @@ CONFIG_SYSFS=y
+@@ -814,7 +941,6 @@
CONFIG_TMPFS=y
# CONFIG_TMPFS_POSIX_ACL is not set
# CONFIG_HUGETLB_PAGE is not set
@@ -2044,7 +1776,7 @@ index b799a68..2ddc6f5 100644
CONFIG_CONFIGFS_FS=y
#
-@@ -830,10 +945,12 @@ CONFIG_CONFIGFS_FS=y
+@@ -830,10 +956,12 @@
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
CONFIG_JFFS2_FS_WRITEBUFFER=y
@@ -2057,7 +1789,7 @@ index b799a68..2ddc6f5 100644
CONFIG_JFFS2_RTIME=y
# CONFIG_JFFS2_RUBIN is not set
# CONFIG_CRAMFS is not set
-@@ -842,19 +959,21 @@ CONFIG_JFFS2_RTIME=y
+@@ -842,19 +970,21 @@
# CONFIG_QNX4FS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
@@ -2084,7 +1816,7 @@ index b799a68..2ddc6f5 100644
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y
# CONFIG_SUNRPC_BIND34 is not set
-@@ -871,23 +990,18 @@ CONFIG_CIFS=m
+@@ -871,23 +1001,18 @@
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set
@@ -2111,7 +1843,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
-@@ -908,7 +1022,7 @@ CONFIG_NLS_CODEPAGE_850=y
+@@ -908,7 +1033,7 @@
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ASCII is not set
@@ -2120,7 +1852,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
-@@ -921,18 +1035,19 @@ CONFIG_NLS_ISO8859_1=y
+@@ -921,18 +1046,19 @@
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
@@ -2146,7 +1878,7 @@ index b799a68..2ddc6f5 100644
CONFIG_ENABLE_MUST_CHECK=y
CONFIG_MAGIC_SYSRQ=y
# CONFIG_UNUSED_SYMBOLS is not set
-@@ -941,12 +1056,17 @@ CONFIG_MAGIC_SYSRQ=y
+@@ -941,12 +1067,17 @@
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
CONFIG_DETECT_SOFTLOCKUP=y
@@ -2164,7 +1896,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_DEBUG_KOBJECT is not set
-@@ -954,21 +1074,21 @@ CONFIG_DEBUG_BUGVERBOSE=y
+@@ -954,21 +1085,21 @@
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_LIST is not set
@@ -2191,7 +1923,7 @@ index b799a68..2ddc6f5 100644
CONFIG_CRYPTO=y
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_BLKCIPHER=y
-@@ -989,6 +1109,7 @@ CONFIG_CRYPTO_ECB=m
+@@ -989,6 +1120,7 @@
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_PCBC=m
# CONFIG_CRYPTO_LRW is not set
@@ -2199,7 +1931,7 @@ index b799a68..2ddc6f5 100644
# CONFIG_CRYPTO_CRYPTD is not set
CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_FCRYPT is not set
-@@ -1002,15 +1123,14 @@ CONFIG_CRYPTO_DES=y
+@@ -1002,15 +1134,14 @@
CONFIG_CRYPTO_ARC4=m
# CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_ANUBIS is not set
@@ -2218,7 +1950,7 @@ index b799a68..2ddc6f5 100644
#
# Library routines
-@@ -1018,8 +1138,9 @@ CONFIG_CRYPTO_DEFLATE=y
+@@ -1018,8 +1149,9 @@
CONFIG_BITREVERSE=y
CONFIG_CRC_CCITT=m
# CONFIG_CRC16 is not set
@@ -2229,17 +1961,16 @@ index b799a68..2ddc6f5 100644
# CONFIG_LIBCRC32C is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
-diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig
-index 3b977fd..46e1c78 100644
---- a/arch/avr32/configs/atstk1002_defconfig
-+++ b/arch/avr32/configs/atstk1002_defconfig
-@@ -1,48 +1,48 @@
+diff -urN linux-2.6.24.3/arch/avr32/configs/atstk1002_defconfig avr32-2.6/arch/avr32/configs/atstk1002_defconfig
+--- linux-2.6.24.3/arch/avr32/configs/atstk1002_defconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/configs/atstk1002_defconfig 2008-04-23 20:12:35.000000000 +0200
+@@ -1,48 +1,49 @@
#
# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.22-rc5
-# Sat Jun 23 15:32:08 2007
+# Linux kernel version: 2.6.24
-+# Tue Feb 5 18:00:06 2008
++# Thu Mar 6 12:49:17 2008
#
CONFIG_AVR32=y
CONFIG_GENERIC_GPIO=y
@@ -2251,6 +1982,7 @@ index 3b977fd..46e1c78 100644
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
@@ -2297,7 +2029,7 @@ index 3b977fd..46e1c78 100644
CONFIG_SYSFS_DEPRECATED=y
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
-@@ -63,35 +63,28 @@ CONFIG_FUTEX=y
+@@ -63,35 +64,28 @@
CONFIG_ANON_INODES=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
@@ -2336,7 +2068,7 @@ index 3b977fd..46e1c78 100644
#
# IO Schedulers
-@@ -99,12 +92,12 @@ CONFIG_BLOCK=y
+@@ -99,32 +93,49 @@
CONFIG_IOSCHED_NOOP=y
# CONFIG_IOSCHED_AS is not set
# CONFIG_IOSCHED_DEADLINE is not set
@@ -2353,7 +2085,12 @@ index 3b977fd..46e1c78 100644
#
# System Type and features
-@@ -113,18 +106,30 @@ CONFIG_SUBARCH_AVR32B=y
+ #
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+ CONFIG_SUBARCH_AVR32B=y
CONFIG_MMU=y
CONFIG_PERFORMANCE_COUNTERS=y
CONFIG_PLATFORM_AT32AP=y
@@ -2373,6 +2110,7 @@ index 3b977fd..46e1c78 100644
+CONFIG_BOARD_ATSTK1000_EXTDAC=y
+# CONFIG_BOARD_ATSTK100X_ENABLE_AC97 is not set
+# CONFIG_BOARD_ATSTK1000_CF_HACKS is not set
++# CONFIG_BOARD_ATSTK100X_ENABLE_PSIF is not set
CONFIG_LOADER_U_BOOT=y
#
@@ -2388,7 +2126,7 @@ index 3b977fd..46e1c78 100644
CONFIG_LOAD_ADDRESS=0x10000000
CONFIG_ENTRY_ADDRESS=0x90000000
CONFIG_PHYS_OFFSET=0x10000000
-@@ -144,10 +149,14 @@ CONFIG_FLATMEM_MANUAL=y
+@@ -144,10 +155,14 @@
CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_SPARSEMEM_STATIC is not set
@@ -2403,7 +2141,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
-@@ -156,13 +165,31 @@ CONFIG_HZ=250
+@@ -156,13 +171,31 @@
CONFIG_CMDLINE=""
#
@@ -2431,14 +2169,14 @@ index 3b977fd..46e1c78 100644
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_AT32AP=y
+
- #
-+# Bus options
+#
++# Bus options
+ #
+# CONFIG_ARCH_SUPPORTS_MSI is not set
# CONFIG_PCCARD is not set
#
-@@ -182,7 +209,12 @@ CONFIG_NET=y
+@@ -182,7 +215,12 @@
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y
@@ -2452,7 +2190,7 @@ index 3b977fd..46e1c78 100644
CONFIG_INET=y
# CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not set
-@@ -191,36 +223,52 @@ CONFIG_IP_PNP=y
+@@ -191,36 +229,52 @@
CONFIG_IP_PNP_DHCP=y
# CONFIG_IP_PNP_BOOTP is not set
# CONFIG_IP_PNP_RARP is not set
@@ -2517,7 +2255,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
-@@ -228,16 +276,13 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+@@ -228,16 +282,13 @@
# CONFIG_LAPB is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
@@ -2535,7 +2273,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
-@@ -251,6 +296,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+@@ -251,6 +302,7 @@
# CONFIG_MAC80211 is not set
# CONFIG_IEEE80211 is not set
# CONFIG_RFKILL is not set
@@ -2543,7 +2281,7 @@ index 3b977fd..46e1c78 100644
#
# Device Drivers
-@@ -259,16 +305,13 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+@@ -259,16 +311,13 @@
#
# Generic Driver Options
#
@@ -2561,7 +2299,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_CONNECTOR is not set
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
-@@ -288,6 +331,7 @@ CONFIG_MTD_BLOCK=y
+@@ -288,6 +337,7 @@
# CONFIG_INFTL is not set
# CONFIG_RFD_FTL is not set
# CONFIG_SSFDC is not set
@@ -2569,7 +2307,7 @@ index 3b977fd..46e1c78 100644
#
# RAM/ROM/Flash chip drivers
-@@ -327,6 +371,8 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+@@ -327,6 +377,8 @@
#
# Self-contained MTD device drivers
#
@@ -2578,7 +2316,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set
-@@ -345,20 +391,8 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+@@ -345,20 +397,8 @@
# UBI - Unsorted block images
#
# CONFIG_MTD_UBI is not set
@@ -2600,7 +2338,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=m
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-@@ -369,42 +403,88 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
+@@ -369,42 +409,91 @@
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
# CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set
@@ -2611,6 +2349,9 @@ index 3b977fd..46e1c78 100644
-# CONFIG_BLINK is not set
+CONFIG_MISC_DEVICES=y
+CONFIG_ATMEL_PWM=m
++CONFIG_ATMEL_TCLIB=y
++CONFIG_ATMEL_TCB_CLKSRC=y
++CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_ATMEL_SSC=m
# CONFIG_IDE is not set
@@ -2639,9 +2380,8 @@ index 3b977fd..46e1c78 100644
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
-
- #
--# Network device support
++
++#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
@@ -2649,10 +2389,11 @@ index 3b977fd..46e1c78 100644
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
-+
+
#
+-# Network device support
+# SCSI Transports
-+#
+ #
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
@@ -2673,16 +2414,13 @@ index 3b977fd..46e1c78 100644
# CONFIG_EQUALIZER is not set
CONFIG_TUN=m
-# CONFIG_PHYLIB is not set
--
--#
--# Ethernet (10 or 100Mbit)
--#
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=y
-+
-+#
+
+ #
+-# Ethernet (10 or 100Mbit)
+# MII PHY device drivers
-+#
+ #
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
@@ -2706,7 +2444,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_NETDEV_1000 is not set
# CONFIG_NETDEV_10000 is not set
-@@ -423,27 +503,54 @@ CONFIG_PPP_DEFLATE=m
+@@ -423,27 +512,54 @@
CONFIG_PPP_BSDCOMP=m
# CONFIG_PPP_MPPE is not set
# CONFIG_PPPOE is not set
@@ -2717,23 +2455,28 @@ index 3b977fd..46e1c78 100644
# CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
+-
+-#
+-# ISDN subsystem
+-#
+ # CONFIG_ISDN is not set
+-
+-#
+-# Telephony Support
+-#
+ # CONFIG_PHONE is not set
#
--# ISDN subsystem
-+# Input device support
+ # Input device support
#
--# CONFIG_ISDN is not set
+-# CONFIG_INPUT is not set
+CONFIG_INPUT=m
+# CONFIG_INPUT_FF_MEMLESS is not set
+CONFIG_INPUT_POLLDEV=m
-
- #
--# Telephony Support
++
++#
+# Userland interfaces
- #
--# CONFIG_PHONE is not set
++#
+CONFIG_INPUT_MOUSEDEV=m
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
@@ -2741,12 +2484,10 @@ index 3b977fd..46e1c78 100644
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=m
+# CONFIG_INPUT_EVBUG is not set
-
- #
--# Input device support
++
++#
+# Input Device Drivers
- #
--# CONFIG_INPUT is not set
++#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
@@ -2767,7 +2508,7 @@ index 3b977fd..46e1c78 100644
#
# Hardware I/O ports
-@@ -467,40 +574,94 @@ CONFIG_SLHC=m
+@@ -467,40 +583,94 @@
#
CONFIG_SERIAL_ATMEL=y
CONFIG_SERIAL_ATMEL_CONSOLE=y
@@ -2792,13 +2533,10 @@ index 3b977fd..46e1c78 100644
+CONFIG_I2C=m
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=m
-
- #
--# TPM devices
++
++#
+# I2C Algorithms
- #
--# CONFIG_TCG_TPM is not set
--# CONFIG_I2C is not set
++#
+CONFIG_I2C_ALGOBIT=m
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
@@ -2832,24 +2570,28 @@ index 3b977fd..46e1c78 100644
+# CONFIG_I2C_DEBUG_CHIP is not set
#
- # SPI support
+-# TPM devices
++# SPI support
#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
+-# CONFIG_TCG_TPM is not set
+-# CONFIG_I2C is not set
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
#
--# Dallas's 1-wire bus
+-# SPI support
+# SPI Master Controller Drivers
-+#
+ #
+-# CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
+CONFIG_SPI_ATMEL=y
+# CONFIG_SPI_BITBANG is not set
-+
+
#
+-# Dallas's 1-wire bus
+# SPI Protocol Masters
-+#
+ #
+# CONFIG_SPI_AT25 is not set
+CONFIG_SPI_SPIDEV=m
+# CONFIG_SPI_TLE62X0 is not set
@@ -2873,7 +2615,7 @@ index 3b977fd..46e1c78 100644
#
# Multifunction device drivers
-@@ -517,23 +678,104 @@ CONFIG_UNIX98_PTYS=y
+@@ -517,23 +687,104 @@
#
# Graphics support
#
@@ -2953,10 +2695,11 @@ index 3b977fd..46e1c78 100644
+# AVR32 devices
+#
+CONFIG_SND_ATMEL_AC97=m
-+
-+#
+
+ #
+-# USB support
+# SPI devices
-+#
+ #
+CONFIG_SND_AT73C213=m
+CONFIG_SND_AT73C213_TARGET_BITRATE=48000
+
@@ -2968,11 +2711,10 @@ index 3b977fd..46e1c78 100644
+#
+# SoC Audio support for SuperH
+#
-
- #
--# USB support
++
++#
+# Open Sound System
- #
++#
+CONFIG_SOUND_PRIME=m
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
@@ -2983,7 +2725,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_USB_ARCH_HAS_HCD is not set
# CONFIG_USB_ARCH_HAS_OHCI is not set
# CONFIG_USB_ARCH_HAS_EHCI is not set
-@@ -545,63 +787,137 @@ CONFIG_UNIX98_PTYS=y
+@@ -545,63 +796,137 @@
#
# USB Gadget Support
#
@@ -3139,7 +2881,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_ROMFS_FS is not set
CONFIG_INOTIFY=y
CONFIG_INOTIFY_USER=y
-@@ -609,7 +925,7 @@ CONFIG_INOTIFY_USER=y
+@@ -609,7 +934,7 @@
# CONFIG_DNOTIFY is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
@@ -3148,7 +2890,7 @@ index 3b977fd..46e1c78 100644
#
# CD-ROM/DVD Filesystems
-@@ -637,8 +953,7 @@ CONFIG_SYSFS=y
+@@ -637,8 +962,7 @@
CONFIG_TMPFS=y
# CONFIG_TMPFS_POSIX_ACL is not set
# CONFIG_HUGETLB_PAGE is not set
@@ -3158,7 +2900,7 @@ index 3b977fd..46e1c78 100644
#
# Miscellaneous filesystems
-@@ -652,11 +967,12 @@ CONFIG_CONFIGFS_FS=m
+@@ -652,11 +976,12 @@
# CONFIG_EFS_FS is not set
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
@@ -3172,7 +2914,7 @@ index 3b977fd..46e1c78 100644
CONFIG_JFFS2_RTIME=y
# CONFIG_JFFS2_RUBIN is not set
# CONFIG_CRAMFS is not set
-@@ -665,10 +981,7 @@ CONFIG_JFFS2_RTIME=y
+@@ -665,10 +990,7 @@
# CONFIG_QNX4FS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
@@ -3184,7 +2926,7 @@ index 3b977fd..46e1c78 100644
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_NFS_V3_ACL is not set
-@@ -688,17 +1001,12 @@ CONFIG_SUNRPC=y
+@@ -688,17 +1010,12 @@
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set
@@ -3202,7 +2944,7 @@ index 3b977fd..46e1c78 100644
CONFIG_NLS=m
CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_NLS_CODEPAGE_437=m
-@@ -739,17 +1047,18 @@ CONFIG_NLS_ISO8859_1=m
+@@ -739,17 +1056,18 @@
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
CONFIG_NLS_UTF8=m
@@ -3226,7 +2968,7 @@ index 3b977fd..46e1c78 100644
CONFIG_ENABLE_MUST_CHECK=y
CONFIG_MAGIC_SYSRQ=y
# CONFIG_UNUSED_SYMBOLS is not set
-@@ -758,12 +1067,17 @@ CONFIG_DEBUG_FS=y
+@@ -758,12 +1076,17 @@
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
CONFIG_DETECT_SOFTLOCKUP=y
@@ -3244,7 +2986,7 @@ index 3b977fd..46e1c78 100644
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_DEBUG_KOBJECT is not set
-@@ -771,22 +1085,63 @@ CONFIG_DEBUG_BUGVERBOSE=y
+@@ -771,22 +1094,63 @@
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_LIST is not set
@@ -3314,7 +3056,7 @@ index 3b977fd..46e1c78 100644
#
# Library routines
-@@ -794,10 +1149,10 @@ CONFIG_FORCED_INLINING=y
+@@ -794,10 +1158,10 @@
CONFIG_BITREVERSE=y
CONFIG_CRC_CCITT=m
# CONFIG_CRC16 is not set
@@ -3327,16 +3069,14 @@ index 3b977fd..46e1c78 100644
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_PLIST=y
-diff --git a/arch/avr32/configs/atstk1003_defconfig b/arch/avr32/configs/atstk1003_defconfig
-new file mode 100644
-index 0000000..d8a6595
---- /dev/null
-+++ b/arch/avr32/configs/atstk1003_defconfig
-@@ -0,0 +1,1032 @@
+diff -urN linux-2.6.24.3/arch/avr32/configs/atstk1003_defconfig avr32-2.6/arch/avr32/configs/atstk1003_defconfig
+--- linux-2.6.24.3/arch/avr32/configs/atstk1003_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/configs/atstk1003_defconfig 2008-04-23 20:12:35.000000000 +0200
+@@ -0,0 +1,1041 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.24
-+# Tue Feb 5 18:08:36 2008
++# Thu Mar 6 12:50:27 2008
+#
+CONFIG_AVR32=y
+CONFIG_GENERIC_GPIO=y
@@ -3348,6 +3088,7 @@ index 0000000..d8a6595
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
@@ -3442,6 +3183,10 @@ index 0000000..d8a6595
+#
+# System Type and features
+#
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_SUBARCH_AVR32B=y
+CONFIG_MMU=y
+CONFIG_PERFORMANCE_COUNTERS=y
@@ -3461,6 +3206,7 @@ index 0000000..d8a6595
+CONFIG_BOARD_ATSTK1000_EXTDAC=y
+# CONFIG_BOARD_ATSTK100X_ENABLE_AC97 is not set
+# CONFIG_BOARD_ATSTK1000_CF_HACKS is not set
++# CONFIG_BOARD_ATSTK100X_ENABLE_PSIF is not set
+CONFIG_LOADER_U_BOOT=y
+
+#
@@ -3721,6 +3467,9 @@ index 0000000..d8a6595
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MISC_DEVICES=y
+CONFIG_ATMEL_PWM=m
++CONFIG_ATMEL_TCLIB=y
++CONFIG_ATMEL_TCB_CLKSRC=y
++CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_ATMEL_SSC=m
+# CONFIG_IDE is not set
@@ -4365,16 +4114,14 @@ index 0000000..d8a6595
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
-diff --git a/arch/avr32/configs/atstk1004_defconfig b/arch/avr32/configs/atstk1004_defconfig
-new file mode 100644
-index 0000000..559b065
---- /dev/null
-+++ b/arch/avr32/configs/atstk1004_defconfig
-@@ -0,0 +1,627 @@
+diff -urN linux-2.6.24.3/arch/avr32/configs/atstk1004_defconfig avr32-2.6/arch/avr32/configs/atstk1004_defconfig
+--- linux-2.6.24.3/arch/avr32/configs/atstk1004_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/configs/atstk1004_defconfig 2008-04-23 20:12:35.000000000 +0200
+@@ -0,0 +1,639 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.24
-+# Tue Feb 5 18:13:33 2008
++# Thu Mar 6 12:51:05 2008
+#
+CONFIG_AVR32=y
+CONFIG_GENERIC_GPIO=y
@@ -4386,6 +4133,7 @@ index 0000000..559b065
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
@@ -4445,6 +4193,10 @@ index 0000000..559b065
+#
+# System Type and features
+#
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_SUBARCH_AVR32B=y
+CONFIG_MMU=y
+CONFIG_PERFORMANCE_COUNTERS=y
@@ -4462,6 +4214,7 @@ index 0000000..559b065
+CONFIG_BOARD_ATSTK1000_EXTDAC=y
+# CONFIG_BOARD_ATSTK100X_ENABLE_AC97 is not set
+# CONFIG_BOARD_ATSTK1000_CF_HACKS is not set
++# CONFIG_BOARD_ATSTK100X_ENABLE_PSIF is not set
+CONFIG_LOADER_U_BOOT=y
+
+#
@@ -4698,7 +4451,13 @@ index 0000000..559b065
+#
+# CONFIG_MTD_UBI is not set
+# CONFIG_PARPORT is not set
-+# CONFIG_MISC_DEVICES is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_ATMEL_PWM is not set
++CONFIG_ATMEL_TCLIB=y
++CONFIG_ATMEL_TCB_CLKSRC=y
++CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_ATMEL_SSC is not set
+
+#
+# SCSI device support
@@ -4998,18 +4757,9 @@ index 0000000..559b065
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
-diff --git a/arch/avr32/drivers/Makefile b/arch/avr32/drivers/Makefile
-new file mode 100644
-index 0000000..b429b75
---- /dev/null
-+++ b/arch/avr32/drivers/Makefile
-@@ -0,0 +1 @@
-+obj-$(CONFIG_DW_DMAC) += dw-dmac.o
-diff --git a/arch/avr32/drivers/dw-dmac.c b/arch/avr32/drivers/dw-dmac.c
-new file mode 100644
-index 0000000..224eb30
---- /dev/null
-+++ b/arch/avr32/drivers/dw-dmac.c
+diff -urN linux-2.6.24.3/arch/avr32/drivers/dw-dmac.c avr32-2.6/arch/avr32/drivers/dw-dmac.c
+--- linux-2.6.24.3/arch/avr32/drivers/dw-dmac.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/drivers/dw-dmac.c 2008-04-23 19:33:28.000000000 +0200
@@ -0,0 +1,761 @@
+/*
+ * Driver for the Synopsys DesignWare DMA Controller
@@ -5772,11 +5522,9 @@ index 0000000..224eb30
+MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller driver");
+MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
+MODULE_LICENSE("GPL");
-diff --git a/arch/avr32/drivers/dw-dmac.h b/arch/avr32/drivers/dw-dmac.h
-new file mode 100644
-index 0000000..1f67921
---- /dev/null
-+++ b/arch/avr32/drivers/dw-dmac.h
+diff -urN linux-2.6.24.3/arch/avr32/drivers/dw-dmac.h avr32-2.6/arch/avr32/drivers/dw-dmac.h
+--- linux-2.6.24.3/arch/avr32/drivers/dw-dmac.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/drivers/dw-dmac.h 2008-04-23 19:33:28.000000000 +0200
@@ -0,0 +1,42 @@
+/*
+ * Driver for the Synopsys DesignWare DMA Controller
@@ -5820,27 +5568,167 @@ index 0000000..1f67921
+#define DW_DMAC_CHAN_DSR 0x050
+
+#endif /* __AVR32_DW_DMAC_H__ */
-diff --git a/arch/avr32/kernel/Makefile b/arch/avr32/kernel/Makefile
-index 2d6d48f..88226b6 100644
---- a/arch/avr32/kernel/Makefile
-+++ b/arch/avr32/kernel/Makefile
-@@ -6,9 +6,11 @@ extra-y := head.o vmlinux.lds
+diff -urN linux-2.6.24.3/arch/avr32/drivers/Makefile avr32-2.6/arch/avr32/drivers/Makefile
+--- linux-2.6.24.3/arch/avr32/drivers/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/drivers/Makefile 2008-04-23 19:33:28.000000000 +0200
+@@ -0,0 +1 @@
++obj-$(CONFIG_DW_DMAC) += dw-dmac.o
+diff -urN linux-2.6.24.3/arch/avr32/Kconfig avr32-2.6/arch/avr32/Kconfig
+--- linux-2.6.24.3/arch/avr32/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/Kconfig 2008-04-23 20:12:35.000000000 +0200
+@@ -45,6 +45,9 @@
+ config GENERIC_TIME
+ def_bool y
- obj-$(CONFIG_SUBARCH_AVR32B) += entry-avr32b.o
- obj-y += syscall_table.o syscall-stubs.o irq.o
--obj-y += setup.o traps.o semaphore.o ptrace.o
-+obj-y += setup.o traps.o semaphore.o ocd.o ptrace.o
- obj-y += signal.o sys_avr32.o process.o time.o
- obj-y += init_task.o switch_to.o cpu.o
-+obj-y += dma-controller.o
- obj-$(CONFIG_MODULES) += module.o avr32_ksyms.o
- obj-$(CONFIG_KPROBES) += kprobes.o
- obj-$(CONFIG_STACKTRACE) += stacktrace.o
-+obj-$(CONFIG_NMI_DEBUGGING) += nmi_debug.o
-diff --git a/arch/avr32/kernel/cpu.c b/arch/avr32/kernel/cpu.c
-index 2714cf6..b8409ca 100644
---- a/arch/avr32/kernel/cpu.c
-+++ b/arch/avr32/kernel/cpu.c
++config GENERIC_CLOCKEVENTS
++ def_bool y
++
+ config RWSEM_XCHGADD_ALGORITHM
+ def_bool n
+
+@@ -54,6 +57,9 @@
+ config ARCH_HAS_ILOG2_U64
+ def_bool n
+
++config ARCH_SUPPORTS_OPROFILE
++ def_bool y
++
+ config GENERIC_HWEIGHT
+ def_bool y
+
+@@ -68,6 +74,8 @@
+
+ menu "System Type and features"
+
++source "kernel/time/Kconfig"
++
+ config SUBARCH_AVR32B
+ bool
+ config MMU
+@@ -81,19 +89,23 @@
+ select MMU
+ select PERFORMANCE_COUNTERS
+
+-choice
+- prompt "AVR32 CPU type"
+- default CPU_AT32AP7000
++#
++# CPU types
++#
+
+-config CPU_AT32AP7000
+- bool "AT32AP7000"
++# AP7000 derivatives
++config CPU_AT32AP700X
++ bool
+ select PLATFORM_AT32AP
+-endchoice
+-
+-#
+-# CPU Daughterboards for ATSTK1000
+-config BOARD_ATSTK1002
++config CPU_AT32AP7000
++ bool
++ select CPU_AT32AP700X
++config CPU_AT32AP7001
++ bool
++ select CPU_AT32AP700X
++config CPU_AT32AP7002
+ bool
++ select CPU_AT32AP700X
+
+ choice
+ prompt "AVR32 board type"
+@@ -101,15 +113,18 @@
+
+ config BOARD_ATSTK1000
+ bool "ATSTK1000 evaluation board"
+- select BOARD_ATSTK1002 if CPU_AT32AP7000
+
+ config BOARD_ATNGW100
+ bool "ATNGW100 Network Gateway"
++ select CPU_AT32AP7000
+ endchoice
+
+ if BOARD_ATSTK1000
+ source "arch/avr32/boards/atstk1000/Kconfig"
+ endif
++if BOARD_ATNGW100
++source "arch/avr32/boards/atngw100/Kconfig"
++endif
+
+ choice
+ prompt "Boot loader type"
+@@ -123,15 +138,15 @@
+
+ config LOAD_ADDRESS
+ hex
+- default 0x10000000 if LOADER_U_BOOT=y && CPU_AT32AP7000=y
++ default 0x10000000 if LOADER_U_BOOT=y && CPU_AT32AP700X=y
+
+ config ENTRY_ADDRESS
+ hex
+- default 0x90000000 if LOADER_U_BOOT=y && CPU_AT32AP7000=y
++ default 0x90000000 if LOADER_U_BOOT=y && CPU_AT32AP700X=y
+
+ config PHYS_OFFSET
+ hex
+- default 0x10000000 if CPU_AT32AP7000=y
++ default 0x10000000 if CPU_AT32AP700X=y
+
+ source "kernel/Kconfig.preempt"
+
+@@ -163,6 +178,20 @@
+ enabling Nexus-compliant debuggers to keep track of the PID of the
+ currently executing task.
+
++config NMI_DEBUGGING
++ bool "NMI Debugging"
++ default n
++ help
++ Say Y here and pass the nmi_debug command-line parameter to
++ the kernel to turn on NMI debugging. Depending on the value
++ of the nmi_debug option, various pieces of information will
++ be dumped to the console when a Non-Maskable Interrupt
++ happens.
++
++config DW_DMAC
++ tristate "Synopsys DesignWare DMA Controller support"
++ default y if CPU_AT32AP7000
++
+ # FPU emulation goes here
+
+ source "kernel/Kconfig.hz"
+@@ -219,6 +248,8 @@
+
+ source "fs/Kconfig"
+
++source "kernel/Kconfig.instrumentation"
++
+ source "arch/avr32/Kconfig.debug"
+
+ source "security/Kconfig"
+diff -urN linux-2.6.24.3/arch/avr32/Kconfig.debug avr32-2.6/arch/avr32/Kconfig.debug
+--- linux-2.6.24.3/arch/avr32/Kconfig.debug 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/Kconfig.debug 2008-04-23 19:33:28.000000000 +0200
+@@ -6,14 +6,4 @@
+
+ source "lib/Kconfig.debug"
+
+-config KPROBES
+- bool "Kprobes"
+- depends on DEBUG_KERNEL
+- help
+- Kprobes allows you to trap at almost any kernel address and
+- execute a callback function. register_kprobe() establishes
+- a probepoint and specifies the callback. Kprobes is useful
+- for kernel debugging, non-intrusive instrumentation and testing.
+- If in doubt, say "N".
+-
+ endmenu
+diff -urN linux-2.6.24.3/arch/avr32/kernel/cpu.c avr32-2.6/arch/avr32/kernel/cpu.c
+--- linux-2.6.24.3/arch/avr32/kernel/cpu.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/cpu.c 2008-04-23 19:33:28.000000000 +0200
@@ -13,6 +13,7 @@
#include <linux/percpu.h>
#include <linux/param.h>
@@ -5849,7 +5737,7 @@ index 2714cf6..b8409ca 100644
#include <asm/setup.h>
#include <asm/sysreg.h>
-@@ -187,9 +188,20 @@ static int __init topology_init(void)
+@@ -187,9 +188,20 @@
subsys_initcall(topology_init);
@@ -5871,7 +5759,7 @@ index 2714cf6..b8409ca 100644
};
#define NR_CPU_NAMES ARRAY_SIZE(cpu_names)
-@@ -206,12 +218,32 @@ static const char *mmu_types[] = {
+@@ -206,12 +218,32 @@
"MPU"
};
@@ -5904,7 +5792,7 @@ index 2714cf6..b8409ca 100644
config0 = sysreg_read(CONFIG0);
config1 = sysreg_read(CONFIG1);
-@@ -221,11 +253,14 @@ void __init setup_processor(void)
+@@ -221,11 +253,14 @@
arch_rev = SYSREG_BFEXT(AR, config0);
mmu_type = SYSREG_BFEXT(MMUT, config0);
@@ -5919,7 +5807,7 @@ index 2714cf6..b8409ca 100644
tmp = SYSREG_BFEXT(ILSZ, config1);
if (tmp) {
-@@ -247,41 +282,34 @@ void __init setup_processor(void)
+@@ -247,41 +282,34 @@
return;
}
@@ -5976,7 +5864,7 @@ index 2714cf6..b8409ca 100644
printk("\n");
boot_cpu_data.features = features;
}
-@@ -291,6 +319,8 @@ static int c_show(struct seq_file *m, void *v)
+@@ -291,6 +319,8 @@
{
unsigned int icache_size, dcache_size;
unsigned int cpu = smp_processor_id();
@@ -5985,7 +5873,7 @@ index 2714cf6..b8409ca 100644
icache_size = boot_cpu_data.icache.ways *
boot_cpu_data.icache.sets *
-@@ -301,15 +331,21 @@ static int c_show(struct seq_file *m, void *v)
+@@ -301,15 +331,21 @@
seq_printf(m, "processor\t: %d\n", cpu);
@@ -6009,7 +5897,7 @@ index 2714cf6..b8409ca 100644
seq_printf(m, "i-cache\t\t: %dK (%u ways x %u sets x %u)\n",
icache_size >> 10,
boot_cpu_data.icache.ways,
-@@ -320,7 +356,13 @@ static int c_show(struct seq_file *m, void *v)
+@@ -320,7 +356,13 @@
boot_cpu_data.dcache.ways,
boot_cpu_data.dcache.sets,
boot_cpu_data.dcache.linesz);
@@ -6024,7 +5912,7 @@ index 2714cf6..b8409ca 100644
boot_cpu_data.loops_per_jiffy / (500000/HZ),
(boot_cpu_data.loops_per_jiffy / (5000/HZ)) % 100);
-@@ -343,7 +385,7 @@ static void c_stop(struct seq_file *m, void *v)
+@@ -343,7 +385,7 @@
}
@@ -6033,11 +5921,9 @@ index 2714cf6..b8409ca 100644
.start = c_start,
.next = c_next,
.stop = c_stop,
-diff --git a/arch/avr32/kernel/dma-controller.c b/arch/avr32/kernel/dma-controller.c
-new file mode 100644
-index 0000000..fb654b3
---- /dev/null
-+++ b/arch/avr32/kernel/dma-controller.c
+diff -urN linux-2.6.24.3/arch/avr32/kernel/dma-controller.c avr32-2.6/arch/avr32/kernel/dma-controller.c
+--- linux-2.6.24.3/arch/avr32/kernel/dma-controller.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/dma-controller.c 2008-04-23 19:33:28.000000000 +0200
@@ -0,0 +1,34 @@
+/*
+ * Preliminary DMA controller framework for AVR32
@@ -6073,11 +5959,40 @@ index 0000000..fb654b3
+ return NULL;
+}
+EXPORT_SYMBOL(find_dma_controller);
-diff --git a/arch/avr32/kernel/irq.c b/arch/avr32/kernel/irq.c
-index 61f2de2..a8e767d 100644
---- a/arch/avr32/kernel/irq.c
-+++ b/arch/avr32/kernel/irq.c
-@@ -25,6 +25,17 @@ void ack_bad_irq(unsigned int irq)
+diff -urN linux-2.6.24.3/arch/avr32/kernel/entry-avr32b.S avr32-2.6/arch/avr32/kernel/entry-avr32b.S
+--- linux-2.6.24.3/arch/avr32/kernel/entry-avr32b.S 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/entry-avr32b.S 2008-04-23 20:12:35.000000000 +0200
+@@ -741,26 +741,6 @@
+
+ .section .irq.text,"ax",@progbits
+
+-.global cpu_idle_sleep
+-cpu_idle_sleep:
+- mask_interrupts
+- get_thread_info r8
+- ld.w r9, r8[TI_flags]
+- bld r9, TIF_NEED_RESCHED
+- brcs cpu_idle_enable_int_and_exit
+- sbr r9, TIF_CPU_GOING_TO_SLEEP
+- st.w r8[TI_flags], r9
+- unmask_interrupts
+- sleep 0
+-cpu_idle_skip_sleep:
+- mask_interrupts
+- ld.w r9, r8[TI_flags]
+- cbr r9, TIF_CPU_GOING_TO_SLEEP
+- st.w r8[TI_flags], r9
+-cpu_idle_enable_int_and_exit:
+- unmask_interrupts
+- retal r12
+-
+ .global irq_level0
+ .global irq_level1
+ .global irq_level2
+diff -urN linux-2.6.24.3/arch/avr32/kernel/irq.c avr32-2.6/arch/avr32/kernel/irq.c
+--- linux-2.6.24.3/arch/avr32/kernel/irq.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/irq.c 2008-04-23 19:33:28.000000000 +0200
+@@ -25,6 +25,17 @@
printk("unexpected IRQ %u\n", irq);
}
@@ -6095,11 +6010,10 @@ index 61f2de2..a8e767d 100644
#ifdef CONFIG_PROC_FS
int show_interrupts(struct seq_file *p, void *v)
{
-diff --git a/arch/avr32/kernel/kprobes.c b/arch/avr32/kernel/kprobes.c
-index 799ba89..f820e9f 100644
---- a/arch/avr32/kernel/kprobes.c
-+++ b/arch/avr32/kernel/kprobes.c
-@@ -48,6 +48,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
+diff -urN linux-2.6.24.3/arch/avr32/kernel/kprobes.c avr32-2.6/arch/avr32/kernel/kprobes.c
+--- linux-2.6.24.3/arch/avr32/kernel/kprobes.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/kprobes.c 2008-04-23 19:33:28.000000000 +0200
+@@ -48,6 +48,7 @@
void __kprobes arch_arm_kprobe(struct kprobe *p)
{
pr_debug("arming kprobe at %p\n", p->addr);
@@ -6107,7 +6021,7 @@ index 799ba89..f820e9f 100644
*p->addr = BREAKPOINT_INSTRUCTION;
flush_icache_range((unsigned long)p->addr,
(unsigned long)p->addr + sizeof(kprobe_opcode_t));
-@@ -56,6 +57,7 @@ void __kprobes arch_arm_kprobe(struct kprobe *p)
+@@ -56,6 +57,7 @@
void __kprobes arch_disarm_kprobe(struct kprobe *p)
{
pr_debug("disarming kprobe at %p\n", p->addr);
@@ -6115,7 +6029,7 @@ index 799ba89..f820e9f 100644
*p->addr = p->opcode;
flush_icache_range((unsigned long)p->addr,
(unsigned long)p->addr + sizeof(kprobe_opcode_t));
-@@ -260,9 +262,6 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
+@@ -260,9 +262,6 @@
int __init arch_init_kprobes(void)
{
@@ -6125,11 +6039,25 @@ index 799ba89..f820e9f 100644
/* TODO: Register kretprobe trampoline */
return 0;
}
-diff --git a/arch/avr32/kernel/nmi_debug.c b/arch/avr32/kernel/nmi_debug.c
-new file mode 100644
-index 0000000..3414b85
---- /dev/null
-+++ b/arch/avr32/kernel/nmi_debug.c
+diff -urN linux-2.6.24.3/arch/avr32/kernel/Makefile avr32-2.6/arch/avr32/kernel/Makefile
+--- linux-2.6.24.3/arch/avr32/kernel/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/Makefile 2008-04-23 19:33:28.000000000 +0200
+@@ -6,9 +6,11 @@
+
+ obj-$(CONFIG_SUBARCH_AVR32B) += entry-avr32b.o
+ obj-y += syscall_table.o syscall-stubs.o irq.o
+-obj-y += setup.o traps.o semaphore.o ptrace.o
++obj-y += setup.o traps.o semaphore.o ocd.o ptrace.o
+ obj-y += signal.o sys_avr32.o process.o time.o
+ obj-y += init_task.o switch_to.o cpu.o
++obj-y += dma-controller.o
+ obj-$(CONFIG_MODULES) += module.o avr32_ksyms.o
+ obj-$(CONFIG_KPROBES) += kprobes.o
+ obj-$(CONFIG_STACKTRACE) += stacktrace.o
++obj-$(CONFIG_NMI_DEBUGGING) += nmi_debug.o
+diff -urN linux-2.6.24.3/arch/avr32/kernel/nmi_debug.c avr32-2.6/arch/avr32/kernel/nmi_debug.c
+--- linux-2.6.24.3/arch/avr32/kernel/nmi_debug.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/nmi_debug.c 2008-04-23 19:33:28.000000000 +0200
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2007 Atmel Corporation
@@ -6213,11 +6141,9 @@ index 0000000..3414b85
+ return 0;
+}
+__setup("nmi_debug", nmi_debug_setup);
-diff --git a/arch/avr32/kernel/ocd.c b/arch/avr32/kernel/ocd.c
-new file mode 100644
-index 0000000..c4f0232
---- /dev/null
-+++ b/arch/avr32/kernel/ocd.c
+diff -urN linux-2.6.24.3/arch/avr32/kernel/ocd.c avr32-2.6/arch/avr32/kernel/ocd.c
+--- linux-2.6.24.3/arch/avr32/kernel/ocd.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/ocd.c 2008-04-23 19:33:28.000000000 +0200
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2007 Atmel Corporation
@@ -6382,11 +6308,42 @@ index 0000000..c4f0232
+ return 0;
+}
+arch_initcall(ocd_init);
-diff --git a/arch/avr32/kernel/process.c b/arch/avr32/kernel/process.c
-index 9d6dac8..eaaa69b 100644
---- a/arch/avr32/kernel/process.c
-+++ b/arch/avr32/kernel/process.c
-@@ -103,7 +103,7 @@ EXPORT_SYMBOL(kernel_thread);
+diff -urN linux-2.6.24.3/arch/avr32/kernel/process.c avr32-2.6/arch/avr32/kernel/process.c
+--- linux-2.6.24.3/arch/avr32/kernel/process.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/process.c 2008-04-23 20:12:35.000000000 +0200
+@@ -11,17 +11,18 @@
+ #include <linux/fs.h>
+ #include <linux/ptrace.h>
+ #include <linux/reboot.h>
++#include <linux/tick.h>
+ #include <linux/uaccess.h>
+ #include <linux/unistd.h>
+
+ #include <asm/sysreg.h>
+ #include <asm/ocd.h>
+
++#include <asm/arch/pm.h>
++
+ void (*pm_power_off)(void) = NULL;
+ EXPORT_SYMBOL(pm_power_off);
+
+-extern void cpu_idle_sleep(void);
+-
+ /*
+ * This file handles the architecture-dependent parts of process handling..
+ */
+@@ -30,8 +31,10 @@
+ {
+ /* endless idle loop with no priority at all */
+ while (1) {
++ tick_nohz_stop_sched_tick();
+ while (!need_resched())
+ cpu_idle_sleep();
++ tick_nohz_restart_sched_tick();
+ preempt_enable_no_resched();
+ schedule();
+ preempt_disable();
+@@ -103,7 +106,7 @@
*/
void exit_thread(void)
{
@@ -6395,21 +6352,21 @@ index 9d6dac8..eaaa69b 100644
}
void flush_thread(void)
-@@ -345,6 +345,9 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
+@@ -345,6 +348,10 @@
p->thread.cpu_context.ksp = (unsigned long)childregs;
p->thread.cpu_context.pc = (unsigned long)ret_from_fork;
++ clear_tsk_thread_flag(p, TIF_DEBUG);
+ if ((clone_flags & CLONE_PTRACE) && test_thread_flag(TIF_DEBUG))
+ ocd_enable(p);
+
return 0;
}
-diff --git a/arch/avr32/kernel/ptrace.c b/arch/avr32/kernel/ptrace.c
-index 002369e..1fed38f 100644
---- a/arch/avr32/kernel/ptrace.c
-+++ b/arch/avr32/kernel/ptrace.c
-@@ -58,6 +58,7 @@ void ptrace_disable(struct task_struct *child)
+diff -urN linux-2.6.24.3/arch/avr32/kernel/ptrace.c avr32-2.6/arch/avr32/kernel/ptrace.c
+--- linux-2.6.24.3/arch/avr32/kernel/ptrace.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/ptrace.c 2008-04-23 19:33:28.000000000 +0200
+@@ -58,6 +58,7 @@
{
clear_tsk_thread_flag(child, TIF_SINGLE_STEP);
clear_tsk_thread_flag(child, TIF_BREAKPOINT);
@@ -6417,7 +6374,7 @@ index 002369e..1fed38f 100644
}
/*
-@@ -144,10 +145,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
+@@ -144,10 +145,6 @@
{
int ret;
@@ -6428,11 +6385,10 @@ index 002369e..1fed38f 100644
switch (request) {
/* Read the word at location addr in the child process */
case PTRACE_PEEKTEXT:
-diff --git a/arch/avr32/kernel/setup.c b/arch/avr32/kernel/setup.c
-index 4b4c188..488078d 100644
---- a/arch/avr32/kernel/setup.c
-+++ b/arch/avr32/kernel/setup.c
-@@ -273,6 +273,8 @@ static int __init early_parse_fbmem(char *p)
+diff -urN linux-2.6.24.3/arch/avr32/kernel/setup.c avr32-2.6/arch/avr32/kernel/setup.c
+--- linux-2.6.24.3/arch/avr32/kernel/setup.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/setup.c 2008-04-23 20:12:35.000000000 +0200
+@@ -273,6 +273,8 @@
printk(KERN_WARNING
"Failed to allocate framebuffer memory\n");
fbmem_size = 0;
@@ -6441,11 +6397,10 @@ index 4b4c188..488078d 100644
}
}
-diff --git a/arch/avr32/kernel/signal.c b/arch/avr32/kernel/signal.c
-index 0ec1485..5616a00 100644
---- a/arch/avr32/kernel/signal.c
-+++ b/arch/avr32/kernel/signal.c
-@@ -270,19 +270,12 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset, int syscall)
+diff -urN linux-2.6.24.3/arch/avr32/kernel/signal.c avr32-2.6/arch/avr32/kernel/signal.c
+--- linux-2.6.24.3/arch/avr32/kernel/signal.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/signal.c 2008-04-23 19:33:28.000000000 +0200
+@@ -270,19 +270,12 @@
if (!user_mode(regs))
return 0;
@@ -6465,10 +6420,322 @@ index 0ec1485..5616a00 100644
if (syscall) {
switch (regs->r12) {
case -ERESTART_RESTARTBLOCK:
-diff --git a/arch/avr32/kernel/traps.c b/arch/avr32/kernel/traps.c
-index 870c075..cf6f686 100644
---- a/arch/avr32/kernel/traps.c
-+++ b/arch/avr32/kernel/traps.c
+diff -urN linux-2.6.24.3/arch/avr32/kernel/time.c avr32-2.6/arch/avr32/kernel/time.c
+--- linux-2.6.24.3/arch/avr32/kernel/time.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/time.c 2008-04-23 20:12:35.000000000 +0200
+@@ -1,16 +1,12 @@
+ /*
+ * Copyright (C) 2004-2007 Atmel Corporation
+ *
+- * Based on MIPS implementation arch/mips/kernel/time.c
+- * Copyright 2001 MontaVista Software Inc.
+- *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+-
+ #include <linux/clk.h>
+-#include <linux/clocksource.h>
++#include <linux/clockchips.h>
+ #include <linux/time.h>
+ #include <linux/module.h>
+ #include <linux/interrupt.h>
+@@ -27,207 +23,133 @@
+ #include <asm/io.h>
+ #include <asm/sections.h>
+
+-/* how many counter cycles in a jiffy? */
+-static u32 cycles_per_jiffy;
++#include <asm/arch/pm.h>
+
+-/* the count value for the next timer interrupt */
+-static u32 expirelo;
+
+-cycle_t __weak read_cycle_count(void)
++static cycle_t read_cycle_count(void)
+ {
+ return (cycle_t)sysreg_read(COUNT);
+ }
+
+-struct clocksource __weak clocksource_avr32 = {
+- .name = "avr32",
+- .rating = 350,
++/*
++ * The architectural cycle count registers are a fine clocksource unless
++ * the system idle loop use sleep states like "idle": the CPU cycles
++ * measured by COUNT (and COMPARE) don't happen during sleep states.
++ * Their duration also changes if cpufreq changes the CPU clock rate.
++ * So we rate the clocksource using COUNT as very low quality.
++ */
++static struct clocksource counter = {
++ .name = "avr32_counter",
++ .rating = 50,
+ .read = read_cycle_count,
+ .mask = CLOCKSOURCE_MASK(32),
+ .shift = 16,
+ .flags = CLOCK_SOURCE_IS_CONTINUOUS,
+ };
+
+-irqreturn_t __weak timer_interrupt(int irq, void *dev_id);
+-
+-struct irqaction timer_irqaction = {
+- .handler = timer_interrupt,
+- .flags = IRQF_DISABLED,
+- .name = "timer",
+-};
+-
+-/*
+- * By default we provide the null RTC ops
+- */
+-static unsigned long null_rtc_get_time(void)
++static irqreturn_t timer_interrupt(int irq, void *dev_id)
+ {
+- return mktime(2007, 1, 1, 0, 0, 0);
+-}
+-
+-static int null_rtc_set_time(unsigned long sec)
+-{
+- return 0;
+-}
++ struct clock_event_device *evdev = dev_id;
+
+-static unsigned long (*rtc_get_time)(void) = null_rtc_get_time;
+-static int (*rtc_set_time)(unsigned long) = null_rtc_set_time;
+-
+-static void avr32_timer_ack(void)
+-{
+- u32 count;
+-
+- /* Ack this timer interrupt and set the next one */
+- expirelo += cycles_per_jiffy;
+- /* setting COMPARE to 0 stops the COUNT-COMPARE */
+- if (expirelo == 0) {
+- sysreg_write(COMPARE, expirelo + 1);
+- } else {
+- sysreg_write(COMPARE, expirelo);
+- }
++ /*
++ * Disable the interrupt until the clockevent subsystem
++ * reprograms it.
++ */
++ sysreg_write(COMPARE, 0);
+
+- /* Check to see if we have missed any timer interrupts */
+- count = sysreg_read(COUNT);
+- if ((count - expirelo) < 0x7fffffff) {
+- expirelo = count + cycles_per_jiffy;
+- sysreg_write(COMPARE, expirelo);
+- }
++ evdev->event_handler(evdev);
++ return IRQ_HANDLED;
+ }
+
+-int __weak avr32_hpt_init(void)
+-{
+- int ret;
+- unsigned long mult, shift, count_hz;
+-
+- count_hz = clk_get_rate(boot_cpu_data.clk);
+- shift = clocksource_avr32.shift;
+- mult = clocksource_hz2mult(count_hz, shift);
+- clocksource_avr32.mult = mult;
+-
+- {
+- u64 tmp;
+-
+- tmp = TICK_NSEC;
+- tmp <<= shift;
+- tmp += mult / 2;
+- do_div(tmp, mult);
+-
+- cycles_per_jiffy = tmp;
+- }
++static struct irqaction timer_irqaction = {
++ .handler = timer_interrupt,
++ .flags = IRQF_TIMER | IRQF_DISABLED,
++ .name = "avr32_comparator",
++};
+
+- ret = setup_irq(0, &timer_irqaction);
+- if (ret) {
+- pr_debug("timer: could not request IRQ 0: %d\n", ret);
+- return -ENODEV;
+- }
++static int comparator_next_event(unsigned long delta,
++ struct clock_event_device *evdev)
++{
++ unsigned long flags;
+
+- printk(KERN_INFO "timer: AT32AP COUNT-COMPARE at irq 0, "
+- "%lu.%03lu MHz\n",
+- ((count_hz + 500) / 1000) / 1000,
+- ((count_hz + 500) / 1000) % 1000);
++ raw_local_irq_save(flags);
+
+- return 0;
+-}
++ /* The time to read COUNT then update COMPARE must be less
++ * than the min_delta_ns value for this clockevent source.
++ */
++ sysreg_write(COMPARE, (sysreg_read(COUNT) + delta) ? : 1);
+
+-/*
+- * Taken from MIPS c0_hpt_timer_init().
+- *
+- * The reason COUNT is written twice is probably to make sure we don't get any
+- * timer interrupts while we are messing with the counter.
+- */
+-int __weak avr32_hpt_start(void)
+-{
+- u32 count = sysreg_read(COUNT);
+- expirelo = (count / cycles_per_jiffy + 1) * cycles_per_jiffy;
+- sysreg_write(COUNT, expirelo - cycles_per_jiffy);
+- sysreg_write(COMPARE, expirelo);
+- sysreg_write(COUNT, count);
++ raw_local_irq_restore(flags);
+
+ return 0;
+ }
+
+-/*
+- * local_timer_interrupt() does profiling and process accounting on a
+- * per-CPU basis.
+- *
+- * In UP mode, it is invoked from the (global) timer_interrupt.
+- */
+-void local_timer_interrupt(int irq, void *dev_id)
++static void comparator_mode(enum clock_event_mode mode,
++ struct clock_event_device *evdev)
+ {
+- if (current->pid)
+- profile_tick(CPU_PROFILING);
+- update_process_times(user_mode(get_irq_regs()));
++ switch (mode) {
++ case CLOCK_EVT_MODE_ONESHOT:
++ pr_debug("%s: start\n", evdev->name);
++ /* FALLTHROUGH */
++ case CLOCK_EVT_MODE_RESUME:
++ cpu_disable_idle_sleep();
++ break;
++ case CLOCK_EVT_MODE_UNUSED:
++ case CLOCK_EVT_MODE_SHUTDOWN:
++ sysreg_write(COMPARE, 0);
++ pr_debug("%s: stop\n", evdev->name);
++ cpu_enable_idle_sleep();
++ break;
++ default:
++ BUG();
++ }
+ }
+
+-irqreturn_t __weak timer_interrupt(int irq, void *dev_id)
+-{
+- /* ack timer interrupt and try to set next interrupt */
+- avr32_timer_ack();
+-
+- /*
+- * Call the generic timer interrupt handler
+- */
+- write_seqlock(&xtime_lock);
+- do_timer(1);
+- write_sequnlock(&xtime_lock);
+-
+- /*
+- * In UP mode, we call local_timer_interrupt() to do profiling
+- * and process accounting.
+- *
+- * SMP is not supported yet.
+- */
+- local_timer_interrupt(irq, dev_id);
+-
+- return IRQ_HANDLED;
+-}
++static struct clock_event_device comparator = {
++ .name = "avr32_comparator",
++ .features = CLOCK_EVT_FEAT_ONESHOT,
++ .shift = 16,
++ .rating = 50,
++ .cpumask = CPU_MASK_CPU0,
++ .set_next_event = comparator_next_event,
++ .set_mode = comparator_mode,
++};
+
+ void __init time_init(void)
+ {
++ unsigned long counter_hz;
+ int ret;
+
+- /*
+- * Make sure we don't get any COMPARE interrupts before we can
+- * handle them.
+- */
+- sysreg_write(COMPARE, 0);
+-
+- xtime.tv_sec = rtc_get_time();
++ xtime.tv_sec = mktime(2007, 1, 1, 0, 0, 0);
+ xtime.tv_nsec = 0;
+
+ set_normalized_timespec(&wall_to_monotonic,
+ -xtime.tv_sec, -xtime.tv_nsec);
+
+- ret = avr32_hpt_init();
+- if (ret) {
+- pr_debug("timer: failed setup: %d\n", ret);
+- return;
+- }
++ /* figure rate for counter */
++ counter_hz = clk_get_rate(boot_cpu_data.clk);
++ counter.mult = clocksource_hz2mult(counter_hz, counter.shift);
+
+- ret = clocksource_register(&clocksource_avr32);
++ ret = clocksource_register(&counter);
+ if (ret)
+ pr_debug("timer: could not register clocksource: %d\n", ret);
+
+- ret = avr32_hpt_start();
+- if (ret) {
+- pr_debug("timer: failed starting: %d\n", ret);
+- return;
+- }
+-}
++ /* setup COMPARE clockevent */
++ comparator.mult = div_sc(counter_hz, NSEC_PER_SEC, comparator.shift);
++ comparator.max_delta_ns = clockevent_delta2ns((u32)~0, &comparator);
++ comparator.min_delta_ns = clockevent_delta2ns(50, &comparator) + 1;
+
+-static struct sysdev_class timer_class = {
+- set_kset_name("timer"),
+-};
++ sysreg_write(COMPARE, 0);
++ timer_irqaction.dev_id = &comparator;
+
+-static struct sys_device timer_device = {
+- .id = 0,
+- .cls = &timer_class,
+-};
++ ret = setup_irq(0, &timer_irqaction);
++ if (ret)
++ pr_debug("timer: could not request IRQ 0: %d\n", ret);
++ else {
++ clockevents_register_device(&comparator);
+
+-static int __init init_timer_sysfs(void)
+-{
+- int err = sysdev_class_register(&timer_class);
+- if (!err)
+- err = sysdev_register(&timer_device);
+- return err;
++ pr_info("%s: irq 0, %lu.%03lu MHz\n", comparator.name,
++ ((counter_hz + 500) / 1000) / 1000,
++ ((counter_hz + 500) / 1000) % 1000);
++ }
+ }
+-
+-device_initcall(init_timer_sysfs);
+diff -urN linux-2.6.24.3/arch/avr32/kernel/traps.c avr32-2.6/arch/avr32/kernel/traps.c
+--- linux-2.6.24.3/arch/avr32/kernel/traps.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/kernel/traps.c 2008-04-23 19:33:28.000000000 +0200
@@ -9,6 +9,7 @@
#include <linux/bug.h>
#include <linux/init.h>
@@ -6477,7 +6744,7 @@ index 870c075..cf6f686 100644
#include <linux/module.h>
#include <linux/notifier.h>
#include <linux/sched.h>
-@@ -107,9 +108,23 @@ void _exception(long signr, struct pt_regs *regs, int code,
+@@ -107,9 +108,23 @@
asmlinkage void do_nmi(unsigned long ecr, struct pt_regs *regs)
{
@@ -6504,68 +6771,9 @@ index 870c075..cf6f686 100644
}
asmlinkage void do_critical_exception(unsigned long ecr, struct pt_regs *regs)
-diff --git a/arch/avr32/mach-at32ap/Kconfig b/arch/avr32/mach-at32ap/Kconfig
-index eb30783..0eb590a 100644
---- a/arch/avr32/mach-at32ap/Kconfig
-+++ b/arch/avr32/mach-at32ap/Kconfig
-@@ -3,9 +3,9 @@ if PLATFORM_AT32AP
- menu "Atmel AVR32 AP options"
-
- choice
-- prompt "AT32AP7000 static memory bus width"
-- depends on CPU_AT32AP7000
-- default AP7000_16_BIT_SMC
-+ prompt "AT32AP700x static memory bus width"
-+ depends on CPU_AT32AP700X
-+ default AP700X_16_BIT_SMC
- help
- Define the width of the AP7000 external static memory interface.
- This is used to determine how to mangle the address and/or data
-@@ -15,17 +15,24 @@ choice
- width for all chip selects, excluding the flash (which is using
- raw access and is thus not affected by any of this.)
-
--config AP7000_32_BIT_SMC
-+config AP700X_32_BIT_SMC
- bool "32 bit"
-
--config AP7000_16_BIT_SMC
-+config AP700X_16_BIT_SMC
- bool "16 bit"
-
--config AP7000_8_BIT_SMC
-+config AP700X_8_BIT_SMC
- bool "8 bit"
-
- endchoice
-
-+config GPIO_DEV
-+ bool "GPIO /dev interface"
-+ select CONFIGFS_FS
-+ default n
-+ help
-+ Say `Y' to enable a /dev interface to the GPIO pins.
-+
- endmenu
-
- endif # PLATFORM_AT32AP
-diff --git a/arch/avr32/mach-at32ap/Makefile b/arch/avr32/mach-at32ap/Makefile
-index a8b4450..0f6162e 100644
---- a/arch/avr32/mach-at32ap/Makefile
-+++ b/arch/avr32/mach-at32ap/Makefile
-@@ -1,4 +1,5 @@
- obj-y += at32ap.o clock.o intc.o extint.o pio.o hsmc.o
--obj-$(CONFIG_CPU_AT32AP7000) += at32ap7000.o
--obj-$(CONFIG_CPU_AT32AP7000) += time-tc.o
-+obj-$(CONFIG_CPU_AT32AP700X) += at32ap700x.o
-+obj-$(CONFIG_CPU_AT32AP700X) += time-tc.o
- obj-$(CONFIG_CPU_FREQ_AT32AP) += cpufreq.o
-+obj-$(CONFIG_GPIO_DEV) += gpio-dev.o
-diff --git a/arch/avr32/mach-at32ap/at32ap7000.c b/arch/avr32/mach-at32ap/at32ap7000.c
-deleted file mode 100644
-index 7c4388f..0000000
---- a/arch/avr32/mach-at32ap/at32ap7000.c
-+++ /dev/null
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/at32ap7000.c avr32-2.6/arch/avr32/mach-at32ap/at32ap7000.c
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/at32ap7000.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/at32ap7000.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,1730 +0,0 @@
-/*
- * Copyright (C) 2005-2006 Atmel Corporation
@@ -8297,12 +8505,10 @@ index 7c4388f..0000000
- pm_writel(PBA_MASK, pba_mask);
- pm_writel(PBB_MASK, pbb_mask);
-}
-diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c
-new file mode 100644
-index 0000000..06795d0
---- /dev/null
-+++ b/arch/avr32/mach-at32ap/at32ap700x.c
-@@ -0,0 +1,1809 @@
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/at32ap700x.c avr32-2.6/arch/avr32/mach-at32ap/at32ap700x.c
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/at32ap700x.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/at32ap700x.c 2008-04-23 20:12:35.000000000 +0200
+@@ -0,0 +1,1944 @@
+/*
+ * Copyright (C) 2005-2006 Atmel Corporation
+ *
@@ -8316,6 +8522,7 @@ index 0000000..06795d0
+#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+#include <linux/spi/spi.h>
++#include <linux/usb/atmel_usba_udc.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
@@ -8910,19 +9117,32 @@ index 0000000..06795d0
+}
+
+/* --------------------------------------------------------------------
-+ * System Timer/Counter (TC)
++ * Timer/Counter (TC)
+ * -------------------------------------------------------------------- */
-+static struct resource at32_systc0_resource[] = {
++
++static struct resource at32_tcb0_resource[] = {
+ PBMEM(0xfff00c00),
+ IRQ(22),
+};
-+struct platform_device at32_systc0_device = {
-+ .name = "systc",
++static struct platform_device at32_tcb0_device = {
++ .name = "atmel_tcb",
+ .id = 0,
-+ .resource = at32_systc0_resource,
-+ .num_resources = ARRAY_SIZE(at32_systc0_resource),
++ .resource = at32_tcb0_resource,
++ .num_resources = ARRAY_SIZE(at32_tcb0_resource),
++};
++DEV_CLK(t0_clk, at32_tcb0, pbb, 3);
++
++static struct resource at32_tcb1_resource[] = {
++ PBMEM(0xfff01000),
++ IRQ(23),
++};
++static struct platform_device at32_tcb1_device = {
++ .name = "atmel_tcb",
++ .id = 1,
++ .resource = at32_tcb1_resource,
++ .num_resources = ARRAY_SIZE(at32_tcb1_resource),
+};
-+DEV_CLK(pclk, at32_systc0, pbb, 3);
++DEV_CLK(t0_clk, at32_tcb1, pbb, 4);
+
+/* --------------------------------------------------------------------
+ * PIO
@@ -8974,7 +9194,8 @@ index 0000000..06795d0
+ platform_device_register(&pdc_device);
+ platform_device_register(&dmaca0_device);
+
-+ platform_device_register(&at32_systc0_device);
++ platform_device_register(&at32_tcb0_device);
++ platform_device_register(&at32_tcb1_device);
+
+ platform_device_register(&pio0_device);
+ platform_device_register(&pio1_device);
@@ -8984,6 +9205,81 @@ index 0000000..06795d0
+}
+
+/* --------------------------------------------------------------------
++ * PSIF
++ * -------------------------------------------------------------------- */
++static struct resource atmel_psif0_resource[] __initdata = {
++ {
++ .start = 0xffe03c00,
++ .end = 0xffe03cff,
++ .flags = IORESOURCE_MEM,
++ },
++ IRQ(18),
++};
++static struct clk atmel_psif0_pclk = {
++ .name = "pclk",
++ .parent = &pba_clk,
++ .mode = pba_clk_mode,
++ .get_rate = pba_clk_get_rate,
++ .index = 15,
++};
++
++static struct resource atmel_psif1_resource[] __initdata = {
++ {
++ .start = 0xffe03d00,
++ .end = 0xffe03dff,
++ .flags = IORESOURCE_MEM,
++ },
++ IRQ(18),
++};
++static struct clk atmel_psif1_pclk = {
++ .name = "pclk",
++ .parent = &pba_clk,
++ .mode = pba_clk_mode,
++ .get_rate = pba_clk_get_rate,
++ .index = 15,
++};
++
++struct platform_device *__init at32_add_device_psif(unsigned int id)
++{
++ struct platform_device *pdev;
++
++ if (!(id == 0 || id == 1))
++ return NULL;
++
++ pdev = platform_device_alloc("atmel_psif", id);
++ if (!pdev)
++ return NULL;
++
++ switch (id) {
++ case 0:
++ if (platform_device_add_resources(pdev, atmel_psif0_resource,
++ ARRAY_SIZE(atmel_psif0_resource)))
++ goto err_add_resources;
++ atmel_psif0_pclk.dev = &pdev->dev;
++ select_peripheral(PA(8), PERIPH_A, 0); /* CLOCK */
++ select_peripheral(PA(9), PERIPH_A, 0); /* DATA */
++ break;
++ case 1:
++ if (platform_device_add_resources(pdev, atmel_psif1_resource,
++ ARRAY_SIZE(atmel_psif1_resource)))
++ goto err_add_resources;
++ atmel_psif1_pclk.dev = &pdev->dev;
++ select_peripheral(PB(11), PERIPH_A, 0); /* CLOCK */
++ select_peripheral(PB(12), PERIPH_A, 0); /* DATA */
++ break;
++ default:
++ return NULL;
++ }
++
++ platform_device_add(pdev);
++ return pdev;
++
++err_add_resources:
++ platform_device_put(pdev);
++ return NULL;
++}
++
++/* --------------------------------------------------------------------
+ * USART
+ * -------------------------------------------------------------------- */
+
@@ -9294,7 +9590,9 @@ index 0000000..06795d0
+ .index = 2,
+};
+
-+struct platform_device *__init at32_add_device_twi(unsigned int id)
++struct platform_device *__init at32_add_device_twi(unsigned int id,
++ struct i2c_board_info *b,
++ unsigned int n)
+{
+ struct platform_device *pdev;
+
@@ -9314,6 +9612,9 @@ index 0000000..06795d0
+
+ atmel_twi0_pclk.dev = &pdev->dev;
+
++ if (b)
++ i2c_register_board_info(id, b, n);
++
+ platform_device_add(pdev);
+ return pdev;
+
@@ -9668,9 +9969,39 @@ index 0000000..06795d0
+ .index = 6,
+};
+
++#define EP(nam, idx, maxpkt, maxbk, dma, isoc) \
++ [idx] = { \
++ .name = nam, \
++ .index = idx, \
++ .fifo_size = maxpkt, \
++ .nr_banks = maxbk, \
++ .can_dma = dma, \
++ .can_isoc = isoc, \
++ }
++
++static struct usba_ep_data at32_usba_ep[] __initdata = {
++ EP("ep0", 0, 64, 1, 0, 0),
++ EP("ep1", 1, 512, 2, 1, 1),
++ EP("ep2", 2, 512, 2, 1, 1),
++ EP("ep3-int", 3, 64, 3, 1, 0),
++ EP("ep4-int", 4, 64, 3, 1, 0),
++ EP("ep5", 5, 1024, 3, 1, 1),
++ EP("ep6", 6, 1024, 3, 1, 1),
++};
++
++#undef EP
++
+struct platform_device *__init
+at32_add_device_usba(unsigned int id, struct usba_platform_data *data)
+{
++ /*
++ * pdata doesn't have room for any endpoints, so we need to
++ * append room for the ones we need right after it.
++ */
++ struct {
++ struct usba_platform_data pdata;
++ struct usba_ep_data ep[7];
++ } usba_data;
+ struct platform_device *pdev;
+
+ if (id != 0)
@@ -9684,13 +10015,20 @@ index 0000000..06795d0
+ ARRAY_SIZE(usba0_resource)))
+ goto out_free_pdev;
+
-+ if (data) {
-+ if (platform_device_add_data(pdev, data, sizeof(*data)))
-+ goto out_free_pdev;
++ if (data)
++ usba_data.pdata.vbus_pin = data->vbus_pin;
++ else
++ usba_data.pdata.vbus_pin = -EINVAL;
+
-+ if (data->vbus_pin != GPIO_PIN_NONE)
-+ at32_select_gpio(data->vbus_pin, 0);
-+ }
++ data = &usba_data.pdata;
++ data->num_ep = ARRAY_SIZE(at32_usba_ep);
++ memcpy(data->ep, at32_usba_ep, sizeof(at32_usba_ep));
++
++ if (platform_device_add_data(pdev, data, sizeof(usba_data)))
++ goto out_free_pdev;
++
++ if (data->vbus_pin >= 0)
++ at32_select_gpio(data->vbus_pin, 0);
+
+ usba0_pclk.dev = &pdev->dev;
+ usba0_hclk.dev = &pdev->dev;
@@ -10011,7 +10349,10 @@ index 0000000..06795d0
+ &pio2_mck,
+ &pio3_mck,
+ &pio4_mck,
-+ &at32_systc0_pclk,
++ &at32_tcb0_t0_clk,
++ &at32_tcb1_t0_clk,
++ &atmel_psif0_pclk,
++ &atmel_psif1_pclk,
+ &atmel_usart0_usart,
+ &atmel_usart1_usart,
+ &atmel_usart2_usart,
@@ -10112,10 +10453,9 @@ index 0000000..06795d0
+ pm_writel(PBA_MASK, pba_mask);
+ pm_writel(PBB_MASK, pbb_mask);
+}
-diff --git a/arch/avr32/mach-at32ap/extint.c b/arch/avr32/mach-at32ap/extint.c
-index f5bfd4c..c36a6d5 100644
---- a/arch/avr32/mach-at32ap/extint.c
-+++ b/arch/avr32/mach-at32ap/extint.c
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/extint.c avr32-2.6/arch/avr32/mach-at32ap/extint.c
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/extint.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/extint.c 2008-04-23 19:33:29.000000000 +0200
@@ -26,16 +26,10 @@
#define EIC_MODE 0x0014
#define EIC_EDGE 0x0018
@@ -10134,7 +10474,7 @@ index f5bfd4c..c36a6d5 100644
/* Bit manipulation macros */
#define EIC_BIT(name) \
-@@ -63,6 +57,9 @@ struct eic {
+@@ -63,6 +57,9 @@
unsigned int first_irq;
};
@@ -10144,7 +10484,7 @@ index f5bfd4c..c36a6d5 100644
static void eic_ack_irq(unsigned int irq)
{
struct eic *eic = get_irq_chip_data(irq);
-@@ -133,8 +130,11 @@ static int eic_set_irq_type(unsigned int irq, unsigned int flow_type)
+@@ -133,8 +130,11 @@
eic_writel(eic, EDGE, edge);
eic_writel(eic, LEVEL, level);
@@ -10157,7 +10497,7 @@ index f5bfd4c..c36a6d5 100644
desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
desc->status |= flow_type;
}
-@@ -154,9 +154,8 @@ static struct irq_chip eic_chip = {
+@@ -154,9 +154,8 @@
static void demux_eic_irq(unsigned int irq, struct irq_desc *desc)
{
struct eic *eic = desc->handler_data;
@@ -10168,7 +10508,7 @@ index f5bfd4c..c36a6d5 100644
status = eic_readl(eic, ISR);
pending = status & eic_readl(eic, IMR);
-@@ -165,15 +164,28 @@ static void demux_eic_irq(unsigned int irq, struct irq_desc *desc)
+@@ -165,15 +164,28 @@
i = fls(pending) - 1;
pending &= ~(1 << i);
@@ -10203,7 +10543,7 @@ index f5bfd4c..c36a6d5 100644
static int __init eic_probe(struct platform_device *pdev)
{
struct eic *eic;
-@@ -214,14 +226,13 @@ static int __init eic_probe(struct platform_device *pdev)
+@@ -214,14 +226,13 @@
pattern = eic_readl(eic, MODE);
nr_irqs = fls(pattern);
@@ -10220,7 +10560,7 @@ index f5bfd4c..c36a6d5 100644
set_irq_chip_and_handler(eic->first_irq + i, &eic_chip,
handle_level_irq);
set_irq_chip_data(eic->first_irq + i, eic);
-@@ -230,6 +241,16 @@ static int __init eic_probe(struct platform_device *pdev)
+@@ -230,6 +241,16 @@
set_irq_chained_handler(int_irq, demux_eic_irq);
set_irq_data(int_irq, eic);
@@ -10237,11 +10577,9 @@ index f5bfd4c..c36a6d5 100644
dev_info(&pdev->dev,
"External Interrupt Controller at 0x%p, IRQ %u\n",
eic->regs, int_irq);
-diff --git a/arch/avr32/mach-at32ap/gpio-dev.c b/arch/avr32/mach-at32ap/gpio-dev.c
-new file mode 100644
-index 0000000..8cf6d11
---- /dev/null
-+++ b/arch/avr32/mach-at32ap/gpio-dev.c
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/gpio-dev.c avr32-2.6/arch/avr32/mach-at32ap/gpio-dev.c
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/gpio-dev.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/gpio-dev.c 2008-04-23 19:33:29.000000000 +0200
@@ -0,0 +1,573 @@
+/*
+ * GPIO /dev and configfs interface
@@ -10816,11 +11154,75 @@ index 0000000..8cf6d11
+ return err;
+}
+late_initcall(gpio_dev_init);
-diff --git a/arch/avr32/mach-at32ap/pio.c b/arch/avr32/mach-at32ap/pio.c
-index d61a02d..c978c36 100644
---- a/arch/avr32/mach-at32ap/pio.c
-+++ b/arch/avr32/mach-at32ap/pio.c
-@@ -162,6 +162,82 @@ fail:
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/intc.c avr32-2.6/arch/avr32/mach-at32ap/intc.c
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/intc.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/intc.c 2008-04-23 20:12:35.000000000 +0200
+@@ -13,7 +13,6 @@
+ #include <linux/irq.h>
+ #include <linux/platform_device.h>
+
+-#include <asm/intc.h>
+ #include <asm/io.h>
+
+ #include "intc.h"
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/Kconfig avr32-2.6/arch/avr32/mach-at32ap/Kconfig
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/Kconfig 2008-04-23 19:33:29.000000000 +0200
+@@ -3,9 +3,9 @@
+ menu "Atmel AVR32 AP options"
+
+ choice
+- prompt "AT32AP7000 static memory bus width"
+- depends on CPU_AT32AP7000
+- default AP7000_16_BIT_SMC
++ prompt "AT32AP700x static memory bus width"
++ depends on CPU_AT32AP700X
++ default AP700X_16_BIT_SMC
+ help
+ Define the width of the AP7000 external static memory interface.
+ This is used to determine how to mangle the address and/or data
+@@ -15,17 +15,24 @@
+ width for all chip selects, excluding the flash (which is using
+ raw access and is thus not affected by any of this.)
+
+-config AP7000_32_BIT_SMC
++config AP700X_32_BIT_SMC
+ bool "32 bit"
+
+-config AP7000_16_BIT_SMC
++config AP700X_16_BIT_SMC
+ bool "16 bit"
+
+-config AP7000_8_BIT_SMC
++config AP700X_8_BIT_SMC
+ bool "8 bit"
+
+ endchoice
+
++config GPIO_DEV
++ bool "GPIO /dev interface"
++ select CONFIGFS_FS
++ default n
++ help
++ Say `Y' to enable a /dev interface to the GPIO pins.
++
+ endmenu
+
+ endif # PLATFORM_AT32AP
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/Makefile avr32-2.6/arch/avr32/mach-at32ap/Makefile
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/Makefile 2008-04-23 20:12:35.000000000 +0200
+@@ -1,4 +1,4 @@
+ obj-y += at32ap.o clock.o intc.o extint.o pio.o hsmc.o
+-obj-$(CONFIG_CPU_AT32AP7000) += at32ap7000.o
+-obj-$(CONFIG_CPU_AT32AP7000) += time-tc.o
++obj-$(CONFIG_CPU_AT32AP700X) += at32ap700x.o pm-at32ap700x.o
+ obj-$(CONFIG_CPU_FREQ_AT32AP) += cpufreq.o
++obj-$(CONFIG_GPIO_DEV) += gpio-dev.o
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/pio.c avr32-2.6/arch/avr32/mach-at32ap/pio.c
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/pio.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/pio.c 2008-04-23 20:12:35.000000000 +0200
+@@ -162,6 +162,82 @@
dump_stack();
}
@@ -10903,11 +11305,323 @@ index d61a02d..c978c36 100644
/*--------------------------------------------------------------------------*/
/* GPIO API */
-diff --git a/arch/avr32/mm/dma-coherent.c b/arch/avr32/mm/dma-coherent.c
-index 177fea8..6d8c794 100644
---- a/arch/avr32/mm/dma-coherent.c
-+++ b/arch/avr32/mm/dma-coherent.c
-@@ -41,6 +41,13 @@ static struct page *__dma_alloc(struct device *dev, size_t size,
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/pm-at32ap700x.S avr32-2.6/arch/avr32/mach-at32ap/pm-at32ap700x.S
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/pm-at32ap700x.S 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/pm-at32ap700x.S 2008-04-23 20:12:35.000000000 +0200
+@@ -0,0 +1,66 @@
++/*
++ * Low-level Power Management code.
++ *
++ * Copyright (C) 2008 Atmel Corporation
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++#include <asm/asm.h>
++#include <asm/asm-offsets.h>
++#include <asm/thread_info.h>
++#include <asm/arch/pm.h>
++
++ .section .bss, "wa", @nobits
++ .global disable_idle_sleep
++ .type disable_idle_sleep, @object
++disable_idle_sleep:
++ .int 4
++ .size disable_idle_sleep, . - disable_idle_sleep
++
++ /* Keep this close to the irq handlers */
++ .section .irq.text, "ax", @progbits
++
++ /*
++ * void cpu_enter_idle(void)
++ *
++ * Put the CPU into "idle" mode, in which it will consume
++ * significantly less power.
++ *
++ * If an interrupt comes along in the window between
++ * unmask_interrupts and the sleep instruction below, the
++ * interrupt code will adjust the return address so that we
++ * never execute the sleep instruction. This is required
++ * because the AP7000 doesn't unmask interrupts when entering
++ * sleep modes; later CPUs may not need this workaround.
++ */
++ .global cpu_enter_idle
++ .type cpu_enter_idle, @function
++cpu_enter_idle:
++ mask_interrupts
++ get_thread_info r8
++ ld.w r9, r8[TI_flags]
++ bld r9, TIF_NEED_RESCHED
++ brcs .Lret_from_sleep
++ sbr r9, TIF_CPU_GOING_TO_SLEEP
++ st.w r8[TI_flags], r9
++ unmask_interrupts
++ sleep CPU_SLEEP_IDLE
++ .size cpu_idle_sleep, . - cpu_idle_sleep
++
++ /*
++ * Common return path for PM functions that don't run from
++ * SRAM.
++ */
++ .global cpu_idle_skip_sleep
++ .type cpu_idle_skip_sleep, @function
++cpu_idle_skip_sleep:
++ mask_interrupts
++ ld.w r9, r8[TI_flags]
++ cbr r9, TIF_CPU_GOING_TO_SLEEP
++ st.w r8[TI_flags], r9
++.Lret_from_sleep:
++ unmask_interrupts
++ retal r12
++ .size cpu_idle_skip_sleep, . - cpu_idle_skip_sleep
+diff -urN linux-2.6.24.3/arch/avr32/mach-at32ap/time-tc.c avr32-2.6/arch/avr32/mach-at32ap/time-tc.c
+--- linux-2.6.24.3/arch/avr32/mach-at32ap/time-tc.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mach-at32ap/time-tc.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,218 +0,0 @@
+-/*
+- * Copyright (C) 2004-2007 Atmel Corporation
+- *
+- * Based on MIPS implementation arch/mips/kernel/time.c
+- * Copyright 2001 MontaVista Software Inc.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- */
+-
+-#include <linux/clk.h>
+-#include <linux/clocksource.h>
+-#include <linux/time.h>
+-#include <linux/module.h>
+-#include <linux/interrupt.h>
+-#include <linux/irq.h>
+-#include <linux/kernel_stat.h>
+-#include <linux/errno.h>
+-#include <linux/init.h>
+-#include <linux/profile.h>
+-#include <linux/sysdev.h>
+-#include <linux/err.h>
+-
+-#include <asm/div64.h>
+-#include <asm/sysreg.h>
+-#include <asm/io.h>
+-#include <asm/sections.h>
+-
+-#include <asm/arch/time.h>
+-
+-/* how many counter cycles in a jiffy? */
+-static u32 cycles_per_jiffy;
+-
+-/* the count value for the next timer interrupt */
+-static u32 expirelo;
+-
+-/* the I/O registers of the TC module */
+-static void __iomem *ioregs;
+-
+-cycle_t read_cycle_count(void)
+-{
+- return (cycle_t)timer_read(ioregs, 0, CV);
+-}
+-
+-struct clocksource clocksource_avr32 = {
+- .name = "avr32",
+- .rating = 342,
+- .read = read_cycle_count,
+- .mask = CLOCKSOURCE_MASK(16),
+- .shift = 16,
+- .flags = CLOCK_SOURCE_IS_CONTINUOUS,
+-};
+-
+-static void avr32_timer_ack(void)
+-{
+- u16 count = expirelo;
+-
+- /* Ack this timer interrupt and set the next one, use a u16
+- * variable so it will wrap around correctly */
+- count += cycles_per_jiffy;
+- expirelo = count;
+- timer_write(ioregs, 0, RC, expirelo);
+-
+- /* Check to see if we have missed any timer interrupts */
+- count = timer_read(ioregs, 0, CV);
+- if ((count - expirelo) < 0x7fff) {
+- expirelo = count + cycles_per_jiffy;
+- timer_write(ioregs, 0, RC, expirelo);
+- }
+-}
+-
+-u32 avr32_hpt_read(void)
+-{
+- return timer_read(ioregs, 0, CV);
+-}
+-
+-static int avr32_timer_calc_div_and_set_jiffies(struct clk *pclk)
+-{
+- unsigned int cycles_max = (clocksource_avr32.mask + 1) / 2;
+- unsigned int divs[] = { 4, 8, 16, 32 };
+- int divs_size = ARRAY_SIZE(divs);
+- int i = 0;
+- unsigned long count_hz;
+- unsigned long shift;
+- unsigned long mult;
+- int clock_div = -1;
+- u64 tmp;
+-
+- shift = clocksource_avr32.shift;
+-
+- do {
+- count_hz = clk_get_rate(pclk) / divs[i];
+- mult = clocksource_hz2mult(count_hz, shift);
+- clocksource_avr32.mult = mult;
+-
+- tmp = TICK_NSEC;
+- tmp <<= shift;
+- tmp += mult / 2;
+- do_div(tmp, mult);
+-
+- cycles_per_jiffy = tmp;
+- } while (cycles_per_jiffy > cycles_max && ++i < divs_size);
+-
+- clock_div = i + 1;
+-
+- if (clock_div > divs_size) {
+- pr_debug("timer: could not calculate clock divider\n");
+- return -EFAULT;
+- }
+-
+- /* Set the clock divider */
+- timer_write(ioregs, 0, CMR, TIMER_BF(CMR_TCCLKS, clock_div));
+-
+- return 0;
+-}
+-
+-int avr32_hpt_init(unsigned int count)
+-{
+- struct resource *regs;
+- struct clk *pclk;
+- int irq = -1;
+- int ret = 0;
+-
+- ret = -ENXIO;
+-
+- irq = platform_get_irq(&at32_systc0_device, 0);
+- if (irq < 0) {
+- pr_debug("timer: could not get irq\n");
+- goto out_error;
+- }
+-
+- pclk = clk_get(&at32_systc0_device.dev, "pclk");
+- if (IS_ERR(pclk)) {
+- pr_debug("timer: could not get clk: %ld\n", PTR_ERR(pclk));
+- goto out_error;
+- }
+- clk_enable(pclk);
+-
+- regs = platform_get_resource(&at32_systc0_device, IORESOURCE_MEM, 0);
+- if (!regs) {
+- pr_debug("timer: could not get resource\n");
+- goto out_error_clk;
+- }
+-
+- ioregs = ioremap(regs->start, regs->end - regs->start + 1);
+- if (!ioregs) {
+- pr_debug("timer: could not get ioregs\n");
+- goto out_error_clk;
+- }
+-
+- ret = avr32_timer_calc_div_and_set_jiffies(pclk);
+- if (ret)
+- goto out_error_io;
+-
+- ret = setup_irq(irq, &timer_irqaction);
+- if (ret) {
+- pr_debug("timer: could not request irq %d: %d\n",
+- irq, ret);
+- goto out_error_io;
+- }
+-
+- expirelo = (timer_read(ioregs, 0, CV) / cycles_per_jiffy + 1)
+- * cycles_per_jiffy;
+-
+- /* Enable clock and interrupts on RC compare */
+- timer_write(ioregs, 0, CCR, TIMER_BIT(CCR_CLKEN));
+- timer_write(ioregs, 0, IER, TIMER_BIT(IER_CPCS));
+- /* Set cycles to first interrupt */
+- timer_write(ioregs, 0, RC, expirelo);
+-
+- printk(KERN_INFO "timer: AT32AP system timer/counter at 0x%p irq %d\n",
+- ioregs, irq);
+-
+- return 0;
+-
+-out_error_io:
+- iounmap(ioregs);
+-out_error_clk:
+- clk_put(pclk);
+-out_error:
+- return ret;
+-}
+-
+-int avr32_hpt_start(void)
+-{
+- timer_write(ioregs, 0, CCR, TIMER_BIT(CCR_SWTRG));
+- return 0;
+-}
+-
+-irqreturn_t timer_interrupt(int irq, void *dev_id)
+-{
+- unsigned int sr = timer_read(ioregs, 0, SR);
+-
+- if (sr & TIMER_BIT(SR_CPCS)) {
+- /* ack timer interrupt and try to set next interrupt */
+- avr32_timer_ack();
+-
+- /*
+- * Call the generic timer interrupt handler
+- */
+- write_seqlock(&xtime_lock);
+- do_timer(1);
+- write_sequnlock(&xtime_lock);
+-
+- /*
+- * In UP mode, we call local_timer_interrupt() to do profiling
+- * and process accounting.
+- *
+- * SMP is not supported yet.
+- */
+- local_timer_interrupt(irq, dev_id);
+-
+- return IRQ_HANDLED;
+- }
+-
+- return IRQ_NONE;
+-}
+diff -urN linux-2.6.24.3/arch/avr32/Makefile avr32-2.6/arch/avr32/Makefile
+--- linux-2.6.24.3/arch/avr32/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/Makefile 2008-04-23 19:33:28.000000000 +0200
+@@ -16,7 +16,7 @@
+ CFLAGS_MODULE += -mno-relax
+ LDFLAGS_vmlinux += --relax
+
+-cpuflags-$(CONFIG_CPU_AT32AP7000) += -mcpu=ap7000
++cpuflags-$(CONFIG_PLATFORM_AT32AP) += -march=ap
+
+ KBUILD_CFLAGS += $(cpuflags-y)
+ KBUILD_AFLAGS += $(cpuflags-y)
+@@ -31,6 +31,8 @@
+ core-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/
+ core-y += arch/avr32/kernel/
+ core-y += arch/avr32/mm/
++drivers-$(CONFIG_OPROFILE) += arch/avr32/oprofile/
++drivers-y += arch/avr32/drivers/
+ libs-y += arch/avr32/lib/
+
+ archincdir-$(CONFIG_PLATFORM_AT32AP) := arch-at32ap
+diff -urN linux-2.6.24.3/arch/avr32/mm/dma-coherent.c avr32-2.6/arch/avr32/mm/dma-coherent.c
+--- linux-2.6.24.3/arch/avr32/mm/dma-coherent.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mm/dma-coherent.c 2008-04-23 19:33:29.000000000 +0200
+@@ -41,6 +41,13 @@
struct page *page, *free, *end;
int order;
@@ -10921,11 +11635,22 @@ index 177fea8..6d8c794 100644
size = PAGE_ALIGN(size);
order = get_order(size);
-diff --git a/arch/avr32/mm/tlb.c b/arch/avr32/mm/tlb.c
-index 5667201..b835257 100644
---- a/arch/avr32/mm/tlb.c
-+++ b/arch/avr32/mm/tlb.c
-@@ -348,7 +348,7 @@ static int tlb_show(struct seq_file *tlb, void *v)
+diff -urN linux-2.6.24.3/arch/avr32/mm/fault.c avr32-2.6/arch/avr32/mm/fault.c
+--- linux-2.6.24.3/arch/avr32/mm/fault.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mm/fault.c 2008-04-23 20:12:35.000000000 +0200
+@@ -189,6 +189,8 @@
+
+ page = sysreg_read(PTBR);
+ printk(KERN_ALERT "ptbr = %08lx", page);
++ if (address >= TASK_SIZE)
++ page = (unsigned long)swapper_pg_dir;
+ if (page) {
+ page = ((unsigned long *)page)[address >> 22];
+ printk(" pgd = %08lx", page);
+diff -urN linux-2.6.24.3/arch/avr32/mm/tlb.c avr32-2.6/arch/avr32/mm/tlb.c
+--- linux-2.6.24.3/arch/avr32/mm/tlb.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/arch/avr32/mm/tlb.c 2008-04-23 19:33:29.000000000 +0200
+@@ -348,7 +348,7 @@
return 0;
}
@@ -10934,11 +11659,9 @@ index 5667201..b835257 100644
.start = tlb_start,
.next = tlb_next,
.stop = tlb_stop,
-diff --git a/arch/avr32/oprofile/Makefile b/arch/avr32/oprofile/Makefile
-new file mode 100644
-index 0000000..1fe81c3
---- /dev/null
-+++ b/arch/avr32/oprofile/Makefile
+diff -urN linux-2.6.24.3/arch/avr32/oprofile/Makefile avr32-2.6/arch/avr32/oprofile/Makefile
+--- linux-2.6.24.3/arch/avr32/oprofile/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/oprofile/Makefile 2008-04-23 19:33:29.000000000 +0200
@@ -0,0 +1,8 @@
+obj-$(CONFIG_OPROFILE) += oprofile.o
+
@@ -10948,12 +11671,10 @@ index 0000000..1fe81c3
+ oprofilefs.o oprofile_stats.o \
+ timer_int.o)
+oprofile-y += op_model_avr32.o
-diff --git a/arch/avr32/oprofile/op_model_avr32.c b/arch/avr32/oprofile/op_model_avr32.c
-new file mode 100644
-index 0000000..e2f876b
---- /dev/null
-+++ b/arch/avr32/oprofile/op_model_avr32.c
-@@ -0,0 +1,235 @@
+diff -urN linux-2.6.24.3/arch/avr32/oprofile/op_model_avr32.c avr32-2.6/arch/avr32/oprofile/op_model_avr32.c
+--- linux-2.6.24.3/arch/avr32/oprofile/op_model_avr32.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/arch/avr32/oprofile/op_model_avr32.c 2008-04-23 20:12:35.000000000 +0200
+@@ -0,0 +1,234 @@
+/*
+ * AVR32 Performance Counter Driver
+ *
@@ -10972,7 +11693,6 @@ index 0000000..e2f876b
+#include <linux/sched.h>
+#include <linux/types.h>
+
-+#include <asm/intc.h>
+#include <asm/sysreg.h>
+#include <asm/system.h>
+
@@ -11189,42 +11909,348 @@ index 0000000..e2f876b
+{
+
+}
-diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
-index c466c6c..0bb2052 100644
---- a/drivers/i2c/busses/Kconfig
-+++ b/drivers/i2c/busses/Kconfig
-@@ -88,6 +88,14 @@ config I2C_AT91
- to support combined I2C messages. Use the i2c-gpio driver
- unless your system can cope with those limitations.
+diff -urN linux-2.6.24.3/Documentation/kernel-parameters.txt avr32-2.6/Documentation/kernel-parameters.txt
+--- linux-2.6.24.3/Documentation/kernel-parameters.txt 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/Documentation/kernel-parameters.txt 2008-04-23 20:12:35.000000000 +0200
+@@ -34,6 +34,7 @@
+ ALSA ALSA sound support is enabled.
+ APIC APIC support is enabled.
+ APM Advanced Power Management support is enabled.
++ AVR32 AVR32 architecture is enabled.
+ AX25 Appropriate AX.25 support is enabled.
+ BLACKFIN Blackfin architecture is enabled.
+ DRM Direct Rendering Management support is enabled.
+@@ -1123,6 +1124,10 @@
+ of returning the full 64-bit number.
+ The default is to return 64-bit inode numbers.
-+config I2C_ATMELTWI
-+ tristate "Atmel Two-Wire Interface (TWI)"
-+ depends on I2C && (ARCH_AT91 || PLATFORM_AT32AP)
-+ help
-+ Atmel on-chip TWI controller. Say Y if you have an AT32 or
-+ AT91-based device and want to use its built-in TWI
-+ functionality.
++ nmi_debug= [KNL,AVR32] Specify one or more actions to take
++ when a NMI is triggered.
++ Format: [state][,regs][,debounce][,die]
+
- config I2C_AU1550
- tristate "Au1550/Au1200 SMBus interface"
- depends on SOC_AU1550 || SOC_AU1200
-diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
-index 81d43c2..af3f350 100644
---- a/drivers/i2c/busses/Makefile
-+++ b/drivers/i2c/busses/Makefile
-@@ -53,6 +53,7 @@ obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o
- obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o
- obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
- obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
-+obj-$(CONFIG_I2C_ATMELTWI) += i2c-atmeltwi.o
+ nmi_watchdog= [KNL,BUGS=X86-32] Debugging features for SMP kernels
- ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
- EXTRA_CFLAGS += -DDEBUG
-diff --git a/drivers/i2c/busses/i2c-atmeltwi.c b/drivers/i2c/busses/i2c-atmeltwi.c
-new file mode 100644
-index 0000000..70c719a
---- /dev/null
-+++ b/drivers/i2c/busses/i2c-atmeltwi.c
+ no387 [BUGS=X86-32] Tells the kernel to use the 387 maths
+diff -urN linux-2.6.24.3/drivers/clocksource/Makefile avr32-2.6/drivers/clocksource/Makefile
+--- linux-2.6.24.3/drivers/clocksource/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/clocksource/Makefile 2008-04-23 20:12:39.000000000 +0200
+@@ -1,3 +1,4 @@
++obj-$(CONFIG_ATMEL_TCB_CLKSRC) += tcb_clksrc.o
+ obj-$(CONFIG_X86_CYCLONE_TIMER) += cyclone.o
+ obj-$(CONFIG_X86_PM_TIMER) += acpi_pm.o
+ obj-$(CONFIG_SCx200HR_TIMER) += scx200_hrt.o
+diff -urN linux-2.6.24.3/drivers/clocksource/tcb_clksrc.c avr32-2.6/drivers/clocksource/tcb_clksrc.c
+--- linux-2.6.24.3/drivers/clocksource/tcb_clksrc.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/clocksource/tcb_clksrc.c 2008-04-23 20:12:39.000000000 +0200
+@@ -0,0 +1,305 @@
++#include <linux/init.h>
++#include <linux/clocksource.h>
++#include <linux/clockchips.h>
++#include <linux/interrupt.h>
++#include <linux/irq.h>
++
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <linux/ioport.h>
++#include <linux/io.h>
++#include <linux/platform_device.h>
++#include <linux/atmel_tc.h>
++
++
++/*
++ * We're configured to use a specific TC block, one that's not hooked
++ * up to external hardware, to provide a time solution:
++ *
++ * - Two channels combine to create a free-running 32 bit counter
++ * with a base rate of 5+ MHz, packaged as a clocksource (with
++ * resolution better than 200 nsec).
++ *
++ * - The third channel may be used to provide a 16-bit clockevent
++ * source, used in either periodic or oneshot mode. This runs
++ * at 32 KiHZ, and can handle delays of up to two seconds.
++ *
++ * A boot clocksource and clockevent source are also currently needed,
++ * unless the relevant platforms (ARM/AT91, AVR32/AT32) are changed so
++ * this code can be used when init_timers() is called, well before most
++ * devices are set up. (Some low end AT91 parts, which can run uClinux,
++ * have only the timers in one TC block... they currently don't support
++ * the tclib code, because of that initialization issue.)
++ *
++ * REVISIT behavior during system suspend states... we should disable
++ * all clocks and save the power. Easily done for clockevent devices,
++ * but clocksources won't necessarily get the needed notifications.
++ * For deeper system sleep states, this will be mandatory...
++ */
++
++static void __iomem *tcaddr;
++
++static cycle_t tc_get_cycles(void)
++{
++ unsigned long flags;
++ u32 lower, upper;
++
++ raw_local_irq_save(flags);
++ do {
++ upper = __raw_readl(tcaddr + ATMEL_TC_REG(1, CV));
++ lower = __raw_readl(tcaddr + ATMEL_TC_REG(0, CV));
++ } while (upper != __raw_readl(tcaddr + ATMEL_TC_REG(1, CV)));
++
++ raw_local_irq_restore(flags);
++ return (upper << 16) | lower;
++}
++
++static struct clocksource clksrc = {
++ .name = "tcb_clksrc",
++ .rating = 200,
++ .read = tc_get_cycles,
++ .mask = CLOCKSOURCE_MASK(32),
++ .shift = 18,
++ .flags = CLOCK_SOURCE_IS_CONTINUOUS,
++};
++
++#ifdef CONFIG_GENERIC_CLOCKEVENTS
++
++struct tc_clkevt_device {
++ struct clock_event_device clkevt;
++ struct clk *clk;
++ void __iomem *regs;
++};
++
++static struct tc_clkevt_device *to_tc_clkevt(struct clock_event_device *clkevt)
++{
++ return container_of(clkevt, struct tc_clkevt_device, clkevt);
++}
++
++/* For now, we always use the 32K clock ... this optimizes for NO_HZ,
++ * because using one of the divided clocks would usually mean the
++ * tick rate can never be less than several dozen Hz (vs 0.5 Hz).
++ *
++ * A divided clock could be good for high resolution timers, since
++ * 30.5 usec resolution can seem "low".
++ */
++static u32 timer_clock;
++
++static void tc_mode(enum clock_event_mode m, struct clock_event_device *d)
++{
++ struct tc_clkevt_device *tcd = to_tc_clkevt(d);
++ void __iomem *regs = tcd->regs;
++
++ if (tcd->clkevt.mode == CLOCK_EVT_MODE_PERIODIC
++ || tcd->clkevt.mode == CLOCK_EVT_MODE_ONESHOT) {
++ __raw_writel(0xff, regs + ATMEL_TC_REG(2, IDR));
++ __raw_writel(ATMEL_TC_CLKDIS, regs + ATMEL_TC_REG(2, CCR));
++ clk_disable(tcd->clk);
++ }
++
++ switch (m) {
++
++ /* By not making the gentime core emulate periodic mode on top
++ * of oneshot, we get lower overhead and improved accuracy.
++ */
++ case CLOCK_EVT_MODE_PERIODIC:
++ clk_enable(tcd->clk);
++
++ /* slow clock, count up to RC, then irq and restart */
++ __raw_writel(timer_clock
++ | ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO,
++ regs + ATMEL_TC_REG(2, CMR));
++ __raw_writel((32768 + HZ/2) / HZ, tcaddr + ATMEL_TC_REG(2, RC));
++
++ /* Enable clock and interrupts on RC compare */
++ __raw_writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER));
++
++ /* go go gadget! */
++ __raw_writel(ATMEL_TC_CLKEN | ATMEL_TC_SWTRG,
++ regs + ATMEL_TC_REG(2, CCR));
++ break;
++
++ case CLOCK_EVT_MODE_ONESHOT:
++ clk_enable(tcd->clk);
++
++ /* slow clock, count up to RC, then irq and stop */
++ __raw_writel(timer_clock | ATMEL_TC_CPCSTOP
++ | ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO,
++ regs + ATMEL_TC_REG(2, CMR));
++ __raw_writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER));
++
++ /* set_next_event() configures and starts the timer */
++ break;
++
++ default:
++ break;
++ }
++}
++
++static int tc_next_event(unsigned long delta, struct clock_event_device *d)
++{
++ __raw_writel(delta, tcaddr + ATMEL_TC_REG(2, RC));
++
++ /* go go gadget! */
++ __raw_writel(ATMEL_TC_CLKEN | ATMEL_TC_SWTRG,
++ tcaddr + ATMEL_TC_REG(2, CCR));
++ return 0;
++}
++
++static struct tc_clkevt_device clkevt = {
++ .clkevt = {
++ .name = "tc_clkevt",
++ .features = CLOCK_EVT_FEAT_PERIODIC
++ | CLOCK_EVT_FEAT_ONESHOT,
++ .shift = 32,
++ /* Should be lower than at91rm9200's system timer */
++ .rating = 125,
++ .cpumask = CPU_MASK_CPU0,
++ .set_next_event = tc_next_event,
++ .set_mode = tc_mode,
++ },
++};
++
++static irqreturn_t ch2_irq(int irq, void *handle)
++{
++ struct tc_clkevt_device *dev = handle;
++ unsigned int sr;
++
++ sr = __raw_readl(dev->regs + ATMEL_TC_REG(2, SR));
++ if (sr & ATMEL_TC_CPCS) {
++ dev->clkevt.event_handler(&dev->clkevt);
++ return IRQ_HANDLED;
++ }
++
++ return IRQ_NONE;
++}
++
++static struct irqaction tc_irqaction = {
++ .name = "tc_clkevt",
++ .flags = IRQF_TIMER | IRQF_DISABLED,
++ .handler = ch2_irq,
++};
++
++static void __init setup_clkevents(struct atmel_tc *tc,
++ struct clk *t0_clk, int clk32k_divisor_idx)
++{
++ struct platform_device *pdev = tc->pdev;
++ struct clk *t2_clk = tc->clk[2];
++ int irq = tc->irq[2];
++
++ clkevt.regs = tc->regs;
++ clkevt.clk = t2_clk;
++ tc_irqaction.dev_id = &clkevt;
++
++ timer_clock = clk32k_divisor_idx;
++
++ clkevt.clkevt.mult = div_sc(32768, NSEC_PER_SEC, clkevt.clkevt.shift);
++ clkevt.clkevt.max_delta_ns
++ = clockevent_delta2ns(0xffff, &clkevt.clkevt);
++ clkevt.clkevt.min_delta_ns = clockevent_delta2ns(1, &clkevt.clkevt) + 1;
++
++ setup_irq(irq, &tc_irqaction);
++
++ clockevents_register_device(&clkevt.clkevt);
++}
++
++#else /* !CONFIG_GENERIC_CLOCKEVENTS */
++
++static void __init setup_clkevents(struct atmel_tc *tc,
++ struct clk *t0_clk, int clk32k_divisor_idx)
++{
++ /* NOTHING */
++}
++
++#endif
++
++static int __init tcb_clksrc_init(void)
++{
++ static char bootinfo[] __initdata
++ = KERN_DEBUG "%s: tc%d at %d.%03d MHz\n";
++
++ struct platform_device *pdev;
++ struct atmel_tc *tc;
++ struct clk *t0_clk, *t1_clk;
++ u32 rate, divided_rate = 0;
++ int best_divisor_idx = -1;
++ int clk32k_divisor_idx = -1;
++ int i;
++
++ tc = atmel_tc_alloc(CONFIG_ATMEL_TCB_CLKSRC_BLOCK, clksrc.name);
++ if (!tc) {
++ pr_debug("can't alloc TC for clocksource\n");
++ return -ENODEV;
++ }
++ tcaddr = tc->regs;
++ pdev = tc->pdev;
++
++ t0_clk = tc->clk[0];
++ clk_enable(t0_clk);
++
++ /* How fast will we be counting? Pick something over 5 MHz. */
++ rate = (u32) clk_get_rate(t0_clk);
++ for (i = 0; i < 5; i++) {
++ unsigned divisor = atmel_tc_divisors[i];
++ unsigned tmp;
++
++ /* remember 32 KiHz clock for later */
++ if (!divisor) {
++ clk32k_divisor_idx = i;
++ continue;
++ }
++
++ tmp = rate / divisor;
++ pr_debug("TC: %u / %-3u [%d] --> %u\n", rate, divisor, i, tmp);
++ if (best_divisor_idx > 0) {
++ if (tmp < 5 * 1000 * 1000)
++ continue;
++ }
++ divided_rate = tmp;
++ best_divisor_idx = i;
++ }
++
++ clksrc.mult = clocksource_hz2mult(divided_rate, clksrc.shift);
++
++ printk(bootinfo, clksrc.name, CONFIG_ATMEL_TCB_CLKSRC_BLOCK,
++ divided_rate / 1000000,
++ ((divided_rate + 500000) % 1000000) / 1000);
++
++ /* tclib will give us three clocks no matter what the
++ * underlying platform supports.
++ */
++ clk_enable(tc->clk[1]);
++
++ /* channel 0: waveform mode, input mclk/8, clock TIOA0 on overflow */
++ __raw_writel(best_divisor_idx /* likely divide-by-8 */
++ | ATMEL_TC_WAVE
++ | ATMEL_TC_WAVESEL_UP /* free-run */
++ | ATMEL_TC_ACPA_SET /* TIOA0 rises at 0 */
++ | ATMEL_TC_ACPC_CLEAR, /* (duty cycle 50%) */
++ tcaddr + ATMEL_TC_REG(0, CMR));
++ __raw_writel(0x0000, tcaddr + ATMEL_TC_REG(0, RA));
++ __raw_writel(0x8000, tcaddr + ATMEL_TC_REG(0, RC));
++ __raw_writel(0xff, tcaddr + ATMEL_TC_REG(0, IDR)); /* no irqs */
++ __raw_writel(ATMEL_TC_CLKEN, tcaddr + ATMEL_TC_REG(0, CCR));
++
++ /* channel 1: waveform mode, input TIOA0 */
++ __raw_writel(ATMEL_TC_XC1 /* input: TIOA0 */
++ | ATMEL_TC_WAVE
++ | ATMEL_TC_WAVESEL_UP, /* free-run */
++ tcaddr + ATMEL_TC_REG(1, CMR));
++ __raw_writel(0xff, tcaddr + ATMEL_TC_REG(1, IDR)); /* no irqs */
++ __raw_writel(ATMEL_TC_CLKEN, tcaddr + ATMEL_TC_REG(1, CCR));
++
++ /* chain channel 0 to channel 1, then reset all the timers */
++ __raw_writel(ATMEL_TC_TC1XC1S_TIOA0, tcaddr + ATMEL_TC_BMR);
++ __raw_writel(ATMEL_TC_SYNC, tcaddr + ATMEL_TC_BCR);
++
++ /* and away we go! */
++ clocksource_register(&clksrc);
++
++ /* channel 2: periodic and oneshot timer support */
++ setup_clkevents(tc, t0_clk, clk32k_divisor_idx);
++
++ return 0;
++}
++arch_initcall(tcb_clksrc_init);
+diff -urN linux-2.6.24.3/drivers/i2c/busses/i2c-atmeltwi.c avr32-2.6/drivers/i2c/busses/i2c-atmeltwi.c
+--- linux-2.6.24.3/drivers/i2c/busses/i2c-atmeltwi.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/i2c/busses/i2c-atmeltwi.c 2008-04-23 19:33:37.000000000 +0200
@@ -0,0 +1,436 @@
+/*
+ * i2c Support for Atmel's Two-Wire Interface (TWI)
@@ -11466,9 +12492,9 @@ index 0000000..70c719a
+
+ } else if (status & TWI_BIT(TXRDY)) {
+ if (twi->acks_left > 0) {
-+ twi->acks_left--;
+ twi_writel(twi, THR,
+ twi->buf[twi->len - twi->acks_left]);
++ twi->acks_left--;
+ } else
+ twi_writel(twi, CR, TWI_BIT(STOP));
+ }
@@ -11662,11 +12688,9 @@ index 0000000..70c719a
+MODULE_AUTHOR("Espen Krangnes");
+MODULE_DESCRIPTION("I2C driver for Atmel TWI");
+MODULE_LICENSE("GPL");
-diff --git a/drivers/i2c/busses/i2c-atmeltwi.h b/drivers/i2c/busses/i2c-atmeltwi.h
-new file mode 100644
-index 0000000..1aca065
---- /dev/null
-+++ b/drivers/i2c/busses/i2c-atmeltwi.h
+diff -urN linux-2.6.24.3/drivers/i2c/busses/i2c-atmeltwi.h avr32-2.6/drivers/i2c/busses/i2c-atmeltwi.h
+--- linux-2.6.24.3/drivers/i2c/busses/i2c-atmeltwi.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/i2c/busses/i2c-atmeltwi.h 2008-04-23 19:33:37.000000000 +0200
@@ -0,0 +1,117 @@
+/*
+ * Register definitions for the Atmel Two-Wire Interface
@@ -11785,11 +12809,512 @@ index 0000000..1aca065
+ __raw_writel((value), (port)->regs + TWI_##reg)
+
+#endif /* __ATMELTWI_H__ */
-diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
-index ec568fa..4e1db3b 100644
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -18,6 +18,13 @@ config LEDS_CLASS
+diff -urN linux-2.6.24.3/drivers/i2c/busses/Kconfig avr32-2.6/drivers/i2c/busses/Kconfig
+--- linux-2.6.24.3/drivers/i2c/busses/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/i2c/busses/Kconfig 2008-04-23 20:12:40.000000000 +0200
+@@ -88,6 +88,14 @@
+ to support combined I2C messages. Use the i2c-gpio driver
+ unless your system can cope with those limitations.
+
++config I2C_ATMELTWI
++ tristate "Atmel Two-Wire Interface (TWI)"
++ depends on I2C && (ARCH_AT91 || PLATFORM_AT32AP)
++ help
++ Atmel on-chip TWI controller. Say Y if you have an AT32 or
++ AT91-based device and want to use its built-in TWI
++ functionality.
++
+ config I2C_AU1550
+ tristate "Au1550/Au1200 SMBus interface"
+ depends on SOC_AU1550 || SOC_AU1200
+diff -urN linux-2.6.24.3/drivers/i2c/busses/Makefile avr32-2.6/drivers/i2c/busses/Makefile
+--- linux-2.6.24.3/drivers/i2c/busses/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/i2c/busses/Makefile 2008-04-23 20:12:40.000000000 +0200
+@@ -53,6 +53,7 @@
+ obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o
+ obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
+ obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
++obj-$(CONFIG_I2C_ATMELTWI) += i2c-atmeltwi.o
+
+ ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
+ EXTRA_CFLAGS += -DDEBUG
+diff -urN linux-2.6.24.3/drivers/input/serio/at32psif.c avr32-2.6/drivers/input/serio/at32psif.c
+--- linux-2.6.24.3/drivers/input/serio/at32psif.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/input/serio/at32psif.c 2008-04-23 20:12:40.000000000 +0200
+@@ -0,0 +1,351 @@
++/*
++ * Copyright (C) 2007 Atmel Corporation
++ *
++ * Driver for the AT32AP700X PS/2 controller (PSIF).
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/init.h>
++#include <linux/serio.h>
++#include <linux/timer.h>
++#include <linux/interrupt.h>
++#include <linux/err.h>
++#include <linux/io.h>
++#include <linux/clk.h>
++#include <linux/platform_device.h>
++
++#include "at32psif.h"
++
++#define PSIF_BUF_SIZE 16
++
++#define ring_is_empty(_psif) (_psif->head == _psif->tail)
++#define ring_next_head(_psif) ((_psif->head + 1) & (PSIF_BUF_SIZE - 1))
++#define ring_next_tail(_psif) ((_psif->tail + 1) & (PSIF_BUF_SIZE - 1))
++
++struct psif {
++ struct platform_device *pdev;
++ struct clk *pclk;
++ struct serio *io;
++ struct timer_list tx_timer;
++ void __iomem *regs;
++ unsigned int irq;
++ unsigned int open;
++ /* Prevent concurrent writes to circular buffer. */
++ spinlock_t lock;
++ unsigned int head;
++ unsigned int tail;
++ unsigned char buffer[PSIF_BUF_SIZE];
++};
++
++static irqreturn_t psif_interrupt(int irq, void *_ptr)
++{
++ struct psif *psif = _ptr;
++ int retval = IRQ_NONE;
++ unsigned int io_flags = 0;
++ unsigned long status;
++
++ status = psif_readl(psif, SR);
++
++ if (status & PSIF_BIT(RXRDY)) {
++ unsigned char val = (unsigned char) psif_readl(psif, RHR);
++
++ if (status & PSIF_BIT(PARITY))
++ io_flags |= SERIO_PARITY;
++ if (status & PSIF_BIT(OVRUN))
++ dev_err(&psif->pdev->dev, "overrun read error\n");
++
++ serio_interrupt(psif->io, val, io_flags);
++
++ retval = IRQ_HANDLED;
++ }
++
++ spin_lock(&psif->lock);
++
++ if (status & PSIF_BIT(TXEMPTY)) {
++ if (status & PSIF_BIT(NACK))
++ dev_err(&psif->pdev->dev, "NACK error\n");
++
++ psif_writel(psif, IDR, PSIF_BIT(TXEMPTY));
++
++ if (!ring_is_empty(psif))
++ mod_timer(&psif->tx_timer,
++ jiffies + msecs_to_jiffies(1));
++
++ retval = IRQ_HANDLED;
++ }
++
++ spin_unlock(&psif->lock);
++
++ return retval;
++}
++
++static void psif_transmit_data(unsigned long data)
++{
++ struct psif *psif = (struct psif *)data;
++ unsigned long flags;
++
++ spin_lock_irqsave(&psif->lock, flags);
++
++ psif_writel(psif, THR, psif->buffer[psif->tail]);
++ psif->tail = ring_next_tail(psif);
++
++ if (!ring_is_empty(psif))
++ psif_writel(psif, IER, PSIF_BIT(TXEMPTY));
++
++ spin_unlock_irqrestore(&psif->lock, flags);
++}
++
++static int psif_write(struct serio *io, unsigned char val)
++{
++ struct psif *psif = io->port_data;
++ unsigned long flags;
++ unsigned int head;
++
++ spin_lock_irqsave(&psif->lock, flags);
++
++ head = ring_next_head(psif);
++
++ if (head != psif->tail) {
++ psif->buffer[psif->head] = val;
++ psif->head = head;
++ } else {
++ dev_err(&psif->pdev->dev, "underrun write error\n");
++ }
++
++ spin_unlock_irqrestore(&psif->lock, flags);
++
++ /* Make sure TXEMPTY interrupt is enabled. */
++ psif_writel(psif, IER, PSIF_BIT(TXEMPTY));
++
++ return 0;
++}
++
++static int psif_open(struct serio *io)
++{
++ struct psif *psif = io->port_data;
++ int retval;
++
++ retval = clk_enable(psif->pclk);
++ if (retval)
++ goto out;
++
++ psif_writel(psif, CR, PSIF_BIT(CR_TXEN) | PSIF_BIT(CR_RXEN));
++ psif_writel(psif, IER, PSIF_BIT(RXRDY));
++
++ psif->open = 1;
++out:
++ return retval;
++}
++
++static void psif_close(struct serio *io)
++{
++ struct psif *psif = io->port_data;
++
++ psif->open = 0;
++
++ psif_writel(psif, IDR, ~0UL);
++ psif_writel(psif, CR, PSIF_BIT(CR_TXDIS) | PSIF_BIT(CR_RXDIS));
++
++ clk_disable(psif->pclk);
++}
++
++static void psif_set_prescaler(struct psif *psif)
++{
++ unsigned long prscv;
++ unsigned long rate = clk_get_rate(psif->pclk);
++
++ /* PRSCV = Pulse length (100 us) * PSIF module frequency. */
++ prscv = 100 * (rate / 1000000UL);
++
++ if (prscv > ((1<<PSIF_PSR_PRSCV_SIZE) - 1)) {
++ prscv = (1<<PSIF_PSR_PRSCV_SIZE) - 1;
++ dev_dbg(&psif->pdev->dev, "pclk too fast, "
++ "prescaler set to max\n");
++ }
++
++ clk_enable(psif->pclk);
++ psif_writel(psif, PSR, prscv);
++ clk_disable(psif->pclk);
++}
++
++static int __init psif_probe(struct platform_device *pdev)
++{
++ struct resource *regs;
++ struct psif *psif;
++ struct serio *io;
++ struct clk *pclk;
++ int irq;
++ int ret;
++
++ psif = kzalloc(sizeof(struct psif), GFP_KERNEL);
++ if (!psif) {
++ dev_dbg(&pdev->dev, "out of memory\n");
++ ret = -ENOMEM;
++ goto out;
++ }
++ psif->pdev = pdev;
++
++ io = kzalloc(sizeof(struct serio), GFP_KERNEL);
++ if (!io) {
++ dev_dbg(&pdev->dev, "out of memory\n");
++ ret = -ENOMEM;
++ goto out_free_psif;
++ }
++ psif->io = io;
++
++ regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!regs) {
++ dev_dbg(&pdev->dev, "no mmio resources defined\n");
++ ret = -ENOMEM;
++ goto out_free_io;
++ }
++
++ psif->regs = ioremap(regs->start, regs->end - regs->start + 1);
++ if (!psif->regs) {
++ ret = -ENOMEM;
++ dev_dbg(&pdev->dev, "could not map I/O memory\n");
++ goto out_free_io;
++ }
++
++ pclk = clk_get(&pdev->dev, "pclk");
++ if (IS_ERR(pclk)) {
++ dev_dbg(&pdev->dev, "could not get peripheral clock\n");
++ ret = PTR_ERR(pclk);
++ goto out_iounmap;
++ }
++ psif->pclk = pclk;
++
++ /* Reset the PSIF to enter at a known state. */
++ ret = clk_enable(pclk);
++ if (ret) {
++ dev_dbg(&pdev->dev, "could not enable pclk\n");
++ goto out_put_clk;
++ }
++ psif_writel(psif, CR, PSIF_BIT(CR_SWRST));
++ clk_disable(pclk);
++
++ setup_timer(&psif->tx_timer, psif_transmit_data, (unsigned long)psif);
++
++ irq = platform_get_irq(pdev, 0);
++ if (irq < 0) {
++ dev_dbg(&pdev->dev, "could not get irq\n");
++ ret = -ENXIO;
++ goto out_put_clk;
++ }
++ ret = request_irq(irq, psif_interrupt, IRQF_SHARED, "at32psif", psif);
++ if (ret) {
++ dev_dbg(&pdev->dev, "could not request irq %d\n", irq);
++ goto out_put_clk;
++ }
++ psif->irq = irq;
++
++ io->id.type = SERIO_8042;
++ io->write = psif_write;
++ io->open = psif_open;
++ io->close = psif_close;
++ strlcpy(io->name, pdev->dev.bus_id, sizeof(io->name));
++ strlcpy(io->phys, pdev->dev.bus_id, sizeof(io->phys));
++ io->port_data = psif;
++ io->dev.parent = &pdev->dev;
++
++ psif_set_prescaler(psif);
++
++ spin_lock_init(&psif->lock);
++ serio_register_port(psif->io);
++ platform_set_drvdata(pdev, psif);
++
++ dev_info(&pdev->dev, "Atmel AVR32 PSIF PS/2 driver on 0x%08x irq %d\n",
++ (int)psif->regs, psif->irq);
++
++ return 0;
++
++out_put_clk:
++ clk_put(psif->pclk);
++out_iounmap:
++ iounmap(psif->regs);
++out_free_io:
++ kfree(io);
++out_free_psif:
++ kfree(psif);
++out:
++ return ret;
++}
++
++static int __exit psif_remove(struct platform_device *pdev)
++{
++ struct psif *psif = platform_get_drvdata(pdev);
++
++ psif_writel(psif, IDR, ~0UL);
++ psif_writel(psif, CR, PSIF_BIT(CR_TXDIS) | PSIF_BIT(CR_RXDIS));
++
++ serio_unregister_port(psif->io);
++ iounmap(psif->regs);
++ free_irq(psif->irq, psif);
++ clk_put(psif->pclk);
++ kfree(psif);
++
++ platform_set_drvdata(pdev, NULL);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int psif_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ struct psif *psif = platform_get_drvdata(pdev);
++
++ if (psif->open) {
++ psif_writel(psif, CR, PSIF_BIT(CR_RXDIS) | PSIF_BIT(CR_TXDIS));
++ clk_disable(psif->pclk);
++ }
++
++ return 0;
++}
++
++static int psif_resume(struct platform_device *pdev)
++{
++ struct psif *psif = platform_get_drvdata(pdev);
++
++ if (psif->open) {
++ clk_enable(psif->pclk);
++ psif_set_prescaler(psif);
++ psif_writel(psif, CR, PSIF_BIT(CR_RXEN) | PSIF_BIT(CR_TXEN));
++ }
++
++ return 0;
++}
++#else
++#define psif_suspend NULL
++#define psif_resume NULL
++#endif
++
++static struct platform_driver psif_driver = {
++ .remove = __exit_p(psif_remove),
++ .driver = {
++ .name = "atmel_psif",
++ },
++ .suspend = psif_suspend,
++ .resume = psif_resume,
++};
++
++static int __init psif_init(void)
++{
++ return platform_driver_probe(&psif_driver, psif_probe);
++}
++
++static void __exit psif_exit(void)
++{
++ platform_driver_unregister(&psif_driver);
++}
++
++module_init(psif_init);
++module_exit(psif_exit);
++
++MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>");
++MODULE_DESCRIPTION("Atmel AVR32 PSIF PS/2 driver");
++MODULE_LICENSE("GPL");
+diff -urN linux-2.6.24.3/drivers/input/serio/at32psif.h avr32-2.6/drivers/input/serio/at32psif.h
+--- linux-2.6.24.3/drivers/input/serio/at32psif.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/input/serio/at32psif.h 2008-04-23 20:12:40.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * Copyright (C) 2007 Atmel Corporation
++ *
++ * Driver for the AT32AP700X PS/2 controller (PSIF).
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++
++#ifndef _AT32PSIF_H
++#define _AT32PSIF_H
++
++/* PSIF register offsets */
++#define PSIF_CR 0x00
++#define PSIF_RHR 0x04
++#define PSIF_THR 0x08
++#define PSIF_SR 0x10
++#define PSIF_IER 0x14
++#define PSIF_IDR 0x18
++#define PSIF_IMR 0x1c
++#define PSIF_PSR 0x24
++
++/* Bitfields in control register. */
++#define PSIF_CR_RXDIS_OFFSET 1
++#define PSIF_CR_RXDIS_SIZE 1
++#define PSIF_CR_RXEN_OFFSET 0
++#define PSIF_CR_RXEN_SIZE 1
++#define PSIF_CR_SWRST_OFFSET 15
++#define PSIF_CR_SWRST_SIZE 1
++#define PSIF_CR_TXDIS_OFFSET 9
++#define PSIF_CR_TXDIS_SIZE 1
++#define PSIF_CR_TXEN_OFFSET 8
++#define PSIF_CR_TXEN_SIZE 1
++
++/* Bitfields in interrupt disable, enable, mask and status register. */
++#define PSIF_NACK_OFFSET 8
++#define PSIF_NACK_SIZE 1
++#define PSIF_OVRUN_OFFSET 5
++#define PSIF_OVRUN_SIZE 1
++#define PSIF_PARITY_OFFSET 9
++#define PSIF_PARITY_SIZE 1
++#define PSIF_RXRDY_OFFSET 4
++#define PSIF_RXRDY_SIZE 1
++#define PSIF_TXEMPTY_OFFSET 1
++#define PSIF_TXEMPTY_SIZE 1
++#define PSIF_TXRDY_OFFSET 0
++#define PSIF_TXRDY_SIZE 1
++
++/* Bitfields in prescale register. */
++#define PSIF_PSR_PRSCV_OFFSET 0
++#define PSIF_PSR_PRSCV_SIZE 12
++
++/* Bitfields in receive hold register. */
++#define PSIF_RHR_RXDATA_OFFSET 0
++#define PSIF_RHR_RXDATA_SIZE 8
++
++/* Bitfields in transmit hold register. */
++#define PSIF_THR_TXDATA_OFFSET 0
++#define PSIF_THR_TXDATA_SIZE 8
++
++/* Bit manipulation macros */
++#define PSIF_BIT(name) \
++ (1 << PSIF_##name##_OFFSET)
++#define PSIF_BF(name, value) \
++ (((value) & ((1 << PSIF_##name##_SIZE) - 1)) \
++ << PSIF_##name##_OFFSET)
++#define PSIF_BFEXT(name, value)\
++ (((value) >> PSIF_##name##_OFFSET) \
++ & ((1 << PSIF_##name##_SIZE) - 1))
++#define PSIF_BFINS(name, value, old) \
++ (((old) & ~(((1 << PSIF_##name##_SIZE) - 1) \
++ << PSIF_##name##_OFFSET)) \
++ | PSIF_BF(name, value))
++
++/* Register access macros */
++#define psif_readl(port, reg) \
++ __raw_readl((port)->regs + PSIF_##reg)
++#define psif_writel(port, reg, value) \
++ __raw_writel((value), (port)->regs + PSIF_##reg)
++
++#endif /* _AT32PSIF_H */
+diff -urN linux-2.6.24.3/drivers/input/serio/Kconfig avr32-2.6/drivers/input/serio/Kconfig
+--- linux-2.6.24.3/drivers/input/serio/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/input/serio/Kconfig 2008-04-23 20:12:40.000000000 +0200
+@@ -88,6 +88,17 @@
+ To compile this driver as a module, choose M here: the
+ module will be called rpckbd.
+
++config SERIO_AT32PSIF
++ tristate "AVR32 PSIF PS/2 keyboard and mouse controller"
++ depends on AVR32
++ default n
++ help
++ Say Y here if you want to use the PSIF peripheral on AVR32 devices
++ and connect a PS/2 keyboard and/or mouse to it.
++
++ To compile this driver as a module, choose M here: the module will
++ be called at32psif.
++
+ config SERIO_AMBAKMI
+ tristate "AMBA KMI keyboard controller"
+ depends on ARM_AMBA
+diff -urN linux-2.6.24.3/drivers/input/serio/Makefile avr32-2.6/drivers/input/serio/Makefile
+--- linux-2.6.24.3/drivers/input/serio/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/input/serio/Makefile 2008-04-23 20:12:40.000000000 +0200
+@@ -12,6 +12,7 @@
+ obj-$(CONFIG_SERIO_RPCKBD) += rpckbd.o
+ obj-$(CONFIG_SERIO_SA1111) += sa1111ps2.o
+ obj-$(CONFIG_SERIO_AMBAKMI) += ambakmi.o
++obj-$(CONFIG_SERIO_AT32PSIF) += at32psif.o
+ obj-$(CONFIG_SERIO_Q40KBD) += q40kbd.o
+ obj-$(CONFIG_SERIO_GSCPS2) += gscps2.o
+ obj-$(CONFIG_HP_SDC) += hp_sdc.o
+diff -urN linux-2.6.24.3/drivers/leds/Kconfig avr32-2.6/drivers/leds/Kconfig
+--- linux-2.6.24.3/drivers/leds/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/leds/Kconfig 2008-04-23 20:12:41.000000000 +0200
+@@ -18,6 +18,13 @@
comment "LED drivers"
@@ -11803,23 +13328,9 @@ index ec568fa..4e1db3b 100644
config LEDS_CORGI
tristate "LED Support for the Sharp SL-C7x0 series"
depends on LEDS_CLASS && PXA_SHARP_C7xx
-diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
-index a60de1b..04bc850 100644
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -5,6 +5,7 @@ obj-$(CONFIG_LEDS_CLASS) += led-class.o
- obj-$(CONFIG_LEDS_TRIGGERS) += led-triggers.o
-
- # LED Platform Drivers
-+obj-$(CONFIG_LEDS_ATMEL_PWM) += leds-atmel-pwm.o
- obj-$(CONFIG_LEDS_CORGI) += leds-corgi.o
- obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o
- obj-$(CONFIG_LEDS_SPITZ) += leds-spitz.o
-diff --git a/drivers/leds/leds-atmel-pwm.c b/drivers/leds/leds-atmel-pwm.c
-new file mode 100644
-index 0000000..187031c
---- /dev/null
-+++ b/drivers/leds/leds-atmel-pwm.c
+diff -urN linux-2.6.24.3/drivers/leds/leds-atmel-pwm.c avr32-2.6/drivers/leds/leds-atmel-pwm.c
+--- linux-2.6.24.3/drivers/leds/leds-atmel-pwm.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/leds/leds-atmel-pwm.c 2008-04-23 19:33:39.000000000 +0200
@@ -0,0 +1,155 @@
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
@@ -11976,43 +13487,20 @@ index 0000000..187031c
+
+MODULE_DESCRIPTION("Driver for LEDs with PWM-controlled brightness");
+MODULE_LICENSE("GPL");
-diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
-index b5e67c0..23a9231 100644
---- a/drivers/misc/Kconfig
-+++ b/drivers/misc/Kconfig
-@@ -13,6 +13,15 @@ menuconfig MISC_DEVICES
-
- if MISC_DEVICES
+diff -urN linux-2.6.24.3/drivers/leds/Makefile avr32-2.6/drivers/leds/Makefile
+--- linux-2.6.24.3/drivers/leds/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/leds/Makefile 2008-04-23 20:12:41.000000000 +0200
+@@ -5,6 +5,7 @@
+ obj-$(CONFIG_LEDS_TRIGGERS) += led-triggers.o
-+config ATMEL_PWM
-+ tristate "Atmel AT32/AT91 PWM support"
-+ depends on AVR32 || ARCH_AT91
-+ help
-+ This option enables device driver support for the PWM channels
-+ on certain Atmel prcoessors. Pulse Width Modulation is used for
-+ purposes including software controlled power-efficent backlights
-+ on LCD displays, motor control, and waveform generation.
-+
- config IBM_ASM
- tristate "Device driver for IBM RSA service processor"
- depends on X86 && PCI && INPUT && EXPERIMENTAL
-diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
-index 87f2685..b4674c6 100644
---- a/drivers/misc/Makefile
-+++ b/drivers/misc/Makefile
-@@ -7,6 +7,7 @@ obj-$(CONFIG_IBM_ASM) += ibmasm/
- obj-$(CONFIG_HDPU_FEATURES) += hdpuftrs/
- obj-$(CONFIG_MSI_LAPTOP) += msi-laptop.o
- obj-$(CONFIG_ASUS_LAPTOP) += asus-laptop.o
-+obj-$(CONFIG_ATMEL_PWM) += atmel_pwm.o
- obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o
- obj-$(CONFIG_LKDTM) += lkdtm.o
- obj-$(CONFIG_TIFM_CORE) += tifm_core.o
-diff --git a/drivers/misc/atmel_pwm.c b/drivers/misc/atmel_pwm.c
-new file mode 100644
-index 0000000..f8d3b9a
---- /dev/null
-+++ b/drivers/misc/atmel_pwm.c
+ # LED Platform Drivers
++obj-$(CONFIG_LEDS_ATMEL_PWM) += leds-atmel-pwm.o
+ obj-$(CONFIG_LEDS_CORGI) += leds-corgi.o
+ obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o
+ obj-$(CONFIG_LEDS_SPITZ) += leds-spitz.o
+diff -urN linux-2.6.24.3/drivers/misc/atmel_pwm.c avr32-2.6/drivers/misc/atmel_pwm.c
+--- linux-2.6.24.3/drivers/misc/atmel_pwm.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/misc/atmel_pwm.c 2008-04-23 19:33:40.000000000 +0200
@@ -0,0 +1,409 @@
+#include <linux/module.h>
+#include <linux/clk.h>
@@ -12423,45 +13911,240 @@ index 0000000..f8d3b9a
+
+MODULE_DESCRIPTION("Driver for AT32/AT91 PWM module");
+MODULE_LICENSE("GPL");
-diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
-index 5fef678..4970b53 100644
---- a/drivers/mmc/host/Kconfig
-+++ b/drivers/mmc/host/Kconfig
-@@ -91,6 +91,16 @@ config MMC_AT91
+diff -urN linux-2.6.24.3/drivers/misc/atmel_tclib.c avr32-2.6/drivers/misc/atmel_tclib.c
+--- linux-2.6.24.3/drivers/misc/atmel_tclib.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/misc/atmel_tclib.c 2008-04-23 20:12:41.000000000 +0200
+@@ -0,0 +1,161 @@
++#include <linux/atmel_tc.h>
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <linux/init.h>
++#include <linux/io.h>
++#include <linux/ioport.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++
++/* Number of bytes to reserve for the iomem resource */
++#define ATMEL_TC_IOMEM_SIZE 256
++
++
++/*
++ * This is a thin library to solve the problem of how to portably allocate
++ * one of the TC blocks. For simplicity, it doesn't currently expect to
++ * share individual timers between different drivers.
++ */
++
++#if defined(CONFIG_AVR32)
++/* AVR32 has these divide PBB */
++const u8 atmel_tc_divisors[5] = { 0, 4, 8, 16, 32, };
++EXPORT_SYMBOL(atmel_tc_divisors);
++
++#elif defined(CONFIG_ARCH_AT91)
++/* AT91 has these divide MCK */
++const u8 atmel_tc_divisors[5] = { 2, 8, 32, 128, 0, };
++EXPORT_SYMBOL(atmel_tc_divisors);
++
++#endif
++
++static DEFINE_SPINLOCK(tc_list_lock);
++static LIST_HEAD(tc_list);
++
++/**
++ * atmel_tc_alloc - allocate a specified TC block
++ * @block: which block to allocate
++ * @name: name to be associated with the iomem resource
++ *
++ * Caller allocates a block. If it is available, a pointer to a
++ * pre-initialized struct atmel_tc is returned. The caller can access
++ * the registers directly through the "regs" field.
++ */
++struct atmel_tc *atmel_tc_alloc(unsigned block, const char *name)
++{
++ struct atmel_tc *tc;
++ struct platform_device *pdev = NULL;
++ struct resource *r;
++
++ spin_lock(&tc_list_lock);
++ list_for_each_entry(tc, &tc_list, node) {
++ if (tc->pdev->id == block) {
++ pdev = tc->pdev;
++ break;
++ }
++ }
++
++ if (!pdev || tc->iomem)
++ goto fail;
++
++ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ r = request_mem_region(r->start, ATMEL_TC_IOMEM_SIZE, name);
++ if (!r)
++ goto fail;
++
++ tc->regs = ioremap(r->start, ATMEL_TC_IOMEM_SIZE);
++ if (!tc->regs)
++ goto fail_ioremap;
++
++ tc->iomem = r;
++
++out:
++ spin_unlock(&tc_list_lock);
++ return tc;
++
++fail_ioremap:
++ release_resource(r);
++fail:
++ tc = NULL;
++ goto out;
++}
++EXPORT_SYMBOL_GPL(atmel_tc_alloc);
++
++/**
++ * atmel_tc_free - release a specified TC block
++ * @tc: Timer/counter block that was returned by atmel_tc_alloc()
++ *
++ * This reverses the effect of atmel_tc_alloc(), unmapping the I/O
++ * registers, invalidating the resource returned by that routine and
++ * making the TC available to other drivers.
++ */
++void atmel_tc_free(struct atmel_tc *tc)
++{
++ spin_lock(&tc_list_lock);
++ if (tc->regs) {
++ iounmap(tc->regs);
++ release_resource(tc->iomem);
++ tc->regs = NULL;
++ tc->iomem = NULL;
++ }
++ spin_unlock(&tc_list_lock);
++}
++EXPORT_SYMBOL_GPL(atmel_tc_free);
++
++static int __init tc_probe(struct platform_device *pdev)
++{
++ struct atmel_tc *tc;
++ struct clk *clk;
++ int irq;
++
++ if (!platform_get_resource(pdev, IORESOURCE_MEM, 0))
++ return -EINVAL;
++
++ irq = platform_get_irq(pdev, 0);
++ if (irq < 0)
++ return -EINVAL;
++
++ tc = kzalloc(sizeof(struct atmel_tc), GFP_KERNEL);
++ if (!tc)
++ return -ENOMEM;
++
++ tc->pdev = pdev;
++
++ clk = clk_get(&pdev->dev, "t0_clk");
++ if (IS_ERR(clk)) {
++ kfree(tc);
++ return -EINVAL;
++ }
++
++ tc->clk[0] = clk;
++ tc->clk[1] = clk_get(&pdev->dev, "t1_clk");
++ if (IS_ERR(tc->clk[1]))
++ tc->clk[1] = clk;
++ tc->clk[2] = clk_get(&pdev->dev, "t2_clk");
++ if (IS_ERR(tc->clk[2]))
++ tc->clk[2] = clk;
++
++ tc->irq[0] = irq;
++ tc->irq[1] = platform_get_irq(pdev, 1);
++ if (tc->irq[1] < 0)
++ tc->irq[1] = irq;
++ tc->irq[2] = platform_get_irq(pdev, 2);
++ if (tc->irq[2] < 0)
++ tc->irq[2] = irq;
++
++ spin_lock(&tc_list_lock);
++ list_add_tail(&tc->node, &tc_list);
++ spin_unlock(&tc_list_lock);
++
++ return 0;
++}
++
++static struct platform_driver tc_driver = {
++ .driver.name = "atmel_tcb",
++};
++
++static int __init tc_init(void)
++{
++ return platform_driver_probe(&tc_driver, tc_probe);
++}
++arch_initcall(tc_init);
+diff -urN linux-2.6.24.3/drivers/misc/Kconfig avr32-2.6/drivers/misc/Kconfig
+--- linux-2.6.24.3/drivers/misc/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/misc/Kconfig 2008-04-23 20:12:41.000000000 +0200
+@@ -13,6 +13,48 @@
- If unsure, say N.
+ if MISC_DEVICES
-+config MMC_ATMELMCI
-+ tristate "Atmel Multimedia Card Interface support"
-+ depends on AVR32 && MMC
++config ATMEL_PWM
++ tristate "Atmel AT32/AT91 PWM support"
++ depends on AVR32 || ARCH_AT91
+ help
-+ This selects the Atmel Multimedia Card Interface. If you have
-+ a AT91 (ARM) or AT32 (AVR32) platform with a Multimedia Card
-+ slot, say Y or M here.
++ This option enables device driver support for the PWM channels
++ on certain Atmel prcoessors. Pulse Width Modulation is used for
++ purposes including software controlled power-efficent backlights
++ on LCD displays, motor control, and waveform generation.
+
-+ If unsure, say N.
++config ATMEL_TCLIB
++ bool "Atmel AT32/AT91 Timer/Counter Library"
++ depends on (AVR32 || ARCH_AT91)
++ help
++ Select this if you want a library to allocate the Timer/Counter
++ blocks found on many Atmel processors. This facilitates using
++ these blocks by different drivers despite processor differences.
+
- config MMC_IMX
- tristate "Motorola i.MX Multimedia Card Interface support"
- depends on ARCH_IMX
-diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
-index 3877c87..e80ea72 100644
---- a/drivers/mmc/host/Makefile
-+++ b/drivers/mmc/host/Makefile
-@@ -15,6 +15,7 @@ obj-$(CONFIG_MMC_WBSD) += wbsd.o
- obj-$(CONFIG_MMC_AU1X) += au1xmmc.o
- obj-$(CONFIG_MMC_OMAP) += omap.o
- obj-$(CONFIG_MMC_AT91) += at91_mci.o
-+obj-$(CONFIG_MMC_ATMELMCI) += atmel-mci.o
- obj-$(CONFIG_MMC_TIFM_SD) += tifm_sd.o
- obj-$(CONFIG_MMC_SPI) += mmc_spi.o
-
-diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
-new file mode 100644
-index 0000000..0b5ec58
---- /dev/null
-+++ b/drivers/mmc/host/atmel-mci.c
-@@ -0,0 +1,1176 @@
++config ATMEL_TCB_CLKSRC
++ bool "TC Block Clocksource"
++ depends on ATMEL_TCLIB && GENERIC_TIME
++ default y
++ help
++ Select this to get a high precision clocksource based on a
++ TC block with a 5+ MHz base clock rate. Two timer channels
++ are combined to make a single 32-bit timer.
++
++ When GENERIC_CLOCKEVENTS is defined, the third timer channel
++ may be used as a clock event device supporting oneshot mode
++ (delays of up to two seconds) based on the 32 KiHz clock.
++
++config ATMEL_TCB_CLKSRC_BLOCK
++ int
++ depends on ATMEL_TCB_CLKSRC
++ prompt "TC Block" if ARCH_AT91RM9200 || ARCH_AT91SAM9260 || CPU_AT32AP700X
++ default 0
++ range 0 1
++ help
++ Some chips provide more than one TC block, so you have the
++ choice of which one to use for the clock framework. The other
++ TC can be used for other purposes, such as PWM generation and
++ interval timing.
++
+ config IBM_ASM
+ tristate "Device driver for IBM RSA service processor"
+ depends on X86 && PCI && INPUT && EXPERIMENTAL
+diff -urN linux-2.6.24.3/drivers/misc/Makefile avr32-2.6/drivers/misc/Makefile
+--- linux-2.6.24.3/drivers/misc/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/misc/Makefile 2008-04-23 20:12:41.000000000 +0200
+@@ -7,7 +7,9 @@
+ obj-$(CONFIG_HDPU_FEATURES) += hdpuftrs/
+ obj-$(CONFIG_MSI_LAPTOP) += msi-laptop.o
+ obj-$(CONFIG_ASUS_LAPTOP) += asus-laptop.o
++obj-$(CONFIG_ATMEL_PWM) += atmel_pwm.o
+ obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o
++obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib.o
+ obj-$(CONFIG_LKDTM) += lkdtm.o
+ obj-$(CONFIG_TIFM_CORE) += tifm_core.o
+ obj-$(CONFIG_TIFM_7XX1) += tifm_7xx1.o
+diff -urN linux-2.6.24.3/drivers/mmc/host/atmel-mci.c avr32-2.6/drivers/mmc/host/atmel-mci.c
+--- linux-2.6.24.3/drivers/mmc/host/atmel-mci.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/mmc/host/atmel-mci.c 2008-04-23 20:12:41.000000000 +0200
+@@ -0,0 +1,1220 @@
+/*
+ * Atmel MultiMedia Card Interface driver
+ *
@@ -12503,7 +14186,6 @@ index 0000000..0b5ec58
+ EVENT_STOP_COMPLETE,
+ EVENT_DMA_COMPLETE,
+ EVENT_DMA_ERROR,
-+ EVENT_CARD_DETECT,
+};
+
+struct atmel_mci_dma {
@@ -12534,6 +14216,9 @@ index 0000000..0b5ec58
+ int detect_pin;
+ int wp_pin;
+
++ /* For detect pin debouncing */
++ struct timer_list detect_timer;
++
+ unsigned long bus_hz;
+ unsigned long mapbase;
+ struct clk *mck;
@@ -12572,8 +14257,6 @@ index 0000000..0b5ec58
+ test_bit(EVENT_DMA_COMPLETE, &host->completed_events)
+#define mci_dma_error_is_complete(host) \
+ test_bit(EVENT_DMA_ERROR, &host->completed_events)
-+#define mci_card_detect_is_complete(host) \
-+ test_bit(EVENT_CARD_DETECT, &host->completed_events)
+
+/* Test and clear bit macros for pending events */
+#define mci_clear_cmd_is_pending(host) \
@@ -12588,8 +14271,6 @@ index 0000000..0b5ec58
+ test_and_clear_bit(EVENT_STOP_COMPLETE, &host->pending_events)
+#define mci_clear_dma_error_is_pending(host) \
+ test_and_clear_bit(EVENT_DMA_ERROR, &host->pending_events)
-+#define mci_clear_card_detect_is_pending(host) \
-+ test_and_clear_bit(EVENT_CARD_DETECT, &host->pending_events)
+
+/* Test and set bit macros for completed events */
+#define mci_set_cmd_is_completed(host) \
@@ -12604,8 +14285,6 @@ index 0000000..0b5ec58
+ test_and_set_bit(EVENT_STOP_COMPLETE, &host->completed_events)
+#define mci_set_dma_error_is_completed(host) \
+ test_and_set_bit(EVENT_DMA_ERROR, &host->completed_events)
-+#define mci_set_card_detect_is_completed(host) \
-+ test_and_set_bit(EVENT_CARD_DETECT, &host->completed_events)
+
+/* Set bit macros for completed events */
+#define mci_set_cmd_complete(host) \
@@ -12622,8 +14301,6 @@ index 0000000..0b5ec58
+ set_bit(EVENT_DMA_COMPLETE, &host->completed_events)
+#define mci_set_dma_error_complete(host) \
+ set_bit(EVENT_DMA_ERROR, &host->completed_events)
-+#define mci_set_card_detect_complete(host) \
-+ set_bit(EVENT_CARD_DETECT, &host->completed_events)
+
+/* Set bit macros for pending events */
+#define mci_set_cmd_pending(host) \
@@ -12638,8 +14315,6 @@ index 0000000..0b5ec58
+ set_bit(EVENT_STOP_COMPLETE, &host->pending_events)
+#define mci_set_dma_error_pending(host) \
+ set_bit(EVENT_DMA_ERROR, &host->pending_events)
-+#define mci_set_card_detect_pending(host) \
-+ set_bit(EVENT_CARD_DETECT, &host->pending_events)
+
+/* Clear bit macros for pending events */
+#define mci_clear_cmd_pending(host) \
@@ -12654,8 +14329,6 @@ index 0000000..0b5ec58
+ clear_bit(EVENT_STOP_COMPLETE, &host->pending_events)
+#define mci_clear_dma_error_pending(host) \
+ clear_bit(EVENT_DMA_ERROR, &host->pending_events)
-+#define mci_clear_card_detect_pending(host) \
-+ clear_bit(EVENT_CARD_DETECT, &host->pending_events)
+
+
+#ifdef CONFIG_DEBUG_FS
@@ -13024,6 +14697,21 @@ index 0000000..0b5ec58
+ mci_readl(host, IMR));
+
+ WARN_ON(host->mrq != NULL);
++
++ /*
++ * We may "know" the card is gone even though there's still an
++ * electrical connection. If so, we really need to communicate
++ * this to the MMC core since there won't be any more
++ * interrupts as the card is completely removed. Otherwise,
++ * the MMC core might believe the card is still there even
++ * though the card was just removed very slowly.
++ */
++ if (!host->present) {
++ mrq->cmd->error = -ENOMEDIUM;
++ mmc_request_done(mmc, mrq);
++ return;
++ }
++
+ host->mrq = mrq;
+ host->pending_events = 0;
+ host->completed_events = 0;
@@ -13061,7 +14749,7 @@ index 0000000..0b5ec58
+ u32 clkdiv;
+
+ /* Set clock rate */
-+ clkdiv = host->bus_hz / (2 * ios->clock) - 1;
++ clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * ios->clock) - 1;
+ if (clkdiv > 255) {
+ dev_warn(&mmc->class_dev,
+ "clock %u too slow; using %lu\n",
@@ -13193,6 +14881,61 @@ index 0000000..0b5ec58
+ }
+}
+
++static void atmci_detect_change(unsigned long data)
++{
++ struct atmel_mci *host = (struct atmel_mci *)data;
++ struct mmc_request *mrq = host->mrq;
++ int present;
++
++ /*
++ * atmci_remove() sets detect_pin to -1 before freeing the
++ * interrupt. We must not re-enable the interrupt if it has
++ * been freed.
++ */
++ smp_rmb();
++ if (host->detect_pin < 0)
++ return;
++
++ enable_irq(gpio_to_irq(host->detect_pin));
++ present = !gpio_get_value(host->detect_pin);
++
++ dev_vdbg(&host->pdev->dev, "detect change: %d (was %d)\n",
++ present, host->present);
++
++ if (present != host->present) {
++ dev_dbg(&host->mmc->class_dev, "card %s\n",
++ present ? "inserted" : "removed");
++ host->present = present;
++
++ /* Reset controller if card is gone */
++ if (!present) {
++ mci_writel(host, CR, MCI_BIT(SWRST));
++ mci_writel(host, IDR, ~0UL);
++ mci_writel(host, CR, MCI_BIT(MCIEN));
++ }
++
++ /* Clean up queue if present */
++ if (mrq) {
++ if (!mci_cmd_is_complete(host))
++ mrq->cmd->error = -ENOMEDIUM;
++ if (mrq->data && !mci_data_is_complete(host)
++ && !mci_data_error_is_complete(host)) {
++ dma_stop_request(host->dma.req.req.dmac,
++ host->dma.req.req.channel);
++ host->data->error = -ENOMEDIUM;
++ atmci_data_complete(host, host->data);
++ }
++ if (mrq->stop && !mci_stop_is_complete(host))
++ mrq->stop->error = -ENOMEDIUM;
++
++ host->cmd = NULL;
++ atmci_request_end(host->mmc, mrq);
++ }
++
++ mmc_detect_change(host->mmc, 0);
++ }
++}
++
+static void atmci_tasklet_func(unsigned long priv)
+{
+ struct mmc_host *mmc = (struct mmc_host *)priv;
@@ -13270,33 +15013,6 @@ index 0000000..0b5ec58
+ data->bytes_xfered = data->blocks * data->blksz;
+ atmci_data_complete(host, data);
+ }
-+ if (mci_clear_card_detect_is_pending(host)) {
-+ /* Reset controller if card is gone */
-+ if (!host->present) {
-+ mci_writel(host, CR, MCI_BIT(SWRST));
-+ mci_writel(host, IDR, ~0UL);
-+ mci_writel(host, CR, MCI_BIT(MCIEN));
-+ }
-+
-+ /* Clean up queue if present */
-+ if (mrq) {
-+ if (!mci_cmd_is_complete(host))
-+ mrq->cmd->error = -ETIMEDOUT;
-+ if (mrq->data && !mci_data_is_complete(host)
-+ && !mci_data_error_is_complete(host)) {
-+ dma_stop_request(host->dma.req.req.dmac,
-+ host->dma.req.req.channel);
-+ host->data->error = -ETIMEDOUT;
-+ atmci_data_complete(host, data);
-+ }
-+ if (mrq->stop && !mci_stop_is_complete(host))
-+ mrq->stop->error = -ETIMEDOUT;
-+
-+ host->cmd = NULL;
-+ atmci_request_end(mmc, mrq);
-+ }
-+ mmc_detect_change(host->mmc, msecs_to_jiffies(100));
-+ }
+}
+
+static void atmci_cmd_interrupt(struct mmc_host *mmc, u32 status)
@@ -13320,9 +15036,11 @@ index 0000000..0b5ec58
+ host->stop_status = status;
+ mci_set_stop_pending(host);
+ } else {
-+ if (host->mrq->stop && mci_dma_is_complete(host)
++ struct mmc_request *mrq = host->mrq;
++
++ if (mrq->stop && mci_dma_is_complete(host)
+ && !mci_set_stop_sent_is_completed(host))
-+ send_stop_cmd(host->mmc, host->data, 0);
++ send_stop_cmd(host->mmc, mrq->data, 0);
+ host->cmd_status = status;
+ mci_set_cmd_pending(host);
+ }
@@ -13419,20 +15137,19 @@ index 0000000..0b5ec58
+ return IRQ_HANDLED;
+}
+
-+static irqreturn_t atmci_detect_change(int irq, void *dev_id)
++static irqreturn_t atmci_detect_interrupt(int irq, void *dev_id)
+{
+ struct mmc_host *mmc = dev_id;
+ struct atmel_mci *host = mmc_priv(mmc);
+
-+ int present = !gpio_get_value(irq_to_gpio(irq));
++ /*
++ * Disable interrupts until the pin has stabilized and check
++ * the state then. Use mod_timer() since we may be in the
++ * middle of the timer routine when this interrupt triggers.
++ */
++ disable_irq_nosync(irq);
++ mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(20));
+
-+ if (present != host->present) {
-+ dev_dbg(&mmc->class_dev, "card %s\n",
-+ present ? "inserted" : "removed");
-+ host->present = present;
-+ mci_set_card_detect_pending(host);
-+ tasklet_schedule(&host->tasklet);
-+ }
+ return IRQ_HANDLED;
+}
+
@@ -13466,7 +15183,7 @@ index 0000000..0b5ec58
+ host->wp_pin = board->wp_pin;
+ } else {
+ host->detect_pin = -1;
-+ host->detect_pin = -1;
++ host->wp_pin = -1;
+ }
+
+ host->mck = clk_get(&pdev->dev, "mci_clk");
@@ -13541,8 +15258,11 @@ index 0000000..0b5ec58
+ mmc_add_host(mmc);
+
+ if (host->detect_pin >= 0) {
++ setup_timer(&host->detect_timer, atmci_detect_change,
++ (unsigned long)host);
++
+ ret = request_irq(gpio_to_irq(host->detect_pin),
-+ atmci_detect_change,
++ atmci_detect_interrupt,
+ IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
+ DRIVER_NAME, mmc);
+ if (ret) {
@@ -13587,9 +15307,16 @@ index 0000000..0b5ec58
+ atmci_cleanup_debugfs(host);
+
+ if (host->detect_pin >= 0) {
-+ free_irq(gpio_to_irq(host->detect_pin), host->mmc);
++ int pin = host->detect_pin;
++
++ /* Make sure our timer doesn't enable the interrupt */
++ host->detect_pin = -1;
++ smp_wmb();
++
++ free_irq(gpio_to_irq(pin), host->mmc);
++ del_timer_sync(&host->detect_timer);
+ cancel_delayed_work(&host->mmc->detect);
-+ gpio_free(host->detect_pin);
++ gpio_free(pin);
+ }
+
+ mmc_remove_host(host->mmc);
@@ -13638,11 +15365,9 @@ index 0000000..0b5ec58
+
+MODULE_DESCRIPTION("Atmel Multimedia Card Interface driver");
+MODULE_LICENSE("GPL");
-diff --git a/drivers/mmc/host/atmel-mci.h b/drivers/mmc/host/atmel-mci.h
-new file mode 100644
-index 0000000..60d15c4
---- /dev/null
-+++ b/drivers/mmc/host/atmel-mci.h
+diff -urN linux-2.6.24.3/drivers/mmc/host/atmel-mci.h avr32-2.6/drivers/mmc/host/atmel-mci.h
+--- linux-2.6.24.3/drivers/mmc/host/atmel-mci.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/mmc/host/atmel-mci.h 2008-04-23 19:33:40.000000000 +0200
@@ -0,0 +1,192 @@
+/*
+ * Atmel MultiMedia Card Interface driver
@@ -13836,10 +15561,40 @@ index 0000000..60d15c4
+ __raw_writel((value), (port)->regs + MCI_##reg)
+
+#endif /* __DRIVERS_MMC_ATMEL_MCI_H__ */
-diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c
-index 1707f98..d2ec6eb 100644
---- a/drivers/mtd/chips/cfi_cmdset_0001.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0001.c
+diff -urN linux-2.6.24.3/drivers/mmc/host/Kconfig avr32-2.6/drivers/mmc/host/Kconfig
+--- linux-2.6.24.3/drivers/mmc/host/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/mmc/host/Kconfig 2008-04-23 19:33:40.000000000 +0200
+@@ -91,6 +91,16 @@
+
+ If unsure, say N.
+
++config MMC_ATMELMCI
++ tristate "Atmel Multimedia Card Interface support"
++ depends on AVR32 && MMC
++ help
++ This selects the Atmel Multimedia Card Interface. If you have
++ a AT91 (ARM) or AT32 (AVR32) platform with a Multimedia Card
++ slot, say Y or M here.
++
++ If unsure, say N.
++
+ config MMC_IMX
+ tristate "Motorola i.MX Multimedia Card Interface support"
+ depends on ARCH_IMX
+diff -urN linux-2.6.24.3/drivers/mmc/host/Makefile avr32-2.6/drivers/mmc/host/Makefile
+--- linux-2.6.24.3/drivers/mmc/host/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/mmc/host/Makefile 2008-04-23 19:33:40.000000000 +0200
+@@ -15,6 +15,7 @@
+ obj-$(CONFIG_MMC_AU1X) += au1xmmc.o
+ obj-$(CONFIG_MMC_OMAP) += omap.o
+ obj-$(CONFIG_MMC_AT91) += at91_mci.o
++obj-$(CONFIG_MMC_ATMELMCI) += atmel-mci.o
+ obj-$(CONFIG_MMC_TIFM_SD) += tifm_sd.o
+ obj-$(CONFIG_MMC_SPI) += mmc_spi.o
+
+diff -urN linux-2.6.24.3/drivers/mtd/chips/cfi_cmdset_0001.c avr32-2.6/drivers/mtd/chips/cfi_cmdset_0001.c
+--- linux-2.6.24.3/drivers/mtd/chips/cfi_cmdset_0001.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/mtd/chips/cfi_cmdset_0001.c 2008-04-23 20:12:41.000000000 +0200
@@ -50,6 +50,7 @@
#define I82802AC 0x00ac
#define MANUFACTURER_ST 0x0020
@@ -13848,7 +15603,7 @@ index 1707f98..d2ec6eb 100644
static int cfi_intelext_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
static int cfi_intelext_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-@@ -157,6 +158,47 @@ static void cfi_tell_features(struct cfi_pri_intelext *extp)
+@@ -157,6 +158,47 @@
}
#endif
@@ -13896,7 +15651,7 @@ index 1707f98..d2ec6eb 100644
#ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE
/* Some Intel Strata Flash prior to FPO revision C has bugs in this area */
static void fixup_intel_strataflash(struct mtd_info *mtd, void* param)
-@@ -234,6 +276,7 @@ static void fixup_use_powerup_lock(struct mtd_info *mtd, void *param)
+@@ -234,6 +276,7 @@
}
static struct cfi_fixup cfi_fixup_table[] = {
@@ -13904,11 +15659,10 @@ index 1707f98..d2ec6eb 100644
#ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE
{ CFI_MFR_ANY, CFI_ID_ANY, fixup_intel_strataflash, NULL },
#endif
-diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
-index 389acc6..571226e 100644
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -185,6 +185,10 @@ static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param)
+diff -urN linux-2.6.24.3/drivers/mtd/chips/cfi_cmdset_0002.c avr32-2.6/drivers/mtd/chips/cfi_cmdset_0002.c
+--- linux-2.6.24.3/drivers/mtd/chips/cfi_cmdset_0002.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/mtd/chips/cfi_cmdset_0002.c 2008-04-23 20:12:41.000000000 +0200
+@@ -185,6 +185,10 @@
extp->TopBottom = 2;
else
extp->TopBottom = 3;
@@ -13919,7 +15673,7 @@ index 389acc6..571226e 100644
}
static void fixup_use_secsi(struct mtd_info *mtd, void *param)
-@@ -217,6 +221,7 @@ static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param)
+@@ -217,6 +221,7 @@
}
static struct cfi_fixup cfi_fixup_table[] = {
@@ -13927,7 +15681,7 @@ index 389acc6..571226e 100644
#ifdef AMD_BOOTLOC_BUG
{ CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL },
#endif
-@@ -229,7 +234,6 @@ static struct cfi_fixup cfi_fixup_table[] = {
+@@ -229,7 +234,6 @@
#if !FORCE_WORD_WRITE
{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
#endif
@@ -13935,41 +15689,21 @@ index 389acc6..571226e 100644
{ 0, 0, NULL, NULL }
};
static struct cfi_fixup jedec_fixup_table[] = {
-diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig
-index 519b4ff..847f983 100644
---- a/drivers/pcmcia/Kconfig
-+++ b/drivers/pcmcia/Kconfig
-@@ -276,6 +276,13 @@ config ELECTRA_CF
- Say Y here to support the CompactFlash controller on the
- PA Semi Electra eval board.
-
-+config AT32_CF
-+ tristate "AT32AP CompactFlash Controller"
-+ depends on PCMCIA && AVR32 && PLATFORM_AT32AP
-+ help
-+ Say Y here to support the CompactFlash controller on AT32 chips.
-+ Or choose M to compile the driver as a module named "at32_cf".
-+
- config PCCARD_NONSTATIC
- tristate
-
-diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile
-index 6f6478b..3526fd8 100644
---- a/drivers/pcmcia/Makefile
-+++ b/drivers/pcmcia/Makefile
-@@ -38,6 +38,7 @@ obj-$(CONFIG_PCMCIA_VRC4173) += vrc4173_cardu.o
- obj-$(CONFIG_OMAP_CF) += omap_cf.o
- obj-$(CONFIG_AT91_CF) += at91_cf.o
- obj-$(CONFIG_ELECTRA_CF) += electra_cf.o
-+obj-$(CONFIG_AT32_CF) += at32_cf.o
-
- sa11xx_core-y += soc_common.o sa11xx_base.o
- pxa2xx_core-y += soc_common.o pxa2xx_base.o
-diff --git a/drivers/pcmcia/at32_cf.c b/drivers/pcmcia/at32_cf.c
-new file mode 100644
-index 0000000..010bdfd
---- /dev/null
-+++ b/drivers/pcmcia/at32_cf.c
+diff -urN linux-2.6.24.3/drivers/net/macb.c avr32-2.6/drivers/net/macb.c
+--- linux-2.6.24.3/drivers/net/macb.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/net/macb.c 2008-04-23 20:12:41.000000000 +0200
+@@ -148,7 +148,7 @@
+
+ if (phydev->duplex)
+ reg |= MACB_BIT(FD);
+- if (phydev->speed)
++ if (phydev->speed == SPEED_100)
+ reg |= MACB_BIT(SPD);
+
+ macb_writel(bp, NCFGR, reg);
+diff -urN linux-2.6.24.3/drivers/pcmcia/at32_cf.c avr32-2.6/drivers/pcmcia/at32_cf.c
+--- linux-2.6.24.3/drivers/pcmcia/at32_cf.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/drivers/pcmcia/at32_cf.c 2008-04-23 19:33:42.000000000 +0200
@@ -0,0 +1,533 @@
+/*
+ * Driver for AVR32 Static Memory Controller: CompactFlash support
@@ -14504,36 +16238,37 @@ index 0000000..010bdfd
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Driver for SMC PCMCIA interface");
+MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>");
-diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
-index d7e1996..67bfbb0 100644
---- a/drivers/serial/Kconfig
-+++ b/drivers/serial/Kconfig
-@@ -380,6 +380,21 @@ config SERIAL_ATMEL_CONSOLE
- console is the device which receives all kernel messages and
- warnings and which allows logins in single user mode).
+diff -urN linux-2.6.24.3/drivers/pcmcia/Kconfig avr32-2.6/drivers/pcmcia/Kconfig
+--- linux-2.6.24.3/drivers/pcmcia/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/pcmcia/Kconfig 2008-04-23 19:33:42.000000000 +0200
+@@ -276,6 +276,13 @@
+ Say Y here to support the CompactFlash controller on the
+ PA Semi Electra eval board.
-+config SERIAL_ATMEL_PDC
-+ bool "Support DMA transfers on AT91 / AT32 serial port"
-+ depends on SERIAL_ATMEL
-+ default y
++config AT32_CF
++ tristate "AT32AP CompactFlash Controller"
++ depends on PCMCIA && AVR32 && PLATFORM_AT32AP
+ help
-+ Say Y here if you wish to use the PDC to do DMA transfers to
-+ and from the Atmel AT91 / AT32 serial port. In order to
-+ actually use DMA transfers, make sure that the use_dma_tx
-+ and use_dma_rx members in the atmel_uart_data struct is set
-+ appropriately for each port.
-+
-+ Note that break and error handling currently doesn't work
-+ properly when DMA is enabled. Make sure that ports where
-+ this matters don't use DMA.
++ Say Y here to support the CompactFlash controller on AT32 chips.
++ Or choose M to compile the driver as a module named "at32_cf".
+
- config SERIAL_ATMEL_TTYAT
- bool "Install as device ttyATn instead of ttySn"
- depends on SERIAL_ATMEL=y
-diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c
-index 111da57..477950f 100644
---- a/drivers/serial/atmel_serial.c
-+++ b/drivers/serial/atmel_serial.c
+ config PCCARD_NONSTATIC
+ tristate
+
+diff -urN linux-2.6.24.3/drivers/pcmcia/Makefile avr32-2.6/drivers/pcmcia/Makefile
+--- linux-2.6.24.3/drivers/pcmcia/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/pcmcia/Makefile 2008-04-23 19:33:42.000000000 +0200
+@@ -38,6 +38,7 @@
+ obj-$(CONFIG_OMAP_CF) += omap_cf.o
+ obj-$(CONFIG_AT91_CF) += at91_cf.o
+ obj-$(CONFIG_ELECTRA_CF) += electra_cf.o
++obj-$(CONFIG_AT32_CF) += at32_cf.o
+
+ sa11xx_core-y += soc_common.o sa11xx_base.o
+ pxa2xx_core-y += soc_common.o pxa2xx_base.o
+diff -urN linux-2.6.24.3/drivers/serial/atmel_serial.c avr32-2.6/drivers/serial/atmel_serial.c
+--- linux-2.6.24.3/drivers/serial/atmel_serial.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/serial/atmel_serial.c 2008-04-23 20:12:44.000000000 +0200
@@ -7,6 +7,8 @@
* Based on drivers/char/serial_sa1100.c, by Deep Blue Solutions Ltd.
* Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
@@ -14543,26 +16278,28 @@ index 111da57..477950f 100644
* 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
-@@ -33,6 +35,7 @@
+@@ -33,7 +35,9 @@
#include <linux/sysrq.h>
#include <linux/tty_flip.h>
#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
#include <linux/atmel_pdc.h>
++#include <linux/atmel_serial.h>
#include <asm/io.h>
-@@ -47,6 +50,10 @@
- #include "atmel_serial.h"
+@@ -45,7 +49,9 @@
+ #include <asm/arch/gpio.h>
+ #endif
+-#include "atmel_serial.h"
+#define PDC_BUFFER_SIZE 512
+/* Revisit: We should calculate this based on the actual port settings */
+#define PDC_RX_TIMEOUT (3 * 10) /* 3 bytes */
-+
+
#if defined(CONFIG_SERIAL_ATMEL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
#define SUPPORT_SYSRQ
- #endif
-@@ -74,6 +81,7 @@
+@@ -74,6 +80,7 @@
#define ATMEL_ISR_PASS_LIMIT 256
@@ -14570,7 +16307,7 @@ index 111da57..477950f 100644
#define UART_PUT_CR(port,v) __raw_writel(v, (port)->membase + ATMEL_US_CR)
#define UART_GET_MR(port) __raw_readl((port)->membase + ATMEL_US_MR)
#define UART_PUT_MR(port,v) __raw_writel(v, (port)->membase + ATMEL_US_MR)
-@@ -87,8 +95,6 @@
+@@ -87,8 +94,6 @@
#define UART_PUT_BRGR(port,v) __raw_writel(v, (port)->membase + ATMEL_US_BRGR)
#define UART_PUT_RTOR(port,v) __raw_writel(v, (port)->membase + ATMEL_US_RTOR)
@@ -14579,7 +16316,7 @@ index 111da57..477950f 100644
/* PDC registers */
#define UART_PUT_PTCR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_PTCR)
#define UART_GET_PTSR(port) __raw_readl((port)->membase + ATMEL_PDC_PTSR)
-@@ -101,12 +107,24 @@
+@@ -101,12 +106,24 @@
#define UART_PUT_TPR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_TPR)
#define UART_PUT_TCR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_TCR)
@@ -14606,7 +16343,7 @@ index 111da57..477950f 100644
/*
* We wrap our port structure around the generic uart_port.
*/
-@@ -115,6 +133,19 @@ struct atmel_uart_port {
+@@ -115,6 +132,19 @@
struct clk *clk; /* uart clock */
unsigned short suspended; /* is port suspended? */
int break_active; /* break being received */
@@ -14626,7 +16363,7 @@ index 111da57..477950f 100644
};
static struct atmel_uart_port atmel_ports[ATMEL_MAX_UART];
-@@ -123,6 +154,38 @@ static struct atmel_uart_port atmel_ports[ATMEL_MAX_UART];
+@@ -123,6 +153,38 @@
static struct console atmel_console;
#endif
@@ -14665,7 +16402,7 @@ index 111da57..477950f 100644
/*
* Return TIOCSER_TEMT when transmitter FIFO and Shift register is empty.
*/
-@@ -142,8 +205,8 @@ static void atmel_set_mctrl(struct uart_port *port, u_int mctrl)
+@@ -142,8 +204,8 @@
#ifdef CONFIG_ARCH_AT91RM9200
if (cpu_is_at91rm9200()) {
/*
@@ -14676,7 +16413,7 @@ index 111da57..477950f 100644
*/
if (port->mapbase == AT91RM9200_BASE_US0) {
if (mctrl & TIOCM_RTS)
-@@ -204,7 +267,12 @@ static u_int atmel_get_mctrl(struct uart_port *port)
+@@ -204,7 +266,12 @@
*/
static void atmel_stop_tx(struct uart_port *port)
{
@@ -14690,7 +16427,7 @@ index 111da57..477950f 100644
}
/*
-@@ -212,7 +280,17 @@ static void atmel_stop_tx(struct uart_port *port)
+@@ -212,7 +279,17 @@
*/
static void atmel_start_tx(struct uart_port *port)
{
@@ -14709,7 +16446,7 @@ index 111da57..477950f 100644
}
/*
-@@ -220,7 +298,12 @@ static void atmel_start_tx(struct uart_port *port)
+@@ -220,7 +297,12 @@
*/
static void atmel_stop_rx(struct uart_port *port)
{
@@ -14723,7 +16460,7 @@ index 111da57..477950f 100644
}
/*
-@@ -228,7 +311,8 @@ static void atmel_stop_rx(struct uart_port *port)
+@@ -228,7 +310,8 @@
*/
static void atmel_enable_ms(struct uart_port *port)
{
@@ -14733,7 +16470,7 @@ index 111da57..477950f 100644
}
/*
-@@ -243,22 +327,63 @@ static void atmel_break_ctl(struct uart_port *port, int break_state)
+@@ -243,22 +326,63 @@
}
/*
@@ -14804,7 +16541,7 @@ index 111da57..477950f 100644
/*
* note that the error handling code is
* out of the main execution path
-@@ -266,15 +391,14 @@ static void atmel_rx_chars(struct uart_port *port)
+@@ -266,15 +390,14 @@
if (unlikely(status & (ATMEL_US_PARE | ATMEL_US_FRAME
| ATMEL_US_OVRE | ATMEL_US_RXBRK)
|| atmel_port->break_active)) {
@@ -14824,7 +16561,7 @@ index 111da57..477950f 100644
} else {
/*
* This is either the end-of-break
-@@ -287,52 +411,30 @@ static void atmel_rx_chars(struct uart_port *port)
+@@ -287,52 +410,30 @@
status &= ~ATMEL_US_RXBRK;
atmel_port->break_active = 0;
}
@@ -14883,7 +16620,7 @@ index 111da57..477950f 100644
while (UART_GET_CSR(port) & ATMEL_US_TXRDY) {
UART_PUT_CHAR(port, xmit->buf[xmit->tail]);
-@@ -345,8 +447,88 @@ static void atmel_tx_chars(struct uart_port *port)
+@@ -345,8 +446,88 @@
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
uart_write_wakeup(port);
@@ -14974,7 +16711,7 @@ index 111da57..477950f 100644
}
/*
-@@ -355,47 +537,255 @@ static void atmel_tx_chars(struct uart_port *port)
+@@ -355,47 +536,255 @@
static irqreturn_t atmel_interrupt(int irq, void *dev_id)
{
struct uart_port *port = dev_id;
@@ -15170,12 +16907,8 @@ index 111da57..477950f 100644
+
+ port->icount.rx += count;
+ pdc->ofs = head;
- }
-
-- // TODO: All reads to CSR will clear these interrupts!
-- if (pending & ATMEL_US_RIIC) port->icount.rng++;
-- if (pending & ATMEL_US_DSRIC) port->icount.dsr++;
-- if (pending & ATMEL_US_DCDIC)
++ }
++
+ /*
+ * If the current buffer is full, we need to check if
+ * the next one contains any additional data.
@@ -15187,7 +16920,7 @@ index 111da57..477950f 100644
+
+ rx_idx = !rx_idx;
+ atmel_port->pdc_rx_idx = rx_idx;
-+ }
+ }
+ } while (head >= pdc->dma_size);
+
+ /*
@@ -15200,7 +16933,11 @@ index 111da57..477950f 100644
+
+ UART_PUT_IER(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT);
+}
-+
+
+- // TODO: All reads to CSR will clear these interrupts!
+- if (pending & ATMEL_US_RIIC) port->icount.rng++;
+- if (pending & ATMEL_US_DSRIC) port->icount.dsr++;
+- if (pending & ATMEL_US_DCDIC)
+/*
+ * tasklet handling tty stuff outside the interrupt handler.
+ */
@@ -15236,15 +16973,15 @@ index 111da57..477950f 100644
uart_handle_cts_change(port, !(status & ATMEL_US_CTS));
- if (pending & (ATMEL_US_RIIC | ATMEL_US_DSRIC | ATMEL_US_DCDIC | ATMEL_US_CTSIC))
- wake_up_interruptible(&port->info->delta_msr_wait);
-
+-
- /* Interrupt transmit */
- if (pending & ATMEL_US_TXRDY)
- atmel_tx_chars(port);
-+ wake_up_interruptible(&port->info->delta_msr_wait);
- if (pass_counter++ > ATMEL_ISR_PASS_LIMIT)
- break;
--
++ wake_up_interruptible(&port->info->delta_msr_wait);
+
- status = UART_GET_CSR(port);
- pending = status & UART_GET_IMR(port);
+ atmel_port->irq_status_prev = status;
@@ -15260,7 +16997,7 @@ index 111da57..477950f 100644
}
/*
-@@ -403,6 +793,8 @@ static irqreturn_t atmel_interrupt(int irq, void *dev_id)
+@@ -403,6 +792,8 @@
*/
static int atmel_startup(struct uart_port *port)
{
@@ -15269,7 +17006,7 @@ index 111da57..477950f 100644
int retval;
/*
-@@ -415,13 +807,64 @@ static int atmel_startup(struct uart_port *port)
+@@ -415,13 +806,64 @@
/*
* Allocate the IRQ
*/
@@ -15335,7 +17072,7 @@ index 111da57..477950f 100644
* If there is a specific "open" function (to register
* control line interrupts)
*/
-@@ -437,9 +880,21 @@ static int atmel_startup(struct uart_port *port)
+@@ -437,9 +879,21 @@
* Finally, enable the serial port
*/
UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
@@ -15359,7 +17096,7 @@ index 111da57..477950f 100644
return 0;
}
-@@ -449,6 +904,38 @@ static int atmel_startup(struct uart_port *port)
+@@ -449,6 +903,38 @@
*/
static void atmel_shutdown(struct uart_port *port)
{
@@ -15398,7 +17135,7 @@ index 111da57..477950f 100644
/*
* Disable all interrupts, port and break condition.
*/
-@@ -471,45 +958,48 @@ static void atmel_shutdown(struct uart_port *port)
+@@ -471,45 +957,48 @@
/*
* Power / Clock management.
*/
@@ -15469,7 +17206,7 @@ index 111da57..477950f 100644
quot /= 8;
mode |= ATMEL_US_USCLKS_MCK_DIV8;
}
-@@ -536,18 +1026,17 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios * termios,
+@@ -536,18 +1025,17 @@
/* parity */
if (termios->c_cflag & PARENB) {
@@ -15492,7 +17229,7 @@ index 111da57..477950f 100644
mode |= ATMEL_US_PAR_NONE;
spin_lock_irqsave(&port->lock, flags);
-@@ -558,6 +1047,10 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios * termios,
+@@ -558,6 +1046,10 @@
if (termios->c_iflag & (BRKINT | PARMRK))
port->read_status_mask |= ATMEL_US_RXBRK;
@@ -15503,7 +17240,7 @@ index 111da57..477950f 100644
/*
* Characters to ignore
*/
-@@ -573,16 +1066,16 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios * termios,
+@@ -573,16 +1065,16 @@
if (termios->c_iflag & IGNPAR)
port->ignore_status_mask |= ATMEL_US_OVRE;
}
@@ -15526,7 +17263,7 @@ index 111da57..477950f 100644
/* disable receiver and transmitter */
UART_PUT_CR(port, ATMEL_US_TXDIS | ATMEL_US_RXDIS);
-@@ -708,7 +1201,8 @@ static struct uart_ops atmel_pops = {
+@@ -708,7 +1200,8 @@
/*
* Configure the port from the platform device resource info.
*/
@@ -15536,7 +17273,7 @@ index 111da57..477950f 100644
{
struct uart_port *port = &atmel_port->uart;
struct atmel_uart_data *data = pdev->dev.platform_data;
-@@ -723,6 +1217,11 @@ static void __devinit atmel_init_port(struct atmel_uart_port *atmel_port, struct
+@@ -723,6 +1216,11 @@
port->mapbase = pdev->resource[0].start;
port->irq = pdev->resource[1].start;
@@ -15548,7 +17285,7 @@ index 111da57..477950f 100644
if (data->regs)
/* Already mapped by setup code */
port->membase = data->regs;
-@@ -731,11 +1230,17 @@ static void __devinit atmel_init_port(struct atmel_uart_port *atmel_port, struct
+@@ -731,11 +1229,17 @@
port->membase = NULL;
}
@@ -15567,7 +17304,7 @@ index 111da57..477950f 100644
}
/*
-@@ -755,12 +1260,11 @@ void __init atmel_register_uart_fns(struct atmel_port_fns *fns)
+@@ -755,12 +1259,11 @@
atmel_pops.set_wake = fns->set_wake;
}
@@ -15581,7 +17318,7 @@ index 111da57..477950f 100644
UART_PUT_CHAR(port, ch);
}
-@@ -773,38 +1277,40 @@ static void atmel_console_write(struct console *co, const char *s, u_int count)
+@@ -773,38 +1276,40 @@
unsigned int status, imr;
/*
@@ -15637,7 +17374,7 @@ index 111da57..477950f 100644
mr = UART_GET_MR(port) & ATMEL_US_CHRL;
if (mr == ATMEL_US_CHRL_8)
-@@ -824,7 +1330,6 @@ static void __init atmel_console_get_options(struct uart_port *port, int *baud,
+@@ -824,7 +1329,6 @@
* lower than one of those, as it would make us fall through
* to a much lower baud rate than we really want.
*/
@@ -15645,7 +17382,7 @@ index 111da57..477950f 100644
*baud = port->uartclk / (16 * (quot - 1));
}
-@@ -836,10 +1341,12 @@ static int __init atmel_console_setup(struct console *co, char *options)
+@@ -836,10 +1340,12 @@
int parity = 'n';
int flow = 'n';
@@ -15660,7 +17397,7 @@ index 111da57..477950f 100644
UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN);
-@@ -871,13 +1378,16 @@ static struct console atmel_console = {
+@@ -871,13 +1377,16 @@
static int __init atmel_console_init(void)
{
if (atmel_default_console_device) {
@@ -15679,7 +17416,7 @@ index 111da57..477950f 100644
console_initcall(atmel_console_init);
/*
-@@ -885,34 +1395,48 @@ console_initcall(atmel_console_init);
+@@ -885,34 +1394,48 @@
*/
static int __init atmel_late_console_init(void)
{
@@ -15739,7 +17476,7 @@ index 111da57..477950f 100644
enable_irq_wake(port->irq);
else {
uart_suspend_port(&atmel_uart, port);
-@@ -925,13 +1449,12 @@ static int atmel_serial_suspend(struct platform_device *pdev, pm_message_t state
+@@ -925,13 +1448,12 @@
static int atmel_serial_resume(struct platform_device *pdev)
{
struct uart_port *port = platform_get_drvdata(pdev);
@@ -15755,7 +17492,7 @@ index 111da57..477950f 100644
disable_irq_wake(port->irq);
return 0;
-@@ -944,15 +1467,40 @@ static int atmel_serial_resume(struct platform_device *pdev)
+@@ -944,15 +1466,40 @@
static int __devinit atmel_serial_probe(struct platform_device *pdev)
{
struct atmel_uart_port *port;
@@ -15799,7 +17536,7 @@ index 111da57..477950f 100644
}
return ret;
-@@ -961,19 +1509,21 @@ static int __devinit atmel_serial_probe(struct platform_device *pdev)
+@@ -961,19 +1508,21 @@
static int __devexit atmel_serial_remove(struct platform_device *pdev)
{
struct uart_port *port = platform_get_drvdata(pdev);
@@ -15829,11 +17566,166 @@ index 111da57..477950f 100644
return ret;
}
-diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c
-index ff10808..293b7ca 100644
---- a/drivers/spi/atmel_spi.c
-+++ b/drivers/spi/atmel_spi.c
-@@ -51,7 +51,9 @@ struct atmel_spi {
+diff -urN linux-2.6.24.3/drivers/serial/atmel_serial.h avr32-2.6/drivers/serial/atmel_serial.h
+--- linux-2.6.24.3/drivers/serial/atmel_serial.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/serial/atmel_serial.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,127 +0,0 @@
+-/*
+- * drivers/serial/atmel_serial.h
+- *
+- * Copyright (C) 2005 Ivan Kokshaysky
+- * Copyright (C) SAN People
+- *
+- * USART registers.
+- * Based on AT91RM9200 datasheet revision E.
+- *
+- * 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.
+- */
+-
+-#ifndef ATMEL_SERIAL_H
+-#define ATMEL_SERIAL_H
+-
+-#define ATMEL_US_CR 0x00 /* Control Register */
+-#define ATMEL_US_RSTRX (1 << 2) /* Reset Receiver */
+-#define ATMEL_US_RSTTX (1 << 3) /* Reset Transmitter */
+-#define ATMEL_US_RXEN (1 << 4) /* Receiver Enable */
+-#define ATMEL_US_RXDIS (1 << 5) /* Receiver Disable */
+-#define ATMEL_US_TXEN (1 << 6) /* Transmitter Enable */
+-#define ATMEL_US_TXDIS (1 << 7) /* Transmitter Disable */
+-#define ATMEL_US_RSTSTA (1 << 8) /* Reset Status Bits */
+-#define ATMEL_US_STTBRK (1 << 9) /* Start Break */
+-#define ATMEL_US_STPBRK (1 << 10) /* Stop Break */
+-#define ATMEL_US_STTTO (1 << 11) /* Start Time-out */
+-#define ATMEL_US_SENDA (1 << 12) /* Send Address */
+-#define ATMEL_US_RSTIT (1 << 13) /* Reset Iterations */
+-#define ATMEL_US_RSTNACK (1 << 14) /* Reset Non Acknowledge */
+-#define ATMEL_US_RETTO (1 << 15) /* Rearm Time-out */
+-#define ATMEL_US_DTREN (1 << 16) /* Data Terminal Ready Enable [AT91RM9200 only] */
+-#define ATMEL_US_DTRDIS (1 << 17) /* Data Terminal Ready Disable [AT91RM9200 only] */
+-#define ATMEL_US_RTSEN (1 << 18) /* Request To Send Enable */
+-#define ATMEL_US_RTSDIS (1 << 19) /* Request To Send Disable */
+-
+-#define ATMEL_US_MR 0x04 /* Mode Register */
+-#define ATMEL_US_USMODE (0xf << 0) /* Mode of the USART */
+-#define ATMEL_US_USMODE_NORMAL 0
+-#define ATMEL_US_USMODE_RS485 1
+-#define ATMEL_US_USMODE_HWHS 2
+-#define ATMEL_US_USMODE_MODEM 3
+-#define ATMEL_US_USMODE_ISO7816_T0 4
+-#define ATMEL_US_USMODE_ISO7816_T1 6
+-#define ATMEL_US_USMODE_IRDA 8
+-#define ATMEL_US_USCLKS (3 << 4) /* Clock Selection */
+-#define ATMEL_US_USCLKS_MCK (0 << 4)
+-#define ATMEL_US_USCLKS_MCK_DIV8 (1 << 4)
+-#define ATMEL_US_USCLKS_SCK (3 << 4)
+-#define ATMEL_US_CHRL (3 << 6) /* Character Length */
+-#define ATMEL_US_CHRL_5 (0 << 6)
+-#define ATMEL_US_CHRL_6 (1 << 6)
+-#define ATMEL_US_CHRL_7 (2 << 6)
+-#define ATMEL_US_CHRL_8 (3 << 6)
+-#define ATMEL_US_SYNC (1 << 8) /* Synchronous Mode Select */
+-#define ATMEL_US_PAR (7 << 9) /* Parity Type */
+-#define ATMEL_US_PAR_EVEN (0 << 9)
+-#define ATMEL_US_PAR_ODD (1 << 9)
+-#define ATMEL_US_PAR_SPACE (2 << 9)
+-#define ATMEL_US_PAR_MARK (3 << 9)
+-#define ATMEL_US_PAR_NONE (4 << 9)
+-#define ATMEL_US_PAR_MULTI_DROP (6 << 9)
+-#define ATMEL_US_NBSTOP (3 << 12) /* Number of Stop Bits */
+-#define ATMEL_US_NBSTOP_1 (0 << 12)
+-#define ATMEL_US_NBSTOP_1_5 (1 << 12)
+-#define ATMEL_US_NBSTOP_2 (2 << 12)
+-#define ATMEL_US_CHMODE (3 << 14) /* Channel Mode */
+-#define ATMEL_US_CHMODE_NORMAL (0 << 14)
+-#define ATMEL_US_CHMODE_ECHO (1 << 14)
+-#define ATMEL_US_CHMODE_LOC_LOOP (2 << 14)
+-#define ATMEL_US_CHMODE_REM_LOOP (3 << 14)
+-#define ATMEL_US_MSBF (1 << 16) /* Bit Order */
+-#define ATMEL_US_MODE9 (1 << 17) /* 9-bit Character Length */
+-#define ATMEL_US_CLKO (1 << 18) /* Clock Output Select */
+-#define ATMEL_US_OVER (1 << 19) /* Oversampling Mode */
+-#define ATMEL_US_INACK (1 << 20) /* Inhibit Non Acknowledge */
+-#define ATMEL_US_DSNACK (1 << 21) /* Disable Successive NACK */
+-#define ATMEL_US_MAX_ITER (7 << 24) /* Max Iterations */
+-#define ATMEL_US_FILTER (1 << 28) /* Infrared Receive Line Filter */
+-
+-#define ATMEL_US_IER 0x08 /* Interrupt Enable Register */
+-#define ATMEL_US_RXRDY (1 << 0) /* Receiver Ready */
+-#define ATMEL_US_TXRDY (1 << 1) /* Transmitter Ready */
+-#define ATMEL_US_RXBRK (1 << 2) /* Break Received / End of Break */
+-#define ATMEL_US_ENDRX (1 << 3) /* End of Receiver Transfer */
+-#define ATMEL_US_ENDTX (1 << 4) /* End of Transmitter Transfer */
+-#define ATMEL_US_OVRE (1 << 5) /* Overrun Error */
+-#define ATMEL_US_FRAME (1 << 6) /* Framing Error */
+-#define ATMEL_US_PARE (1 << 7) /* Parity Error */
+-#define ATMEL_US_TIMEOUT (1 << 8) /* Receiver Time-out */
+-#define ATMEL_US_TXEMPTY (1 << 9) /* Transmitter Empty */
+-#define ATMEL_US_ITERATION (1 << 10) /* Max number of Repetitions Reached */
+-#define ATMEL_US_TXBUFE (1 << 11) /* Transmission Buffer Empty */
+-#define ATMEL_US_RXBUFF (1 << 12) /* Reception Buffer Full */
+-#define ATMEL_US_NACK (1 << 13) /* Non Acknowledge */
+-#define ATMEL_US_RIIC (1 << 16) /* Ring Indicator Input Change [AT91RM9200 only] */
+-#define ATMEL_US_DSRIC (1 << 17) /* Data Set Ready Input Change [AT91RM9200 only] */
+-#define ATMEL_US_DCDIC (1 << 18) /* Data Carrier Detect Input Change [AT91RM9200 only] */
+-#define ATMEL_US_CTSIC (1 << 19) /* Clear to Send Input Change */
+-#define ATMEL_US_RI (1 << 20) /* RI */
+-#define ATMEL_US_DSR (1 << 21) /* DSR */
+-#define ATMEL_US_DCD (1 << 22) /* DCD */
+-#define ATMEL_US_CTS (1 << 23) /* CTS */
+-
+-#define ATMEL_US_IDR 0x0c /* Interrupt Disable Register */
+-#define ATMEL_US_IMR 0x10 /* Interrupt Mask Register */
+-#define ATMEL_US_CSR 0x14 /* Channel Status Register */
+-#define ATMEL_US_RHR 0x18 /* Receiver Holding Register */
+-#define ATMEL_US_THR 0x1c /* Transmitter Holding Register */
+-#define ATMEL_US_SYNH (1 << 15) /* Transmit/Receive Sync [AT91SAM9261 only] */
+-
+-#define ATMEL_US_BRGR 0x20 /* Baud Rate Generator Register */
+-#define ATMEL_US_CD (0xffff << 0) /* Clock Divider */
+-
+-#define ATMEL_US_RTOR 0x24 /* Receiver Time-out Register */
+-#define ATMEL_US_TO (0xffff << 0) /* Time-out Value */
+-
+-#define ATMEL_US_TTGR 0x28 /* Transmitter Timeguard Register */
+-#define ATMEL_US_TG (0xff << 0) /* Timeguard Value */
+-
+-#define ATMEL_US_FIDI 0x40 /* FI DI Ratio Register */
+-#define ATMEL_US_NER 0x44 /* Number of Errors Register */
+-#define ATMEL_US_IF 0x4c /* IrDA Filter Register */
+-
+-#endif
+diff -urN linux-2.6.24.3/drivers/serial/Kconfig avr32-2.6/drivers/serial/Kconfig
+--- linux-2.6.24.3/drivers/serial/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/serial/Kconfig 2008-04-23 20:12:44.000000000 +0200
+@@ -380,6 +380,21 @@
+ console is the device which receives all kernel messages and
+ warnings and which allows logins in single user mode).
+
++config SERIAL_ATMEL_PDC
++ bool "Support DMA transfers on AT91 / AT32 serial port"
++ depends on SERIAL_ATMEL
++ default y
++ help
++ Say Y here if you wish to use the PDC to do DMA transfers to
++ and from the Atmel AT91 / AT32 serial port. In order to
++ actually use DMA transfers, make sure that the use_dma_tx
++ and use_dma_rx members in the atmel_uart_data struct is set
++ appropriately for each port.
++
++ Note that break and error handling currently doesn't work
++ properly when DMA is enabled. Make sure that ports where
++ this matters don't use DMA.
++
+ config SERIAL_ATMEL_TTYAT
+ bool "Install as device ttyATn instead of ttySn"
+ depends on SERIAL_ATMEL=y
+diff -urN linux-2.6.24.3/drivers/spi/atmel_spi.c avr32-2.6/drivers/spi/atmel_spi.c
+--- linux-2.6.24.3/drivers/spi/atmel_spi.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/spi/atmel_spi.c 2008-04-23 20:12:44.000000000 +0200
+@@ -51,7 +51,9 @@
u8 stopping;
struct list_head queue;
struct spi_transfer *current_transfer;
@@ -15844,7 +17736,24 @@ index ff10808..293b7ca 100644
void *buffer;
dma_addr_t buffer_dma;
-@@ -121,6 +123,48 @@ static void cs_deactivate(struct atmel_spi *as, struct spi_device *spi)
+@@ -85,6 +87,16 @@
+ unsigned gpio = (unsigned) spi->controller_data;
+ unsigned active = spi->mode & SPI_CS_HIGH;
+ u32 mr;
++ int i;
++ u32 csr;
++ u32 cpol = (spi->mode & SPI_CPOL) ? SPI_BIT(CPOL) : 0;
++
++ /* Make sure clock polarity is correct */
++ for (i = 0; i < spi->master->num_chipselect; i++) {
++ csr = spi_readl(as, CSR0 + 4 * i);
++ if ((csr ^ cpol) & SPI_BIT(CPOL))
++ spi_writel(as, CSR0 + 4 * i, csr ^ SPI_BIT(CPOL));
++ }
+
+ mr = spi_readl(as, MR);
+ mr = SPI_BFINS(PCS, ~(1 << spi->chip_select), mr);
+@@ -121,6 +133,48 @@
gpio_set_value(gpio, !active);
}
@@ -15893,7 +17802,7 @@ index ff10808..293b7ca 100644
/*
* Submit next transfer for DMA.
* lock is held, spi irq is blocked
-@@ -130,53 +174,78 @@ static void atmel_spi_next_xfer(struct spi_master *master,
+@@ -130,53 +184,78 @@
{
struct atmel_spi *as = spi_master_get_devdata(master);
struct spi_transfer *xfer;
@@ -15911,7 +17820,6 @@ index ff10808..293b7ca 100644
- struct spi_transfer, transfer_list);
- as->remaining_bytes = xfer->len;
- as->current_transfer = xfer;
-- }
+ if (!as->current_transfer)
+ xfer = list_entry(msg->transfers.next,
+ struct spi_transfer, transfer_list);
@@ -15920,31 +17828,15 @@ index ff10808..293b7ca 100644
+ struct spi_transfer, transfer_list);
+ else
+ xfer = NULL;
-
-- len = as->remaining_bytes;
++
+ if (xfer) {
+ len = xfer->len;
+ atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len);
+ remaining = xfer->len - len;
-
-- tx_dma = xfer->tx_dma + xfer->len - len;
-- rx_dma = xfer->rx_dma + xfer->len - len;
++
+ spi_writel(as, RPR, rx_dma);
+ spi_writel(as, TPR, tx_dma);
-
-- /* use scratch buffer only when rx or tx data is unspecified */
-- if (!xfer->rx_buf) {
-- rx_dma = as->buffer_dma;
-- if (len > BUFFER_SIZE)
-- len = BUFFER_SIZE;
-- }
-- if (!xfer->tx_buf) {
-- tx_dma = as->buffer_dma;
-- if (len > BUFFER_SIZE)
-- len = BUFFER_SIZE;
-- memset(as->buffer, 0, len);
-- dma_sync_single_for_device(&as->pdev->dev,
-- as->buffer_dma, len, DMA_TO_DEVICE);
++
+ if (msg->spi->bits_per_word > 8)
+ len >>= 1;
+ spi_writel(as, RCR, len);
@@ -15959,14 +17851,12 @@ index ff10808..293b7ca 100644
+ remaining = as->next_remaining_bytes;
}
-- spi_writel(as, RPR, rx_dma);
-- spi_writel(as, TPR, tx_dma);
+- len = as->remaining_bytes;
+ as->current_transfer = xfer;
+ as->current_remaining_bytes = remaining;
-- as->remaining_bytes -= len;
-- if (msg->spi->bits_per_word > 8)
-- len >>= 1;
+- tx_dma = xfer->tx_dma + xfer->len - len;
+- rx_dma = xfer->rx_dma + xfer->len - len;
+ if (remaining > 0)
+ len = remaining;
+ else if (!atmel_spi_xfer_is_last(msg, xfer)
@@ -15977,13 +17867,24 @@ index ff10808..293b7ca 100644
+ } else
+ xfer = NULL;
-- /* REVISIT: when xfer->delay_usecs == 0, the PDC "next transfer"
-- * mechanism might help avoid the IRQ latency between transfers
-- * (and improve the nCS0 errata handling on at91rm9200 chips)
-- *
-- * We're also waiting for ENDRX before we start the next
+- /* use scratch buffer only when rx or tx data is unspecified */
+- if (!xfer->rx_buf) {
+- rx_dma = as->buffer_dma;
+- if (len > BUFFER_SIZE)
+- len = BUFFER_SIZE;
+- }
+- if (!xfer->tx_buf) {
+- tx_dma = as->buffer_dma;
+- if (len > BUFFER_SIZE)
+- len = BUFFER_SIZE;
+- memset(as->buffer, 0, len);
+- dma_sync_single_for_device(&as->pdev->dev,
+- as->buffer_dma, len, DMA_TO_DEVICE);
+- }
+ as->next_transfer = xfer;
-+
+
+- spi_writel(as, RPR, rx_dma);
+- spi_writel(as, TPR, tx_dma);
+ if (xfer) {
+ total = len;
+ atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len);
@@ -16005,12 +17906,21 @@ index ff10808..293b7ca 100644
+ spi_writel(as, RNCR, 0);
+ spi_writel(as, TNCR, 0);
+ }
-+
+
+- as->remaining_bytes -= len;
+- if (msg->spi->bits_per_word > 8)
+- len >>= 1;
+-
+- /* REVISIT: when xfer->delay_usecs == 0, the PDC "next transfer"
+- * mechanism might help avoid the IRQ latency between transfers
+- * (and improve the nCS0 errata handling on at91rm9200 chips)
+- *
+- * We're also waiting for ENDRX before we start the next
+ /* REVISIT: We're waiting for ENDRX before we start the next
* transfer because we need to handle some difficult timing
* issues otherwise. If we wait for ENDTX in one transfer and
* then starts waiting for ENDRX in the next, it's difficult
-@@ -186,17 +255,7 @@ static void atmel_spi_next_xfer(struct spi_master *master,
+@@ -186,17 +265,7 @@
*
* It should be doable, though. Just not now...
*/
@@ -16028,7 +17938,7 @@ index ff10808..293b7ca 100644
spi_writel(as, PTCR, SPI_BIT(TXTEN) | SPI_BIT(RXTEN));
}
-@@ -294,6 +353,7 @@ atmel_spi_msg_done(struct spi_master *master, struct atmel_spi *as,
+@@ -294,6 +363,7 @@
spin_lock(&as->lock);
as->current_transfer = NULL;
@@ -16036,7 +17946,7 @@ index ff10808..293b7ca 100644
/* continue if needed */
if (list_empty(&as->queue) || as->stopping)
-@@ -377,7 +437,7 @@ atmel_spi_interrupt(int irq, void *dev_id)
+@@ -377,7 +447,7 @@
spi_writel(as, IDR, pending);
@@ -16045,7 +17955,7 @@ index ff10808..293b7ca 100644
msg->actual_length += xfer->len;
if (!msg->is_dma_mapped)
-@@ -387,7 +447,7 @@ atmel_spi_interrupt(int irq, void *dev_id)
+@@ -387,7 +457,7 @@
if (xfer->delay_usecs)
udelay(xfer->delay_usecs);
@@ -16054,7 +17964,7 @@ index ff10808..293b7ca 100644
/* report completed message */
atmel_spi_msg_done(master, as, msg, 0,
xfer->cs_change);
-@@ -490,9 +550,14 @@ static int atmel_spi_setup(struct spi_device *spi)
+@@ -490,9 +560,14 @@
if (!(spi->mode & SPI_CPHA))
csr |= SPI_BIT(NCPHA);
@@ -16072,10 +17982,255 @@ index ff10808..293b7ca 100644
/* chipselect must have been muxed as GPIO (e.g. in board setup) */
npcs_pin = (unsigned int)spi->controller_data;
-diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c
-index 7c30cc8..5e99671 100644
---- a/drivers/video/atmel_lcdfb.c
-+++ b/drivers/video/atmel_lcdfb.c
+diff -urN linux-2.6.24.3/drivers/usb/gadget/atmel_usba_udc.c avr32-2.6/drivers/usb/gadget/atmel_usba_udc.c
+--- linux-2.6.24.3/drivers/usb/gadget/atmel_usba_udc.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/usb/gadget/atmel_usba_udc.c 2008-04-23 20:12:45.000000000 +0200
+@@ -18,6 +18,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/usb/ch9.h>
+ #include <linux/usb/gadget.h>
++#include <linux/usb/atmel_usba_udc.h>
+ #include <linux/delay.h>
+
+ #include <asm/gpio.h>
+@@ -27,6 +28,7 @@
+
+
+ static struct usba_udc the_udc;
++static struct usba_ep *usba_ep;
+
+ #ifdef CONFIG_USB_GADGET_DEBUG_FS
+ #include <linux/debugfs.h>
+@@ -324,53 +326,6 @@
+ return 1;
+ }
+
+-static void copy_to_fifo(void __iomem *fifo, const void *buf, int len)
+-{
+- unsigned long tmp;
+-
+- DBG(DBG_FIFO, "copy to FIFO (len %d):\n", len);
+- for (; len > 0; len -= 4, buf += 4, fifo += 4) {
+- tmp = *(unsigned long *)buf;
+- if (len >= 4) {
+- DBG(DBG_FIFO, " -> %08lx\n", tmp);
+- __raw_writel(tmp, fifo);
+- } else {
+- do {
+- DBG(DBG_FIFO, " -> %02lx\n", tmp >> 24);
+- __raw_writeb(tmp >> 24, fifo);
+- fifo++;
+- tmp <<= 8;
+- } while (--len);
+- break;
+- }
+- }
+-}
+-
+-static void copy_from_fifo(void *buf, void __iomem *fifo, int len)
+-{
+- union {
+- unsigned long *w;
+- unsigned char *b;
+- } p;
+- unsigned long tmp;
+-
+- DBG(DBG_FIFO, "copy from FIFO (len %d):\n", len);
+- for (p.w = buf; len > 0; len -= 4, p.w++, fifo += 4) {
+- if (len >= 4) {
+- tmp = __raw_readl(fifo);
+- *p.w = tmp;
+- DBG(DBG_FIFO, " -> %08lx\n", tmp);
+- } else {
+- do {
+- tmp = __raw_readb(fifo);
+- *p.b = tmp;
+- DBG(DBG_FIFO, " -> %02lx\n", tmp);
+- fifo++, p.b++;
+- } while (--len);
+- }
+- }
+-}
+-
+ static void next_fifo_transaction(struct usba_ep *ep, struct usba_request *req)
+ {
+ unsigned int transaction_len;
+@@ -387,7 +342,7 @@
+ ep->ep.name, req, transaction_len,
+ req->last_transaction ? ", done" : "");
+
+- copy_to_fifo(ep->fifo, req->req.buf + req->req.actual, transaction_len);
++ memcpy_toio(ep->fifo, req->req.buf + req->req.actual, transaction_len);
+ usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
+ req->req.actual += transaction_len;
+ }
+@@ -476,7 +431,7 @@
+ bytecount = req->req.length - req->req.actual;
+ }
+
+- copy_from_fifo(req->req.buf + req->req.actual,
++ memcpy_fromio(req->req.buf + req->req.actual,
+ ep->fifo, bytecount);
+ req->req.actual += bytecount;
+
+@@ -1029,33 +984,6 @@
+ .set_selfpowered = usba_udc_set_selfpowered,
+ };
+
+-#define EP(nam, idx, maxpkt, maxbk, dma, isoc) \
+-{ \
+- .ep = { \
+- .ops = &usba_ep_ops, \
+- .name = nam, \
+- .maxpacket = maxpkt, \
+- }, \
+- .udc = &the_udc, \
+- .queue = LIST_HEAD_INIT(usba_ep[idx].queue), \
+- .fifo_size = maxpkt, \
+- .nr_banks = maxbk, \
+- .index = idx, \
+- .can_dma = dma, \
+- .can_isoc = isoc, \
+-}
+-
+-static struct usba_ep usba_ep[] = {
+- EP("ep0", 0, 64, 1, 0, 0),
+- EP("ep1in-bulk", 1, 512, 2, 1, 1),
+- EP("ep2out-bulk", 2, 512, 2, 1, 1),
+- EP("ep3in-int", 3, 64, 3, 1, 0),
+- EP("ep4out-int", 4, 64, 3, 1, 0),
+- EP("ep5in-iso", 5, 1024, 3, 1, 1),
+- EP("ep6out-iso", 6, 1024, 3, 1, 1),
+-};
+-#undef EP
+-
+ static struct usb_endpoint_descriptor usba_ep0_desc = {
+ .bLength = USB_DT_ENDPOINT_SIZE,
+ .bDescriptorType = USB_DT_ENDPOINT,
+@@ -1074,7 +1002,6 @@
+ static struct usba_udc the_udc = {
+ .gadget = {
+ .ops = &usba_udc_ops,
+- .ep0 = &usba_ep[0].ep,
+ .ep_list = LIST_HEAD_INIT(the_udc.gadget.ep_list),
+ .is_dualspeed = 1,
+ .name = "atmel_usba_udc",
+@@ -1231,7 +1158,7 @@
+ } else {
+ usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE);
+ usba_writel(udc, TST, USBA_TST_PKT_MODE);
+- copy_to_fifo(ep->fifo, test_packet_buffer,
++ memcpy_toio(ep->fifo, test_packet_buffer,
+ sizeof(test_packet_buffer));
+ usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY);
+ dev_info(dev, "Entering Test_Packet mode...\n");
+@@ -1539,7 +1466,7 @@
+ }
+
+ DBG(DBG_FIFO, "Copying ctrl request from 0x%p:\n", ep->fifo);
+- copy_from_fifo(crq.data, ep->fifo, sizeof(crq));
++ memcpy_fromio(crq.data, ep->fifo, sizeof(crq));
+
+ /* Free up one bank in the FIFO so that we can
+ * generate or receive a reply right away. */
+@@ -1911,7 +1838,7 @@
+
+ regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID);
+ fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID);
+- if (!regs || !fifo)
++ if (!regs || !fifo || !pdata)
+ return -ENXIO;
+
+ irq = platform_get_irq(pdev, 0);
+@@ -1959,16 +1886,44 @@
+ usba_writel(udc, CTRL, 0);
+ clk_disable(pclk);
+
++ usba_ep = kmalloc(sizeof(struct usba_ep) * pdata->num_ep,
++ GFP_KERNEL);
++ if (!usba_ep)
++ goto err_alloc_ep;
++
++ the_udc.gadget.ep0 = &usba_ep[0].ep;
++
+ INIT_LIST_HEAD(&usba_ep[0].ep.ep_list);
+ usba_ep[0].ep_regs = udc->regs + USBA_EPT_BASE(0);
+ usba_ep[0].dma_regs = udc->regs + USBA_DMA_BASE(0);
+ usba_ep[0].fifo = udc->fifo + USBA_FIFO_BASE(0);
+- for (i = 1; i < ARRAY_SIZE(usba_ep); i++) {
++ usba_ep[0].ep.ops = &usba_ep_ops;
++ usba_ep[0].ep.name = pdata->ep[0].name;
++ usba_ep[0].ep.maxpacket = pdata->ep[0].fifo_size;
++ usba_ep[0].udc = &the_udc;
++ INIT_LIST_HEAD(&usba_ep[0].queue);
++ usba_ep[0].fifo_size = pdata->ep[0].fifo_size;
++ usba_ep[0].nr_banks = pdata->ep[0].nr_banks;
++ usba_ep[0].index = pdata->ep[0].index;
++ usba_ep[0].can_dma = pdata->ep[0].can_dma;
++ usba_ep[0].can_isoc = pdata->ep[0].can_isoc;
++
++ for (i = 1; i < pdata->num_ep; i++) {
+ struct usba_ep *ep = &usba_ep[i];
+
+ ep->ep_regs = udc->regs + USBA_EPT_BASE(i);
+ ep->dma_regs = udc->regs + USBA_DMA_BASE(i);
+ ep->fifo = udc->fifo + USBA_FIFO_BASE(i);
++ ep->ep.ops = &usba_ep_ops;
++ ep->ep.name = pdata->ep[i].name;
++ ep->ep.maxpacket = pdata->ep[i].fifo_size;
++ ep->udc = &the_udc;
++ INIT_LIST_HEAD(&ep->queue);
++ ep->fifo_size = pdata->ep[i].fifo_size;
++ ep->nr_banks = pdata->ep[i].nr_banks;
++ ep->index = pdata->ep[i].index;
++ ep->can_dma = pdata->ep[i].can_dma;
++ ep->can_isoc = pdata->ep[i].can_isoc;
+
+ list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
+ }
+@@ -1987,7 +1942,7 @@
+ goto err_device_add;
+ }
+
+- if (pdata && pdata->vbus_pin != GPIO_PIN_NONE) {
++ if (pdata->vbus_pin >= 0) {
+ if (!gpio_request(pdata->vbus_pin, "atmel_usba_udc")) {
+ udc->vbus_pin = pdata->vbus_pin;
+
+@@ -2007,7 +1962,7 @@
+ }
+
+ usba_init_debugfs(udc);
+- for (i = 1; i < ARRAY_SIZE(usba_ep); i++)
++ for (i = 1; i < pdata->num_ep; i++)
+ usba_ep_init_debugfs(udc, &usba_ep[i]);
+
+ return 0;
+@@ -2015,6 +1970,8 @@
+ err_device_add:
+ free_irq(irq, udc);
+ err_request_irq:
++ kfree(usba_ep);
++err_alloc_ep:
+ iounmap(udc->fifo);
+ err_map_fifo:
+ iounmap(udc->regs);
+@@ -2032,10 +1989,11 @@
+ {
+ struct usba_udc *udc;
+ int i;
++ struct usba_platform_data *pdata = pdev->dev.platform_data;
+
+ udc = platform_get_drvdata(pdev);
+
+- for (i = 1; i < ARRAY_SIZE(usba_ep); i++)
++ for (i = 1; i < pdata->num_ep; i++)
+ usba_ep_cleanup_debugfs(&usba_ep[i]);
+ usba_cleanup_debugfs(udc);
+
+diff -urN linux-2.6.24.3/drivers/video/atmel_lcdfb.c avr32-2.6/drivers/video/atmel_lcdfb.c
+--- linux-2.6.24.3/drivers/video/atmel_lcdfb.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/video/atmel_lcdfb.c 2008-04-23 20:12:45.000000000 +0200
@@ -16,6 +16,7 @@
#include <linux/fb.h>
#include <linux/init.h>
@@ -16095,7 +18250,7 @@ index 7c30cc8..5e99671 100644
static inline void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo,
struct fb_var_screeninfo *var)
-@@ -69,12 +72,113 @@ static void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo,
+@@ -69,12 +72,113 @@
}
#endif
@@ -16210,7 +18365,7 @@ index 7c30cc8..5e99671 100644
.ywrapstep = 0,
.accel = FB_ACCEL_NONE,
};
-@@ -148,6 +252,8 @@ static int atmel_lcdfb_alloc_video_memory(struct atmel_lcdfb_info *sinfo)
+@@ -148,6 +252,8 @@
return -ENOMEM;
}
@@ -16219,7 +18374,7 @@ index 7c30cc8..5e99671 100644
return 0;
}
-@@ -203,6 +309,26 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,
+@@ -203,6 +309,26 @@
var->transp.offset = var->transp.length = 0;
var->xoffset = var->yoffset = 0;
@@ -16246,7 +18401,7 @@ index 7c30cc8..5e99671 100644
switch (var->bits_per_pixel) {
case 1:
case 2:
-@@ -370,10 +496,6 @@ static int atmel_lcdfb_set_par(struct fb_info *info)
+@@ -370,10 +496,6 @@
/* Disable all interrupts */
lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL);
@@ -16257,7 +18412,7 @@ index 7c30cc8..5e99671 100644
/* ...wait for DMA engine to become idle... */
while (lcdc_readl(sinfo, ATMEL_LCDC_DMACON) & ATMEL_LCDC_DMABUSY)
msleep(10);
-@@ -516,7 +638,6 @@ static int __init atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)
+@@ -516,7 +638,6 @@
struct fb_info *info = sinfo->info;
int ret = 0;
@@ -16265,7 +18420,7 @@ index 7c30cc8..5e99671 100644
info->var.activate |= FB_ACTIVATE_FORCE | FB_ACTIVATE_NOW;
dev_info(info->device,
-@@ -577,6 +698,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
+@@ -577,6 +698,7 @@
sinfo->default_monspecs = pdata_sinfo->default_monspecs;
sinfo->atmel_lcdfb_power_control = pdata_sinfo->atmel_lcdfb_power_control;
sinfo->guard_time = pdata_sinfo->guard_time;
@@ -16273,7 +18428,7 @@ index 7c30cc8..5e99671 100644
} else {
dev_err(dev, "cannot get default configuration\n");
goto free_info;
-@@ -645,6 +767,11 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
+@@ -645,6 +767,11 @@
info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len);
if (!info->screen_base)
goto release_intmem;
@@ -16285,7 +18440,7 @@ index 7c30cc8..5e99671 100644
} else {
/* alocate memory buffer */
ret = atmel_lcdfb_alloc_video_memory(sinfo);
-@@ -670,6 +797,9 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
+@@ -670,6 +797,9 @@
goto release_mem;
}
@@ -16295,7 +18450,7 @@ index 7c30cc8..5e99671 100644
/* interrupt */
ret = request_irq(sinfo->irq_base, atmel_lcdfb_interrupt, 0, pdev->name, info);
if (ret) {
-@@ -721,6 +851,7 @@ free_cmap:
+@@ -721,6 +851,7 @@
unregister_irqs:
free_irq(sinfo->irq_base, info);
unmap_mmio:
@@ -16303,7 +18458,7 @@ index 7c30cc8..5e99671 100644
iounmap(sinfo->mmio);
release_mem:
release_mem_region(info->fix.mmio_start, info->fix.mmio_len);
-@@ -755,6 +886,7 @@ static int __exit atmel_lcdfb_remove(struct platform_device *pdev)
+@@ -755,6 +886,7 @@
if (!sinfo)
return 0;
@@ -16311,7 +18466,7 @@ index 7c30cc8..5e99671 100644
if (sinfo->atmel_lcdfb_power_control)
sinfo->atmel_lcdfb_power_control(0);
unregister_framebuffer(info);
-@@ -781,6 +913,9 @@ static int __exit atmel_lcdfb_remove(struct platform_device *pdev)
+@@ -781,6 +913,9 @@
static struct platform_driver atmel_lcdfb_driver = {
.remove = __exit_p(atmel_lcdfb_remove),
@@ -16321,11 +18476,10 @@ index 7c30cc8..5e99671 100644
.driver = {
.name = "atmel_lcdfb",
.owner = THIS_MODULE,
-diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
-index 9609a6c..924e255 100644
---- a/drivers/video/backlight/Kconfig
-+++ b/drivers/video/backlight/Kconfig
-@@ -50,6 +50,19 @@ config BACKLIGHT_CLASS_DEVICE
+diff -urN linux-2.6.24.3/drivers/video/backlight/Kconfig avr32-2.6/drivers/video/backlight/Kconfig
+--- linux-2.6.24.3/drivers/video/backlight/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/video/backlight/Kconfig 2008-04-23 20:12:45.000000000 +0200
+@@ -50,6 +50,19 @@
To have support for your specific LCD panel you will have to
select the proper drivers which depend on this option.
@@ -16345,11 +18499,10 @@ index 9609a6c..924e255 100644
config BACKLIGHT_CORGI
tristate "Generic (aka Sharp Corgi) Backlight Driver"
depends on BACKLIGHT_CLASS_DEVICE
-diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig
-index b87ed37..2b53d1f 100644
---- a/drivers/video/console/Kconfig
-+++ b/drivers/video/console/Kconfig
-@@ -6,7 +6,7 @@ menu "Console display driver support"
+diff -urN linux-2.6.24.3/drivers/video/console/Kconfig avr32-2.6/drivers/video/console/Kconfig
+--- linux-2.6.24.3/drivers/video/console/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/video/console/Kconfig 2008-04-23 19:33:46.000000000 +0200
+@@ -6,7 +6,7 @@
config VGA_CONSOLE
bool "VGA text console" if EMBEDDED || !X86
@@ -16358,11 +18511,10 @@ index b87ed37..2b53d1f 100644
default y
help
Saying Y here will allow you to use Linux in text mode through a
-diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
-index 52dff40..fbd6112 100644
---- a/drivers/watchdog/Kconfig
-+++ b/drivers/watchdog/Kconfig
-@@ -223,7 +223,7 @@ config DAVINCI_WATCHDOG
+diff -urN linux-2.6.24.3/drivers/watchdog/Kconfig avr32-2.6/drivers/watchdog/Kconfig
+--- linux-2.6.24.3/drivers/watchdog/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/drivers/watchdog/Kconfig 2008-04-23 20:12:45.000000000 +0200
+@@ -223,7 +223,7 @@
config AT32AP700X_WDT
tristate "AT32AP700x watchdog"
@@ -16371,11 +18523,142 @@ index 52dff40..fbd6112 100644
help
Watchdog timer embedded into AT32AP700x devices. This will reboot
your system when the timeout is reached.
-diff --git a/include/asm-avr32/arch-at32ap/at32ap7000.h b/include/asm-avr32/arch-at32ap/at32ap7000.h
-deleted file mode 100644
-index 3914d7b..0000000
---- a/include/asm-avr32/arch-at32ap/at32ap7000.h
-+++ /dev/null
+diff -urN linux-2.6.24.3/include/asm-arm/arch-at91/at91rm9200.h avr32-2.6/include/asm-arm/arch-at91/at91rm9200.h
+--- linux-2.6.24.3/include/asm-arm/arch-at91/at91rm9200.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-arm/arch-at91/at91rm9200.h 2008-04-23 19:33:48.000000000 +0200
+@@ -93,6 +93,11 @@
+ #define AT91_RTC (0xfffffe00 - AT91_BASE_SYS) /* Real-Time Clock */
+ #define AT91_MC (0xffffff00 - AT91_BASE_SYS) /* Memory Controllers */
+
++#define AT91_USART0 AT91RM9200_BASE_US0
++#define AT91_USART1 AT91RM9200_BASE_US1
++#define AT91_USART2 AT91RM9200_BASE_US2
++#define AT91_USART3 AT91RM9200_BASE_US3
++
+ #define AT91_MATRIX 0 /* not supported */
+
+ /*
+diff -urN linux-2.6.24.3/include/asm-arm/arch-at91/at91sam9260.h avr32-2.6/include/asm-arm/arch-at91/at91sam9260.h
+--- linux-2.6.24.3/include/asm-arm/arch-at91/at91sam9260.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-arm/arch-at91/at91sam9260.h 2008-04-23 19:33:48.000000000 +0200
+@@ -99,6 +99,13 @@
+ #define AT91_WDT (0xfffffd40 - AT91_BASE_SYS)
+ #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS)
+
++#define AT91_USART0 AT91SAM9260_BASE_US0
++#define AT91_USART1 AT91SAM9260_BASE_US1
++#define AT91_USART2 AT91SAM9260_BASE_US2
++#define AT91_USART3 AT91SAM9260_BASE_US3
++#define AT91_USART4 AT91SAM9260_BASE_US4
++#define AT91_USART5 AT91SAM9260_BASE_US5
++
+
+ /*
+ * Internal Memory.
+diff -urN linux-2.6.24.3/include/asm-arm/arch-at91/at91sam9261.h avr32-2.6/include/asm-arm/arch-at91/at91sam9261.h
+--- linux-2.6.24.3/include/asm-arm/arch-at91/at91sam9261.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-arm/arch-at91/at91sam9261.h 2008-04-23 19:33:48.000000000 +0200
+@@ -84,6 +84,10 @@
+ #define AT91_WDT (0xfffffd40 - AT91_BASE_SYS)
+ #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS)
+
++#define AT91_USART0 AT91SAM9261_BASE_US0
++#define AT91_USART1 AT91SAM9261_BASE_US1
++#define AT91_USART2 AT91SAM9261_BASE_US2
++
+
+ /*
+ * Internal Memory.
+diff -urN linux-2.6.24.3/include/asm-arm/arch-at91/at91sam9263.h avr32-2.6/include/asm-arm/arch-at91/at91sam9263.h
+--- linux-2.6.24.3/include/asm-arm/arch-at91/at91sam9263.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-arm/arch-at91/at91sam9263.h 2008-04-23 19:33:48.000000000 +0200
+@@ -101,6 +101,10 @@
+ #define AT91_RTT1 (0xfffffd50 - AT91_BASE_SYS)
+ #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS)
+
++#define AT91_USART0 AT91SAM9263_BASE_US0
++#define AT91_USART1 AT91SAM9263_BASE_US1
++#define AT91_USART2 AT91SAM9263_BASE_US2
++
+ #define AT91_SMC AT91_SMC0
+
+ /*
+diff -urN linux-2.6.24.3/include/asm-arm/arch-at91/at91sam9rl.h avr32-2.6/include/asm-arm/arch-at91/at91sam9rl.h
+--- linux-2.6.24.3/include/asm-arm/arch-at91/at91sam9rl.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-arm/arch-at91/at91sam9rl.h 2008-04-23 19:33:48.000000000 +0200
+@@ -94,6 +94,11 @@
+ #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS)
+ #define AT91_RTC (0xfffffe00 - AT91_BASE_SYS)
+
++#define AT91_USART0 AT91SAM9RL_BASE_US0
++#define AT91_USART1 AT91SAM9RL_BASE_US1
++#define AT91_USART2 AT91SAM9RL_BASE_US2
++#define AT91_USART3 AT91SAM9RL_BASE_US3
++
+
+ /*
+ * Internal Memory.
+diff -urN linux-2.6.24.3/include/asm-arm/arch-at91/uncompress.h avr32-2.6/include/asm-arm/arch-at91/uncompress.h
+--- linux-2.6.24.3/include/asm-arm/arch-at91/uncompress.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-arm/arch-at91/uncompress.h 2008-04-23 19:33:48.000000000 +0200
+@@ -22,7 +22,23 @@
+ #define __ASM_ARCH_UNCOMPRESS_H
+
+ #include <asm/io.h>
+-#include <asm/arch/at91_dbgu.h>
++#include <linux/atmel_serial.h>
++
++#if defined(CONFIG_AT91_EARLY_DBGU)
++#define UART_OFFSET (AT91_DBGU + AT91_BASE_SYS)
++#elif defined(CONFIG_AT91_EARLY_USART0)
++#define UART_OFFSET AT91_USART0
++#elif defined(CONFIG_AT91_EARLY_USART1)
++#define UART_OFFSET AT91_USART1
++#elif defined(CONFIG_AT91_EARLY_USART2)
++#define UART_OFFSET AT91_USART2
++#elif defined(CONFIG_AT91_EARLY_USART3)
++#define UART_OFFSET AT91_USART3
++#elif defined(CONFIG_AT91_EARLY_USART4)
++#define UART_OFFSET AT91_USART4
++#elif defined(CONFIG_AT91_EARLY_USART5)
++#define UART_OFFSET AT91_USART5
++#endif
+
+ /*
+ * The following code assumes the serial port has already been
+@@ -33,22 +49,22 @@
+ */
+ static void putc(int c)
+ {
+-#ifdef AT91_DBGU
+- void __iomem *sys = (void __iomem *) AT91_BASE_SYS; /* physical address */
++#ifdef UART_OFFSET
++ void __iomem *sys = (void __iomem *) UART_OFFSET; /* physical address */
+
+- while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXRDY))
++ while (!(__raw_readl(sys + ATMEL_US_CSR) & ATMEL_US_TXRDY))
+ barrier();
+- __raw_writel(c, sys + AT91_DBGU_THR);
++ __raw_writel(c, sys + ATMEL_US_THR);
+ #endif
+ }
+
+ static inline void flush(void)
+ {
+-#ifdef AT91_DBGU
+- void __iomem *sys = (void __iomem *) AT91_BASE_SYS; /* physical address */
++#ifdef UART_OFFSET
++ void __iomem *sys = (void __iomem *) UART_OFFSET; /* physical address */
+
+ /* wait for transmission to complete */
+- while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXEMPTY))
++ while (!(__raw_readl(sys + ATMEL_US_CSR) & ATMEL_US_TXEMPTY))
+ barrier();
+ #endif
+ }
+diff -urN linux-2.6.24.3/include/asm-avr32/arch-at32ap/at32ap7000.h avr32-2.6/include/asm-avr32/arch-at32ap/at32ap7000.h
+--- linux-2.6.24.3/include/asm-avr32/arch-at32ap/at32ap7000.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/arch-at32ap/at32ap7000.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,35 +0,0 @@
-/*
- * Pin definitions for AT32AP7000.
@@ -16412,11 +18695,9 @@ index 3914d7b..0000000
-#define GPIO_PIN_PE(N) (GPIO_PIOE_BASE + (N))
-
-#endif /* __ASM_ARCH_AT32AP7000_H__ */
-diff --git a/include/asm-avr32/arch-at32ap/at32ap700x.h b/include/asm-avr32/arch-at32ap/at32ap700x.h
-new file mode 100644
-index 0000000..99684d6
---- /dev/null
-+++ b/include/asm-avr32/arch-at32ap/at32ap700x.h
+diff -urN linux-2.6.24.3/include/asm-avr32/arch-at32ap/at32ap700x.h avr32-2.6/include/asm-avr32/arch-at32ap/at32ap700x.h
+--- linux-2.6.24.3/include/asm-avr32/arch-at32ap/at32ap700x.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/include/asm-avr32/arch-at32ap/at32ap700x.h 2008-04-23 20:12:46.000000000 +0200
@@ -0,0 +1,35 @@
+/*
+ * Pin definitions for AT32AP7000.
@@ -16453,11 +18734,21 @@ index 0000000..99684d6
+#define GPIO_PIN_PE(N) (GPIO_PIOE_BASE + (N))
+
+#endif /* __ASM_ARCH_AT32AP700X_H__ */
-diff --git a/include/asm-avr32/arch-at32ap/board.h b/include/asm-avr32/arch-at32ap/board.h
-index d6993a6..8816b66 100644
---- a/include/asm-avr32/arch-at32ap/board.h
-+++ b/include/asm-avr32/arch-at32ap/board.h
-@@ -51,6 +51,9 @@ struct platform_device *
+diff -urN linux-2.6.24.3/include/asm-avr32/arch-at32ap/board.h avr32-2.6/include/asm-avr32/arch-at32ap/board.h
+--- linux-2.6.24.3/include/asm-avr32/arch-at32ap/board.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/arch-at32ap/board.h 2008-04-23 20:12:46.000000000 +0200
+@@ -38,9 +38,7 @@
+ at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data,
+ unsigned long fbmem_start, unsigned long fbmem_len);
+
+-struct usba_platform_data {
+- int vbus_pin;
+-};
++struct usba_platform_data;
+ struct platform_device *
+ at32_add_device_usba(unsigned int id, struct usba_platform_data *data);
+
+@@ -51,6 +49,9 @@
at32_add_device_ide(unsigned int id, unsigned int extint,
struct ide_platform_data *data);
@@ -16467,11 +18758,16 @@ index d6993a6..8816b66 100644
/* depending on what's hooked up, not all SSC pins will be used */
#define ATMEL_SSC_TK 0x01
#define ATMEL_SSC_TF 0x02
-@@ -66,7 +69,13 @@ struct platform_device *
+@@ -65,8 +66,17 @@
+ struct platform_device *
at32_add_device_ssc(unsigned int id, unsigned int flags);
- struct platform_device *at32_add_device_twi(unsigned int id);
+-struct platform_device *at32_add_device_twi(unsigned int id);
-struct platform_device *at32_add_device_mci(unsigned int id);
++struct i2c_board_info;
++struct platform_device *at32_add_device_twi(unsigned int id,
++ struct i2c_board_info *b,
++ unsigned int n);
+
+struct mci_platform_data {
+ int detect_pin;
@@ -16482,10 +18778,17 @@ index d6993a6..8816b66 100644
struct platform_device *at32_add_device_ac97c(unsigned int id);
struct platform_device *at32_add_device_abdac(unsigned int id);
-diff --git a/include/asm-avr32/arch-at32ap/cpu.h b/include/asm-avr32/arch-at32ap/cpu.h
-index a762f42..0dc2026 100644
---- a/include/asm-avr32/arch-at32ap/cpu.h
-+++ b/include/asm-avr32/arch-at32ap/cpu.h
+@@ -81,4 +91,7 @@
+ at32_add_device_cf(unsigned int id, unsigned int extint,
+ struct cf_platform_data *data);
+
++struct platform_device *
++at32_add_device_psif(unsigned int id);
++
+ #endif /* __ASM_ARCH_BOARD_H */
+diff -urN linux-2.6.24.3/include/asm-avr32/arch-at32ap/cpu.h avr32-2.6/include/asm-avr32/arch-at32ap/cpu.h
+--- linux-2.6.24.3/include/asm-avr32/arch-at32ap/cpu.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/arch-at32ap/cpu.h 2008-04-23 20:12:46.000000000 +0200
@@ -14,7 +14,7 @@
* Only AT32AP7000 is defined for now. We can identify the specific
* chip at runtime, but I'm not sure if it's really worth it.
@@ -16495,10 +18798,9 @@ index a762f42..0dc2026 100644
# define cpu_is_at32ap7000() (1)
#else
# define cpu_is_at32ap7000() (0)
-diff --git a/include/asm-avr32/arch-at32ap/io.h b/include/asm-avr32/arch-at32ap/io.h
-index ee59e40..4ec6abc 100644
---- a/include/asm-avr32/arch-at32ap/io.h
-+++ b/include/asm-avr32/arch-at32ap/io.h
+diff -urN linux-2.6.24.3/include/asm-avr32/arch-at32ap/io.h avr32-2.6/include/asm-avr32/arch-at32ap/io.h
+--- linux-2.6.24.3/include/asm-avr32/arch-at32ap/io.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/arch-at32ap/io.h 2008-04-23 19:33:48.000000000 +0200
@@ -4,7 +4,7 @@
/* For "bizarre" halfword swapping */
#include <linux/byteorder/swabb.h>
@@ -16517,11 +18819,62 @@ index ee59e40..4ec6abc 100644
# define __swizzle_addr_b(addr) (addr ^ 1UL)
# define __swizzle_addr_w(addr) (addr)
# define __swizzle_addr_l(addr) (addr)
-diff --git a/include/asm-avr32/arch-at32ap/portmux.h b/include/asm-avr32/arch-at32ap/portmux.h
-index b1abe6b..135e034 100644
---- a/include/asm-avr32/arch-at32ap/portmux.h
-+++ b/include/asm-avr32/arch-at32ap/portmux.h
-@@ -26,4 +26,16 @@ void at32_select_periph(unsigned int pin, unsigned int periph,
+diff -urN linux-2.6.24.3/include/asm-avr32/arch-at32ap/pm.h avr32-2.6/include/asm-avr32/arch-at32ap/pm.h
+--- linux-2.6.24.3/include/asm-avr32/arch-at32ap/pm.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/include/asm-avr32/arch-at32ap/pm.h 2008-04-23 20:12:46.000000000 +0200
+@@ -0,0 +1,48 @@
++/*
++ * AVR32 AP Power Management.
++ *
++ * Copyright (C) 2008 Atmel Corporation
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++#ifndef __ASM_AVR32_ARCH_PM_H
++#define __ASM_AVR32_ARCH_PM_H
++
++/* Possible arguments to the "sleep" instruction */
++#define CPU_SLEEP_IDLE 0
++#define CPU_SLEEP_FROZEN 1
++#define CPU_SLEEP_STANDBY 2
++#define CPU_SLEEP_STOP 3
++#define CPU_SLEEP_STATIC 5
++
++#ifndef __ASSEMBLY__
++extern void cpu_enter_idle(void);
++
++extern bool disable_idle_sleep;
++
++static inline void cpu_disable_idle_sleep(void)
++{
++ disable_idle_sleep = true;
++}
++
++static inline void cpu_enable_idle_sleep(void)
++{
++ disable_idle_sleep = false;
++}
++
++static inline void cpu_idle_sleep(void)
++{
++ /*
++ * If we're using the COUNT and COMPARE registers for
++ * timekeeping, we can't use the IDLE state.
++ */
++ if (disable_idle_sleep)
++ cpu_relax();
++ else
++ cpu_enter_idle();
++}
++#endif
++
++#endif /* __ASM_AVR32_ARCH_PM_H */
+diff -urN linux-2.6.24.3/include/asm-avr32/arch-at32ap/portmux.h avr32-2.6/include/asm-avr32/arch-at32ap/portmux.h
+--- linux-2.6.24.3/include/asm-avr32/arch-at32ap/portmux.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/arch-at32ap/portmux.h 2008-04-23 19:33:48.000000000 +0200
+@@ -26,4 +26,16 @@
void at32_select_gpio(unsigned int pin, unsigned long flags);
void at32_reserve_pin(unsigned int pin);
@@ -16538,11 +18891,157 @@ index b1abe6b..135e034 100644
+#endif /* CONFIG_GPIO_DEV */
+
#endif /* __ASM_ARCH_PORTMUX_H__ */
-diff --git a/include/asm-avr32/dma-controller.h b/include/asm-avr32/dma-controller.h
-new file mode 100644
-index 0000000..56a4965
---- /dev/null
-+++ b/include/asm-avr32/dma-controller.h
+diff -urN linux-2.6.24.3/include/asm-avr32/arch-at32ap/time.h avr32-2.6/include/asm-avr32/arch-at32ap/time.h
+--- linux-2.6.24.3/include/asm-avr32/arch-at32ap/time.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/arch-at32ap/time.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,112 +0,0 @@
+-/*
+- * Copyright (C) 2007 Atmel Corporation
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- */
+-
+-#ifndef _ASM_AVR32_ARCH_AT32AP_TIME_H
+-#define _ASM_AVR32_ARCH_AT32AP_TIME_H
+-
+-#include <linux/platform_device.h>
+-
+-extern struct irqaction timer_irqaction;
+-extern struct platform_device at32_systc0_device;
+-extern void local_timer_interrupt(int irq, void *dev_id);
+-
+-#define TIMER_BCR 0x000000c0
+-#define TIMER_BCR_SYNC 0
+-#define TIMER_BMR 0x000000c4
+-#define TIMER_BMR_TC0XC0S 0
+-#define TIMER_BMR_TC1XC1S 2
+-#define TIMER_BMR_TC2XC2S 4
+-#define TIMER_CCR 0x00000000
+-#define TIMER_CCR_CLKDIS 1
+-#define TIMER_CCR_CLKEN 0
+-#define TIMER_CCR_SWTRG 2
+-#define TIMER_CMR 0x00000004
+-#define TIMER_CMR_ABETRG 10
+-#define TIMER_CMR_ACPA 16
+-#define TIMER_CMR_ACPC 18
+-#define TIMER_CMR_AEEVT 20
+-#define TIMER_CMR_ASWTRG 22
+-#define TIMER_CMR_BCPB 24
+-#define TIMER_CMR_BCPC 26
+-#define TIMER_CMR_BEEVT 28
+-#define TIMER_CMR_BSWTRG 30
+-#define TIMER_CMR_BURST 4
+-#define TIMER_CMR_CLKI 3
+-#define TIMER_CMR_CPCDIS 7
+-#define TIMER_CMR_CPCSTOP 6
+-#define TIMER_CMR_CPCTRG 14
+-#define TIMER_CMR_EEVT 10
+-#define TIMER_CMR_EEVTEDG 8
+-#define TIMER_CMR_ENETRG 12
+-#define TIMER_CMR_ETRGEDG 8
+-#define TIMER_CMR_LDBDIS 7
+-#define TIMER_CMR_LDBSTOP 6
+-#define TIMER_CMR_LDRA 16
+-#define TIMER_CMR_LDRB 18
+-#define TIMER_CMR_TCCLKS 0
+-#define TIMER_CMR_WAVE 15
+-#define TIMER_CMR_WAVSEL 13
+-#define TIMER_CV 0x00000010
+-#define TIMER_CV_CV 0
+-#define TIMER_IDR 0x00000028
+-#define TIMER_IDR_COVFS 0
+-#define TIMER_IDR_CPAS 2
+-#define TIMER_IDR_CPBS 3
+-#define TIMER_IDR_CPCS 4
+-#define TIMER_IDR_ETRGS 7
+-#define TIMER_IDR_LDRAS 5
+-#define TIMER_IDR_LDRBS 6
+-#define TIMER_IDR_LOVRS 1
+-#define TIMER_IER 0x00000024
+-#define TIMER_IER_COVFS 0
+-#define TIMER_IER_CPAS 2
+-#define TIMER_IER_CPBS 3
+-#define TIMER_IER_CPCS 4
+-#define TIMER_IER_ETRGS 7
+-#define TIMER_IER_LDRAS 5
+-#define TIMER_IER_LDRBS 6
+-#define TIMER_IER_LOVRS 1
+-#define TIMER_IMR 0x0000002c
+-#define TIMER_IMR_COVFS 0
+-#define TIMER_IMR_CPAS 2
+-#define TIMER_IMR_CPBS 3
+-#define TIMER_IMR_CPCS 4
+-#define TIMER_IMR_ETRGS 7
+-#define TIMER_IMR_LDRAS 5
+-#define TIMER_IMR_LDRBS 6
+-#define TIMER_IMR_LOVRS 1
+-#define TIMER_RA 0x00000014
+-#define TIMER_RA_RA 0
+-#define TIMER_RB 0x00000018
+-#define TIMER_RB_RB 0
+-#define TIMER_RC 0x0000001c
+-#define TIMER_RC_RC 0
+-#define TIMER_SR 0x00000020
+-#define TIMER_SR_CLKSTA 16
+-#define TIMER_SR_COVFS 0
+-#define TIMER_SR_CPAS 2
+-#define TIMER_SR_CPBS 3
+-#define TIMER_SR_CPCS 4
+-#define TIMER_SR_ETRGS 7
+-#define TIMER_SR_LDRAS 5
+-#define TIMER_SR_LDRBS 6
+-#define TIMER_SR_LOVRS 1
+-#define TIMER_SR_MTIOA 17
+-#define TIMER_SR_MTIOB 18
+-
+-/* Bit manipulation macros */
+-#define TIMER_BIT(name) (1 << TIMER_##name)
+-#define TIMER_BF(name,value) ((value) << TIMER_##name)
+-
+-/* Register access macros */
+-#define timer_read(port,instance,reg) \
+- __raw_readl(port + (0x40 * instance) + TIMER_##reg)
+-#define timer_write(port,instance,reg,value) \
+- __raw_writel((value), port + (0x40 * instance) + TIMER_##reg)
+-
+-#endif /* _ASM_AVR32_ARCH_AT32AP_TIME_H */
+diff -urN linux-2.6.24.3/include/asm-avr32/asm.h avr32-2.6/include/asm-avr32/asm.h
+--- linux-2.6.24.3/include/asm-avr32/asm.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/asm.h 2008-04-23 20:12:46.000000000 +0200
+@@ -12,10 +12,10 @@
+ #include <asm/asm-offsets.h>
+ #include <asm/thread_info.h>
+
+-#define mask_interrupts ssrf SR_GM_BIT
+-#define mask_exceptions ssrf SR_EM_BIT
+-#define unmask_interrupts csrf SR_GM_BIT
+-#define unmask_exceptions csrf SR_EM_BIT
++#define mask_interrupts ssrf SYSREG_GM_OFFSET
++#define mask_exceptions ssrf SYSREG_EM_OFFSET
++#define unmask_interrupts csrf SYSREG_GM_OFFSET
++#define unmask_exceptions csrf SYSREG_EM_OFFSET
+
+ #ifdef CONFIG_FRAME_POINTER
+ .macro save_fp
+diff -urN linux-2.6.24.3/include/asm-avr32/byteorder.h avr32-2.6/include/asm-avr32/byteorder.h
+--- linux-2.6.24.3/include/asm-avr32/byteorder.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/byteorder.h 2008-04-23 20:12:46.000000000 +0200
+@@ -12,8 +12,10 @@
+ extern unsigned short __builtin_bswap_16(unsigned short x);
+ #endif
+
++#if 0
+ #define __arch__swab32(x) __builtin_bswap_32(x)
+ #define __arch__swab16(x) __builtin_bswap_16(x)
++#endif
+
+ #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
+ # define __BYTEORDER_HAS_U64__
+diff -urN linux-2.6.24.3/include/asm-avr32/dma-controller.h avr32-2.6/include/asm-avr32/dma-controller.h
+--- linux-2.6.24.3/include/asm-avr32/dma-controller.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/include/asm-avr32/dma-controller.h 2008-04-23 19:33:48.000000000 +0200
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2005-2006 Atmel Corporation
@@ -16710,24 +19209,159 @@ index 0000000..56a4965
+extern struct dma_controller *find_dma_controller(int id);
+
+#endif /* __ASM_AVR32_DMA_CONTROLLER_H */
-diff --git a/include/asm-avr32/irq.h b/include/asm-avr32/irq.h
-index 83e6549..9315724 100644
---- a/include/asm-avr32/irq.h
-+++ b/include/asm-avr32/irq.h
-@@ -11,4 +11,9 @@
+diff -urN linux-2.6.24.3/include/asm-avr32/intc.h avr32-2.6/include/asm-avr32/intc.h
+--- linux-2.6.24.3/include/asm-avr32/intc.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/intc.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,128 +0,0 @@
+-#ifndef __ASM_AVR32_INTC_H
+-#define __ASM_AVR32_INTC_H
+-
+-#include <linux/sysdev.h>
+-#include <linux/interrupt.h>
+-
+-struct irq_controller;
+-struct irqaction;
+-struct pt_regs;
+-
+-struct platform_device;
+-
+-/* Information about the internal interrupt controller */
+-struct intc_device {
+- /* ioremapped address of configuration block */
+- void __iomem *regs;
+-
+- /* the physical device */
+- struct platform_device *pdev;
+-
+- /* Number of interrupt lines per group. */
+- unsigned int irqs_per_group;
+-
+- /* The highest group ID + 1 */
+- unsigned int nr_groups;
+-
+- /*
+- * Bitfield indicating which groups are actually in use. The
+- * size of the array is
+- * ceil(group_max / (8 * sizeof(unsigned int))).
+- */
+- unsigned int group_mask[];
+-};
+-
+-struct irq_controller_class {
+- /*
+- * A short name identifying this kind of controller.
+- */
+- const char *typename;
+- /*
+- * Handle the IRQ. Must do any necessary acking and masking.
+- */
+- irqreturn_t (*handle)(int irq, void *dev_id, struct pt_regs *regs);
+- /*
+- * Register a new IRQ handler.
+- */
+- int (*setup)(struct irq_controller *ctrl, unsigned int irq,
+- struct irqaction *action);
+- /*
+- * Unregister a IRQ handler.
+- */
+- void (*free)(struct irq_controller *ctrl, unsigned int irq,
+- void *dev_id);
+- /*
+- * Mask the IRQ in the interrupt controller.
+- */
+- void (*mask)(struct irq_controller *ctrl, unsigned int irq);
+- /*
+- * Unmask the IRQ in the interrupt controller.
+- */
+- void (*unmask)(struct irq_controller *ctrl, unsigned int irq);
+- /*
+- * Set the type of the IRQ. See below for possible types.
+- * Return -EINVAL if a given type is not supported
+- */
+- int (*set_type)(struct irq_controller *ctrl, unsigned int irq,
+- unsigned int type);
+- /*
+- * Return the IRQ type currently set
+- */
+- unsigned int (*get_type)(struct irq_controller *ctrl, unsigned int irq);
+-};
+-
+-struct irq_controller {
+- struct irq_controller_class *class;
+- unsigned int irq_group;
+- unsigned int first_irq;
+- unsigned int nr_irqs;
+- struct list_head list;
+-};
+-
+-struct intc_group_desc {
+- struct irq_controller *ctrl;
+- irqreturn_t (*handle)(int, void *, struct pt_regs *);
+- unsigned long flags;
+- void *dev_id;
+- const char *devname;
+-};
+-
+-/*
+- * The internal interrupt controller. Defined in board/part-specific
+- * devices.c.
+- * TODO: Should probably be defined per-cpu.
+- */
+-extern struct intc_device intc;
+-
+-extern int request_internal_irq(unsigned int irq,
+- irqreturn_t (*handler)(int, void *, struct pt_regs *),
+- unsigned long irqflags,
+- const char *devname, void *dev_id);
+-extern void free_internal_irq(unsigned int irq);
+-
+-/* Only used by time_init() */
+-extern int setup_internal_irq(unsigned int irq, struct intc_group_desc *desc);
+-
+-/*
+- * Set interrupt priority for a given group. `group' can be found by
+- * using irq_to_group(irq). Priority can be from 0 (lowest) to 3
+- * (highest). Higher-priority interrupts will preempt lower-priority
+- * interrupts (unless interrupts are masked globally).
+- *
+- * This function does not check for conflicts within a group.
+- */
+-extern int intc_set_priority(unsigned int group,
+- unsigned int priority);
+-
+-/*
+- * Returns a bitmask of pending interrupts in a group.
+- */
+-extern unsigned long intc_get_pending(unsigned int group);
+-
+-/*
+- * Register a new external interrupt controller. Returns the first
+- * external IRQ number that is assigned to the new controller.
+- */
+-extern int intc_register_controller(struct irq_controller *ctrl);
+-
+-#endif /* __ASM_AVR32_INTC_H */
+diff -urN linux-2.6.24.3/include/asm-avr32/irq.h avr32-2.6/include/asm-avr32/irq.h
+--- linux-2.6.24.3/include/asm-avr32/irq.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/irq.h 2008-04-23 20:12:46.000000000 +0200
+@@ -11,4 +11,14 @@
#define irq_canonicalize(i) (i)
+#ifndef __ASSEMBLER__
+int nmi_enable(void);
+void nmi_disable(void);
++
++/*
++ * Returns a bitmask of pending interrupts in a group.
++ */
++extern unsigned long intc_get_pending(unsigned int group);
+#endif
+
#endif /* __ASM_AVR32_IOCTLS_H */
-diff --git a/include/asm-avr32/kdebug.h b/include/asm-avr32/kdebug.h
-index fd7e990..ca4f954 100644
---- a/include/asm-avr32/kdebug.h
-+++ b/include/asm-avr32/kdebug.h
+diff -urN linux-2.6.24.3/include/asm-avr32/kdebug.h avr32-2.6/include/asm-avr32/kdebug.h
+--- linux-2.6.24.3/include/asm-avr32/kdebug.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/kdebug.h 2008-04-23 19:33:48.000000000 +0200
@@ -5,6 +5,7 @@
enum die_val {
DIE_BREAKPOINT,
@@ -16736,11 +19370,10 @@ index fd7e990..ca4f954 100644
};
#endif /* __ASM_AVR32_KDEBUG_H */
-diff --git a/include/asm-avr32/ocd.h b/include/asm-avr32/ocd.h
-index 996405e..6bef094 100644
---- a/include/asm-avr32/ocd.h
-+++ b/include/asm-avr32/ocd.h
-@@ -533,6 +533,11 @@ static inline void __ocd_write(unsigned int reg, unsigned long value)
+diff -urN linux-2.6.24.3/include/asm-avr32/ocd.h avr32-2.6/include/asm-avr32/ocd.h
+--- linux-2.6.24.3/include/asm-avr32/ocd.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/ocd.h 2008-04-23 19:33:48.000000000 +0200
+@@ -533,6 +533,11 @@
#define ocd_read(reg) __ocd_read(OCD_##reg)
#define ocd_write(reg, value) __ocd_write(OCD_##reg, value)
@@ -16752,11 +19385,21 @@ index 996405e..6bef094 100644
#endif /* !__ASSEMBLER__ */
#endif /* __ASM_AVR32_OCD_H */
-diff --git a/include/asm-avr32/processor.h b/include/asm-avr32/processor.h
-index a52576b..4212551 100644
---- a/include/asm-avr32/processor.h
-+++ b/include/asm-avr32/processor.h
-@@ -57,11 +57,25 @@ struct avr32_cpuinfo {
+diff -urN linux-2.6.24.3/include/asm-avr32/pgtable.h avr32-2.6/include/asm-avr32/pgtable.h
+--- linux-2.6.24.3/include/asm-avr32/pgtable.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/pgtable.h 2008-04-23 20:12:46.000000000 +0200
+@@ -157,6 +157,7 @@
+ #define _PAGE_S(x) _PAGE_NORMAL(x)
+
+ #define PAGE_COPY _PAGE_P(PAGE_WRITE | PAGE_READ)
++#define PAGE_SHARED _PAGE_S(PAGE_WRITE | PAGE_READ)
+
+ #ifndef __ASSEMBLY__
+ /*
+diff -urN linux-2.6.24.3/include/asm-avr32/processor.h avr32-2.6/include/asm-avr32/processor.h
+--- linux-2.6.24.3/include/asm-avr32/processor.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/processor.h 2008-04-23 19:33:48.000000000 +0200
+@@ -57,11 +57,25 @@
unsigned short cpu_revision;
enum tlb_config tlb_config;
unsigned long features;
@@ -16782,11 +19425,10 @@ index a52576b..4212551 100644
extern struct avr32_cpuinfo boot_cpu_data;
#ifdef CONFIG_SMP
-diff --git a/include/asm-avr32/ptrace.h b/include/asm-avr32/ptrace.h
-index 8c5dba5..9e2d44f 100644
---- a/include/asm-avr32/ptrace.h
-+++ b/include/asm-avr32/ptrace.h
-@@ -121,7 +121,15 @@ struct pt_regs {
+diff -urN linux-2.6.24.3/include/asm-avr32/ptrace.h avr32-2.6/include/asm-avr32/ptrace.h
+--- linux-2.6.24.3/include/asm-avr32/ptrace.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/ptrace.h 2008-04-23 19:33:48.000000000 +0200
+@@ -121,7 +121,15 @@
};
#ifdef __KERNEL__
@@ -16803,7 +19445,7 @@ index 8c5dba5..9e2d44f 100644
extern void show_regs (struct pt_regs *);
static __inline__ int valid_user_regs(struct pt_regs *regs)
-@@ -141,9 +149,6 @@ static __inline__ int valid_user_regs(struct pt_regs *regs)
+@@ -141,9 +149,6 @@
return 0;
}
@@ -16813,11 +19455,10 @@ index 8c5dba5..9e2d44f 100644
#endif /* __KERNEL__ */
-diff --git a/include/asm-avr32/thread_info.h b/include/asm-avr32/thread_info.h
-index 184b574..07049f6 100644
---- a/include/asm-avr32/thread_info.h
-+++ b/include/asm-avr32/thread_info.h
-@@ -88,6 +88,7 @@ static inline struct thread_info *current_thread_info(void)
+diff -urN linux-2.6.24.3/include/asm-avr32/thread_info.h avr32-2.6/include/asm-avr32/thread_info.h
+--- linux-2.6.24.3/include/asm-avr32/thread_info.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/asm-avr32/thread_info.h 2008-04-23 19:33:48.000000000 +0200
+@@ -88,6 +88,7 @@
#define TIF_MEMDIE 6
#define TIF_RESTORE_SIGMASK 7 /* restore signal mask in do_signal */
#define TIF_CPU_GOING_TO_SLEEP 8 /* CPU is entering sleep 0 mode */
@@ -16825,11 +19466,9 @@ index 184b574..07049f6 100644
#define TIF_USERSPACE 31 /* true if FS sets userspace */
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
-diff --git a/include/linux/atmel_pwm.h b/include/linux/atmel_pwm.h
-new file mode 100644
-index 0000000..ea04abb
---- /dev/null
-+++ b/include/linux/atmel_pwm.h
+diff -urN linux-2.6.24.3/include/linux/atmel_pwm.h avr32-2.6/include/linux/atmel_pwm.h
+--- linux-2.6.24.3/include/linux/atmel_pwm.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/include/linux/atmel_pwm.h 2008-04-23 19:33:51.000000000 +0200
@@ -0,0 +1,70 @@
+#ifndef __LINUX_ATMEL_PWM_H
+#define __LINUX_ATMEL_PWM_H
@@ -16901,10 +19540,422 @@ index 0000000..ea04abb
+}
+
+#endif /* __LINUX_ATMEL_PWM_H */
-diff --git a/include/video/atmel_lcdc.h b/include/video/atmel_lcdc.h
-index 4eea637..336c20d 100644
---- a/include/video/atmel_lcdc.h
-+++ b/include/video/atmel_lcdc.h
+diff -urN linux-2.6.24.3/include/linux/atmel_serial.h avr32-2.6/include/linux/atmel_serial.h
+--- linux-2.6.24.3/include/linux/atmel_serial.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/include/linux/atmel_serial.h 2008-04-23 19:33:51.000000000 +0200
+@@ -0,0 +1,127 @@
++/*
++ * include/linux/atmel_serial.h
++ *
++ * Copyright (C) 2005 Ivan Kokshaysky
++ * Copyright (C) SAN People
++ *
++ * USART registers.
++ * Based on AT91RM9200 datasheet revision E.
++ *
++ * 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.
++ */
++
++#ifndef ATMEL_SERIAL_H
++#define ATMEL_SERIAL_H
++
++#define ATMEL_US_CR 0x00 /* Control Register */
++#define ATMEL_US_RSTRX (1 << 2) /* Reset Receiver */
++#define ATMEL_US_RSTTX (1 << 3) /* Reset Transmitter */
++#define ATMEL_US_RXEN (1 << 4) /* Receiver Enable */
++#define ATMEL_US_RXDIS (1 << 5) /* Receiver Disable */
++#define ATMEL_US_TXEN (1 << 6) /* Transmitter Enable */
++#define ATMEL_US_TXDIS (1 << 7) /* Transmitter Disable */
++#define ATMEL_US_RSTSTA (1 << 8) /* Reset Status Bits */
++#define ATMEL_US_STTBRK (1 << 9) /* Start Break */
++#define ATMEL_US_STPBRK (1 << 10) /* Stop Break */
++#define ATMEL_US_STTTO (1 << 11) /* Start Time-out */
++#define ATMEL_US_SENDA (1 << 12) /* Send Address */
++#define ATMEL_US_RSTIT (1 << 13) /* Reset Iterations */
++#define ATMEL_US_RSTNACK (1 << 14) /* Reset Non Acknowledge */
++#define ATMEL_US_RETTO (1 << 15) /* Rearm Time-out */
++#define ATMEL_US_DTREN (1 << 16) /* Data Terminal Ready Enable [AT91RM9200 only] */
++#define ATMEL_US_DTRDIS (1 << 17) /* Data Terminal Ready Disable [AT91RM9200 only] */
++#define ATMEL_US_RTSEN (1 << 18) /* Request To Send Enable */
++#define ATMEL_US_RTSDIS (1 << 19) /* Request To Send Disable */
++
++#define ATMEL_US_MR 0x04 /* Mode Register */
++#define ATMEL_US_USMODE (0xf << 0) /* Mode of the USART */
++#define ATMEL_US_USMODE_NORMAL 0
++#define ATMEL_US_USMODE_RS485 1
++#define ATMEL_US_USMODE_HWHS 2
++#define ATMEL_US_USMODE_MODEM 3
++#define ATMEL_US_USMODE_ISO7816_T0 4
++#define ATMEL_US_USMODE_ISO7816_T1 6
++#define ATMEL_US_USMODE_IRDA 8
++#define ATMEL_US_USCLKS (3 << 4) /* Clock Selection */
++#define ATMEL_US_USCLKS_MCK (0 << 4)
++#define ATMEL_US_USCLKS_MCK_DIV8 (1 << 4)
++#define ATMEL_US_USCLKS_SCK (3 << 4)
++#define ATMEL_US_CHRL (3 << 6) /* Character Length */
++#define ATMEL_US_CHRL_5 (0 << 6)
++#define ATMEL_US_CHRL_6 (1 << 6)
++#define ATMEL_US_CHRL_7 (2 << 6)
++#define ATMEL_US_CHRL_8 (3 << 6)
++#define ATMEL_US_SYNC (1 << 8) /* Synchronous Mode Select */
++#define ATMEL_US_PAR (7 << 9) /* Parity Type */
++#define ATMEL_US_PAR_EVEN (0 << 9)
++#define ATMEL_US_PAR_ODD (1 << 9)
++#define ATMEL_US_PAR_SPACE (2 << 9)
++#define ATMEL_US_PAR_MARK (3 << 9)
++#define ATMEL_US_PAR_NONE (4 << 9)
++#define ATMEL_US_PAR_MULTI_DROP (6 << 9)
++#define ATMEL_US_NBSTOP (3 << 12) /* Number of Stop Bits */
++#define ATMEL_US_NBSTOP_1 (0 << 12)
++#define ATMEL_US_NBSTOP_1_5 (1 << 12)
++#define ATMEL_US_NBSTOP_2 (2 << 12)
++#define ATMEL_US_CHMODE (3 << 14) /* Channel Mode */
++#define ATMEL_US_CHMODE_NORMAL (0 << 14)
++#define ATMEL_US_CHMODE_ECHO (1 << 14)
++#define ATMEL_US_CHMODE_LOC_LOOP (2 << 14)
++#define ATMEL_US_CHMODE_REM_LOOP (3 << 14)
++#define ATMEL_US_MSBF (1 << 16) /* Bit Order */
++#define ATMEL_US_MODE9 (1 << 17) /* 9-bit Character Length */
++#define ATMEL_US_CLKO (1 << 18) /* Clock Output Select */
++#define ATMEL_US_OVER (1 << 19) /* Oversampling Mode */
++#define ATMEL_US_INACK (1 << 20) /* Inhibit Non Acknowledge */
++#define ATMEL_US_DSNACK (1 << 21) /* Disable Successive NACK */
++#define ATMEL_US_MAX_ITER (7 << 24) /* Max Iterations */
++#define ATMEL_US_FILTER (1 << 28) /* Infrared Receive Line Filter */
++
++#define ATMEL_US_IER 0x08 /* Interrupt Enable Register */
++#define ATMEL_US_RXRDY (1 << 0) /* Receiver Ready */
++#define ATMEL_US_TXRDY (1 << 1) /* Transmitter Ready */
++#define ATMEL_US_RXBRK (1 << 2) /* Break Received / End of Break */
++#define ATMEL_US_ENDRX (1 << 3) /* End of Receiver Transfer */
++#define ATMEL_US_ENDTX (1 << 4) /* End of Transmitter Transfer */
++#define ATMEL_US_OVRE (1 << 5) /* Overrun Error */
++#define ATMEL_US_FRAME (1 << 6) /* Framing Error */
++#define ATMEL_US_PARE (1 << 7) /* Parity Error */
++#define ATMEL_US_TIMEOUT (1 << 8) /* Receiver Time-out */
++#define ATMEL_US_TXEMPTY (1 << 9) /* Transmitter Empty */
++#define ATMEL_US_ITERATION (1 << 10) /* Max number of Repetitions Reached */
++#define ATMEL_US_TXBUFE (1 << 11) /* Transmission Buffer Empty */
++#define ATMEL_US_RXBUFF (1 << 12) /* Reception Buffer Full */
++#define ATMEL_US_NACK (1 << 13) /* Non Acknowledge */
++#define ATMEL_US_RIIC (1 << 16) /* Ring Indicator Input Change [AT91RM9200 only] */
++#define ATMEL_US_DSRIC (1 << 17) /* Data Set Ready Input Change [AT91RM9200 only] */
++#define ATMEL_US_DCDIC (1 << 18) /* Data Carrier Detect Input Change [AT91RM9200 only] */
++#define ATMEL_US_CTSIC (1 << 19) /* Clear to Send Input Change */
++#define ATMEL_US_RI (1 << 20) /* RI */
++#define ATMEL_US_DSR (1 << 21) /* DSR */
++#define ATMEL_US_DCD (1 << 22) /* DCD */
++#define ATMEL_US_CTS (1 << 23) /* CTS */
++
++#define ATMEL_US_IDR 0x0c /* Interrupt Disable Register */
++#define ATMEL_US_IMR 0x10 /* Interrupt Mask Register */
++#define ATMEL_US_CSR 0x14 /* Channel Status Register */
++#define ATMEL_US_RHR 0x18 /* Receiver Holding Register */
++#define ATMEL_US_THR 0x1c /* Transmitter Holding Register */
++#define ATMEL_US_SYNH (1 << 15) /* Transmit/Receive Sync [AT91SAM9261 only] */
++
++#define ATMEL_US_BRGR 0x20 /* Baud Rate Generator Register */
++#define ATMEL_US_CD (0xffff << 0) /* Clock Divider */
++
++#define ATMEL_US_RTOR 0x24 /* Receiver Time-out Register */
++#define ATMEL_US_TO (0xffff << 0) /* Time-out Value */
++
++#define ATMEL_US_TTGR 0x28 /* Transmitter Timeguard Register */
++#define ATMEL_US_TG (0xff << 0) /* Timeguard Value */
++
++#define ATMEL_US_FIDI 0x40 /* FI DI Ratio Register */
++#define ATMEL_US_NER 0x44 /* Number of Errors Register */
++#define ATMEL_US_IF 0x4c /* IrDA Filter Register */
++
++#endif
+diff -urN linux-2.6.24.3/include/linux/atmel_tc.h avr32-2.6/include/linux/atmel_tc.h
+--- linux-2.6.24.3/include/linux/atmel_tc.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/include/linux/atmel_tc.h 2008-04-23 20:12:46.000000000 +0200
+@@ -0,0 +1,252 @@
++/*
++ * Timer/Counter Unit (TC) registers.
++ *
++ * 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.
++ */
++
++#ifndef ATMEL_TC_H
++#define ATMEL_TC_H
++
++#include <linux/compiler.h>
++#include <linux/list.h>
++
++/*
++ * Many 32-bit Atmel SOCs include one or more TC blocks, each of which holds
++ * three general-purpose 16-bit timers. These timers share one register bank.
++ * Depending on the SOC, each timer may have its own clock and IRQ, or those
++ * may be shared by the whole TC block.
++ *
++ * These TC blocks may have up to nine external pins: TCLK0..2 signals for
++ * clocks or clock gates, and per-timer TIOA and TIOB signals used for PWM
++ * or triggering. Those pins need to be set up for use with the TC block,
++ * else they will be used as GPIOs or for a different controller.
++ *
++ * Although we expect each TC block to have a platform_device node, those
++ * nodes are not what drivers bind to. Instead, they ask for a specific
++ * TC block, by number ... which is a common approach on systems with many
++ * timers. Then they use clk_get() and platform_get_irq() to get clock and
++ * IRQ resources.
++ */
++
++struct clk;
++
++/**
++ * struct atmel_tc - information about a Timer/Counter Block
++ * @pdev: physical device
++ * @iomem: resource associated with the I/O register
++ * @regs: mapping through which the I/O registers can be accessed
++ * @irq: irq for each of the three channels
++ * @clk: internal clock source for each of the three channels
++ * @node: list node, for tclib internal use
++ *
++ * On some platforms, each TC channel has its own clocks and IRQs,
++ * while on others, all TC channels share the same clock and IRQ.
++ * Drivers should clk_enable() all the clocks they need even though
++ * all the entries in @clk may point to the same physical clock.
++ * Likewise, drivers should request irqs independently for each
++ * channel, but they must use IRQF_SHARED in case some of the entries
++ * in @irq are actually the same IRQ.
++ */
++struct atmel_tc {
++ struct platform_device *pdev;
++ struct resource *iomem;
++ void __iomem *regs;
++ int irq[3];
++ struct clk *clk[3];
++ struct list_head node;
++};
++
++extern struct atmel_tc *atmel_tc_alloc(unsigned block, const char *name);
++extern void atmel_tc_free(struct atmel_tc *tc);
++
++/* platform-specific ATMEL_TC_TIMER_CLOCKx divisors (0 means 32KiHz) */
++extern const u8 atmel_tc_divisors[5];
++
++
++/*
++ * Two registers have block-wide controls. These are: configuring the three
++ * "external" clocks (or event sources) used by the timer channels; and
++ * synchronizing the timers by resetting them all at once.
++ *
++ * "External" can mean "external to chip" using the TCLK0, TCLK1, or TCLK2
++ * signals. Or, it can mean "external to timer", using the TIOA output from
++ * one of the other two timers that's being run in waveform mode.
++ */
++
++#define ATMEL_TC_BCR 0xc0 /* TC Block Control Register */
++#define ATMEL_TC_SYNC (1 << 0) /* synchronize timers */
++
++#define ATMEL_TC_BMR 0xc4 /* TC Block Mode Register */
++#define ATMEL_TC_TC0XC0S (3 << 0) /* external clock 0 source */
++#define ATMEL_TC_TC0XC0S_TCLK0 (0 << 0)
++#define ATMEL_TC_TC0XC0S_NONE (1 << 0)
++#define ATMEL_TC_TC0XC0S_TIOA1 (2 << 0)
++#define ATMEL_TC_TC0XC0S_TIOA2 (3 << 0)
++#define ATMEL_TC_TC1XC1S (3 << 2) /* external clock 1 source */
++#define ATMEL_TC_TC1XC1S_TCLK1 (0 << 2)
++#define ATMEL_TC_TC1XC1S_NONE (1 << 2)
++#define ATMEL_TC_TC1XC1S_TIOA0 (2 << 2)
++#define ATMEL_TC_TC1XC1S_TIOA2 (3 << 2)
++#define ATMEL_TC_TC2XC2S (3 << 4) /* external clock 2 source */
++#define ATMEL_TC_TC2XC2S_TCLK2 (0 << 4)
++#define ATMEL_TC_TC2XC2S_NONE (1 << 4)
++#define ATMEL_TC_TC2XC2S_TIOA0 (2 << 4)
++#define ATMEL_TC_TC2XC2S_TIOA1 (3 << 4)
++
++
++/*
++ * Each TC block has three "channels", each with one counter and controls.
++ *
++ * Note that the semantics of ATMEL_TC_TIMER_CLOCKx (input clock selection
++ * when it's not "external") is silicon-specific. AT91 platforms use one
++ * set of definitions; AVR32 platforms use a different set. Don't hard-wire
++ * such knowledge into your code, use the global "atmel_tc_divisors" ...
++ * where index N is the divisor for clock N+1, else zero to indicate it uses
++ * the 32 KiHz clock.
++ *
++ * The timers can be chained in various ways, and operated in "waveform"
++ * generation mode (including PWM) or "capture" mode (to time events). In
++ * both modes, behavior can be configured in many ways.
++ *
++ * Each timer has two I/O pins, TIOA and TIOB. Waveform mode uses TIOA as a
++ * PWM output, and TIOB as either another PWM or as a trigger. Capture mode
++ * uses them only as inputs.
++ */
++#define ATMEL_TC_CHAN(idx) ((idx)*0x40)
++#define ATMEL_TC_REG(idx, reg) (ATMEL_TC_CHAN(idx) + ATMEL_TC_ ## reg)
++
++#define ATMEL_TC_CCR 0x00 /* Channel Control Register */
++#define ATMEL_TC_CLKEN (1 << 0) /* clock enable */
++#define ATMEL_TC_CLKDIS (1 << 1) /* clock disable */
++#define ATMEL_TC_SWTRG (1 << 2) /* software trigger */
++
++#define ATMEL_TC_CMR 0x04 /* Channel Mode Register */
++
++/* Both modes share some CMR bits */
++#define ATMEL_TC_TCCLKS (7 << 0) /* clock source */
++#define ATMEL_TC_TIMER_CLOCK1 (0 << 0)
++#define ATMEL_TC_TIMER_CLOCK2 (1 << 0)
++#define ATMEL_TC_TIMER_CLOCK3 (2 << 0)
++#define ATMEL_TC_TIMER_CLOCK4 (3 << 0)
++#define ATMEL_TC_TIMER_CLOCK5 (4 << 0)
++#define ATMEL_TC_XC0 (5 << 0)
++#define ATMEL_TC_XC1 (6 << 0)
++#define ATMEL_TC_XC2 (7 << 0)
++#define ATMEL_TC_CLKI (1 << 3) /* clock invert */
++#define ATMEL_TC_BURST (3 << 4) /* clock gating */
++#define ATMEL_TC_GATE_NONE (0 << 4)
++#define ATMEL_TC_GATE_XC0 (1 << 4)
++#define ATMEL_TC_GATE_XC1 (2 << 4)
++#define ATMEL_TC_GATE_XC2 (3 << 4)
++#define ATMEL_TC_WAVE (1 << 15) /* true = Waveform mode */
++
++/* CAPTURE mode CMR bits */
++#define ATMEL_TC_LDBSTOP (1 << 6) /* counter stops on RB load */
++#define ATMEL_TC_LDBDIS (1 << 7) /* counter disable on RB load */
++#define ATMEL_TC_ETRGEDG (3 << 8) /* external trigger edge */
++#define ATMEL_TC_ETRGEDG_NONE (0 << 8)
++#define ATMEL_TC_ETRGEDG_RISING (1 << 8)
++#define ATMEL_TC_ETRGEDG_FALLING (2 << 8)
++#define ATMEL_TC_ETRGEDG_BOTH (3 << 8)
++#define ATMEL_TC_ABETRG (1 << 10) /* external trigger is TIOA? */
++#define ATMEL_TC_CPCTRG (1 << 14) /* RC compare trigger enable */
++#define ATMEL_TC_LDRA (3 << 16) /* RA loading edge (of TIOA) */
++#define ATMEL_TC_LDRA_NONE (0 << 16)
++#define ATMEL_TC_LDRA_RISING (1 << 16)
++#define ATMEL_TC_LDRA_FALLING (2 << 16)
++#define ATMEL_TC_LDRA_BOTH (3 << 16)
++#define ATMEL_TC_LDRB (3 << 18) /* RB loading edge (of TIOA) */
++#define ATMEL_TC_LDRB_NONE (0 << 18)
++#define ATMEL_TC_LDRB_RISING (1 << 18)
++#define ATMEL_TC_LDRB_FALLING (2 << 18)
++#define ATMEL_TC_LDRB_BOTH (3 << 18)
++
++/* WAVEFORM mode CMR bits */
++#define ATMEL_TC_CPCSTOP (1 << 6) /* RC compare stops counter */
++#define ATMEL_TC_CPCDIS (1 << 7) /* RC compare disables counter */
++#define ATMEL_TC_EEVTEDG (3 << 8) /* external event edge */
++#define ATMEL_TC_EEVTEDG_NONE (0 << 8)
++#define ATMEL_TC_EEVTEDG_RISING (1 << 8)
++#define ATMEL_TC_EEVTEDG_FALLING (2 << 8)
++#define ATMEL_TC_EEVTEDG_BOTH (3 << 8)
++#define ATMEL_TC_EEVT (3 << 10) /* external event source */
++#define ATMEL_TC_EEVT_TIOB (0 << 10)
++#define ATMEL_TC_EEVT_XC0 (1 << 10)
++#define ATMEL_TC_EEVT_XC1 (2 << 10)
++#define ATMEL_TC_EEVT_XC2 (3 << 10)
++#define ATMEL_TC_ENETRG (1 << 12) /* external event is trigger */
++#define ATMEL_TC_WAVESEL (3 << 13) /* waveform type */
++#define ATMEL_TC_WAVESEL_UP (0 << 13)
++#define ATMEL_TC_WAVESEL_UPDOWN (1 << 13)
++#define ATMEL_TC_WAVESEL_UP_AUTO (2 << 13)
++#define ATMEL_TC_WAVESEL_UPDOWN_AUTO (3 << 13)
++#define ATMEL_TC_ACPA (3 << 16) /* RA compare changes TIOA */
++#define ATMEL_TC_ACPA_NONE (0 << 16)
++#define ATMEL_TC_ACPA_SET (1 << 16)
++#define ATMEL_TC_ACPA_CLEAR (2 << 16)
++#define ATMEL_TC_ACPA_TOGGLE (3 << 16)
++#define ATMEL_TC_ACPC (3 << 18) /* RC compare changes TIOA */
++#define ATMEL_TC_ACPC_NONE (0 << 18)
++#define ATMEL_TC_ACPC_SET (1 << 18)
++#define ATMEL_TC_ACPC_CLEAR (2 << 18)
++#define ATMEL_TC_ACPC_TOGGLE (3 << 18)
++#define ATMEL_TC_AEEVT (3 << 20) /* external event changes TIOA */
++#define ATMEL_TC_AEEVT_NONE (0 << 20)
++#define ATMEL_TC_AEEVT_SET (1 << 20)
++#define ATMEL_TC_AEEVT_CLEAR (2 << 20)
++#define ATMEL_TC_AEEVT_TOGGLE (3 << 20)
++#define ATMEL_TC_ASWTRG (3 << 22) /* software trigger changes TIOA */
++#define ATMEL_TC_ASWTRG_NONE (0 << 22)
++#define ATMEL_TC_ASWTRG_SET (1 << 22)
++#define ATMEL_TC_ASWTRG_CLEAR (2 << 22)
++#define ATMEL_TC_ASWTRG_TOGGLE (3 << 22)
++#define ATMEL_TC_BCPB (3 << 24) /* RB compare changes TIOB */
++#define ATMEL_TC_BCPB_NONE (0 << 24)
++#define ATMEL_TC_BCPB_SET (1 << 24)
++#define ATMEL_TC_BCPB_CLEAR (2 << 24)
++#define ATMEL_TC_BCPB_TOGGLE (3 << 24)
++#define ATMEL_TC_BCPC (3 << 26) /* RC compare changes TIOB */
++#define ATMEL_TC_BCPC_NONE (0 << 26)
++#define ATMEL_TC_BCPC_SET (1 << 26)
++#define ATMEL_TC_BCPC_CLEAR (2 << 26)
++#define ATMEL_TC_BCPC_TOGGLE (3 << 26)
++#define ATMEL_TC_BEEVT (3 << 28) /* external event changes TIOB */
++#define ATMEL_TC_BEEVT_NONE (0 << 28)
++#define ATMEL_TC_BEEVT_SET (1 << 28)
++#define ATMEL_TC_BEEVT_CLEAR (2 << 28)
++#define ATMEL_TC_BEEVT_TOGGLE (3 << 28)
++#define ATMEL_TC_BSWTRG (3 << 30) /* software trigger changes TIOB */
++#define ATMEL_TC_BSWTRG_NONE (0 << 30)
++#define ATMEL_TC_BSWTRG_SET (1 << 30)
++#define ATMEL_TC_BSWTRG_CLEAR (2 << 30)
++#define ATMEL_TC_BSWTRG_TOGGLE (3 << 30)
++
++#define ATMEL_TC_CV 0x10 /* counter Value */
++#define ATMEL_TC_RA 0x14 /* register A */
++#define ATMEL_TC_RB 0x18 /* register B */
++#define ATMEL_TC_RC 0x1c /* register C */
++
++#define ATMEL_TC_SR 0x20 /* status (read-only) */
++/* Status-only flags */
++#define ATMEL_TC_CLKSTA (1 << 16) /* clock enabled */
++#define ATMEL_TC_MTIOA (1 << 17) /* TIOA mirror */
++#define ATMEL_TC_MTIOB (1 << 18) /* TIOB mirror */
++
++#define ATMEL_TC_IER 0x24 /* interrupt enable (write-only) */
++#define ATMEL_TC_IDR 0x28 /* interrupt disable (write-only) */
++#define ATMEL_TC_IMR 0x2c /* interrupt mask (read-only) */
++
++/* Status and IRQ flags */
++#define ATMEL_TC_COVFS (1 << 0) /* counter overflow */
++#define ATMEL_TC_LOVRS (1 << 1) /* load overrun */
++#define ATMEL_TC_CPAS (1 << 2) /* RA compare */
++#define ATMEL_TC_CPBS (1 << 3) /* RB compare */
++#define ATMEL_TC_CPCS (1 << 4) /* RC compare */
++#define ATMEL_TC_LDRAS (1 << 5) /* RA loading */
++#define ATMEL_TC_LDRBS (1 << 6) /* RB loading */
++#define ATMEL_TC_ETRGS (1 << 7) /* external trigger */
++
++#endif
+diff -urN linux-2.6.24.3/include/linux/usb/atmel_usba_udc.h avr32-2.6/include/linux/usb/atmel_usba_udc.h
+--- linux-2.6.24.3/include/linux/usb/atmel_usba_udc.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/include/linux/usb/atmel_usba_udc.h 2008-04-23 20:12:47.000000000 +0200
+@@ -0,0 +1,22 @@
++/*
++ * Platform data definitions for Atmel USBA gadget driver.
++ */
++#ifndef __LINUX_USB_USBA_H
++#define __LINUX_USB_USBA_H
++
++struct usba_ep_data {
++ char *name;
++ int index;
++ int fifo_size;
++ int nr_banks;
++ int can_dma;
++ int can_isoc;
++};
++
++struct usba_platform_data {
++ int vbus_pin;
++ int num_ep;
++ struct usba_ep_data ep[0];
++};
++
++#endif /* __LINUX_USB_USBA_H */
+diff -urN linux-2.6.24.3/include/video/atmel_lcdc.h avr32-2.6/include/video/atmel_lcdc.h
+--- linux-2.6.24.3/include/video/atmel_lcdc.h 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/include/video/atmel_lcdc.h 2008-04-23 19:33:52.000000000 +0200
@@ -22,7 +22,7 @@
#ifndef __ATMEL_LCDC_H__
#define __ATMEL_LCDC_H__
@@ -16914,7 +19965,7 @@ index 4eea637..336c20d 100644
struct atmel_lcdfb_info {
spinlock_t lock;
struct fb_info *info;
-@@ -33,7 +33,14 @@ struct atmel_lcdfb_info {
+@@ -33,7 +33,14 @@
struct platform_device *pdev;
struct clk *bus_clk;
struct clk *lcdc_clk;
@@ -16930,7 +19981,7 @@ index 4eea637..336c20d 100644
unsigned int default_lcdcon2;
unsigned int default_dmacon;
void (*atmel_lcdfb_power_control)(int on);
-@@ -115,20 +122,20 @@ struct atmel_lcdfb_info {
+@@ -115,20 +122,20 @@
#define ATMEL_LCDC_MEMOR_LITTLE (1 << 31)
#define ATMEL_LCDC_TIM1 0x0808
@@ -16958,11 +20009,29 @@ index 4eea637..336c20d 100644
#define ATMEL_LCDC_LCDFRMCFG 0x0810
#define ATMEL_LCDC_LINEVAL (0x7ff << 0)
-diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index c25db86..c719bb9 100644
---- a/kernel/ptrace.c
-+++ b/kernel/ptrace.c
-@@ -470,6 +470,8 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
+diff -urN linux-2.6.24.3/init/do_mounts.c avr32-2.6/init/do_mounts.c
+--- linux-2.6.24.3/init/do_mounts.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/init/do_mounts.c 2008-04-23 20:12:47.000000000 +0200
+@@ -219,8 +219,14 @@
+
+ static int __init rootwait_setup(char *str)
+ {
+- if (*str)
++ if (*str && *str != '=')
+ return 0;
++
++ if (*str)
++ printk(KERN_WARNING
++ "WARNING: \"rootwait=1\" is deprecated, "
++ "use \"rootwait\" instead.\n");
++
+ root_wait = 1;
+ return 1;
+ }
+diff -urN linux-2.6.24.3/kernel/ptrace.c avr32-2.6/kernel/ptrace.c
+--- linux-2.6.24.3/kernel/ptrace.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/kernel/ptrace.c 2008-04-23 20:12:47.000000000 +0200
+@@ -470,6 +470,8 @@
lock_kernel();
if (request == PTRACE_TRACEME) {
ret = ptrace_traceme();
@@ -16971,63 +20040,30 @@ index c25db86..c719bb9 100644
goto out;
}
-diff --git a/sound/Kconfig b/sound/Kconfig
-index b2a2db4..29a9979 100644
---- a/sound/Kconfig
-+++ b/sound/Kconfig
-@@ -63,6 +63,8 @@ source "sound/aoa/Kconfig"
-
- source "sound/arm/Kconfig"
-
-+source "sound/avr32/Kconfig"
-+
- if SPI
- source "sound/spi/Kconfig"
- endif
-diff --git a/sound/Makefile b/sound/Makefile
-index c76d707..a52b236 100644
---- a/sound/Makefile
-+++ b/sound/Makefile
-@@ -6,7 +6,7 @@ obj-$(CONFIG_SOUND_PRIME) += sound_firmware.o
- obj-$(CONFIG_SOUND_PRIME) += oss/
- obj-$(CONFIG_DMASOUND) += oss/
- obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \
-- sparc/ spi/ parisc/ pcmcia/ mips/ soc/
-+ sparc/ spi/ parisc/ pcmcia/ mips/ soc/ avr32/
- obj-$(CONFIG_SND_AOA) += aoa/
+diff -urN linux-2.6.24.3/localversion-atmel avr32-2.6/localversion-atmel
+--- linux-2.6.24.3/localversion-atmel 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/localversion-atmel 2008-04-23 20:12:47.000000000 +0200
+@@ -0,0 +1 @@
++.atmel.3
+diff -urN linux-2.6.24.3/MAINTAINERS avr32-2.6/MAINTAINERS
+--- linux-2.6.24.3/MAINTAINERS 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/MAINTAINERS 2008-04-23 20:12:35.000000000 +0200
+@@ -671,6 +671,12 @@
+ W: http://www.at91.com/
+ S: Maintained
- # This one must be compilable even if sound is configured out
-diff --git a/sound/avr32/Kconfig b/sound/avr32/Kconfig
-new file mode 100644
-index 0000000..17d1d91
---- /dev/null
-+++ b/sound/avr32/Kconfig
-@@ -0,0 +1,11 @@
-+menu "AVR32 devices"
-+ depends on SND != n && AVR32
-+
-+config SND_ATMEL_AC97
-+ tristate "Atmel AC97 Controller Driver"
-+ select SND_PCM
-+ select SND_AC97_CODEC
-+ help
-+ ALSA sound driver for the Atmel AC97 controller.
-+
-+endmenu
-diff --git a/sound/avr32/Makefile b/sound/avr32/Makefile
-new file mode 100644
-index 0000000..5d87d0e
---- /dev/null
-+++ b/sound/avr32/Makefile
-@@ -0,0 +1,3 @@
-+snd-atmel-ac97-objs := ac97c.o
++ATMEL AT91 / AT32 SERIAL DRIVER
++P: Haavard Skinnemoen
++M: hskinnemoen@atmel.com
++L: linux-kernel@vger.kernel.org
++S: Supported
+
-+obj-$(CONFIG_SND_ATMEL_AC97) += snd-atmel-ac97.o
-diff --git a/sound/avr32/ac97c.c b/sound/avr32/ac97c.c
-new file mode 100644
-index 0000000..0ec0b1c
---- /dev/null
-+++ b/sound/avr32/ac97c.c
+ ATMEL LCDFB DRIVER
+ P: Nicolas Ferre
+ M: nicolas.ferre@atmel.com
+diff -urN linux-2.6.24.3/sound/avr32/ac97c.c avr32-2.6/sound/avr32/ac97c.c
+--- linux-2.6.24.3/sound/avr32/ac97c.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/sound/avr32/ac97c.c 2008-04-23 19:33:54.000000000 +0200
@@ -0,0 +1,914 @@
+/*
+ * Driver for the Atmel AC97 controller
@@ -17943,11 +20979,9 @@ index 0000000..0ec0b1c
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Driver for Atmel AC97 Controller");
+MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
-diff --git a/sound/avr32/ac97c.h b/sound/avr32/ac97c.h
-new file mode 100644
-index 0000000..96246e7
---- /dev/null
-+++ b/sound/avr32/ac97c.h
+diff -urN linux-2.6.24.3/sound/avr32/ac97c.h avr32-2.6/sound/avr32/ac97c.h
+--- linux-2.6.24.3/sound/avr32/ac97c.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/sound/avr32/ac97c.h 2008-04-23 19:33:54.000000000 +0200
@@ -0,0 +1,71 @@
+/*
+ * Register definitions for the Atmel AC97 Controller.
@@ -18020,35 +21054,55 @@ index 0000000..96246e7
+#define AC97C_CHANNEL_B 0x2
+
+#endif /* __SOUND_AVR32_AC97C_H */
-diff --git a/sound/oss/Kconfig b/sound/oss/Kconfig
-index 857008b..db69a17 100644
---- a/sound/oss/Kconfig
-+++ b/sound/oss/Kconfig
-@@ -654,3 +654,7 @@ config SOUND_SH_DAC_AUDIO_CHANNEL
- int "DAC channel"
- default "1"
- depends on SOUND_SH_DAC_AUDIO
+diff -urN linux-2.6.24.3/sound/avr32/Kconfig avr32-2.6/sound/avr32/Kconfig
+--- linux-2.6.24.3/sound/avr32/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/sound/avr32/Kconfig 2008-04-23 19:33:54.000000000 +0200
+@@ -0,0 +1,11 @@
++menu "AVR32 devices"
++ depends on SND != n && AVR32
+
-+config SOUND_AT32_ABDAC
-+ tristate "Atmel AT32 Audio Bitstream DAC (ABDAC) support"
-+ depends on SOUND_PRIME && AVR32
-diff --git a/sound/oss/Makefile b/sound/oss/Makefile
-index f883c4b..a41853b 100644
---- a/sound/oss/Makefile
-+++ b/sound/oss/Makefile
-@@ -10,6 +10,7 @@ obj-$(CONFIG_SOUND_CS4232) += cs4232.o ad1848.o
++config SND_ATMEL_AC97
++ tristate "Atmel AC97 Controller Driver"
++ select SND_PCM
++ select SND_AC97_CODEC
++ help
++ ALSA sound driver for the Atmel AC97 controller.
++
++endmenu
+diff -urN linux-2.6.24.3/sound/avr32/Makefile avr32-2.6/sound/avr32/Makefile
+--- linux-2.6.24.3/sound/avr32/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/sound/avr32/Makefile 2008-04-23 19:33:54.000000000 +0200
+@@ -0,0 +1,3 @@
++snd-atmel-ac97-objs := ac97c.o
++
++obj-$(CONFIG_SND_ATMEL_AC97) += snd-atmel-ac97.o
+diff -urN linux-2.6.24.3/sound/Kconfig avr32-2.6/sound/Kconfig
+--- linux-2.6.24.3/sound/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/sound/Kconfig 2008-04-23 19:33:54.000000000 +0200
+@@ -63,6 +63,8 @@
- # Please leave it as is, cause the link order is significant !
+ source "sound/arm/Kconfig"
-+obj-$(CONFIG_SOUND_AT32_ABDAC) += at32_abdac.o
- obj-$(CONFIG_SOUND_SH_DAC_AUDIO) += sh_dac_audio.o
- obj-$(CONFIG_SOUND_HAL2) += hal2.o
- obj-$(CONFIG_SOUND_AEDSP16) += aedsp16.o
-diff --git a/sound/oss/at32_abdac.c b/sound/oss/at32_abdac.c
-new file mode 100644
-index 0000000..cb997d7
---- /dev/null
-+++ b/sound/oss/at32_abdac.c
++source "sound/avr32/Kconfig"
++
+ if SPI
+ source "sound/spi/Kconfig"
+ endif
+diff -urN linux-2.6.24.3/sound/Makefile avr32-2.6/sound/Makefile
+--- linux-2.6.24.3/sound/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/sound/Makefile 2008-04-23 19:33:54.000000000 +0200
+@@ -6,7 +6,7 @@
+ obj-$(CONFIG_SOUND_PRIME) += oss/
+ obj-$(CONFIG_DMASOUND) += oss/
+ obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \
+- sparc/ spi/ parisc/ pcmcia/ mips/ soc/
++ sparc/ spi/ parisc/ pcmcia/ mips/ soc/ avr32/
+ obj-$(CONFIG_SND_AOA) += aoa/
+
+ # This one must be compilable even if sound is configured out
+diff -urN linux-2.6.24.3/sound/oss/at32_abdac.c avr32-2.6/sound/oss/at32_abdac.c
+--- linux-2.6.24.3/sound/oss/at32_abdac.c 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/sound/oss/at32_abdac.c 2008-04-23 19:33:54.000000000 +0200
@@ -0,0 +1,722 @@
+/*
+ * OSS Sound Driver for the Atmel AT32 on-chip DAC.
@@ -18772,11 +21826,9 @@ index 0000000..cb997d7
+MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
+MODULE_DESCRIPTION("Sound Driver for the Atmel AT32 ABDAC");
+MODULE_LICENSE("GPL");
-diff --git a/sound/oss/at32_abdac.h b/sound/oss/at32_abdac.h
-new file mode 100644
-index 0000000..3c88e25
---- /dev/null
-+++ b/sound/oss/at32_abdac.h
+diff -urN linux-2.6.24.3/sound/oss/at32_abdac.h avr32-2.6/sound/oss/at32_abdac.h
+--- linux-2.6.24.3/sound/oss/at32_abdac.h 1970-01-01 01:00:00.000000000 +0100
++++ avr32-2.6/sound/oss/at32_abdac.h 2008-04-23 19:33:54.000000000 +0200
@@ -0,0 +1,59 @@
+/*
+ * Register definitions for the Atmel AT32 on-chip DAC.
@@ -18837,3 +21889,55 @@ index 0000000..3c88e25
+ __raw_writel((value), (port)->regs + DAC_##reg)
+
+#endif /* __SOUND_OSS_AT32_ABDAC_H__ */
+diff -urN linux-2.6.24.3/sound/oss/Kconfig avr32-2.6/sound/oss/Kconfig
+--- linux-2.6.24.3/sound/oss/Kconfig 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/sound/oss/Kconfig 2008-04-23 19:33:54.000000000 +0200
+@@ -654,3 +654,7 @@
+ int "DAC channel"
+ default "1"
+ depends on SOUND_SH_DAC_AUDIO
++
++config SOUND_AT32_ABDAC
++ tristate "Atmel AT32 Audio Bitstream DAC (ABDAC) support"
++ depends on SOUND_PRIME && AVR32
+diff -urN linux-2.6.24.3/sound/oss/Makefile avr32-2.6/sound/oss/Makefile
+--- linux-2.6.24.3/sound/oss/Makefile 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/sound/oss/Makefile 2008-04-23 20:12:49.000000000 +0200
+@@ -10,6 +10,7 @@
+
+ # Please leave it as is, cause the link order is significant !
+
++obj-$(CONFIG_SOUND_AT32_ABDAC) += at32_abdac.o
+ obj-$(CONFIG_SOUND_SH_DAC_AUDIO) += sh_dac_audio.o
+ obj-$(CONFIG_SOUND_HAL2) += hal2.o
+ obj-$(CONFIG_SOUND_AEDSP16) += aedsp16.o
+diff -urN linux-2.6.24.3/sound/spi/at73c213.c avr32-2.6/sound/spi/at73c213.c
+--- linux-2.6.24.3/sound/spi/at73c213.c 2008-02-26 01:20:20.000000000 +0100
++++ avr32-2.6/sound/spi/at73c213.c 2008-04-23 20:12:51.000000000 +0200
+@@ -744,7 +744,7 @@
+ /*
+ * Device functions
+ */
+-static int snd_at73c213_ssc_init(struct snd_at73c213 *chip)
++static int __devinit snd_at73c213_ssc_init(struct snd_at73c213 *chip)
+ {
+ /*
+ * Continuous clock output.
+@@ -774,7 +774,7 @@
+ return 0;
+ }
+
+-static int snd_at73c213_chip_init(struct snd_at73c213 *chip)
++static int __devinit snd_at73c213_chip_init(struct snd_at73c213 *chip)
+ {
+ int retval;
+ unsigned char dac_ctrl = 0;
+@@ -939,7 +939,7 @@
+ return retval;
+ }
+
+-static int snd_at73c213_probe(struct spi_device *spi)
++static int __devinit snd_at73c213_probe(struct spi_device *spi)
+ {
+ struct snd_card *card;
+ struct snd_at73c213 *chip;