From: Marcus Folkesson Date: Mon, 28 Apr 2025 06:54:13 +0000 (+0200) Subject: iio: adc: mcp3911: add reset management X-Git-Tag: v6.16-rc1~30^2~4^2~35 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f45a27b990a14c30e4edea7f3a427b03785b22c3;p=thirdparty%2Fkernel%2Fstable.git iio: adc: mcp3911: add reset management Add support for optional HW reset. If specified, a reset will be asserted during driver probe. Co-developed-by: Lukas Rauber Signed-off-by: Lukas Rauber Signed-off-by: Marcus Folkesson Reviewed-by: Andy Shevchenko Link: https://patch.msgid.link/20250428-mcp3911-fixes-v2-3-406e39330c3d@gmail.com Signed-off-by: Jonathan Cameron --- diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c index 622d42550072e..a6f21791c6859 100644 --- a/drivers/iio/adc/mcp3911.c +++ b/drivers/iio/adc/mcp3911.c @@ -10,7 +10,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -706,6 +708,7 @@ static const struct iio_trigger_ops mcp3911_trigger_ops = { static int mcp3911_probe(struct spi_device *spi) { struct device *dev = &spi->dev; + struct gpio_desc *gpio_reset; struct iio_dev *indio_dev; struct mcp3911 *adc; bool external_vref; @@ -750,6 +753,22 @@ static int mcp3911_probe(struct spi_device *spi) } dev_dbg(dev, "use device address %i\n", adc->dev_addr); + gpio_reset = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(gpio_reset)) + return dev_err_probe(dev, PTR_ERR(gpio_reset), + "Cannot get reset GPIO\n"); + + if (gpio_reset) { + gpiod_set_value_cansleep(gpio_reset, 0); + + /* + * Settling time after Hard Reset Mode (determined experimentally): + * 330 micro-seconds are too few; 470 micro-seconds are sufficient. + * Just in case, we add some safety factor... + */ + fsleep(600); + } + ret = adc->chip->config(adc, external_vref); if (ret) return ret;