Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
[pandora-kernel.git] / arch / arm / mach-at91 / board-pcontrol-g20.c
1 /*
2  *  Copyright (C) 2010 Christian Glindkamp <christian.glindkamp@taskit.de>
3  *                     taskit GmbH
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19 /*
20  * copied and adjusted from board-stamp9g20.c
21  * by Peter Gsellmann <pgsellmann@portner-elektronik.at>
22  */
23
24 #include <linux/mm.h>
25 #include <linux/platform_device.h>
26 #include <linux/gpio.h>
27 #include <linux/w1-gpio.h>
28
29 #include <asm/mach-types.h>
30 #include <asm/mach/arch.h>
31
32 #include <mach/board.h>
33 #include <mach/at91sam9_smc.h>
34
35 #include "sam9_smc.h"
36 #include "generic.h"
37
38
39 static void __init pcontrol_g20_map_io(void)
40 {
41         /* Initialize processor: 18.432 MHz crystal */
42         at91sam9260_initialize(18432000);
43
44         /* DGBU on ttyS0. (Rx, Tx) only TTL -> JTAG connector X7 17,19 ) */
45         at91_register_uart(0, 0, 0);
46
47         /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) piggyback  A2 */
48         at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS
49                                                 | ATMEL_UART_RTS);
50
51         /* USART1 on ttyS2. (Rx, Tx, CTS, RTS) isolated RS485  X5 */
52         at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS
53                                                 | ATMEL_UART_RTS);
54
55         /* USART2 on ttyS3. (Rx, Tx)  9bit-Bus  Multidrop-mode  X4 */
56         at91_register_uart(AT91SAM9260_ID_US4, 3, 0);
57
58         /* set serial console to ttyS0 (ie, DBGU) */
59         at91_set_serial_console(0);
60 }
61
62
63 static void __init init_irq(void)
64 {
65         at91sam9260_init_interrupts(NULL);
66 }
67
68
69 /*
70  * NAND flash 512MiB 1,8V 8-bit, sector size 128 KiB
71  */
72 static struct atmel_nand_data __initdata nand_data = {
73         .ale            = 21,
74         .cle            = 22,
75         .rdy_pin        = AT91_PIN_PC13,
76         .enable_pin     = AT91_PIN_PC14,
77 };
78
79 /*
80  * Bus timings; unit = 7.57ns
81  */
82 static struct sam9_smc_config __initdata nand_smc_config = {
83         .ncs_read_setup         = 0,
84         .nrd_setup              = 2,
85         .ncs_write_setup        = 0,
86         .nwe_setup              = 2,
87
88         .ncs_read_pulse         = 4,
89         .nrd_pulse              = 4,
90         .ncs_write_pulse        = 4,
91         .nwe_pulse              = 4,
92
93         .read_cycle             = 7,
94         .write_cycle            = 7,
95
96         .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE
97                         | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
98         .tdf_cycles             = 3,
99 };
100
101 static struct sam9_smc_config __initdata pcontrol_smc_config[2] = { {
102         .ncs_read_setup         = 16,
103         .nrd_setup              = 18,
104         .ncs_write_setup        = 16,
105         .nwe_setup              = 18,
106
107         .ncs_read_pulse         = 63,
108         .nrd_pulse              = 55,
109         .ncs_write_pulse        = 63,
110         .nwe_pulse              = 55,
111
112         .read_cycle             = 127,
113         .write_cycle            = 127,
114
115         .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE
116                         | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_SELECT
117                         | AT91_SMC_DBW_8 | AT91_SMC_PS_4
118                         | AT91_SMC_TDFMODE,
119         .tdf_cycles             = 3,
120 }, {
121         .ncs_read_setup         = 0,
122         .nrd_setup              = 0,
123         .ncs_write_setup        = 0,
124         .nwe_setup              = 1,
125
126         .ncs_read_pulse         = 8,
127         .nrd_pulse              = 8,
128         .ncs_write_pulse        = 5,
129         .nwe_pulse              = 4,
130
131         .read_cycle             = 8,
132         .write_cycle            = 7,
133
134         .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE
135                         | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_SELECT
136                         | AT91_SMC_DBW_16 | AT91_SMC_PS_8
137                         | AT91_SMC_TDFMODE,
138         .tdf_cycles             = 1,
139 } };
140
141 static void __init add_device_nand(void)
142 {
143         /* configure chip-select 3 (NAND) */
144         sam9_smc_configure(3, &nand_smc_config);
145         at91_add_device_nand(&nand_data);
146 }
147
148
149 static void __init add_device_pcontrol(void)
150 {
151         /* configure chip-select 4 (IO compatible to 8051  X4 ) */
152         sam9_smc_configure(4, &pcontrol_smc_config[0]);
153         /* configure chip-select 7 (FerroRAM 256KiBx16bit MR2A16A  D4 ) */
154         sam9_smc_configure(7, &pcontrol_smc_config[1]);
155 }
156
157
158 /*
159  * MCI (SD/MMC)
160  * det_pin, wp_pin and vcc_pin are not connected
161  */
162 #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
163 static struct mci_platform_data __initdata mmc_data = {
164         .slot[0] = {
165                 .bus_width      = 4,
166         },
167 };
168 #else
169 static struct at91_mmc_data __initdata mmc_data = {
170         .wire4          = 1,
171 };
172 #endif
173
174
175 /*
176  * USB Host port
177  */
178 static struct at91_usbh_data __initdata usbh_data = {
179         .ports          = 2,
180 };
181
182
183 /*
184  * USB Device port
185  */
186 static struct at91_udc_data __initdata pcontrol_g20_udc_data = {
187         .vbus_pin       = AT91_PIN_PA22,        /* Detect +5V bus voltage */
188         .pullup_pin     = AT91_PIN_PA4,         /* K-state, active low */
189 };
190
191
192 /*
193  * MACB Ethernet device
194  */
195 static struct at91_eth_data __initdata macb_data = {
196         .phy_irq_pin    = AT91_PIN_PA28,
197         .is_rmii        = 1,
198 };
199
200
201 /*
202  * I2C devices: eeprom and phy/switch
203  */
204 static struct i2c_board_info __initdata pcontrol_g20_i2c_devices[] = {
205 {               /* D7  address width=2, 8KiB */
206         I2C_BOARD_INFO("24c64", 0x50)
207 }, {            /* D8  address width=1, 1 byte has 32 bits! */
208         I2C_BOARD_INFO("lan9303", 0x0a)
209 }, };
210
211
212 /*
213  * LEDs
214  */
215 static struct gpio_led pcontrol_g20_leds[] = {
216         {
217                 .name                   = "LED1",       /* red  H5 */
218                 .gpio                   = AT91_PIN_PB18,
219                 .active_low             = 1,
220                 .default_trigger        = "none",       /* supervisor */
221         }, {
222                 .name                   = "LED2",       /* yellow  H7 */
223                 .gpio                   = AT91_PIN_PB19,
224                 .active_low             = 1,
225                 .default_trigger        = "mmc0",       /* SD-card activity */
226         }, {
227                 .name                   = "LED3",       /* green  H2 */
228                 .gpio                   = AT91_PIN_PB20,
229                 .active_low             = 1,
230                 .default_trigger        = "heartbeat",  /* blinky */
231         }, {
232                 .name                   = "LED4",       /* red  H3 */
233                 .gpio                   = AT91_PIN_PC6,
234                 .active_low             = 1,
235                 .default_trigger        = "none",       /* connection lost */
236         }, {
237                 .name                   = "LED5",       /* yellow  H6 */
238                 .gpio                   = AT91_PIN_PC7,
239                 .active_low             = 1,
240                 .default_trigger        = "none",       /* unsent data */
241         }, {
242                 .name                   = "LED6",       /* green  H1 */
243                 .gpio                   = AT91_PIN_PC9,
244                 .active_low             = 1,
245                 .default_trigger        = "none",       /* snafu */
246         }
247 };
248
249
250 /*
251  * SPI devices
252  */
253 static struct spi_board_info pcontrol_g20_spi_devices[] = {
254         {
255                 .modalias       = "spidev",     /* HMI port  X4 */
256                 .chip_select    = 1,
257                 .max_speed_hz   = 50 * 1000 * 1000,
258                 .bus_num        = 0,
259         }, {
260                 .modalias       = "spidev",     /* piggyback  A2 */
261                 .chip_select    = 0,
262                 .max_speed_hz   = 50 * 1000 * 1000,
263                 .bus_num        = 1,
264         },
265 };
266
267
268 /*
269  * Dallas 1-Wire  DS2431
270  */
271 static struct w1_gpio_platform_data w1_gpio_pdata = {
272         .pin            = AT91_PIN_PA29,
273         .is_open_drain  = 1,
274 };
275
276 static struct platform_device w1_device = {
277         .name                   = "w1-gpio",
278         .id                     = -1,
279         .dev.platform_data      = &w1_gpio_pdata,
280 };
281
282 static void add_wire1(void)
283 {
284         at91_set_GPIO_periph(w1_gpio_pdata.pin, 1);
285         at91_set_multi_drive(w1_gpio_pdata.pin, 1);
286         platform_device_register(&w1_device);
287 }
288
289
290 static void __init pcontrol_g20_board_init(void)
291 {
292         at91_add_device_serial();
293         add_device_nand();
294 #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
295         at91_add_device_mci(0, &mmc_data);
296 #else
297         at91_add_device_mmc(0, &mmc_data);
298 #endif
299         at91_add_device_usbh(&usbh_data);
300         at91_add_device_eth(&macb_data);
301         at91_add_device_i2c(pcontrol_g20_i2c_devices,
302                 ARRAY_SIZE(pcontrol_g20_i2c_devices));
303         add_wire1();
304         add_device_pcontrol();
305         at91_add_device_spi(pcontrol_g20_spi_devices,
306                 ARRAY_SIZE(pcontrol_g20_spi_devices));
307         at91_add_device_udc(&pcontrol_g20_udc_data);
308         at91_gpio_leds(pcontrol_g20_leds,
309                 ARRAY_SIZE(pcontrol_g20_leds));
310         /* piggyback  A2 */
311         at91_set_gpio_output(AT91_PIN_PB31, 1);
312 }
313
314
315 MACHINE_START(PCONTROL_G20, "PControl G20")
316         /* Maintainer: pgsellmann@portner-elektronik.at */
317         .boot_params    = AT91_SDRAM_BASE + 0x100,
318         .timer          = &at91sam926x_timer,
319         .map_io         = pcontrol_g20_map_io,
320         .init_irq       = init_irq,
321         .init_machine   = pcontrol_g20_board_init,
322 MACHINE_END