Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-pcontrol-g20.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2010 Christian Glindkamp <[email protected]>
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 <[email protected]>
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/at91_aic.h>
34 #include <mach/at91sam9_smc.h>
35 #include <mach/stamp9g20.h>
36 
37 #include "sam9_smc.h"
38 #include "generic.h"
39 
40 
41 static void __init pcontrol_g20_init_early(void)
42 {
44 }
45 
46 static struct sam9_smc_config __initdata pcontrol_smc_config[2] = { {
47  .ncs_read_setup = 16,
48  .nrd_setup = 18,
49  .ncs_write_setup = 16,
50  .nwe_setup = 18,
51 
52  .ncs_read_pulse = 63,
53  .nrd_pulse = 55,
54  .ncs_write_pulse = 63,
55  .nwe_pulse = 55,
56 
57  .read_cycle = 127,
58  .write_cycle = 127,
59 
64  .tdf_cycles = 3,
65 }, {
66  .ncs_read_setup = 0,
67  .nrd_setup = 0,
68  .ncs_write_setup = 0,
69  .nwe_setup = 1,
70 
71  .ncs_read_pulse = 8,
72  .nrd_pulse = 8,
73  .ncs_write_pulse = 5,
74  .nwe_pulse = 4,
75 
76  .read_cycle = 8,
77  .write_cycle = 7,
78 
83  .tdf_cycles = 1,
84 } };
85 
86 static void __init add_device_pcontrol(void)
87 {
88  /* configure chip-select 4 (IO compatible to 8051 X4 ) */
89  sam9_smc_configure(0, 4, &pcontrol_smc_config[0]);
90  /* configure chip-select 7 (FerroRAM 256KiBx16bit MR2A16A D4 ) */
91  sam9_smc_configure(0, 7, &pcontrol_smc_config[1]);
92 }
93 
94 
95 /*
96  * USB Host port
97  */
98 static struct at91_usbh_data __initdata usbh_data = {
99  .ports = 2,
100  .vbus_pin = {-EINVAL, -EINVAL},
101  .overcurrent_pin= {-EINVAL, -EINVAL},
102 };
103 
104 
105 /*
106  * USB Device port
107  */
108 static struct at91_udc_data __initdata pcontrol_g20_udc_data = {
109  .vbus_pin = AT91_PIN_PA22, /* Detect +5V bus voltage */
110  .pullup_pin = AT91_PIN_PA4, /* K-state, active low */
111 };
112 
113 
114 /*
115  * MACB Ethernet device
116  */
117 static struct macb_platform_data __initdata macb_data = {
118  .phy_irq_pin = AT91_PIN_PA28,
119  .is_rmii = 1,
120 };
121 
122 
123 /*
124  * I2C devices: eeprom and phy/switch
125  */
126 static struct i2c_board_info __initdata pcontrol_g20_i2c_devices[] = {
127 { /* D7 address width=2, 8KiB */
128  I2C_BOARD_INFO("24c64", 0x50)
129 }, { /* D8 address width=1, 1 byte has 32 bits! */
130  I2C_BOARD_INFO("lan9303", 0x0a)
131 }, };
132 
133 
134 /*
135  * LEDs
136  */
137 static struct gpio_led pcontrol_g20_leds[] = {
138  {
139  .name = "LED1", /* red H5 */
140  .gpio = AT91_PIN_PB18,
141  .active_low = 1,
142  .default_trigger = "none", /* supervisor */
143  }, {
144  .name = "LED2", /* yellow H7 */
145  .gpio = AT91_PIN_PB19,
146  .active_low = 1,
147  .default_trigger = "mmc0", /* SD-card activity */
148  }, {
149  .name = "LED3", /* green H2 */
150  .gpio = AT91_PIN_PB20,
151  .active_low = 1,
152  .default_trigger = "heartbeat", /* blinky */
153  }, {
154  .name = "LED4", /* red H3 */
155  .gpio = AT91_PIN_PC6,
156  .active_low = 1,
157  .default_trigger = "none", /* connection lost */
158  }, {
159  .name = "LED5", /* yellow H6 */
160  .gpio = AT91_PIN_PC7,
161  .active_low = 1,
162  .default_trigger = "none", /* unsent data */
163  }, {
164  .name = "LED6", /* green H1 */
165  .gpio = AT91_PIN_PC9,
166  .active_low = 1,
167  .default_trigger = "none", /* snafu */
168  }
169 };
170 
171 
172 /*
173  * SPI devices
174  */
175 static struct spi_board_info pcontrol_g20_spi_devices[] = {
176  {
177  .modalias = "spidev", /* HMI port X4 */
178  .chip_select = 1,
179  .max_speed_hz = 50 * 1000 * 1000,
180  .bus_num = 0,
181  }, {
182  .modalias = "spidev", /* piggyback A2 */
183  .chip_select = 0,
184  .max_speed_hz = 50 * 1000 * 1000,
185  .bus_num = 1,
186  },
187 };
188 
189 
190 static void __init pcontrol_g20_board_init(void)
191 {
192  /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) piggyback A2 */
194  | ATMEL_UART_RTS);
195 
196  /* USART1 on ttyS2. (Rx, Tx, CTS, RTS) isolated RS485 X5 */
198  | ATMEL_UART_RTS);
199 
200  /* USART2 on ttyS3. (Rx, Tx) 9bit-Bus Multidrop-mode X4 */
203  at91_add_device_usbh(&usbh_data);
204  at91_add_device_eth(&macb_data);
205  at91_add_device_i2c(pcontrol_g20_i2c_devices,
206  ARRAY_SIZE(pcontrol_g20_i2c_devices));
207  add_device_pcontrol();
208  at91_add_device_spi(pcontrol_g20_spi_devices,
209  ARRAY_SIZE(pcontrol_g20_spi_devices));
210  at91_add_device_udc(&pcontrol_g20_udc_data);
211  at91_gpio_leds(pcontrol_g20_leds,
212  ARRAY_SIZE(pcontrol_g20_leds));
213  /* piggyback A2 */
215 }
216 
217 
218 MACHINE_START(PCONTROL_G20, "PControl G20")
219  /* Maintainer: [email protected] */
220  .timer = &at91sam926x_timer,
221  .map_io = at91_map_io,
222  .handle_irq = at91_aic_handle_irq,
223  .init_early = pcontrol_g20_init_early,
225  .init_machine = pcontrol_g20_board_init,