예제 #1
0
파일: pmic.c 프로젝트: houlixin/BBB-TISDK
/* ------------------------------------------------------------------------*//**
 * @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;
}
예제 #2
0
파일: pmic.c 프로젝트: houlixin/BBB-TISDK
/* ------------------------------------------------------------------------*//**
 * @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;
}
예제 #3
0
/* ------------------------------------------------------------------------*//**
 * @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;
}
예제 #4
0
/* ------------------------------------------------------------------------*//**
 * @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;
}
예제 #5
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]);
	}
}