Commit ee9dfd8d729d3e7b5ce9e404a0e87f27f6f79135

Authored by Hebbar Gururaja
1 parent 506c079b84

ARM: OMAP: AM33XX: Add OPP table for PG2.1 AM335x

Add OPP table for MPU voltage domain.

Changes from PG2.0:
1. The Operating voltage for Nitro Mode is 1.35v
2. PG 2.1 SoC has a new  efuse sma register which describes the device's
ARM maximum frequency capabilities and package type. Upon parsing this
register, the supported maximum frequency is obtained.
Note:
If this register is not populated or the data is invalid (package type),
then we revert back to PG 2.0 OPP list.

Signed-off-by: Hebbar Gururaja <gururaja.hebbar@ti.com>

Showing 1 changed file with 123 additions and 4 deletions Side-by-side Diff

arch/arm/mach-omap2/opp3xxx_data.c
... ... @@ -18,6 +18,7 @@
18 18 * GNU General Public License for more details.
19 19 */
20 20 #include <linux/module.h>
  21 +#include <linux/io.h>
21 22  
22 23 #include <plat/cpu.h>
23 24  
24 25  
... ... @@ -197,12 +198,72 @@
197 198 AM33XX_ES2_0_VDD_MPU_OPPNITRO_UV),
198 199 };
199 200  
  201 +#define AM33XX_ES2_1_VDD_MPU_OPP50_UV 950000
  202 +#define AM33XX_ES2_1_VDD_MPU_OPP100_UV 1100000
  203 +#define AM33XX_ES2_1_VDD_MPU_OPPTURBO_UV 1260000
  204 +#define AM33XX_ES2_1_VDD_MPU_OPPNITRO_UV 1350000
  205 +
  206 +#define OPP_50_INDEX 0
  207 +#define OPP_100_INDEX 1
  208 +#define OPP_TURBO_INDEX 2
  209 +#define OPP_NITRO_INDEX 3
  210 +
  211 +
  212 +/* From AM335x TRM, SPRUH73H, Section 9.3.50 */
  213 +#define AM33XX_EFUSE_SMA_OFFSET 0x7fc
  214 +
  215 +/*
  216 + * Bits [17-16] indicates package type
  217 + * 00 - reserved
  218 + * 01 - ZCZ
  219 + * 10 - ZCE
  220 + * 11 - reserved
  221 + */
  222 +#define PACKAGE_TYPE_MASK 0x3
  223 +#define PACKAGE_TYPE_SHFT 16
  224 +
  225 +#define PACKAGE_TYPE_ZCZ 0x1
  226 +#define PACKAGE_TYPE_ZCE 0x2
  227 +
  228 +/*
  229 + * Bits [12:0] are OPP Disabled bits,
  230 + * 1 = OPP is disabled and not available,
  231 + * 0 = OPP available.
  232 + */
  233 +#define MAX_FREQ_MASK 0x1fff
  234 +#define MAX_FREQ_SHFT 0
  235 +
  236 +#define OPP_50_300MHZ_ZCZ_BIT 4
  237 +#define OPP_100_600MHZ_ZCZ_BIT 6
  238 +#define OPP_TURBO_800MHZ_ZCZ_BIT 8
  239 +#define OPP_NITRO_1GHZ_ZCZ_BIT 9
  240 +
  241 +#define OPP_50_300MHZ_ZCE_BIT 5
  242 +#define OPP_100_600MHZ_ZCE_BIT 6
  243 +
  244 +
  245 +static struct omap_opp_def __initdata am33xx_es2_1_opp_list[] = {
  246 + /* MPU OPP1 - OPP50 */
  247 + OPP_INITIALIZER("mpu", false, 300000000,
  248 + AM33XX_ES2_1_VDD_MPU_OPP50_UV),
  249 + /* MPU OPP2 - OPP100 */
  250 + OPP_INITIALIZER("mpu", false, 600000000,
  251 + AM33XX_ES2_1_VDD_MPU_OPP100_UV),
  252 + /* MPU OPP3 - OPPTurbo */
  253 + OPP_INITIALIZER("mpu", false, 800000000,
  254 + AM33XX_ES2_1_VDD_MPU_OPPTURBO_UV),
  255 + /* MPU OPP4 - OPPNitro */
  256 + OPP_INITIALIZER("mpu", false, 1000000000,
  257 + AM33XX_ES2_1_VDD_MPU_OPPNITRO_UV),
  258 +};
  259 +
