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