From: Hector Palacios <hector.palacios@digi.com>
To: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Cc: "linux-iio@vger.kernel.org" <linux-iio@vger.kernel.org>,
"marex@denx.de" <marex@denx.de>,
"lars@metafoo.de" <lars@metafoo.de>,
"fabio.estevam@freescale.com" <fabio.estevam@freescale.com>
Subject: Re: [PATCH RFC] iio: mxs-lradc: add scaling to enable divide_by_two operation
Date: Wed, 3 Jul 2013 12:39:44 +0200 [thread overview]
Message-ID: <51D3FF70.9080303@digi.com> (raw)
In-Reply-To: <51D3FC22.1040209@free-electrons.com>
Dear Alexandre,
On 07/03/2013 12:25 PM, Alexandre Belloni wrote:
> Dear Hector,
>
> On 03/07/2013 12:06, Hector Palacios wrote:
>> Most LRADC channels have an optional divisor by two which allows
>> a maximum input voltage of VDDIO - 50mV. This patch adds the scaling
>> info flag to these channels (all except 7 -VBATT-, 10 -VDDIO- and
>> 15 -VDD5V-) to allow enabled divide_by_two read operation.
>>
>> Reference: http://www.spinics.net/lists/linux-iio/msg08876.html
>> Signed-off-by: Hector Palacios <hector.palacios@digi.com>
>> ---
>> drivers/staging/iio/adc/mxs-lradc.c | 52 +++++++++++++++++++++++--------------
>> 1 file changed, 33 insertions(+), 19 deletions(-)
>>
>> diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c
>> index 51f781f..4363bb6 100644
>> --- a/drivers/staging/iio/adc/mxs-lradc.c
>> +++ b/drivers/staging/iio/adc/mxs-lradc.c
>> @@ -197,6 +197,7 @@ struct mxs_lradc {
>> #define LRADC_CTRL1_LRADC_IRQ_OFFSET 0
>>
>> #define LRADC_CTRL2 0x20
>> +#define LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET 24
>> #define LRADC_CTRL2_TEMPSENSE_PWD (1 << 15)
>>
>> #define LRADC_STATUS 0x40
>> @@ -234,7 +235,7 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
>> struct mxs_lradc *lradc = iio_priv(iio_dev);
>> int ret;
>>
>> - if (m != IIO_CHAN_INFO_RAW)
>> + if (m != IIO_CHAN_INFO_RAW && m != IIO_CHAN_INFO_SCALE)
>> return -EINVAL;
>>
>> /* Check for invalid channel */
>> @@ -262,6 +263,11 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
>> lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
>> writel(0xff, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR);
>>
>> + /* Enable DIVIDE_BY_TWO on channel 0 if reading scaled value */
>> + if (IIO_CHAN_INFO_SCALE == m)
>> + writel(1 << LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET,
>> + lradc->base + LRADC_CTRL2 + STMP_OFFSET_REG_SET);
>> +
>> /* Clean the slot's previous content, then set new one. */
>> writel(LRADC_CTRL4_LRADCSELECT_MASK(0),
>> lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR);
>> @@ -286,6 +292,10 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
>> ret = IIO_VAL_INT;
>>
>> err:
>> + /* Disable DIVIDE_BY_TWO on channel 0 if reading scaled value */
>> + if (IIO_CHAN_INFO_SCALE == m)
>> + writel(1 << LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET,
>> + lradc->base + LRADC_CTRL2 + STMP_OFFSET_REG_CLR);
>> writel(LRADC_CTRL1_LRADC_IRQ_EN(0),
>> lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR);
>>
>> @@ -806,11 +816,11 @@ static const struct iio_buffer_setup_ops mxs_lradc_buffer_ops = {
>> * Driver initialization
>> */
>>
>> -#define MXS_ADC_CHAN(idx, chan_type) { \
>> +#define MXS_ADC_CHAN(idx, chan_type, info) { \
>> .type = (chan_type), \
>> .indexed = 1, \
>> .scan_index = (idx), \
>> - .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT, \
>> + .info_mask = (info), \
>> .channel = (idx), \
>> .scan_type = { \
>> .sign = 'u', \
>> @@ -819,23 +829,27 @@ static const struct iio_buffer_setup_ops mxs_lradc_buffer_ops = {
>> }, \
>> }
>>
>> +#define RAW IIO_CHAN_INFO_RAW_SEPARATE_BIT
>> +#define RAW_SCALED (IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
>> + IIO_CHAN_INFO_SCALE_SEPARATE_BIT)
>> +
>> static const struct iio_chan_spec mxs_lradc_chan_spec[] = {
>> - MXS_ADC_CHAN(0, IIO_VOLTAGE),
>> - MXS_ADC_CHAN(1, IIO_VOLTAGE),
>> - MXS_ADC_CHAN(2, IIO_VOLTAGE),
>> - MXS_ADC_CHAN(3, IIO_VOLTAGE),
>> - MXS_ADC_CHAN(4, IIO_VOLTAGE),
>> - MXS_ADC_CHAN(5, IIO_VOLTAGE),
>> - MXS_ADC_CHAN(6, IIO_VOLTAGE),
>> - MXS_ADC_CHAN(7, IIO_VOLTAGE), /* VBATT */
>> - MXS_ADC_CHAN(8, IIO_TEMP), /* Temp sense 0 */
>> - MXS_ADC_CHAN(9, IIO_TEMP), /* Temp sense 1 */
>> - MXS_ADC_CHAN(10, IIO_VOLTAGE), /* VDDIO */
>> - MXS_ADC_CHAN(11, IIO_VOLTAGE), /* VTH */
>> - MXS_ADC_CHAN(12, IIO_VOLTAGE), /* VDDA */
>> - MXS_ADC_CHAN(13, IIO_VOLTAGE), /* VDDD */
>> - MXS_ADC_CHAN(14, IIO_VOLTAGE), /* VBG */
>> - MXS_ADC_CHAN(15, IIO_VOLTAGE), /* VDD5V */
>> + MXS_ADC_CHAN(0, IIO_VOLTAGE, RAW_SCALED),
>> + MXS_ADC_CHAN(1, IIO_VOLTAGE, RAW_SCALED),
>> + MXS_ADC_CHAN(2, IIO_VOLTAGE, RAW_SCALED),
>> + MXS_ADC_CHAN(3, IIO_VOLTAGE, RAW_SCALED),
>> + MXS_ADC_CHAN(4, IIO_VOLTAGE, RAW_SCALED),
>> + MXS_ADC_CHAN(5, IIO_VOLTAGE, RAW_SCALED),
>> + MXS_ADC_CHAN(6, IIO_VOLTAGE, RAW_SCALED),
>> + MXS_ADC_CHAN(7, IIO_VOLTAGE, RAW), /* VBATT */
>> + MXS_ADC_CHAN(8, IIO_TEMP, RAW_SCALED), /* Temp sense 0 */
>> + MXS_ADC_CHAN(9, IIO_TEMP, RAW_SCALED), /* Temp sense 1 */
>> + MXS_ADC_CHAN(10, IIO_VOLTAGE, RAW), /* VDDIO */
>> + MXS_ADC_CHAN(11, IIO_VOLTAGE, RAW_SCALED), /* VTH */
>> + MXS_ADC_CHAN(12, IIO_VOLTAGE, RAW_SCALED), /* VDDA */
>> + MXS_ADC_CHAN(13, IIO_VOLTAGE, RAW_SCALED), /* VDDD */
>> + MXS_ADC_CHAN(14, IIO_VOLTAGE, RAW_SCALED), /* VBG */
>> + MXS_ADC_CHAN(15, IIO_VOLTAGE, RAW), /* VDD5V */
>> };
>>
>> static void mxs_lradc_hw_init(struct mxs_lradc *lradc)
>
>
> This is not how it is supposed to work. you should actually add
> IIO_CHAN_INFO_SCALE_SEPARATE_BIT to all channels .info_mask_separate.
>
> Then, you will get two files: in_voltageX_raw and in_voltageX_scale.
> Userland should calculate in_voltageX_raw * in_voltageX_scale. So when
> reading in_voltageX_scale, you actually want to read the current scale.
> To set the scale, you'll have to implement a write_raw.
>
> Also, it would probably be a good idea to expose a
> in_voltageX_scale_available file.
Thanks, I totally misunderstood it.
One question: to implement a divisor by two what should I write to the scale? A
decimal number like 0.5? And I guess I should return -EINVAL for any other value, right?
Best regards,
--
Hector Palacios
next prev parent reply other threads:[~2013-07-03 10:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-03 10:06 [PATCH RFC] iio: mxs-lradc: add scaling to enable divide_by_two operation Hector Palacios
2013-07-03 10:25 ` Alexandre Belloni
2013-07-03 10:39 ` Hector Palacios [this message]
2013-07-03 10:46 ` Lars-Peter Clausen
2013-07-03 16:39 ` Hector Palacios
2013-07-03 16:54 ` Alexandre Belloni
2013-07-03 17:01 ` Lars-Peter Clausen
2013-07-04 8:58 ` Hector Palacios
2013-07-04 9:10 ` Lars-Peter Clausen
2013-07-04 9:17 ` Alexandre Belloni
2013-07-04 14:50 ` Hector Palacios
2013-07-03 11:25 ` Marek Vasut
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=51D3FF70.9080303@digi.com \
--to=hector.palacios@digi.com \
--cc=alexandre.belloni@free-electrons.com \
--cc=fabio.estevam@freescale.com \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=marex@denx.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox