AVR32: sync with latest Atmel source (closes #3371)
authorMatteo Croce <rootkit85@yahoo.it>
Wed, 23 Apr 2008 20:25:37 +0000 (20:25 +0000)
committerMatteo Croce <rootkit85@yahoo.it>
Wed, 23 Apr 2008 20:25:37 +0000 (20:25 +0000)
SVN-Revision: 10932

target/linux/avr32/config-default
target/linux/avr32/patches/100-git_sync.patch

index f33525780e33a6e3bd59c5cce0c8d62c25f0e6cd..42c4515e16ab113acd3e8ad03ef4edb7e56e2ebc 100644 (file)
@@ -2,48 +2,66 @@ CONFIG_AP700X_16_BIT_SMC=y
 # CONFIG_AP700X_32_BIT_SMC is not set
 # CONFIG_AP700X_8_BIT_SMC is not set
 # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-# CONFIG_ATM_DRIVERS is not set
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+# CONFIG_ARCH_HAVE_MEMORY_PRESENT is not set
+# CONFIG_ARCH_SPARSEMEM_ENABLE is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_ARCH_SUPPORTS_OPROFILE=y
 # CONFIG_ATMEL_PWM is not set
 # CONFIG_ATMEL_SSC is not set
+# CONFIG_ATMEL_TCLIB is not set
 CONFIG_AVR32=y
+CONFIG_BASE_SMALL=0
+CONFIG_BITREVERSE=y
 CONFIG_BOARD_ATNGW100=y
 # CONFIG_BOARD_ATNGW100_I2C_GPIO is not set
 # CONFIG_BOARD_ATSTK1000 is not set
 # CONFIG_BROADCOM_PHY is not set
 # CONFIG_BT is not set
 CONFIG_CPU_AT32AP7000=y
+CONFIG_CPU_AT32AP700X=y
 # CONFIG_CPU_FREQ is not set
-# CONFIG_CPU_FREQ_DEBUG is not set
-# CONFIG_CPU_FREQ_STAT is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
-# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
-# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
-# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
-CONFIG_CPU_FREQ_AT32AP=y
+# CONFIG_CRYPTO_HW is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
 CONFIG_DW_DMAC=y
 CONFIG_ENTRY_ADDRESS=0x90000000
 # CONFIG_FIXED_PHY is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_GENERIC_GPIO=y
 # CONFIG_GEN_RTC is not set
 # CONFIG_GPIO_DEV is not set
-# CONFIG_HZ_100 is not set
-CONFIG_HZ=250
-CONFIG_HZ_250=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+# CONFIG_HAVE_ARCH_BOOTMEM_NODE is not set
 # CONFIG_HW_RANDOM is not set
-# CONFIG_I2C is not set
+CONFIG_I2C=y
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ATMELTWI is not set
+CONFIG_I2C_BOARDINFO=y
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
 # CONFIG_IDE is not set
 CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_LEDS_ALIX is not set
 CONFIG_LEDS_GPIO=y
+CONFIG_LOADER_U_BOOT=y
+CONFIG_LOAD_ADDRESS=0x10000000
 CONFIG_MACB=y
 # CONFIG_MDIO_BITBANG is not set
+CONFIG_MTD=y
 # CONFIG_MTD_ABSENT is not set
 CONFIG_MTD_BLKDEVS=y
-# CONFIG_MTD_BLOCK2MTD is not set
 CONFIG_MTD_BLOCK=y
+# CONFIG_MTD_BLOCK2MTD is not set
+CONFIG_MTD_CFI=y
 # CONFIG_MTD_CFI_ADV_OPTIONS is not set
 CONFIG_MTD_CFI_AMDSTD=y
 CONFIG_MTD_CFI_I1=y
@@ -53,7 +71,6 @@ CONFIG_MTD_CFI_I2=y
 # CONFIG_MTD_CFI_INTELEXT is not set
 # CONFIG_MTD_CFI_STAA is not set
 CONFIG_MTD_CFI_UTIL=y
-CONFIG_MTD_CFI=y
 CONFIG_MTD_CHAR=y
 CONFIG_MTD_CMDLINE_PARTS=y
 # CONFIG_MTD_COMPLEX_MAPPINGS is not set
@@ -65,51 +82,62 @@ CONFIG_MTD_DATAFLASH=y
 # CONFIG_MTD_DOC2001PLUS is not set
 CONFIG_MTD_GEN_PROBE=y
 # CONFIG_MTD_JEDECPROBE is not set
-# CONFIG_MTD_M25P80 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
 CONFIG_MTD_MAP_BANK_WIDTH_1=y
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
 CONFIG_MTD_MAP_BANK_WIDTH_2=y
 # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
 CONFIG_MTD_MAP_BANK_WIDTH_4=y
 # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
 # CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_NAND is not set
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
 # CONFIG_MTD_ONENAND is not set
 CONFIG_MTD_PARTITIONS=y
 # CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_PHYSMAP=y
 CONFIG_MTD_PHYSMAP_BANKWIDTH=2
 CONFIG_MTD_PHYSMAP_LEN=0x0
 CONFIG_MTD_PHYSMAP_START=0x80000000
-CONFIG_MTD_PHYSMAP=y
 # CONFIG_MTD_PLATRAM is not set
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_REDBOOT_PARTS is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_SLRAM is not set
-CONFIG_MTD=y
+# CONFIG_NEED_NODE_MEMMAP_SIZE is not set
 # CONFIG_NMI_DEBUGGING is not set
+CONFIG_NO_HZ=y
 # CONFIG_OWNERSHIP_TRACE is not set
+CONFIG_PERFORMANCE_COUNTERS=y
+CONFIG_PHYLIB=y
 CONFIG_PHYS_OFFSET=0x10000000
 CONFIG_PLATFORM_AT32AP=y
 # CONFIG_QSEMI_PHY is not set
 # CONFIG_RTC is not set
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_SCSI_WAIT_SCAN=m
 # CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_ATMEL=y
 CONFIG_SERIAL_ATMEL_CONSOLE=y
 CONFIG_SERIAL_ATMEL_PDC=y
 # CONFIG_SERIAL_ATMEL_TTYAT is not set
-CONFIG_SERIAL_ATMEL=y
+CONFIG_SLABINFO=y
 # CONFIG_SMSC_PHY is not set
-# CONFIG_SPI_AT25 is not set
+# CONFIG_SND_ATMEL_AC97 is not set
+# CONFIG_SPARSEMEM_STATIC is not set
+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+CONFIG_SPI=y
 CONFIG_SPI_ATMEL=y
 # CONFIG_SPI_BITBANG is not set
-# CONFIG_SPI_DEBUG is not set
+# CONFIG_SPI_GPIO is not set
 CONFIG_SPI_MASTER=y
 # CONFIG_SPI_SPIDEV is not set
-# CONFIG_SPI_TLE62X0 is not set
-CONFIG_SPI=y
+CONFIG_SSB_POSSIBLE=y
 CONFIG_SUBARCH_AVR32B=y
-# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_TICK_ONESHOT=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
 # CONFIG_USER_NS is not set
+# CONFIG_VGASTATE is not set
 # CONFIG_WATCHDOG is not set
+CONFIG_ZONE_DMA_FLAG=0
index bfbc8c1d2b83b8be75fe599cb6fffeade4fc8b12..20c08cfc4ae3d7603888e18e6bf67861f2c3819b 100644 (file)
@@ -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
 +
@@ -423,254 +123,80 @@ index 0000000..5d922df
 +        on pretty much any setup.
 +
 +        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
-@@ -20,7 +20,7 @@
- #include <asm/io.h>
- #include <asm/setup.h>
--#include <asm/arch/at32ap7000.h>
-+#include <asm/arch/at32ap700x.h>
- #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 = {
-       },
- };
-+static struct mci_platform_data __initdata mci0_data = {
-+      .detect_pin     = GPIO_PIN_PC(25),
-+      .wp_pin         = GPIO_PIN_PE(0),
-+};
-+
- /*
-  * 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 = {
-       }
- };
-+#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO
- 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 = {
-               .platform_data  = &i2c_gpio_data,
-       },
- };
-+#endif
- static int __init atngw100_init(void)
- {
-@@ -157,6 +164,7 @@ static int __init atngw100_init(void)
-       set_hw_addr(at32_add_device_eth(1, &eth_data[1]));
-       at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
-+      at32_add_device_mci(0, &mci0_data);
-       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)
-       }
-       platform_device_register(&ngw_gpio_leds);
-+#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO
-       at32_select_gpio(i2c_gpio_data.sda_pin,
-               AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
-       at32_select_gpio(i2c_gpio_data.scl_pin,
-               AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
-       platform_device_register(&i2c_gpio_device);
-+#else
-+      at32_add_device_twi(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.
++        want to rule out the i2c bus driver.
+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>
+-#include <asm/arch/at32ap7000.h>
++#include <asm/arch/at32ap700x.h>
+ #include <asm/arch/board.h>
+ #include <asm/arch/init.h>
+ #include <asm/arch/portmux.h>
+@@ -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,
+       },
+ };
++static struct mci_platform_data __initdata mci0_data = {
++      .detect_pin     = GPIO_PIN_PC(25),
++      .wp_pin         = GPIO_PIN_PE(0),
++};
 +
-+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
+ /*
+  * 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 @@
+       }
+ };
++#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO
+ 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 @@
+               .platform_data  = &i2c_gpio_data,
+       },
+ };
++#endif
+ 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));
++      at32_add_device_mci(0, &mci0_data);
+       at32_add_device_usba(0, NULL);
+       for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) {
+@@ -165,11 +173,15 @@
+       }
+       platform_device_register(&ngw_gpio_leds);
++#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO
+       at32_select_gpio(i2c_gpio_data.sda_pin,
+               AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
+       at32_select_gpio(i2c_gpio_data.scl_pin,
+               AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
+       platform_device_register(&i2c_gpio_device);
++#else
++      at32_add_device_twi(0, NULL, 0);
++#endif
+       return 0;
+ }
+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
 + *
@@ -1180,78 +710,270 @@ index 0000000..96015dd
 +              goto err_set_clk;
 +      }
 +
-+      at32_select_periph(GPIO_PIN_PA(30), GPIO_PERIPH_A, 0);
-+      at73c213_data.dac_clk = gclk;
++      at32_select_periph(GPIO_PIN_PA(30), GPIO_PERIPH_A, 0);
++      at73c213_data.dac_clk = gclk;
++
++err_set_clk:
++      clk_put(pll);
++err_pll:
++      clk_put(gclk);
++err_gclk:
++      return;
++}
++#else
++static void __init atstk1004_setup_extdac(void)
++{
++
++}
++#endif /* CONFIG_BOARD_ATSTK1000_EXTDAC */
++
++void __init setup_board(void)
++{
++#ifdef        CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
++      at32_map_usart(0, 1);   /* USART 0/B: /dev/ttyS1, IRDA */
++#else
++      at32_map_usart(1, 0);   /* USART 1/A: /dev/ttyS0, DB9 */
++#endif
++      /* USART 2/unused: expansion connector */
++      at32_map_usart(3, 2);   /* USART 3/C: /dev/ttyS2, DB9 */
++
++      at32_setup_serial_console(0);
++}
++
++static int __init atstk1004_init(void)
++{
++      at32_add_system_devices();
++
++#ifdef        CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
++      at32_add_device_usart(1);
++#else
++      at32_add_device_usart(0);
++#endif
++      at32_add_device_usart(2);
++
++#ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM
++      at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
++#endif
++#ifdef CONFIG_BOARD_ATSTK100X_SPI1
++      at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
++#endif
++#ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
++      at32_add_device_mci(0, NULL);
++#endif
++      at32_add_device_lcdc(0, &atstk1000_lcdc_data,
++                           fbmem_start, fbmem_size);
++      at32_add_device_usba(0, NULL);
++#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
++#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_PSIF
++      at32_add_device_psif(0);
++      at32_add_device_psif(1);
++#endif
++
++      atstk1000_setup_j2_leds();
++      atstk1004_setup_extdac();
++
++      return 0;
++}
++postcore_initcall(atstk1004_init);
+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.
 +
