linux/arch/arm/mach-at91/board-usb-a926x.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-at91/board-usb-a926x.c
   3 *
   4 *  Copyright (C) 2005 SAN People
   5 *  Copyright (C) 2007 Atmel Corporation.
   6 *  Copyright (C) 2007 Calao-systems
   7 *  Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License as published by
  11 * the Free Software Foundation; either version 2 of the License, or
  12 * (at your option) any later version.
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program; if not, write to the Free Software
  21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22 */
  23
  24#include <linux/types.h>
  25#include <linux/init.h>
  26#include <linux/mm.h>
  27#include <linux/module.h>
  28#include <linux/platform_device.h>
  29#include <linux/spi/spi.h>
  30#include <linux/gpio_keys.h>
  31#include <linux/gpio.h>
  32#include <linux/input.h>
  33#include <linux/spi/mmc_spi.h>
  34
  35#include <asm/setup.h>
  36#include <asm/mach-types.h>
  37#include <asm/irq.h>
  38
  39#include <asm/mach/arch.h>
  40#include <asm/mach/map.h>
  41#include <asm/mach/irq.h>
  42
  43#include <mach/hardware.h>
  44#include <mach/at91sam9_smc.h>
  45
  46#include "at91_aic.h"
  47#include "at91_shdwc.h"
  48#include "board.h"
  49#include "sam9_smc.h"
  50#include "generic.h"
  51
  52
  53static void __init ek_init_early(void)
  54{
  55        /* Initialize processor: 12.00 MHz crystal */
  56        at91_initialize(12000000);
  57}
  58
  59/*
  60 * USB Host port
  61 */
  62static struct at91_usbh_data __initdata ek_usbh_data = {
  63        .ports          = 2,
  64        .vbus_pin       = {-EINVAL, -EINVAL},
  65        .overcurrent_pin= {-EINVAL, -EINVAL},
  66};
  67
  68/*
  69 * USB Device port
  70 */
  71static struct at91_udc_data __initdata ek_udc_data = {
  72        .vbus_pin       = AT91_PIN_PB11,
  73        .pullup_pin     = -EINVAL,              /* pull-up driven by UDC */
  74};
  75
  76static void __init ek_add_device_udc(void)
  77{
  78        if (machine_is_usb_a9260() || machine_is_usb_a9g20())
  79                ek_udc_data.vbus_pin = AT91_PIN_PC5;
  80
  81        at91_add_device_udc(&ek_udc_data);
  82}
  83
  84#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
  85#define MMC_SPI_CARD_DETECT_INT AT91_PIN_PC4
  86static int at91_mmc_spi_init(struct device *dev,
  87        irqreturn_t (*detect_int)(int, void *), void *data)
  88{
  89        /* Configure Interrupt pin as input, no pull-up */
  90        at91_set_gpio_input(MMC_SPI_CARD_DETECT_INT, 0);
  91        return request_irq(gpio_to_irq(MMC_SPI_CARD_DETECT_INT), detect_int,
  92                IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
  93                "mmc-spi-detect", data);
  94}
  95
  96static void at91_mmc_spi_exit(struct device *dev, void *data)
  97{
  98        free_irq(gpio_to_irq(MMC_SPI_CARD_DETECT_INT), data);
  99}
 100
 101static struct mmc_spi_platform_data at91_mmc_spi_pdata = {
 102        .init = at91_mmc_spi_init,
 103        .exit = at91_mmc_spi_exit,
 104        .detect_delay = 100, /* msecs */
 105};
 106#endif
 107
 108/*
 109 * SPI devices.
 110 */
 111static struct spi_board_info usb_a9263_spi_devices[] = {
 112        {       /* DataFlash chip */
 113                .modalias       = "mtd_dataflash",
 114                .chip_select    = 0,
 115                .max_speed_hz   = 15 * 1000 * 1000,
 116                .bus_num        = 0,
 117        }
 118};
 119
 120static struct spi_board_info usb_a9g20_spi_devices[] = {
 121#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
 122        {
 123                .modalias = "mmc_spi",
 124                .max_speed_hz = 20000000,       /* max spi clock (SCK) speed in HZ */
 125                .bus_num = 1,
 126                .chip_select = 0,
 127                .platform_data = &at91_mmc_spi_pdata,
 128                .mode = SPI_MODE_3,
 129        },
 130#endif
 131};
 132
 133static void __init ek_add_device_spi(void)
 134{
 135        if (machine_is_usb_a9263())
 136                at91_add_device_spi(usb_a9263_spi_devices, ARRAY_SIZE(usb_a9263_spi_devices));
 137        else if (machine_is_usb_a9g20())
 138                at91_add_device_spi(usb_a9g20_spi_devices, ARRAY_SIZE(usb_a9g20_spi_devices));
 139}
 140
 141/*
 142 * MACB Ethernet device
 143 */
 144static struct macb_platform_data __initdata ek_macb_data = {
 145        .phy_irq_pin    = AT91_PIN_PE31,
 146        .is_rmii        = 1,
 147};
 148
 149static void __init ek_add_device_eth(void)
 150{
 151        if (machine_is_usb_a9260() || machine_is_usb_a9g20())
 152                ek_macb_data.phy_irq_pin = AT91_PIN_PA31;
 153
 154        at91_add_device_eth(&ek_macb_data);
 155}
 156
 157/*
 158 * NAND flash
 159 */
 160static struct mtd_partition __initdata ek_nand_partition[] = {
 161        {
 162                .name   = "barebox",
 163                .offset = 0,
 164                .size   = 3 * SZ_128K,
 165        }, {
 166                .name   = "bareboxenv",
 167                .offset = MTDPART_OFS_NXTBLK,
 168                .size   = SZ_128K,
 169        }, {
 170                .name   = "bareboxenv2",
 171                .offset = MTDPART_OFS_NXTBLK,
 172                .size   = SZ_128K,
 173        }, {
 174                .name   = "oftree",
 175                .offset = MTDPART_OFS_NXTBLK,
 176                .size   = SZ_128K,
 177        }, {
 178                .name   = "kernel",
 179                .offset = MTDPART_OFS_NXTBLK,
 180                .size   = 4 * SZ_1M,
 181        }, {
 182                .name   = "rootfs",
 183                .offset = MTDPART_OFS_NXTBLK,
 184                .size   = 120 * SZ_1M,
 185        }, {
 186                .name   = "data",
 187                .offset = MTDPART_OFS_NXTBLK,
 188                .size   = MTDPART_SIZ_FULL,
 189        }
 190};
 191
 192static struct atmel_nand_data __initdata ek_nand_data = {
 193        .ale            = 21,
 194        .cle            = 22,
 195        .det_pin        = -EINVAL,
 196        .rdy_pin        = AT91_PIN_PA22,
 197        .enable_pin     = AT91_PIN_PD15,
 198        .ecc_mode       = NAND_ECC_SOFT,
 199        .on_flash_bbt   = 1,
 200        .parts          = ek_nand_partition,
 201        .num_parts      = ARRAY_SIZE(ek_nand_partition),
 202};
 203
 204static struct sam9_smc_config __initdata usb_a9260_nand_smc_config = {
 205        .ncs_read_setup         = 0,
 206        .nrd_setup              = 1,
 207        .ncs_write_setup        = 0,
 208        .nwe_setup              = 1,
 209
 210        .ncs_read_pulse         = 3,
 211        .nrd_pulse              = 3,
 212        .ncs_write_pulse        = 3,
 213        .nwe_pulse              = 3,
 214
 215        .read_cycle             = 5,
 216        .write_cycle            = 5,
 217
 218        .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
 219        .tdf_cycles             = 2,
 220};
 221
 222static struct sam9_smc_config __initdata usb_a9g20_nand_smc_config = {
 223        .ncs_read_setup         = 0,
 224        .nrd_setup              = 2,
 225        .ncs_write_setup        = 0,
 226        .nwe_setup              = 2,
 227
 228        .ncs_read_pulse         = 4,
 229        .nrd_pulse              = 4,
 230        .ncs_write_pulse        = 4,
 231        .nwe_pulse              = 4,
 232
 233        .read_cycle             = 7,
 234        .write_cycle            = 7,
 235
 236        .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
 237        .tdf_cycles             = 3,
 238};
 239
 240static void __init ek_add_device_nand(void)
 241{
 242        if (machine_is_usb_a9260() || machine_is_usb_a9g20()) {
 243                ek_nand_data.rdy_pin    = AT91_PIN_PC13;
 244                ek_nand_data.enable_pin = AT91_PIN_PC14;
 245        }
 246
 247        /* configure chip-select 3 (NAND) */
 248        if (machine_is_usb_a9g20())
 249                sam9_smc_configure(0, 3, &usb_a9g20_nand_smc_config);
 250        else
 251                sam9_smc_configure(0, 3, &usb_a9260_nand_smc_config);
 252
 253        at91_add_device_nand(&ek_nand_data);
 254}
 255
 256
 257/*
 258 * GPIO Buttons
 259 */
 260#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 261static struct gpio_keys_button ek_buttons[] = {
 262        {       /* USER PUSH BUTTON */
 263                .code           = KEY_ENTER,
 264                .gpio           = AT91_PIN_PB10,
 265                .active_low     = 1,
 266                .desc           = "user_pb",
 267                .wakeup         = 1,
 268        }
 269};
 270
 271static struct gpio_keys_platform_data ek_button_data = {
 272        .buttons        = ek_buttons,
 273        .nbuttons       = ARRAY_SIZE(ek_buttons),
 274};
 275
 276static struct platform_device ek_button_device = {
 277        .name           = "gpio-keys",
 278        .id             = -1,
 279        .num_resources  = 0,
 280        .dev            = {
 281                .platform_data  = &ek_button_data,
 282        }
 283};
 284
 285static void __init ek_add_device_buttons(void)
 286{
 287        at91_set_GPIO_periph(AT91_PIN_PB10, 1); /* user push button, pull up enabled */
 288        at91_set_deglitch(AT91_PIN_PB10, 1);
 289
 290        platform_device_register(&ek_button_device);
 291}
 292#else
 293static void __init ek_add_device_buttons(void) {}
 294#endif
 295
 296/*
 297 * LEDs
 298 */
 299static struct gpio_led ek_leds[] = {
 300        {       /* user_led (green) */
 301                .name                   = "user_led",
 302                .gpio                   = AT91_PIN_PB21,
 303                .active_low             = 1,
 304                .default_trigger        = "heartbeat",
 305        }
 306};
 307
 308static struct i2c_board_info __initdata ek_i2c_devices[] = {
 309        {
 310                I2C_BOARD_INFO("rv3029c2", 0x56),
 311        },
 312};
 313
 314static void __init ek_add_device_leds(void)
 315{
 316        if (machine_is_usb_a9260() || machine_is_usb_a9g20())
 317                ek_leds[0].active_low = 0;
 318
 319        at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
 320}
 321
 322static void __init ek_board_init(void)
 323{
 324        /* Serial */
 325        /* DBGU on ttyS0. (Rx & Tx only) */
 326        at91_register_uart(0, 0, 0);
 327        at91_add_device_serial();
 328        /* USB Host */
 329        at91_add_device_usbh(&ek_usbh_data);
 330        /* USB Device */
 331        ek_add_device_udc();
 332        /* SPI */
 333        ek_add_device_spi();
 334        /* Ethernet */
 335        ek_add_device_eth();
 336        /* NAND */
 337        ek_add_device_nand();
 338        /* Push Buttons */
 339        ek_add_device_buttons();
 340        /* LEDs */
 341        ek_add_device_leds();
 342
 343        if (machine_is_usb_a9g20()) {
 344                /* I2C */
 345                at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
 346        } else {
 347                /* I2C */
 348                at91_add_device_i2c(NULL, 0);
 349                /* shutdown controller, wakeup button (5 msec low) */
 350                at91_shdwc_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10)
 351                                | AT91_SHDW_WKMODE0_LOW
 352                                | AT91_SHDW_RTTWKEN);
 353        }
 354}
 355
 356MACHINE_START(USB_A9263, "CALAO USB_A9263")
 357        /* Maintainer: calao-systems */
 358        .timer          = &at91sam926x_timer,
 359        .map_io         = at91_map_io,
 360        .handle_irq     = at91_aic_handle_irq,
 361        .init_early     = ek_init_early,
 362        .init_irq       = at91_init_irq_default,
 363        .init_machine   = ek_board_init,
 364MACHINE_END
 365
 366MACHINE_START(USB_A9260, "CALAO USB_A9260")
 367        /* Maintainer: calao-systems */
 368        .timer          = &at91sam926x_timer,
 369        .map_io         = at91_map_io,
 370        .handle_irq     = at91_aic_handle_irq,
 371        .init_early     = ek_init_early,
 372        .init_irq       = at91_init_irq_default,
 373        .init_machine   = ek_board_init,
 374MACHINE_END
 375
 376MACHINE_START(USB_A9G20, "CALAO USB_A92G0")
 377        /* Maintainer: Jean-Christophe PLAGNIOL-VILLARD */
 378        .timer          = &at91sam926x_timer,
 379        .map_io         = at91_map_io,
 380        .handle_irq     = at91_aic_handle_irq,
 381        .init_early     = ek_init_early,
 382        .init_irq       = at91_init_irq_default,
 383        .init_machine   = ek_board_init,
 384MACHINE_END
 385