On Sun, 2019-03-24 at 17:49 +0000, Jonathan Cameron wrote: > [External] > > > On Tue, 19 Mar 2019 11:53:06 +0200 > Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> wrote: > > > From: Lars-Peter Clausen <lars@xxxxxxxxxx> > > > > The prepare channel callback will be called before starting a > > conversion and > > can be used by the driver to configure the chip according to the > > selected > > channel. > > > > Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx> > > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> > > Hi Alexandru, > > Not without a user.... I.e. I want to see a driver using this before > I apply it. In of itself, it is fine but right now I can't answer the > 'why?' question! Ack. Will put this into a series that adds a user for this to make it clearer. At the moment I was just cherry-picking patches from our tree, sending bits that were easier to apply, and deferring bits that are more complicated to re-apply. Thanks Alex > > Jonathan > > > --- > > drivers/iio/adc/ad_sigma_delta.c | 5 +++++ > > include/linux/iio/adc/ad_sigma_delta.h | 13 +++++++++++++ > > 2 files changed, 18 insertions(+) > > > > diff --git a/drivers/iio/adc/ad_sigma_delta.c > > b/drivers/iio/adc/ad_sigma_delta.c > > index ff5f2da2e1b1..00808838edd8 100644 > > --- a/drivers/iio/adc/ad_sigma_delta.c > > +++ b/drivers/iio/adc/ad_sigma_delta.c > > @@ -285,6 +285,7 @@ int ad_sigma_delta_single_conversion(struct iio_dev > > *indio_dev, > > return -EBUSY; > > > > mutex_lock(&indio_dev->mlock); > > + ad_sigma_delta_prepare_channel(sigma_delta, chan); > > ad_sigma_delta_set_channel(sigma_delta, chan->address); > > > > spi_bus_lock(sigma_delta->spi->master); > > @@ -351,6 +352,10 @@ static int ad_sd_buffer_postenable(struct iio_dev > > *indio_dev) > > > > channel = find_first_bit(indio_dev->active_scan_mask, > > indio_dev->masklength); > > + ret = ad_sigma_delta_prepare_channel(sigma_delta, > > + &indio_dev->channels[channel]); > > + if (ret) > > + goto err_predisable; > > ret = ad_sigma_delta_set_channel(sigma_delta, > > indio_dev->channels[channel].address); > > if (ret) > > diff --git a/include/linux/iio/adc/ad_sigma_delta.h > > b/include/linux/iio/adc/ad_sigma_delta.h > > index 7e84351fa2c0..21ee12543bdd 100644 > > --- a/include/linux/iio/adc/ad_sigma_delta.h > > +++ b/include/linux/iio/adc/ad_sigma_delta.h > > @@ -31,6 +31,8 @@ struct iio_dev; > > > > /** > > * struct ad_sigma_delta_info - Sigma Delta driver specific callbacks > > and options > > + * @prepare_channel: Will be called to prepare and configure a > > channel, may be > > + * NULL. > > * @set_channel: Will be called to select the current channel, may be > > NULL. > > * @set_mode: Will be called to select the current mode, may be NULL. > > * @postprocess_sample: Is called for each sampled data word, can be > > used to > > @@ -43,6 +45,8 @@ struct iio_dev; > > * be used. > > */ > > struct ad_sigma_delta_info { > > + int (*prepare_channel)(struct ad_sigma_delta *, > > + const struct iio_chan_spec *); > > int (*set_channel)(struct ad_sigma_delta *, unsigned int > > channel); > > int (*set_mode)(struct ad_sigma_delta *, enum ad_sigma_delta_mode > > mode); > > int (*postprocess_sample)(struct ad_sigma_delta *, unsigned int > > raw_sample); > > @@ -81,6 +85,15 @@ struct ad_sigma_delta { > > uint8_t data[4] ____cacheline_aligned; > > }; > > > > +static inline int ad_sigma_delta_prepare_channel(struct ad_sigma_delta > > *sd, > > + const struct iio_chan_spec *chan) > > +{ > > + if (sd->info->prepare_channel) > > + return sd->info->prepare_channel(sd, chan); > > + > > + return 0; > > +} > > + > > static inline int ad_sigma_delta_set_channel(struct ad_sigma_delta > > *sd, > > unsigned int channel) > > { > >