linux/arch/arm/mach-at91/board-sam9261ek.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-at91/board-sam9261ek.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/ads7846.h>
  30#include <linux/spi/at73c213.h>
  31#include <linux/clk.h>
  32#include <linux/dm9000.h>
  33#include <linux/fb.h>
  34#include <linux/gpio_keys.h>
  35#include <linux/input.h>
  36
  37#include <video/atmel_lcdc.h>
  38
  39#include <asm/setup.h>
  40#include <asm/mach-types.h>
  41#include <asm/irq.h>
  42
  43#include <asm/mach/arch.h>
  44#include <asm/mach/map.h>
  45#include <asm/mach/irq.h>
  46
  47#include <mach/hardware.h>
  48#include <mach/at91sam9_smc.h>
  49#include <mach/system_rev.h>
  50
  51#include "at91_aic.h"
  52#include "at91_shdwc.h"
  53#include "board.h"
  54#include "sam9_smc.h"
  55#include "generic.h"
  56
  57
  58static void __init ek_init_early(void)
  59{
  60        /* Initialize processor: 18.432 MHz crystal */
  61        at91_initialize(18432000);
  62}
  63
  64/*
  65 * DM9000 ethernet device
  66 */
  67#if defined(CONFIG_DM9000)
  68static struct resource dm9000_resource[] = {
  69        [0] = {
  70                .start  = AT91_CHIPSELECT_2,
  71                .end    = AT91_CHIPSELECT_2 + 3,
  72                .flags  = IORESOURCE_MEM
  73        },
  74        [1] = {
  75                .start  = AT91_CHIPSELECT_2 + 0x44,
  76                .end    = AT91_CHIPSELECT_2 + 0xFF,
  77                .flags  = IORESOURCE_MEM
  78        },
  79        [2] = {
  80                .flags  = IORESOURCE_IRQ
  81                        | IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE,
  82        }
  83};
  84
  85static struct dm9000_plat_data dm9000_platdata = {
  86        .flags          = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
  87};
  88
  89static struct platform_device dm9000_device = {
  90        .name           = "dm9000",
  91        .id             = 0,
  92        .num_resources  = ARRAY_SIZE(dm9000_resource),
  93        .resource       = dm9000_resource,
  94        .dev            = {
  95                .platform_data  = &dm9000_platdata,
  96        }
  97};
  98
  99/*
 100 * SMC timings for the DM9000.
 101 * Note: These timings were calculated for MASTER_CLOCK = 100000000 according to the DM9000 timings.
 102 */
 103static struct sam9_smc_config __initdata dm9000_smc_config = {
 104        .ncs_read_setup         = 0,
 105        .nrd_setup              = 2,
 106        .ncs_write_setup        = 0,
 107        .nwe_setup              = 2,
 108
 109        .ncs_read_pulse         = 8,
 110        .nrd_pulse              = 4,
 111        .ncs_write_pulse        = 8,
 112        .nwe_pulse              = 4,
 113
 114        .read_cycle             = 16,
 115        .write_cycle            = 16,
 116
 117        .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE | AT91_SMC_DBW_16,
 118        .tdf_cycles             = 1,
 119};
 120
 121static void __init ek_add_device_dm9000(void)
 122{
 123        struct resource *r = &dm9000_resource[2];
 124
 125        /* Configure chip-select 2 (DM9000) */
 126        sam9_smc_configure(0, 2, &dm9000_smc_config);
 127
 128        /* Configure Reset signal as output */
 129        at91_set_gpio_output(AT91_PIN_PC10, 0);
 130
 131        /* Configure Interrupt pin as input, no pull-up */
 132        at91_set_gpio_input(AT91_PIN_PC11, 0);
 133
 134        r->start = r->end = gpio_to_irq(AT91_PIN_PC11);
 135        platform_device_register(&dm9000_device);
 136}
 137#else
 138static void __init ek_add_device_dm9000(void) {}
 139#endif /* CONFIG_DM9000 */
 140
 141
 142/*
 143 * USB Host Port
 144 */
 145static struct at91_usbh_data __initdata ek_usbh_data = {
 146        .ports          = 2,
 147        .vbus_pin       = {-EINVAL, -EINVAL},
 148        .overcurrent_pin= {-EINVAL, -EINVAL},
 149};
 150
 151
 152/*
 153 * USB Device Port
 154 */
 155static struct at91_udc_data __initdata ek_udc_data = {
 156        .vbus_pin       = AT91_PIN_PB29,
 157        .pullup_pin     = -EINVAL,              /* pull-up driven by UDC */
 158};
 159
 160
 161/*
 162 * NAND flash
 163 */
 164static struct mtd_partition __initdata ek_nand_partition[] = {
 165        {
 166                .name   = "Partition 1",
 167                .offset = 0,
 168                .size   = SZ_256K,
 169        },
 170        {
 171                .name   = "Partition 2",
 172                .offset = MTDPART_OFS_NXTBLK,
 173                .size   = MTDPART_SIZ_FULL,
 174        },
 175};
 176
 177static struct atmel_nand_data __initdata ek_nand_data = {
 178        .ale            = 22,
 179        .cle            = 21,
 180        .det_pin        = -EINVAL,
 181        .rdy_pin        = AT91_PIN_PC15,
 182        .enable_pin     = AT91_PIN_PC14,
 183        .ecc_mode       = NAND_ECC_SOFT,
 184        .on_flash_bbt   = 1,
 185        .parts          = ek_nand_partition,
 186        .num_parts      = ARRAY_SIZE(ek_nand_partition),
 187};
 188
 189static struct sam9_smc_config __initdata ek_nand_smc_config = {
 190        .ncs_read_setup         = 0,
 191        .nrd_setup              = 1,
 192        .ncs_write_setup        = 0,
 193        .nwe_setup              = 1,
 194
 195        .ncs_read_pulse         = 3,
 196        .nrd_pulse              = 3,
 197        .ncs_write_pulse        = 3,
 198        .nwe_pulse              = 3,
 199
 200        .read_cycle             = 5,
 201        .write_cycle            = 5,
 202
 203        .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
 204        .tdf_cycles             = 2,
 205};
 206
 207static void __init ek_add_device_nand(void)
 208{
 209        ek_nand_data.bus_width_16 = board_have_nand_16bit();
 210        /* setup bus-width (8 or 16) */
 211        if (ek_nand_data.bus_width_16)
 212                ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
 213        else
 214                ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
 215
 216        /* configure chip-select 3 (NAND) */
 217        sam9_smc_configure(0, 3, &ek_nand_smc_config);
 218
 219        at91_add_device_nand(&ek_nand_data);
 220}
 221
 222/*
 223 * SPI related devices
 224 */
 225#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
 226
 227/*
 228 * ADS7846 Touchscreen
 229 */
 230#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
 231
 232static int ads7843_pendown_state(void)
 233{
 234        return !at91_get_gpio_value(AT91_PIN_PC2);      /* Touchscreen PENIRQ */
 235}
 236
 237static struct ads7846_platform_data ads_info = {
 238        .model                  = 7843,
 239        .x_min                  = 150,
 240        .x_max                  = 3830,
 241        .y_min                  = 190,
 242        .y_max                  = 3830,
 243        .vref_delay_usecs       = 100,
 244        .x_plate_ohms           = 450,
 245        .y_plate_ohms           = 250,
 246        .pressure_max           = 15000,
 247        .debounce_max           = 1,
 248        .debounce_rep           = 0,
 249        .debounce_tol           = (~0),
 250        .get_pendown_state      = ads7843_pendown_state,
 251};
 252
 253static void __init ek_add_device_ts(void)
 254{
 255        at91_set_B_periph(AT91_PIN_PC2, 1);     /* External IRQ0, with pullup */
 256        at91_set_gpio_input(AT91_PIN_PA11, 1);  /* Touchscreen BUSY signal */
 257}
 258#else
 259static void __init ek_add_device_ts(void) {}
 260#endif
 261
 262/*
 263 * Audio
 264 */
 265static struct at73c213_board_info at73c213_data = {
 266        .ssc_id         = 1,
 267#if defined(CONFIG_MACH_AT91SAM9261EK)
 268        .shortname      = "AT91SAM9261-EK external DAC",
 269#else
 270        .shortname      = "AT91SAM9G10-EK external DAC",
 271#endif
 272};
 273
 274#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
 275static void __init at73c213_set_clk(struct at73c213_board_info *info)
 276{
 277        struct clk *pck2;
 278        struct clk *plla;
 279
 280        pck2 = clk_get(NULL, "pck2");
 281        plla = clk_get(NULL, "plla");
 282
 283        /* AT73C213 MCK Clock */
 284        at91_set_B_periph(AT91_PIN_PB31, 0);    /* PCK2 */
 285
 286        clk_set_parent(pck2, plla);
 287        clk_put(plla);
 288
 289        info->dac_clk = pck2;
 290}
 291#else
 292static void __init at73c213_set_clk(struct at73c213_board_info *info) {}
 293#endif
 294
 295/*
 296 * SPI devices
 297 */
 298static struct spi_board_info ek_spi_devices[] = {
 299        {       /* DataFlash chip */
 300                .modalias       = "mtd_dataflash",
 301                .chip_select    = 0,
 302                .max_speed_hz   = 15 * 1000 * 1000,
 303                .bus_num        = 0,
 304        },
 305#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
 306        {
 307                .modalias       = "ads7846",
 308                .chip_select    = 2,
 309                .max_speed_hz   = 125000 * 26,  /* (max sample rate @ 3V) * (cmd + data + overhead) */
 310                .bus_num        = 0,
 311                .platform_data  = &ads_info,
 312                .irq            = NR_IRQS_LEGACY + AT91SAM9261_ID_IRQ0,
 313                .controller_data = (void *) AT91_PIN_PA28,      /* CS pin */
 314        },
 315#endif
 316#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
 317        {       /* DataFlash card - jumper (J12) configurable to CS3 or CS0 */
 318                .modalias       = "mtd_dataflash",
 319                .chip_select    = 3,
 320                .max_speed_hz   = 15 * 1000 * 1000,
 321                .bus_num        = 0,
 322        },
 323#elif defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
 324        {       /* AT73C213 DAC */
 325                .modalias       = "at73c213",
 326                .chip_select    = 3,
 327                .max_speed_hz   = 10 * 1000 * 1000,
 328                .bus_num        = 0,
 329                .mode           = SPI_MODE_1,
 330                .platform_data  = &at73c213_data,
 331                .controller_data = (void*) AT91_PIN_PA29,       /* default for CS3 is PA6, but it must be PA29 */
 332        },
 333#endif
 334};
 335
 336#else /* CONFIG_SPI_ATMEL_* */
 337/* spi0 and mmc/sd share the same PIO pins: cannot be used at the same time */
 338
 339/*
 340 * MCI (SD/MMC)
 341 * det_pin, wp_pin and vcc_pin are not connected
 342 */
 343static struct mci_platform_data __initdata mci0_data = {
 344        .slot[0] = {
 345                .bus_width      = 4,
 346                .detect_pin     = -EINVAL,
 347                .wp_pin         = -EINVAL,
 348        },
 349};
 350
 351#endif /* CONFIG_SPI_ATMEL_* */
 352
 353
 354/*
 355 * LCD Controller
 356 */
 357#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
 358
 359#if defined(CONFIG_FB_ATMEL_STN)
 360
 361/* STN */
 362static struct fb_videomode at91_stn_modes[] = {
 363        {
 364                .name           = "SP06Q002 @ 75",
 365                .refresh        = 75,
 366                .xres           = 320,          .yres           = 240,
 367                .pixclock       = KHZ2PICOS(1440),
 368
 369                .left_margin    = 1,            .right_margin   = 1,
 370                .upper_margin   = 0,            .lower_margin   = 0,
 371                .hsync_len      = 1,            .vsync_len      = 1,
 372
 373                .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
 374                .vmode          = FB_VMODE_NONINTERLACED,
 375        },
 376};
 377
 378static struct fb_monspecs at91fb_default_stn_monspecs = {
 379        .manufacturer   = "HIT",
 380        .monitor        = "SP06Q002",
 381
 382        .modedb         = at91_stn_modes,
 383        .modedb_len     = ARRAY_SIZE(at91_stn_modes),
 384        .hfmin          = 15000,
 385        .hfmax          = 64000,
 386        .vfmin          = 50,
 387        .vfmax          = 150,
 388};
 389
 390#define AT91SAM9261_DEFAULT_STN_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
 391                                        | ATMEL_LCDC_DISTYPE_STNMONO \
 392                                        | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE \
 393                                        | ATMEL_LCDC_IFWIDTH_4 \
 394                                        | ATMEL_LCDC_SCANMOD_SINGLE)
 395
 396static void at91_lcdc_stn_power_control(int on)
 397{
 398        /* backlight */
 399        if (on) {       /* power up */
 400                at91_set_gpio_value(AT91_PIN_PC14, 0);
 401                at91_set_gpio_value(AT91_PIN_PC15, 0);
 402        } else {        /* power down */
 403                at91_set_gpio_value(AT91_PIN_PC14, 1);
 404                at91_set_gpio_value(AT91_PIN_PC15, 1);
 405        }
 406}
 407
 408static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
 409        .default_bpp                    = 1,
 410        .default_dmacon                 = ATMEL_LCDC_DMAEN,
 411        .default_lcdcon2                = AT91SAM9261_DEFAULT_STN_LCDCON2,
 412        .default_monspecs               = &at91fb_default_stn_monspecs,
 413        .atmel_lcdfb_power_control      = at91_lcdc_stn_power_control,
 414        .guard_time                     = 1,
 415#if defined(CONFIG_MACH_AT91SAM9G10EK)
 416        .lcd_wiring_mode                = ATMEL_LCDC_WIRING_RGB,
 417#endif
 418};
 419
 420#else
 421
 422/* TFT */
 423static struct fb_videomode at91_tft_vga_modes[] = {
 424        {
 425                .name           = "TX09D50VM1CCA @ 60",
 426                .refresh        = 60,
 427                .xres           = 240,          .yres           = 320,
 428                .pixclock       = KHZ2PICOS(4965),
 429
 430                .left_margin    = 1,            .right_margin   = 33,
 431                .upper_margin   = 1,            .lower_margin   = 0,
 432                .hsync_len      = 5,            .vsync_len      = 1,
 433
 434                .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
 435                .vmode          = FB_VMODE_NONINTERLACED,
 436        },
 437};
 438
 439static struct fb_monspecs at91fb_default_tft_monspecs = {
 440        .manufacturer   = "HIT",
 441        .monitor        = "TX09D50VM1CCA",
 442
 443        .modedb         = at91_tft_vga_modes,
 444        .modedb_len     = ARRAY_SIZE(at91_tft_vga_modes),
 445        .hfmin          = 15000,
 446        .hfmax          = 64000,
 447        .vfmin          = 50,
 448        .vfmax          = 150,
 449};
 450
 451#define AT91SAM9261_DEFAULT_TFT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
 452                                        | ATMEL_LCDC_DISTYPE_TFT    \
 453                                        | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
 454
 455static void at91_lcdc_tft_power_control(int on)
 456{
 457        if (on)
 458                at91_set_gpio_value(AT91_PIN_PA12, 0);  /* power up */
 459        else
 460                at91_set_gpio_value(AT91_PIN_PA12, 1);  /* power down */
 461}
 462
 463static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
 464        .lcdcon_is_backlight            = true,
 465        .default_bpp                    = 16,
 466        .default_dmacon                 = ATMEL_LCDC_DMAEN,
 467        .default_lcdcon2                = AT91SAM9261_DEFAULT_TFT_LCDCON2,
 468        .default_monspecs               = &at91fb_default_tft_monspecs,
 469        .atmel_lcdfb_power_control      = at91_lcdc_tft_power_control,
 470        .guard_time                     = 1,
 471#if defined(CONFIG_MACH_AT91SAM9G10EK)
 472        .lcd_wiring_mode                = ATMEL_LCDC_WIRING_RGB,
 473#endif
 474};
 475#endif
 476
 477#else
 478static struct atmel_lcdfb_info __initdata ek_lcdc_data;
 479#endif
 480
 481
 482/*
 483 * GPIO Buttons
 484 */
 485#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 486static struct gpio_keys_button ek_buttons[] = {
 487        {
 488                .gpio           = AT91_PIN_PA27,
 489                .code           = BTN_0,
 490                .desc           = "Button 0",
 491                .active_low     = 1,
 492                .wakeup         = 1,
 493        },
 494        {
 495                .gpio           = AT91_PIN_PA26,
 496                .code           = BTN_1,
 497                .desc           = "Button 1",
 498                .active_low     = 1,
 499                .wakeup         = 1,
 500        },
 501        {
 502                .gpio           = AT91_PIN_PA25,
 503                .code           = BTN_2,
 504                .desc           = "Button 2",
 505                .active_low     = 1,
 506                .wakeup         = 1,
 507        },
 508        {
 509                .gpio           = AT91_PIN_PA24,
 510                .code           = BTN_3,
 511                .desc           = "Button 3",
 512                .active_low     = 1,
 513                .wakeup         = 1,
 514        }
 515};
 516
 517static struct gpio_keys_platform_data ek_button_data = {
 518        .buttons        = ek_buttons,
 519        .nbuttons       = ARRAY_SIZE(ek_buttons),
 520};
 521
 522static struct platform_device ek_button_device = {
 523        .name           = "gpio-keys",
 524        .id             = -1,
 525        .num_resources  = 0,
 526        .dev            = {
 527                .platform_data  = &ek_button_data,
 528        }
 529};
 530
 531static void __init ek_add_device_buttons(void)
 532{
 533        at91_set_gpio_input(AT91_PIN_PA27, 1);  /* btn0 */
 534        at91_set_deglitch(AT91_PIN_PA27, 1);
 535        at91_set_gpio_input(AT91_PIN_PA26, 1);  /* btn1 */
 536        at91_set_deglitch(AT91_PIN_PA26, 1);
 537        at91_set_gpio_input(AT91_PIN_PA25, 1);  /* btn2 */
 538        at91_set_deglitch(AT91_PIN_PA25, 1);
 539        at91_set_gpio_input(AT91_PIN_PA24, 1);  /* btn3 */
 540        at91_set_deglitch(AT91_PIN_PA24, 1);
 541
 542        platform_device_register(&ek_button_device);
 543}
 544#else
 545static void __init ek_add_device_buttons(void) {}
 546#endif
 547
 548/*
 549 * LEDs
 550 */
 551static struct gpio_led ek_leds[] = {
 552        {       /* "bottom" led, green, userled1 to be defined */
 553                .name                   = "ds7",
 554                .gpio                   = AT91_PIN_PA14,
 555                .active_low             = 1,
 556                .default_trigger        = "none",
 557        },
 558        {       /* "top" led, green, userled2 to be defined */
 559                .name                   = "ds8",
 560                .gpio                   = AT91_PIN_PA13,
 561                .active_low             = 1,
 562                .default_trigger        = "none",
 563        },
 564        {       /* "power" led, yellow */
 565                .name                   = "ds1",
 566                .gpio                   = AT91_PIN_PA23,
 567                .default_trigger        = "heartbeat",
 568        }
 569};
 570
 571static void __init ek_board_init(void)
 572{
 573        /* Serial */
 574        /* DBGU on ttyS0. (Rx & Tx only) */
 575        at91_register_uart(0, 0, 0);
 576        at91_add_device_serial();
 577        /* USB Host */
 578        at91_add_device_usbh(&ek_usbh_data);
 579        /* USB Device */
 580        at91_add_device_udc(&ek_udc_data);
 581        /* I2C */
 582        at91_add_device_i2c(NULL, 0);
 583        /* NAND */
 584        ek_add_device_nand();
 585        /* DM9000 ethernet */
 586        ek_add_device_dm9000();
 587
 588        /* spi0 and mmc/sd share the same PIO pins */
 589#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
 590        /* SPI */
 591        at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
 592        /* Touchscreen */
 593        ek_add_device_ts();
 594        /* SSC (to AT73C213) */
 595        at73c213_set_clk(&at73c213_data);
 596        at91_add_device_ssc(AT91SAM9261_ID_SSC1, ATMEL_SSC_TX);
 597#else
 598        /* MMC */
 599        at91_add_device_mci(0, &mci0_data);
 600#endif
 601        /* LCD Controller */
 602        at91_add_device_lcdc(&ek_lcdc_data);
 603        /* Push Buttons */
 604        ek_add_device_buttons();
 605        /* LEDs */
 606        at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
 607}
 608
 609#if defined(CONFIG_MACH_AT91SAM9261EK)
 610MACHINE_START(AT91SAM9261EK, "Atmel AT91SAM9261-EK")
 611#else
 612MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK")
 613#endif
 614        /* Maintainer: Atmel */
 615        .init_time      = at91sam926x_pit_init,
 616        .map_io         = at91_map_io,
 617        .handle_irq     = at91_aic_handle_irq,
 618        .init_early     = ek_init_early,
 619        .init_irq       = at91_init_irq_default,
 620        .init_machine   = ek_board_init,
 621MACHINE_END
 622