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/physmap.h> 14#include <linux/spi/spi.h> 15#include <linux/irq.h> 16#include <linux/interrupt.h> 17#include <linux/gpio.h> 18#include <linux/delay.h> 19#include <asm/dma.h> 20#include <asm/bfin5xx_spi.h> 21#include <asm/portmux.h> 22#include <asm/dpmc.h> 23 24/* 25 * Name the Board for the /proc/cpuinfo 26 */ 27const char bfin_board_name[] = "ADI BF561-EZKIT"; 28 29#if IS_ENABLED(CONFIG_USB_ISP1760_HCD) 30#include <linux/usb/isp1760.h> 31static struct resource bfin_isp1760_resources[] = { 32 [0] = { 33 .start = 0x2C0F0000, 34 .end = 0x203C0000 + 0xfffff, 35 .flags = IORESOURCE_MEM, 36 }, 37 [1] = { 38 .start = IRQ_PF10, 39 .end = IRQ_PF10, 40 .flags = IORESOURCE_IRQ, 41 }, 42}; 43 44static struct isp1760_platform_data isp1760_priv = { 45 .is_isp1761 = 0, 46 .bus_width_16 = 1, 47 .port1_otg = 0, 48 .analog_oc = 0, 49 .dack_polarity_high = 0, 50 .dreq_polarity_high = 0, 51}; 52 53static struct platform_device bfin_isp1760_device = { 54 .name = "isp1760", 55 .id = 0, 56 .dev = { 57 .platform_data = &isp1760_priv, 58 }, 59 .num_resources = ARRAY_SIZE(bfin_isp1760_resources), 60 .resource = bfin_isp1760_resources, 61}; 62#endif 63 64#if IS_ENABLED(CONFIG_USB_ISP1362_HCD) 65#include <linux/usb/isp1362.h> 66 67static struct resource isp1362_hcd_resources[] = { 68 { 69 .start = 0x2c060000, 70 .end = 0x2c060000, 71 .flags = IORESOURCE_MEM, 72 }, { 73 .start = 0x2c060004, 74 .end = 0x2c060004, 75 .flags = IORESOURCE_MEM, 76 }, { 77 .start = IRQ_PF8, 78 .end = IRQ_PF8, 79 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE, 80 }, 81}; 82 83static struct isp1362_platform_data isp1362_priv = { 84 .sel15Kres = 1, 85 .clknotstop = 0, 86 .oc_enable = 0, 87 .int_act_high = 0, 88 .int_edge_triggered = 0, 89 .remote_wakeup_connected = 0, 90 .no_power_switching = 1, 91 .power_switching_mode = 0, 92}; 93 94static struct platform_device isp1362_hcd_device = { 95 .name = "isp1362-hcd", 96 .id = 0, 97 .dev = { 98 .platform_data = &isp1362_priv, 99 }, 100 .num_resources = ARRAY_SIZE(isp1362_hcd_resources), 101 .resource = isp1362_hcd_resources, 102}; 103#endif 104 105#if IS_ENABLED(CONFIG_USB_NET2272) 106static struct resource net2272_bfin_resources[] = { 107 { 108 .start = 0x2C000000, 109 .end = 0x2C000000 + 0x7F, 110 .flags = IORESOURCE_MEM, 111 }, { 112 .start = 1, 113 .flags = IORESOURCE_BUS, 114 }, { 115 .start = IRQ_PF10, 116 .end = IRQ_PF10, 117 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, 118 }, 119}; 120 121static struct platform_device net2272_bfin_device = { 122 .name = "net2272", 123 .id = -1, 124 .num_resources = ARRAY_SIZE(net2272_bfin_resources), 125 .resource = net2272_bfin_resources, 126}; 127#endif 128 129/* 130 * USB-LAN EzExtender board 131 * Driver needs to know address, irq and flag pin. 132 */ 133#if IS_ENABLED(CONFIG_SMC91X) 134#include <linux/smc91x.h> 135 136static struct smc91x_platdata smc91x_info = { 137 .flags = SMC91X_USE_32BIT | SMC91X_NOWAIT, 138 .leda = RPC_LED_100_10, 139 .ledb = RPC_LED_TX_RX, 140}; 141 142static struct resource smc91x_resources[] = { 143 { 144 .name = "smc91x-regs", 145 .start = 0x2C010300, 146 .end = 0x2C010300 + 16, 147 .flags = IORESOURCE_MEM, 148 }, { 149 150 .start = IRQ_PF9, 151 .end = IRQ_PF9, 152 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 153 }, 154}; 155 156static struct platform_device smc91x_device = { 157 .name = "smc91x", 158 .id = 0, 159 .num_resources = ARRAY_SIZE(smc91x_resources), 160 .resource = smc91x_resources, 161 .dev = { 162 .platform_data = &smc91x_info, 163 }, 164}; 165#endif 166 167#if IS_ENABLED(CONFIG_SERIAL_BFIN) 168#ifdef CONFIG_SERIAL_BFIN_UART0 169static struct resource bfin_uart0_resources[] = { 170 { 171 .start = BFIN_UART_THR, 172 .end = BFIN_UART_GCTL+2, 173 .flags = IORESOURCE_MEM, 174 }, 175 { 176 .start = IRQ_UART_TX, 177 .end = IRQ_UART_TX, 178 .flags = IORESOURCE_IRQ, 179 }, 180 { 181 .start = IRQ_UART_RX, 182 .end = IRQ_UART_RX, 183 .flags = IORESOURCE_IRQ, 184 }, 185 { 186 .start = IRQ_UART_ERROR, 187 .end = IRQ_UART_ERROR, 188 .flags = IORESOURCE_IRQ, 189 }, 190 { 191 .start = CH_UART_TX, 192 .end = CH_UART_TX, 193 .flags = IORESOURCE_DMA, 194 }, 195 { 196 .start = CH_UART_RX, 197 .end = CH_UART_RX, 198 .flags = IORESOURCE_DMA, 199 }, 200}; 201 202static unsigned short bfin_uart0_peripherals[] = { 203 P_UART0_TX, P_UART0_RX, 0 204}; 205 206static struct platform_device bfin_uart0_device = { 207 .name = "bfin-uart", 208 .id = 0, 209 .num_resources = ARRAY_SIZE(bfin_uart0_resources), 210 .resource = bfin_uart0_resources, 211 .dev = { 212 .platform_data = &bfin_uart0_peripherals, /* Passed to driver */ 213 }, 214}; 215#endif 216#endif 217 218#if IS_ENABLED(CONFIG_BFIN_SIR) 219#ifdef CONFIG_BFIN_SIR0 220static struct resource bfin_sir0_resources[] = { 221 { 222 .start = 0xFFC00400, 223 .end = 0xFFC004FF, 224 .flags = IORESOURCE_MEM, 225 }, 226 { 227 .start = IRQ_UART0_RX, 228 .end = IRQ_UART0_RX+1, 229 .flags = IORESOURCE_IRQ, 230 }, 231 { 232 .start = CH_UART0_RX, 233 .end = CH_UART0_RX+1, 234 .flags = IORESOURCE_DMA, 235 }, 236}; 237 238static struct platform_device bfin_sir0_device = { 239 .name = "bfin_sir", 240 .id = 0, 241 .num_resources = ARRAY_SIZE(bfin_sir0_resources), 242 .resource = bfin_sir0_resources, 243}; 244#endif 245#endif 246 247#if IS_ENABLED(CONFIG_MTD_PHYSMAP) 248static struct mtd_partition ezkit_partitions[] = { 249 { 250 .name = "bootloader(nor)", 251 .size = 0x40000, 252 .offset = 0, 253 }, { 254 .name = "linux kernel(nor)", 255 .size = 0x1C0000, 256 .offset = MTDPART_OFS_APPEND, 257 }, { 258 .name = "file system(nor)", 259 .size = 0x800000 - 0x40000 - 0x1C0000 - 0x2000 * 8, 260 .offset = MTDPART_OFS_APPEND, 261 }, { 262 .name = "config(nor)", 263 .size = 0x2000 * 7, 264 .offset = MTDPART_OFS_APPEND, 265 }, { 266 .name = "u-boot env(nor)", 267 .size = 0x2000, 268 .offset = MTDPART_OFS_APPEND, 269 } 270}; 271 272static struct physmap_flash_data ezkit_flash_data = { 273 .width = 2, 274 .parts = ezkit_partitions, 275 .nr_parts = ARRAY_SIZE(ezkit_partitions), 276}; 277 278static struct resource ezkit_flash_resource = { 279 .start = 0x20000000, 280 .end = 0x207fffff, 281 .flags = IORESOURCE_MEM, 282}; 283 284static struct platform_device ezkit_flash_device = { 285 .name = "physmap-flash", 286 .id = 0, 287 .dev = { 288 .platform_data = &ezkit_flash_data, 289 }, 290 .num_resources = 1, 291 .resource = &ezkit_flash_resource, 292}; 293#endif 294 295#if IS_ENABLED(CONFIG_SPI_BFIN5XX) 296/* SPI (0) */ 297static struct resource bfin_spi0_resource[] = { 298 [0] = { 299 .start = SPI0_REGBASE, 300 .end = SPI0_REGBASE + 0xFF, 301 .flags = IORESOURCE_MEM, 302 }, 303 [1] = { 304 .start = CH_SPI, 305 .end = CH_SPI, 306 .flags = IORESOURCE_DMA, 307 }, 308 [2] = { 309 .start = IRQ_SPI, 310 .end = IRQ_SPI, 311 .flags = IORESOURCE_IRQ, 312 } 313}; 314 315/* SPI controller data */ 316static struct bfin5xx_spi_master bfin_spi0_info = { 317 .num_chipselect = 8, 318 .enable_dma = 1, /* master has the ability to do dma transfer */ 319 .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0}, 320}; 321 322static struct platform_device bfin_spi0_device = { 323 .name = "bfin-spi", 324 .id = 0, /* Bus number */ 325 .num_resources = ARRAY_SIZE(bfin_spi0_resource), 326 .resource = bfin_spi0_resource, 327 .dev = { 328 .platform_data = &bfin_spi0_info, /* Passed to driver */ 329 }, 330}; 331#endif 332 333static struct spi_board_info bfin_spi_board_info[] __initdata = { 334#if IS_ENABLED(CONFIG_SND_BF5XX_SOC_AD183X) 335 { 336 .modalias = "ad183x", 337 .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */ 338 .bus_num = 0, 339 .chip_select = 4, 340 .platform_data = "ad1836", /* only includes chip name for the moment */ 341 .mode = SPI_MODE_3, 342 }, 343#endif 344#if IS_ENABLED(CONFIG_SPI_SPIDEV) 345 { 346 .modalias = "spidev", 347 .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */ 348 .bus_num = 0, 349 .chip_select = 1, 350 }, 351#endif 352}; 353 354#if IS_ENABLED(CONFIG_KEYBOARD_GPIO) 355#include <linux/input.h> 356#include <linux/gpio_keys.h> 357 358static struct gpio_keys_button bfin_gpio_keys_table[] = { 359 {BTN_0, GPIO_PF5, 1, "gpio-keys: BTN0"}, 360 {BTN_1, GPIO_PF6, 1, "gpio-keys: BTN1"}, 361 {BTN_2, GPIO_PF7, 1, "gpio-keys: BTN2"}, 362 {BTN_3, GPIO_PF8, 1, "gpio-keys: BTN3"}, 363}; 364 365static struct gpio_keys_platform_data bfin_gpio_keys_data = { 366 .buttons = bfin_gpio_keys_table, 367 .nbuttons = ARRAY_SIZE(bfin_gpio_keys_table), 368}; 369 370static struct platform_device bfin_device_gpiokeys = { 371 .name = "gpio-keys", 372 .dev = { 373 .platform_data = &bfin_gpio_keys_data, 374 }, 375}; 376#endif 377 378#if IS_ENABLED(CONFIG_I2C_GPIO) 379#include <linux/i2c-gpio.h> 380 381static struct i2c_gpio_platform_data i2c_gpio_data = { 382 .sda_pin = GPIO_PF1, 383 .scl_pin = GPIO_PF0, 384 .sda_is_open_drain = 0, 385 .scl_is_open_drain = 0, 386 .udelay = 10, 387}; 388 389static struct platform_device i2c_gpio_device = { 390 .name = "i2c-gpio", 391 .id = 0, 392 .dev = { 393 .platform_data = &i2c_gpio_data, 394 }, 395}; 396#endif 397 398static const unsigned int cclk_vlev_datasheet[] = 399{ 400 VRPAIR(VLEV_085, 250000000), 401 VRPAIR(VLEV_090, 300000000), 402 VRPAIR(VLEV_095, 313000000), 403 VRPAIR(VLEV_100, 350000000), 404 VRPAIR(VLEV_105, 400000000), 405 VRPAIR(VLEV_110, 444000000), 406 VRPAIR(VLEV_115, 450000000), 407 VRPAIR(VLEV_120, 475000000), 408 VRPAIR(VLEV_125, 500000000), 409 VRPAIR(VLEV_130, 600000000), 410}; 411 412static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = { 413 .tuple_tab = cclk_vlev_datasheet, 414 .tabsize = ARRAY_SIZE(cclk_vlev_datasheet), 415 .vr_settling_time = 25 /* us */, 416}; 417 418static struct platform_device bfin_dpmc = { 419 .name = "bfin dpmc", 420 .dev = { 421 .platform_data = &bfin_dmpc_vreg_data, 422 }, 423}; 424 425#if IS_ENABLED(CONFIG_VIDEO_BLACKFIN_CAPTURE) 426#include <linux/videodev2.h> 427#include <media/blackfin/bfin_capture.h> 428#include <media/blackfin/ppi.h> 429 430static const unsigned short ppi_req[] = { 431 P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, 432 P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, 433 P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, 434 0, 435}; 436 437static const struct ppi_info ppi_info = { 438 .type = PPI_TYPE_PPI, 439 .dma_ch = CH_PPI0, 440 .irq_err = IRQ_PPI1_ERROR, 441 .base = (void __iomem *)PPI0_CONTROL, 442 .pin_req = ppi_req, 443}; 444 445#if IS_ENABLED(CONFIG_VIDEO_ADV7183) 446#include <media/adv7183.h> 447static struct v4l2_input adv7183_inputs[] = { 448 { 449 .index = 0, 450 .name = "Composite", 451 .type = V4L2_INPUT_TYPE_CAMERA, 452 .std = V4L2_STD_ALL, 453 .capabilities = V4L2_IN_CAP_STD, 454 }, 455 { 456 .index = 1, 457 .name = "S-Video", 458 .type = V4L2_INPUT_TYPE_CAMERA, 459 .std = V4L2_STD_ALL, 460 .capabilities = V4L2_IN_CAP_STD, 461 }, 462 { 463 .index = 2, 464 .name = "Component", 465 .type = V4L2_INPUT_TYPE_CAMERA, 466 .std = V4L2_STD_ALL, 467 .capabilities = V4L2_IN_CAP_STD, 468 }, 469}; 470 471static struct bcap_route adv7183_routes[] = { 472 { 473 .input = ADV7183_COMPOSITE4, 474 .output = ADV7183_8BIT_OUT, 475 }, 476 { 477 .input = ADV7183_SVIDEO0, 478 .output = ADV7183_8BIT_OUT, 479 }, 480 { 481 .input = ADV7183_COMPONENT0, 482 .output = ADV7183_8BIT_OUT, 483 }, 484}; 485 486 487static const unsigned adv7183_gpio[] = { 488 GPIO_PF13, /* reset pin */ 489 GPIO_PF2, /* output enable pin */ 490}; 491 492static struct bfin_capture_config bfin_capture_data = { 493 .card_name = "BF561", 494 .inputs = adv7183_inputs, 495 .num_inputs = ARRAY_SIZE(adv7183_inputs), 496 .routes = adv7183_routes, 497 .i2c_adapter_id = 0, 498 .board_info = { 499 .type = "adv7183", 500 .addr = 0x20, 501 .platform_data = (void *)adv7183_gpio, 502 }, 503 .ppi_info = &ppi_info, 504 .ppi_control = (PACK_EN | DLEN_8 | DMA32 | FLD_SEL), 505}; 506#endif 507 508static struct platform_device bfin_capture_device = { 509 .name = "bfin_capture", 510 .dev = { 511 .platform_data = &bfin_capture_data, 512 }, 513}; 514#endif 515 516#if IS_ENABLED(CONFIG_SND_BF5XX_I2S) 517static struct platform_device bfin_i2s = { 518 .name = "bfin-i2s", 519 .id = CONFIG_SND_BF5XX_SPORT_NUM, 520 /* TODO: add platform data here */ 521}; 522#endif 523 524#if IS_ENABLED(CONFIG_SND_BF5XX_AC97) 525static struct platform_device bfin_ac97 = { 526 .name = "bfin-ac97", 527 .id = CONFIG_SND_BF5XX_SPORT_NUM, 528 /* TODO: add platform data here */ 529}; 530#endif 531 532#if IS_ENABLED(CONFIG_SND_BF5XX_SOC_AD1836) 533static const char * const ad1836_link[] = { 534 "bfin-i2s.0", 535 "spi0.4", 536}; 537static struct platform_device bfin_ad1836_machine = { 538 .name = "bfin-snd-ad1836", 539 .id = -1, 540 .dev = { 541 .platform_data = (void *)ad1836_link, 542 }, 543}; 544#endif 545 546static struct platform_device *ezkit_devices[] __initdata = { 547 548 &bfin_dpmc, 549 550#if IS_ENABLED(CONFIG_SMC91X) 551 &smc91x_device, 552#endif 553 554#if IS_ENABLED(CONFIG_USB_NET2272) 555 &net2272_bfin_device, 556#endif 557 558#if IS_ENABLED(CONFIG_USB_ISP1760_HCD) 559 &bfin_isp1760_device, 560#endif 561 562#if IS_ENABLED(CONFIG_SPI_BFIN5XX) 563 &bfin_spi0_device, 564#endif 565 566#if IS_ENABLED(CONFIG_SERIAL_BFIN) 567#ifdef CONFIG_SERIAL_BFIN_UART0 568 &bfin_uart0_device, 569#endif 570#endif 571 572#if IS_ENABLED(CONFIG_BFIN_SIR) 573#ifdef CONFIG_BFIN_SIR0 574 &bfin_sir0_device, 575#endif 576#endif 577 578#if IS_ENABLED(CONFIG_KEYBOARD_GPIO) 579 &bfin_device_gpiokeys, 580#endif 581 582#if IS_ENABLED(CONFIG_I2C_GPIO) 583 &i2c_gpio_device, 584#endif 585 586#if IS_ENABLED(CONFIG_USB_ISP1362_HCD) 587 &isp1362_hcd_device, 588#endif 589 590#if IS_ENABLED(CONFIG_MTD_PHYSMAP) 591 &ezkit_flash_device, 592#endif 593 594#if IS_ENABLED(CONFIG_VIDEO_BLACKFIN_CAPTURE) 595 &bfin_capture_device, 596#endif 597 598#if IS_ENABLED(CONFIG_SND_BF5XX_I2S) 599 &bfin_i2s, 600#endif 601 602#if IS_ENABLED(CONFIG_SND_BF5XX_AC97) 603 &bfin_ac97, 604#endif 605 606#if IS_ENABLED(CONFIG_SND_BF5XX_SOC_AD1836) 607 &bfin_ad1836_machine, 608#endif 609}; 610 611static int __init net2272_init(void) 612{ 613#if IS_ENABLED(CONFIG_USB_NET2272) 614 int ret; 615 616 ret = gpio_request(GPIO_PF11, "net2272"); 617 if (ret) 618 return ret; 619 620 /* Reset the USB chip */ 621 gpio_direction_output(GPIO_PF11, 0); 622 mdelay(2); 623 gpio_set_value(GPIO_PF11, 1); 624#endif 625 626 return 0; 627} 628 629static int __init ezkit_init(void) 630{ 631 int ret; 632 633 printk(KERN_INFO "%s(): registering device resources\n", __func__); 634 635 ret = platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices)); 636 if (ret < 0) 637 return ret; 638 639#if IS_ENABLED(CONFIG_SMC91X) 640 bfin_write_FIO0_DIR(bfin_read_FIO0_DIR() | (1 << 12)); 641 SSYNC(); 642#endif 643 644#if IS_ENABLED(CONFIG_SND_BF5XX_SOC_AD183X) 645 bfin_write_FIO0_DIR(bfin_read_FIO0_DIR() | (1 << 15)); 646 bfin_write_FIO0_FLAG_S(1 << 15); 647 SSYNC(); 648 /* 649 * This initialization lasts for approximately 4500 MCLKs. 650 * MCLK = 12.288MHz 651 */ 652 udelay(400); 653#endif 654 655 if (net2272_init()) 656 pr_warning("unable to configure net2272; it probably won't work\n"); 657 658 spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); 659 return 0; 660} 661 662arch_initcall(ezkit_init); 663 664static struct platform_device *ezkit_early_devices[] __initdata = { 665#if defined(CONFIG_SERIAL_BFIN_CONSOLE) || defined(CONFIG_EARLY_PRINTK) 666#ifdef CONFIG_SERIAL_BFIN_UART0 667 &bfin_uart0_device, 668#endif 669#endif 670}; 671 672void __init native_machine_early_platform_add_devices(void) 673{ 674 printk(KERN_INFO "register early platform devices\n"); 675 early_platform_add_devices(ezkit_early_devices, 676 ARRAY_SIZE(ezkit_early_devices)); 677} 678