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