From: jic23@kernel.org (Jonathan Cameron)
To: linus-amlogic@lists.infradead.org
Subject: [PATCH 2/2] iio: adc: meson-saradc: use the address attribute from iio_chan_spec
Date: Sat, 29 Sep 2018 12:51:32 +0100 [thread overview]
Message-ID: <20180929125132.3f7e83e9@archlinux> (raw)
In-Reply-To: <20180924221326.2871-3-martin.blumenstingl@googlemail.com>
On Tue, 25 Sep 2018 00:13:26 +0200
Martin Blumenstingl <martin.blumenstingl@googlemail.com> wrote:
> Until now the "channel" number is identical to how the channel is
> identified inside the (FIFO) registers. In our case we have eight
> channels and the hardware also has eight inputs.
>
> However, there are two special inputs:
> - channel 6 can select between the SAR_ADC_CH6 pad and the chip's
> internal temperature sensor
> - channel 7 can select between SAR_ADC_CH7 and VSS, VDD / 4, VDD / 2,
> VDD * 3 / 4 and VDD.
>
> When programming the registers to read for example the temperature
> sensor we have to select FIFO channel 6, set the correct bit which muxes
> channel 6 to the temperature sensor and then start the ADC measurement
> for channel 6 as usual.
>
> When we add support for the temperature sensor the driver has to know
> about that it has to use FIFO channel 6 to measure using the chip's
> internal temperature sensor. However, in that case the iio_chan_spec
> channel will not be 6 because this is already used for the SAR_ADC_CH6
> pad input. Thus we use iio_chan_spec's address field to store the FIFO
> channel number for each channel.
>
> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Again, clearly 'correct' so applied to the togreg branch of iio.git
and pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
> ---
> drivers/iio/adc/meson_saradc.c | 29 +++++++++++++++--------------
> 1 file changed, 15 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c
> index 809d1230be34..028ccd218f82 100644
> --- a/drivers/iio/adc/meson_saradc.c
> +++ b/drivers/iio/adc/meson_saradc.c
> @@ -172,6 +172,7 @@
> .type = IIO_VOLTAGE, \
> .indexed = 1, \
> .channel = _chan, \
> + .address = _chan, \
> .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
> BIT(IIO_CHAN_INFO_AVERAGE_RAW), \
> .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
> @@ -323,10 +324,10 @@ static int meson_sar_adc_read_raw_sample(struct iio_dev *indio_dev,
>
> regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, ®val);
> fifo_chan = FIELD_GET(MESON_SAR_ADC_FIFO_RD_CHAN_ID_MASK, regval);
> - if (fifo_chan != chan->channel) {
> + if (fifo_chan != chan->address) {
> dev_err(&indio_dev->dev,
> - "ADC FIFO entry belongs to channel %d instead of %d\n",
> - fifo_chan, chan->channel);
> + "ADC FIFO entry belongs to channel %d instead of %lu\n",
> + fifo_chan, chan->address);
> return -EINVAL;
> }
>
> @@ -343,16 +344,16 @@ static void meson_sar_adc_set_averaging(struct iio_dev *indio_dev,
> enum meson_sar_adc_num_samples samples)
> {
> struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
> - int val, channel = chan->channel;
> + int val, address = chan->address;
>
> - val = samples << MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(channel);
> + val = samples << MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
> - MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(channel),
> + MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(address),
> val);
>
> - val = mode << MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(channel);
> + val = mode << MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
> - MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(channel), val);
> + MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(address), val);
> }
>
> static void meson_sar_adc_enable_channel(struct iio_dev *indio_dev,
> @@ -372,23 +373,23 @@ static void meson_sar_adc_enable_channel(struct iio_dev *indio_dev,
>
> /* map channel index 0 to the channel which we want to read */
> regval = FIELD_PREP(MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0),
> - chan->channel);
> + chan->address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_LIST,
> MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0), regval);
>
> regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
> - chan->channel);
> + chan->address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
> MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
> regval);
>
> regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
> - chan->channel);
> + chan->address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
> MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
> regval);
>
> - if (chan->channel == 6)
> + if (chan->address == 6)
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10,
> MESON_SAR_ADC_DELTA_10_TEMP_SEL, 0);
> }
> @@ -526,8 +527,8 @@ static int meson_sar_adc_get_sample(struct iio_dev *indio_dev,
>
> if (ret) {
> dev_warn(indio_dev->dev.parent,
> - "failed to read sample for channel %d: %d\n",
> - chan->channel, ret);
> + "failed to read sample for channel %lu: %d\n",
> + chan->address, ret);
> return ret;
> }
>
WARNING: multiple messages have this Message-ID (diff)
From: Jonathan Cameron <jic23@kernel.org>
To: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Cc: linux-amlogic@lists.infradead.org, linux-iio@vger.kernel.org,
knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net
Subject: Re: [PATCH 2/2] iio: adc: meson-saradc: use the address attribute from iio_chan_spec
Date: Sat, 29 Sep 2018 12:51:32 +0100 [thread overview]
Message-ID: <20180929125132.3f7e83e9@archlinux> (raw)
In-Reply-To: <20180924221326.2871-3-martin.blumenstingl@googlemail.com>
On Tue, 25 Sep 2018 00:13:26 +0200
Martin Blumenstingl <martin.blumenstingl@googlemail.com> wrote:
> Until now the "channel" number is identical to how the channel is
> identified inside the (FIFO) registers. In our case we have eight
> channels and the hardware also has eight inputs.
>
> However, there are two special inputs:
> - channel 6 can select between the SAR_ADC_CH6 pad and the chip's
> internal temperature sensor
> - channel 7 can select between SAR_ADC_CH7 and VSS, VDD / 4, VDD / 2,
> VDD * 3 / 4 and VDD.
>
> When programming the registers to read for example the temperature
> sensor we have to select FIFO channel 6, set the correct bit which muxes
> channel 6 to the temperature sensor and then start the ADC measurement
> for channel 6 as usual.
>
> When we add support for the temperature sensor the driver has to know
> about that it has to use FIFO channel 6 to measure using the chip's
> internal temperature sensor. However, in that case the iio_chan_spec
> channel will not be 6 because this is already used for the SAR_ADC_CH6
> pad input. Thus we use iio_chan_spec's address field to store the FIFO
> channel number for each channel.
>
> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Again, clearly 'correct' so applied to the togreg branch of iio.git
and pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
> ---
> drivers/iio/adc/meson_saradc.c | 29 +++++++++++++++--------------
> 1 file changed, 15 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c
> index 809d1230be34..028ccd218f82 100644
> --- a/drivers/iio/adc/meson_saradc.c
> +++ b/drivers/iio/adc/meson_saradc.c
> @@ -172,6 +172,7 @@
> .type = IIO_VOLTAGE, \
> .indexed = 1, \
> .channel = _chan, \
> + .address = _chan, \
> .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
> BIT(IIO_CHAN_INFO_AVERAGE_RAW), \
> .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
> @@ -323,10 +324,10 @@ static int meson_sar_adc_read_raw_sample(struct iio_dev *indio_dev,
>
> regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, ®val);
> fifo_chan = FIELD_GET(MESON_SAR_ADC_FIFO_RD_CHAN_ID_MASK, regval);
> - if (fifo_chan != chan->channel) {
> + if (fifo_chan != chan->address) {
> dev_err(&indio_dev->dev,
> - "ADC FIFO entry belongs to channel %d instead of %d\n",
> - fifo_chan, chan->channel);
> + "ADC FIFO entry belongs to channel %d instead of %lu\n",
> + fifo_chan, chan->address);
> return -EINVAL;
> }
>
> @@ -343,16 +344,16 @@ static void meson_sar_adc_set_averaging(struct iio_dev *indio_dev,
> enum meson_sar_adc_num_samples samples)
> {
> struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
> - int val, channel = chan->channel;
> + int val, address = chan->address;
>
> - val = samples << MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(channel);
> + val = samples << MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
> - MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(channel),
> + MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(address),
> val);
>
> - val = mode << MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(channel);
> + val = mode << MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
> - MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(channel), val);
> + MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(address), val);
> }
>
> static void meson_sar_adc_enable_channel(struct iio_dev *indio_dev,
> @@ -372,23 +373,23 @@ static void meson_sar_adc_enable_channel(struct iio_dev *indio_dev,
>
> /* map channel index 0 to the channel which we want to read */
> regval = FIELD_PREP(MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0),
> - chan->channel);
> + chan->address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_LIST,
> MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0), regval);
>
> regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
> - chan->channel);
> + chan->address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
> MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
> regval);
>
> regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
> - chan->channel);
> + chan->address);
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
> MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
> regval);
>
> - if (chan->channel == 6)
> + if (chan->address == 6)
> regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10,
> MESON_SAR_ADC_DELTA_10_TEMP_SEL, 0);
> }
> @@ -526,8 +527,8 @@ static int meson_sar_adc_get_sample(struct iio_dev *indio_dev,
>
> if (ret) {
> dev_warn(indio_dev->dev.parent,
> - "failed to read sample for channel %d: %d\n",
> - chan->channel, ret);
> + "failed to read sample for channel %lu: %d\n",
> + chan->address, ret);
> return ret;
> }
>
next prev parent reply other threads:[~2018-09-29 11:51 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-24 22:13 [PATCH 0/2] meson-saradc: preparations for temperature sensor support Martin Blumenstingl
2018-09-24 22:13 ` Martin Blumenstingl
2018-09-24 22:13 ` [PATCH 1/2] iio: adc: meson-saradc: do not use meson_sar_adc_iio_channels directly Martin Blumenstingl
2018-09-24 22:13 ` Martin Blumenstingl
2018-09-29 11:49 ` Jonathan Cameron
2018-09-29 11:49 ` Jonathan Cameron
2018-09-24 22:13 ` [PATCH 2/2] iio: adc: meson-saradc: use the address attribute from iio_chan_spec Martin Blumenstingl
2018-09-24 22:13 ` Martin Blumenstingl
2018-09-29 11:51 ` Jonathan Cameron [this message]
2018-09-29 11:51 ` Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180929125132.3f7e83e9@archlinux \
--to=jic23@kernel.org \
--cc=linus-amlogic@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.