static int pm800_get_voltage(struct regulator_dev *rdev) { struct pm800_regulator_info *info = rdev_get_drvdata(rdev); struct pm800_regulator_volt_range *range; int i, val, max_val, volt = -EINVAL; if (info->volt == NULL) return -EINVAL; val = regulator_get_voltage_sel_regmap(rdev); if (val < 0) return val; if (info->desc.id == PM800_ID_VOUTSW) return 0; /* get the voltage via the register value */ for (i = 0; i < info->ranges; i++) { range = &info->volt[i]; max_val = (range->max_uv - range->min_uv) / range->step_uv + range->min_val; if (val >= range->min_val && val <= max_val) { volt = (val - range->min_val) * range->step_uv + range->min_uv; break; } } return volt; }
static int max77650_regulator_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel) { struct max77650_regulator_desc *rdesc = rdev_get_drvdata(rdev); int rv = 0, curr, diff; bool ascending; /* * If the regulator is disabled, we can program the desired * voltage right away. */ if (!max77650_regulator_is_enabled(rdev)) { if (rdesc == &max77651_SBB1_desc) return regulator_set_voltage_sel_pickable_regmap(rdev, sel); else return regulator_set_voltage_sel_regmap(rdev, sel); } /* * Otherwise we need to manually ramp the output voltage up/down * one step at a time. */ if (rdesc == &max77651_SBB1_desc) curr = regulator_get_voltage_sel_pickable_regmap(rdev); else curr = regulator_get_voltage_sel_regmap(rdev); if (curr < 0) return curr; diff = curr - sel; if (diff == 0) return 0; /* Already there. */ else if (diff > 0) ascending = false; else ascending = true; /* * Make sure we'll get to the right voltage and break the loop even if * the selector equals 0. */ for (ascending ? curr++ : curr--;; ascending ? curr++ : curr--) { if (rdesc == &max77651_SBB1_desc) rv = regulator_set_voltage_sel_pickable_regmap(rdev, curr); else rv = regulator_set_voltage_sel_regmap(rdev, curr); if (rv) return rv; if (curr == sel) break; } return 0; }
static int rc5t583_regulator_enable_time(struct regulator_dev *rdev) { struct rc5t583_regulator *reg = rdev_get_drvdata(rdev); int vsel = regulator_get_voltage_sel_regmap(rdev); int curr_uV = regulator_list_voltage_linear(rdev, vsel); return DIV_ROUND_UP(curr_uV, reg->reg_info->enable_uv_per_us); }
static int anatop_regmap_get_voltage_sel(struct regulator_dev *reg) { struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); if (!anatop_reg->control_reg) return -ENOTSUPP; return regulator_get_voltage_sel_regmap(reg); }
static int tps65023_dcdc_get_voltage_sel(struct regulator_dev *dev) { struct tps_pmic *tps = rdev_get_drvdata(dev); int dcdc = rdev_get_id(dev); if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3) return -EINVAL; if (dcdc != tps->core_regulator) return 0; return regulator_get_voltage_sel_regmap(dev); }
static int arizona_ldo1_hc_get_voltage_sel(struct regulator_dev *rdev) { struct regmap *regmap = rdev_get_regmap(rdev); unsigned int val; int ret; ret = regmap_read(regmap, ARIZONA_LDO1_CONTROL_2, &val); if (ret != 0) return ret; if (val & ARIZONA_LDO1_HI_PWR) return rdev->desc->n_voltages - 1; return regulator_get_voltage_sel_regmap(rdev); }
static int pm800_get_voltage(struct regulator_dev *rdev) { struct pm800_regulator_info *info = rdev_get_drvdata(rdev); int sel, ret; if (!info) return -EINVAL; if (info->desc.id == PM800_ID_VOUTSW) return 0; sel = regulator_get_voltage_sel_regmap(rdev); if (sel < 0) return sel; ret = rdev->desc->ops->list_voltage(rdev, sel); return ret; }