/* ------------------------------------------------------------------------*//** * @FUNCTION smps_id2vdd_id * @BRIEF convert SMPS ID into VDD ID (for a given platform) * @RETURNS valid VDD ID in case of success * OMAP4_VD_ID_MAX in case of error (OMAP4) * VDD54XX_ID_MAX in case of error (OMAP5) * @param[in] smps_id: valid SMPS ID * @DESCRIPTION convert SMPS ID into VDD ID (for a given platform) *//*------------------------------------------------------------------------ */ unsigned short smps_id2vdd_id(pmic_smps_id smps_id) { unsigned short vdd_id; char name[16]; switch (cpu_get()) { case OMAP_4430: case OMAP_4460: case OMAP_4470: if (smps_id > PMIC_SMPS_ID_MAX) { fprintf(stderr, "%s(): incorrect smps_id! (%u)\n", __func__, smps_id); vdd_id = (unsigned short) OMAP4_VD_ID_MAX; strncpy(name, "FIXME", 16); } else { vdd_id = smps_id + 1; voltdm44xx_get_name(vdd_id, name); } break; case OMAP_5430: case OMAP_5432: if (smps_id > PMIC_SMPS_ID_MAX) { fprintf(stderr, "%s(): incorrect smps_id! (%u)\n", __func__, smps_id); vdd_id = (unsigned short) VDD54XX_ID_MAX; strncpy(name, "FIXME", 16); } else { vdd_id = smps_id + 1; strncpy(name, voltdm54xx_name_get(vdd_id), 16); } break; case DRA_75X: if (smps_id > PMIC_SMPS_ID_MAX) { fprintf(stderr, "%s(): incorrect smps_id! (%u)\n", __func__, smps_id); vdd_id = (unsigned short) VDD_DRA7XX_ID_MAX; strncpy(name, "FIXME", 16); } else { switch (smps_id) { case PMIC_SMPS_MPU: vdd_id = VDD_DRA7XX_MPU; break; case PMIC_SMPS_CORE: vdd_id = VDD_DRA7XX_CORE; break; case PMIC_SMPS_MM: vdd_id = VDD_DRA7XX_IVA; break; case PMIC_SMPS_DSPEVE: vdd_id = VDD_DRA7XX_DSPEVE; break; case PMIC_SMPS_GPU: vdd_id = VDD_DRA7XX_GPU; break; default: vdd_id = VDD_DRA7XX_ID_MAX; } strncpy(name, voltdm54xx_name_get(vdd_id), 16); } break; case AM_3352: case AM_3354: case AM_3356: case AM_3357: case AM_3358: case AM_3359: if (smps_id > PMIC_SMPS_ID_MAX) { fprintf(stderr, "%s(): incorrect smps_id! (%u)\n", __func__, smps_id); vdd_id = (unsigned short) VDD_AM335X_ID_MAX; strncpy(name, "FIXME", 16); } else { switch (smps_id) { case PMIC_SMPS_MPU: vdd_id = VDD_AM335X_MPU; break; case PMIC_SMPS_CORE: vdd_id = VDD_AM335X_CORE; break; default: vdd_id = VDD_AM335X_ID_MAX; } strncpy(name, voltdm_am335x_name_get(vdd_id), 16); } break; default: fprintf(stderr, "%s(): unsupported CPU! (%s)\n", __func__, cpu_gets(name)); vdd_id = (unsigned short) VDD54XX_ID_MAX; strncpy(name, "FIXME", 16); } dprintf("%s(): smps_id=%s => vdd_id=%s\n", __func__, smps_name_get(smps_id), name); return vdd_id; }
/* ------------------------------------------------------------------------*//** * @FUNCTION vdd_id2smps_id * @BRIEF convert VDD ID into SMPS ID (for a given platform) * @RETURNS valid SMPS ID in case of success * PMIC_SMPS_ID_MAX in case of error * @param[in] vdd_id: valid VDD ID * @DESCRIPTION convert VDD ID into SMPS ID (for a given platform) *//*------------------------------------------------------------------------ */ pmic_smps_id vdd_id2smps_id(unsigned short vdd_id) { pmic_smps_id smps_id; char smps_name[16]; char vdd_name[16]; switch (cpu_get()) { case OMAP_4430: case OMAP_4460: case OMAP_4470: voltdm44xx_get_name(vdd_id, vdd_name); if ((vdd_id == OMAP4_LDO_WKUP) || (vdd_id > OMAP4_VDD_CORE)) { fprintf(stderr, "%s(): incorrect vdd_id! (%u)\n", __func__, vdd_id); smps_id = PMIC_SMPS_ID_MAX; strncpy(smps_name, "FIXME", 16); } else { smps_id = vdd_id - 1; strncpy(smps_name, smps_name_get(smps_id), 16); } break; case OMAP_5430: case OMAP_5432: strncpy(vdd_name, voltdm54xx_name_get(vdd_id), 16); if ((vdd_id == VDD54XX_WKUP) || (vdd_id > VDD54XX_CORE)) { fprintf(stderr, "%s(): incorrect vdd_id! (%u)\n", __func__, vdd_id); smps_id = PMIC_SMPS_ID_MAX; strncpy(smps_name, "FIXME", 16); } else { smps_id = vdd_id - 1; strncpy(smps_name, smps_name_get(smps_id), 16); } break; case DRA_75X: strncpy(vdd_name, voltdm_dra7xx_name_get(vdd_id), 16); if (vdd_id > VDD_DRA7XX_RTC) { fprintf(stderr, "%s(): incorrect vdd_id! (%u)\n", __func__, vdd_id); smps_id = PMIC_SMPS_ID_MAX; strncpy(smps_name, "FIXME", 16); } else { switch (vdd_id) { case VDD_DRA7XX_MPU: smps_id = PMIC_SMPS_MPU; break; case VDD_DRA7XX_CORE: smps_id = PMIC_SMPS_CORE; break; case VDD_DRA7XX_IVA: smps_id = PMIC_SMPS_MM; break; case VDD_DRA7XX_DSPEVE: smps_id = PMIC_SMPS_DSPEVE; break; case VDD_DRA7XX_GPU: smps_id = PMIC_SMPS_GPU; break; default: smps_id = PMIC_SMPS_ID_MAX; } strncpy(smps_name, smps_name_get(smps_id), 16); } break; case AM_3352: case AM_3354: case AM_3356: case AM_3357: case AM_3358: case AM_3359: strncpy(vdd_name, voltdm_am335x_name_get(vdd_id), 16); if (vdd_id > VDD_AM335X_RTC) { fprintf(stderr, "%s(): incorrect vdd_id! (%u)\n", __func__, vdd_id); smps_id = PMIC_SMPS_ID_MAX; strncpy(smps_name, "FIXME", 16); } else { switch (vdd_id) { case VDD_AM335X_MPU: smps_id = PMIC_SMPS_MPU; break; case VDD_AM335X_CORE: smps_id = PMIC_SMPS_CORE; break; default: smps_id = PMIC_SMPS_ID_MAX; } strncpy(smps_name, smps_name_get(smps_id), 16); } break; default: fprintf(stderr, "%s(): unsupported CPU! (%s)\n", __func__, cpu_gets(smps_name)); smps_id = PMIC_SMPS_ID_MAX; strncpy(smps_name, "FIXME", 16); } dprintf("%s(): vdd_id=%s => smps_id=%s\n", __func__, vdd_name, smps_name); return smps_id; }
/* ------------------------------------------------------------------------*//** * @FUNCTION main44xx_legacy * @BRIEF omap4 functions main entry point (legacy) * @RETURNS 0 in case of success * OMAPCONF_ERR_ARG * OMAPCONF_ERR_CPU * OMAPCONF_ERR_REG_ACCESS * OMAPCONF_ERR_INTERNAL * @param[in] argc: shell input argument number * @param[in] argv: shell input argument(s) * @DESCRIPTION omap4 functions main entry point (legacy) *//*------------------------------------------------------------------------ */ static int main44xx_legacy(int argc, char *argv[]) { int ret = 0; voltdm44xx_id vdd_id; char voltdm_name[VOLTDM44XX_MAX_NAME_LENGTH]; double v; unsigned int ms; CHECK_CPU(44xx, OMAPCONF_ERR_CPU); if (argc == 0) return err_arg_missing_msg_show(HELP_CATEGORY_MAX); if (strcmp(argv[0], "pwst") == 0) { ret = power44xx_status_show(); } else if (strcmp(argv[0], "opp") == 0) { ret = opp_show(stdout); } else if (strcmp(argv[0], "hwobs") == 0) { ret = hwobs44xx_main(argc, argv); } else if (strcmp(argv[0], "mpu") == 0) { ret = mpu44xx_main(argc, argv); } else if (strcmp(argv[0], "mpuss") == 0) { ret = mpuss44xx_main(argc, argv); } else if (strcmp(argv[0], "dplls") == 0) { ret = dpll44xx_main(argc, argv); } else if (strcmp(argv[0], "wkdep") == 0) { ret = wkdep44xx_main(argc, argv); } else if (strcmp(argv[0], "core") == 0) { ret = core44xx_main(argc, argv); } else if (strcmp(argv[0], "per") == 0) { ret = per44xx_main(argc, argv); } else if (strcmp(argv[0], "dsp") == 0) { ret = dsp44xx_main(argc, argv); } else if (strcmp(argv[0], "dss") == 0) { ret = dss44xx_main(argc, argv); } else if (strcmp(argv[0], "cam") == 0) { ret = cam44xx_main(argc, argv); } else if (strcmp(argv[0], "sgx") == 0) { ret = gfx44xx_main(argc, argv); } else if (strcmp(argv[0], "gfx") == 0) { ret = gfx44xx_main(argc, argv); } else if (strcmp(argv[0], "ivahd") == 0) { ret = ivahd44xx_main(argc, argv); } else if (strcmp(argv[0], "iva") == 0) { ret = ivahd44xx_main(argc, argv); } else if (strcmp(argv[0], "per") == 0) { ret = per44xx_main(argc, argv); } else if (strcmp(argv[0], "abe") == 0) { ret = abe44xx_main(argc, argv); } else if (strcmp(argv[0], "wkup") == 0) { ret = wkup44xx_main(argc, argv); } else if (strcmp(argv[0], "l3init") == 0) { ret = l3init44xx_main(argc, argv); } else if (strcmp(argv[0], "alwon") == 0) { ret = alwon44xx_main(argc, argv); } else if (strcmp(argv[0], "emu") == 0) { ret = emu44xx_main(argc, argv); } else if (strcmp(argv[0], "sr") == 0) { if (argc == 1) { ret = err_arg_missing_msg_show(HELP_AVS); } else if (argc == 2) { if (strcmp(argv[1], "dump") == 0) ret = sr44xx_dump(); else if (strcmp(argv[1], "cfg") == 0) ret = sr44xx_config_show(stdout); else if (strcmp(argv[1], "status") == 0) ret = sr44xx_status_show(stdout); else ret = err_unknown_argument_msg_show(argv[1]); } else { ret = err_arg_too_many_msg_show(HELP_AVS); } } else if (strcmp(argv[0], "abb") == 0) { ret = abb44xx_main(argc, argv); } else if (strcmp(argv[0], "temp") == 0) { if (argc == 1) { ret = temp_sensor_show(stdout, "all"); } else if (argc == 2) { if (strcmp(argv[1], "all") == 0) ret = temp_sensor_show(stdout, argv[1]); else if (temp_sensor_is_available(argv[1]) != 0) ret = temp_sensor_show(stdout, argv[1]); else ret = err_arg_msg_show(HELP_TEMPERATURE); } else { ret = err_arg_too_many_msg_show(HELP_TEMPERATURE); } } else if (strcmp(argv[0], "ctt") == 0) { ret = ctt44xx_main(argc, argv); } else if (strcmp(argv[0], "pct") == 0) { ret = pct44xx_main(argc, argv); } else if (strcmp(argv[0], "emif") == 0) { ret = emif44xx_main(argc, argv); } else if (strcmp(argv[0], "twl6040") == 0) { ret = twl6040_main(argc, argv); } else if (strcmp(argv[0], "display") == 0) { if (argc == 3) { ret = display44xx_dump(argv[2]); } else { help(HELP_DISPLAY); ret = OMAPCONF_ERR_ARG; } } else if (strcmp(argv[0], "statdep") == 0) { ret = statdep44xx_main(argc, argv); } else if (strcmp(argv[0], "twl6030") == 0) { ret = twl603x_main(argc, argv); } else if (strcmp(argv[0], "camera") == 0) { ret = camera44xx_main(argc, argv); } else if (strcmp(argv[0], "setvolt") == 0) { /* Retrieve arguments */ if (argc != 3) return err_arg_msg_show(HELP_VOLT); vdd_id = voltdm44xx_s2id(argv[1]); if (vdd_id == OMAP4_VD_ID_MAX) return err_arg_msg_show(HELP_VOLT); ret = sscanf(argv[2], "%lf", &v); if (ret != 1) return err_arg_msg_show(HELP_VOLT); /* Call function with retrieved arguments */ ret = sr44xx_voltage_set(vdd_id, (unsigned long) (v * 1000000)); if (ret != 0) { fprintf(stderr, "Error: could not set %s new voltage!!!\n\n", voltdm44xx_get_name(vdd_id, voltdm_name)); } else { printf( "%s supply voltage set to %1.3lfV (vsel = 0x%02X).\n\n", voltdm44xx_get_name(vdd_id, voltdm_name), v, smps_uvolt2vsel(vdd_id2smps_id(vdd_id), (unsigned long) (v * 1000000))); printf("### WARNING ###:\n"); printf( " - Do not re-enable %s smartreflex or new voltage will be overriden.\n", voltdm44xx_get_name(vdd_id, voltdm_name)); printf( " - Do not change OPP (or use CPUFREQ) or new voltage will be overriden.\n\n"); } } else if (strcmp(argv[0], "vminsearch") == 0) { if (argc != 4) return err_arg_msg_show(HELP_VOLT); vdd_id = voltdm44xx_s2id(argv[1]); if (vdd_id == OMAP4_VD_ID_MAX) return err_arg_msg_show(HELP_VOLT); ret = sscanf(argv[2], "%lf", &v); if (ret != 1) return err_arg_msg_show(HELP_VOLT); ret = sscanf(argv[3], "%d", &ms); if (ret != 1) return err_arg_msg_show(HELP_VOLT); ret = voltdm44xx_vminsearch(vdd_id, v, ms); } else { ret = err_unknown_argument_msg_show(argv[0]); goto main44xx_legacy_end; } if (ret != 0) goto main44xx_legacy_end; fprintf(stderr, "\n\n### WARNING ###: deprecated command/options. See 'omapconf --help'.\n\n"); main44xx_legacy_end: return ret; }
/* ------------------------------------------------------------------------*//** * @FUNCTION sr44xx_voltage_set * @BRIEF set voltage of a voltage domain using VC bypass method * @RETURNS 0 in case of success * OMAPCONF_ERR_ARG * OMAPCONF_ERR_REG_ACCESS * OMAPCONF_ERR_NOT_AVAILABLE * OMAPCONF_ERR_UNEXPECTED * @param[in] vdd_id: voltage domain ID * @param[in] uv: supply voltage (in uV) * @DESCRIPTION set voltage of a voltage domain using VC bypass method * NB: automatically disable SmartReflex (if enabled). * NB: do not re-enable smartreflex afterwards or * new voltage will be overriden. *//*------------------------------------------------------------------------ */ int sr44xx_voltage_set(unsigned int vdd_id, unsigned long uv) { omap4_sr_module_id sr_id; FILE *fp; int ret; unsigned char vsel, vsel_len; unsigned int vc_bypass_value; unsigned int volt_reg_addr; char voltdm_name[VOLTDM44XX_MAX_NAME_LENGTH]; unsigned char VR_slave_address; unsigned int prm_vc_val_cmd_vdd, prm_vc_val_cmd_vdd_addr; static const char filename[OMAP4_SR_ID_MAX][72] = { "/sys/kernel/debug/pm_debug/smartreflex/sr_mpu/autocomp", "/sys/kernel/debug/pm_debug/smartreflex/sr_iva/autocomp", "/sys/kernel/debug/pm_debug/smartreflex/sr_core/autocomp"}; if (!cpu_is_omap44xx()) return OMAPCONF_ERR_CPU; if ((uv < OMAP4_VOLTAGE_MIN) || (uv > OMAP4_VOLTAGE_MAX)) { fprintf(stderr, "Error: voltage out of range! (%1.3lfV)\n", (double) ((double) uv / 1000000.0)); return OMAPCONF_ERR_ARG; } if (cpu_is_omap4470()) { switch (vdd_id) { case OMAP4_VDD_MPU: sr_id = OMAP4_SR_MPU; VR_slave_address = PMIC_SLAVE_ADDR; volt_reg_addr = VOLT_REG_MPU_ADDR; prm_vc_val_cmd_vdd_addr = OMAP4430_PRM_VC_VAL_CMD_VDD_MPU_L; break; case OMAP4_VDD_IVA: sr_id = OMAP4_SR_IVA; VR_slave_address = PMIC_SLAVE_ADDR; volt_reg_addr = OMAP4470_VOLT_REG_IVA_ADDR; prm_vc_val_cmd_vdd_addr = OMAP4430_PRM_VC_VAL_CMD_VDD_IVA_L; break; case OMAP4_VDD_CORE: sr_id = OMAP4_SR_CORE; VR_slave_address = PMIC_SLAVE_ADDR; volt_reg_addr = OMAP4470_VOLT_REG_CORE_ADDR; prm_vc_val_cmd_vdd_addr = OMAP4430_PRM_VC_VAL_CMD_VDD_CORE_L; break; default: fprintf(stderr, "Error: invalid voltage domain ID! " "(%d)\n", vdd_id); return OMAPCONF_ERR_ARG; } } else if (cpu_is_omap4460()) { switch (vdd_id) { case OMAP4_VDD_MPU: sr_id = OMAP4_SR_MPU; VR_slave_address = TPS62361_SLAVE_ADDR; volt_reg_addr = TPS62361_VOLT_REG_ADDR; prm_vc_val_cmd_vdd_addr = OMAP4430_PRM_VC_VAL_CMD_VDD_MPU_L; break; case OMAP4_VDD_IVA: sr_id = OMAP4_SR_IVA; VR_slave_address = PMIC_SLAVE_ADDR; volt_reg_addr = VOLT_REG_IVA_ADDR; prm_vc_val_cmd_vdd_addr = OMAP4430_PRM_VC_VAL_CMD_VDD_IVA_L; break; case OMAP4_VDD_CORE: sr_id = OMAP4_SR_CORE; VR_slave_address = PMIC_SLAVE_ADDR; volt_reg_addr = OMAP4460_VOLT_REG_CORE_ADDR; prm_vc_val_cmd_vdd_addr = OMAP4430_PRM_VC_VAL_CMD_VDD_CORE_L; break; default: fprintf(stderr, "Error: invalid voltage domain ID! " "(%d)\n", vdd_id); return OMAPCONF_ERR_ARG; } } else { /* 4430 */ switch (vdd_id) { case OMAP4_VDD_MPU: sr_id = OMAP4_SR_MPU; VR_slave_address = PMIC_SLAVE_ADDR; volt_reg_addr = VOLT_REG_MPU_ADDR; prm_vc_val_cmd_vdd_addr = OMAP4430_PRM_VC_VAL_CMD_VDD_CORE_L; break; case OMAP4_VDD_IVA: sr_id = OMAP4_SR_IVA; VR_slave_address = PMIC_SLAVE_ADDR; volt_reg_addr = VOLT_REG_IVA_ADDR; prm_vc_val_cmd_vdd_addr = OMAP4430_PRM_VC_VAL_CMD_VDD_CORE_L; break; case OMAP4_VDD_CORE: sr_id = OMAP4_SR_CORE; VR_slave_address = PMIC_SLAVE_ADDR; volt_reg_addr = VOLT_REG_CORE_ADDR; prm_vc_val_cmd_vdd_addr = OMAP4430_PRM_VC_VAL_CMD_VDD_CORE_L; break; default: fprintf(stderr, "Error: invalid voltage domain ID! " "(%d)\n", vdd_id); return OMAPCONF_ERR_ARG; } } dprintf("%s(%d, %lduV): sr_id=0x%02X VR_slave_address=0x%02X " "volt_reg_addr=0x%02X\n", __func__, vdd_id, uv, sr_id, VR_slave_address, volt_reg_addr); /* Smartreflex must not be running, disable it */ if (sr44xx_is_enabled(sr_id)) { printf("Warning: %s smartreflex is enabled. Disabling it.\n", voltdm44xx_get_name(vdd_id, voltdm_name)); fp = fopen(filename[sr_id], "w"); if (fp == NULL) { fprintf(stderr, "Could not open %s! Is debugfs mounted???\n\n", filename[sr_id]); return OMAPCONF_ERR_NOT_AVAILABLE; } ret = fwrite("0", sizeof(char), 1, fp); fclose(fp); if (ret != 1) { fprintf(stderr, "Could not write into %s!\n\n", filename[sr_id]); return OMAPCONF_ERR_UNEXPECTED; } printf("Smartreflex disabled.\n"); } /* Get vsel corresponding to target voltage */ vsel = smps_uvolt2vsel(vdd_id2smps_id(vdd_id), uv); dprintf("%s(): domain=%s, target voltage=%lfV, " "target vsel=0x%02X\n", __func__, voltdm44xx_get_name(vdd_id, voltdm_name), (double) ((double) uv / 1000000.0), vsel); /* Use VC BYPASS method to change voltage */ vc_bypass_value = (vsel << VC_BYPASS_DATA_SHIFT) | (volt_reg_addr << VC_BYPASS_REG_ADDR_SHIFT) | (VR_slave_address << VC_BYPASS_SLAVE_ADDR_SHIFT); dprintf("vc_bypass_value = 0x%08X\n", vc_bypass_value); ret = mem_write(OMAP4430_PRM_VC_VAL_BYPASS, vc_bypass_value); if (ret != 0) { fprintf(stderr, "Error: could not write into " "PRM_VC_VAL_BYPASS register!!! (%d)\n\n", ret); return OMAPCONF_ERR_REG_ACCESS; } vc_bypass_value |= VC_BYPASS_CMD_VALID_MASK; dprintf("vc_bypass_value = 0x%08X\n", vc_bypass_value); ret = mem_write(OMAP4430_PRM_VC_VAL_BYPASS, vc_bypass_value); if (ret != 0) { fprintf(stderr, "Error: could not write into " "PRM_VC_VAL_BYPASS register!!! (%d)\n\n", ret); return OMAPCONF_ERR_REG_ACCESS; } /* Wait for VC BYPASS command to be acknowledge */ dprintf("%s(): Wait for VC BYPASS command to be acknowledged...\n", __func__); do { ret = mem_read(OMAP4430_PRM_VC_VAL_BYPASS, &vc_bypass_value); if (ret != 0) { fprintf(stderr, "Error: could not read " "PRM_VC_VAL_BYPASS register!!! (%d)\n\n", ret); return OMAPCONF_ERR_REG_ACCESS; } } while ((vc_bypass_value & VC_BYPASS_CMD_VALID_MASK) != 0); dprintf("%s supply voltage set to %lfV.\n", voltdm44xx_get_name(vdd_id, voltdm_name), (double) ((double) uv / 1000000.0)); /* * Update VC ONVALUE voltage, so that new voltage does not get lost * after a power transition on this domain */ /* Get currently programmed voltage from VC register */ dprintf("%s(): Get currently programmed voltage " "(prm_vc_val_cmd_vdd_addr=0x%08X)\n", __func__, prm_vc_val_cmd_vdd_addr); if (mem_read(prm_vc_val_cmd_vdd_addr, &prm_vc_val_cmd_vdd) != 0) return OMAPCONF_ERR_REG_ACCESS; if (cpu_is_omap4460() && (vdd_id == OMAP4_VDD_MPU)) /* TPS62361 vsel length is 8-bit, not 6-bit as for TWL6030 */ vsel_len = 8; else vsel_len = 6; dprintf("%s(): %s: prm_vc_val_cmd_vdd=0x%08X, vsel_len=%u\n", __func__, voltdm44xx_get_name(vdd_id, voltdm_name), prm_vc_val_cmd_vdd, vsel_len); prm_vc_val_cmd_vdd &= ~(((1 << vsel_len) - 1) << OMAP4_ON_VOLTAGE); prm_vc_val_cmd_vdd |= (vsel << OMAP4_ON_VOLTAGE); dprintf("%s(): %s: now prm_vc_val_cmd_vdd = 0x%08X\n", __func__, voltdm44xx_get_name(vdd_id, voltdm_name), prm_vc_val_cmd_vdd); mem_write(prm_vc_val_cmd_vdd_addr, prm_vc_val_cmd_vdd); return 0; }
/* ------------------------------------------------------------------------*//** * @FUNCTION main44xx_set * @BRIEF set selected item provided in string argv. * @RETURNS 0 in case of success * OMAPCONF_ERR_ARG * OMAPCONF_ERR_CPU * OMAPCONF_ERR_REG_ACCESS * OMAPCONF_ERR_INTERNAL * @param[in] argc: shell input argument number * @param[in] argv: shell input argument(s) * @DESCRIPTION set selected item provided in string argv. *//*------------------------------------------------------------------------ */ static int main44xx_set(int argc, char *argv[]) { voltdm44xx_id vdd_id; char voltdm_name[VOLTDM44XX_MAX_NAME_LENGTH]; double v; int ret; CHECK_CPU(44xx, OMAPCONF_ERR_CPU); if (strcmp(argv[0], "prcm") == 0) { if (argc < 3) { return err_arg_missing_msg_show(HELP_PRCM); } else if (strcmp(argv[1], "statdep") == 0) { if (argc == 3) return statdep44xx_main_set(argv[2], NULL, 1); else if (argc == 4) return statdep44xx_main_set( argv[2], argv[3], 1); else return err_arg_too_many_msg_show(HELP_PRCM); } else { return err_arg_msg_show(HELP_PRCM); } } else if (strcmp(argv[0], "volt") == 0) { if (argc < 3) { return err_arg_missing_msg_show(HELP_VOLT); } else if (argc == 3) { vdd_id = voltdm44xx_s2id(argv[1]); if (vdd_id == OMAP4_VD_ID_MAX) return err_arg_msg_show(HELP_VOLT); ret = sscanf(argv[2], "%lf", &v); if (ret != 1) return err_arg_msg_show(HELP_VOLT); ret = sr44xx_voltage_set(vdd_id, (unsigned long) (v * 1000000)); if (ret != 0) { printf( "omapconf: could not set %s new voltage!!!\n\n", voltdm44xx_get_name(vdd_id, voltdm_name)); } else { printf( "%s supply voltage set to %1.3lfV (vsel = 0x%02X).\n\n", voltdm44xx_get_name(vdd_id, voltdm_name), v, smps_uvolt2vsel(vdd_id2smps_id(vdd_id), (unsigned long) (v * 1000000))); printf("### WARNING ###:\n"); printf( " - Do not re-enable %s smartreflex or new voltage will be overriden.\n", voltdm44xx_get_name( vdd_id, voltdm_name)); printf( " - Do not change OPP (or use CPUFREQ) or new voltage will be overriden.\n\n"); } return ret; } else { return err_arg_too_many_msg_show(HELP_VOLT); } } else if (strcmp(argv[0], "pmic") == 0) { if (argc < 4) { return err_arg_missing_msg_show(HELP_PMIC); } else if (argc == 4) { if (strcmp(argv[1], "devpwrgrp") == 0) return twl603x_pwrgrp_set(stdout, argv[2], argv[3]); else return err_arg_msg_show(HELP_PMIC); } else { return err_arg_too_many_msg_show(HELP_PMIC); } } else { return err_unknown_argument_msg_show(argv[0]); } }