linux/arch/arm/mach-omap2/pdata-quirks.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Legacy platform_data quirks
   4 *
   5 * Copyright (C) 2013 Texas Instruments
   6 */
   7#include <linux/clk.h>
   8#include <linux/davinci_emac.h>
   9#include <linux/gpio.h>
  10#include <linux/init.h>
  11#include <linux/kernel.h>
  12#include <linux/of_platform.h>
  13#include <linux/wl12xx.h>
  14#include <linux/mmc/card.h>
  15#include <linux/mmc/host.h>
  16#include <linux/power/smartreflex.h>
  17#include <linux/regulator/machine.h>
  18#include <linux/regulator/fixed.h>
  19
  20#include <linux/platform_data/pinctrl-single.h>
  21#include <linux/platform_data/hsmmc-omap.h>
  22#include <linux/platform_data/iommu-omap.h>
  23#include <linux/platform_data/ti-sysc.h>
  24#include <linux/platform_data/wkup_m3.h>
  25#include <linux/platform_data/asoc-ti-mcbsp.h>
  26#include <linux/platform_data/ti-prm.h>
  27
  28#include "clockdomain.h"
  29#include "common.h"
  30#include "common-board-devices.h"
  31#include "control.h"
  32#include "omap_device.h"
  33#include "omap-secure.h"
  34#include "soc.h"
  35
  36static struct omap_hsmmc_platform_data __maybe_unused mmc_pdata[2];
  37
  38struct pdata_init {
  39        const char *compatible;
  40        void (*fn)(void);
  41};
  42
  43static struct of_dev_auxdata omap_auxdata_lookup[];
  44static struct twl4030_gpio_platform_data twl_gpio_auxdata;
  45
  46#if IS_ENABLED(CONFIG_OMAP_IOMMU)
  47int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev, bool request,
  48                                    u8 *pwrst);
  49#else
  50static inline int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev,
  51                                                  bool request, u8 *pwrst)
  52{
  53        return 0;
  54}
  55#endif
  56
  57#ifdef CONFIG_MACH_NOKIA_N8X0
  58static void __init omap2420_n8x0_legacy_init(void)
  59{
  60        omap_auxdata_lookup[0].platform_data = n8x0_legacy_init();
  61}
  62#else
  63#define omap2420_n8x0_legacy_init       NULL
  64#endif
  65
  66#ifdef CONFIG_ARCH_OMAP3
  67/*
  68 * Configures GPIOs 126, 127 and 129 to 1.8V mode instead of 3.0V
  69 * mode for MMC1 in case bootloader did not configure things.
  70 * Note that if the pins are used for MMC1, pbias-regulator
  71 * manages the IO voltage.
  72 */
  73static void __init omap3_gpio126_127_129(void)
  74{
  75        u32 reg;
  76
  77        reg = omap_ctrl_readl(OMAP343X_CONTROL_PBIAS_LITE);
  78        reg &= ~OMAP343X_PBIASLITEVMODE1;
  79        reg |= OMAP343X_PBIASLITEPWRDNZ1;
  80        omap_ctrl_writel(reg, OMAP343X_CONTROL_PBIAS_LITE);
  81        if (cpu_is_omap3630()) {
  82                reg = omap_ctrl_readl(OMAP34XX_CONTROL_WKUP_CTRL);
  83                reg |= OMAP36XX_GPIO_IO_PWRDNZ;
  84                omap_ctrl_writel(reg, OMAP34XX_CONTROL_WKUP_CTRL);
  85        }
  86}
  87
  88static void __init hsmmc2_internal_input_clk(void)
  89{
  90        u32 reg;
  91
  92        reg = omap_ctrl_readl(OMAP343X_CONTROL_DEVCONF1);
  93        reg |= OMAP2_MMCSDIO2ADPCLKISEL;
  94        omap_ctrl_writel(reg, OMAP343X_CONTROL_DEVCONF1);
  95}
  96
  97#ifdef CONFIG_OMAP_HWMOD
  98static struct iommu_platform_data omap3_iommu_pdata = {
  99        .reset_name = "mmu",
 100        .assert_reset = omap_device_assert_hardreset,
 101        .deassert_reset = omap_device_deassert_hardreset,
 102        .device_enable = omap_device_enable,
 103        .device_idle = omap_device_idle,
 104};
 105
 106static struct iommu_platform_data omap3_iommu_isp_pdata = {
 107        .device_enable = omap_device_enable,
 108        .device_idle = omap_device_idle,
 109};
 110#endif
 111
 112static int omap3_sbc_t3730_twl_callback(struct device *dev,
 113                                           unsigned gpio,
 114                                           unsigned ngpio)
 115{
 116        int res;
 117
 118        res = gpio_request_one(gpio + 2, GPIOF_OUT_INIT_HIGH,
 119                               "wlan pwr");
 120        if (res)
 121                return res;
 122
 123        gpio_export(gpio, 0);
 124
 125        return 0;
 126}
 127
 128static void __init omap3_sbc_t3x_usb_hub_init(int gpio, char *hub_name)
 129{
 130        int err = gpio_request_one(gpio, GPIOF_OUT_INIT_LOW, hub_name);
 131
 132        if (err) {
 133                pr_err("SBC-T3x: %s reset gpio request failed: %d\n",
 134                        hub_name, err);
 135                return;
 136        }
 137
 138        gpio_export(gpio, 0);
 139
 140        udelay(10);
 141        gpio_set_value(gpio, 1);
 142        msleep(1);
 143}
 144
 145static void __init omap3_sbc_t3730_twl_init(void)
 146{
 147        twl_gpio_auxdata.setup = omap3_sbc_t3730_twl_callback;
 148}
 149
 150static void __init omap3_sbc_t3730_legacy_init(void)
 151{
 152        omap3_sbc_t3x_usb_hub_init(167, "sb-t35 usb hub");
 153}
 154
 155static void __init omap3_sbc_t3530_legacy_init(void)
 156{
 157        omap3_sbc_t3x_usb_hub_init(167, "sb-t35 usb hub");
 158}
 159
 160static void __init omap3_evm_legacy_init(void)
 161{
 162        hsmmc2_internal_input_clk();
 163}
 164
 165static void am35xx_enable_emac_int(void)
 166{
 167        u32 v;
 168
 169        v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
 170        v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_CLR |
 171              AM35XX_CPGMAC_C0_MISC_PULSE_CLR | AM35XX_CPGMAC_C0_RX_THRESH_CLR);
 172        omap_ctrl_writel(v, AM35XX_CONTROL_LVL_INTR_CLEAR);
 173        omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); /* OCP barrier */
 174}
 175
 176static void am35xx_disable_emac_int(void)
 177{
 178        u32 v;
 179
 180        v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
 181        v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_CLR);
 182        omap_ctrl_writel(v, AM35XX_CONTROL_LVL_INTR_CLEAR);
 183        omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); /* OCP barrier */
 184}
 185
 186static struct emac_platform_data am35xx_emac_pdata = {
 187        .interrupt_enable       = am35xx_enable_emac_int,
 188        .interrupt_disable      = am35xx_disable_emac_int,
 189};
 190
 191static void __init am35xx_emac_reset(void)
 192{
 193        u32 v;
 194
 195        v = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
 196        v &= ~AM35XX_CPGMACSS_SW_RST;
 197        omap_ctrl_writel(v, AM35XX_CONTROL_IP_SW_RESET);
 198        omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); /* OCP barrier */
 199}
 200
 201static struct gpio cm_t3517_wlan_gpios[] __initdata = {
 202        { 56,   GPIOF_OUT_INIT_HIGH,    "wlan pwr" },
 203        { 4,    GPIOF_OUT_INIT_HIGH,    "xcvr noe" },
 204};
 205
 206static void __init omap3_sbc_t3517_wifi_init(void)
 207{
 208        int err = gpio_request_array(cm_t3517_wlan_gpios,
 209                                ARRAY_SIZE(cm_t3517_wlan_gpios));
 210        if (err) {
 211                pr_err("SBC-T3517: wl12xx gpios request failed: %d\n", err);
 212                return;
 213        }
 214
 215        gpio_export(cm_t3517_wlan_gpios[0].gpio, 0);
 216        gpio_export(cm_t3517_wlan_gpios[1].gpio, 0);
 217
 218        msleep(100);
 219        gpio_set_value(cm_t3517_wlan_gpios[1].gpio, 0);
 220}
 221
 222static void __init omap3_sbc_t3517_legacy_init(void)
 223{
 224        omap3_sbc_t3x_usb_hub_init(152, "cm-t3517 usb hub");
 225        omap3_sbc_t3x_usb_hub_init(98, "sb-t35 usb hub");
 226        am35xx_emac_reset();
 227        hsmmc2_internal_input_clk();
 228        omap3_sbc_t3517_wifi_init();
 229}
 230
 231static void __init am3517_evm_legacy_init(void)
 232{
 233        am35xx_emac_reset();
 234}
 235
 236static void __init nokia_n900_legacy_init(void)
 237{
 238        hsmmc2_internal_input_clk();
 239        mmc_pdata[0].name = "external";
 240        mmc_pdata[1].name = "internal";
 241
 242        if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
 243                if (IS_ENABLED(CONFIG_ARM_ERRATA_430973)) {
 244                        pr_info("RX-51: Enabling ARM errata 430973 workaround\n");
 245                        /* set IBE to 1 */
 246                        rx51_secure_update_aux_cr(BIT(6), 0);
 247                } else {
 248                        pr_warn("RX-51: Not enabling ARM errata 430973 workaround\n");
 249                        pr_warn("Thumb binaries may crash randomly without this workaround\n");
 250                }
 251        }
 252}
 253
 254static void __init omap3_tao3530_legacy_init(void)
 255{
 256        hsmmc2_internal_input_clk();
 257}
 258
 259static void __init omap3_logicpd_torpedo_init(void)
 260{
 261        omap3_gpio126_127_129();
 262}
 263
 264/* omap3pandora legacy devices */
 265
 266static struct platform_device pandora_backlight = {
 267        .name   = "pandora-backlight",
 268        .id     = -1,
 269};
 270
 271static void __init omap3_pandora_legacy_init(void)
 272{
 273        platform_device_register(&pandora_backlight);
 274}
 275#endif /* CONFIG_ARCH_OMAP3 */
 276
 277#ifdef CONFIG_SOC_OMAP5
 278static void __init omap5_uevm_legacy_init(void)
 279{
 280}
 281#endif
 282
 283#ifdef CONFIG_SOC_DRA7XX
 284static struct iommu_platform_data dra7_ipu1_dsp_iommu_pdata = {
 285        .set_pwrdm_constraint = omap_iommu_set_pwrdm_constraint,
 286};
 287
 288static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc1;
 289static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc2;
 290static struct omap_hsmmc_platform_data dra7_hsmmc_data_mmc3;
 291
 292static void __init dra7x_evm_mmc_quirk(void)
 293{
 294        if (omap_rev() == DRA752_REV_ES1_1 || omap_rev() == DRA752_REV_ES1_0) {
 295                dra7_hsmmc_data_mmc1.version = "rev11";
 296                dra7_hsmmc_data_mmc1.max_freq = 96000000;
 297
 298                dra7_hsmmc_data_mmc2.version = "rev11";
 299                dra7_hsmmc_data_mmc2.max_freq = 48000000;
 300
 301                dra7_hsmmc_data_mmc3.version = "rev11";
 302                dra7_hsmmc_data_mmc3.max_freq = 48000000;
 303        }
 304}
 305#endif
 306
 307static struct clockdomain *ti_sysc_find_one_clockdomain(struct clk *clk)
 308{
 309        struct clk_hw *hw = __clk_get_hw(clk);
 310        struct clockdomain *clkdm = NULL;
 311        struct clk_hw_omap *hwclk;
 312
 313        hwclk = to_clk_hw_omap(hw);
 314        if (!omap2_clk_is_hw_omap(hw))
 315                return NULL;
 316
 317        if (hwclk && hwclk->clkdm_name)
 318                clkdm = clkdm_lookup(hwclk->clkdm_name);
 319
 320        return clkdm;
 321}
 322
 323/**
 324 * ti_sysc_clkdm_init - find clockdomain based on clock
 325 * @fck: device functional clock
 326 * @ick: device interface clock
 327 * @dev: struct device
 328 *
 329 * Populate clockdomain based on clock. It is needed for
 330 * clkdm_deny_idle() and clkdm_allow_idle() for blocking clockdomain
 331 * clockdomain idle during reset, enable and idle.
 332 *
 333 * Note that we assume interconnect driver manages the clocks
 334 * and do not need to populate oh->_clk for dynamically
 335 * allocated modules.
 336 */
 337static int ti_sysc_clkdm_init(struct device *dev,
 338                              struct clk *fck, struct clk *ick,
 339                              struct ti_sysc_cookie *cookie)
 340{
 341        if (!IS_ERR(fck))
 342                cookie->clkdm = ti_sysc_find_one_clockdomain(fck);
 343        if (cookie->clkdm)
 344                return 0;
 345        if (!IS_ERR(ick))
 346                cookie->clkdm = ti_sysc_find_one_clockdomain(ick);
 347        if (cookie->clkdm)
 348                return 0;
 349
 350        return -ENODEV;
 351}
 352
 353static void ti_sysc_clkdm_deny_idle(struct device *dev,
 354                                    const struct ti_sysc_cookie *cookie)
 355{
 356        if (cookie->clkdm)
 357                clkdm_deny_idle(cookie->clkdm);
 358}
 359
 360static void ti_sysc_clkdm_allow_idle(struct device *dev,
 361                                     const struct ti_sysc_cookie *cookie)
 362{
 363        if (cookie->clkdm)
 364                clkdm_allow_idle(cookie->clkdm);
 365}
 366
 367#ifdef CONFIG_OMAP_HWMOD
 368static int ti_sysc_enable_module(struct device *dev,
 369                                 const struct ti_sysc_cookie *cookie)
 370{
 371        if (!cookie->data)
 372                return -EINVAL;
 373
 374        return omap_hwmod_enable(cookie->data);
 375}
 376
 377static int ti_sysc_idle_module(struct device *dev,
 378                               const struct ti_sysc_cookie *cookie)
 379{
 380        if (!cookie->data)
 381                return -EINVAL;
 382
 383        return omap_hwmod_idle(cookie->data);
 384}
 385
 386static int ti_sysc_shutdown_module(struct device *dev,
 387                                   const struct ti_sysc_cookie *cookie)
 388{
 389        if (!cookie->data)
 390                return -EINVAL;
 391
 392        return omap_hwmod_shutdown(cookie->data);
 393}
 394#endif  /* CONFIG_OMAP_HWMOD */
 395
 396static bool ti_sysc_soc_type_gp(void)
 397{
 398        return omap_type() == OMAP2_DEVICE_TYPE_GP;
 399}
 400
 401static struct of_dev_auxdata omap_auxdata_lookup[];
 402
 403static struct ti_sysc_platform_data ti_sysc_pdata = {
 404        .auxdata = omap_auxdata_lookup,
 405        .soc_type_gp = ti_sysc_soc_type_gp,
 406        .init_clockdomain = ti_sysc_clkdm_init,
 407        .clkdm_deny_idle = ti_sysc_clkdm_deny_idle,
 408        .clkdm_allow_idle = ti_sysc_clkdm_allow_idle,
 409#ifdef CONFIG_OMAP_HWMOD
 410        .init_module = omap_hwmod_init_module,
 411        .enable_module = ti_sysc_enable_module,
 412        .idle_module = ti_sysc_idle_module,
 413        .shutdown_module = ti_sysc_shutdown_module,
 414#endif
 415};
 416
 417static struct pcs_pdata pcs_pdata;
 418
 419void omap_pcs_legacy_init(int irq, void (*rearm)(void))
 420{
 421        pcs_pdata.irq = irq;
 422        pcs_pdata.rearm = rearm;
 423}
 424
 425static struct ti_prm_platform_data ti_prm_pdata = {
 426        .clkdm_deny_idle = clkdm_deny_idle,
 427        .clkdm_allow_idle = clkdm_allow_idle,
 428        .clkdm_lookup = clkdm_lookup,
 429};
 430
 431/*
 432 * GPIOs for TWL are initialized by the I2C bus and need custom
 433 * handing until DSS has device tree bindings.
 434 */
 435void omap_auxdata_legacy_init(struct device *dev)
 436{
 437        if (dev->platform_data)
 438                return;
 439
 440        if (strcmp("twl4030-gpio", dev_name(dev)))
 441                return;
 442
 443        dev->platform_data = &twl_gpio_auxdata;
 444}
 445
 446#if defined(CONFIG_ARCH_OMAP3) && IS_ENABLED(CONFIG_SND_SOC_OMAP_MCBSP)
 447static struct omap_mcbsp_platform_data mcbsp_pdata;
 448static void __init omap3_mcbsp_init(void)
 449{
 450        omap3_mcbsp_init_pdata_callback(&mcbsp_pdata);
 451}
 452#else
 453static void __init omap3_mcbsp_init(void) {}
 454#endif
 455
 456/*
 457 * Few boards still need auxdata populated before we populate
 458 * the dev entries in of_platform_populate().
 459 */
 460static 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
 472struct omap_sr_data __maybe_unused omap_sr_pdata[OMAP_SR_NR];
 473
 474static struct of_dev_auxdata omap_auxdata_lookup[] = {
 475#ifdef CONFIG_MACH_NOKIA_N8X0
 476        OF_DEV_AUXDATA("ti,omap2420-mmc", 0x4809c000, "mmci-omap.0", NULL),
 477        OF_DEV_AUXDATA("menelaus", 0x72, "1-0072", &n8x0_menelaus_platform_data),
 478        OF_DEV_AUXDATA("tlv320aic3x", 0x18, "2-0018", &n810_aic33_data),
 479#endif
 480#ifdef CONFIG_ARCH_OMAP3
 481        OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu",
 482                       &omap3_iommu_pdata),
 483        OF_DEV_AUXDATA("ti,omap2-iommu", 0x480bd400, "480bd400.mmu",
 484                       &omap3_iommu_isp_pdata),
 485        OF_DEV_AUXDATA("ti,omap3-smartreflex-core", 0x480cb000,
 486                       "480cb000.smartreflex", &omap_sr_pdata[OMAP_SR_CORE]),
 487        OF_DEV_AUXDATA("ti,omap3-smartreflex-mpu-iva", 0x480c9000,
 488                       "480c9000.smartreflex", &omap_sr_pdata[OMAP_SR_MPU]),
 489        OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x4809c000, "4809c000.mmc", &mmc_pdata[0]),
 490        OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x480b4000, "480b4000.mmc", &mmc_pdata[1]),
 491        /* Only on am3517 */
 492        OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL),
 493        OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0",
 494                       &am35xx_emac_pdata),
 495        OF_DEV_AUXDATA("nokia,n900-rom-rng", 0, NULL, rx51_secure_rng_call),
 496        /* McBSP modules with sidetone core */
 497#if IS_ENABLED(CONFIG_SND_SOC_OMAP_MCBSP)
 498        OF_DEV_AUXDATA("ti,omap3-mcbsp", 0x49022000, "49022000.mcbsp", &mcbsp_pdata),
 499        OF_DEV_AUXDATA("ti,omap3-mcbsp", 0x49024000, "49024000.mcbsp", &mcbsp_pdata),
 500#endif
 501#endif
 502#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5)
 503        OF_DEV_AUXDATA("ti,omap4-smartreflex-iva", 0x4a0db000,
 504                       "4a0db000.smartreflex", &omap_sr_pdata[OMAP_SR_IVA]),
 505        OF_DEV_AUXDATA("ti,omap4-smartreflex-core", 0x4a0dd000,
 506                       "4a0dd000.smartreflex", &omap_sr_pdata[OMAP_SR_CORE]),
 507        OF_DEV_AUXDATA("ti,omap4-smartreflex-mpu", 0x4a0d9000,
 508                       "4a0d9000.smartreflex", &omap_sr_pdata[OMAP_SR_MPU]),
 509#endif
 510#ifdef CONFIG_SOC_DRA7XX
 511        OF_DEV_AUXDATA("ti,dra7-hsmmc", 0x4809c000, "4809c000.mmc",
 512                       &dra7_hsmmc_data_mmc1),
 513        OF_DEV_AUXDATA("ti,dra7-hsmmc", 0x480b4000, "480b4000.mmc",
 514                       &dra7_hsmmc_data_mmc2),
 515        OF_DEV_AUXDATA("ti,dra7-hsmmc", 0x480ad000, "480ad000.mmc",
 516                       &dra7_hsmmc_data_mmc3),
 517        OF_DEV_AUXDATA("ti,dra7-dsp-iommu", 0x40d01000, "40d01000.mmu",
 518                       &dra7_ipu1_dsp_iommu_pdata),
 519        OF_DEV_AUXDATA("ti,dra7-dsp-iommu", 0x41501000, "41501000.mmu",
 520                       &dra7_ipu1_dsp_iommu_pdata),
 521        OF_DEV_AUXDATA("ti,dra7-iommu", 0x58882000, "58882000.mmu",
 522                       &dra7_ipu1_dsp_iommu_pdata),
 523#endif
 524        /* Common auxdata */
 525        OF_DEV_AUXDATA("simple-pm-bus", 0, NULL, omap_auxdata_lookup),
 526        OF_DEV_AUXDATA("ti,sysc", 0, NULL, &ti_sysc_pdata),
 527        OF_DEV_AUXDATA("pinctrl-single", 0, NULL, &pcs_pdata),
 528        OF_DEV_AUXDATA("ti,omap-prm-inst", 0, NULL, &ti_prm_pdata),
 529        OF_DEV_AUXDATA("ti,omap-sdma", 0, NULL, &dma_plat_info),
 530        { /* sentinel */ },
 531};
 532
 533/*
 534 * Few boards still need to initialize some legacy devices with
 535 * platform data until the drivers support device tree.
 536 */
 537static struct pdata_init pdata_quirks[] __initdata = {
 538#ifdef CONFIG_ARCH_OMAP3
 539        { "compulab,omap3-sbc-t3517", omap3_sbc_t3517_legacy_init, },
 540        { "compulab,omap3-sbc-t3530", omap3_sbc_t3530_legacy_init, },
 541        { "compulab,omap3-sbc-t3730", omap3_sbc_t3730_legacy_init, },
 542        { "nokia,omap3-n900", nokia_n900_legacy_init, },
 543        { "nokia,omap3-n9", hsmmc2_internal_input_clk, },
 544        { "nokia,omap3-n950", hsmmc2_internal_input_clk, },
 545        { "logicpd,dm3730-torpedo-devkit", omap3_logicpd_torpedo_init, },
 546        { "ti,omap3-evm-37xx", omap3_evm_legacy_init, },
 547        { "ti,am3517-evm", am3517_evm_legacy_init, },
 548        { "technexion,omap3-tao3530", omap3_tao3530_legacy_init, },
 549        { "openpandora,omap3-pandora-600mhz", omap3_pandora_legacy_init, },
 550        { "openpandora,omap3-pandora-1ghz", omap3_pandora_legacy_init, },
 551#endif
 552#ifdef CONFIG_SOC_OMAP5
 553        { "ti,omap5-uevm", omap5_uevm_legacy_init, },
 554#endif
 555#ifdef CONFIG_SOC_DRA7XX
 556        { "ti,dra7-evm", dra7x_evm_mmc_quirk, },
 557#endif
 558        { /* sentinel */ },
 559};
 560
 561static void pdata_quirks_check(struct pdata_init *quirks)
 562{
 563        while (quirks->compatible) {
 564                if (of_machine_is_compatible(quirks->compatible)) {
 565                        if (quirks->fn)
 566                                quirks->fn();
 567                }
 568                quirks++;
 569        }
 570}
 571
 572static const char * const pdata_quirks_init_nodes[] = {
 573        "prcm",
 574        "prm",
 575};
 576
 577static void __init
 578pdata_quirks_init_clocks(const struct of_device_id *omap_dt_match_table)
 579{
 580        struct device_node *np;
 581        int i;
 582
 583        for (i = 0; i < ARRAY_SIZE(pdata_quirks_init_nodes); i++) {
 584                np = of_find_node_by_name(NULL, pdata_quirks_init_nodes[i]);
 585                if (!np)
 586                        continue;
 587
 588                of_platform_populate(np, omap_dt_match_table,
 589                                     omap_auxdata_lookup, NULL);
 590        }
 591}
 592
 593void __init pdata_quirks_init(const struct of_device_id *omap_dt_match_table)
 594{
 595        /*
 596         * We still need this for omap2420 and omap3 PM to work, others are
 597         * using drivers/misc/sram.c already.
 598         */
 599        if (of_machine_is_compatible("ti,omap2420") ||
 600            of_machine_is_compatible("ti,omap3"))
 601                omap_sdrc_init(NULL, NULL);
 602
 603        if (of_machine_is_compatible("ti,omap3"))
 604                omap3_mcbsp_init();
 605        pdata_quirks_check(auxdata_quirks);
 606
 607        pdata_quirks_init_clocks(omap_dt_match_table);
 608
 609        of_platform_populate(NULL, omap_dt_match_table,
 610                             omap_auxdata_lookup, NULL);
 611        pdata_quirks_check(pdata_quirks);
 612}
 613