Commit 042c58a03f88430f98bf4989ad9beca19252abf8

Authored by Hebbar Gururaja
1 parent ee9dfd8d72

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