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 18 #include <linux/platform_data/pinctrl-single.h> 19 #include <linux/platform_data/iommu-omap.h> 20 21 #include "common.h" 22 #include "common-board-devices.h" 23 #include "dss-common.h" 24 #include "control.h" 25 #include "omap_device.h" 26 #include "omap-secure.h" 27 #include "soc.h" 28 29 struct pdata_init { 30 const char *compatible; 31 void (*fn)(void); 32 }; 33 34 struct of_dev_auxdata omap_auxdata_lookup[]; 35 static struct twl4030_gpio_platform_data twl_gpio_auxdata; 36 37 #ifdef CONFIG_MACH_NOKIA_N8X0 38 static void __init omap2420_n8x0_legacy_init(void) 39 { 40 omap_auxdata_lookup[0].platform_data = n8x0_legacy_init(); 41 } 42 #else 43 #define omap2420_n8x0_legacy_init NULL 44 #endif 45 46 #ifdef CONFIG_ARCH_OMAP3 47 /* 48 * Configures GPIOs 126, 127 and 129 to 1.8V mode instead of 3.0V 49 * mode for MMC1 in case bootloader did not configure things. 50 * Note that if the pins are used for MMC1, pbias-regulator 51 * manages the IO voltage. 52 */ 53 static void __init omap3_gpio126_127_129(void) 54 { 55 u32 reg; 56 57 reg = omap_ctrl_readl(OMAP343X_CONTROL_PBIAS_LITE); 58 reg &= ~OMAP343X_PBIASLITEVMODE1; 59 reg |= OMAP343X_PBIASLITEPWRDNZ1; 60 omap_ctrl_writel(reg, OMAP343X_CONTROL_PBIAS_LITE); 61 if (cpu_is_omap3630()) { 62 reg = omap_ctrl_readl(OMAP34XX_CONTROL_WKUP_CTRL); 63 reg |= OMAP36XX_GPIO_IO_PWRDNZ; 64 omap_ctrl_writel(reg, OMAP34XX_CONTROL_WKUP_CTRL); 65 } 66 } 67 68 static void __init hsmmc2_internal_input_clk(void) 69 { 70 u32 reg; 71 72 reg = omap_ctrl_readl(OMAP343X_CONTROL_DEVCONF1); 73 reg |= OMAP2_MMCSDIO2ADPCLKISEL; 74 omap_ctrl_writel(reg, OMAP343X_CONTROL_DEVCONF1); 75 } 76 77 static struct iommu_platform_data omap3_iommu_pdata = { 78 .reset_name = "mmu", 79 .assert_reset = omap_device_assert_hardreset, 80 .deassert_reset = omap_device_deassert_hardreset, 81 }; 82 83 static int omap3_sbc_t3730_twl_callback(struct device *dev, 84 unsigned gpio, 85 unsigned ngpio) 86 { 87 int res; 88 89 res = gpio_request_one(gpio + 2, GPIOF_OUT_INIT_HIGH, 90 "wlan pwr"); 91 if (res) 92 return res; 93 94 gpio_export(gpio, 0); 95 96 return 0; 97 } 98 99 static void __init omap3_sbc_t3x_usb_hub_init(int gpio, char *hub_name) 100 { 101 int err = gpio_request_one(gpio, GPIOF_OUT_INIT_LOW, hub_name); 102 103 if (err) { 104 pr_err("SBC-T3x: %s reset gpio request failed: %d\n", 105 hub_name, err); 106 return; 107 } 108 109 gpio_export(gpio, 0); 110 111 udelay(10); 112 gpio_set_value(gpio, 1); 113 msleep(1); 114 } 115 116 static void __init omap3_sbc_t3730_twl_init(void) 117 { 118 twl_gpio_auxdata.setup = omap3_sbc_t3730_twl_callback; 119 } 120 121 static void __init omap3_sbc_t3730_legacy_init(void) 122 { 123 omap3_sbc_t3x_usb_hub_init(167, "sb-t35 usb hub"); 124 } 125 126 static void __init omap3_sbc_t3530_legacy_init(void) 127 { 128 omap3_sbc_t3x_usb_hub_init(167, "sb-t35 usb hub"); 129 } 130 131 struct ti_st_plat_data wilink_pdata = { 132 .nshutdown_gpio = 137, 133 .dev_name = "/dev/ttyO1", 134 .flow_cntrl = 1, 135 .baud_rate = 300000, 136 }; 137 138 static struct platform_device wl18xx_device = { 139 .name = "kim", 140 .id = -1, 141 .dev = { 142 .platform_data = &wilink_pdata, 143 } 144 }; 145 146 static struct platform_device btwilink_device = { 147 .name = "btwilink", 148 .id = -1, 149 }; 150 151 static void __init omap3_igep0020_rev_f_legacy_init(void) 152 { 153 platform_device_register(&wl18xx_device); 154 platform_device_register(&btwilink_device); 155 } 156 157 static void __init omap3_igep0030_rev_g_legacy_init(void) 158 { 159 platform_device_register(&wl18xx_device); 160 platform_device_register(&btwilink_device); 161 } 162 163 static void __init omap3_evm_legacy_init(void) 164 { 165 hsmmc2_internal_input_clk(); 166 } 167 168 static void am35xx_enable_emac_int(void) 169 { 170 u32 v; 171 172 v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 173 v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_CLR | 174 AM35XX_CPGMAC_C0_MISC_PULSE_CLR | AM35XX_CPGMAC_C0_RX_THRESH_CLR); 175 omap_ctrl_writel(v, AM35XX_CONTROL_LVL_INTR_CLEAR); 176 omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); /* OCP barrier */ 177 } 178 179 static void am35xx_disable_emac_int(void) 180 { 181 u32 v; 182 183 v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 184 v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_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 struct emac_platform_data am35xx_emac_pdata = { 190 .interrupt_enable = am35xx_enable_emac_int, 191 .interrupt_disable = am35xx_disable_emac_int, 192 }; 193 194 static void __init am35xx_emac_reset(void) 195 { 196 u32 v; 197 198 v = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); 199 v &= ~AM35XX_CPGMACSS_SW_RST; 200 omap_ctrl_writel(v, AM35XX_CONTROL_IP_SW_RESET); 201 omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); /* OCP barrier */ 202 } 203 204 static struct gpio cm_t3517_wlan_gpios[] __initdata = { 205 { 56, GPIOF_OUT_INIT_HIGH, "wlan pwr" }, 206 { 4, GPIOF_OUT_INIT_HIGH, "xcvr noe" }, 207 }; 208 209 static void __init omap3_sbc_t3517_wifi_init(void) 210 { 211 int err = gpio_request_array(cm_t3517_wlan_gpios, 212 ARRAY_SIZE(cm_t3517_wlan_gpios)); 213 if (err) { 214 pr_err("SBC-T3517: wl12xx gpios request failed: %d\n", err); 215 return; 216 } 217 218 gpio_export(cm_t3517_wlan_gpios[0].gpio, 0); 219 gpio_export(cm_t3517_wlan_gpios[1].gpio, 0); 220 221 msleep(100); 222 gpio_set_value(cm_t3517_wlan_gpios[1].gpio, 0); 223 } 224 225 static void __init omap3_sbc_t3517_legacy_init(void) 226 { 227 omap3_sbc_t3x_usb_hub_init(152, "cm-t3517 usb hub"); 228 omap3_sbc_t3x_usb_hub_init(98, "sb-t35 usb hub"); 229 am35xx_emac_reset(); 230 hsmmc2_internal_input_clk(); 231 omap3_sbc_t3517_wifi_init(); 232 } 233 234 static void __init am3517_evm_legacy_init(void) 235 { 236 am35xx_emac_reset(); 237 } 238 239 static struct platform_device omap3_rom_rng_device = { 240 .name = "omap3-rom-rng", 241 .id = -1, 242 .dev = { 243 .platform_data = rx51_secure_rng_call, 244 }, 245 }; 246 247 static void __init nokia_n900_legacy_init(void) 248 { 249 hsmmc2_internal_input_clk(); 250 251 if (omap_type() == OMAP2_DEVICE_TYPE_SEC) { 252 if (IS_ENABLED(CONFIG_ARM_ERRATA_430973)) { 253 pr_info("RX-51: Enabling ARM errata 430973 workaround\n"); 254 /* set IBE to 1 */ 255 rx51_secure_update_aux_cr(BIT(6), 0); 256 } else { 257 pr_warn("RX-51: Not enabling ARM errata 430973 workaround\n"); 258 pr_warn("Thumb binaries may crash randomly without this workaround\n"); 259 } 260 261 pr_info("RX-51: Registring OMAP3 HWRNG device\n"); 262 platform_device_register(&omap3_rom_rng_device); 263 264 } 265 } 266 267 static void __init omap3_tao3530_legacy_init(void) 268 { 269 hsmmc2_internal_input_clk(); 270 } 271 #endif /* CONFIG_ARCH_OMAP3 */ 272 273 #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) 274 static struct iommu_platform_data omap4_iommu_pdata = { 275 .reset_name = "mmu_cache", 276 .assert_reset = omap_device_assert_hardreset, 277 .deassert_reset = omap_device_deassert_hardreset, 278 }; 279 #endif 280 281 #ifdef CONFIG_SOC_OMAP5 282 static void __init omap5_uevm_legacy_init(void) 283 { 284 } 285 #endif 286 287 static struct pcs_pdata pcs_pdata; 288 289 void omap_pcs_legacy_init(int irq, void (*rearm)(void)) 290 { 291 pcs_pdata.irq = irq; 292 pcs_pdata.rearm = rearm; 293 } 294 295 /* 296 * GPIOs for TWL are initialized by the I2C bus and need custom 297 * handing until DSS has device tree bindings. 298 */ 299 void omap_auxdata_legacy_init(struct device *dev) 300 { 301 if (dev->platform_data) 302 return; 303 304 if (strcmp("twl4030-gpio", dev_name(dev))) 305 return; 306 307 dev->platform_data = &twl_gpio_auxdata; 308 } 309 310 /* 311 * Few boards still need auxdata populated before we populate 312 * the dev entries in of_platform_populate(). 313 */ 314 static struct pdata_init auxdata_quirks[] __initdata = { 315 #ifdef CONFIG_SOC_OMAP2420 316 { "nokia,n800", omap2420_n8x0_legacy_init, }, 317 { "nokia,n810", omap2420_n8x0_legacy_init, }, 318 { "nokia,n810-wimax", omap2420_n8x0_legacy_init, }, 319 #endif 320 #ifdef CONFIG_ARCH_OMAP3 321 { "compulab,omap3-sbc-t3730", omap3_sbc_t3730_twl_init, }, 322 #endif 323 { /* sentinel */ }, 324 }; 325 326 struct of_dev_auxdata omap_auxdata_lookup[] __initdata = { 327 #ifdef CONFIG_MACH_NOKIA_N8X0 328 OF_DEV_AUXDATA("ti,omap2420-mmc", 0x4809c000, "mmci-omap.0", NULL), 329 OF_DEV_AUXDATA("menelaus", 0x72, "1-0072", &n8x0_menelaus_platform_data), 330 OF_DEV_AUXDATA("tlv320aic3x", 0x18, "2-0018", &n810_aic33_data), 331 #endif 332 #ifdef CONFIG_ARCH_OMAP3 333 OF_DEV_AUXDATA("ti,omap3-padconf", 0x48002030, "48002030.pinmux", &pcs_pdata), 334 OF_DEV_AUXDATA("ti,omap3-padconf", 0x480025a0, "480025a0.pinmux", &pcs_pdata), 335 OF_DEV_AUXDATA("ti,omap3-padconf", 0x48002a00, "48002a00.pinmux", &pcs_pdata), 336 OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu", 337 &omap3_iommu_pdata), 338 /* Only on am3517 */ 339 OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL), 340 OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0", 341 &am35xx_emac_pdata), 342 #endif 343 #ifdef CONFIG_ARCH_OMAP4 344 OF_DEV_AUXDATA("ti,omap4-padconf", 0x4a100040, "4a100040.pinmux", &pcs_pdata), 345 OF_DEV_AUXDATA("ti,omap4-padconf", 0x4a31e040, "4a31e040.pinmux", &pcs_pdata), 346 #endif 347 #ifdef CONFIG_SOC_OMAP5 348 OF_DEV_AUXDATA("ti,omap5-padconf", 0x4a002840, "4a002840.pinmux", &pcs_pdata), 349 OF_DEV_AUXDATA("ti,omap5-padconf", 0x4ae0c840, "4ae0c840.pinmux", &pcs_pdata), 350 #endif 351 #ifdef CONFIG_SOC_DRA7XX 352 OF_DEV_AUXDATA("ti,dra7-padconf", 0x4a003400, "4a003400.pinmux", &pcs_pdata), 353 #endif 354 #ifdef CONFIG_SOC_AM43XX 355 OF_DEV_AUXDATA("ti,am437-padconf", 0x44e10800, "44e10800.pinmux", &pcs_pdata), 356 #endif 357 #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) 358 OF_DEV_AUXDATA("ti,omap4-iommu", 0x4a066000, "4a066000.mmu", 359 &omap4_iommu_pdata), 360 OF_DEV_AUXDATA("ti,omap4-iommu", 0x55082000, "55082000.mmu", 361 &omap4_iommu_pdata), 362 #endif 363 { /* sentinel */ }, 364 }; 365 366 /* 367 * Few boards still need to initialize some legacy devices with 368 * platform data until the drivers support device tree. 369 */ 370 static struct pdata_init pdata_quirks[] __initdata = { 371 #ifdef CONFIG_ARCH_OMAP3 372 { "compulab,omap3-sbc-t3517", omap3_sbc_t3517_legacy_init, }, 373 { "compulab,omap3-sbc-t3530", omap3_sbc_t3530_legacy_init, }, 374 { "compulab,omap3-sbc-t3730", omap3_sbc_t3730_legacy_init, }, 375 { "nokia,omap3-n900", nokia_n900_legacy_init, }, 376 { "nokia,omap3-n9", hsmmc2_internal_input_clk, }, 377 { "nokia,omap3-n950", hsmmc2_internal_input_clk, }, 378 { "isee,omap3-igep0020-rev-f", omap3_igep0020_rev_f_legacy_init, }, 379 { "isee,omap3-igep0030-rev-g", omap3_igep0030_rev_g_legacy_init, }, 380 { "logicpd,dm3730-torpedo-devkit", omap3_gpio126_127_129, }, 381 { "ti,omap3-evm-37xx", omap3_evm_legacy_init, }, 382 { "ti,am3517-evm", am3517_evm_legacy_init, }, 383 { "technexion,omap3-tao3530", omap3_tao3530_legacy_init, }, 384 #endif 385 #ifdef CONFIG_SOC_OMAP5 386 { "ti,omap5-uevm", omap5_uevm_legacy_init, }, 387 #endif 388 { /* sentinel */ }, 389 }; 390 391 static void pdata_quirks_check(struct pdata_init *quirks) 392 { 393 while (quirks->compatible) { 394 if (of_machine_is_compatible(quirks->compatible)) { 395 if (quirks->fn) 396 quirks->fn(); 397 break; 398 } 399 quirks++; 400 } 401 } 402 403 void __init pdata_quirks_init(const struct of_device_id *omap_dt_match_table) 404 { 405 omap_sdrc_init(NULL, NULL); 406 pdata_quirks_check(auxdata_quirks); 407 of_platform_populate(NULL, omap_dt_match_table, 408 omap_auxdata_lookup, NULL); 409 pdata_quirks_check(pdata_quirks); 410 } 411