Linux IIO development
 help / color / mirror / Atom feed
From: Michael Hennerich <michael.hennerich@analog.com>
To: Jonathan Cameron <jic23@cam.ac.uk>
Cc: "linux-iio@vger.kernel.org" <linux-iio@vger.kernel.org>,
	"device-drivers-devel@blackfin.uclinux.org"
	<device-drivers-devel@blackfin.uclinux.org>,
	Drivers <Drivers@analog.com>
Subject: Re: [PATCH] iio: industrialio-core: iio_write_channel_info accept IIO_VAL_INT_PLUS_NANO
Date: Tue, 7 Jun 2011 15:06:52 +0200	[thread overview]
Message-ID: <4DEE226C.1020208@analog.com> (raw)
In-Reply-To: <4DEE21F7.6010202@cam.ac.uk>

On 06/07/2011 03:04 PM, Jonathan Cameron wrote:
> On 06/07/11 12:21, michael.hennerich@analog.com wrote:
>> From: Michael Hennerich<michael.hennerich@analog.com>
>>
>> Allow iio_write_channel_info() to accept IIO_VAL_INT_PLUS_NANO
> Hmm. I wonder if this is the right way around to do it.  This puts a hard
> requirement on the number of digits being what the driver expects.
>

Well - this requirement was there before - it was just limited to 6 digits.
Extra digits were simply cut off.
> Alternative would be an optional callback (not needed if everything is int_plus_micro)
> that allows the driver to be queried for what it wants and then reads data under
> the assumption that is what it has.

Ideally write_raw would take an additional argument. Just like read_raw 
returns what it has!


> Which do people think would work better?
>
> The approach here has the flaw that if someone writes a 9 decimal digit value
> to something expect 6 decimal digits the core will pass it on whereas it should
> have ignored the last 3 digits.

I don't think it's getting a big problem.
The driver itself knows the format what he expects.
If someone writes more digits than allowed it's simply not a match or fault.

In order to avoid faults - we could also say 6-8 digits are treated as 
mirco while 9 and more are treated as nano.

      switch (fract_digits) {
      case 6..8: /* IIO_VAL_INT_PLUS_MICRO */
              fract_mult = 100000;
              break;
      case 9..12: /* IIO_VAL_INT_PLUS_NANO */
              fract_mult = 100000000;
              break;
      default:
              return -EINVAL;
      }

>> Signed-off-by: Michael Hennerich<michael.hennerich@analog.com>
>> ---
>>   drivers/staging/iio/industrialio-core.c |   27 +++++++++++++++++++++------
>>   1 files changed, 21 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/staging/iio/industrialio-core.c b/drivers/staging/iio/industrialio-core.c
>> index e5a7663..74158c1 100644
>> --- a/drivers/staging/iio/industrialio-core.c
>> +++ b/drivers/staging/iio/industrialio-core.c
>> @@ -412,25 +412,40 @@ static ssize_t iio_write_channel_info(struct device *dev,
>>   {
>>        struct iio_dev *indio_dev = dev_get_drvdata(dev);
>>        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
>> -     int ret, integer = 0, micro = 0, micro_mult = 100000;
>> +     int ret, fract_digits, integer = 0, fract = 0, fract_mult;
>>        bool integer_part = true, negative = false;
>>
>>        /* Assumes decimal - precision based on number of digits */
>>        if (!indio_dev->info->write_raw)
>>                return -EINVAL;
>> +
>> +     fract_digits = strnchr(buf, len, '\n') - strnchr(buf, len, '.') - 1;
>> +
>> +     switch (fract_digits) {
>> +     case 6: /* IIO_VAL_INT_PLUS_MICRO */
>> +             fract_mult = 100000;
>> +             break;
>> +     case 9: /* IIO_VAL_INT_PLUS_NANO */
>> +             fract_mult = 100000000;
>> +             break;
>> +     default:
>> +             return -EINVAL;
>> +     }
>> +
>>        if (buf[0] == '-') {
>>                negative = true;
>>                buf++;
>>        }
>> +
>>        while (*buf) {
>>                if ('0'<= *buf&&  *buf<= '9') {
>>                        if (integer_part)
>>                                integer = integer*10 + *buf - '0';
>>                        else {
>> -                             micro += micro_mult*(*buf - '0');
>> -                             if (micro_mult == 1)
>> +                             fract += fract_mult*(*buf - '0');
>> +                             if (fract_mult == 1)
>>                                        break;
>> -                             micro_mult /= 10;
>> +                             fract_mult /= 10;
>>                        }
>>                } else if (*buf == '\n') {
>>                        if (*(buf + 1) == '\0')
>> @@ -448,11 +463,11 @@ static ssize_t iio_write_channel_info(struct device *dev,
>>                if (integer)
>>                        integer = -integer;
>>                else
>> -                     micro = -micro;
>> +                     fract = -fract;
>>        }
>>
>>        ret = indio_dev->info->write_raw(indio_dev, this_attr->c,
>> -                                      integer, micro, this_attr->address);
>> +                                      integer, fract, this_attr->address);
>>        if (ret)
>>                return ret;
>>
>


-- 
Greetings,
Michael

--
Analog Devices GmbH      Wilhelm-Wagenfeld-Str. 6      80807 Muenchen
Sitz der Gesellschaft: Muenchen; Registergericht: Muenchen HRB 40368;
Geschaeftsfuehrer:Dr.Carsten Suckrow, Thomas Wessel, William A. Martin,
Margaret Seif

  reply	other threads:[~2011-06-07 13:06 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-07 11:21 [PATCH] iio: industrialio-core: iio_write_channel_info accept IIO_VAL_INT_PLUS_NANO michael.hennerich
2011-06-07 13:04 ` Jonathan Cameron
2011-06-07 13:06   ` Michael Hennerich [this message]
2011-06-07 13:39     ` Jonathan Cameron
  -- strict thread matches above, loose matches on Subject: below --
2011-06-07 14:57 michael.hennerich
2011-06-07 15:24 ` 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=4DEE226C.1020208@analog.com \
    --to=michael.hennerich@analog.com \
    --cc=Drivers@analog.com \
    --cc=device-drivers-devel@blackfin.uclinux.org \
    --cc=jic23@cam.ac.uk \
    --cc=linux-iio@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox