Ejemplo n.º 1
0
/*
 * TPS6586X has 2 enable bits that are OR'ed to determine the actual
 * regulator state. Clearing one of this bits allows switching
 * regulator on and of with single register write.
 */
static inline int tps6586x_regulator_preinit(struct device *parent,
					     struct tps6586x_regulator *ri)
{
	uint8_t val1, val2;
	int ret;

	if (ri->enable_reg[0] == ri->enable_reg[1] &&
	    ri->enable_bit[0] == ri->enable_bit[1])
			return 0;

	ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
	if (ret)
		return ret;

	ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
	if (ret)
		return ret;

	if (!(val2 & (1 << ri->enable_bit[1])))
		return 0;

	/*
	 * The regulator is on, but it's enabled with the bit we don't
	 * want to use, so we switch the enable bits
	 */
	if (!(val1 & (1 << ri->enable_bit[0]))) {
		ret = tps6586x_set_bits(parent, ri->enable_reg[0],
					1 << ri->enable_bit[0]);
		if (ret)
			return ret;
	}

	return tps6586x_clr_bits(parent, ri->enable_reg[1],
				 1 << ri->enable_bit[1]);
}
Ejemplo n.º 2
0
static inline int tps6586x_regulator_set_pwm_mode(struct platform_device *pdev)
{
	struct device *parent = pdev->dev.parent;
	struct regulator_init_data *p = pdev->dev.platform_data;
	struct tps6586x_settings *setting = p->driver_data;
	int ret = 0;
	uint8_t mask;

	if (setting == NULL)
		return 0;

	switch (pdev->id) {
	case TPS6586X_ID_SM_0:
		mask = 1 << SM0_PWM_BIT;
		break;
	case TPS6586X_ID_SM_1:
		mask = 1 << SM1_PWM_BIT;
		break;
	case TPS6586X_ID_SM_2:
		mask = 1 << SM2_PWM_BIT;
		break;
	default:
		/* not all regulators have PWM/PFM option */
		return 0;
	}

	if (setting->sm_pwm_mode == PWM_ONLY)
		ret = tps6586x_set_bits(parent, TPS6586X_SMODE1, mask);
	else if (setting->sm_pwm_mode == AUTO_PWM_PFM)
		ret = tps6586x_clr_bits(parent, TPS6586X_SMODE1, mask);

	return ret;
}
static inline int tps6586x_regulator_preinit(struct device *parent,
					     struct tps6586x_regulator *ri)
{
	uint8_t val1, val2;
	int ret;

	if (ri->enable_reg[0] == ri->enable_reg[1] &&
	    ri->enable_bit[0] == ri->enable_bit[1])
			return 0;

	ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
	if (ret)
		return ret;

	ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
	if (ret)
		return ret;

	if (!(val2 & (1 << ri->enable_bit[1])))
		return 0;

	/*
                                                               
                                             
  */
	if (!(val1 & (1 << ri->enable_bit[0]))) {
		ret = tps6586x_set_bits(parent, ri->enable_reg[0],
					1 << ri->enable_bit[0]);
		if (ret)
			return ret;
	}

	return tps6586x_clr_bits(parent, ri->enable_reg[1],
				 1 << ri->enable_bit[1]);
}
Ejemplo n.º 4
0
static int tps6586x_fixed_regulator_disable(struct regulator_dev *rdev)
{
	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
	struct device *parent = to_tps6586x_dev(rdev);

	return tps6586x_set_bits(parent, ri->enable_reg[0],
				 1 << ri->enable_bit[0]);
}
static int tps6586x_dvm_set_voltage(struct regulator_dev *rdev,
				    int min_uV, int max_uV)
{
	struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
	struct device *parent = to_tps6586x_dev(rdev);
	int ret;

	ret = __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV);
	if (ret)
		return ret;

	return tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
}
Ejemplo n.º 6
0
/*
 * TPS6586X has 2 enable bits that are OR'ed to determine the actual
 * regulator state. Clearing one of this bits allows switching
 * regulator on and of with single register write.
 */
static inline int tps6586x_regulator_preinit(struct device *parent,
					     struct tps6586x_regulator *ri)
{
	uint8_t val1, val2;
	int ret;

#ifdef CONFIG_MACH_SAMSUNG_VARIATION_TEGRA
	/*
	 * set SM0V1 : 1.325V --> 1.2V
	 * because the default TPS6586X SM0V1[0x26]:1.325V,
	 * SM0V2:1.2V, but SM0 voltage selector points SM0V1
	 * our spec of v_core : 1.2V
	 */

	if (ri->desc.id == TPS6586X_ID_SM_0) {
		int ret;
		ret = tps6586x_write(parent, TPS6586X_SM0V1, 0x13);
		if (ret)
			return ret;
	}
#endif

	if (ri->enable_reg[0] == ri->enable_reg[1] &&
	    ri->enable_bit[0] == ri->enable_bit[1])
			return 0;

	ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
	if (ret)
		return ret;

	ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
	if (ret)
		return ret;

	if (!(val2 & (1 << ri->enable_bit[1])))
		return 0;

	/*
	 * The regulator is on, but it's enabled with the bit we don't
	 * want to use, so we switch the enable bits
	 */
	if (!(val1 & (1 << ri->enable_bit[0]))) {
		ret = tps6586x_set_bits(parent, ri->enable_reg[0],
					1 << ri->enable_bit[0]);
		if (ret)
			return ret;
	}

	return tps6586x_clr_bits(parent, ri->enable_reg[1],
				 1 << ri->enable_bit[1]);
}
/*
 * TPS6586X has 2 enable bits that are OR'ed to determine the actual
 * regulator state. Clearing one of this bits allows switching
 * regulator on and of with single register write.
 */
static inline int tps6586x_regulator_preinit(struct device *parent,
					     struct tps6586x_regulator *ri)
{
	uint8_t val1, val2;
	int ret;

	/* To prevent voltage negative overshoot, set slew rate to 3.52mV/us
	 * from 7.04mV/us. Because voltage negative overshoot was occured
	 * on some devices. */
	if (ri->desc.id == TPS6586X_ID_SM_1) {
		ret = tps6586x_update(parent, TPS6586X_SM1SL,
				      TPS6586X_SMSL_1_76, TPS6586X_SMSL_MASK);
		if (ret)
			return ret;
	}

	if (ri->enable_reg[0] == ri->enable_reg[1] &&
	    ri->enable_bit[0] == ri->enable_bit[1])
			return 0;

	ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
	if (ret)
		return ret;

	ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
	if (ret)
		return ret;

	if (!(val2 & (1 << ri->enable_bit[1])))
		return 0;

	/*
	 * The regulator is on, but it's enabled with the bit we don't
	 * want to use, so we switch the enable bits
	 */
	if (!(val1 & (1 << ri->enable_bit[0]))) {
		ret = tps6586x_set_bits(parent, ri->enable_reg[0],
					1 << ri->enable_bit[0]);
		if (ret)
			return ret;
	}

	return tps6586x_clr_bits(parent, ri->enable_reg[1],
				 1 << ri->enable_bit[1]);
}