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