200 260 /**
201 261 * omap3_opp_init() - initialize omap3 opp table
202 262 */
203 263 int __init omap3_opp_init(void)
204 264 {
205 265 int r = -ENODEV;
  266 + u32 rev, val, package_type, max_freq;
206 267  
207 268 if (!cpu_is_omap34xx())
208 269 return r;
209 270  
210 271  
211 272  
... ... @@ -211,16 +272,74 @@
211 272 r = omap_init_opp_table(omap36xx_opp_def_list,
212 273 ARRAY_SIZE(omap36xx_opp_def_list));
213 274 else if (cpu_is_am33xx()) {
214   - if (omap_rev() == AM335X_REV_ES1_0)
  275 + rev = omap_rev();
  276 + switch (rev) {
  277 + case AM335X_REV_ES1_0:
215 278 r = omap_init_opp_table(am33xx_es1_0_opp_def_list,
216 279 ARRAY_SIZE(am33xx_es1_0_opp_def_list));
217   - else
  280 + break;
  281 +
  282 + case AM335X_REV_ES2_1:
  283 + /*
  284 + * First read efuse sma reg to detect package type and
  285 + * supported frequency
  286 + */
  287 + val =
  288 + readl(AM33XX_CTRL_REGADDR(AM33XX_EFUSE_SMA_OFFSET));
  289 +
  290 + package_type = (val >> PACKAGE_TYPE_SHFT) &
  291 + PACKAGE_TYPE_MASK;
  292 + max_freq = val & MAX_FREQ_MASK;
  293 +
  294 + if (package_type == PACKAGE_TYPE_ZCZ) {
  295 + if (max_freq & OPP_50_300MHZ_ZCZ_BIT)
  296 + am33xx_es2_1_opp_list[OPP_50_INDEX].
  297 + default_available = true;
  298 +
  299 + if (max_freq & OPP_100_600MHZ_ZCZ_BIT)
  300 + am33xx_es2_1_opp_list[OPP_100_INDEX].
  301 + default_available = true;
  302 +
  303 + if (max_freq & OPP_TURBO_800MHZ_ZCZ_BIT)
  304 + am33xx_es2_1_opp_list[OPP_TURBO_INDEX].
  305 + default_available = true;
  306 +
  307 + if (max_freq & OPP_NITRO_1GHZ_ZCZ_BIT)
  308 + am33xx_es2_1_opp_list[OPP_NITRO_INDEX].
  309 + default_available = true;
  310 + } else if (package_type == PACKAGE_TYPE_ZCE) {
  311 + if (max_freq & OPP_50_300MHZ_ZCE_BIT)
  312 + am33xx_es2_1_opp_list[OPP_50_INDEX].
  313 + default_available = true;
  314 +
  315 + if (max_freq & OPP_100_600MHZ_ZCE_BIT)
  316 + am33xx_es2_1_opp_list[OPP_100_INDEX].
  317 + default_available = true;
  318 + } else {
  319 + /*
  320 + * if package type is not detected fall back to
  321 + * PG 2.0 OPP settings
  322 + */
  323 + r =
  324 + omap_init_opp_table(am33xx_es2_0_opp_def_list,
  325 + ARRAY_SIZE(am33xx_es2_0_opp_def_list));
  326 + break;
  327 + }
  328 +
  329 + r = omap_init_opp_table(am33xx_es2_1_opp_list,
  330 + ARRAY_SIZE(am33xx_es2_1_opp_list));
  331 + break;
  332 +
  333 + case AM335X_REV_ES2_0:
  334 + /* FALLTHROUGH */
  335 + default:
218 336 r = omap_init_opp_table(am33xx_es2_0_opp_def_list,
219 337 ARRAY_SIZE(am33xx_es2_0_opp_def_list));
220   - }
221   - else
  338 + }
  339 + } else {
222 340 r = omap_init_opp_table(omap34xx_opp_def_list,
223 341 ARRAY_SIZE(omap34xx_opp_def_list));
  342 + }
224 343  
225 344 return r;
226 345 }