-+err_set_clk:
-+      clk_put(pll);
-+err_pll:
-+      clk_put(gclk);
-+err_gclk:
-+      return;
-+}
-+#else
-+static void __init atstk1004_setup_extdac(void)
-+{
++        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.
 +
-+}
-+#endif /* CONFIG_BOARD_ATSTK1000_EXTDAC */
++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.
 +
-+void __init setup_board(void)
-+{
-+#ifdef        CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
-+      at32_map_usart(0, 1);   /* USART 0/B: /dev/ttyS1, IRDA */
-+#else
-+      at32_map_usart(1, 0);   /* USART 1/A: /dev/ttyS0, DB9 */
-+#endif
-+      /* USART 2/unused: expansion connector */
-+      at32_map_usart(3, 2);   /* USART 3/C: /dev/ttyS2, DB9 */
++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.
 +
-+      at32_setup_serial_console(0);
-+}
++        The default is 0x30, which is pin 16 on PIOB, aka GPIO14.
 +
-+static int __init atstk1004_init(void)
-+{
-+      at32_add_system_devices();
++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.
 +
-+#ifdef        CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
-+      at32_add_device_usart(1);
-+#else
-+      at32_add_device_usart(0);
-+#endif
-+      at32_add_device_usart(2);
++        The default is 0x3e, which is pin 30 on PIOB, aka GPIO15.
 +
-+#ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM
-+      at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
-+#endif
-+#ifdef CONFIG_BOARD_ATSTK100X_SPI1
-+      at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
-+#endif
-+#ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
-+      at32_add_device_mci(0, NULL);
-+#endif
-+      at32_add_device_lcdc(0, &atstk1000_lcdc_data,
-+                           fbmem_start, fbmem_size);
-+      at32_add_device_usba(0, NULL);
-+#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
++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.
 +
-+      atstk1000_setup_j2_leds();
-+      atstk1004_setup_extdac();
++        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.
 +
-+      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
++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)
  {
@@ -6394,81 +6351,391 @@ index 9d6dac8..eaaa69b 100644
 +      ocd_disable(current);
  }
  
