iio: adc: ad7768-1: set MOSI idle state to prevent accidental reset

[ Upstream commit 2416cec859299be04d021b4cf98eff814f345af7 ]

Datasheet recommends Setting the MOSI idle state to high in order to
prevent accidental reset of the device when SCLK is free running.
This happens when the controller clocks out a 1 followed by 63 zeros
while the CS is held low.

Check if SPI controller supports SPI_MOSI_IDLE_HIGH flag and set it.

Fixes: a5f8c7da3d ("iio: adc: Add AD7768-1 ADC basic support")
Signed-off-by: Jonathan Santos <Jonathan.Santos@analog.com>
Reviewed-by: Marcelo Schmitt <marcelo.schmitt@analog.com>
Link: https://patch.msgid.link/c2a2b0f3d54829079763a5511359a1fa80516cfb.1741268122.git.Jonathan.Santos@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Jonathan Santos
2025-03-06 18:00:43 -03:00
committed by Greg Kroah-Hartman
parent dd63910063
commit 967570b528
+15
View File
@@ -574,6 +574,21 @@ static int ad7768_probe(struct spi_device *spi)
return -ENOMEM;
st = iio_priv(indio_dev);
/*
* Datasheet recommends SDI line to be kept high when data is not being
* clocked out of the controller and the spi clock is free running,
* to prevent accidental reset.
* Since many controllers do not support the SPI_MOSI_IDLE_HIGH flag
* yet, only request the MOSI idle state to enable if the controller
* supports it.
*/
if (spi->controller->mode_bits & SPI_MOSI_IDLE_HIGH) {
spi->mode |= SPI_MOSI_IDLE_HIGH;
ret = spi_setup(spi);
if (ret < 0)
return ret;
}
st->spi = spi;
st->vref = devm_regulator_get(&spi->dev, "vref");