Message ID | 20200415212257.161238-3-alexandre.belloni@bootlin.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iio: adc: ti-ads8344: improve the driver | expand |
On 4/15/20 11:22 PM, Alexandre Belloni wrote: > There is no need to keep tx_buf around, it is only used for the conversion. > > Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> > --- > drivers/iio/adc/ti-ads8344.c | 18 ++++++------------ > 1 file changed, 6 insertions(+), 12 deletions(-) > > diff --git a/drivers/iio/adc/ti-ads8344.c b/drivers/iio/adc/ti-ads8344.c > index 6da50ea35217..9b2d3a8ea6bd 100644 > --- a/drivers/iio/adc/ti-ads8344.c > +++ b/drivers/iio/adc/ti-ads8344.c > @@ -22,13 +22,7 @@ > struct ads8344 { > struct spi_device *spi; > struct regulator *reg; > - /* > - * Lock protecting access to adc->tx_buff and rx_buff, > - * especially from concurrent read on sysfs file. > - */ > - struct mutex lock; > - > - u8 tx_buf ____cacheline_aligned; > + struct mutex lock; /* protect from concurrent conversions */ > }; > > #define ADS8344_VOLTAGE_CHANNEL(chan, si) \ > @@ -77,13 +71,13 @@ static int ads8344_adc_conversion(struct ads8344 *adc, int channel, > int ret; > u8 buf[3]; spi_write() might use the buffer in a DMA transfer, so it can't be on the stack and needs to be in its own cacheline. > > - adc->tx_buf = ADS8344_START; > + buf[0] = ADS8344_START; > if (!differential) > - adc->tx_buf |= ADS8344_SINGLE_END; > - adc->tx_buf |= ADS8344_CHANNEL(channel); > - adc->tx_buf |= ADS8344_CLOCK_INTERNAL; > + buf[0] |= ADS8344_SINGLE_END; > + buf[0] |= ADS8344_CHANNEL(channel); > + buf[0] |= ADS8344_CLOCK_INTERNAL; > > - ret = spi_write(spi, &adc->tx_buf, 1); > + ret = spi_write(spi, buf, 1); > if (ret) > return ret; >
On Thu, Apr 16, 2020 at 4:08 AM Alexandre Belloni <alexandre.belloni@bootlin.com> wrote: > > There is no need to keep tx_buf around, it is only used for the conversion. > As Lars said. And some SPI controllers may want to DMA even one byte, so, NAK. > Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> > --- > drivers/iio/adc/ti-ads8344.c | 18 ++++++------------ > 1 file changed, 6 insertions(+), 12 deletions(-) > > diff --git a/drivers/iio/adc/ti-ads8344.c b/drivers/iio/adc/ti-ads8344.c > index 6da50ea35217..9b2d3a8ea6bd 100644 > --- a/drivers/iio/adc/ti-ads8344.c > +++ b/drivers/iio/adc/ti-ads8344.c > @@ -22,13 +22,7 @@ > struct ads8344 { > struct spi_device *spi; > struct regulator *reg; > - /* > - * Lock protecting access to adc->tx_buff and rx_buff, > - * especially from concurrent read on sysfs file. > - */ > - struct mutex lock; > - > - u8 tx_buf ____cacheline_aligned; > + struct mutex lock; /* protect from concurrent conversions */ > }; > > #define ADS8344_VOLTAGE_CHANNEL(chan, si) \ > @@ -77,13 +71,13 @@ static int ads8344_adc_conversion(struct ads8344 *adc, int channel, > int ret; > u8 buf[3]; > > - adc->tx_buf = ADS8344_START; > + buf[0] = ADS8344_START; > if (!differential) > - adc->tx_buf |= ADS8344_SINGLE_END; > - adc->tx_buf |= ADS8344_CHANNEL(channel); > - adc->tx_buf |= ADS8344_CLOCK_INTERNAL; > + buf[0] |= ADS8344_SINGLE_END; > + buf[0] |= ADS8344_CHANNEL(channel); > + buf[0] |= ADS8344_CLOCK_INTERNAL; > > - ret = spi_write(spi, &adc->tx_buf, 1); > + ret = spi_write(spi, buf, 1); > if (ret) > return ret; > > -- > 2.25.2 >
diff --git a/drivers/iio/adc/ti-ads8344.c b/drivers/iio/adc/ti-ads8344.c index 6da50ea35217..9b2d3a8ea6bd 100644 --- a/drivers/iio/adc/ti-ads8344.c +++ b/drivers/iio/adc/ti-ads8344.c @@ -22,13 +22,7 @@ struct ads8344 { struct spi_device *spi; struct regulator *reg; - /* - * Lock protecting access to adc->tx_buff and rx_buff, - * especially from concurrent read on sysfs file. - */ - struct mutex lock; - - u8 tx_buf ____cacheline_aligned; + struct mutex lock; /* protect from concurrent conversions */ }; #define ADS8344_VOLTAGE_CHANNEL(chan, si) \ @@ -77,13 +71,13 @@ static int ads8344_adc_conversion(struct ads8344 *adc, int channel, int ret; u8 buf[3]; - adc->tx_buf = ADS8344_START; + buf[0] = ADS8344_START; if (!differential) - adc->tx_buf |= ADS8344_SINGLE_END; - adc->tx_buf |= ADS8344_CHANNEL(channel); - adc->tx_buf |= ADS8344_CLOCK_INTERNAL; + buf[0] |= ADS8344_SINGLE_END; + buf[0] |= ADS8344_CHANNEL(channel); + buf[0] |= ADS8344_CLOCK_INTERNAL; - ret = spi_write(spi, &adc->tx_buf, 1); + ret = spi_write(spi, buf, 1); if (ret) return ret;
There is no need to keep tx_buf around, it is only used for the conversion. Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> --- drivers/iio/adc/ti-ads8344.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-)