- void flush_thread(void)
-@@ -345,6 +345,9 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
-       p->thread.cpu_context.ksp = (unsigned long)childregs;
-       p->thread.cpu_context.pc = (unsigned long)ret_from_fork;
+ void flush_thread(void)
+@@ -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 -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);
++      ocd_disable(child);
+ }
+ /*
+@@ -144,10 +145,6 @@
+ {
+       int ret;
+-      pr_debug("ptrace: Enabling monitor mode...\n");
+-      ocd_write(DC, ocd_read(DC) | (1 << OCD_DC_MM_BIT)
+-                      | (1 << OCD_DC_DBE_BIT));
+-
+       switch (request) {
+       /* Read the word at location addr in the child process */
+       case PTRACE_PEEKTEXT:
+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;
++              } else {
++                      memset(__va(fbmem_start), 0, fbmem_size);
+               }
+       }
+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;
+-      if (try_to_freeze()) {
+-              signr = 0;
+-              if (!signal_pending(current))
+-                      goto no_signal;
+-      }
+-
+       if (test_thread_flag(TIF_RESTORE_SIGMASK))
+               oldset = &current->saved_sigmask;
+       else if (!oldset)
+               oldset = &current->blocked;
+       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+-no_signal:
+       if (syscall) {
+               switch (regs->r12) {
+               case -ERESTART_RESTARTBLOCK:
+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);
  
-+      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)
+-/*
+- * 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)
  {
-       clear_tsk_thread_flag(child, TIF_SINGLE_STEP);
-       clear_tsk_thread_flag(child, TIF_BREAKPOINT);
-+      ocd_disable(child);
+-      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();
++      }
  }
  
- /*
-@@ -144,10 +145,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
+-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;
  
--      pr_debug("ptrace: Enabling monitor mode...\n");
--      ocd_write(DC, ocd_read(DC) | (1 << OCD_DC_MM_BIT)
--                      | (1 << OCD_DC_DBE_BIT));
+-      /*
+-       * Make sure we don't get any COMPARE interrupts before we can
+-       * handle them.
+-       */
+-      sysreg_write(COMPARE, 0);
 -
