162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Legacy platform_data quirks 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2013 Texas Instruments 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/clk.h> 862306a36Sopenharmony_ci#include <linux/davinci_emac.h> 962306a36Sopenharmony_ci#include <linux/gpio/machine.h> 1062306a36Sopenharmony_ci#include <linux/gpio/consumer.h> 1162306a36Sopenharmony_ci#include <linux/init.h> 1262306a36Sopenharmony_ci#include <linux/kernel.h> 1362306a36Sopenharmony_ci#include <linux/of_platform.h> 1462306a36Sopenharmony_ci#include <linux/mmc/card.h> 1562306a36Sopenharmony_ci#include <linux/mmc/host.h> 1662306a36Sopenharmony_ci#include <linux/power/smartreflex.h> 1762306a36Sopenharmony_ci#include <linux/regulator/machine.h> 1862306a36Sopenharmony_ci#include <linux/regulator/fixed.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <linux/platform_data/pinctrl-single.h> 2162306a36Sopenharmony_ci#include <linux/platform_data/hsmmc-omap.h> 2262306a36Sopenharmony_ci#include <linux/platform_data/iommu-omap.h> 2362306a36Sopenharmony_ci#include <linux/platform_data/ti-sysc.h> 2462306a36Sopenharmony_ci#include <linux/platform_data/wkup_m3.h> 2562306a36Sopenharmony_ci#include <linux/platform_data/asoc-ti-mcbsp.h> 2662306a36Sopenharmony_ci#include <linux/platform_data/ti-prm.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#include "clockdomain.h" 2962306a36Sopenharmony_ci#include "common.h" 3062306a36Sopenharmony_ci#include "common-board-devices.h" 3162306a36Sopenharmony_ci#include "control.h" 3262306a36Sopenharmony_ci#include "omap_device.h" 3362306a36Sopenharmony_ci#include "omap-secure.h" 3462306a36Sopenharmony_ci#include "soc.h" 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic struct omap_hsmmc_platform_data __maybe_unused mmc_pdata[2]; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct pdata_init { 3962306a36Sopenharmony_ci const char *compatible; 4062306a36Sopenharmony_ci void (*fn)(void); 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic struct of_dev_auxdata omap_auxdata_lookup[]; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#ifdef CONFIG_MACH_NOKIA_N8X0 4662306a36Sopenharmony_cistatic void __init omap2420_n8x0_legacy_init(void) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci omap_auxdata_lookup[0].platform_data = n8x0_legacy_init(); 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci#else 5162306a36Sopenharmony_ci#define omap2420_n8x0_legacy_init NULL 5262306a36Sopenharmony_ci#endif 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3 5562306a36Sopenharmony_ci/* 5662306a36Sopenharmony_ci * Configures GPIOs 126, 127 and 129 to 1.8V mode instead of 3.0V 5762306a36Sopenharmony_ci * mode for MMC1 in case bootloader did not configure things. 5862306a36Sopenharmony_ci * Note that if the pins are used for MMC1, pbias-regulator 5962306a36Sopenharmony_ci * manages the IO voltage. 6062306a36Sopenharmony_ci */ 6162306a36Sopenharmony_cistatic void __init omap3_gpio126_127_129(void) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci u32 reg; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci reg = omap_ctrl_readl(OMAP343X_CONTROL_PBIAS_LITE); 6662306a36Sopenharmony_ci reg &= ~OMAP343X_PBIASLITEVMODE1; 6762306a36Sopenharmony_ci reg |= OMAP343X_PBIASLITEPWRDNZ1; 6862306a36Sopenharmony_ci omap_ctrl_writel(reg, OMAP343X_CONTROL_PBIAS_LITE); 6962306a36Sopenharmony_ci if (cpu_is_omap3630()) { 7062306a36Sopenharmony_ci reg = omap_ctrl_readl(OMAP34XX_CONTROL_WKUP_CTRL); 7162306a36Sopenharmony_ci reg |= OMAP36XX_GPIO_IO_PWRDNZ; 7262306a36Sopenharmony_ci omap_ctrl_writel(reg, OMAP34XX_CONTROL_WKUP_CTRL); 7362306a36Sopenharmony_ci } 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistatic void __init hsmmc2_internal_input_clk(void) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci u32 reg; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci reg = omap_ctrl_readl(OMAP343X_CONTROL_DEVCONF1); 8162306a36Sopenharmony_ci reg |= OMAP2_MMCSDIO2ADPCLKISEL; 8262306a36Sopenharmony_ci omap_ctrl_writel(reg, OMAP343X_CONTROL_DEVCONF1); 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#ifdef CONFIG_OMAP_HWMOD 8662306a36Sopenharmony_cistatic struct iommu_platform_data omap3_iommu_pdata = { 8762306a36Sopenharmony_ci .reset_name = "mmu", 8862306a36Sopenharmony_ci .assert_reset = omap_device_assert_hardreset, 8962306a36Sopenharmony_ci .deassert_reset = omap_device_deassert_hardreset, 9062306a36Sopenharmony_ci .device_enable = omap_device_enable, 9162306a36Sopenharmony_ci .device_idle = omap_device_idle, 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic struct iommu_platform_data omap3_iommu_isp_pdata = { 9562306a36Sopenharmony_ci .device_enable = omap_device_enable, 9662306a36Sopenharmony_ci .device_idle = omap_device_idle, 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci#endif 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistatic void __init omap3_sbc_t3x_usb_hub_init(char *hub_name, int idx) 10162306a36Sopenharmony_ci{ 10262306a36Sopenharmony_ci struct gpio_desc *d; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci /* This asserts the RESET line (reverse polarity) */ 10562306a36Sopenharmony_ci d = gpiod_get_index(NULL, "reset", idx, GPIOD_OUT_HIGH); 10662306a36Sopenharmony_ci if (IS_ERR(d)) { 10762306a36Sopenharmony_ci pr_err("Unable to get T3x USB reset GPIO descriptor\n"); 10862306a36Sopenharmony_ci return; 10962306a36Sopenharmony_ci } 11062306a36Sopenharmony_ci gpiod_set_consumer_name(d, hub_name); 11162306a36Sopenharmony_ci gpiod_export(d, 0); 11262306a36Sopenharmony_ci udelay(10); 11362306a36Sopenharmony_ci /* De-assert RESET */ 11462306a36Sopenharmony_ci gpiod_set_value(d, 0); 11562306a36Sopenharmony_ci msleep(1); 11662306a36Sopenharmony_ci} 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic struct gpiod_lookup_table omap3_sbc_t3x_usb_gpio_table = { 11962306a36Sopenharmony_ci .dev_id = NULL, 12062306a36Sopenharmony_ci .table = { 12162306a36Sopenharmony_ci GPIO_LOOKUP_IDX("gpio-160-175", 7, "reset", 0, 12262306a36Sopenharmony_ci GPIO_ACTIVE_LOW), 12362306a36Sopenharmony_ci { } 12462306a36Sopenharmony_ci }, 12562306a36Sopenharmony_ci}; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistatic void __init omap3_sbc_t3730_legacy_init(void) 12862306a36Sopenharmony_ci{ 12962306a36Sopenharmony_ci gpiod_add_lookup_table(&omap3_sbc_t3x_usb_gpio_table); 13062306a36Sopenharmony_ci omap3_sbc_t3x_usb_hub_init("sb-t35 usb hub", 0); 13162306a36Sopenharmony_ci} 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic void __init omap3_sbc_t3530_legacy_init(void) 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci gpiod_add_lookup_table(&omap3_sbc_t3x_usb_gpio_table); 13662306a36Sopenharmony_ci omap3_sbc_t3x_usb_hub_init("sb-t35 usb hub", 0); 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistatic void __init omap3_evm_legacy_init(void) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci hsmmc2_internal_input_clk(); 14262306a36Sopenharmony_ci} 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cistatic void am35xx_enable_emac_int(void) 14562306a36Sopenharmony_ci{ 14662306a36Sopenharmony_ci u32 v; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 14962306a36Sopenharmony_ci v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_CLR | 15062306a36Sopenharmony_ci AM35XX_CPGMAC_C0_MISC_PULSE_CLR | AM35XX_CPGMAC_C0_RX_THRESH_CLR); 15162306a36Sopenharmony_ci omap_ctrl_writel(v, AM35XX_CONTROL_LVL_INTR_CLEAR); 15262306a36Sopenharmony_ci omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); /* OCP barrier */ 15362306a36Sopenharmony_ci} 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistatic void am35xx_disable_emac_int(void) 15662306a36Sopenharmony_ci{ 15762306a36Sopenharmony_ci u32 v; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 16062306a36Sopenharmony_ci v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_CLR); 16162306a36Sopenharmony_ci omap_ctrl_writel(v, AM35XX_CONTROL_LVL_INTR_CLEAR); 16262306a36Sopenharmony_ci omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); /* OCP barrier */ 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic struct emac_platform_data am35xx_emac_pdata = { 16662306a36Sopenharmony_ci .interrupt_enable = am35xx_enable_emac_int, 16762306a36Sopenharmony_ci .interrupt_disable = am35xx_disable_emac_int, 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistatic void __init am35xx_emac_reset(void) 17162306a36Sopenharmony_ci{ 17262306a36Sopenharmony_ci u32 v; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci v = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); 17562306a36Sopenharmony_ci v &= ~AM35XX_CPGMACSS_SW_RST; 17662306a36Sopenharmony_ci omap_ctrl_writel(v, AM35XX_CONTROL_IP_SW_RESET); 17762306a36Sopenharmony_ci omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); /* OCP barrier */ 17862306a36Sopenharmony_ci} 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistatic struct gpiod_lookup_table cm_t3517_wlan_gpio_table = { 18162306a36Sopenharmony_ci .dev_id = NULL, 18262306a36Sopenharmony_ci .table = { 18362306a36Sopenharmony_ci GPIO_LOOKUP("gpio-48-53", 8, "power", 18462306a36Sopenharmony_ci GPIO_ACTIVE_HIGH), 18562306a36Sopenharmony_ci GPIO_LOOKUP("gpio-0-15", 4, "noe", 18662306a36Sopenharmony_ci GPIO_ACTIVE_HIGH), 18762306a36Sopenharmony_ci { } 18862306a36Sopenharmony_ci }, 18962306a36Sopenharmony_ci}; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistatic void __init omap3_sbc_t3517_wifi_init(void) 19262306a36Sopenharmony_ci{ 19362306a36Sopenharmony_ci struct gpio_desc *d; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci gpiod_add_lookup_table(&cm_t3517_wlan_gpio_table); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci /* This asserts the RESET line (reverse polarity) */ 19862306a36Sopenharmony_ci d = gpiod_get(NULL, "power", GPIOD_OUT_HIGH); 19962306a36Sopenharmony_ci if (IS_ERR(d)) { 20062306a36Sopenharmony_ci pr_err("Unable to get CM T3517 WLAN power GPIO descriptor\n"); 20162306a36Sopenharmony_ci } else { 20262306a36Sopenharmony_ci gpiod_set_consumer_name(d, "wlan pwr"); 20362306a36Sopenharmony_ci gpiod_export(d, 0); 20462306a36Sopenharmony_ci } 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci d = gpiod_get(NULL, "noe", GPIOD_OUT_HIGH); 20762306a36Sopenharmony_ci if (IS_ERR(d)) { 20862306a36Sopenharmony_ci pr_err("Unable to get CM T3517 WLAN XCVR NOE GPIO descriptor\n"); 20962306a36Sopenharmony_ci } else { 21062306a36Sopenharmony_ci gpiod_set_consumer_name(d, "xcvr noe"); 21162306a36Sopenharmony_ci gpiod_export(d, 0); 21262306a36Sopenharmony_ci } 21362306a36Sopenharmony_ci msleep(100); 21462306a36Sopenharmony_ci gpiod_set_value(d, 0); 21562306a36Sopenharmony_ci} 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_cistatic struct gpiod_lookup_table omap3_sbc_t3517_usb_gpio_table = { 21862306a36Sopenharmony_ci .dev_id = NULL, 21962306a36Sopenharmony_ci .table = { 22062306a36Sopenharmony_ci GPIO_LOOKUP_IDX("gpio-144-159", 8, "reset", 0, 22162306a36Sopenharmony_ci GPIO_ACTIVE_LOW), 22262306a36Sopenharmony_ci GPIO_LOOKUP_IDX("gpio-96-111", 2, "reset", 1, 22362306a36Sopenharmony_ci GPIO_ACTIVE_LOW), 22462306a36Sopenharmony_ci { } 22562306a36Sopenharmony_ci }, 22662306a36Sopenharmony_ci}; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistatic void __init omap3_sbc_t3517_legacy_init(void) 22962306a36Sopenharmony_ci{ 23062306a36Sopenharmony_ci gpiod_add_lookup_table(&omap3_sbc_t3517_usb_gpio_table); 23162306a36Sopenharmony_ci omap3_sbc_t3x_usb_hub_init("cm-t3517 usb hub", 0); 23262306a36Sopenharmony_ci omap3_sbc_t3x_usb_hub_init("sb-t35 usb hub", 1); 23362306a36Sopenharmony_ci am35xx_emac_reset(); 23462306a36Sopenharmony_ci hsmmc2_internal_input_clk(); 23562306a36Sopenharmony_ci omap3_sbc_t3517_wifi_init(); 23662306a36Sopenharmony_ci} 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistatic void __init am3517_evm_legacy_init(void) 23962306a36Sopenharmony_ci{ 24062306a36Sopenharmony_ci am35xx_emac_reset(); 24162306a36Sopenharmony_ci} 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistatic void __init nokia_n900_legacy_init(void) 24462306a36Sopenharmony_ci{ 24562306a36Sopenharmony_ci hsmmc2_internal_input_clk(); 24662306a36Sopenharmony_ci mmc_pdata[0].name = "external"; 24762306a36Sopenharmony_ci mmc_pdata[1].name = "internal"; 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci if (omap_type() != OMAP2_DEVICE_TYPE_GP) { 25062306a36Sopenharmony_ci if (IS_ENABLED(CONFIG_ARM_ERRATA_430973)) { 25162306a36Sopenharmony_ci pr_info("RX-51: Enabling ARM errata 430973 workaround\n"); 25262306a36Sopenharmony_ci /* set IBE to 1 */ 25362306a36Sopenharmony_ci rx51_secure_update_aux_cr(BIT(6), 0); 25462306a36Sopenharmony_ci } else { 25562306a36Sopenharmony_ci pr_warn("RX-51: Not enabling ARM errata 430973 workaround\n"); 25662306a36Sopenharmony_ci pr_warn("Thumb binaries may crash randomly without this workaround\n"); 25762306a36Sopenharmony_ci } 25862306a36Sopenharmony_ci } 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistatic void __init omap3_tao3530_legacy_init(void) 26262306a36Sopenharmony_ci{ 26362306a36Sopenharmony_ci hsmmc2_internal_input_clk(); 26462306a36Sopenharmony_ci} 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_cistatic void __init omap3_logicpd_torpedo_init(void) 26762306a36Sopenharmony_ci{ 26862306a36Sopenharmony_ci omap3_gpio126_127_129(); 26962306a36Sopenharmony_ci} 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci/* omap3pandora legacy devices */ 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_cistatic struct platform_device pandora_backlight = { 27462306a36Sopenharmony_ci .name = "pandora-backlight", 27562306a36Sopenharmony_ci .id = -1, 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistatic void __init omap3_pandora_legacy_init(void) 27962306a36Sopenharmony_ci{ 28062306a36Sopenharmony_ci platform_device_register(&pandora_backlight); 28162306a36Sopenharmony_ci} 28262306a36Sopenharmony_ci#endif /* CONFIG_ARCH_OMAP3 */ 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci#ifdef CONFIG_SOC_DRA7XX 28562306a36Sopenharmony_cistatic struct iommu_platform_data dra7_ipu1_dsp_iommu_pdata = { 28662306a36Sopenharmony_ci .set_pwrdm_constraint = omap_iommu_set_pwrdm_constraint, 28762306a36Sopenharmony_ci}; 28862306a36Sopenharmony_ci#endif 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cistatic struct clockdomain *ti_sysc_find_one_clockdomain(struct clk *clk) 29162306a36Sopenharmony_ci{ 29262306a36Sopenharmony_ci struct clk_hw *hw = __clk_get_hw(clk); 29362306a36Sopenharmony_ci struct clockdomain *clkdm = NULL; 29462306a36Sopenharmony_ci struct clk_hw_omap *hwclk; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci hwclk = to_clk_hw_omap(hw); 29762306a36Sopenharmony_ci if (!omap2_clk_is_hw_omap(hw)) 29862306a36Sopenharmony_ci return NULL; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci if (hwclk && hwclk->clkdm_name) 30162306a36Sopenharmony_ci clkdm = clkdm_lookup(hwclk->clkdm_name); 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci return clkdm; 30462306a36Sopenharmony_ci} 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci/** 30762306a36Sopenharmony_ci * ti_sysc_clkdm_init - find clockdomain based on clock 30862306a36Sopenharmony_ci * @fck: device functional clock 30962306a36Sopenharmony_ci * @ick: device interface clock 31062306a36Sopenharmony_ci * @dev: struct device 31162306a36Sopenharmony_ci * 31262306a36Sopenharmony_ci * Populate clockdomain based on clock. It is needed for 31362306a36Sopenharmony_ci * clkdm_deny_idle() and clkdm_allow_idle() for blocking clockdomain 31462306a36Sopenharmony_ci * clockdomain idle during reset, enable and idle. 31562306a36Sopenharmony_ci * 31662306a36Sopenharmony_ci * Note that we assume interconnect driver manages the clocks 31762306a36Sopenharmony_ci * and do not need to populate oh->_clk for dynamically 31862306a36Sopenharmony_ci * allocated modules. 31962306a36Sopenharmony_ci */ 32062306a36Sopenharmony_cistatic int ti_sysc_clkdm_init(struct device *dev, 32162306a36Sopenharmony_ci struct clk *fck, struct clk *ick, 32262306a36Sopenharmony_ci struct ti_sysc_cookie *cookie) 32362306a36Sopenharmony_ci{ 32462306a36Sopenharmony_ci if (!IS_ERR(fck)) 32562306a36Sopenharmony_ci cookie->clkdm = ti_sysc_find_one_clockdomain(fck); 32662306a36Sopenharmony_ci if (cookie->clkdm) 32762306a36Sopenharmony_ci return 0; 32862306a36Sopenharmony_ci if (!IS_ERR(ick)) 32962306a36Sopenharmony_ci cookie->clkdm = ti_sysc_find_one_clockdomain(ick); 33062306a36Sopenharmony_ci if (cookie->clkdm) 33162306a36Sopenharmony_ci return 0; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci return -ENODEV; 33462306a36Sopenharmony_ci} 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_cistatic void ti_sysc_clkdm_deny_idle(struct device *dev, 33762306a36Sopenharmony_ci const struct ti_sysc_cookie *cookie) 33862306a36Sopenharmony_ci{ 33962306a36Sopenharmony_ci if (cookie->clkdm) 34062306a36Sopenharmony_ci clkdm_deny_idle(cookie->clkdm); 34162306a36Sopenharmony_ci} 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic void ti_sysc_clkdm_allow_idle(struct device *dev, 34462306a36Sopenharmony_ci const struct ti_sysc_cookie *cookie) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci if (cookie->clkdm) 34762306a36Sopenharmony_ci clkdm_allow_idle(cookie->clkdm); 34862306a36Sopenharmony_ci} 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci#ifdef CONFIG_OMAP_HWMOD 35162306a36Sopenharmony_cistatic int ti_sysc_enable_module(struct device *dev, 35262306a36Sopenharmony_ci const struct ti_sysc_cookie *cookie) 35362306a36Sopenharmony_ci{ 35462306a36Sopenharmony_ci if (!cookie->data) 35562306a36Sopenharmony_ci return -EINVAL; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci return omap_hwmod_enable(cookie->data); 35862306a36Sopenharmony_ci} 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_cistatic int ti_sysc_idle_module(struct device *dev, 36162306a36Sopenharmony_ci const struct ti_sysc_cookie *cookie) 36262306a36Sopenharmony_ci{ 36362306a36Sopenharmony_ci if (!cookie->data) 36462306a36Sopenharmony_ci return -EINVAL; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci return omap_hwmod_idle(cookie->data); 36762306a36Sopenharmony_ci} 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistatic int ti_sysc_shutdown_module(struct device *dev, 37062306a36Sopenharmony_ci const struct ti_sysc_cookie *cookie) 37162306a36Sopenharmony_ci{ 37262306a36Sopenharmony_ci if (!cookie->data) 37362306a36Sopenharmony_ci return -EINVAL; 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci return omap_hwmod_shutdown(cookie->data); 37662306a36Sopenharmony_ci} 37762306a36Sopenharmony_ci#endif /* CONFIG_OMAP_HWMOD */ 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_cistatic bool ti_sysc_soc_type_gp(void) 38062306a36Sopenharmony_ci{ 38162306a36Sopenharmony_ci return omap_type() == OMAP2_DEVICE_TYPE_GP; 38262306a36Sopenharmony_ci} 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_cistatic struct of_dev_auxdata omap_auxdata_lookup[]; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cistatic struct ti_sysc_platform_data ti_sysc_pdata = { 38762306a36Sopenharmony_ci .auxdata = omap_auxdata_lookup, 38862306a36Sopenharmony_ci .soc_type_gp = ti_sysc_soc_type_gp, 38962306a36Sopenharmony_ci .init_clockdomain = ti_sysc_clkdm_init, 39062306a36Sopenharmony_ci .clkdm_deny_idle = ti_sysc_clkdm_deny_idle, 39162306a36Sopenharmony_ci .clkdm_allow_idle = ti_sysc_clkdm_allow_idle, 39262306a36Sopenharmony_ci#ifdef CONFIG_OMAP_HWMOD 39362306a36Sopenharmony_ci .init_module = omap_hwmod_init_module, 39462306a36Sopenharmony_ci .enable_module = ti_sysc_enable_module, 39562306a36Sopenharmony_ci .idle_module = ti_sysc_idle_module, 39662306a36Sopenharmony_ci .shutdown_module = ti_sysc_shutdown_module, 39762306a36Sopenharmony_ci#endif 39862306a36Sopenharmony_ci}; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cistatic struct pcs_pdata pcs_pdata; 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_civoid omap_pcs_legacy_init(int irq, void (*rearm)(void)) 40362306a36Sopenharmony_ci{ 40462306a36Sopenharmony_ci pcs_pdata.irq = irq; 40562306a36Sopenharmony_ci pcs_pdata.rearm = rearm; 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic struct ti_prm_platform_data ti_prm_pdata = { 40962306a36Sopenharmony_ci .clkdm_deny_idle = clkdm_deny_idle, 41062306a36Sopenharmony_ci .clkdm_allow_idle = clkdm_allow_idle, 41162306a36Sopenharmony_ci .clkdm_lookup = clkdm_lookup, 41262306a36Sopenharmony_ci}; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP3) && IS_ENABLED(CONFIG_SND_SOC_OMAP_MCBSP) 41562306a36Sopenharmony_cistatic struct omap_mcbsp_platform_data mcbsp_pdata; 41662306a36Sopenharmony_cistatic void __init omap3_mcbsp_init(void) 41762306a36Sopenharmony_ci{ 41862306a36Sopenharmony_ci omap3_mcbsp_init_pdata_callback(&mcbsp_pdata); 41962306a36Sopenharmony_ci} 42062306a36Sopenharmony_ci#else 42162306a36Sopenharmony_cistatic void __init omap3_mcbsp_init(void) {} 42262306a36Sopenharmony_ci#endif 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci/* 42562306a36Sopenharmony_ci * Few boards still need auxdata populated before we populate 42662306a36Sopenharmony_ci * the dev entries in of_platform_populate(). 42762306a36Sopenharmony_ci */ 42862306a36Sopenharmony_cistatic struct pdata_init auxdata_quirks[] __initdata = { 42962306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP2420 43062306a36Sopenharmony_ci { "nokia,n800", omap2420_n8x0_legacy_init, }, 43162306a36Sopenharmony_ci { "nokia,n810", omap2420_n8x0_legacy_init, }, 43262306a36Sopenharmony_ci { "nokia,n810-wimax", omap2420_n8x0_legacy_init, }, 43362306a36Sopenharmony_ci#endif 43462306a36Sopenharmony_ci { /* sentinel */ }, 43562306a36Sopenharmony_ci}; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_cistruct omap_sr_data __maybe_unused omap_sr_pdata[OMAP_SR_NR]; 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_cistatic struct of_dev_auxdata omap_auxdata_lookup[] = { 44062306a36Sopenharmony_ci#ifdef CONFIG_MACH_NOKIA_N8X0 44162306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap2420-mmc", 0x4809c000, "mmci-omap.0", NULL), 44262306a36Sopenharmony_ci OF_DEV_AUXDATA("menelaus", 0x72, "1-0072", &n8x0_menelaus_platform_data), 44362306a36Sopenharmony_ci#endif 44462306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3 44562306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu", 44662306a36Sopenharmony_ci &omap3_iommu_pdata), 44762306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap2-iommu", 0x480bd400, "480bd400.mmu", 44862306a36Sopenharmony_ci &omap3_iommu_isp_pdata), 44962306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap3-smartreflex-core", 0x480cb000, 45062306a36Sopenharmony_ci "480cb000.smartreflex", &omap_sr_pdata[OMAP_SR_CORE]), 45162306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap3-smartreflex-mpu-iva", 0x480c9000, 45262306a36Sopenharmony_ci "480c9000.smartreflex", &omap_sr_pdata[OMAP_SR_MPU]), 45362306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x4809c000, "4809c000.mmc", &mmc_pdata[0]), 45462306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x480b4000, "480b4000.mmc", &mmc_pdata[1]), 45562306a36Sopenharmony_ci /* Only on am3517 */ 45662306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL), 45762306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0", 45862306a36Sopenharmony_ci &am35xx_emac_pdata), 45962306a36Sopenharmony_ci OF_DEV_AUXDATA("nokia,n900-rom-rng", 0, NULL, rx51_secure_rng_call), 46062306a36Sopenharmony_ci /* McBSP modules with sidetone core */ 46162306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_OMAP_MCBSP) 46262306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap3-mcbsp", 0x49022000, "49022000.mcbsp", &mcbsp_pdata), 46362306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap3-mcbsp", 0x49024000, "49024000.mcbsp", &mcbsp_pdata), 46462306a36Sopenharmony_ci#endif 46562306a36Sopenharmony_ci#endif 46662306a36Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) 46762306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap4-smartreflex-iva", 0x4a0db000, 46862306a36Sopenharmony_ci "4a0db000.smartreflex", &omap_sr_pdata[OMAP_SR_IVA]), 46962306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap4-smartreflex-core", 0x4a0dd000, 47062306a36Sopenharmony_ci "4a0dd000.smartreflex", &omap_sr_pdata[OMAP_SR_CORE]), 47162306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap4-smartreflex-mpu", 0x4a0d9000, 47262306a36Sopenharmony_ci "4a0d9000.smartreflex", &omap_sr_pdata[OMAP_SR_MPU]), 47362306a36Sopenharmony_ci#endif 47462306a36Sopenharmony_ci#ifdef CONFIG_SOC_DRA7XX 47562306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,dra7-dsp-iommu", 0x40d01000, "40d01000.mmu", 47662306a36Sopenharmony_ci &dra7_ipu1_dsp_iommu_pdata), 47762306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,dra7-dsp-iommu", 0x41501000, "41501000.mmu", 47862306a36Sopenharmony_ci &dra7_ipu1_dsp_iommu_pdata), 47962306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,dra7-iommu", 0x58882000, "58882000.mmu", 48062306a36Sopenharmony_ci &dra7_ipu1_dsp_iommu_pdata), 48162306a36Sopenharmony_ci#endif 48262306a36Sopenharmony_ci /* Common auxdata */ 48362306a36Sopenharmony_ci OF_DEV_AUXDATA("simple-pm-bus", 0, NULL, omap_auxdata_lookup), 48462306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,sysc", 0, NULL, &ti_sysc_pdata), 48562306a36Sopenharmony_ci OF_DEV_AUXDATA("pinctrl-single", 0, NULL, &pcs_pdata), 48662306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap-prm-inst", 0, NULL, &ti_prm_pdata), 48762306a36Sopenharmony_ci OF_DEV_AUXDATA("ti,omap-sdma", 0, NULL, &dma_plat_info), 48862306a36Sopenharmony_ci { /* sentinel */ }, 48962306a36Sopenharmony_ci}; 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci/* 49262306a36Sopenharmony_ci * Few boards still need to initialize some legacy devices with 49362306a36Sopenharmony_ci * platform data until the drivers support device tree. 49462306a36Sopenharmony_ci */ 49562306a36Sopenharmony_cistatic struct pdata_init pdata_quirks[] __initdata = { 49662306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3 49762306a36Sopenharmony_ci { "compulab,omap3-sbc-t3517", omap3_sbc_t3517_legacy_init, }, 49862306a36Sopenharmony_ci { "compulab,omap3-sbc-t3530", omap3_sbc_t3530_legacy_init, }, 49962306a36Sopenharmony_ci { "compulab,omap3-sbc-t3730", omap3_sbc_t3730_legacy_init, }, 50062306a36Sopenharmony_ci { "nokia,omap3-n900", nokia_n900_legacy_init, }, 50162306a36Sopenharmony_ci { "nokia,omap3-n9", hsmmc2_internal_input_clk, }, 50262306a36Sopenharmony_ci { "nokia,omap3-n950", hsmmc2_internal_input_clk, }, 50362306a36Sopenharmony_ci { "logicpd,dm3730-torpedo-devkit", omap3_logicpd_torpedo_init, }, 50462306a36Sopenharmony_ci { "ti,omap3-evm-37xx", omap3_evm_legacy_init, }, 50562306a36Sopenharmony_ci { "ti,am3517-evm", am3517_evm_legacy_init, }, 50662306a36Sopenharmony_ci { "technexion,omap3-tao3530", omap3_tao3530_legacy_init, }, 50762306a36Sopenharmony_ci { "openpandora,omap3-pandora-600mhz", omap3_pandora_legacy_init, }, 50862306a36Sopenharmony_ci { "openpandora,omap3-pandora-1ghz", omap3_pandora_legacy_init, }, 50962306a36Sopenharmony_ci#endif 51062306a36Sopenharmony_ci { /* sentinel */ }, 51162306a36Sopenharmony_ci}; 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_cistatic void pdata_quirks_check(struct pdata_init *quirks) 51462306a36Sopenharmony_ci{ 51562306a36Sopenharmony_ci while (quirks->compatible) { 51662306a36Sopenharmony_ci if (of_machine_is_compatible(quirks->compatible)) { 51762306a36Sopenharmony_ci if (quirks->fn) 51862306a36Sopenharmony_ci quirks->fn(); 51962306a36Sopenharmony_ci } 52062306a36Sopenharmony_ci quirks++; 52162306a36Sopenharmony_ci } 52262306a36Sopenharmony_ci} 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_cistatic const char * const pdata_quirks_init_nodes[] = { 52562306a36Sopenharmony_ci "prcm", 52662306a36Sopenharmony_ci "prm", 52762306a36Sopenharmony_ci}; 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_cistatic void __init 53062306a36Sopenharmony_cipdata_quirks_init_clocks(const struct of_device_id *omap_dt_match_table) 53162306a36Sopenharmony_ci{ 53262306a36Sopenharmony_ci struct device_node *np; 53362306a36Sopenharmony_ci int i; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(pdata_quirks_init_nodes); i++) { 53662306a36Sopenharmony_ci np = of_find_node_by_name(NULL, pdata_quirks_init_nodes[i]); 53762306a36Sopenharmony_ci if (!np) 53862306a36Sopenharmony_ci continue; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci of_platform_populate(np, omap_dt_match_table, 54162306a36Sopenharmony_ci omap_auxdata_lookup, NULL); 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci of_node_put(np); 54462306a36Sopenharmony_ci } 54562306a36Sopenharmony_ci} 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_civoid __init pdata_quirks_init(const struct of_device_id *omap_dt_match_table) 54862306a36Sopenharmony_ci{ 54962306a36Sopenharmony_ci /* 55062306a36Sopenharmony_ci * We still need this for omap2420 and omap3 PM to work, others are 55162306a36Sopenharmony_ci * using drivers/misc/sram.c already. 55262306a36Sopenharmony_ci */ 55362306a36Sopenharmony_ci if (of_machine_is_compatible("ti,omap2420") || 55462306a36Sopenharmony_ci of_machine_is_compatible("ti,omap3")) 55562306a36Sopenharmony_ci omap_sdrc_init(NULL, NULL); 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci if (of_machine_is_compatible("ti,omap3")) 55862306a36Sopenharmony_ci omap3_mcbsp_init(); 55962306a36Sopenharmony_ci pdata_quirks_check(auxdata_quirks); 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci pdata_quirks_init_clocks(omap_dt_match_table); 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci of_platform_populate(NULL, omap_dt_match_table, 56462306a36Sopenharmony_ci omap_auxdata_lookup, NULL); 56562306a36Sopenharmony_ci pdata_quirks_check(pdata_quirks); 56662306a36Sopenharmony_ci} 567