1/* 2 * Copyright 2004-2009 Analog Devices Inc. 3 * 2005 National ICT Australia (NICTA) 4 * Aidan Williams <aidan@nicta.com.au> 5 * 6 * Licensed under the GPL-2 or later. 7 */ 8 9#include <linux/device.h> 10#include <linux/platform_device.h> 11#include <linux/mtd/mtd.h> 12#include <linux/mtd/partitions.h> 13#include <linux/mtd/plat-ram.h> 14#include <linux/mtd/physmap.h> 15#include <linux/spi/spi.h> 16#include <linux/spi/flash.h> 17#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) 18#include <linux/usb/isp1362.h> 19#endif 20#include <linux/irq.h> 21#include <linux/i2c.h> 22#include <asm/dma.h> 23#include <asm/bfin5xx_spi.h> 24#include <asm/portmux.h> 25#include <asm/dpmc.h> 26 27/* 28 * Name the Board for the /proc/cpuinfo 29 */ 30const char bfin_board_name[] = "ADI BF533-EZKIT"; 31 32#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) 33static struct platform_device rtc_device = { 34 .name = "rtc-bfin", 35 .id = -1, 36}; 37#endif 38 39/* 40 * USB-LAN EzExtender board 41 * Driver needs to know address, irq and flag pin. 42 */ 43#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) 44#include <linux/smc91x.h> 45 46static struct smc91x_platdata smc91x_info = { 47 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, 48 .leda = RPC_LED_100_10, 49 .ledb = RPC_LED_TX_RX, 50}; 51 52static struct resource smc91x_resources[] = { 53 { 54 .name = "smc91x-regs", 55 .start = 0x20310300, 56 .end = 0x20310300 + 16, 57 .flags = IORESOURCE_MEM, 58 }, { 59 .start = IRQ_PF9, 60 .end = IRQ_PF9, 61 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 62 }, 63}; 64static struct platform_device smc91x_device = { 65 .name = "smc91x", 66 .id = 0, 67 .num_resources = ARRAY_SIZE(smc91x_resources), 68 .resource = smc91x_resources, 69 .dev = { 70 .platform_data = &smc91x_info, 71 }, 72}; 73#endif 74 75#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) 76static struct mtd_partition ezkit_partitions_a[] = { 77 { 78 .name = "bootloader(nor a)", 79 .size = 0x40000, 80 .offset = 0, 81 }, { 82 .name = "linux kernel(nor a)", 83 .size = MTDPART_SIZ_FULL, 84 .offset = MTDPART_OFS_APPEND, 85 }, 86}; 87 88static struct physmap_flash_data ezkit_flash_data_a = { 89 .width = 2, 90 .parts = ezkit_partitions_a, 91 .nr_parts = ARRAY_SIZE(ezkit_partitions_a), 92}; 93 94static struct resource ezkit_flash_resource_a = { 95 .start = 0x20000000, 96 .end = 0x200fffff, 97 .flags = IORESOURCE_MEM, 98}; 99 100static struct platform_device ezkit_flash_device_a = { 101 .name = "physmap-flash", 102 .id = 0, 103 .dev = { 104 .platform_data = &ezkit_flash_data_a, 105 }, 106 .num_resources = 1, 107 .resource = &ezkit_flash_resource_a, 108}; 109 110static struct mtd_partition ezkit_partitions_b[] = { 111 { 112 .name = "file system(nor b)", 113 .size = MTDPART_SIZ_FULL, 114 .offset = MTDPART_OFS_APPEND, 115 }, 116}; 117 118static struct physmap_flash_data ezkit_flash_data_b = { 119 .width = 2, 120 .parts = ezkit_partitions_b, 121 .nr_parts = ARRAY_SIZE(ezkit_partitions_b), 122}; 123 124static struct resource ezkit_flash_resource_b = { 125 .start = 0x20100000, 126 .end = 0x201fffff, 127 .flags = IORESOURCE_MEM, 128}; 129 130static struct platform_device ezkit_flash_device_b = { 131 .name = "physmap-flash", 132 .id = 4, 133 .dev = { 134 .platform_data = &ezkit_flash_data_b, 135 }, 136 .num_resources = 1, 137 .resource = &ezkit_flash_resource_b, 138}; 139#endif 140 141#if defined(CONFIG_MTD_PLATRAM) || defined(CONFIG_MTD_PLATRAM_MODULE) 142static struct platdata_mtd_ram sram_data_a = { 143 .mapname = "Flash A SRAM", 144 .bankwidth = 2, 145}; 146 147static struct resource sram_resource_a = { 148 .start = 0x20240000, 149 .end = 0x2024ffff, 150 .flags = IORESOURCE_MEM, 151}; 152 153static struct platform_device sram_device_a = { 154 .name = "mtd-ram", 155 .id = 8, 156 .dev = { 157 .platform_data = &sram_data_a, 158 }, 159 .num_resources = 1, 160 .resource = &sram_resource_a, 161}; 162 163static struct platdata_mtd_ram sram_data_b = { 164 .mapname = "Flash B SRAM", 165 .bankwidth = 2, 166}; 167 168static struct resource sram_resource_b = { 169 .start = 0x202c0000, 170 .end = 0x202cffff, 171 .flags = IORESOURCE_MEM, 172}; 173 174static struct platform_device sram_device_b = { 175 .name = "mtd-ram", 176 .id = 9, 177 .dev = { 178 .platform_data = &sram_data_b, 179 }, 180 .num_resources = 1, 181 .resource = &sram_resource_b, 182}; 183#endif 184 185#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) 186static struct mtd_partition bfin_spi_flash_partitions[] = { 187 { 188 .name = "bootloader(spi)", 189 .size = 0x00020000, 190 .offset = 0, 191 .mask_flags = MTD_CAP_ROM 192 }, { 193 .name = "linux kernel(spi)", 194 .size = 0xe0000, 195 .offset = MTDPART_OFS_APPEND, 196 }, { 197 .name = "file system(spi)", 198 .size = MTDPART_SIZ_FULL, 199 .offset = MTDPART_OFS_APPEND, 200 } 201}; 202 203static struct flash_platform_data bfin_spi_flash_data = { 204 .name = "m25p80", 205 .parts = bfin_spi_flash_partitions, 206 .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions), 207 .type = "m25p64", 208}; 209 210/* SPI flash chip (m25p64) */ 211static struct bfin5xx_spi_chip spi_flash_chip_info = { 212 .enable_dma = 0, /* use dma transfer with this chip*/ 213 .bits_per_word = 8, 214}; 215#endif 216 217#if defined(CONFIG_BFIN_SPI_ADC) || defined(CONFIG_BFIN_SPI_ADC_MODULE) 218/* SPI ADC chip */ 219static struct bfin5xx_spi_chip spi_adc_chip_info = { 220 .enable_dma = 1, /* use dma transfer with this chip*/ 221 .bits_per_word = 16, 222}; 223#endif 224 225#if defined(CONFIG_SND_BLACKFIN_AD183X) || defined(CONFIG_SND_BLACKFIN_AD183X_MODULE) 226static struct bfin5xx_spi_chip ad1836_spi_chip_info = { 227 .enable_dma = 0, 228 .bits_per_word = 16, 229}; 230#endif 231 232#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) 233static struct bfin5xx_spi_chip spidev_chip_info = { 234 .enable_dma = 0, 235 .bits_per_word = 8, 236}; 237#endif 238 239static struct spi_board_info bfin_spi_board_info[] __initdata = { 240#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) 241 { 242 /* the modalias must be the same as spi device driver name */ 243 .modalias = "m25p80", /* Name of spi_driver for this device */ 244 .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */ 245 .bus_num = 0, /* Framework bus number */ 246 .chip_select = 2, /* Framework chip select. On STAMP537 it is SPISSEL2*/ 247 .platform_data = &bfin_spi_flash_data, 248 .controller_data = &spi_flash_chip_info, 249 .mode = SPI_MODE_3, 250 }, 251#endif 252 253#if defined(CONFIG_BFIN_SPI_ADC) || defined(CONFIG_BFIN_SPI_ADC_MODULE) 254 { 255 .modalias = "bfin_spi_adc", /* Name of spi_driver for this device */ 256 .max_speed_hz = 6250000, /* max spi clock (SCK) speed in HZ */ 257 .bus_num = 0, /* Framework bus number */ 258 .chip_select = 1, /* Framework chip select. */ 259 .platform_data = NULL, /* No spi_driver specific config */ 260 .controller_data = &spi_adc_chip_info, 261 }, 262#endif 263 264#if defined(CONFIG_SND_BLACKFIN_AD183X) || defined(CONFIG_SND_BLACKFIN_AD183X_MODULE) 265 { 266 .modalias = "ad1836", 267 .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */ 268 .bus_num = 0, 269 .chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT, 270 .controller_data = &ad1836_spi_chip_info, 271 }, 272#endif 273#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) 274 { 275 .modalias = "spidev", 276 .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */ 277 .bus_num = 0, 278 .chip_select = 1, 279 .controller_data = &spidev_chip_info, 280 }, 281#endif 282}; 283 284#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) 285/* SPI (0) */ 286static struct resource bfin_spi0_resource[] = { 287 [0] = { 288 .start = SPI0_REGBASE, 289 .end = SPI0_REGBASE + 0xFF, 290 .flags = IORESOURCE_MEM, 291 }, 292 [1] = { 293 .start = CH_SPI, 294 .end = CH_SPI, 295 .flags = IORESOURCE_DMA, 296 }, 297 [2] = { 298 .start = IRQ_SPI, 299 .end = IRQ_SPI, 300 .flags = IORESOURCE_IRQ, 301 } 302}; 303 304/* SPI controller data */ 305static struct bfin5xx_spi_master bfin_spi0_info = { 306 .num_chipselect = 8, 307 .enable_dma = 1, /* master has the ability to do dma transfer */ 308 .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0}, 309}; 310 311static struct platform_device bfin_spi0_device = { 312 .name = "bfin-spi", 313 .id = 0, /* Bus number */ 314 .num_resources = ARRAY_SIZE(bfin_spi0_resource), 315 .resource = bfin_spi0_resource, 316 .dev = { 317 .platform_data = &bfin_spi0_info, /* Passed to driver */ 318 }, 319}; 320#endif /* spi master and devices */ 321 322#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) 323#ifdef CONFIG_SERIAL_BFIN_UART0 324static struct resource bfin_uart0_resources[] = { 325 { 326 .start = BFIN_UART_THR, 327 .end = BFIN_UART_GCTL+2, 328 .flags = IORESOURCE_MEM, 329 }, 330 { 331 .start = IRQ_UART0_RX, 332 .end = IRQ_UART0_RX + 1, 333 .flags = IORESOURCE_IRQ, 334 }, 335 { 336 .start = IRQ_UART0_ERROR, 337 .end = IRQ_UART0_ERROR, 338 .flags = IORESOURCE_IRQ, 339 }, 340 { 341 .start = CH_UART0_TX, 342 .end = CH_UART0_TX, 343 .flags = IORESOURCE_DMA, 344 }, 345 { 346 .start = CH_UART0_RX, 347 .end = CH_UART0_RX, 348 .flags = IORESOURCE_DMA, 349 }, 350}; 351 352unsigned short bfin_uart0_peripherals[] = { 353 P_UART0_TX, P_UART0_RX, 0 354}; 355 356static struct platform_device bfin_uart0_device = { 357 .name = "bfin-uart", 358 .id = 0, 359 .num_resources = ARRAY_SIZE(bfin_uart0_resources), 360 .resource = bfin_uart0_resources, 361 .dev = { 362 .platform_data = &bfin_uart0_peripherals, /* Passed to driver */ 363 }, 364}; 365#endif 366#endif 367 368#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) 369#ifdef CONFIG_BFIN_SIR0 370static struct resource bfin_sir0_resources[] = { 371 { 372 .start = 0xFFC00400, 373 .end = 0xFFC004FF, 374 .flags = IORESOURCE_MEM, 375 }, 376 { 377 .start = IRQ_UART0_RX, 378 .end = IRQ_UART0_RX+1, 379 .flags = IORESOURCE_IRQ, 380 }, 381 { 382 .start = CH_UART0_RX, 383 .end = CH_UART0_RX+1, 384 .flags = IORESOURCE_DMA, 385 }, 386}; 387 388static struct platform_device bfin_sir0_device = { 389 .name = "bfin_sir", 390 .id = 0, 391 .num_resources = ARRAY_SIZE(bfin_sir0_resources), 392 .resource = bfin_sir0_resources, 393}; 394#endif 395#endif 396 397#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 398#include <linux/input.h> 399#include <linux/gpio_keys.h> 400 401static struct gpio_keys_button bfin_gpio_keys_table[] = { 402 {BTN_0, GPIO_PF7, 1, "gpio-keys: BTN0"}, 403 {BTN_1, GPIO_PF8, 1, "gpio-keys: BTN1"}, 404 {BTN_2, GPIO_PF9, 1, "gpio-keys: BTN2"}, 405 {BTN_3, GPIO_PF10, 1, "gpio-keys: BTN3"}, 406}; 407 408static struct gpio_keys_platform_data bfin_gpio_keys_data = { 409 .buttons = bfin_gpio_keys_table, 410 .nbuttons = ARRAY_SIZE(bfin_gpio_keys_table), 411}; 412 413static struct platform_device bfin_device_gpiokeys = { 414 .name = "gpio-keys", 415 .dev = { 416 .platform_data = &bfin_gpio_keys_data, 417 }, 418}; 419#endif 420 421#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) 422#include <linux/i2c-gpio.h> 423 424static struct i2c_gpio_platform_data i2c_gpio_data = { 425 .sda_pin = 1, 426 .scl_pin = 0, 427 .sda_is_open_drain = 0, 428 .scl_is_open_drain = 0, 429 .udelay = 40, 430}; 431 432static struct platform_device i2c_gpio_device = { 433 .name = "i2c-gpio", 434 .id = 0, 435 .dev = { 436 .platform_data = &i2c_gpio_data, 437 }, 438}; 439#endif 440 441static const unsigned int cclk_vlev_datasheet[] = 442{ 443 VRPAIR(VLEV_085, 250000000), 444 VRPAIR(VLEV_090, 376000000), 445 VRPAIR(VLEV_095, 426000000), 446 VRPAIR(VLEV_100, 426000000), 447 VRPAIR(VLEV_105, 476000000), 448 VRPAIR(VLEV_110, 476000000), 449 VRPAIR(VLEV_115, 476000000), 450 VRPAIR(VLEV_120, 600000000), 451 VRPAIR(VLEV_125, 600000000), 452 VRPAIR(VLEV_130, 600000000), 453}; 454 455static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = { 456 .tuple_tab = cclk_vlev_datasheet, 457 .tabsize = ARRAY_SIZE(cclk_vlev_datasheet), 458 .vr_settling_time = 25 /* us */, 459}; 460 461static struct platform_device bfin_dpmc = { 462 .name = "bfin dpmc", 463 .dev = { 464 .platform_data = &bfin_dmpc_vreg_data, 465 }, 466}; 467 468static struct i2c_board_info __initdata bfin_i2c_board_info[] = { 469#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) 470 { 471 I2C_BOARD_INFO("bfin-adv7393", 0x2B), 472 }, 473#endif 474}; 475 476#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE) 477static struct platform_device bfin_i2s = { 478 .name = "bfin-i2s", 479 .id = CONFIG_SND_BF5XX_SPORT_NUM, 480 /* TODO: add platform data here */ 481}; 482#endif 483 484#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE) 485static struct platform_device bfin_tdm = { 486 .name = "bfin-tdm", 487 .id = CONFIG_SND_BF5XX_SPORT_NUM, 488 /* TODO: add platform data here */ 489}; 490#endif 491 492#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE) 493static struct platform_device bfin_ac97 = { 494 .name = "bfin-ac97", 495 .id = CONFIG_SND_BF5XX_SPORT_NUM, 496 /* TODO: add platform data here */ 497}; 498#endif 499 500static struct platform_device *ezkit_devices[] __initdata = { 501 502 &bfin_dpmc, 503 504#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) 505 &ezkit_flash_device_a, 506 &ezkit_flash_device_b, 507#endif 508 509#if defined(CONFIG_MTD_PLATRAM) || defined(CONFIG_MTD_PLATRAM_MODULE) 510 &sram_device_a, 511 &sram_device_b, 512#endif 513 514#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) 515 &smc91x_device, 516#endif 517 518#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) 519 &bfin_spi0_device, 520#endif 521 522#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) 523 &rtc_device, 524#endif 525 526#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) 527#ifdef CONFIG_SERIAL_BFIN_UART0 528 &bfin_uart0_device, 529#endif 530#endif 531 532#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) 533#ifdef CONFIG_BFIN_SIR0 534 &bfin_sir0_device, 535#endif 536#endif 537 538#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 539 &bfin_device_gpiokeys, 540#endif 541 542#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) 543 &i2c_gpio_device, 544#endif 545 546#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE) 547 &bfin_i2s, 548#endif 549 550#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE) 551 &bfin_tdm, 552#endif 553 554#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE) 555 &bfin_ac97, 556#endif 557}; 558 559static int __init ezkit_init(void) 560{ 561 printk(KERN_INFO "%s(): registering device resources\n", __func__); 562 platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices)); 563 spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); 564 i2c_register_board_info(0, bfin_i2c_board_info, 565 ARRAY_SIZE(bfin_i2c_board_info)); 566 return 0; 567} 568 569arch_initcall(ezkit_init); 570 571static struct platform_device *ezkit_early_devices[] __initdata = { 572#if defined(CONFIG_SERIAL_BFIN_CONSOLE) || defined(CONFIG_EARLY_PRINTK) 573#ifdef CONFIG_SERIAL_BFIN_UART0 574 &bfin_uart0_device, 575#endif 576#endif 577}; 578 579void __init native_machine_early_platform_add_devices(void) 580{ 581 printk(KERN_INFO "register early platform devices\n"); 582 early_platform_add_devices(ezkit_early_devices, 583 ARRAY_SIZE(ezkit_early_devices)); 584} 585