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