linux/arch/arm/mach-at91/board-sam9rlek.c
<<
>>
Prefs
   1/*
   2 *  Copyright (C) 2005 SAN People
   3 *  Copyright (C) 2007 Atmel Corporation
   4 *
   5 * This file is subject to the terms and conditions of the GNU General Public
   6 * License.  See the file COPYING in the main directory of this archive for
   7 * more details.
   8 */
   9
  10#include <linux/types.h>
  11#include <linux/gpio.h>
  12#include <linux/init.h>
  13#include <linux/mm.h>
  14#include <linux/module.h>
  15#include <linux/platform_device.h>
  16#include <linux/spi/spi.h>
  17#include <linux/fb.h>
  18#include <linux/clk.h>
  19#include <linux/input.h>
  20#include <linux/gpio_keys.h>
  21
  22#include <video/atmel_lcdc.h>
  23
  24#include <asm/setup.h>
  25#include <asm/mach-types.h>
  26#include <asm/irq.h>
  27
  28#include <asm/mach/arch.h>
  29#include <asm/mach/map.h>
  30#include <asm/mach/irq.h>
  31
  32#include <mach/hardware.h>
  33#include <mach/at91sam9_smc.h>
  34
  35
  36#include "at91_aic.h"
  37#include "at91_shdwc.h"
  38#include "board.h"
  39#include "sam9_smc.h"
  40#include "generic.h"
  41
  42
  43static void __init ek_init_early(void)
  44{
  45        /* Initialize processor: 12.000 MHz crystal */
  46        at91_initialize(12000000);
  47}
  48
  49/*
  50 * USB HS Device port
  51 */
  52static struct usba_platform_data __initdata ek_usba_udc_data = {
  53        .vbus_pin       = AT91_PIN_PA8,
  54};
  55
  56
  57/*
  58 * MCI (SD/MMC)
  59 */
  60static struct mci_platform_data __initdata mci0_data = {
  61        .slot[0] = {
  62                .bus_width      = 4,
  63                .detect_pin     = AT91_PIN_PA15,
  64                .wp_pin         = -EINVAL,
  65        },
  66};
  67
  68
  69/*
  70 * NAND flash
  71 */
  72static struct mtd_partition __initdata ek_nand_partition[] = {
  73        {
  74                .name   = "Partition 1",
  75                .offset = 0,
  76                .size   = SZ_256K,
  77        },
  78        {
  79                .name   = "Partition 2",
  80                .offset = MTDPART_OFS_NXTBLK,
  81                .size   = MTDPART_SIZ_FULL,
  82        },
  83};
  84
  85static struct atmel_nand_data __initdata ek_nand_data = {
  86        .ale            = 21,
  87        .cle            = 22,
  88        .det_pin        = -EINVAL,
  89        .rdy_pin        = AT91_PIN_PD17,
  90        .enable_pin     = AT91_PIN_PB6,
  91        .ecc_mode       = NAND_ECC_SOFT,
  92        .on_flash_bbt   = 1,
  93        .parts          = ek_nand_partition,
  94        .num_parts      = ARRAY_SIZE(ek_nand_partition),
  95};
  96
  97static struct sam9_smc_config __initdata ek_nand_smc_config = {
  98        .ncs_read_setup         = 0,
  99        .nrd_setup              = 1,
 100        .ncs_write_setup        = 0,
 101        .nwe_setup              = 1,
 102
 103        .ncs_read_pulse         = 3,
 104        .nrd_pulse              = 3,
 105        .ncs_write_pulse        = 3,
 106        .nwe_pulse              = 3,
 107
 108        .read_cycle             = 5,
 109        .write_cycle            = 5,
 110
 111        .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
 112        .tdf_cycles             = 2,
 113};
 114
 115static void __init ek_add_device_nand(void)
 116{
 117        /* configure chip-select 3 (NAND) */
 118        sam9_smc_configure(0, 3, &ek_nand_smc_config);
 119
 120        at91_add_device_nand(&ek_nand_data);
 121}
 122
 123
 124/*
 125 * SPI devices
 126 */
 127static struct spi_board_info ek_spi_devices[] = {
 128        {       /* DataFlash chip */
 129                .modalias       = "mtd_dataflash",
 130                .chip_select    = 0,
 131                .max_speed_hz   = 15 * 1000 * 1000,
 132                .bus_num        = 0,
 133        },
 134};
 135
 136
 137/*
 138 * LCD Controller
 139 */
 140#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
 141static struct fb_videomode at91_tft_vga_modes[] = {
 142        {
 143                .name           = "TX09D50VM1CCA @ 60",
 144                .refresh        = 60,
 145                .xres           = 240,          .yres           = 320,
 146                .pixclock       = KHZ2PICOS(4965),
 147
 148                .left_margin    = 1,            .right_margin   = 33,
 149                .upper_margin   = 1,            .lower_margin   = 0,
 150                .hsync_len      = 5,            .vsync_len      = 1,
 151
 152                .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
 153                .vmode          = FB_VMODE_NONINTERLACED,
 154        },
 155};
 156
 157static struct fb_monspecs at91fb_default_monspecs = {
 158        .manufacturer   = "HIT",
 159        .monitor        = "TX09D50VM1CCA",
 160
 161        .modedb         = at91_tft_vga_modes,
 162        .modedb_len     = ARRAY_SIZE(at91_tft_vga_modes),
 163        .hfmin          = 15000,
 164        .hfmax          = 64000,
 165        .vfmin          = 50,
 166        .vfmax          = 150,
 167};
 168
 169#define AT91SAM9RL_DEFAULT_LCDCON2      (ATMEL_LCDC_MEMOR_LITTLE \
 170                                        | ATMEL_LCDC_DISTYPE_TFT \
 171                                        | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
 172
 173static void at91_lcdc_power_control(int on)
 174{
 175        if (on)
 176                at91_set_gpio_value(AT91_PIN_PC1, 0);   /* power up */
 177        else
 178                at91_set_gpio_value(AT91_PIN_PC1, 1);   /* power down */
 179}
 180
 181/* Driver datas */
 182static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
 183        .lcdcon_is_backlight            = true,
 184        .default_bpp                    = 16,
 185        .default_dmacon                 = ATMEL_LCDC_DMAEN,
 186        .default_lcdcon2                = AT91SAM9RL_DEFAULT_LCDCON2,
 187        .default_monspecs               = &at91fb_default_monspecs,
 188        .atmel_lcdfb_power_control      = at91_lcdc_power_control,
 189        .guard_time                     = 1,
 190        .lcd_wiring_mode                = ATMEL_LCDC_WIRING_RGB,
 191};
 192
 193#else
 194static struct atmel_lcdfb_info __initdata ek_lcdc_data;
 195#endif
 196
 197
 198/*
 199 * AC97
 200 * reset_pin is not connected: NRST
 201 */
 202static struct ac97c_platform_data ek_ac97_data = {
 203        .reset_pin      = -EINVAL,
 204};
 205
 206
 207/*
 208 * LEDs
 209 */
 210static struct gpio_led ek_leds[] = {
 211        {       /* "bottom" led, green, userled1 to be defined */
 212                .name                   = "ds1",
 213                .gpio                   = AT91_PIN_PD15,
 214                .active_low             = 1,
 215                .default_trigger        = "none",
 216        },
 217        {       /* "bottom" led, green, userled2 to be defined */
 218                .name                   = "ds2",
 219                .gpio                   = AT91_PIN_PD16,
 220                .active_low             = 1,
 221                .default_trigger        = "none",
 222        },
 223        {       /* "power" led, yellow */
 224                .name                   = "ds3",
 225                .gpio                   = AT91_PIN_PD14,
 226                .default_trigger        = "heartbeat",
 227        }
 228};
 229
 230
 231/*
 232 * Touchscreen
 233 */
 234static struct at91_tsadcc_data ek_tsadcc_data = {
 235        .adc_clock              = 1000000,
 236        .pendet_debounce        = 0x0f,
 237        .ts_sample_hold_time    = 0x03,
 238};
 239
 240
 241/*
 242 * GPIO Buttons
 243 */
 244#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 245static struct gpio_keys_button ek_buttons[] = {
 246        {
 247                .gpio           = AT91_PIN_PB0,
 248                .code           = BTN_2,
 249                .desc           = "Right Click",
 250                .active_low     = 1,
 251                .wakeup         = 1,
 252        },
 253        {
 254                .gpio           = AT91_PIN_PB1,
 255                .code           = BTN_1,
 256                .desc           = "Left Click",
 257                .active_low     = 1,
 258                .wakeup         = 1,
 259        }
 260};
 261
 262static struct gpio_keys_platform_data ek_button_data = {
 263        .buttons        = ek_buttons,
 264        .nbuttons       = ARRAY_SIZE(ek_buttons),
 265};
 266
 267static struct platform_device ek_button_device = {
 268        .name           = "gpio-keys",
 269        .id             = -1,
 270        .num_resources  = 0,
 271        .dev            = {
 272                .platform_data  = &ek_button_data,
 273        }
 274};
 275
 276static void __init ek_add_device_buttons(void)
 277{
 278        at91_set_gpio_input(AT91_PIN_PB1, 1);   /* btn1 */
 279        at91_set_deglitch(AT91_PIN_PB1, 1);
 280        at91_set_gpio_input(AT91_PIN_PB0, 1);   /* btn2 */
 281        at91_set_deglitch(AT91_PIN_PB0, 1);
 282
 283        platform_device_register(&ek_button_device);
 284}
 285#else
 286static void __init ek_add_device_buttons(void) {}
 287#endif
 288
 289
 290static void __init ek_board_init(void)
 291{
 292        /* Serial */
 293        /* DBGU on ttyS0. (Rx & Tx only) */
 294        at91_register_uart(0, 0, 0);
 295
 296        /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) */
 297        at91_register_uart(AT91SAM9RL_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS);
 298        at91_add_device_serial();
 299        /* USB HS */
 300        at91_add_device_usba(&ek_usba_udc_data);
 301        /* I2C */
 302        at91_add_device_i2c(NULL, 0);
 303        /* NAND */
 304        ek_add_device_nand();
 305        /* SPI */
 306        at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
 307        /* MMC */
 308        at91_add_device_mci(0, &mci0_data);
 309        /* LCD Controller */
 310        at91_add_device_lcdc(&ek_lcdc_data);
 311        /* AC97 */
 312        at91_add_device_ac97(&ek_ac97_data);
 313        /* Touch Screen Controller */
 314        at91_add_device_tsadcc(&ek_tsadcc_data);
 315        /* LEDs */
 316        at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
 317        /* Push Buttons */
 318        ek_add_device_buttons();
 319}
 320
 321MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")
 322        /* Maintainer: Atmel */
 323        .init_time      = at91sam926x_pit_init,
 324        .map_io         = at91_map_io,
 325        .handle_irq     = at91_aic_handle_irq,
 326        .init_early     = ek_init_early,
 327        .init_irq       = at91_init_irq_default,
 328        .init_machine   = ek_board_init,
 329MACHINE_END
 330