/* ------------------------------------------------------------------------*//** * @FUNCTION lib54xx_voltage_set * @BRIEF change voltage of a given voltage domain, switching * CPUFreq governor to "userspace" & disabling smart-reflex * @RETURNS 0 on success * OMAPCONF_ERR_CPU * OMAPCONF_ERR_ARG * OMAPCONF_ERR_NOT_AVAILABLE * OMAPCONF_ERR_REG_ACCESS * OMAPCONF_ERR_INTERNAL * @param[in] vdd_id: voltage domain ID * @param[in] volt: new supply voltage (in volt) * @DESCRIPTION change voltage of a given voltage domain, switching * CPUFreq governor to "userspace" & disabling smart-reflex *//*------------------------------------------------------------------------ */ int lib54xx_voltage_set(voltdm54xx_id vdd_id, double volt) { int ret, ret_cpufreq; char prev_gov[CPUFREQ_GOV_MAX_NAME_LENGTH]; sr54xx_mod_id sr_id; CHECK_CPU(54xx, OMAPCONF_ERR_CPU); CHECK_ARG_LESS_THAN(vdd_id, VDD54XX_ID_MAX, OMAPCONF_ERR_ARG); /* * Switch governor to 'userspace' otherwise voltage change will be * overriden in case of OPP change. */ printf("Warning: switching CPUFreq governor to 'userspace', otherwise " "voltage change will be overriden...\n"); ret_cpufreq = cpufreq_scaling_governor_set("userspace", prev_gov); if (ret_cpufreq < 0) printf("Warning: failed to switch governor. Voltage will be " "overriden in case of OPP change.\n"); else printf("CPUFreq governor switched to 'userspace'.\n"); /* * Disable Smart-Reflex (if running) otherwise voltage change will be * overriden. */ sr_id = sr54xx_vddid2srid(vdd_id); if (sr54xx_avs_is_enabled(sr_id)) { printf("Warning: %s Smart-Reflex AVS is enabled. " "Disabling it...\n", voltdm54xx_name_get(vdd_id)); ret = sr54xx_avs_enable(sr_id, 0); if (ret == 0) printf("Smartreflex disabled.\n\n"); else printf("Warning: Could not disable Smart-Reflex AVS. " "Voltage may be overriden.\n\n"); } else { printf("Smartreflex disabled.\n\n"); } ret = voltdm54xx_voltage_set(vdd_id, (unsigned long) (volt * 1000000)); if (ret != 0) { fprintf(stderr, "Oups, could not change %s voltage to " "%.3lfV ... (%d)\n\n", voltdm54xx_name_get(vdd_id), volt, ret); } else { printf("%s supply voltage set to %1.3lfV (vsel = 0x%02X).\n\n", voltdm54xx_name_get(vdd_id), volt, smps_uvolt2vsel(vdd_id2smps_id(vdd_id), (unsigned long) (volt * 1000000))); printf("Warning:\n" " - Do not re-enable %s smartreflex or new voltage " "will be overriden.\n" " - Do not change OPP (or use CPUFREQ) or new voltage" " will be overriden.\n\n", voltdm54xx_name_get(vdd_id)); } return ret; }
/* ------------------------------------------------------------------------*//** * @FUNCTION voltdm_voltage_set * @BRIEF set the voltage supplied to a voltage domain. * @RETURNS 0 in case of success * OMAPCONF_ERR_CPU * OMAPCONF_ERR_ARG * OMAPCONF_ERR_REG_ACCESS * OMAPCONF_ERR_NOT_AVAILABLE * OMAPCONF_ERR_UNEXPECTED * OMAPCONF_ERR_INTERNAL * @param[in] voltdm: voltage domain name (as defined in voltdm.h) * @param[in] uv: new voltage to be set (in micro-volt) * @DESCRIPTION return the current voltage supplied to a voltage domain. *//*------------------------------------------------------------------------ */ int voltdm_voltage_set(const char *voltdm, int uv) { int id; CHECK_NULL_ARG(voltdm, OMAPCONF_ERR_ARG); voltdm_init(); id = voltdm_s2id(voltdm); if (id < 0) return (double) OMAPCONF_ERR_ARG; if (cpu_is_omap44xx()) { return sr44xx_voltage_set( (unsigned int) id, (unsigned long) uv); } else if (cpu_is_omap54xx()) { return voltdm54xx_voltage_set( (voltdm54xx_id) id, (unsigned long) uv); } else { fprintf(stderr, "omapconf: %s(): cpu not supported!!!\n", __func__); return OMAPCONF_ERR_CPU; } }