.n_no_ranges = ARRAY_SIZE(as3722_cacheable_ranges),
};
+static const struct regmap_range vsel_sd_range =
+ regmap_reg_range(AS3722_SD0_VOLTAGE_REG, AS3722_SD6_VOLTAGE_REG);
+
+static const struct regmap_range vsel_ldo_range =
+ regmap_reg_range(AS3722_LDO0_VOLTAGE_REG, AS3722_LDO11_VOLTAGE_REG);
+
+
+bool is_volatile_as3722_register(struct device *dev, unsigned int reg)
+{
+ if (regmap_reg_in_range(reg, &vsel_sd_range) ||
+ regmap_reg_in_range(reg, &vsel_ldo_range)) {
+ struct as3722 *as3722 = dev_get_drvdata(dev);
+ return test_bit(reg, as3722->volatile_vsel_registers);
+ }
+
+ if (regmap_reg_in_ranges(reg, as3722_volatile_table.no_ranges,
+ as3722_volatile_table.n_no_ranges))
+ return false;
+
+ return true;
+}
+
+int as3722_vsel_volatile_set(struct device *dev, unsigned int reg,
+ bool is_volatile)
+{
+ if (regmap_reg_in_range(reg, &vsel_sd_range) ||
+ regmap_reg_in_range(reg, &vsel_ldo_range)) {
+ struct as3722 *as3722 = dev_get_drvdata(dev);
+ if (is_volatile)
+ set_bit(reg, as3722->volatile_vsel_registers);
+ else
+ clear_bit(reg, as3722->volatile_vsel_registers);
+ return 0;
+ }
+
+ return -EINVAL;
+}
+
static struct regmap_config as3722_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
.cache_type = REGCACHE_RBTREE,
.rd_table = &as3722_readable_table,
.wr_table = &as3722_writable_table,
- .volatile_table = &as3722_volatile_table,
+ .volatile_reg = is_volatile_as3722_register,
.lock = as3722_regmap_config_lock,
.unlock = as3722_regmap_config_unlock,
+ .reg_volatile_set = as3722_vsel_volatile_set,
};
static int as3722_i2c_of_probe(struct i2c_client *i2c,
struct as3722_regulator_config_data {
struct regulator_init_data *reg_init;
bool enable_tracking;
+ bool volatile_vsel;
int ext_control;
};
}
reg_config->enable_tracking =
of_property_read_bool(reg_node, "ams,enable-tracking");
+ reg_config->volatile_vsel =
+ of_property_read_bool(reg_node, "ams,volatile-vsel");
}
return 0;
reg_config->reg_init = rpdata->reg_init;
reg_config->ext_control = rpdata->ext_control;
reg_config->enable_tracking = rpdata->enable_tracking;
+ reg_config->volatile_vsel = rpdata->volatile_vsel;
}
return 0;
}
as3722_regs->desc[id].uV_step = 10000;
as3722_regs->desc[id].linear_min_sel = 1;
as3722_regs->desc[id].enable_time = 275;
+ as3722_regs->desc[id].vsel_persist = true;
break;
case AS3722_REGULATOR_ID_SD2:
case AS3722_REGULATOR_ID_SD3:
as3722_sd2345_ranges;
as3722_regs->desc[id].n_linear_ranges =
ARRAY_SIZE(as3722_sd2345_ranges);
+ as3722_regs->desc[id].vsel_persist = true;
break;
default:
if (reg_config->ext_control)
as3722_regs->desc[id].ops = ops;
config.init_data = reg_config->reg_init;
config.of_node = as3722_regulator_matches[id].of_node;
+
+ if (reg_config->volatile_vsel) {
+ unsigned int bit = as3722_reg_lookup[id].vsel_reg;
+ __set_bit(bit, as3722->volatile_vsel_registers);
+ }
rdev = devm_regulator_register(&pdev->dev,
&as3722_regs->desc[id], &config);
if (IS_ERR(rdev)) {