From: Andi Shyti <andi.shyti@kernel.org>
To: Matti Vaittinen <mazziesaccount@gmail.com>
Cc: Andi Shyti <andi.shyti@kernel.org>,
Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>,
Jonathan Cameron <jic23@kernel.org>,
Lars-Peter Clausen <lars@metafoo.de>,
Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Zhigang Shi <Zhigang.Shi@liteon.com>,
Shreeya Patel <shreeya.patel@collabora.com>,
Paul Gazzillo <paul@pgazz.com>,
Dmitry Osipenko <dmitry.osipenko@collabora.com>,
linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 4/5] iio: light: ROHM BU27008 color sensor
Date: Wed, 26 Apr 2023 12:12:00 +0200 [thread overview]
Message-ID: <20230426101200.7czyp6nlg44tweyb@intel.intel> (raw)
In-Reply-To: <102a1605-d6dc-80c7-2075-212569c97042@gmail.com>
Hi Matti,
> Thanks for the review! It's nice to see you're still keeping an eye on ROHM
> / Kionix senor drivers ;)
yeah... this is fun... if I just had a bit more time :)
> > > +static int bu27008_read_one(struct bu27008_data *data, struct iio_dev *idev,
> > > + struct iio_chan_spec const *chan, int *val, int *val2)
> > > +{
> > > + int ret, int_time;
> > > +
> > > + ret = bu27008_chan_cfg(data, chan);
> > > + if (ret)
> > > + return ret;
> > > +
> > > + ret = bu27008_meas_set(data, BU27008_MEAS_EN);
> > > + if (ret)
> > > + return ret;
> > > +
> > > + int_time = bu27008_get_int_time(data);
> > > + if (int_time < 0)
> > > + int_time = 400000;
> > > +
> > > + msleep((int_time + 500) / 1000);
> >
> > What is this 500 doing? Is it making a real difference? it's
> > 0.5ms.
>
> Thanks for the question, having extra pairs of eyes helps spotting
> brainfarts :)
>
> The 500 here is half of the value of the divider - idea was to do rounding
> correctly upwards to prevent premature wake-up. Well, this is incorrect
> because we should always round up the sleep time, not just 'mathematically
> correctly' (Eg, not only upwards when value >= 0.5 but upwards always when
> the division is not even).
>
> After this being said, integration times for this device are full milli
> seconds so they can all be divided by 1000 uS.
>
> Nevertheless, it's good to note that the sensor is definitely not being
> clocked by the same clock as CPU and I assume the timing for it will be
> drifting quite a bit from the CPU clock. This means some sensors will for
> sure complete the measurement later than this wake-up. In order to tackle
> this we have the valid-bit polling in bu27008_chan_read_data(). So, at the
> end of the day, this rounding correction is lkely to be just some
> unnecessary noise.
I understand the logic of the waiting, but msleep is not the
right function as waiting with msleep is always very approximate,
that's why it's recommended to use it for a large waiting period,
where the error is smaller.
If int_time is 1ms, waiting 1.5 or 2 or 1, is the same thing,
most probably you will end up waiting more.
> > What's the minimum int_time? Can we set a minimum, as well, just
> > for the sake of the msleep?
>
> Can you please elaborate what you mean by this? The minimum integration time
> for bu27008 is 55 mS and this is set in the time tables for the gts-helpers.
> The bu27008_get_int_time() should never return valid time smaller than that.
Witha minimum i mean a minimum value for the msleep to start
working decently. E.g. what if int_time is lower than 1ms? Can we
have msleep(0)?
[...]
> > > +static int bu27008_chip_init(struct bu27008_data *data)
> > > +{
> > > + int ret;
> > > +
> > > + ret = regmap_update_bits(data->regmap, BU27008_REG_SYSTEM_CONTROL,
> > > + BU27008_MASK_SW_RESET, BU27008_MASK_SW_RESET);
> > > + if (ret)
> > > + return dev_err_probe(data->dev, ret, "Sensor reset failed\n");
> > > +
> > > + /*
> > > + * The data-sheet does not tell how long performing the IC reset takes.
> > > + * However, the data-sheet says the minimum time it takes the IC to be
> > > + * able to take inputs after power is applied, is 100 uS. I'd assume
> > > + * > 1 mS is enough.
> > > + */
> > > + msleep(1);
> >
> > please use usleep_range().
>
> I prefer to not require setting up hrtimers as we have no real requirements
> for the duration of this sleep. I know the msleep() is likely to exceed the
> 1 mS, potentially a lot if there is things to do - but we don't really care
> at this point. The main thing is to give the HW time to reset while allowing
> other things to be scheduled.
For the reason above, msleep(1) is quite a meaningless
instruction. If you need to wait around 1ms, then usleep_range is
the function to be used.
Refer, also, to the Documentation/timers/timers-howto.rst
> > > +
> > > + return ret;
> > > +}
[...]
> > > +static irqreturn_t bu27008_trigger_handler(int irq, void *p)
> >
> > Do we really need to be in atomic context here? Can this be
> > handled from a thread?
>
> As far as I understand, this is handled from a process context.
Sorry... I misread it... I thought you used request_irq() for
this and request_threaded_irq() for bu27008_irq_thread_handler().
Ignore :)
Andi
next prev parent reply other threads:[~2023-04-26 10:12 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-24 13:07 [PATCH v2 0/5] Support ROHM BU27008 RGB sensor Matti Vaittinen
2023-04-24 13:07 ` [PATCH v2 1/5] dt-bindings: iio: light: ROHM BU27008 Matti Vaittinen
2023-04-24 14:00 ` Krzysztof Kozlowski
2023-04-24 13:08 ` [PATCH v2 2/5] iio:trigger: Add simple trigger_validation helper Matti Vaittinen
2023-04-24 15:08 ` Andy Shevchenko
2023-04-25 5:17 ` Matti Vaittinen
2023-04-24 13:08 ` [PATCH v2 3/5] iio: kx022a: Use new iio_validate_own_trigger() Matti Vaittinen
2023-04-24 13:10 ` [PATCH v2 4/5] iio: light: ROHM BU27008 color sensor Matti Vaittinen
2023-04-24 15:22 ` Andy Shevchenko
2023-04-25 5:24 ` Matti Vaittinen
2023-04-25 13:45 ` Andy Shevchenko
2023-04-25 16:45 ` Andi Shyti
2023-04-26 5:32 ` Matti Vaittinen
2023-04-26 10:12 ` Andi Shyti [this message]
2023-04-26 10:19 ` Matti Vaittinen
2023-04-26 12:20 ` Andi Shyti
2023-04-24 13:10 ` [PATCH v2 5/5] MAINTAINERS: Add ROHM BU27008 Matti Vaittinen
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=20230426101200.7czyp6nlg44tweyb@intel.intel \
--to=andi.shyti@kernel.org \
--cc=Zhigang.Shi@liteon.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.osipenko@collabora.com \
--cc=jic23@kernel.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matti.vaittinen@fi.rohmeurope.com \
--cc=mazziesaccount@gmail.com \
--cc=paul@pgazz.com \
--cc=robh+dt@kernel.org \
--cc=shreeya.patel@collabora.com \
/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