linux/arch/arm/mach-at91/board-sam9-l9260.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-at91/board-sam9-l9260.c
   3 *
   4 *  Copyright (C) 2005 SAN People
   5 *  Copyright (C) 2006 Atmel
   6 *  Copyright (C) 2007 Olimex Ltd
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21 */
  22
  23#include <linux/types.h>
  24#include <linux/gpio.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
  31#include <mach/hardware.h>
  32#include <asm/setup.h>
  33#include <asm/mach-types.h>
  34#include <asm/irq.h>
  35
  36#include <asm/mach/arch.h>
  37#include <asm/mach/map.h>
  38#include <asm/mach/irq.h>
  39
  40#include <mach/at91sam9_smc.h>
  41
  42#include "at91_aic.h"
  43#include "board.h"
  44#include "sam9_smc.h"
  45#include "generic.h"
  46
  47
  48static void __init ek_init_early(void)
  49{
  50        /* Initialize processor: 18.432 MHz crystal */
  51        at91_initialize(18432000);
  52}
  53
  54/*
  55 * USB Host port
  56 */
  57static struct at91_usbh_data __initdata ek_usbh_data = {
  58        .ports          = 2,
  59        .vbus_pin       = {-EINVAL, -EINVAL},
  60        .overcurrent_pin= {-EINVAL, -EINVAL},
  61};
  62
  63/*
  64 * USB Device port
  65 */
  66static struct at91_udc_data __initdata ek_udc_data = {
  67        .vbus_pin       = AT91_PIN_PC5,
  68        .pullup_pin     = -EINVAL,              /* pull-up driven by UDC */
  69};
  70
  71
  72/*
  73 * SPI devices.
  74 */
  75static struct spi_board_info ek_spi_devices[] = {
  76#if !IS_ENABLED(CONFIG_MMC_ATMELMCI)
  77        {       /* DataFlash chip */
  78                .modalias       = "mtd_dataflash",
  79                .chip_select    = 1,
  80                .max_speed_hz   = 15 * 1000 * 1000,
  81                .bus_num        = 0,
  82        },
  83#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
  84        {       /* DataFlash card */
  85                .modalias       = "mtd_dataflash",
  86                .chip_select    = 0,
  87                .max_speed_hz   = 15 * 1000 * 1000,
  88                .bus_num        = 0,
  89        },
  90#endif
  91#endif
  92};
  93
  94
  95/*
  96 * MACB Ethernet device
  97 */
  98static struct macb_platform_data __initdata ek_macb_data = {
  99        .phy_irq_pin    = AT91_PIN_PA7,
 100        .is_rmii        = 0,
 101};
 102
 103
 104/*
 105 * NAND flash
 106 */
 107static struct mtd_partition __initdata ek_nand_partition[] = {
 108        {
 109                .name   = "Bootloader Area",
 110                .offset = 0,
 111                .size   = 10 * SZ_1M,
 112        },
 113        {
 114                .name   = "User Area",
 115                .offset = MTDPART_OFS_NXTBLK,
 116                .size   = MTDPART_SIZ_FULL,
 117        },
 118};
 119
 120static struct atmel_nand_data __initdata ek_nand_data = {
 121        .ale            = 21,
 122        .cle            = 22,
 123        .det_pin        = -EINVAL,
 124        .rdy_pin        = AT91_PIN_PC13,
 125        .enable_pin     = AT91_PIN_PC14,
 126        .ecc_mode       = NAND_ECC_SOFT,
 127        .parts          = ek_nand_partition,
 128        .num_parts      = ARRAY_SIZE(ek_nand_partition),
 129};
 130
 131static struct sam9_smc_config __initdata ek_nand_smc_config = {
 132        .ncs_read_setup         = 0,
 133        .nrd_setup              = 1,
 134        .ncs_write_setup        = 0,
 135        .nwe_setup              = 1,
 136
 137        .ncs_read_pulse         = 3,
 138        .nrd_pulse              = 3,
 139        .ncs_write_pulse        = 3,
 140        .nwe_pulse              = 3,
 141
 142        .read_cycle             = 5,
 143        .write_cycle            = 5,
 144
 145        .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
 146        .tdf_cycles             = 2,
 147};
 148
 149static void __init ek_add_device_nand(void)
 150{
 151        /* configure chip-select 3 (NAND) */
 152        sam9_smc_configure(0, 3, &ek_nand_smc_config);
 153
 154        at91_add_device_nand(&ek_nand_data);
 155}
 156
 157
 158/*
 159 * MCI (SD/MMC)
 160 */
 161static struct mci_platform_data __initdata ek_mci0_data = {
 162        .slot[1] = {
 163                .bus_width      = 4,
 164                .detect_pin     = AT91_PIN_PC8,
 165                .wp_pin         = AT91_PIN_PC4,
 166        },
 167};
 168
 169/*
 170 * LEDs
 171 */
 172static struct gpio_led ek_leds[] = {
 173        {       /* D1 */
 174                .name                   = "led1",
 175                .gpio                   = AT91_PIN_PA9,
 176                .active_low             = 1,
 177                .default_trigger        = "heartbeat",
 178        },
 179        {       /* D2 */
 180                .name                   = "led2",
 181                .gpio                   = AT91_PIN_PA6,
 182                .active_low             = 1,
 183                .default_trigger        = "timer",
 184        }
 185};
 186
 187static void __init ek_board_init(void)
 188{
 189        /* Serial */
 190        /* DBGU on ttyS0. (Rx & Tx only) */
 191        at91_register_uart(0, 0, 0);
 192
 193        /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
 194        at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS
 195                           | ATMEL_UART_DTR | ATMEL_UART_DSR | ATMEL_UART_DCD
 196                           | ATMEL_UART_RI);
 197
 198        /* USART1 on ttyS2. (Rx, Tx, CTS, RTS) */
 199        at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);
 200        at91_add_device_serial();
 201        /* USB Host */
 202        at91_add_device_usbh(&ek_usbh_data);
 203        /* USB Device */
 204        at91_add_device_udc(&ek_udc_data);
 205        /* SPI */
 206        at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
 207        /* NAND */
 208        ek_add_device_nand();
 209        /* Ethernet */
 210        at91_add_device_eth(&ek_macb_data);
 211        /* MMC */
 212        at91_add_device_mci(0, &ek_mci0_data);
 213        /* I2C */
 214        at91_add_device_i2c(NULL, 0);
 215        /* LEDs */
 216        at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
 217}
 218
 219MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260")
 220        /* Maintainer: Olimex */
 221        .init_time      = at91sam926x_pit_init,
 222        .map_io         = at91_map_io,
 223        .handle_irq     = at91_aic_handle_irq,
 224        .init_early     = ek_init_early,
 225        .init_irq       = at91_init_irq_default,
 226        .init_machine   = ek_board_init,
 227MACHINE_END
 228