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#include <linux/mm.h> 21#include <linux/platform_device.h> 22#include <linux/gpio.h> 23#include <linux/w1-gpio.h> 24 25#include <asm/mach-types.h> 26#include <asm/mach/arch.h> 27 28#include <mach/board.h> 29#include <mach/at91sam9_smc.h> 30 31#include "sam9_smc.h" 32#include "generic.h" 33 34 35static void __init portuxg20_map_io(void) 36{ 37 /* Initialize processor: 18.432 MHz crystal */ 38 at91sam9260_initialize(18432000); 39 40 /* DGBU on ttyS0. (Rx & Tx only) */ 41 at91_register_uart(0, 0, 0); 42 43 /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ 44 at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS 45 | ATMEL_UART_DTR | ATMEL_UART_DSR 46 | ATMEL_UART_DCD | ATMEL_UART_RI); 47 48 /* USART1 on ttyS2. (Rx, Tx, CTS, RTS) */ 49 at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS); 50 51 /* USART2 on ttyS3. (Rx, Tx, CTS, RTS) */ 52 at91_register_uart(AT91SAM9260_ID_US2, 3, ATMEL_UART_CTS | ATMEL_UART_RTS); 53 54 /* USART4 on ttyS5. (Rx, Tx only) */ 55 at91_register_uart(AT91SAM9260_ID_US4, 5, 0); 56 57 /* USART5 on ttyS6. (Rx, Tx only) */ 58 at91_register_uart(AT91SAM9260_ID_US5, 6, 0); 59 60 /* set serial console to ttyS0 (ie, DBGU) */ 61 at91_set_serial_console(0); 62} 63 64static void __init stamp9g20_map_io(void) 65{ 66 /* Initialize processor: 18.432 MHz crystal */ 67 at91sam9260_initialize(18432000); 68 69 /* DGBU on ttyS0. (Rx & Tx only) */ 70 at91_register_uart(0, 0, 0); 71 72 /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ 73 at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS 74 | ATMEL_UART_DTR | ATMEL_UART_DSR 75 | ATMEL_UART_DCD | ATMEL_UART_RI); 76 77 /* set serial console to ttyS0 (ie, DBGU) */ 78 at91_set_serial_console(0); 79} 80 81static void __init init_irq(void) 82{ 83 at91sam9260_init_interrupts(NULL); 84} 85 86 87/* 88 * NAND flash 89 */ 90static struct atmel_nand_data __initdata nand_data = { 91 .ale = 21, 92 .cle = 22, 93 .rdy_pin = AT91_PIN_PC13, 94 .enable_pin = AT91_PIN_PC14, 95 .bus_width_16 = 0, 96}; 97 98static struct sam9_smc_config __initdata nand_smc_config = { 99 .ncs_read_setup = 0, 100 .nrd_setup = 2, 101 .ncs_write_setup = 0, 102 .nwe_setup = 2, 103 104 .ncs_read_pulse = 4, 105 .nrd_pulse = 4, 106 .ncs_write_pulse = 4, 107 .nwe_pulse = 4, 108 109 .read_cycle = 7, 110 .write_cycle = 7, 111 112 .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8, 113 .tdf_cycles = 3, 114}; 115 116static void __init add_device_nand(void) 117{ 118 /* configure chip-select 3 (NAND) */ 119 sam9_smc_configure(3, &nand_smc_config); 120 121 at91_add_device_nand(&nand_data); 122} 123 124 125/* 126 * MCI (SD/MMC) 127 * det_pin, wp_pin and vcc_pin are not connected 128 */ 129#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) 130static struct mci_platform_data __initdata mmc_data = { 131 .slot[0] = { 132 .bus_width = 4, 133 }, 134}; 135#else 136static struct at91_mmc_data __initdata mmc_data = { 137 .slot_b = 0, 138 .wire4 = 1, 139}; 140#endif 141 142 143/* 144 * USB Host port 145 */ 146static struct at91_usbh_data __initdata usbh_data = { 147 .ports = 2, 148}; 149 150 151/* 152 * USB Device port 153 */ 154static struct at91_udc_data __initdata portuxg20_udc_data = { 155 .vbus_pin = AT91_PIN_PC7, 156 .pullup_pin = 0, /* pull-up driven by UDC */ 157}; 158 159static struct at91_udc_data __initdata stamp9g20_udc_data = { 160 .vbus_pin = AT91_PIN_PA22, 161 .pullup_pin = 0, /* pull-up driven by UDC */ 162}; 163 164 165/* 166 * MACB Ethernet device 167 */ 168static struct at91_eth_data __initdata macb_data = { 169 .phy_irq_pin = AT91_PIN_PA28, 170 .is_rmii = 1, 171}; 172 173 174/* 175 * LEDs 176 */ 177static struct gpio_led portuxg20_leds[] = { 178 { 179 .name = "LED2", 180 .gpio = AT91_PIN_PC5, 181 .default_trigger = "none", 182 }, { 183 .name = "LED3", 184 .gpio = AT91_PIN_PC4, 185 .default_trigger = "none", 186 }, { 187 .name = "LED4", 188 .gpio = AT91_PIN_PC10, 189 .default_trigger = "heartbeat", 190 } 191}; 192 193static struct gpio_led stamp9g20_leds[] = { 194 { 195 .name = "D8", 196 .gpio = AT91_PIN_PB18, 197 .active_low = 1, 198 .default_trigger = "none", 199 }, { 200 .name = "D9", 201 .gpio = AT91_PIN_PB19, 202 .active_low = 1, 203 .default_trigger = "none", 204 }, { 205 .name = "D10", 206 .gpio = AT91_PIN_PB20, 207 .active_low = 1, 208 .default_trigger = "heartbeat", 209 } 210}; 211 212 213/* 214 * SPI devices 215 */ 216static struct spi_board_info portuxg20_spi_devices[] = { 217 { 218 .modalias = "spidev", 219 .chip_select = 0, 220 .max_speed_hz = 1 * 1000 * 1000, 221 .bus_num = 0, 222 }, { 223 .modalias = "spidev", 224 .chip_select = 0, 225 .max_speed_hz = 1 * 1000 * 1000, 226 .bus_num = 1, 227 }, 228}; 229 230 231/* 232 * Dallas 1-Wire 233 */ 234static struct w1_gpio_platform_data w1_gpio_pdata = { 235 .pin = AT91_PIN_PA29, 236 .is_open_drain = 1, 237}; 238 239static struct platform_device w1_device = { 240 .name = "w1-gpio", 241 .id = -1, 242 .dev.platform_data = &w1_gpio_pdata, 243}; 244 245void add_w1(void) 246{ 247 at91_set_GPIO_periph(w1_gpio_pdata.pin, 1); 248 at91_set_multi_drive(w1_gpio_pdata.pin, 1); 249 platform_device_register(&w1_device); 250} 251 252 253static void __init generic_board_init(void) 254{ 255 /* Serial */ 256 at91_add_device_serial(); 257 /* NAND */ 258 add_device_nand(); 259 /* MMC */ 260#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) 261 at91_add_device_mci(0, &mmc_data); 262#else 263 at91_add_device_mmc(0, &mmc_data); 264#endif 265 /* USB Host */ 266 at91_add_device_usbh(&usbh_data); 267 /* Ethernet */ 268 at91_add_device_eth(&macb_data); 269 /* I2C */ 270 at91_add_device_i2c(NULL, 0); 271 /* W1 */ 272 add_w1(); 273} 274 275static void __init portuxg20_board_init(void) 276{ 277 generic_board_init(); 278 /* SPI */ 279 at91_add_device_spi(portuxg20_spi_devices, ARRAY_SIZE(portuxg20_spi_devices)); 280 /* USB Device */ 281 at91_add_device_udc(&portuxg20_udc_data); 282 /* LEDs */ 283 at91_gpio_leds(portuxg20_leds, ARRAY_SIZE(portuxg20_leds)); 284} 285 286static void __init stamp9g20_board_init(void) 287{ 288 generic_board_init(); 289 /* USB Device */ 290 at91_add_device_udc(&stamp9g20_udc_data); 291 /* LEDs */ 292 at91_gpio_leds(stamp9g20_leds, ARRAY_SIZE(stamp9g20_leds)); 293} 294 295MACHINE_START(PORTUXG20, "taskit PortuxG20") 296 /* Maintainer: taskit GmbH */ 297 .phys_io = AT91_BASE_SYS, 298 .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, 299 .boot_params = AT91_SDRAM_BASE + 0x100, 300 .timer = &at91sam926x_timer, 301 .map_io = portuxg20_map_io, 302 .init_irq = init_irq, 303 .init_machine = portuxg20_board_init, 304MACHINE_END 305 306MACHINE_START(STAMP9G20, "taskit Stamp9G20") 307 /* Maintainer: taskit GmbH */ 308 .phys_io = AT91_BASE_SYS, 309 .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, 310 .boot_params = AT91_SDRAM_BASE + 0x100, 311 .timer = &at91sam926x_timer, 312 .map_io = stamp9g20_map_io, 313 .init_irq = init_irq, 314 .init_machine = stamp9g20_board_init, 315MACHINE_END 316