1983e3700STom Rini /*
2983e3700STom Rini *
3983e3700STom Rini * Common functions for OMAP4 based boards
4983e3700STom Rini *
5983e3700STom Rini * (C) Copyright 2010
6983e3700STom Rini * Texas Instruments, <www.ti.com>
7983e3700STom Rini *
8983e3700STom Rini * Author :
9983e3700STom Rini * Aneesh V <aneesh@ti.com>
10983e3700STom Rini * Steve Sakoman <steve@sakoman.com>
11983e3700STom Rini *
12983e3700STom Rini * SPDX-License-Identifier: GPL-2.0+
13983e3700STom Rini */
14983e3700STom Rini #include <common.h>
15*b4b06006SLokesh Vutla #include <palmas.h>
16983e3700STom Rini #include <asm/armv7.h>
17983e3700STom Rini #include <asm/arch/cpu.h>
18983e3700STom Rini #include <asm/arch/sys_proto.h>
19983e3700STom Rini #include <linux/sizes.h>
20983e3700STom Rini #include <asm/emif.h>
21983e3700STom Rini #include <asm/arch/gpio.h>
22983e3700STom Rini #include <asm/omap_common.h>
23983e3700STom Rini
24983e3700STom Rini DECLARE_GLOBAL_DATA_PTR;
25983e3700STom Rini
26983e3700STom Rini u32 *const omap_si_rev = (u32 *)OMAP_SRAM_SCRATCH_OMAP_REV;
27983e3700STom Rini
28983e3700STom Rini static const struct gpio_bank gpio_bank_44xx[6] = {
29983e3700STom Rini { (void *)OMAP44XX_GPIO1_BASE },
30983e3700STom Rini { (void *)OMAP44XX_GPIO2_BASE },
31983e3700STom Rini { (void *)OMAP44XX_GPIO3_BASE },
32983e3700STom Rini { (void *)OMAP44XX_GPIO4_BASE },
33983e3700STom Rini { (void *)OMAP44XX_GPIO5_BASE },
34983e3700STom Rini { (void *)OMAP44XX_GPIO6_BASE },
35983e3700STom Rini };
36983e3700STom Rini
37983e3700STom Rini const struct gpio_bank *const omap_gpio_bank = gpio_bank_44xx;
38983e3700STom Rini
39983e3700STom Rini #ifdef CONFIG_SPL_BUILD
40983e3700STom Rini /*
41983e3700STom Rini * Some tuning of IOs for optimal power and performance
42983e3700STom Rini */
do_io_settings(void)43983e3700STom Rini void do_io_settings(void)
44983e3700STom Rini {
45983e3700STom Rini u32 lpddr2io;
46983e3700STom Rini
47983e3700STom Rini u32 omap4_rev = omap_revision();
48983e3700STom Rini
49983e3700STom Rini if (omap4_rev == OMAP4430_ES1_0)
50983e3700STom Rini lpddr2io = CONTROL_LPDDR2IO_SLEW_125PS_DRV8_PULL_DOWN;
51983e3700STom Rini else if (omap4_rev == OMAP4430_ES2_0)
52983e3700STom Rini lpddr2io = CONTROL_LPDDR2IO_SLEW_325PS_DRV8_GATE_KEEPER;
53983e3700STom Rini else
54983e3700STom Rini lpddr2io = CONTROL_LPDDR2IO_SLEW_315PS_DRV12_PULL_DOWN;
55983e3700STom Rini
56983e3700STom Rini /* EMIF1 */
57983e3700STom Rini writel(lpddr2io, (*ctrl)->control_lpddr2io1_0);
58983e3700STom Rini writel(lpddr2io, (*ctrl)->control_lpddr2io1_1);
59983e3700STom Rini /* No pull for GR10 as per hw team's recommendation */
60983e3700STom Rini writel(lpddr2io & ~LPDDR2IO_GR10_WD_MASK,
61983e3700STom Rini (*ctrl)->control_lpddr2io1_2);
62983e3700STom Rini writel(CONTROL_LPDDR2IO_3_VAL, (*ctrl)->control_lpddr2io1_3);
63983e3700STom Rini
64983e3700STom Rini /* EMIF2 */
65983e3700STom Rini writel(lpddr2io, (*ctrl)->control_lpddr2io2_0);
66983e3700STom Rini writel(lpddr2io, (*ctrl)->control_lpddr2io2_1);
67983e3700STom Rini /* No pull for GR10 as per hw team's recommendation */
68983e3700STom Rini writel(lpddr2io & ~LPDDR2IO_GR10_WD_MASK,
69983e3700STom Rini (*ctrl)->control_lpddr2io2_2);
70983e3700STom Rini writel(CONTROL_LPDDR2IO_3_VAL, (*ctrl)->control_lpddr2io2_3);
71983e3700STom Rini
72983e3700STom Rini /*
73983e3700STom Rini * Some of these settings (TRIM values) come from eFuse and are
74983e3700STom Rini * in turn programmed in the eFuse at manufacturing time after
75983e3700STom Rini * calibration of the device. Do the software over-ride only if
76983e3700STom Rini * the device is not correctly trimmed
77983e3700STom Rini */
78983e3700STom Rini if (!(readl((*ctrl)->control_std_fuse_opp_bgap) & 0xFFFF)) {
79983e3700STom Rini
80983e3700STom Rini writel(LDOSRAM_VOLT_CTRL_OVERRIDE,
81983e3700STom Rini (*ctrl)->control_ldosram_iva_voltage_ctrl);
82983e3700STom Rini
83983e3700STom Rini writel(LDOSRAM_VOLT_CTRL_OVERRIDE,
84983e3700STom Rini (*ctrl)->control_ldosram_mpu_voltage_ctrl);
85983e3700STom Rini
86983e3700STom Rini writel(LDOSRAM_VOLT_CTRL_OVERRIDE,
87983e3700STom Rini (*ctrl)->control_ldosram_core_voltage_ctrl);
88983e3700STom Rini }
89983e3700STom Rini
90983e3700STom Rini /*
91983e3700STom Rini * Over-ride the register
92983e3700STom Rini * i. unconditionally for all 4430
93983e3700STom Rini * ii. only if un-trimmed for 4460
94983e3700STom Rini */
95983e3700STom Rini if (!readl((*ctrl)->control_efuse_1))
96983e3700STom Rini writel(CONTROL_EFUSE_1_OVERRIDE, (*ctrl)->control_efuse_1);
97983e3700STom Rini
98983e3700STom Rini if ((omap4_rev < OMAP4460_ES1_0) || !readl((*ctrl)->control_efuse_2))
99983e3700STom Rini writel(CONTROL_EFUSE_2_OVERRIDE, (*ctrl)->control_efuse_2);
100983e3700STom Rini }
101983e3700STom Rini #endif /* CONFIG_SPL_BUILD */
102983e3700STom Rini
103983e3700STom Rini /* dummy fuction for omap4 */
config_data_eye_leveling_samples(u32 emif_base)104983e3700STom Rini void config_data_eye_leveling_samples(u32 emif_base)
105983e3700STom Rini {
106983e3700STom Rini }
107983e3700STom Rini
init_omap_revision(void)108983e3700STom Rini void init_omap_revision(void)
109983e3700STom Rini {
110983e3700STom Rini /*
111983e3700STom Rini * For some of the ES2/ES1 boards ID_CODE is not reliable:
112983e3700STom Rini * Also, ES1 and ES2 have different ARM revisions
113983e3700STom Rini * So use ARM revision for identification
114983e3700STom Rini */
115983e3700STom Rini unsigned int arm_rev = cortex_rev();
116983e3700STom Rini
117983e3700STom Rini switch (arm_rev) {
118983e3700STom Rini case MIDR_CORTEX_A9_R0P1:
119983e3700STom Rini *omap_si_rev = OMAP4430_ES1_0;
120983e3700STom Rini break;
121983e3700STom Rini case MIDR_CORTEX_A9_R1P2:
122983e3700STom Rini switch (readl(CONTROL_ID_CODE)) {
123983e3700STom Rini case OMAP4_CONTROL_ID_CODE_ES2_0:
124983e3700STom Rini *omap_si_rev = OMAP4430_ES2_0;
125983e3700STom Rini break;
126983e3700STom Rini case OMAP4_CONTROL_ID_CODE_ES2_1:
127983e3700STom Rini *omap_si_rev = OMAP4430_ES2_1;
128983e3700STom Rini break;
129983e3700STom Rini case OMAP4_CONTROL_ID_CODE_ES2_2:
130983e3700STom Rini *omap_si_rev = OMAP4430_ES2_2;
131983e3700STom Rini break;
132983e3700STom Rini default:
133983e3700STom Rini *omap_si_rev = OMAP4430_ES2_0;
134983e3700STom Rini break;
135983e3700STom Rini }
136983e3700STom Rini break;
137983e3700STom Rini case MIDR_CORTEX_A9_R1P3:
138983e3700STom Rini *omap_si_rev = OMAP4430_ES2_3;
139983e3700STom Rini break;
140983e3700STom Rini case MIDR_CORTEX_A9_R2P10:
141983e3700STom Rini switch (readl(CONTROL_ID_CODE)) {
142983e3700STom Rini case OMAP4470_CONTROL_ID_CODE_ES1_0:
143983e3700STom Rini *omap_si_rev = OMAP4470_ES1_0;
144983e3700STom Rini break;
145983e3700STom Rini case OMAP4460_CONTROL_ID_CODE_ES1_1:
146983e3700STom Rini *omap_si_rev = OMAP4460_ES1_1;
147983e3700STom Rini break;
148983e3700STom Rini case OMAP4460_CONTROL_ID_CODE_ES1_0:
149983e3700STom Rini default:
150983e3700STom Rini *omap_si_rev = OMAP4460_ES1_0;
151983e3700STom Rini break;
152983e3700STom Rini }
153983e3700STom Rini break;
154983e3700STom Rini default:
155983e3700STom Rini *omap_si_rev = OMAP4430_SILICON_ID_INVALID;
156983e3700STom Rini break;
157983e3700STom Rini }
158983e3700STom Rini }
159983e3700STom Rini
omap_die_id(unsigned int * die_id)160983e3700STom Rini void omap_die_id(unsigned int *die_id)
161983e3700STom Rini {
162983e3700STom Rini die_id[0] = readl((*ctrl)->control_std_fuse_die_id_0);
163983e3700STom Rini die_id[1] = readl((*ctrl)->control_std_fuse_die_id_1);
164983e3700STom Rini die_id[2] = readl((*ctrl)->control_std_fuse_die_id_2);
165983e3700STom Rini die_id[3] = readl((*ctrl)->control_std_fuse_die_id_3);
166983e3700STom Rini }
167983e3700STom Rini
168983e3700STom Rini #ifndef CONFIG_SYS_L2CACHE_OFF
v7_outer_cache_enable(void)169983e3700STom Rini void v7_outer_cache_enable(void)
170983e3700STom Rini {
171983e3700STom Rini omap_smc1(OMAP4_SERVICE_PL310_CONTROL_REG_SET, 1);
172983e3700STom Rini }
173983e3700STom Rini
v7_outer_cache_disable(void)174983e3700STom Rini void v7_outer_cache_disable(void)
175983e3700STom Rini {
176983e3700STom Rini omap_smc1(OMAP4_SERVICE_PL310_CONTROL_REG_SET, 0);
177983e3700STom Rini }
178983e3700STom Rini #endif /* !CONFIG_SYS_L2CACHE_OFF */
179*b4b06006SLokesh Vutla
vmmc_pbias_config(uint voltage)180*b4b06006SLokesh Vutla void vmmc_pbias_config(uint voltage)
181*b4b06006SLokesh Vutla {
182*b4b06006SLokesh Vutla u32 value = 0;
183*b4b06006SLokesh Vutla
184*b4b06006SLokesh Vutla value = readl((*ctrl)->control_pbiaslite);
185*b4b06006SLokesh Vutla value &= ~(MMC1_PBIASLITE_PWRDNZ | MMC1_PWRDNZ);
186*b4b06006SLokesh Vutla writel(value, (*ctrl)->control_pbiaslite);
187*b4b06006SLokesh Vutla value = readl((*ctrl)->control_pbiaslite);
188*b4b06006SLokesh Vutla value |= MMC1_PBIASLITE_VMODE | MMC1_PBIASLITE_PWRDNZ | MMC1_PWRDNZ;
189*b4b06006SLokesh Vutla writel(value, (*ctrl)->control_pbiaslite);
190*b4b06006SLokesh Vutla }
191