Re: [RFC PATCH 4/5] iio: accel: Support Kionix/ROHM KX022A accelerometer

From: Jonathan Cameron
Date: Sun Oct 02 2022 - 07:11:48 EST


On Mon, 26 Sep 2022 05:02:44 +0000
"Vaittinen, Matti" <Matti.Vaittinen@xxxxxxxxxxxxxxxxx> wrote:

> On 9/24/22 18:17, Jonathan Cameron wrote:
> > On Fri, 23 Sep 2022 09:31:12 +0300
> > Matti Vaittinen <mazziesaccount@xxxxxxxxx> wrote:
> >
> >> On 9/22/22 20:03, Jonathan Cameron wrote:
> >>> On Wed, 21 Sep 2022 14:45:35 +0300
> >>> Matti Vaittinen <mazziesaccount@xxxxxxxxx> wrote:
> >>>
> >>>> KX022A is a 3-axis Accelerometer from ROHM/Kionix. The senor features
> >>>> include variable ODRs, I2C and SPI control, FIFO/LIFO with watermark IRQ,
> >>>> tap/motion detection, wake-up & back-to-sleep events, four acceleration
> >>>> ranges (2, 4, 8 and 16g) and probably some other cool fatures.
> >>>>
> >>>> Add support for the basic accelerometer features such as getting the
> >>>> acceleration data via IIO. (raw reads, triggered buffer [data-ready] or
> >>>> using the WMI IRQ).
> >>>>
> >>>> Important things to be added include the double-tap, motion
> >>>> detection and wake-up as well as the runtime power management.
> >>>>
> >>>> NOTE: Filling-up the hardware FIFO should be avoided. During my testing
> >>>> I noticed that filling up the hardware FIFO might mess-up the sample
> >>>> count. My sensor ended up in a state where amount of data in FIFO was
> >>>> reported to be 0xff bytes, which equals to 42,5 samples. Specification
> >>>> says the FIFO can hold maximum of 41 samples in HiRes mode. Also, at
> >>>> least once the FIFO was stuck in a state where reading data from
> >>>> hwardware FIFO did not decrease the amount of data reported to be in the
> >>> spell check this.
> >>>
> >>>> FIFO - eg. FIFO was "stuck". The code has now an error count and 10
> >>>> reads with invalid FIFO data count will cause the fifo contents to be
> >>>> dropped.
> >>> Ouch - that's nasty.
> >>
> >> Indeed it is. As this commit states, this is pretty initial support for
> >> the accelerometer. I want to enable people to do basic experimenting and
> >> also use the component to some slow ODR solutions. Besides, having even
> >> a basic support in-tree enable people to add further improvements :) So,
> >> I am hoping / expecting to see improvements added also by other people
> >> using this. I think that after this initial support many people still
> >> _need_ for example the runtime PM. Maybe we will also end up with some
> >> nicer solution to the FIFO issues.
> >
> > My initial gut feeling is that, if that fifo issue doesn't have a clean
> > solution, we don't don't support the fifo (by default anyway -
> > could have a module parameter or something to turn it on). Late handling
> > of interrupts is something that can happen for lots of reasons. It should
> > never be fatal!
>
> Tell me about it... More than 10-years ago I "inherited" maintenance of
> a timing code which was built on periodic 10msec IRQ which incremented a
> counter. (And after that there were many new generations of Linux based
> devices with various "rt"-requirements). Missing an IRQ was fatal as
> there were no hardware where we could read the correct timestamp and
> other units in the system were no longer in sync if the counter was
> wrong. Only recovery was complete system restart for all units - which
> in that use case was really bad. I learned to absolutely hate the serial
> prints over slow UART - and I learned to love irqsoff tracer. I don't
> work for that company anymore and I believe the product has already
> retired. Yet, I still get *shrugs* when I see hard time limits for
> serving IRQs on Linux. (Other than that I kind of like pondering the
> rt-challenges).
>
> Anyways, I don't see a real risk for example when using the ODRs < 2 Hz
> and setting the watermark to somewhere near 20 samples.
>
> It's really unfortunate the HW has these "hickups" - but I think it is
> still perfectly usable for many cases - we just really need to document
> the corner cases somewhere.

I'd rather we gated it - so by default the fifo mode isn't there and
people who are really confident they want it set a module parameter or
similar. Cuts down on the bug reports.

>
> > Simple first. Different matter if you add the other triggers later in
> > the same patch series, but history says half the interesting features
> > we plan to add never get added.
>
> ack.
>
> >>> Must either handle both pins or at least know if it is irq2 and
> >>> treat that as no irq for now.
> >>
> >> I don't want to try supporting both pins for now. It makes this somewhat
> >> more complex - especially if we want to support using two IRQs. That
> >> will require some thorough thinking which I don't have time to do right
> >> now :(
> >>
> >> I can add the irq-names to the bindings and add check to the probe so
> >> that if the irq2 is used we error out with nice 'not supported' message.
> >>
> >
> > A slightly nicer thing to do is support one irq, but let it be either irq1 or
> > irq2. If both are supplied just ignore the second one. People have
> > an 'amusing' habit of only wiring up irq2 on boards.
> >
>
> Ok. It shouldn't be such a big change for the code. I'll see what it
> will look like.
>
> >>>> +
> >>>> +static int kx022a_chip_init(struct kx022a_data *data)
> >>>> +{
> >>>> + int ret, dummy;
> >>>> +
> >>>> + /*
> >>>> + * Disable IRQs because if the IRQs are left on (for example by
> >>>> + * a shutdown which did not deactivate the accelerometer) we do
> >>>> + * most probably end up flooding the system with unhandled IRQs
> >>>> + * and get the line disabled from SOC side.
> >>>> + */
> >>>> + ret = regmap_write(data->regmap, KX022A_REG_INC4, 0);
> >>>
> >>> Unusual to do this rather than a reset. Quick look suggests there is
> >>> a suitable software reset (CNTL2)
> >>
> >> Same thing was just told me by a colleague of mine yesterday. Reset
> >> simplifies this quite a bit. (I just wonder if we can trust the reset
> >> always initializes the IC to same defaults or if there may be OTP
> >> differencies. I am new to these sensors).
> >>
> >
> > I really hope we can rely on any documented reset values!
>
> That is a sane assumption to do - but in my experience we don't live in
> a sane world ;) I've seen way too many cases where the defaults are
> changed for ICs for example by changing OTP. And sometimes the OTP
> change has not been visible to the drivers from any revision registers
> or such.
>
> I'm not talking about Kionix sensors though as I've never worked with
> Kionix sensors before - so let's just try out the reset and fix things
> if problems emerge. I am probably just a bit paranoid :)

Entirely reasonable!

Jonathan

>
> Thanks for all the help!
>
> Yours,
> -- Matti
>