예제 #1
0
static int max8698_ldo_disable(struct regulator_dev *rdev)
{
	struct max8698_data *max8698 = rdev_get_drvdata(rdev);
	int ldo = max8698_get_ldo(rdev);
	int value, shift;

	if (ldo <= MAX8698_LDO5) {
		value = max8698_read_reg(max8698, MAX8698_REG_ONOFF1);
		shift = 6 - ldo;
		value &= ~(1 << shift);
		max8698_write_reg(max8698, value, MAX8698_REG_ONOFF1);
	} else if (ldo <= MAX8698_LDO9) {
		value = max8698_read_reg(max8698, MAX8698_REG_ONOFF2);
		shift = 13 - ldo;
		value &= ~(1 << shift);
		max8698_write_reg(max8698, value, MAX8698_REG_ONOFF2);
	} else {
		value = max8698_read_reg(max8698, MAX8698_REG_ONOFF1);
		shift = 7 - (ldo - MAX8698_DCDC1);
		value |= (1 << shift);
		max8698_write_reg(max8698, value, MAX8698_REG_ONOFF1);
	}

	return 0;
}
예제 #2
0
static int max8698_ldo_set_voltage(struct regulator_dev *rdev,
				int min_uV, int max_uV)
{
	struct max8698_data *max8698 = rdev_get_drvdata(rdev);
	int ldo = max8698_get_ldo(rdev);
	int value, shift = 0, mask = 0xff, reg;
	int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
	const int *vol_map = ldo_voltage_map[ldo];
	int i = 0;

	if (min_vol < 800 ||
	    max_vol > 3600)
		return -EINVAL;

	while (vol_map[i]) {
		if (vol_map[i] >= min_vol)
			break;
		i++;
	}

	if (!vol_map[i])
		return -EINVAL;

	if (vol_map[i] > max_vol)
		return -EINVAL;

	if (ldo == MAX8698_LDO2) {
		reg  = MAX8698_REG_LDO23;
		mask = 0x0f;
	} else if (ldo == MAX8698_LDO3) {
		reg  = MAX8698_REG_LDO23;
		shift = 4;
		mask = 0xf0;
	} else if (ldo == MAX8698_LDO8) {
		reg = ldo + 5;
		shift = 4;
		mask = 0xf0;
	} else if (ldo <= MAX8698_LDO9) {
		reg = ldo + 5;
		mask = 0xff;
	} else if (ldo == MAX8698_DCDC1) {
		reg = 0x04;
		mask = 0x0f;
	} else if (ldo == MAX8698_DCDC2) {
		reg = 0x06;
		mask = 0x0f;
	} else {
		reg = 0x07;
		mask = 0xff;
	}

	value = max8698_read_reg(max8698, reg);
	value &= ~mask;
	value |= (i << shift);
	max8698_write_reg(max8698, value, reg);

	return 0;
}
예제 #3
0
static int max8698_ldo_disable(struct regulator_dev *rdev)
{
	struct max8698_data *max8698 = rdev_get_drvdata(rdev);
	int reg, shift = 8, value, ret;

	ret = max8698_get_register(rdev, &reg, &shift);
	if (ret)
		return ret;

	value = max8698_read_reg(max8698, reg);
	if (value & (1 << shift)) {
		value &= ~(1 << shift);
		ret = max8698_write_reg(max8698, reg, value);
	}
	printk("%s[%d] ldo %d\n", __func__, __LINE__, max8698_get_ldo(rdev));

	return ret;
}