1 /* 2 * Legacy platform_data quirks 3 * 4 * Copyright (C) 2013 Texas Instruments 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 #include <linux/clk.h> 11 #include <linux/davinci_emac.h> 12 #include <linux/gpio.h> 13 #include <linux/init.h> 14 #include <linux/kernel.h> 15 #include <linux/of_platform.h> 16 #include <linux/ti_wilink_st.h> 17 #include <linux/wl12xx.h> 18 #include <linux/mmc/card.h> 19 #include <linux/mmc/host.h> 20 #include <linux/regulator/machine.h> 21 #include <linux/regulator/fixed.h> 22 23 #include <linux/platform_data/pinctrl-single.h> 24 #include <linux/platform_data/iommu-omap.h> 25 #include <linux/platform_data/wkup_m3.h> 26 #include <linux/platform_data/pwm_omap_dmtimer.h> 27 #include <plat/dmtimer.h> 28 29 #include "common.h" 30 #include "common-board-devices.h" 31 #include "dss-common.h" 32 #include "control.h" 33 #include "omap_device.h" 34 #include "omap-secure.h" 35 #include "soc.h" 36 #include "hsmmc.h" 37 38 struct pdata_init { 39 const char *compatible; 40 void (*fn)(void); 41 }; 42 43 static struct of_dev_auxdata omap_auxdata_lookup[]; 44 static struct twl4030_gpio_platform_data twl_gpio_auxdata; 45 46 #ifdef CONFIG_MACH_NOKIA_N8X0 47 static void __init omap2420_n8x0_legacy_init(void) 48 { 49 omap_auxdata_lookup[0].platform_data = n8x0_legacy_init(); 50 } 51 #else 52 #define omap2420_n8x0_legacy_init NULL 53 #endif 54 55 #ifdef CONFIG_ARCH_OMAP3 56 /* 57 * Configures GPIOs 126, 127 and 129 to 1.8V mode instead of 3.0V 58 * mode for MMC1 in case bootloader did not configure things. 59 * Note that if the pins are used for MMC1, pbias-regulator 60 * manages the IO voltage. 61 */ 62 static void __init omap3_gpio126_127_129(void) 63 { 64 u32 reg; 65 66 reg = omap_ctrl_readl(OMAP343X_CONTROL_PBIAS_LITE); 67 reg &= ~OMAP343X_PBIASLITEVMODE1; 68 reg |= OMAP343X_PBIASLITEPWRDNZ1; 69 omap_ctrl_writel(reg, OMAP343X_CONTROL_PBIAS_LITE); 70 if (cpu_is_omap3630()) { 71 reg = omap_ctrl_readl(OMAP34XX_CONTROL_WKUP_CTRL); 72 reg |= OMAP36XX_GPIO_IO_PWRDNZ; 73 omap_ctrl_writel(reg, OMAP34XX_CONTROL_WKUP_CTRL); 74 } 75 } 76 77 static void __init hsmmc2_internal_input_clk(void) 78 { 79 u32 reg; 80 81 reg = omap_ctrl_readl(OMAP343X_CONTROL_DEVCONF1); 82 reg |= OMAP2_MMCSDIO2ADPCLKISEL; 83 omap_ctrl_writel(reg, OMAP343X_CONTROL_DEVCONF1); 84 } 85 86 static struct iommu_platform_data omap3_iommu_pdata = { 87 .reset_name = "mmu", 88 .assert_reset = omap_device_assert_hardreset, 89 .deassert_reset = omap_device_deassert_hardreset, 90 }; 91 92 static int omap3_sbc_t3730_twl_callback(struct device *dev, 93 unsigned gpio, 94 unsigned ngpio) 95 { 96 int res; 97 98 res = gpio_request_one(gpio + 2, GPIOF_OUT_INIT_HIGH, 99 "wlan pwr"); 100 if (res) 101 return res; 102 103 gpio_export(gpio, 0); 104 105 return 0; 106 } 107 108 static void __init omap3_sbc_t3x_usb_hub_init(int gpio, char *hub_name) 109 { 110 int err = gpio_request_one(gpio, GPIOF_OUT_INIT_LOW, hub_name); 111 112 if (err) { 113 pr_err("SBC-T3x: %s reset gpio request failed: %d\n", 114 hub_name, err); 115 return; 116 } 117 118 gpio_export(gpio, 0); 119 120 udelay(10); 121 gpio_set_value(gpio, 1); 122 msleep(1); 123 } 124 125 static void __init omap3_sbc_t3730_twl_init(void) 126 { 127 twl_gpio_auxdata.setup = omap3_sbc_t3730_twl_callback; 128 } 129 130 static void __init omap3_sbc_t3730_legacy_init(void) 131 { 132 omap3_sbc_t3x_usb_hub_init(167, "sb-t35 usb hub"); 133 } 134 135 static void __init omap3_sbc_t3530_legacy_init(void) 136 { 137 omap3_sbc_t3x_usb_hub_init(167, "sb-t35 usb hub"); 138 } 139 140 static struct ti_st_plat_data wilink_pdata = { 141 .nshutdown_gpio = 137, 142 .dev_name = "/dev/ttyO1", 143 .flow_cntrl = 1, 144 .baud_rate = 300000, 145 }; 146 147 static struct platform_device wl18xx_device = { 148 .name = "kim", 149 .id = -1, 150 .dev = { 151 .platform_data = &wilink_pdata, 152 } 153 }; 154 155 static struct ti_st_plat_data wilink7_pdata = { 156 .nshutdown_gpio = 162, 157 .dev_name = "/dev/ttyO1", 158 .flow_cntrl = 1, 159 .baud_rate = 300000, 160 }; 161 162 static struct platform_device wl128x_device = { 163 .name = "kim", 164 .id = -1, 165 .dev = { 166 .platform_data = &wilink7_pdata, 167 } 168 }; 169 170 static struct platform_device btwilink_device = { 171 .name = "btwilink", 172 .id = -1, 173 }; 174 175 static void __init omap3_igep0020_rev_f_legacy_init(void) 176 { 177 platform_device_register(&wl18xx_device); 178 platform_device_register(&btwilink_device); 179 } 180 181 static void __init omap3_igep0030_rev_g_legacy_init(void) 182 { 183 platform_device_register(&wl18xx_device); 184 platform_device_register(&btwilink_device); 185 } 186 187 static void __init omap3_evm_legacy_init(void) 188 { 189 hsmmc2_internal_input_clk(); 190 } 191 192 static void am35xx_enable_emac_int(void) 193 { 194 u32 v; 195 196 v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 197 v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_CLR | 198 AM35XX_CPGMAC_C0_MISC_PULSE_CLR | AM35XX_CPGMAC_C0_RX_THRESH_CLR); 199 omap_ctrl_writel(v, AM35XX_CONTROL_LVL_INTR_CLEAR); 200 omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); /* OCP barrier */ 201 } 202 203 static void am35xx_disable_emac_int(void) 204 { 205 u32 v; 206 207 v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 208 v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_CLR); 209 omap_ctrl_writel(v, AM35XX_CONTROL_LVL_INTR_CLEAR); 210 omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); /* OCP barrier */ 211 } 212 213 static struct emac_platform_data am35xx_emac_pdata = { 214 .interrupt_enable = am35xx_enable_emac_int, 215 .interrupt_disable = am35xx_disable_emac_int, 216 }; 217 218 static void __init am35xx_emac_reset(void) 219 { 220 u32 v; 221 222 v = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); 223 v &= ~AM35XX_CPGMACSS_SW_RST; 224 omap_ctrl_writel(v, AM35XX_CONTROL_IP_SW_RESET); 225 omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); /* OCP barrier */ 226 } 227 228 static struct gpio cm_t3517_wlan_gpios[] __initdata = { 229 { 56, GPIOF_OUT_INIT_HIGH, "wlan pwr" }, 230 { 4, GPIOF_OUT_INIT_HIGH, "xcvr noe" }, 231 }; 232 233 static void __init omap3_sbc_t3517_wifi_init(void) 234 { 235 int err = gpio_request_array(cm_t3517_wlan_gpios, 236 ARRAY_SIZE(cm_t3517_wlan_gpios)); 237 if (err) { 238 pr_err("SBC-T3517: wl12xx gpios request failed: %d\n", err); 239 return; 240 } 241 242 gpio_export(cm_t3517_wlan_gpios[0].gpio, 0); 243 gpio_export(cm_t3517_wlan_gpios[1].gpio, 0); 244 245 msleep(100); 246 gpio_set_value(cm_t3517_wlan_gpios[1].gpio, 0); 247 } 248 249 static void __init omap3_sbc_t3517_legacy_init(void) 250 { 251 omap3_sbc_t3x_usb_hub_init(152, "cm-t3517 usb hub"); 252 omap3_sbc_t3x_usb_hub_init(98, "sb-t35 usb hub"); 253 am35xx_emac_reset(); 254 hsmmc2_internal_input_clk(); 255 omap3_sbc_t3517_wifi_init(); 256 } 257 258 static void __init am3517_evm_legacy_init(void) 259 { 260 am35xx_emac_reset(); 261 } 262 263 static struct platform_device omap3_rom_rng_device = { 264 .name = "omap3-rom-rng", 265 .id = -1, 266 .dev = { 267 .platform_data = rx51_secure_rng_call, 268 }, 269 }; 270 271 static void __init nokia_n900_legacy_init(void) 272 { 273 hsmmc2_internal_input_clk(); 274 275 if (omap_type() == OMAP2_DEVICE_TYPE_SEC) { 276 if (IS_ENABLED(CONFIG_ARM_ERRATA_430973)) { 277 pr_info("RX-51: Enabling ARM errata 430973 workaround\n"); 278 /* set IBE to 1 */ 279 rx51_secure_update_aux_cr(BIT(6), 0); 280 } else { 281 pr_warn("RX-51: Not enabling ARM errata 430973 workaround\n"); 282 pr_warn("Thumb binaries may crash randomly without this workaround\n"); 283 } 284 285 pr_info("RX-51: Registering OMAP3 HWRNG device\n"); 286 platform_device_register(&omap3_rom_rng_device); 287 288 } 289 } 290 291 static void __init omap3_tao3530_legacy_init(void) 292 { 293 hsmmc2_internal_input_clk(); 294 } 295 296 static void __init omap3_logicpd_torpedo_init(void) 297 { 298 omap3_gpio126_127_129(); 299 platform_device_register(&wl128x_device); 300 platform_device_register(&btwilink_device); 301 } 302 303 /* omap3pandora legacy devices */ 304 #define PANDORA_WIFI_IRQ_GPIO 21 305 #define PANDORA_WIFI_NRESET_GPIO 23 306 307 static struct platform_device pandora_backlight = { 308 .name = "pandora-backlight", 309 .id = -1, 310 }; 311 312 static struct regulator_consumer_supply pandora_vmmc3_supply[] = { 313 REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"), 314 }; 315 316 static struct regulator_init_data pandora_vmmc3 = { 317 .constraints = { 318 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 319 }, 320 .num_consumer_supplies = ARRAY_SIZE(pandora_vmmc3_supply), 321 .consumer_supplies = pandora_vmmc3_supply, 322 }; 323 324 static struct fixed_voltage_config pandora_vwlan = { 325 .supply_name = "vwlan", 326 .microvolts = 1800000, /* 1.8V */ 327 .gpio = PANDORA_WIFI_NRESET_GPIO, 328 .startup_delay = 50000, /* 50ms */ 329 .enable_high = 1, 330 .init_data = &pandora_vmmc3, 331 }; 332 333 static struct platform_device pandora_vwlan_device = { 334 .name = "reg-fixed-voltage", 335 .id = 1, 336 .dev = { 337 .platform_data = &pandora_vwlan, 338 }, 339 }; 340 341 static void pandora_wl1251_init_card(struct mmc_card *card) 342 { 343 /* 344 * We have TI wl1251 attached to MMC3. Pass this information to 345 * SDIO core because it can't be probed by normal methods. 346 */ 347 if (card->type == MMC_TYPE_SDIO || card->type == MMC_TYPE_SD_COMBO) { 348 card->quirks |= MMC_QUIRK_NONSTD_SDIO; 349 card->cccr.wide_bus = 1; 350 card->cis.vendor = 0x104c; 351 card->cis.device = 0x9066; 352 card->cis.blksize = 512; 353 card->cis.max_dtr = 24000000; 354 card->ocr = 0x80; 355 } 356 } 357 358 static struct omap2_hsmmc_info pandora_mmc3[] = { 359 { 360 .mmc = 3, 361 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, 362 .gpio_cd = -EINVAL, 363 .gpio_wp = -EINVAL, 364 .init_card = pandora_wl1251_init_card, 365 }, 366 {} /* Terminator */ 367 }; 368 369 static void __init pandora_wl1251_init(void) 370 { 371 struct wl1251_platform_data pandora_wl1251_pdata; 372 int ret; 373 374 memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata)); 375 376 pandora_wl1251_pdata.power_gpio = -1; 377 378 ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, "wl1251 irq"); 379 if (ret < 0) 380 goto fail; 381 382 pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO); 383 if (pandora_wl1251_pdata.irq < 0) 384 goto fail_irq; 385 386 pandora_wl1251_pdata.use_eeprom = true; 387 ret = wl1251_set_platform_data(&pandora_wl1251_pdata); 388 if (ret < 0) 389 goto fail_irq; 390 391 return; 392 393 fail_irq: 394 gpio_free(PANDORA_WIFI_IRQ_GPIO); 395 fail: 396 pr_err("wl1251 board initialisation failed\n"); 397 } 398 399 static void __init omap3_pandora_legacy_init(void) 400 { 401 platform_device_register(&pandora_backlight); 402 platform_device_register(&pandora_vwlan_device); 403 omap_hsmmc_init(pandora_mmc3); 404 omap_hsmmc_late_init(pandora_mmc3); 405 pandora_wl1251_init(); 406 } 407 #endif /* CONFIG_ARCH_OMAP3 */ 408 409 #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) 410 static struct iommu_platform_data omap4_iommu_pdata = { 411 .reset_name = "mmu_cache", 412 .assert_reset = omap_device_assert_hardreset, 413 .deassert_reset = omap_device_deassert_hardreset, 414 }; 415 #endif 416 417 #if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX) 418 static struct wkup_m3_platform_data wkup_m3_data = { 419 .reset_name = "wkup_m3", 420 .assert_reset = omap_device_assert_hardreset, 421 .deassert_reset = omap_device_deassert_hardreset, 422 }; 423 #endif 424 425 #ifdef CONFIG_SOC_OMAP5 426 static void __init omap5_uevm_legacy_init(void) 427 { 428 } 429 #endif 430 431 static struct pcs_pdata pcs_pdata; 432 433 void omap_pcs_legacy_init(int irq, void (*rearm)(void)) 434 { 435 pcs_pdata.irq = irq; 436 pcs_pdata.rearm = rearm; 437 } 438 439 /* 440 * GPIOs for TWL are initialized by the I2C bus and need custom 441 * handing until DSS has device tree bindings. 442 */ 443 void omap_auxdata_legacy_init(struct device *dev) 444 { 445 if (dev->platform_data) 446 return; 447 448 if (strcmp("twl4030-gpio", dev_name(dev))) 449 return; 450 451 dev->platform_data = &twl_gpio_auxdata; 452 } 453 454 /* Dual mode timer PWM callbacks platdata */ 455 #if IS_ENABLED(CONFIG_OMAP_DM_TIMER) 456 struct pwm_omap_dmtimer_pdata pwm_dmtimer_pdata = { 457 .request_by_node = omap_dm_timer_request_by_node, 458 .free = omap_dm_timer_free, 459 .enable = omap_dm_timer_enable, 460 .disable = omap_dm_timer_disable, 461 .get_fclk = omap_dm_timer_get_fclk, 462 .start = omap_dm_timer_start, 463 .stop = omap_dm_timer_stop, 464 .set_load = omap_dm_timer_set_load, 465 .set_match = omap_dm_timer_set_match, 466 .set_pwm = omap_dm_timer_set_pwm, 467 .set_prescaler = omap_dm_timer_set_prescaler, 468 .write_counter = omap_dm_timer_write_counter, 469 }; 470 #endif 471 472 /* 473 * Few boards still need auxdata populated before we populate 474 * the dev entries in of_platform_populate(). 475 */ 476 static struct pdata_init auxdata_quirks[] __initdata = { 477 #ifdef CONFIG_SOC_OMAP2420 478 { "nokia,n800", omap2420_n8x0_legacy_init, }, 479 { "nokia,n810", omap2420_n8x0_legacy_init, }, 480 { "nokia,n810-wimax", omap2420_n8x0_legacy_init, }, 481 #endif 482 #ifdef CONFIG_ARCH_OMAP3 483 { "compulab,omap3-sbc-t3730", omap3_sbc_t3730_twl_init, }, 484 #endif 485 { /* sentinel */ }, 486 }; 487 488 static struct of_dev_auxdata omap_auxdata_lookup[] __initdata = { 489 #ifdef CONFIG_MACH_NOKIA_N8X0 490 OF_DEV_AUXDATA("ti,omap2420-mmc", 0x4809c000, "mmci-omap.0", NULL), 491 OF_DEV_AUXDATA("menelaus", 0x72, "1-0072", &n8x0_menelaus_platform_data), 492 OF_DEV_AUXDATA("tlv320aic3x", 0x18, "2-0018", &n810_aic33_data), 493 #endif 494 #ifdef CONFIG_ARCH_OMAP3 495 OF_DEV_AUXDATA("ti,omap3-padconf", 0x48002030, "48002030.pinmux", &pcs_pdata), 496 OF_DEV_AUXDATA("ti,omap3-padconf", 0x480025a0, "480025a0.pinmux", &pcs_pdata), 497 OF_DEV_AUXDATA("ti,omap3-padconf", 0x48002a00, "48002a00.pinmux", &pcs_pdata), 498 OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu", 499 &omap3_iommu_pdata), 500 /* Only on am3517 */ 501 OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL), 502 OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0", 503 &am35xx_emac_pdata), 504 #endif 505 #ifdef CONFIG_SOC_AM33XX 506 OF_DEV_AUXDATA("ti,am3352-wkup-m3", 0x44d00000, "44d00000.wkup_m3", 507 &wkup_m3_data), 508 #endif 509 #ifdef CONFIG_ARCH_OMAP4 510 OF_DEV_AUXDATA("ti,omap4-padconf", 0x4a100040, "4a100040.pinmux", &pcs_pdata), 511 OF_DEV_AUXDATA("ti,omap4-padconf", 0x4a31e040, "4a31e040.pinmux", &pcs_pdata), 512 #endif 513 #ifdef CONFIG_SOC_OMAP5 514 OF_DEV_AUXDATA("ti,omap5-padconf", 0x4a002840, "4a002840.pinmux", &pcs_pdata), 515 OF_DEV_AUXDATA("ti,omap5-padconf", 0x4ae0c840, "4ae0c840.pinmux", &pcs_pdata), 516 #endif 517 #ifdef CONFIG_SOC_DRA7XX 518 OF_DEV_AUXDATA("ti,dra7-padconf", 0x4a003400, "4a003400.pinmux", &pcs_pdata), 519 #endif 520 #ifdef CONFIG_SOC_AM43XX 521 OF_DEV_AUXDATA("ti,am437-padconf", 0x44e10800, "44e10800.pinmux", &pcs_pdata), 522 OF_DEV_AUXDATA("ti,am4372-wkup-m3", 0x44d00000, "44d00000.wkup_m3", 523 &wkup_m3_data), 524 #endif 525 #if IS_ENABLED(CONFIG_OMAP_DM_TIMER) 526 OF_DEV_AUXDATA("ti,omap-dmtimer-pwm", 0, NULL, &pwm_dmtimer_pdata), 527 #endif 528 #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) 529 OF_DEV_AUXDATA("ti,omap4-iommu", 0x4a066000, "4a066000.mmu", 530 &omap4_iommu_pdata), 531 OF_DEV_AUXDATA("ti,omap4-iommu", 0x55082000, "55082000.mmu", 532 &omap4_iommu_pdata), 533 #endif 534 { /* sentinel */ }, 535 }; 536 537 /* 538 * Few boards still need to initialize some legacy devices with 539 * platform data until the drivers support device tree. 540 */ 541 static struct pdata_init pdata_quirks[] __initdata = { 542 #ifdef CONFIG_ARCH_OMAP3 543 { "compulab,omap3-sbc-t3517", omap3_sbc_t3517_legacy_init, }, 544 { "compulab,omap3-sbc-t3530", omap3_sbc_t3530_legacy_init, }, 545 { "compulab,omap3-sbc-t3730", omap3_sbc_t3730_legacy_init, }, 546 { "nokia,omap3-n900", nokia_n900_legacy_init, }, 547 { "nokia,omap3-n9", hsmmc2_internal_input_clk, }, 548 { "nokia,omap3-n950", hsmmc2_internal_input_clk, }, 549 { "isee,omap3-igep0020-rev-f", omap3_igep0020_rev_f_legacy_init, }, 550 { "isee,omap3-igep0030-rev-g", omap3_igep0030_rev_g_legacy_init, }, 551 { "logicpd,dm3730-torpedo-devkit", omap3_logicpd_torpedo_init, }, 552 { "ti,omap3-evm-37xx", omap3_evm_legacy_init, }, 553 { "ti,am3517-evm", am3517_evm_legacy_init, }, 554 { "technexion,omap3-tao3530", omap3_tao3530_legacy_init, }, 555 { "openpandora,omap3-pandora-600mhz", omap3_pandora_legacy_init, }, 556 { "openpandora,omap3-pandora-1ghz", omap3_pandora_legacy_init, }, 557 #endif 558 #ifdef CONFIG_SOC_OMAP5 559 { "ti,omap5-uevm", omap5_uevm_legacy_init, }, 560 #endif 561 { /* sentinel */ }, 562 }; 563 564 static void pdata_quirks_check(struct pdata_init *quirks) 565 { 566 while (quirks->compatible) { 567 if (of_machine_is_compatible(quirks->compatible)) { 568 if (quirks->fn) 569 quirks->fn(); 570 break; 571 } 572 quirks++; 573 } 574 } 575 576 void __init pdata_quirks_init(const struct of_device_id *omap_dt_match_table) 577 { 578 /* 579 * We still need this for omap2420 and omap3 PM to work, others are 580 * using drivers/misc/sram.c already. 581 */ 582 if (of_machine_is_compatible("ti,omap2420") || 583 of_machine_is_compatible("ti,omap3")) 584 omap_sdrc_init(NULL, NULL); 585 586 pdata_quirks_check(auxdata_quirks); 587 of_platform_populate(NULL, omap_dt_match_table, 588 omap_auxdata_lookup, NULL); 589 pdata_quirks_check(pdata_quirks); 590 } 591