linux/arch/arm/mach-at91/board-sam9260ek.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-at91/board-sam9260ek.c
   3 *
   4 *  Copyright (C) 2005 SAN People
   5 *  Copyright (C) 2006 Atmel
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20 */
  21
  22#include <linux/types.h>
  23#include <linux/gpio.h>
  24#include <linux/init.h>
  25#include <linux/mm.h>
  26#include <linux/module.h>
  27#include <linux/platform_device.h>
  28#include <linux/spi/spi.h>
  29#include <linux/spi/at73c213.h>
  30#include <linux/clk.h>
  31#include <linux/i2c/at24.h>
  32#include <linux/gpio_keys.h>
  33#include <linux/input.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#include <mach/system_rev.h>
  46
  47#include "at91_aic.h"
  48#include "at91_shdwc.h"
  49#include "board.h"
  50#include "sam9_smc.h"
  51#include "generic.h"
  52
  53
  54static void __init ek_init_early(void)
  55{
  56        /* Initialize processor: 18.432 MHz crystal */
  57        at91_initialize(18432000);
  58}
  59
  60/*
  61 * USB Host port
  62 */
  63static struct at91_usbh_data __initdata ek_usbh_data = {
  64        .ports          = 2,
  65        .vbus_pin       = {-EINVAL, -EINVAL},
  66        .overcurrent_pin= {-EINVAL, -EINVAL},
  67};
  68
  69/*
  70 * USB Device port
  71 */
  72static struct at91_udc_data __initdata ek_udc_data = {
  73        .vbus_pin       = AT91_PIN_PC5,
  74        .pullup_pin     = -EINVAL,              /* pull-up driven by UDC */
  75};
  76
  77
  78/*
  79 * Audio
  80 */
  81static struct at73c213_board_info at73c213_data = {
  82        .ssc_id         = 0,
  83        .shortname      = "AT91SAM9260-EK external DAC",
  84};
  85
  86#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
  87static void __init at73c213_set_clk(struct at73c213_board_info *info)
  88{
  89        struct clk *pck0;
  90        struct clk *plla;
  91
  92        pck0 = clk_get(NULL, "pck0");
  93        plla = clk_get(NULL, "plla");
  94
  95        /* AT73C213 MCK Clock */
  96        at91_set_B_periph(AT91_PIN_PC1, 0);     /* PCK0 */
  97
  98        clk_set_parent(pck0, plla);
  99        clk_put(plla);
 100
 101        info->dac_clk = pck0;
 102}
 103#else
 104static void __init at73c213_set_clk(struct at73c213_board_info *info) {}
 105#endif
 106
 107/*
 108 * SPI devices.
 109 */
 110static struct spi_board_info ek_spi_devices[] = {
 111#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)
 112        {       /* DataFlash chip */
 113                .modalias       = "mtd_dataflash",
 114                .chip_select    = 1,
 115                .max_speed_hz   = 15 * 1000 * 1000,
 116                .bus_num        = 0,
 117        },
 118#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
 119        {       /* DataFlash card */
 120                .modalias       = "mtd_dataflash",
 121                .chip_select    = 0,
 122                .max_speed_hz   = 15 * 1000 * 1000,
 123                .bus_num        = 0,
 124        },
 125#endif
 126#endif
 127#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
 128        {       /* AT73C213 DAC */
 129                .modalias       = "at73c213",
 130                .chip_select    = 0,
 131                .max_speed_hz   = 10 * 1000 * 1000,
 132                .bus_num        = 1,
 133                .mode           = SPI_MODE_1,
 134                .platform_data  = &at73c213_data,
 135        },
 136#endif
 137};
 138
 139
 140/*
 141 * MACB Ethernet device
 142 */
 143static struct macb_platform_data __initdata ek_macb_data = {
 144        .phy_irq_pin    = AT91_PIN_PA7,
 145        .is_rmii        = 1,
 146};
 147
 148
 149/*
 150 * NAND flash
 151 */
 152static struct mtd_partition __initdata ek_nand_partition[] = {
 153        {
 154                .name   = "Partition 1",
 155                .offset = 0,
 156                .size   = SZ_256K,
 157        },
 158        {
 159                .name   = "Partition 2",
 160                .offset = MTDPART_OFS_NXTBLK,
 161                .size   = MTDPART_SIZ_FULL,
 162        },
 163};
 164
 165static struct atmel_nand_data __initdata ek_nand_data = {
 166        .ale            = 21,
 167        .cle            = 22,
 168        .det_pin        = -EINVAL,
 169        .rdy_pin        = AT91_PIN_PC13,
 170        .enable_pin     = AT91_PIN_PC14,
 171        .ecc_mode       = NAND_ECC_SOFT,
 172        .on_flash_bbt   = 1,
 173        .parts          = ek_nand_partition,
 174        .num_parts      = ARRAY_SIZE(ek_nand_partition),
 175};
 176
 177static struct sam9_smc_config __initdata ek_nand_smc_config = {
 178        .ncs_read_setup         = 0,
 179        .nrd_setup              = 1,
 180        .ncs_write_setup        = 0,
 181        .nwe_setup              = 1,
 182
 183        .ncs_read_pulse         = 3,
 184        .nrd_pulse              = 3,
 185        .ncs_write_pulse        = 3,
 186        .nwe_pulse              = 3,
 187
 188        .read_cycle             = 5,
 189        .write_cycle            = 5,
 190
 191        .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
 192        .tdf_cycles             = 2,
 193};
 194
 195static void __init ek_add_device_nand(void)
 196{
 197        ek_nand_data.bus_width_16 = board_have_nand_16bit();
 198        /* setup bus-width (8 or 16) */
 199        if (ek_nand_data.bus_width_16)
 200                ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
 201        else
 202                ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
 203
 204        /* configure chip-select 3 (NAND) */
 205        sam9_smc_configure(0, 3, &ek_nand_smc_config);
 206
 207        at91_add_device_nand(&ek_nand_data);
 208}
 209
 210
 211/*
 212 * MCI (SD/MMC)
 213 */
 214static struct mci_platform_data __initdata ek_mci0_data = {
 215        .slot[1] = {
 216                .bus_width      = 4,
 217                .detect_pin     = -EINVAL,
 218                .wp_pin         = -EINVAL,
 219        },
 220};
 221
 222
 223/*
 224 * LEDs
 225 */
 226static struct gpio_led ek_leds[] = {
 227        {       /* "bottom" led, green, userled1 to be defined */
 228                .name                   = "ds5",
 229                .gpio                   = AT91_PIN_PA6,
 230                .active_low             = 1,
 231                .default_trigger        = "none",
 232        },
 233        {       /* "power" led, yellow */
 234                .name                   = "ds1",
 235                .gpio                   = AT91_PIN_PA9,
 236                .default_trigger        = "heartbeat",
 237        }
 238};
 239
 240/*
 241 * I2C devices
 242 */
 243static struct at24_platform_data at24c512 = {
 244        .byte_len       = SZ_512K / 8,
 245        .page_size      = 128,
 246        .flags          = AT24_FLAG_ADDR16,
 247};
 248
 249static struct i2c_board_info __initdata ek_i2c_devices[] = {
 250        {
 251                I2C_BOARD_INFO("24c512", 0x50),
 252                .platform_data = &at24c512,
 253        },
 254        /* more devices can be added using expansion connectors */
 255};
 256
 257
 258/*
 259 * GPIO Buttons
 260 */
 261#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 262static struct gpio_keys_button ek_buttons[] = {
 263        {
 264                .gpio           = AT91_PIN_PA30,
 265                .code           = BTN_3,
 266                .desc           = "Button 3",
 267                .active_low     = 1,
 268                .wakeup         = 1,
 269        },
 270        {
 271                .gpio           = AT91_PIN_PA31,
 272                .code           = BTN_4,
 273                .desc           = "Button 4",
 274                .active_low     = 1,
 275                .wakeup         = 1,
 276        }
 277};
 278
 279static struct gpio_keys_platform_data ek_button_data = {
 280        .buttons        = ek_buttons,
 281        .nbuttons       = ARRAY_SIZE(ek_buttons),
 282};
 283
 284static struct platform_device ek_button_device = {
 285        .name           = "gpio-keys",
 286        .id             = -1,
 287        .num_resources  = 0,
 288        .dev            = {
 289                .platform_data  = &ek_button_data,
 290        }
 291};
 292
 293static void __init ek_add_device_buttons(void)
 294{
 295        at91_set_gpio_input(AT91_PIN_PA30, 1);  /* btn3 */
 296        at91_set_deglitch(AT91_PIN_PA30, 1);
 297        at91_set_gpio_input(AT91_PIN_PA31, 1);  /* btn4 */
 298        at91_set_deglitch(AT91_PIN_PA31, 1);
 299
 300        platform_device_register(&ek_button_device);
 301}
 302#else
 303static void __init ek_add_device_buttons(void) {}
 304#endif
 305
 306
 307static void __init ek_board_init(void)
 308{
 309        /* Serial */
 310        /* DBGU on ttyS0. (Rx & Tx only) */
 311        at91_register_uart(0, 0, 0);
 312
 313        /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
 314        at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS
 315                           | ATMEL_UART_DTR | ATMEL_UART_DSR | ATMEL_UART_DCD
 316                           | ATMEL_UART_RI);
 317
 318        /* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */
 319        at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);
 320        at91_add_device_serial();
 321        /* USB Host */
 322        at91_add_device_usbh(&ek_usbh_data);
 323        /* USB Device */
 324        at91_add_device_udc(&ek_udc_data);
 325        /* SPI */
 326        at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
 327        /* NAND */
 328        ek_add_device_nand();
 329        /* Ethernet */
 330        at91_add_device_eth(&ek_macb_data);
 331        /* MMC */
 332        at91_add_device_mci(0, &ek_mci0_data);
 333        /* I2C */
 334        at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
 335        /* SSC (to AT73C213) */
 336        at73c213_set_clk(&at73c213_data);
 337        at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);
 338        /* LEDs */
 339        at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
 340        /* Push Buttons */
 341        ek_add_device_buttons();
 342}
 343
 344MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
 345        /* Maintainer: Atmel */
 346        .init_time      = at91sam926x_pit_init,
 347        .map_io         = at91_map_io,
 348        .handle_irq     = at91_aic_handle_irq,
 349        .init_early     = ek_init_early,
 350        .init_irq       = at91_init_irq_default,
 351        .init_machine   = ek_board_init,
 352MACHINE_END
 353