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