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; }
/* * 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]); }
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]); }
static int tps6586x_fixed_regulator_enable(struct regulator_dev *rdev) { struct tps6586x_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps6586x_dev(rdev); return tps6586x_clr_bits(parent, ri->enable_reg[0], 1 << ri->enable_bit[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]); }