Commit 78693e47 authored by Haavard Skinnemoen's avatar Haavard Skinnemoen

[AVR32] Add support for ATSTK1003 and ATSTK1004

ATSTK1003 and ATSTK1004 are CPU daughterboards for ATSTK1000 featuring
the AT32AP7001 and AT32AP7002 CPUs, respectively.
Signed-off-by: default avatarHaavard Skinnemoen <hskinnemoen@atmel.com>
parent 64d81052
...@@ -110,6 +110,10 @@ endchoice ...@@ -110,6 +110,10 @@ endchoice
# CPU Daughterboards for ATSTK1000 # CPU Daughterboards for ATSTK1000
config BOARD_ATSTK1002 config BOARD_ATSTK1002
bool bool
config BOARD_ATSTK1003
bool
config BOARD_ATSTK1004
bool
choice choice
prompt "AVR32 board type" prompt "AVR32 board type"
...@@ -118,6 +122,8 @@ choice ...@@ -118,6 +122,8 @@ choice
config BOARD_ATSTK1000 config BOARD_ATSTK1000
bool "ATSTK1000 evaluation board" bool "ATSTK1000 evaluation board"
select BOARD_ATSTK1002 if CPU_AT32AP7000 select BOARD_ATSTK1002 if CPU_AT32AP7000
select BOARD_ATSTK1003 if CPU_AT32AP7001
select BOARD_ATSTK1004 if CPU_AT32AP7002
config BOARD_ATNGW100 config BOARD_ATNGW100
bool "ATNGW100 Network Gateway" bool "ATNGW100 Network Gateway"
......
# STK1000 customization # STK1000 customization
if BOARD_ATSTK1002 if BOARD_ATSTK1000
config BOARD_ATSTK1002_CUSTOM config BOARD_ATSTK100X_CUSTOM
bool "Non-default STK-1002 jumper settings" bool "Non-default STK1002/STK1003/STK1004 jumper settings"
help help
You will normally leave the jumpers on the CPU card at their You will normally leave the jumpers on the CPU card at their
default settings. If you need to use certain peripherals, default settings. If you need to use certain peripherals,
you will need to change some of those jumpers. 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)" bool "SW1: use SSC1 (not SPI0)"
help help
This also prevents using the external DAC as an audio interface, This also prevents using the external DAC as an audio interface,
and means you can't initialize the on-board QVGA display. 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)" bool "SW2: use IRDA or TIMER0 (not UART-A, MMC/SD, and PS2-A)"
help help
If you change this you'll want an updated boot loader putting If you change this you'll want an updated boot loader putting
the console on UART-C not UART-A. 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)" bool "SW3: use TIMER1 (not SSC0 and GCLK)"
help help
This also prevents using the external DAC as an audio interface. 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)" bool "SW4: use ISI/Camera (not GPIOs, SPI1, and PS2-B)"
help help
To use the camera interface you'll need a custom card (on the To use the camera interface you'll need a custom card (on the
...@@ -36,15 +36,17 @@ config BOARD_ATSTK1002_SW4_CUSTOM ...@@ -36,15 +36,17 @@ config BOARD_ATSTK1002_SW4_CUSTOM
config BOARD_ATSTK1002_SW5_CUSTOM config BOARD_ATSTK1002_SW5_CUSTOM
bool "SW5: use MACB1 (not LCDC)" bool "SW5: use MACB1 (not LCDC)"
depends on BOARD_ATSTK1002
config BOARD_ATSTK1002_SW6_CUSTOM config BOARD_ATSTK1002_SW6_CUSTOM
bool "SW6: more GPIOs (not MACB0)" bool "SW6: more GPIOs (not MACB0)"
depends on BOARD_ATSTK1002
endif # custom endif # custom
config BOARD_ATSTK1002_SPI1 config BOARD_ATSTK100X_SPI1
bool "Configure SPI1 controller" bool "Configure SPI1 controller"
depends on !BOARD_ATSTK1002_SW4_CUSTOM depends on !BOARD_ATSTK100X_SW4_CUSTOM
help help
All the signals for the second SPI controller are available on All the signals for the second SPI controller are available on
GPIO lines and accessed through the J1 jumper block. Say "y" GPIO lines and accessed through the J1 jumper block. Say "y"
...@@ -56,7 +58,7 @@ config BOARD_ATSTK1000_J2_LED ...@@ -56,7 +58,7 @@ config BOARD_ATSTK1000_J2_LED
choice choice
prompt "LEDs connected to J2:" prompt "LEDs connected to J2:"
depends on LEDS_GPIO && !BOARD_ATSTK1002_SW4_CUSTOM depends on LEDS_GPIO && !BOARD_ATSTK100X_SW4_CUSTOM
optional optional
help help
Select this if you have jumpered the J2 jumper block to the Select this if you have jumpered the J2 jumper block to the
...@@ -78,7 +80,7 @@ endchoice ...@@ -78,7 +80,7 @@ endchoice
config BOARD_ATSTK1000_EXTDAC config BOARD_ATSTK1000_EXTDAC
bool bool
depends on !BOARD_ATSTK1002_SW1_CUSTOM && !BOARD_ATSTK1002_SW3_CUSTOM depends on !BOARD_ATSTK100X_SW1_CUSTOM && !BOARD_ATSTK100X_SW3_CUSTOM
default y default y
endif # stk 1002 endif # stk 1000
obj-y += setup.o flash.o obj-y += setup.o flash.o
obj-$(CONFIG_BOARD_ATSTK1002) += atstk1002.o obj-$(CONFIG_BOARD_ATSTK1002) += atstk1002.o
obj-$(CONFIG_BOARD_ATSTK1003) += atstk1003.o
obj-$(CONFIG_BOARD_ATSTK1004) += atstk1004.o
...@@ -55,7 +55,7 @@ static struct at73c213_board_info at73c213_data = { ...@@ -55,7 +55,7 @@ static struct at73c213_board_info at73c213_data = {
}; };
#endif #endif
#ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM #ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM
static struct spi_board_info spi0_board_info[] __initdata = { static struct spi_board_info spi0_board_info[] __initdata = {
#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC #ifdef CONFIG_BOARD_ATSTK1000_EXTDAC
{ {
...@@ -77,7 +77,7 @@ static struct spi_board_info spi0_board_info[] __initdata = { ...@@ -77,7 +77,7 @@ static struct spi_board_info spi0_board_info[] __initdata = {
}; };
#endif #endif
#ifdef CONFIG_BOARD_ATSTK1002_SPI1 #ifdef CONFIG_BOARD_ATSTK100X_SPI1
static struct spi_board_info spi1_board_info[] __initdata = { { static struct spi_board_info spi1_board_info[] __initdata = { {
/* patch in custom entries here */ /* patch in custom entries here */
} }; } };
...@@ -175,7 +175,7 @@ static void __init atstk1002_setup_extdac(void) ...@@ -175,7 +175,7 @@ static void __init atstk1002_setup_extdac(void)
void __init setup_board(void) 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 */ at32_map_usart(0, 1); /* USART 0/B: /dev/ttyS1, IRDA */
#else #else
at32_map_usart(1, 0); /* USART 1/A: /dev/ttyS0, DB9 */ at32_map_usart(1, 0); /* USART 1/A: /dev/ttyS0, DB9 */
...@@ -212,7 +212,7 @@ static int __init atstk1002_init(void) ...@@ -212,7 +212,7 @@ static int __init atstk1002_init(void)
at32_add_system_devices(); at32_add_system_devices();
#ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM #ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
at32_add_device_usart(1); at32_add_device_usart(1);
#else #else
at32_add_device_usart(0); at32_add_device_usart(0);
...@@ -222,10 +222,10 @@ static int __init atstk1002_init(void) ...@@ -222,10 +222,10 @@ static int __init atstk1002_init(void)
#ifndef CONFIG_BOARD_ATSTK1002_SW6_CUSTOM #ifndef CONFIG_BOARD_ATSTK1002_SW6_CUSTOM
set_hw_addr(at32_add_device_eth(0, &eth_data[0])); set_hw_addr(at32_add_device_eth(0, &eth_data[0]));
#endif #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)); at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
#endif #endif
#ifdef CONFIG_BOARD_ATSTK1002_SPI1 #ifdef CONFIG_BOARD_ATSTK100X_SPI1
at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
#endif #endif
#ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM #ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM
...@@ -235,7 +235,7 @@ static int __init atstk1002_init(void) ...@@ -235,7 +235,7 @@ static int __init atstk1002_init(void)
fbmem_start, fbmem_size); fbmem_start, fbmem_size);
#endif #endif
at32_add_device_usba(0, NULL); at32_add_device_usba(0, NULL);
#ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM #ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM
at32_add_device_ssc(0, ATMEL_SSC_TX); at32_add_device_ssc(0, ATMEL_SSC_TX);
#endif #endif
......
/*
* 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 <linux/clk.h>
#include <linux/err.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/spi/at73c213.h>
#include <linux/spi/spi.h>
#include <asm/setup.h>
#include <asm/arch/at32ap700x.h>
#include <asm/arch/board.h>
#include <asm/arch/init.h>
#include <asm/arch/portmux.h>
#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_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_ATSTK100X_SW1_CUSTOM
at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
#endif
#ifdef CONFIG_BOARD_ATSTK100X_SPI1
at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
#endif
#ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
at32_add_device_mci(0);
#endif
at32_add_device_usba(0, NULL);
#ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM
at32_add_device_ssc(0, ATMEL_SSC_TX);
#endif
atstk1000_setup_j2_leds();
atstk1003_setup_extdac();
return 0;
}
postcore_initcall(atstk1003_init);
/*
* 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 <linux/clk.h>
#include <linux/err.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/spi/at73c213.h>
#include <linux/spi/spi.h>
#include <video/atmel_lcdc.h>
#include <asm/setup.h>
#include <asm/arch/at32ap700x.h>
#include <asm/arch/board.h>
#include <asm/arch/init.h>
#include <asm/arch/portmux.h>
#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
{
/* QVGA display */
.modalias = "ltv350qv",
.max_speed_hz = 16000000,
.chip_select = 1,
.mode = SPI_MODE_3,
},
};
#endif
#ifdef CONFIG_BOARD_ATSTK100X_SPI1
static struct spi_board_info spi1_board_info[] __initdata = { {
/* patch in custom entries here */
} };
#endif
#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC
static void __init atstk1004_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 atstk1004_setup_extdac(void)
{
}
#endif /* CONFIG_BOARD_ATSTK1000_EXTDAC */
void __init setup_board(void)
{
#ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
at32_map_usart(0, 1); /* USART 0/B: /dev/ttyS1, IRDA */
#else
at32_map_usart(1, 0); /* USART 1/A: /dev/ttyS0, DB9 */
#endif
/* USART 2/unused: expansion connector */
at32_map_usart(3, 2); /* USART 3/C: /dev/ttyS2, DB9 */
at32_setup_serial_console(0);
}
static int __init atstk1004_init(void)
{
at32_add_system_devices();
#ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
at32_add_device_usart(1);
#else
at32_add_device_usart(0);
#endif
at32_add_device_usart(2);
#ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM
at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
#endif
#ifdef CONFIG_BOARD_ATSTK100X_SPI1
at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
#endif
#ifndef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM
at32_add_device_mci(0);
#endif
at32_add_device_lcdc(0, &atstk1000_lcdc_data,
fbmem_start, fbmem_size);
at32_add_device_usba(0, NULL);
#ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM
at32_add_device_ssc(0, ATMEL_SSC_TX);
#endif
atstk1000_setup_j2_leds();
atstk1004_setup_extdac();
return 0;
}
postcore_initcall(atstk1004_init);
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment