X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/17c7b6c3fdc48301e50d22cc6138ede16bd1be24..f78c3234884980fb60c676047e7d0f457776f7dd:/target/linux/avr32/patches/100-git_sync.patch diff --git a/target/linux/avr32/patches/100-git_sync.patch b/target/linux/avr32/patches/100-git_sync.patch index e9e96144e..bfbc8c1d2 100644 --- a/target/linux/avr32/patches/100-git_sync.patch +++ b/target/linux/avr32/patches/100-git_sync.patch @@ -1,6 +1,416 @@ -diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atngw100/Kconfig linux-avr32.git/arch/avr32/boards/atngw100/Kconfig ---- linux-2.6.22.1/arch/avr32/boards/atngw100/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-avr32.git/arch/avr32/boards/atngw100/Kconfig 2007-07-13 11:24:16.000000000 +0200 + 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) + at91_set_B_periph(AT91_PIN_PB27, 0); /* LCDD22 */ + at91_set_B_periph(AT91_PIN_PB28, 0); /* LCDD23 */ + ++#ifdef CONFIG_FB_INTSRAM ++ { ++ void __iomem *fb; ++ struct resource *fb_res = &lcdc_resources[2]; ++ size_t fb_len = fb_res->end - fb_res->start + 1; ++ ++ fb = ioremap_writecombine(fb_res->start, fb_len); ++ if (fb) { ++ memset(fb, 0, fb_len); ++ iounmap(fb, fb_len); ++ } ++ } ++#endif ++ + 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) + at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */ + at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */ + ++#ifdef CONFIG_FB_INTSRAM ++ { ++ void __iomem *fb; ++ struct resource *fb_res = &lcdc_resources[2]; ++ size_t fb_len = fb_res->end - fb_res->start + 1; ++ ++ fb = ioremap_writecombine(fb_res->start, fb_len); ++ if (fb) { ++ memset(fb, 0, fb_len); ++ iounmap(fb, fb_len); ++ } ++ } ++#endif ++ + 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) + + /* Driver datas */ + static struct atmel_lcdfb_info __initdata ek_lcdc_data = { ++ .lcdcon_is_backlight = true, + .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) + + /* Driver datas */ + static struct atmel_lcdfb_info __initdata ek_lcdc_data = { ++ .lcdcon_is_backlight = true, + .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 + ++config ARCH_SUPPORTS_OPROFILE ++ def_bool y ++ + 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 DW_DMAC ++ tristate "Synopsys DesignWare DMA Controller support" ++ default y if CPU_AT32AP7000 ++ + # FPU emulation goes here + + source "kernel/Kconfig.hz" +@@ -219,6 +243,8 @@ source "drivers/Kconfig" + + source "fs/Kconfig" + ++source "kernel/Kconfig.instrumentation" ++ + 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 @@ -0,0 +1,12 @@ +# NGW100 customization + @@ -14,31 +424,20 @@ diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atngw100/Kconfig linux-avr32. + + Choose 'Y' here if you're having i2c-related problems and + want to rule out the i2c bus driver. -diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atngw100/setup.c linux-avr32.git/arch/avr32/boards/atngw100/setup.c ---- linux-2.6.22.1/arch/avr32/boards/atngw100/setup.c 2007-07-10 20:56:30.000000000 +0200 -+++ linux-avr32.git/arch/avr32/boards/atngw100/setup.c 2007-07-13 11:24:16.000000000 +0200 -@@ -9,10 +9,12 @@ - */ - #include - #include -+#include - #include - #include - #include - #include -+#include - #include - +diff --git a/arch/avr32/boards/atngw100/setup.c b/arch/avr32/boards/atngw100/setup.c +index 52987c8..383b825 100644 +--- a/arch/avr32/boards/atngw100/setup.c ++++ b/arch/avr32/boards/atngw100/setup.c +@@ -20,7 +20,7 @@ #include -@@ -21,6 +23,7 @@ - #include + #include + +-#include ++#include #include #include -+#include - - /* Initialized by bootloader-specific startup code. */ - struct tag *bootloader_tags __initdata; -@@ -39,6 +42,11 @@ + #include +@@ -42,6 +42,11 @@ static struct spi_board_info spi0_board_info[] __initdata = { }, }; @@ -50,407 +449,1078 @@ diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atngw100/setup.c linux-avr32. /* * The next two functions should go away as the boot loader is * supposed to initialize the macb address registers with a valid -@@ -100,8 +108,46 @@ - at32_setup_serial_console(0); - } +@@ -124,6 +129,7 @@ static struct platform_device ngw_gpio_leds = { + } + }; -+static const struct gpio_led ngw_leds[] = { -+ { .name = "sys", .gpio = GPIO_PIN_PA(16), .active_low = 1, -+ .default_trigger = "heartbeat", -+ }, -+ { .name = "a", .gpio = GPIO_PIN_PA(19), .active_low = 1, }, -+ { .name = "b", .gpio = GPIO_PIN_PE(19), .active_low = 1, }, -+}; -+ -+static const struct gpio_led_platform_data ngw_led_data = { -+ .num_leds = ARRAY_SIZE(ngw_leds), -+ .leds = (void *) ngw_leds, -+}; -+ -+static struct platform_device ngw_gpio_leds = { -+ .name = "leds-gpio", -+ .id = -1, -+ .dev = { -+ .platform_data = (void *) &ngw_led_data, -+ } -+}; -+ +#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO -+static struct i2c_gpio_platform_data i2c_gpio_data = { -+ .sda_pin = GPIO_PIN_PA(6), -+ .scl_pin = GPIO_PIN_PA(7), -+}; -+ -+static struct platform_device i2c_gpio_device = { -+ .name = "i2c-gpio", -+ .id = 0, -+ .dev = { -+ .platform_data = &i2c_gpio_data, -+ }, -+}; + static struct i2c_gpio_platform_data i2c_gpio_data = { + .sda_pin = GPIO_PIN_PA(6), + .scl_pin = GPIO_PIN_PA(7), +@@ -139,6 +145,7 @@ static struct platform_device i2c_gpio_device = { + .platform_data = &i2c_gpio_data, + }, + }; +#endif -+ + static int __init atngw100_init(void) { -+ unsigned i; -+ - /* - * ATNGW100 uses 16-bit SDRAM interface, so we don't need to - * reserve any pins for it. -@@ -115,6 +161,22 @@ +@@ -157,6 +164,7 @@ static int __init atngw100_init(void) set_hw_addr(at32_add_device_eth(1, ð_data[1])); at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); + at32_add_device_mci(0, &mci0_data); -+ at32_add_device_usba(0, NULL); -+ -+ for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) { -+ at32_select_gpio(ngw_leds[i].gpio, -+ AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); -+ } -+ platform_device_register(&ngw_gpio_leds); -+ + at32_add_device_usba(0, NULL); + + for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) { +@@ -165,11 +173,15 @@ static int __init atngw100_init(void) + } + platform_device_register(&ngw_gpio_leds); + +#ifdef CONFIG_BOARD_ATNGW100_I2C_GPIO -+ at32_select_gpio(i2c_gpio_data.sda_pin, 0); -+ at32_select_gpio(i2c_gpio_data.scl_pin, 0); -+ platform_device_register(&i2c_gpio_device); + at32_select_gpio(i2c_gpio_data.sda_pin, + AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); + at32_select_gpio(i2c_gpio_data.scl_pin, + AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); + platform_device_register(&i2c_gpio_device); +#else + at32_add_device_twi(0); +#endif return 0; } -diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atstk1000/atstk1002.c linux-avr32.git/arch/avr32/boards/atstk1000/atstk1002.c ---- linux-2.6.22.1/arch/avr32/boards/atstk1000/atstk1002.c 2007-07-10 20:56:30.000000000 +0200 -+++ linux-avr32.git/arch/avr32/boards/atstk1000/atstk1002.c 2007-07-12 13:59:49.000000000 +0200 -@@ -11,6 +11,7 @@ +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 +@@ -12,4 +12,6 @@ + + extern struct atmel_lcdfb_info atstk1000_lcdc_data; + ++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 +@@ -11,7 +11,6 @@ #include #include #include -+#include +-#include #include #include #include -@@ -27,7 +28,6 @@ - - #include "atstk1000.h" +@@ -22,7 +21,7 @@ --#define SW2_DEFAULT /* MMCI and UART_A available */ + #include + #include +-#include ++#include + #include + #include + #include +@@ -49,18 +48,16 @@ static struct eth_platform_data __initdata eth_data[2] = { + }, + }; - struct eth_addr { - u8 addr[6]; -@@ -36,6 +36,7 @@ - static struct eth_addr __initdata hw_addr[2]; - static struct eth_platform_data __initdata eth_data[2]; +-#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM +-#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM ++#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC + static struct at73c213_board_info at73c213_data = { + .ssc_id = 0, + .shortname = "AVR32 STK1000 external DAC", + }; + #endif +-#endif -+#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM +-#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM ++#ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM static struct spi_board_info spi0_board_info[] __initdata = { +-#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM ++#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC { - /* QVGA display */ -@@ -45,6 +46,18 @@ - .mode = SPI_MODE_3, - }, + /* AT73C213 */ + .modalias = "at73c213", +@@ -80,12 +77,25 @@ static struct spi_board_info spi0_board_info[] __initdata = { }; -+#endif -+ -+#ifdef CONFIG_BOARD_ATSTK1002_SPI1 -+static struct spi_board_info spi1_board_info[] __initdata = { { -+ /* patch in custom entries here */ -+} }; -+#endif -+ -+static struct mci_platform_data __initdata mci0_data = { + #endif + +-#ifdef CONFIG_BOARD_ATSTK1002_SPI1 ++#ifdef CONFIG_BOARD_ATSTK100X_SPI1 + static struct spi_board_info spi1_board_info[] __initdata = { { + /* patch in custom entries here */ + } }; + #endif + ++static struct cf_platform_data __initdata cf0_data = { ++#ifdef CONFIG_BOARD_ATSTK1000_CF_HACKS ++ .detect_pin = CONFIG_BOARD_ATSTK1000_CF_DETECT_PIN, ++ .reset_pin = CONFIG_BOARD_ATSTK1000_CF_RESET_PIN, ++#else + .detect_pin = GPIO_PIN_NONE, -+ .wp_pin = GPIO_PIN_NONE, ++ .reset_pin = GPIO_PIN_NONE, ++#endif ++ .vcc_pin = GPIO_PIN_NONE, ++ .ready_pin = GPIO_PIN_PB(27), ++ .cs = 4, +}; - ++ /* * The next two functions should go away as the boot loader is -@@ -101,12 +114,71 @@ + * supposed to initialize the macb address registers with a valid +@@ -141,68 +151,8 @@ static void __init set_hw_addr(struct platform_device *pdev) clk_put(pclk); } --void __init setup_board(void) -+#ifdef CONFIG_BOARD_ATSTK1002_J2_LED -+ -+static struct gpio_led stk_j2_led[] = { -+#ifdef CONFIG_BOARD_ATSTK1002_J2_LED8 -+#define LEDSTRING "J2 jumpered to LED8" -+ { .name = "led0:amber", .gpio = GPIO_PIN_PB( 8), }, -+ { .name = "led1:amber", .gpio = GPIO_PIN_PB( 9), }, -+ { .name = "led2:amber", .gpio = GPIO_PIN_PB(10), }, -+ { .name = "led3:amber", .gpio = GPIO_PIN_PB(13), }, -+ { .name = "led4:amber", .gpio = GPIO_PIN_PB(14), }, -+ { .name = "led5:amber", .gpio = GPIO_PIN_PB(15), }, -+ { .name = "led6:amber", .gpio = GPIO_PIN_PB(16), }, -+ { .name = "led7:amber", .gpio = GPIO_PIN_PB(30), -+ .default_trigger = "heartbeat", }, -+#else /* RGB */ -+#define LEDSTRING "J2 jumpered to RGB LEDs" -+ { .name = "r1:red", .gpio = GPIO_PIN_PB( 8), }, -+ { .name = "g1:green", .gpio = GPIO_PIN_PB(10), }, -+ { .name = "b1:blue", .gpio = GPIO_PIN_PB(14), }, -+ -+ { .name = "r2:red", .gpio = GPIO_PIN_PB( 9), -+ .default_trigger = "heartbeat", }, -+ { .name = "g2:green", .gpio = GPIO_PIN_PB(13), }, -+ { .name = "b2:blue", .gpio = GPIO_PIN_PB(15), -+ .default_trigger = "heartbeat", }, -+ /* PB16, PB30 unused */ -+#endif -+}; -+ -+static struct gpio_led_platform_data stk_j2_led_data = { -+ .num_leds = ARRAY_SIZE(stk_j2_led), -+ .leds = stk_j2_led, -+}; -+ -+static struct platform_device stk_j2_led_dev = { -+ .name = "leds-gpio", -+ .id = 2, /* gpio block J2 */ -+ .dev = { -+ .platform_data = &stk_j2_led_data, -+ }, -+}; -+ -+static void setup_j2_leds(void) +-#ifdef CONFIG_BOARD_ATSTK1002_J2_LED +- +-static struct gpio_led stk_j2_led[] = { +-#ifdef CONFIG_BOARD_ATSTK1002_J2_LED8 +-#define LEDSTRING "J2 jumpered to LED8" +- { .name = "led0:amber", .gpio = GPIO_PIN_PB( 8), }, +- { .name = "led1:amber", .gpio = GPIO_PIN_PB( 9), }, +- { .name = "led2:amber", .gpio = GPIO_PIN_PB(10), }, +- { .name = "led3:amber", .gpio = GPIO_PIN_PB(13), }, +- { .name = "led4:amber", .gpio = GPIO_PIN_PB(14), }, +- { .name = "led5:amber", .gpio = GPIO_PIN_PB(15), }, +- { .name = "led6:amber", .gpio = GPIO_PIN_PB(16), }, +- { .name = "led7:amber", .gpio = GPIO_PIN_PB(30), +- .default_trigger = "heartbeat", }, +-#else /* RGB */ +-#define LEDSTRING "J2 jumpered to RGB LEDs" +- { .name = "r1:red", .gpio = GPIO_PIN_PB( 8), }, +- { .name = "g1:green", .gpio = GPIO_PIN_PB(10), }, +- { .name = "b1:blue", .gpio = GPIO_PIN_PB(14), }, +- +- { .name = "r2:red", .gpio = GPIO_PIN_PB( 9), +- .default_trigger = "heartbeat", }, +- { .name = "g2:green", .gpio = GPIO_PIN_PB(13), }, +- { .name = "b2:blue", .gpio = GPIO_PIN_PB(15), +- .default_trigger = "heartbeat", }, +- /* PB16, PB30 unused */ +-#endif +-}; +- +-static struct gpio_led_platform_data stk_j2_led_data = { +- .num_leds = ARRAY_SIZE(stk_j2_led), +- .leds = stk_j2_led, +-}; +- +-static struct platform_device stk_j2_led_dev = { +- .name = "leds-gpio", +- .id = 2, /* gpio block J2 */ +- .dev = { +- .platform_data = &stk_j2_led_data, +- }, +-}; +- +-static void setup_j2_leds(void) +-{ +- unsigned i; +- +- for (i = 0; i < ARRAY_SIZE(stk_j2_led); i++) +- at32_select_gpio(stk_j2_led[i].gpio, AT32_GPIOF_OUTPUT); +- +- printk("STK1002: " LEDSTRING "\n"); +- platform_device_register(&stk_j2_led_dev); +-} +- +-#else +-static void setup_j2_leds(void) +-{ +-} +-#endif +- +-#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM +-#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM +-static void __init at73c213_set_clk(struct at73c213_board_info *info) ++#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC ++static void __init atstk1002_setup_extdac(void) { --#ifdef SW2_DEFAULT -- at32_map_usart(1, 0); /* USART 1/A: /dev/ttyS0, DB9 */ -+ unsigned i; -+ -+ for (i = 0; i < ARRAY_SIZE(stk_j2_led); i++) -+ at32_select_gpio(stk_j2_led[i].gpio, AT32_GPIOF_OUTPUT); -+ -+ printk("STK1002: " LEDSTRING "\n"); -+ platform_device_register(&stk_j2_led_dev); -+} -+ - #else -+static void setup_j2_leds(void) + struct clk *gclk; + struct clk *pll; +@@ -220,7 +170,7 @@ static void __init at73c213_set_clk(struct at73c213_board_info *info) + } + + at32_select_periph(GPIO_PIN_PA(30), GPIO_PERIPH_A, 0); +- info->dac_clk = gclk; ++ at73c213_data.dac_clk = gclk; + + err_set_clk: + clk_put(pll); +@@ -229,12 +179,16 @@ err_pll: + err_gclk: + return; + } +-#endif +-#endif ++#else ++static void __init atstk1002_setup_extdac(void) +{ -+} -+#endif + -+void __init setup_board(void) -+{ -+#ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM - at32_map_usart(0, 1); /* USART 0/B: /dev/ttyS1, IRDA */ -+#else -+ at32_map_usart(1, 0); /* USART 1/A: /dev/ttyS0, DB9 */ - #endif - /* USART 2/unused: expansion connector */ - at32_map_usart(3, 2); /* USART 3/C: /dev/ttyS2, DB9 */ -@@ -140,18 +212,40 @@ ++} ++#endif /* CONFIG_BOARD_ATSTK1000_EXTDAC */ + + void __init setup_board(void) + { +-#ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM ++#ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM + at32_map_usart(0, 1); /* USART 0/B: /dev/ttyS1, IRDA */ + #else + at32_map_usart(1, 0); /* USART 1/A: /dev/ttyS0, DB9 */ +@@ -271,7 +225,7 @@ static int __init atstk1002_init(void) at32_add_system_devices(); --#ifdef SW2_DEFAULT -- at32_add_device_usart(0); --#else -+#ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM +-#ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM ++#ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM at32_add_device_usart(1); + #else + at32_add_device_usart(0); +@@ -281,12 +235,16 @@ static int __init atstk1002_init(void) + #ifndef CONFIG_BOARD_ATSTK1002_SW6_CUSTOM + set_hw_addr(at32_add_device_eth(0, ð_data[0])); + #endif +-#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM ++#ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM + at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); + #endif +-#ifdef CONFIG_BOARD_ATSTK1002_SPI1 ++#ifdef CONFIG_BOARD_ATSTK100X_SPI1 + at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); + #endif ++ at32_add_device_twi(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) + fbmem_start, fbmem_size); + #endif + at32_add_device_usba(0, NULL); +-#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM ++#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_AC97 ++ at32_add_device_ac97c(0); +#else -+ at32_add_device_usart(0); ++ at32_add_device_abdac(0); ++#endif ++#ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM + at32_add_device_ssc(0, ATMEL_SSC_TX); #endif - at32_add_device_usart(2); ++ at32_add_device_cf(0, 2, &cf0_data); -+#ifndef CONFIG_BOARD_ATSTK1002_SW6_CUSTOM - set_hw_addr(at32_add_device_eth(0, ð_data[0])); +- setup_j2_leds(); - -- at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); +-#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM +-#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM +- at73c213_set_clk(&at73c213_data); +-#endif +-#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 @@ ++/* ++ * ATSTK1003 daughterboard-specific init code ++ * ++ * 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. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include "atstk1000.h" ++ ++#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC ++static struct at73c213_board_info at73c213_data = { ++ .ssc_id = 0, ++ .shortname = "AVR32 STK1000 external DAC", ++}; ++#endif ++ ++#ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM ++static struct spi_board_info spi0_board_info[] __initdata = { ++#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC ++ { ++ /* AT73C213 */ ++ .modalias = "at73c213", ++ .max_speed_hz = 200000, ++ .chip_select = 0, ++ .mode = SPI_MODE_1, ++ .platform_data = &at73c213_data, ++ }, ++#endif ++ /* ++ * We can control the LTV350QV LCD panel, but it isn't much ++ * point since we don't have an LCD controller... ++ */ ++}; ++#endif ++ ++#ifdef CONFIG_BOARD_ATSTK100X_SPI1 ++static struct spi_board_info spi1_board_info[] __initdata = { { ++ /* patch in custom entries here */ ++} }; +#endif -+#ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM -+ set_hw_addr(at32_add_device_eth(1, ð_data[1])); ++ ++static struct cf_platform_data __initdata cf0_data = { ++#ifdef CONFIG_BOARD_ATSTK1000_CF_HACKS ++ .detect_pin = CONFIG_BOARD_ATSTK1000_CF_DETECT_PIN, ++ .reset_pin = CONFIG_BOARD_ATSTK1000_CF_RESET_PIN, +#else - at32_add_device_lcdc(0, &atstk1000_lcdc_data, - fbmem_start, fbmem_size); ++ .detect_pin = GPIO_PIN_NONE, ++ .reset_pin = GPIO_PIN_NONE, ++#endif ++ .vcc_pin = GPIO_PIN_NONE, ++ .ready_pin = GPIO_PIN_PB(27), ++ .cs = 4, ++}; ++ ++#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC ++static void __init atstk1003_setup_extdac(void) ++{ ++ struct clk *gclk; ++ struct clk *pll; ++ ++ gclk = clk_get(NULL, "gclk0"); ++ if (IS_ERR(gclk)) ++ goto err_gclk; ++ pll = clk_get(NULL, "pll0"); ++ if (IS_ERR(pll)) ++ goto err_pll; ++ ++ if (clk_set_parent(gclk, pll)) { ++ pr_debug("STK1000: failed to set pll0 as parent for DAC clock\n"); ++ goto err_set_clk; ++ } ++ ++ at32_select_periph(GPIO_PIN_PA(30), GPIO_PERIPH_A, 0); ++ at73c213_data.dac_clk = gclk; ++ ++err_set_clk: ++ clk_put(pll); ++err_pll: ++ clk_put(gclk); ++err_gclk: ++ return; ++} ++#else ++static void __init atstk1003_setup_extdac(void) ++{ ++ ++} ++#endif /* CONFIG_BOARD_ATSTK1000_EXTDAC */ ++ ++void __init setup_board(void) ++{ ++#ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM ++ at32_map_usart(0, 1); /* USART 0/B: /dev/ttyS1, IRDA */ ++#else ++ at32_map_usart(1, 0); /* USART 1/A: /dev/ttyS0, DB9 */ ++#endif ++ /* USART 2/unused: expansion connector */ ++ at32_map_usart(3, 2); /* USART 3/C: /dev/ttyS2, DB9 */ ++ ++ at32_setup_serial_console(0); ++} ++ ++static int __init atstk1003_init(void) ++{ ++ /* ++ * ATSTK1000 uses 32-bit SDRAM interface. Reserve the ++ * SDRAM-specific pins so that nobody messes with them. ++ */ ++ at32_reserve_pin(GPIO_PIN_PE(0)); /* DATA[16] */ ++ at32_reserve_pin(GPIO_PIN_PE(1)); /* DATA[17] */ ++ at32_reserve_pin(GPIO_PIN_PE(2)); /* DATA[18] */ ++ at32_reserve_pin(GPIO_PIN_PE(3)); /* DATA[19] */ ++ at32_reserve_pin(GPIO_PIN_PE(4)); /* DATA[20] */ ++ at32_reserve_pin(GPIO_PIN_PE(5)); /* DATA[21] */ ++ at32_reserve_pin(GPIO_PIN_PE(6)); /* DATA[22] */ ++ at32_reserve_pin(GPIO_PIN_PE(7)); /* DATA[23] */ ++ at32_reserve_pin(GPIO_PIN_PE(8)); /* DATA[24] */ ++ at32_reserve_pin(GPIO_PIN_PE(9)); /* DATA[25] */ ++ at32_reserve_pin(GPIO_PIN_PE(10)); /* DATA[26] */ ++ at32_reserve_pin(GPIO_PIN_PE(11)); /* DATA[27] */ ++ at32_reserve_pin(GPIO_PIN_PE(12)); /* DATA[28] */ ++ at32_reserve_pin(GPIO_PIN_PE(13)); /* DATA[29] */ ++ at32_reserve_pin(GPIO_PIN_PE(14)); /* DATA[30] */ ++ at32_reserve_pin(GPIO_PIN_PE(15)); /* DATA[31] */ ++ at32_reserve_pin(GPIO_PIN_PE(26)); /* SDCS */ ++ ++ at32_add_system_devices(); ++ ++#ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM ++ at32_add_device_usart(1); ++#else ++ at32_add_device_usart(0); +#endif ++ at32_add_device_usart(2); + -+#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM ++#ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM + at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); +#endif -+#ifdef CONFIG_BOARD_ATSTK1002_SPI1 ++#ifdef CONFIG_BOARD_ATSTK100X_SPI1 + at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); +#endif -+ at32_add_device_twi(0); -+#ifndef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM -+ at32_add_device_mci(0, &mci0_data); ++#ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM ++ at32_add_device_mci(0, NULL); +#endif + at32_add_device_usba(0, NULL); ++#ifdef CONFIG_BOARD_ATSTK100X_ENABLE_AC97 ++ at32_add_device_ac97c(0); ++#else + at32_add_device_abdac(0); -+#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM ++#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(); - - return 0; - } -diff -x .git -Nur linux-2.6.22.1/arch/avr32/boards/atstk1000/Kconfig linux-avr32.git/arch/avr32/boards/atstk1000/Kconfig ---- linux-2.6.22.1/arch/avr32/boards/atstk1000/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-avr32.git/arch/avr32/boards/atstk1000/Kconfig 2007-07-12 13:59:49.000000000 +0200 -@@ -0,0 +1,79 @@ -+# STK1000 customization ++ atstk1000_setup_j2_leds(); ++ atstk1003_setup_extdac(); ++ ++ 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 @@ ++/* ++ * ATSTK1003 daughterboard-specific init code ++ * ++ * 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. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include + -+if BOARD_ATSTK1002 ++#include ++#include + -+config BOARD_ATSTK1002_CUSTOM -+ bool "Non-default STK-1002 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. ++#include