2 * ATSTK1002 daughterboard-specific init code
4 * Copyright (C) 2005-2006 Atmel Corporation
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 #include <linux/clk.h>
11 #include <linux/etherdevice.h>
12 #include <linux/init.h>
13 #include <linux/kernel.h>
14 #include <linux/leds.h>
15 #include <linux/platform_device.h>
16 #include <linux/string.h>
17 #include <linux/types.h>
18 #include <linux/spi/spi.h>
19 #include <linux/spi/at73c213.h>
21 #include <video/atmel_lcdc.h>
24 #include <asm/setup.h>
25 #include <asm/arch/at32ap7000.h>
26 #include <asm/arch/board.h>
27 #include <asm/arch/init.h>
28 #include <asm/arch/portmux.h>
30 #include "atstk1000.h"
37 static struct eth_addr __initdata hw_addr
[2];
38 static struct eth_platform_data __initdata eth_data
[2] = {
41 * The MDIO pullups on STK1000 are a bit too weak for
42 * the autodetection to work properly, so we have to
43 * mask out everything but the correct address.
45 .phy_mask
= ~(1U << 16),
48 .phy_mask
= ~(1U << 17),
52 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
53 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
54 static struct at73c213_board_info at73c213_data
= {
56 .shortname
= "AVR32 STK1000 external DAC",
61 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
62 static struct spi_board_info spi0_board_info
[] __initdata
= {
63 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
66 .modalias
= "at73c213",
67 .max_speed_hz
= 200000,
70 .platform_data
= &at73c213_data
,
75 .modalias
= "ltv350qv",
76 .max_speed_hz
= 16000000,
83 #ifdef CONFIG_BOARD_ATSTK1002_SPI1
84 static struct spi_board_info spi1_board_info
[] __initdata
= { {
85 /* patch in custom entries here */
90 * The next two functions should go away as the boot loader is
91 * supposed to initialize the macb address registers with a valid
92 * ethernet address. But we need to keep it around for a while until
93 * we can be reasonably sure the boot loader does this.
95 * The phy_id is ignored as the driver will probe for it.
97 static int __init
parse_tag_ethernet(struct tag
*tag
)
101 i
= tag
->u
.ethernet
.mac_index
;
102 if (i
< ARRAY_SIZE(hw_addr
))
103 memcpy(hw_addr
[i
].addr
, tag
->u
.ethernet
.hw_address
,
104 sizeof(hw_addr
[i
].addr
));
108 __tagtable(ATAG_ETHERNET
, parse_tag_ethernet
);
110 static void __init
set_hw_addr(struct platform_device
*pdev
)
112 struct resource
*res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
119 if (pdev
->id
>= ARRAY_SIZE(hw_addr
))
122 addr
= hw_addr
[pdev
->id
].addr
;
123 if (!is_valid_ether_addr(addr
))
127 * Since this is board-specific code, we'll cheat and use the
128 * physical address directly as we happen to know that it's
129 * the same as the virtual address.
131 regs
= (void __iomem __force
*)res
->start
;
132 pclk
= clk_get(&pdev
->dev
, "pclk");
137 __raw_writel((addr
[3] << 24) | (addr
[2] << 16)
138 | (addr
[1] << 8) | addr
[0], regs
+ 0x98);
139 __raw_writel((addr
[5] << 8) | addr
[4], regs
+ 0x9c);
144 #ifdef CONFIG_BOARD_ATSTK1002_J2_LED
146 static struct gpio_led stk_j2_led
[] = {
147 #ifdef CONFIG_BOARD_ATSTK1002_J2_LED8
148 #define LEDSTRING "J2 jumpered to LED8"
149 { .name
= "led0:amber", .gpio
= GPIO_PIN_PB( 8), },
150 { .name
= "led1:amber", .gpio
= GPIO_PIN_PB( 9), },
151 { .name
= "led2:amber", .gpio
= GPIO_PIN_PB(10), },
152 { .name
= "led3:amber", .gpio
= GPIO_PIN_PB(13), },
153 { .name
= "led4:amber", .gpio
= GPIO_PIN_PB(14), },
154 { .name
= "led5:amber", .gpio
= GPIO_PIN_PB(15), },
155 { .name
= "led6:amber", .gpio
= GPIO_PIN_PB(16), },
156 { .name
= "led7:amber", .gpio
= GPIO_PIN_PB(30),
157 .default_trigger
= "heartbeat", },
159 #define LEDSTRING "J2 jumpered to RGB LEDs"
160 { .name
= "r1:red", .gpio
= GPIO_PIN_PB( 8), },
161 { .name
= "g1:green", .gpio
= GPIO_PIN_PB(10), },
162 { .name
= "b1:blue", .gpio
= GPIO_PIN_PB(14), },
164 { .name
= "r2:red", .gpio
= GPIO_PIN_PB( 9),
165 .default_trigger
= "heartbeat", },
166 { .name
= "g2:green", .gpio
= GPIO_PIN_PB(13), },
167 { .name
= "b2:blue", .gpio
= GPIO_PIN_PB(15),
168 .default_trigger
= "heartbeat", },
169 /* PB16, PB30 unused */
173 static struct gpio_led_platform_data stk_j2_led_data
= {
174 .num_leds
= ARRAY_SIZE(stk_j2_led
),
178 static struct platform_device stk_j2_led_dev
= {
180 .id
= 2, /* gpio block J2 */
182 .platform_data
= &stk_j2_led_data
,
186 static void setup_j2_leds(void)
190 for (i
= 0; i
< ARRAY_SIZE(stk_j2_led
); i
++)
191 at32_select_gpio(stk_j2_led
[i
].gpio
, AT32_GPIOF_OUTPUT
);
193 printk("STK1002: " LEDSTRING
"\n");
194 platform_device_register(&stk_j2_led_dev
);
198 static void setup_j2_leds(void)
203 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
204 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
205 static void __init
at73c213_set_clk(struct at73c213_board_info
*info
)
210 gclk
= clk_get(NULL
, "gclk0");
213 pll
= clk_get(NULL
, "pll0");
217 if (clk_set_parent(gclk
, pll
)) {
218 pr_debug("STK1000: failed to set pll0 as parent for DAC clock\n");
222 at32_select_periph(GPIO_PIN_PA(30), GPIO_PERIPH_A
, 0);
223 info
->dac_clk
= gclk
;
235 void __init
setup_board(void)
237 #ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM
238 at32_map_usart(0, 1); /* USART 0/B: /dev/ttyS1, IRDA */
240 at32_map_usart(1, 0); /* USART 1/A: /dev/ttyS0, DB9 */
242 /* USART 2/unused: expansion connector */
243 at32_map_usart(3, 2); /* USART 3/C: /dev/ttyS2, DB9 */
245 at32_setup_serial_console(0);
248 static int __init
atstk1002_init(void)
251 * ATSTK1000 uses 32-bit SDRAM interface. Reserve the
252 * SDRAM-specific pins so that nobody messes with them.
254 at32_reserve_pin(GPIO_PIN_PE(0)); /* DATA[16] */
255 at32_reserve_pin(GPIO_PIN_PE(1)); /* DATA[17] */
256 at32_reserve_pin(GPIO_PIN_PE(2)); /* DATA[18] */
257 at32_reserve_pin(GPIO_PIN_PE(3)); /* DATA[19] */
258 at32_reserve_pin(GPIO_PIN_PE(4)); /* DATA[20] */
259 at32_reserve_pin(GPIO_PIN_PE(5)); /* DATA[21] */
260 at32_reserve_pin(GPIO_PIN_PE(6)); /* DATA[22] */
261 at32_reserve_pin(GPIO_PIN_PE(7)); /* DATA[23] */
262 at32_reserve_pin(GPIO_PIN_PE(8)); /* DATA[24] */
263 at32_reserve_pin(GPIO_PIN_PE(9)); /* DATA[25] */
264 at32_reserve_pin(GPIO_PIN_PE(10)); /* DATA[26] */
265 at32_reserve_pin(GPIO_PIN_PE(11)); /* DATA[27] */
266 at32_reserve_pin(GPIO_PIN_PE(12)); /* DATA[28] */
267 at32_reserve_pin(GPIO_PIN_PE(13)); /* DATA[29] */
268 at32_reserve_pin(GPIO_PIN_PE(14)); /* DATA[30] */
269 at32_reserve_pin(GPIO_PIN_PE(15)); /* DATA[31] */
270 at32_reserve_pin(GPIO_PIN_PE(26)); /* SDCS */
272 at32_add_system_devices();
274 #ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM
275 at32_add_device_usart(1);
277 at32_add_device_usart(0);
279 at32_add_device_usart(2);
281 #ifndef CONFIG_BOARD_ATSTK1002_SW6_CUSTOM
282 set_hw_addr(at32_add_device_eth(0, ð_data
[0]));
284 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
285 at32_add_device_spi(0, spi0_board_info
, ARRAY_SIZE(spi0_board_info
));
287 #ifdef CONFIG_BOARD_ATSTK1002_SPI1
288 at32_add_device_spi(1, spi1_board_info
, ARRAY_SIZE(spi1_board_info
));
290 #ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM
291 set_hw_addr(at32_add_device_eth(1, ð_data
[1]));
293 at32_add_device_lcdc(0, &atstk1000_lcdc_data
,
294 fbmem_start
, fbmem_size
);
296 at32_add_device_usba(0, NULL
);
297 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
298 at32_add_device_ssc(0, ATMEL_SSC_TX
);
303 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
304 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
305 at73c213_set_clk(&at73c213_data
);
311 postcore_initcall(atstk1002_init
);