-       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)
-                       printk(KERN_WARNING
-                              "Failed to allocate framebuffer memory\n");
-                       fbmem_size = 0;
-+              } else {
-+                      memset(__va(fbmem_start), 0, fbmem_size);
-               }
-       }
+-      xtime.tv_sec = rtc_get_time();
++      xtime.tv_sec = mktime(2007, 1, 1, 0, 0, 0);
+       xtime.tv_nsec = 0;
  
-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)
-       if (!user_mode(regs))
-               return 0;
+       set_normalized_timespec(&wall_to_monotonic,
+                               -xtime.tv_sec, -xtime.tv_nsec);
  
--      if (try_to_freeze()) {
--              signr = 0;
--              if (!signal_pending(current))
--                      goto no_signal;
+-      ret = avr32_hpt_init();
+-      if (ret) {
+-              pr_debug("timer: failed setup: %d\n", ret);
+-              return;
 -      }
--
-       if (test_thread_flag(TIF_RESTORE_SIGMASK))
-               oldset = &current->saved_sigmask;
-       else if (!oldset)
-               oldset = &current->blocked;
++      /* 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;
  
-       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
--no_signal:
-       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
+-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),
 +};
-+DEV_CLK(pclk, at32_systc0, pbb, 3);
++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(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
@@ -10807,20 +11145,84 @@ index 0000000..8cf6d11
 +
 +      return 0;
 +
-+err_register_subsys:
-+      unregister_chrdev_region(gpio_devt, GPIO_DEV_MAX);
-+err_alloc_chrdev:
-+      class_destroy(gpio_dev_class);
-+err_class_create:
-+      printk(KERN_WARNING "Failed to initialize gpio /dev interface\n");
-+      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:
++err_register_subsys:
++      unregister_chrdev_region(gpio_devt, GPIO_DEV_MAX);
++err_alloc_chrdev:
++      class_destroy(gpio_dev_class);
++err_class_create:
++      printk(KERN_WARNING "Failed to initialize gpio /dev interface\n");
++      return err;
++}
++late_initcall(gpio_dev_init);
+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.
-+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 --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
- 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
+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.
++      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 -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>
@@ -11966,53 +13477,30 @@ index 0000000..187031c
 +{
 +      return platform_driver_probe(&pwmled_driver, pwmled_probe);
 +}
-+module_init(modinit);
-+
-+static void __exit modexit(void)
-+{
-+      platform_driver_unregister(&pwmled_driver);
-+}
-+module_exit(modexit);
-+
-+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
-+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.
++module_init(modinit);
 +
- 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
++static void __exit modexit(void)
++{
++      platform_driver_unregister(&pwmled_driver);
++}
++module_exit(modexit);
++
++MODULE_DESCRIPTION("Driver for LEDs with PWM-controlled brightness");
++MODULE_LICENSE("GPL");
+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
+ # 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,49 +15681,29 @@ 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
--      { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
-       { 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
+-      { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
+       { 0, 0, NULL, NULL }
+ };
+ static struct cfi_fixup jedec_fixup_table[] = {
+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;