@@ -73,6 +73,7 @@
#define ADMV1013_REG_ADDR_READ_MSK GENMASK(6, 1)
#define ADMV1013_REG_ADDR_WRITE_MSK GENMASK(22, 17)
#define ADMV1013_REG_DATA_MSK GENMASK(16, 1)
+#define ADMV1013_VCC_NUM_REGULATORS 10
enum {
ADMV1013_IQ_MODE,
@@ -96,6 +97,7 @@ struct admv1013_state {
/* Protect against concurrent accesses to the device and to data */
struct mutex lock;
struct regulator *reg;
+ struct regulator_bulk_data vcc_regs[ADMV1013_VCC_NUM_REGULATORS];
struct notifier_block nb;
unsigned int input_mode;
unsigned int quad_se_mode;
@@ -379,6 +381,11 @@ static const struct iio_info admv1013_info = {
.debugfs_reg_access = &admv1013_reg_access,
};
+static const char * const admv1013_reg_name[] = {
+ "vcc-drv", "vcc2-drv", "vcc-vva", "vcc-amp1", "vcc-amp2",
+ "vcc-env", "vcc-bg", "vcc-bg2", "vcc-mixer", "vcc-quad"
+};
+
static int admv1013_freq_change(struct notifier_block *nb, unsigned long action, void *data)
{
struct admv1013_state *st = container_of(nb, struct admv1013_state, nb);
@@ -495,6 +502,11 @@ static void admv1013_reg_disable(void *data)
regulator_disable(data);
}
+static void admv1013_vcc_reg_disable(void *data)
+{
+ regulator_bulk_disable(ADMV1013_VCC_NUM_REGULATORS, data);
+}
+
static void admv1013_powerdown(void *data)
{
unsigned int enable_reg, enable_reg_msk;
@@ -520,6 +532,7 @@ static void admv1013_powerdown(void *data)
static int admv1013_properties_parse(struct admv1013_state *st)
{
int ret;
+ unsigned int i;
const char *str;
struct spi_device *spi = st->spi;
@@ -554,6 +567,17 @@ static int admv1013_properties_parse(struct admv1013_state *st)
return dev_err_probe(&spi->dev, PTR_ERR(st->reg),
"failed to get the common-mode voltage\n");
+ for (i = 0; i < ADMV1013_VCC_NUM_REGULATORS; ++i)
+ st->vcc_regs[i].supply = admv1013_reg_name[i];
+
+ ret = devm_regulator_bulk_get(&st->spi->dev,
+ ADMV1013_VCC_NUM_REGULATORS,
+ st->vcc_regs);
+ if (ret) {
+ dev_err(&spi->dev, "Failed to request VCC regulators");
+ return ret;
+ }
+
return 0;
}
@@ -591,6 +615,17 @@ static int admv1013_probe(struct spi_device *spi)
if (ret)
return ret;
+ ret = regulator_bulk_enable(ADMV1013_VCC_NUM_REGULATORS, st->vcc_regs);
+ if (ret) {
+ dev_err(&spi->dev, "Failed to enable regulators");
+ return ret;
+ }
+
+ ret = devm_add_action_or_reset(&spi->dev, admv1013_vcc_reg_disable,
+ st->vcc_regs);
+ if (ret)
+ return ret;
+
st->clkin = devm_clk_get_enabled(&spi->dev, "lo_in");
if (IS_ERR(st->clkin))
return dev_err_probe(&spi->dev, PTR_ERR(st->clkin),