Pull cpuidle into release branch
[pandora-kernel.git] / arch / avr32 / boards / atstk1000 / atstk1002.c
1 /*
2  * ATSTK1002 daughterboard-specific init code
3  *
4  * Copyright (C) 2005-2006 Atmel Corporation
5  *
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.
9  */
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>
20
21 #include <video/atmel_lcdc.h>
22
23 #include <asm/io.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>
29
30 #include "atstk1000.h"
31
32
33 struct eth_addr {
34         u8 addr[6];
35 };
36
37 static struct eth_addr __initdata hw_addr[2];
38 static struct eth_platform_data __initdata eth_data[2] = {
39         {
40                 /*
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.
44                  */
45                 .phy_mask       = ~(1U << 16),
46         },
47         {
48                 .phy_mask       = ~(1U << 17),
49         },
50 };
51
52 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
53 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
54 static struct at73c213_board_info at73c213_data = {
55         .ssc_id         = 0,
56         .shortname      = "AVR32 STK1000 external DAC",
57 };
58 #endif
59 #endif
60
61 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
62 static struct spi_board_info spi0_board_info[] __initdata = {
63 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
64         {
65                 /* AT73C213 */
66                 .modalias       = "at73c213",
67                 .max_speed_hz   = 200000,
68                 .chip_select    = 0,
69                 .mode           = SPI_MODE_1,
70                 .platform_data  = &at73c213_data,
71         },
72 #endif
73         {
74                 /* QVGA display */
75                 .modalias       = "ltv350qv",
76                 .max_speed_hz   = 16000000,
77                 .chip_select    = 1,
78                 .mode           = SPI_MODE_3,
79         },
80 };
81 #endif
82
83 #ifdef CONFIG_BOARD_ATSTK1002_SPI1
84 static struct spi_board_info spi1_board_info[] __initdata = { {
85         /* patch in custom entries here */
86 } };
87 #endif
88
89 /*
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.
94  *
95  * The phy_id is ignored as the driver will probe for it.
96  */
97 static int __init parse_tag_ethernet(struct tag *tag)
98 {
99         int i;
100
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));
105
106         return 0;
107 }
108 __tagtable(ATAG_ETHERNET, parse_tag_ethernet);
109
110 static void __init set_hw_addr(struct platform_device *pdev)
111 {
112         struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
113         const u8 *addr;
114         void __iomem *regs;
115         struct clk *pclk;
116
117         if (!res)
118                 return;
119         if (pdev->id >= ARRAY_SIZE(hw_addr))
120                 return;
121
122         addr = hw_addr[pdev->id].addr;
123         if (!is_valid_ether_addr(addr))
124                 return;
125
126         /*
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.
130          */
131         regs = (void __iomem __force *)res->start;
132         pclk = clk_get(&pdev->dev, "pclk");
133         if (!pclk)
134                 return;
135
136         clk_enable(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);
140         clk_disable(pclk);
141         clk_put(pclk);
142 }
143
144 #ifdef CONFIG_BOARD_ATSTK1002_J2_LED
145
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", },
158 #else   /* RGB */
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), },
163
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 */
170 #endif
171 };
172
173 static struct gpio_led_platform_data stk_j2_led_data = {
174         .num_leds       = ARRAY_SIZE(stk_j2_led),
175         .leds           = stk_j2_led,
176 };
177
178 static struct platform_device stk_j2_led_dev = {
179         .name           = "leds-gpio",
180         .id             = 2,    /* gpio block J2 */
181         .dev            = {
182                 .platform_data  = &stk_j2_led_data,
183         },
184 };
185
186 static void setup_j2_leds(void)
187 {
188         unsigned        i;
189
190         for (i = 0; i < ARRAY_SIZE(stk_j2_led); i++)
191                 at32_select_gpio(stk_j2_led[i].gpio, AT32_GPIOF_OUTPUT);
192
193         printk("STK1002: " LEDSTRING "\n");
194         platform_device_register(&stk_j2_led_dev);
195 }
196
197 #else
198 static void setup_j2_leds(void)
199 {
200 }
201 #endif
202
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)
206 {
207         struct clk *gclk;
208         struct clk *pll;
209
210         gclk = clk_get(NULL, "gclk0");
211         if (IS_ERR(gclk))
212                 goto err_gclk;
213         pll = clk_get(NULL, "pll0");
214         if (IS_ERR(pll))
215                 goto err_pll;
216
217         if (clk_set_parent(gclk, pll)) {
218                 pr_debug("STK1000: failed to set pll0 as parent for DAC clock\n");
219                 goto err_set_clk;
220         }
221
222         at32_select_periph(GPIO_PIN_PA(30), GPIO_PERIPH_A, 0);
223         info->dac_clk = gclk;
224
225 err_set_clk:
226         clk_put(pll);
227 err_pll:
228         clk_put(gclk);
229 err_gclk:
230         return;
231 }
232 #endif
233 #endif
234
235 void __init setup_board(void)
236 {
237 #ifdef  CONFIG_BOARD_ATSTK1002_SW2_CUSTOM
238         at32_map_usart(0, 1);   /* USART 0/B: /dev/ttyS1, IRDA */
239 #else
240         at32_map_usart(1, 0);   /* USART 1/A: /dev/ttyS0, DB9 */
241 #endif
242         /* USART 2/unused: expansion connector */
243         at32_map_usart(3, 2);   /* USART 3/C: /dev/ttyS2, DB9 */
244
245         at32_setup_serial_console(0);
246 }
247
248 static int __init atstk1002_init(void)
249 {
250         /*
251          * ATSTK1000 uses 32-bit SDRAM interface. Reserve the
252          * SDRAM-specific pins so that nobody messes with them.
253          */
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         */
271
272         at32_add_system_devices();
273
274 #ifdef  CONFIG_BOARD_ATSTK1002_SW2_CUSTOM
275         at32_add_device_usart(1);
276 #else
277         at32_add_device_usart(0);
278 #endif
279         at32_add_device_usart(2);
280
281 #ifndef CONFIG_BOARD_ATSTK1002_SW6_CUSTOM
282         set_hw_addr(at32_add_device_eth(0, &eth_data[0]));
283 #endif
284 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
285         at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
286 #endif
287 #ifdef CONFIG_BOARD_ATSTK1002_SPI1
288         at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
289 #endif
290 #ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM
291         set_hw_addr(at32_add_device_eth(1, &eth_data[1]));
292 #else
293         at32_add_device_lcdc(0, &atstk1000_lcdc_data,
294                              fbmem_start, fbmem_size);
295 #endif
296         at32_add_device_usba(0, NULL);
297 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
298         at32_add_device_ssc(0, ATMEL_SSC_TX);
299 #endif
300
301         setup_j2_leds();
302
303 #ifndef CONFIG_BOARD_ATSTK1002_SW3_CUSTOM
304 #ifndef CONFIG_BOARD_ATSTK1002_SW1_CUSTOM
305         at73c213_set_clk(&at73c213_data);
306 #endif
307 #endif
308
309         return 0;
310 }
311 postcore_initcall(atstk1002_init);