linux/arch/arm/mach-at91/board-sam9263ek.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-at91/board-sam9263ek.c
   3 *
   4 *  Copyright (C) 2005 SAN People
   5 *  Copyright (C) 2007 Atmel Corporation.
   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/ads7846.h>
  30#include <linux/i2c/at24.h>
  31#include <linux/fb.h>
  32#include <linux/gpio_keys.h>
  33#include <linux/input.h>
  34#include <linux/leds.h>
  35
  36#include <video/atmel_lcdc.h>
  37
  38#include <asm/setup.h>
  39#include <asm/mach-types.h>
  40#include <asm/irq.h>
  41
  42#include <asm/mach/arch.h>
  43#include <asm/mach/map.h>
  44#include <asm/mach/irq.h>
  45
  46#include <mach/hardware.h>
  47#include <mach/at91sam9_smc.h>
  48#include <mach/system_rev.h>
  49
  50#include "at91_aic.h"
  51#include "at91_shdwc.h"
  52#include "board.h"
  53#include "sam9_smc.h"
  54#include "generic.h"
  55
  56
  57static void __init ek_init_early(void)
  58{
  59        /* Initialize processor: 16.367 MHz crystal */
  60        at91_initialize(16367660);
  61}
  62
  63/*
  64 * USB Host port
  65 */
  66static struct at91_usbh_data __initdata ek_usbh_data = {
  67        .ports          = 2,
  68        .vbus_pin       = { AT91_PIN_PA24, AT91_PIN_PA21 },
  69        .vbus_pin_active_low = {1, 1},
  70        .overcurrent_pin= {-EINVAL, -EINVAL},
  71};
  72
  73/*
  74 * USB Device port
  75 */
  76static struct at91_udc_data __initdata ek_udc_data = {
  77        .vbus_pin       = AT91_PIN_PA25,
  78        .pullup_pin     = -EINVAL,              /* pull-up driven by UDC */
  79};
  80
  81
  82/*
  83 * ADS7846 Touchscreen
  84 */
  85#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
  86static int ads7843_pendown_state(void)
  87{
  88        return !at91_get_gpio_value(AT91_PIN_PA15);     /* Touchscreen PENIRQ */
  89}
  90
  91static struct ads7846_platform_data ads_info = {
  92        .model                  = 7843,
  93        .x_min                  = 150,
  94        .x_max                  = 3830,
  95        .y_min                  = 190,
  96        .y_max                  = 3830,
  97        .vref_delay_usecs       = 100,
  98        .x_plate_ohms           = 450,
  99        .y_plate_ohms           = 250,
 100        .pressure_max           = 15000,
 101        .debounce_max           = 1,
 102        .debounce_rep           = 0,
 103        .debounce_tol           = (~0),
 104        .get_pendown_state      = ads7843_pendown_state,
 105};
 106
 107static void __init ek_add_device_ts(void)
 108{
 109        at91_set_B_periph(AT91_PIN_PA15, 1);    /* External IRQ1, with pullup */
 110        at91_set_gpio_input(AT91_PIN_PA31, 1);  /* Touchscreen BUSY signal */
 111}
 112#else
 113static void __init ek_add_device_ts(void) {}
 114#endif
 115
 116/*
 117 * SPI devices.
 118 */
 119static struct spi_board_info ek_spi_devices[] = {
 120#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
 121        {       /* DataFlash card */
 122                .modalias       = "mtd_dataflash",
 123                .chip_select    = 0,
 124                .max_speed_hz   = 15 * 1000 * 1000,
 125                .bus_num        = 0,
 126        },
 127#endif
 128#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
 129        {
 130                .modalias       = "ads7846",
 131                .chip_select    = 3,
 132                .max_speed_hz   = 125000 * 26,  /* (max sample rate @ 3V) * (cmd + data + overhead) */
 133                .bus_num        = 0,
 134                .platform_data  = &ads_info,
 135                .irq            = NR_IRQS_LEGACY + AT91SAM9263_ID_IRQ1,
 136        },
 137#endif
 138};
 139
 140
 141/*
 142 * MCI (SD/MMC)
 143 */
 144static struct mci_platform_data __initdata mci1_data = {
 145        .slot[0] = {
 146                .bus_width      = 4,
 147                .detect_pin     = AT91_PIN_PE18,
 148                .wp_pin         = AT91_PIN_PE19,
 149        },
 150};
 151
 152
 153/*
 154 * MACB Ethernet device
 155 */
 156static struct macb_platform_data __initdata ek_macb_data = {
 157        .phy_irq_pin    = AT91_PIN_PE31,
 158        .is_rmii        = 1,
 159};
 160
 161
 162/*
 163 * NAND flash
 164 */
 165static struct mtd_partition __initdata ek_nand_partition[] = {
 166        {
 167                .name   = "Partition 1",
 168                .offset = 0,
 169                .size   = SZ_64M,
 170        },
 171        {
 172                .name   = "Partition 2",
 173                .offset = MTDPART_OFS_NXTBLK,
 174                .size   = MTDPART_SIZ_FULL,
 175        },
 176};
 177
 178static struct atmel_nand_data __initdata ek_nand_data = {
 179        .ale            = 21,
 180        .cle            = 22,
 181        .det_pin        = -EINVAL,
 182        .rdy_pin        = AT91_PIN_PA22,
 183        .enable_pin     = AT91_PIN_PD15,
 184        .ecc_mode       = NAND_ECC_SOFT,
 185        .on_flash_bbt   = 1,
 186        .parts          = ek_nand_partition,
 187        .num_parts      = ARRAY_SIZE(ek_nand_partition),
 188};
 189
 190static struct sam9_smc_config __initdata ek_nand_smc_config = {
 191        .ncs_read_setup         = 0,
 192        .nrd_setup              = 1,
 193        .ncs_write_setup        = 0,
 194        .nwe_setup              = 1,
 195
 196        .ncs_read_pulse         = 3,
 197        .nrd_pulse              = 3,
 198        .ncs_write_pulse        = 3,
 199        .nwe_pulse              = 3,
 200
 201        .read_cycle             = 5,
 202        .write_cycle            = 5,
 203
 204        .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
 205        .tdf_cycles             = 2,
 206};
 207
 208static void __init ek_add_device_nand(void)
 209{
 210        ek_nand_data.bus_width_16 = board_have_nand_16bit();
 211        /* setup bus-width (8 or 16) */
 212        if (ek_nand_data.bus_width_16)
 213                ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
 214        else
 215                ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
 216
 217        /* configure chip-select 3 (NAND) */
 218        sam9_smc_configure(0, 3, &ek_nand_smc_config);
 219
 220        at91_add_device_nand(&ek_nand_data);
 221}
 222
 223
 224/*
 225 * I2C devices
 226 */
 227static struct at24_platform_data at24c512 = {
 228        .byte_len       = SZ_512K / 8,
 229        .page_size      = 128,
 230        .flags          = AT24_FLAG_ADDR16,
 231};
 232
 233
 234static struct i2c_board_info __initdata ek_i2c_devices[] = {
 235        {
 236                I2C_BOARD_INFO("24c512", 0x50),
 237                .platform_data = &at24c512,
 238        },
 239        /* more devices can be added using expansion connectors */
 240};
 241
 242/*
 243 * LCD Controller
 244 */
 245#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
 246static struct fb_videomode at91_tft_vga_modes[] = {
 247        {
 248                .name           = "TX09D50VM1CCA @ 60",
 249                .refresh        = 60,
 250                .xres           = 240,          .yres           = 320,
 251                .pixclock       = KHZ2PICOS(4965),
 252
 253                .left_margin    = 1,            .right_margin   = 33,
 254                .upper_margin   = 1,            .lower_margin   = 0,
 255                .hsync_len      = 5,            .vsync_len      = 1,
 256
 257                .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
 258                .vmode          = FB_VMODE_NONINTERLACED,
 259        },
 260};
 261
 262static struct fb_monspecs at91fb_default_monspecs = {
 263        .manufacturer   = "HIT",
 264        .monitor        = "TX09D70VM1CCA",
 265
 266        .modedb         = at91_tft_vga_modes,
 267        .modedb_len     = ARRAY_SIZE(at91_tft_vga_modes),
 268        .hfmin          = 15000,
 269        .hfmax          = 64000,
 270        .vfmin          = 50,
 271        .vfmax          = 150,
 272};
 273
 274#define AT91SAM9263_DEFAULT_LCDCON2     (ATMEL_LCDC_MEMOR_LITTLE \
 275                                        | ATMEL_LCDC_DISTYPE_TFT \
 276                                        | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
 277
 278static void at91_lcdc_power_control(int on)
 279{
 280        at91_set_gpio_value(AT91_PIN_PA30, on);
 281}
 282
 283/* Driver datas */
 284static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
 285        .lcdcon_is_backlight            = true,
 286        .default_bpp                    = 16,
 287        .default_dmacon                 = ATMEL_LCDC_DMAEN,
 288        .default_lcdcon2                = AT91SAM9263_DEFAULT_LCDCON2,
 289        .default_monspecs               = &at91fb_default_monspecs,
 290        .atmel_lcdfb_power_control      = at91_lcdc_power_control,
 291        .guard_time                     = 1,
 292};
 293
 294#else
 295static struct atmel_lcdfb_info __initdata ek_lcdc_data;
 296#endif
 297
 298
 299/*
 300 * GPIO Buttons
 301 */
 302#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 303static struct gpio_keys_button ek_buttons[] = {
 304        {       /* BP1, "leftclic" */
 305                .code           = BTN_LEFT,
 306                .gpio           = AT91_PIN_PC5,
 307                .active_low     = 1,
 308                .desc           = "left_click",
 309                .wakeup         = 1,
 310        },
 311        {       /* BP2, "rightclic" */
 312                .code           = BTN_RIGHT,
 313                .gpio           = AT91_PIN_PC4,
 314                .active_low     = 1,
 315                .desc           = "right_click",
 316                .wakeup         = 1,
 317        }
 318};
 319
 320static struct gpio_keys_platform_data ek_button_data = {
 321        .buttons        = ek_buttons,
 322        .nbuttons       = ARRAY_SIZE(ek_buttons),
 323};
 324
 325static struct platform_device ek_button_device = {
 326        .name           = "gpio-keys",
 327        .id             = -1,
 328        .num_resources  = 0,
 329        .dev            = {
 330                .platform_data  = &ek_button_data,
 331        }
 332};
 333
 334static void __init ek_add_device_buttons(void)
 335{
 336        at91_set_GPIO_periph(AT91_PIN_PC5, 1);  /* left button */
 337        at91_set_deglitch(AT91_PIN_PC5, 1);
 338        at91_set_GPIO_periph(AT91_PIN_PC4, 1);  /* right button */
 339        at91_set_deglitch(AT91_PIN_PC4, 1);
 340
 341        platform_device_register(&ek_button_device);
 342}
 343#else
 344static void __init ek_add_device_buttons(void) {}
 345#endif
 346
 347
 348/*
 349 * AC97
 350 * reset_pin is not connected: NRST
 351 */
 352static struct ac97c_platform_data ek_ac97_data = {
 353        .reset_pin      = -EINVAL,
 354};
 355
 356
 357/*
 358 * LEDs ... these could all be PWM-driven, for variable brightness
 359 */
 360static struct gpio_led ek_leds[] = {
 361        {       /* "right" led, green, userled2 (could be driven by pwm2) */
 362                .name                   = "ds2",
 363                .gpio                   = AT91_PIN_PC29,
 364                .active_low             = 1,
 365                .default_trigger        = "nand-disk",
 366        },
 367        {       /* "power" led, yellow (could be driven by pwm0) */
 368                .name                   = "ds3",
 369                .gpio                   = AT91_PIN_PB7,
 370                .default_trigger        = "heartbeat",
 371        }
 372};
 373
 374/*
 375 * PWM Leds
 376 */
 377static struct gpio_led ek_pwm_led[] = {
 378        /* For now only DS1 is PWM-driven (by pwm1) */
 379        {
 380                .name                   = "ds1",
 381                .gpio                   = 1,    /* is PWM channel number */
 382                .active_low             = 1,
 383                .default_trigger        = "none",
 384        }
 385};
 386
 387/*
 388 * CAN
 389 */
 390static void sam9263ek_transceiver_switch(int on)
 391{
 392        if (on) {
 393                at91_set_gpio_output(AT91_PIN_PA18, 1); /* CANRXEN */
 394                at91_set_gpio_output(AT91_PIN_PA19, 0); /* CANRS */
 395        } else {
 396                at91_set_gpio_output(AT91_PIN_PA18, 0); /* CANRXEN */
 397                at91_set_gpio_output(AT91_PIN_PA19, 1); /* CANRS */
 398        }
 399}
 400
 401static struct at91_can_data ek_can_data = {
 402        .transceiver_switch = sam9263ek_transceiver_switch,
 403};
 404
 405static void __init ek_board_init(void)
 406{
 407        /* Serial */
 408        /* DBGU on ttyS0. (Rx & Tx only) */
 409        at91_register_uart(0, 0, 0);
 410
 411        /* USART0 on ttyS1. (Rx, Tx, RTS, CTS) */
 412        at91_register_uart(AT91SAM9263_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS);
 413        at91_add_device_serial();
 414        /* USB Host */
 415        at91_add_device_usbh(&ek_usbh_data);
 416        /* USB Device */
 417        at91_add_device_udc(&ek_udc_data);
 418        /* SPI */
 419        at91_set_gpio_output(AT91_PIN_PE20, 1);         /* select spi0 clock */
 420        at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
 421        /* Touchscreen */
 422        ek_add_device_ts();
 423        /* MMC */
 424        at91_add_device_mci(1, &mci1_data);
 425        /* Ethernet */
 426        at91_add_device_eth(&ek_macb_data);
 427        /* NAND */
 428        ek_add_device_nand();
 429        /* I2C */
 430        at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
 431        /* LCD Controller */
 432        at91_add_device_lcdc(&ek_lcdc_data);
 433        /* Push Buttons */
 434        ek_add_device_buttons();
 435        /* AC97 */
 436        at91_add_device_ac97(&ek_ac97_data);
 437        /* LEDs */
 438        at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
 439        at91_pwm_leds(ek_pwm_led, ARRAY_SIZE(ek_pwm_led));
 440        /* CAN */
 441        at91_add_device_can(&ek_can_data);
 442}
 443
 444MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")
 445        /* Maintainer: Atmel */
 446        .init_time      = at91sam926x_pit_init,
 447        .map_io         = at91_map_io,
 448        .handle_irq     = at91_aic_handle_irq,
 449        .init_early     = ek_init_early,
 450        .init_irq       = at91_init_irq_default,
 451        .init_machine   = ek_board_init,
 452MACHINE_END
 453