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]); }
/* * 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]); }
/* * 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]); }
static int tps6586x_gpio_get(struct gpio_chip *gc, unsigned offset) { struct tps6586x_gpio *tps6586x_gpio = gpiochip_get_data(gc); uint8_t val; int ret; ret = tps6586x_read(tps6586x_gpio->parent, TPS6586X_GPIOSET2, &val); if (ret) return ret; return !!(val & (1 << offset)); }
static int tps6586x_fixed_regulator_is_enabled(struct regulator_dev *rdev) { struct tps6586x_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps6586x_dev(rdev); uint8_t reg_val; int ret; ret = tps6586x_read(parent, ri->enable_reg[0], ®_val); if (ret) return ret; return !(reg_val & (1 << ri->enable_bit[0])); }
/* * Get current voltage of SM0 and SM1 * * @param sm0 Place to put SM0 voltage * @param sm1 Place to put SM1 voltage * @return 0 if ok, -1 on error */ static int read_voltages(int *sm0, int *sm1) { int ctrl1, ctrl2; int is_v2; /* * Each vdd has two supply sources, ie, v1 and v2. * The supply control reg1 and reg2 determine the current selection. */ ctrl1 = tps6586x_read(SUPPLY_CONTROL1); ctrl2 = tps6586x_read(SUPPLY_CONTROL2); if (ctrl1 == -1 || ctrl2 == -1) return -1; /* Figure out whether V1 or V2 is selected */ is_v2 = (ctrl1 | ctrl2) & CTRL_SM0_SUPPLY2; *sm0 = tps6586x_read(is_v2 ? SM0_VOLTAGE_V2 : SM0_VOLTAGE_V1); *sm1 = tps6586x_read(is_v2 ? SM1_VOLTAGE_V2 : SM1_VOLTAGE_V1); if (*sm0 == -1 || *sm1 == -1) return -1; return 0; }
int tps6586x_set_pwm_mode(int mask) { uchar val; int ret; assert(tps6586x_dev); ret = tps6586x_read(PFM_MODE); if (ret != -1) { val = (uchar)ret; val |= mask; ret = tps6586x_write(PFM_MODE, &val, 1); } if (ret == -1) debug("%s: Failed to read/write PWM mode reg\n", __func__); return ret; }
static int tps6586x_ldo_get_voltage(struct regulator_dev *rdev) { struct tps6586x_regulator *ri = rdev_get_drvdata(rdev); struct device *parent = to_tps6586x_dev(rdev); uint8_t val, mask; int ret; ret = tps6586x_read(parent, ri->volt_reg, &val); if (ret) return ret; mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift; val = (val & mask) >> ri->volt_shift; if (val >= ri->desc.n_voltages) BUG(); return ri->voltages[val] * 1000; }