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