Commit 042c58a03f88430f98bf4989ad9beca19252abf8
1 parent
ee9dfd8d72
Exists in
v3.2_SMARCT335xPSP_04.06.00.11
and in
3 other branches
ARM: OMAP2+: AM335x: Handle OPP50 Bootup
As per Advisory 1.0.15 (ARM Cortex-A8: OPP50 Operation on MPU Domain Not Supported), when the board is booted with OPP50, reliable operation is not guaranteed for OPP greater than OPP100 (OPP120, TURBO, NITRO). So, Check if the board is booted at OPP50 voltage & if yes, disable higher OPP (OPP120, TURBO, NITRO). Signed-off-by: Hebbar Gururaja <gururaja.hebbar@ti.com>
Showing 1 changed file with 92 additions and 0 deletions Side-by-side Diff
arch/arm/mach-omap2/board-am335xevm.c
... | ... | @@ -2181,6 +2181,96 @@ |
2181 | 2181 | return 0; |
2182 | 2182 | } |
2183 | 2183 | |
2184 | +#define AM33XX_VDD_MPU_OPP50_UV 1100000 | |
2185 | +#define AM33XX_OPP120_FREQ 600000000 | |
2186 | +#define AM33XX_OPPTURBO_FREQ 720000000 | |
2187 | + | |
2188 | +#define AM33XX_ES2_0_VDD_MPU_OPP50_UV 950000 | |
2189 | +#define AM33XX_ES2_0_OPPTURBO_FREQ 800000000 | |
2190 | +#define AM33XX_ES2_0_OPPNITRO_FREQ 1000000000 | |
2191 | + | |
2192 | +#define AM33XX_ES2_1_VDD_MPU_OPP50_UV 950000 | |
2193 | +#define AM33XX_ES2_1_OPPTURBO_FREQ 800000000 | |
2194 | +#define AM33XX_ES2_1_OPPNITRO_FREQ 1000000000 | |
2195 | + | |
2196 | +static void am335x_opp_update(void) | |
2197 | +{ | |
2198 | + u32 rev; | |
2199 | + int voltage_uv = 0; | |
2200 | + struct device *core_dev, *mpu_dev; | |
2201 | + struct regulator *core_reg; | |
2202 | + | |
2203 | + core_dev = omap_device_get_by_hwmod_name("l3_main"); | |
2204 | + mpu_dev = omap_device_get_by_hwmod_name("mpu"); | |
2205 | + | |
2206 | + if (!mpu_dev || !core_dev) { | |
2207 | + pr_err("%s: Aiee.. no mpu/core devices? %p %p\n", __func__, | |
2208 | + mpu_dev, core_dev); | |
2209 | + return; | |
2210 | + } | |
2211 | + | |
2212 | + core_reg = regulator_get(core_dev, "vdd_core"); | |
2213 | + if (IS_ERR(core_reg)) { | |
2214 | + pr_err("%s: unable to get core regulator\n", __func__); | |
2215 | + return; | |
2216 | + } | |
2217 | + | |
2218 | + /* | |
2219 | + * Ensure physical regulator is present. | |
2220 | + * (e.g. could be dummy regulator.) | |
2221 | + */ | |
2222 | + voltage_uv = regulator_get_voltage(core_reg); | |
2223 | + if (voltage_uv < 0) { | |
2224 | + pr_err("%s: physical regulator not present for core" \ | |
2225 | + "(%d)\n", __func__, voltage_uv); | |
2226 | + regulator_put(core_reg); | |
2227 | + return; | |
2228 | + } | |
2229 | + | |
2230 | + pr_debug("%s: core regulator value %d\n", __func__, voltage_uv); | |
2231 | + if (voltage_uv > 0) { | |
2232 | + rev = omap_rev(); | |
2233 | + switch (rev) { | |
2234 | + case AM335X_REV_ES1_0: | |
2235 | + if (voltage_uv <= AM33XX_VDD_MPU_OPP50_UV) { | |
2236 | + /* | |
2237 | + * disable the higher freqs - we dont care about | |
2238 | + * the results | |
2239 | + */ | |
2240 | + opp_disable(mpu_dev, AM33XX_OPP120_FREQ); | |
2241 | + opp_disable(mpu_dev, AM33XX_OPPTURBO_FREQ); | |
2242 | + } | |
2243 | + break; | |
2244 | + case AM335X_REV_ES2_0: | |
2245 | + if (voltage_uv <= AM33XX_ES2_0_VDD_MPU_OPP50_UV) { | |
2246 | + /* | |
2247 | + * disable the higher freqs - we dont care about | |
2248 | + * the results | |
2249 | + */ | |
2250 | + opp_disable(mpu_dev, | |
2251 | + AM33XX_ES2_0_OPPTURBO_FREQ); | |
2252 | + opp_disable(mpu_dev, | |
2253 | + AM33XX_ES2_0_OPPNITRO_FREQ); | |
2254 | + } | |
2255 | + break; | |
2256 | + case AM335X_REV_ES2_1: | |
2257 | + /* FALLTHROUGH */ | |
2258 | + default: | |
2259 | + if (voltage_uv <= AM33XX_ES2_1_VDD_MPU_OPP50_UV) { | |
2260 | + /* | |
2261 | + * disable the higher freqs - we dont care about | |
2262 | + * the results | |
2263 | + */ | |
2264 | + opp_disable(mpu_dev, | |
2265 | + AM33XX_ES2_1_OPPTURBO_FREQ); | |
2266 | + opp_disable(mpu_dev, | |
2267 | + AM33XX_ES2_1_OPPNITRO_FREQ); | |
2268 | + } | |
2269 | + break; | |
2270 | + } | |
2271 | + } | |
2272 | +} | |
2273 | + | |
2184 | 2274 | static void setup_general_purpose_evm(void) |
2185 | 2275 | { |
2186 | 2276 | u32 prof_sel = am335x_get_profile_selection(); |
... | ... | @@ -2361,6 +2451,8 @@ |
2361 | 2451 | else |
2362 | 2452 | goto out; |
2363 | 2453 | } |
2454 | + | |
2455 | + am335x_opp_update(); | |
2364 | 2456 | |
2365 | 2457 | return; |
2366 | 2458 |