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