The MCP4922 family of chips has a vdd power input, which we model in our device tree binding for it. The driver should get and enable the vdd regulator as is appropriate. Signed-off-by: Nicolas Frattaroli <frattaroli.nicolas@xxxxxxxxx> --- drivers/iio/dac/mcp4922.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/drivers/iio/dac/mcp4922.c b/drivers/iio/dac/mcp4922.c index da4327624d45..0b9458cbbcff 100644 --- a/drivers/iio/dac/mcp4922.c +++ b/drivers/iio/dac/mcp4922.c @@ -31,6 +31,7 @@ struct mcp4922_state { unsigned int value[MCP4922_NUM_CHANNELS]; unsigned int vref_mv; struct regulator *vref_reg; + struct regulator *vdd_reg; u8 mosi[2] __aligned(IIO_DMA_MINALIGN); }; @@ -148,10 +149,23 @@ static int mcp4922_probe(struct spi_device *spi) if (ret < 0) { dev_err(&spi->dev, "Failed to read vref regulator: %d\n", ret); - goto error_disable_reg; + goto error_disable_vref_reg; } state->vref_mv = ret / 1000; + state->vdd_reg = devm_regulator_get(&spi->dev, "vdd"); + if (IS_ERR(state->vdd_reg)) { + ret = dev_err_probe(&spi->dev, PTR_ERR(state->vdd_reg), + "vdd regulator not specified\n"); + goto error_disable_vref_reg; + } + ret = regulator_enable(state->vdd_reg); + if (ret) { + dev_err(&spi->dev, "Failed to enable vdd regulator: %d\n", + ret); + goto error_disable_vref_reg; + } + spi_set_drvdata(spi, indio_dev); id = spi_get_device_id(spi); indio_dev->info = &mcp4922_info; @@ -167,12 +181,13 @@ static int mcp4922_probe(struct spi_device *spi) if (ret) { dev_err(&spi->dev, "Failed to register iio device: %d\n", ret); - goto error_disable_reg; + goto error_disable_vdd_reg; } return 0; - -error_disable_reg: +error_disable_vdd_reg: + regulator_disable(state->vdd_reg); +error_disable_vref_reg: regulator_disable(state->vref_reg); return ret; @@ -185,6 +200,7 @@ static void mcp4922_remove(struct spi_device *spi) iio_device_unregister(indio_dev); state = iio_priv(indio_dev); + regulator_disable(state->vdd_reg); regulator_disable(state->vref_reg); } -- 2.40.0