1 // SPDX-License-Identifier: GPL-2.0-only
3 * Legacy platform_data quirks
5 * Copyright (C) 2013 Texas Instruments
8 #include <linux/davinci_emac.h>
9 #include <linux/gpio/machine.h>
10 #include <linux/gpio/consumer.h>
11 #include <linux/init.h>
12 #include <linux/kernel.h>
13 #include <linux/of_platform.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>
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>
28 #include "clockdomain.h"
30 #include "common-board-devices.h"
32 #include "omap_device.h"
33 #include "omap-secure.h"
36 static struct omap_hsmmc_platform_data __maybe_unused mmc_pdata
[2];
39 const char *compatible
;
43 static struct of_dev_auxdata omap_auxdata_lookup
[];
45 #ifdef CONFIG_MACH_NOKIA_N8X0
46 static void __init
omap2420_n8x0_legacy_init(void)
48 omap_auxdata_lookup
[0].platform_data
= n8x0_legacy_init();
51 #define omap2420_n8x0_legacy_init NULL
54 #ifdef CONFIG_ARCH_OMAP3
56 * Configures GPIOs 126, 127 and 129 to 1.8V mode instead of 3.0V
57 * mode for MMC1 in case bootloader did not configure things.
58 * Note that if the pins are used for MMC1, pbias-regulator
59 * manages the IO voltage.
61 static void __init
omap3_gpio126_127_129(void)
65 reg
= omap_ctrl_readl(OMAP343X_CONTROL_PBIAS_LITE
);
66 reg
&= ~OMAP343X_PBIASLITEVMODE1
;
67 reg
|= OMAP343X_PBIASLITEPWRDNZ1
;
68 omap_ctrl_writel(reg
, OMAP343X_CONTROL_PBIAS_LITE
);
69 if (cpu_is_omap3630()) {
70 reg
= omap_ctrl_readl(OMAP34XX_CONTROL_WKUP_CTRL
);
71 reg
|= OMAP36XX_GPIO_IO_PWRDNZ
;
72 omap_ctrl_writel(reg
, OMAP34XX_CONTROL_WKUP_CTRL
);
76 static void __init
hsmmc2_internal_input_clk(void)
80 reg
= omap_ctrl_readl(OMAP343X_CONTROL_DEVCONF1
);
81 reg
|= OMAP2_MMCSDIO2ADPCLKISEL
;
82 omap_ctrl_writel(reg
, OMAP343X_CONTROL_DEVCONF1
);
85 #ifdef CONFIG_OMAP_HWMOD
86 static struct iommu_platform_data omap3_iommu_pdata
= {
88 .assert_reset
= omap_device_assert_hardreset
,
89 .deassert_reset
= omap_device_deassert_hardreset
,
90 .device_enable
= omap_device_enable
,
91 .device_idle
= omap_device_idle
,
94 static struct iommu_platform_data omap3_iommu_isp_pdata
= {
95 .device_enable
= omap_device_enable
,
96 .device_idle
= omap_device_idle
,
100 static void __init
omap3_sbc_t3x_usb_hub_init(char *hub_name
, int idx
)
104 /* This asserts the RESET line (reverse polarity) */
105 d
= gpiod_get_index(NULL
, "reset", idx
, GPIOD_OUT_HIGH
);
107 pr_err("Unable to get T3x USB reset GPIO descriptor\n");
110 gpiod_set_consumer_name(d
, hub_name
);
113 /* De-assert RESET */
114 gpiod_set_value(d
, 0);
118 static struct gpiod_lookup_table omap3_sbc_t3x_usb_gpio_table
= {
121 GPIO_LOOKUP_IDX("gpio-160-175", 7, "reset", 0,
127 static void __init
omap3_sbc_t3730_legacy_init(void)
129 gpiod_add_lookup_table(&omap3_sbc_t3x_usb_gpio_table
);
130 omap3_sbc_t3x_usb_hub_init("sb-t35 usb hub", 0);
133 static void __init
omap3_sbc_t3530_legacy_init(void)
135 gpiod_add_lookup_table(&omap3_sbc_t3x_usb_gpio_table
);
136 omap3_sbc_t3x_usb_hub_init("sb-t35 usb hub", 0);
139 static void __init
omap3_evm_legacy_init(void)
141 hsmmc2_internal_input_clk();
144 static void am35xx_enable_emac_int(void)
148 v
= omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR
);
149 v
|= (AM35XX_CPGMAC_C0_RX_PULSE_CLR
| AM35XX_CPGMAC_C0_TX_PULSE_CLR
|
150 AM35XX_CPGMAC_C0_MISC_PULSE_CLR
| AM35XX_CPGMAC_C0_RX_THRESH_CLR
);
151 omap_ctrl_writel(v
, AM35XX_CONTROL_LVL_INTR_CLEAR
);
152 omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR
); /* OCP barrier */
155 static void am35xx_disable_emac_int(void)
159 v
= omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR
);
160 v
|= (AM35XX_CPGMAC_C0_RX_PULSE_CLR
| AM35XX_CPGMAC_C0_TX_PULSE_CLR
);
161 omap_ctrl_writel(v
, AM35XX_CONTROL_LVL_INTR_CLEAR
);
162 omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR
); /* OCP barrier */
165 static struct emac_platform_data am35xx_emac_pdata
= {
166 .interrupt_enable
= am35xx_enable_emac_int
,
167 .interrupt_disable
= am35xx_disable_emac_int
,
170 static void __init
am35xx_emac_reset(void)
174 v
= omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET
);
175 v
&= ~AM35XX_CPGMACSS_SW_RST
;
176 omap_ctrl_writel(v
, AM35XX_CONTROL_IP_SW_RESET
);
177 omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET
); /* OCP barrier */
180 static struct gpiod_lookup_table cm_t3517_wlan_gpio_table
= {
183 GPIO_LOOKUP("gpio-48-53", 8, "power",
185 GPIO_LOOKUP("gpio-0-15", 4, "noe",
191 static void __init
omap3_sbc_t3517_wifi_init(void)
195 gpiod_add_lookup_table(&cm_t3517_wlan_gpio_table
);
197 /* This asserts the RESET line (reverse polarity) */
198 d
= gpiod_get(NULL
, "power", GPIOD_OUT_HIGH
);
200 pr_err("Unable to get CM T3517 WLAN power GPIO descriptor\n");
202 gpiod_set_consumer_name(d
, "wlan pwr");
206 d
= gpiod_get(NULL
, "noe", GPIOD_OUT_HIGH
);
208 pr_err("Unable to get CM T3517 WLAN XCVR NOE GPIO descriptor\n");
210 gpiod_set_consumer_name(d
, "xcvr noe");
214 gpiod_set_value(d
, 0);
217 static struct gpiod_lookup_table omap3_sbc_t3517_usb_gpio_table
= {
220 GPIO_LOOKUP_IDX("gpio-144-159", 8, "reset", 0,
222 GPIO_LOOKUP_IDX("gpio-96-111", 2, "reset", 1,
228 static void __init
omap3_sbc_t3517_legacy_init(void)
230 gpiod_add_lookup_table(&omap3_sbc_t3517_usb_gpio_table
);
231 omap3_sbc_t3x_usb_hub_init("cm-t3517 usb hub", 0);
232 omap3_sbc_t3x_usb_hub_init("sb-t35 usb hub", 1);
234 hsmmc2_internal_input_clk();
235 omap3_sbc_t3517_wifi_init();
238 static void __init
am3517_evm_legacy_init(void)
243 static void __init
nokia_n900_legacy_init(void)
245 hsmmc2_internal_input_clk();
246 mmc_pdata
[0].name
= "external";
247 mmc_pdata
[1].name
= "internal";
249 if (omap_type() != OMAP2_DEVICE_TYPE_GP
) {
250 if (IS_ENABLED(CONFIG_ARM_ERRATA_430973
)) {
251 pr_info("RX-51: Enabling ARM errata 430973 workaround\n");
253 rx51_secure_update_aux_cr(BIT(6), 0);
255 pr_warn("RX-51: Not enabling ARM errata 430973 workaround\n");
256 pr_warn("Thumb binaries may crash randomly without this workaround\n");
261 static void __init
omap3_tao3530_legacy_init(void)
263 hsmmc2_internal_input_clk();
266 static void __init
omap3_logicpd_torpedo_init(void)
268 omap3_gpio126_127_129();
271 /* omap3pandora legacy devices */
273 static struct platform_device pandora_backlight
= {
274 .name
= "pandora-backlight",
278 static struct gpiod_lookup_table pandora_soc_audio_gpios
= {
279 .dev_id
= "soc-audio",
281 GPIO_LOOKUP("gpio-112-127", 6, "dac", GPIO_ACTIVE_HIGH
),
282 GPIO_LOOKUP("gpio-0-15", 14, "amp", GPIO_ACTIVE_HIGH
),
287 static void __init
omap3_pandora_legacy_init(void)
289 platform_device_register(&pandora_backlight
);
290 gpiod_add_lookup_table(&pandora_soc_audio_gpios
);
292 #endif /* CONFIG_ARCH_OMAP3 */
294 #ifdef CONFIG_SOC_DRA7XX
295 static struct iommu_platform_data dra7_ipu1_dsp_iommu_pdata
= {
296 .set_pwrdm_constraint
= omap_iommu_set_pwrdm_constraint
,
300 static struct clockdomain
*ti_sysc_find_one_clockdomain(struct clk
*clk
)
302 struct clk_hw
*hw
= __clk_get_hw(clk
);
303 struct clockdomain
*clkdm
= NULL
;
304 struct clk_hw_omap
*hwclk
;
306 hwclk
= to_clk_hw_omap(hw
);
307 if (!omap2_clk_is_hw_omap(hw
))
310 if (hwclk
&& hwclk
->clkdm_name
)
311 clkdm
= clkdm_lookup(hwclk
->clkdm_name
);
317 * ti_sysc_clkdm_init - find clockdomain based on clock
318 * @fck: device functional clock
319 * @ick: device interface clock
320 * @dev: struct device
322 * Populate clockdomain based on clock. It is needed for
323 * clkdm_deny_idle() and clkdm_allow_idle() for blocking clockdomain
324 * clockdomain idle during reset, enable and idle.
326 * Note that we assume interconnect driver manages the clocks
327 * and do not need to populate oh->_clk for dynamically
330 static int ti_sysc_clkdm_init(struct device
*dev
,
331 struct clk
*fck
, struct clk
*ick
,
332 struct ti_sysc_cookie
*cookie
)
335 cookie
->clkdm
= ti_sysc_find_one_clockdomain(fck
);
339 cookie
->clkdm
= ti_sysc_find_one_clockdomain(ick
);
346 static void ti_sysc_clkdm_deny_idle(struct device
*dev
,
347 const struct ti_sysc_cookie
*cookie
)
350 clkdm_deny_idle(cookie
->clkdm
);
353 static void ti_sysc_clkdm_allow_idle(struct device
*dev
,
354 const struct ti_sysc_cookie
*cookie
)
357 clkdm_allow_idle(cookie
->clkdm
);
360 #ifdef CONFIG_OMAP_HWMOD
361 static int ti_sysc_enable_module(struct device
*dev
,
362 const struct ti_sysc_cookie
*cookie
)
367 return omap_hwmod_enable(cookie
->data
);
370 static int ti_sysc_idle_module(struct device
*dev
,
371 const struct ti_sysc_cookie
*cookie
)
376 return omap_hwmod_idle(cookie
->data
);
379 static int ti_sysc_shutdown_module(struct device
*dev
,
380 const struct ti_sysc_cookie
*cookie
)
385 return omap_hwmod_shutdown(cookie
->data
);
387 #endif /* CONFIG_OMAP_HWMOD */
389 static bool ti_sysc_soc_type_gp(void)
391 return omap_type() == OMAP2_DEVICE_TYPE_GP
;
394 static struct of_dev_auxdata omap_auxdata_lookup
[];
396 static struct ti_sysc_platform_data ti_sysc_pdata
= {
397 .auxdata
= omap_auxdata_lookup
,
398 .soc_type_gp
= ti_sysc_soc_type_gp
,
399 .init_clockdomain
= ti_sysc_clkdm_init
,
400 .clkdm_deny_idle
= ti_sysc_clkdm_deny_idle
,
401 .clkdm_allow_idle
= ti_sysc_clkdm_allow_idle
,
402 #ifdef CONFIG_OMAP_HWMOD
403 .init_module
= omap_hwmod_init_module
,
404 .enable_module
= ti_sysc_enable_module
,
405 .idle_module
= ti_sysc_idle_module
,
406 .shutdown_module
= ti_sysc_shutdown_module
,
410 static struct pcs_pdata pcs_pdata
;
412 void omap_pcs_legacy_init(int irq
, void (*rearm
)(void))
415 pcs_pdata
.rearm
= rearm
;
418 static struct ti_prm_platform_data ti_prm_pdata
= {
419 .clkdm_deny_idle
= clkdm_deny_idle
,
420 .clkdm_allow_idle
= clkdm_allow_idle
,
421 .clkdm_lookup
= clkdm_lookup
,
424 #if defined(CONFIG_ARCH_OMAP3) && IS_ENABLED(CONFIG_SND_SOC_OMAP_MCBSP)
425 static struct omap_mcbsp_platform_data mcbsp_pdata
;
426 static void __init
omap3_mcbsp_init(void)
428 omap3_mcbsp_init_pdata_callback(&mcbsp_pdata
);
431 static void __init
omap3_mcbsp_init(void) {}
435 * Few boards still need auxdata populated before we populate
436 * the dev entries in of_platform_populate().
438 static struct pdata_init auxdata_quirks
[] __initdata
= {
439 #ifdef CONFIG_SOC_OMAP2420
440 { "nokia,n800", omap2420_n8x0_legacy_init
, },
441 { "nokia,n810", omap2420_n8x0_legacy_init
, },
442 { "nokia,n810-wimax", omap2420_n8x0_legacy_init
, },
447 struct omap_sr_data __maybe_unused omap_sr_pdata
[OMAP_SR_NR
];
449 static struct of_dev_auxdata omap_auxdata_lookup
[] = {
450 #ifdef CONFIG_MACH_NOKIA_N8X0
451 OF_DEV_AUXDATA("ti,omap2420-mmc", 0x4809c000, "mmci-omap.0", NULL
),
452 OF_DEV_AUXDATA("menelaus", 0x72, "1-0072", &n8x0_menelaus_platform_data
),
454 #ifdef CONFIG_ARCH_OMAP3
455 OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu",
457 OF_DEV_AUXDATA("ti,omap2-iommu", 0x480bd400, "480bd400.mmu",
458 &omap3_iommu_isp_pdata
),
459 OF_DEV_AUXDATA("ti,omap3-smartreflex-core", 0x480cb000,
460 "480cb000.smartreflex", &omap_sr_pdata
[OMAP_SR_CORE
]),
461 OF_DEV_AUXDATA("ti,omap3-smartreflex-mpu-iva", 0x480c9000,
462 "480c9000.smartreflex", &omap_sr_pdata
[OMAP_SR_MPU
]),
463 OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x4809c000, "4809c000.mmc", &mmc_pdata
[0]),
464 OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x480b4000, "480b4000.mmc", &mmc_pdata
[1]),
466 OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL
),
467 OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0",
469 OF_DEV_AUXDATA("nokia,n900-rom-rng", 0, NULL
, rx51_secure_rng_call
),
470 /* McBSP modules with sidetone core */
471 #if IS_ENABLED(CONFIG_SND_SOC_OMAP_MCBSP)
472 OF_DEV_AUXDATA("ti,omap3-mcbsp", 0x49022000, "49022000.mcbsp", &mcbsp_pdata
),
473 OF_DEV_AUXDATA("ti,omap3-mcbsp", 0x49024000, "49024000.mcbsp", &mcbsp_pdata
),
476 #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5)
477 OF_DEV_AUXDATA("ti,omap4-smartreflex-iva", 0x4a0db000,
478 "4a0db000.smartreflex", &omap_sr_pdata
[OMAP_SR_IVA
]),
479 OF_DEV_AUXDATA("ti,omap4-smartreflex-core", 0x4a0dd000,
480 "4a0dd000.smartreflex", &omap_sr_pdata
[OMAP_SR_CORE
]),
481 OF_DEV_AUXDATA("ti,omap4-smartreflex-mpu", 0x4a0d9000,
482 "4a0d9000.smartreflex", &omap_sr_pdata
[OMAP_SR_MPU
]),
484 #ifdef CONFIG_SOC_DRA7XX
485 OF_DEV_AUXDATA("ti,dra7-dsp-iommu", 0x40d01000, "40d01000.mmu",
486 &dra7_ipu1_dsp_iommu_pdata
),
487 OF_DEV_AUXDATA("ti,dra7-dsp-iommu", 0x41501000, "41501000.mmu",
488 &dra7_ipu1_dsp_iommu_pdata
),
489 OF_DEV_AUXDATA("ti,dra7-iommu", 0x58882000, "58882000.mmu",
490 &dra7_ipu1_dsp_iommu_pdata
),
493 OF_DEV_AUXDATA("simple-pm-bus", 0, NULL
, omap_auxdata_lookup
),
494 OF_DEV_AUXDATA("ti,sysc", 0, NULL
, &ti_sysc_pdata
),
495 OF_DEV_AUXDATA("pinctrl-single", 0, NULL
, &pcs_pdata
),
496 OF_DEV_AUXDATA("ti,omap-prm-inst", 0, NULL
, &ti_prm_pdata
),
497 OF_DEV_AUXDATA("ti,omap-sdma", 0, NULL
, &dma_plat_info
),
502 * Few boards still need to initialize some legacy devices with
503 * platform data until the drivers support device tree.
505 static struct pdata_init pdata_quirks
[] __initdata
= {
506 #ifdef CONFIG_ARCH_OMAP3
507 { "compulab,omap3-sbc-t3517", omap3_sbc_t3517_legacy_init
, },
508 { "compulab,omap3-sbc-t3530", omap3_sbc_t3530_legacy_init
, },
509 { "compulab,omap3-sbc-t3730", omap3_sbc_t3730_legacy_init
, },
510 { "nokia,omap3-n900", nokia_n900_legacy_init
, },
511 { "nokia,omap3-n9", hsmmc2_internal_input_clk
, },
512 { "nokia,omap3-n950", hsmmc2_internal_input_clk
, },
513 { "logicpd,dm3730-torpedo-devkit", omap3_logicpd_torpedo_init
, },
514 { "ti,omap3-evm-37xx", omap3_evm_legacy_init
, },
515 { "ti,am3517-evm", am3517_evm_legacy_init
, },
516 { "technexion,omap3-tao3530", omap3_tao3530_legacy_init
, },
517 { "openpandora,omap3-pandora-600mhz", omap3_pandora_legacy_init
, },
518 { "openpandora,omap3-pandora-1ghz", omap3_pandora_legacy_init
, },
523 static void pdata_quirks_check(struct pdata_init
*quirks
)
525 while (quirks
->compatible
) {
526 if (of_machine_is_compatible(quirks
->compatible
)) {
534 static const char * const pdata_quirks_init_nodes
[] = {
540 pdata_quirks_init_clocks(const struct of_device_id
*omap_dt_match_table
)
542 struct device_node
*np
;
545 for (i
= 0; i
< ARRAY_SIZE(pdata_quirks_init_nodes
); i
++) {
546 np
= of_find_node_by_name(NULL
, pdata_quirks_init_nodes
[i
]);
550 of_platform_populate(np
, omap_dt_match_table
,
551 omap_auxdata_lookup
, NULL
);
557 void __init
pdata_quirks_init(const struct of_device_id
*omap_dt_match_table
)
560 * We still need this for omap2420 and omap3 PM to work, others are
561 * using drivers/misc/sram.c already.
563 if (of_machine_is_compatible("ti,omap2420") ||
564 of_machine_is_compatible("ti,omap3"))
565 omap_sdrc_init(NULL
, NULL
);
567 if (of_machine_is_compatible("ti,omap3"))
569 pdata_quirks_check(auxdata_quirks
);
571 pdata_quirks_init_clocks(omap_dt_match_table
);
573 of_platform_populate(NULL
, omap_dt_match_table
,
574 omap_auxdata_lookup
, NULL
);
575 pdata_quirks_check(pdata_quirks
);