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