From: Jonathan Cameron <jic23@kernel.org>
To: Matt Ranostay <mranostay@gmail.com>
Cc: "linux-iio@vger.kernel.org" <linux-iio@vger.kernel.org>,
Lars-Peter Clausen <lars@metafoo.de>,
Daniel Baluta <daniel.baluta@intel.com>,
Peter Meerwald <pmeerw@pmeerw.net>
Subject: Re: [RFC 0/2] iio: add support for LMP91000EVM potentiostat board
Date: Sun, 24 Jul 2016 13:25:26 +0100 [thread overview]
Message-ID: <525b949c-c8ad-ec4a-7a3f-41c783b3a26e@kernel.org> (raw)
In-Reply-To: <CAKzfze_Ps2qAhKDQ7j_nfGGf4vHqpcAoYNrf3b-F4a8gDVCzOQ@mail.gmail.com>
On 14/07/16 04:36, Matt Ranostay wrote:
> On Sun, Jul 10, 2016 at 7:20 AM, Jonathan Cameron <jic23@kernel.org> wrote:
>> On 05/07/16 22:27, Matt Ranostay wrote:
>>> On Tue, Jul 5, 2016 at 12:56 PM, Jonathan Cameron <jic23@kernel.org> wrote:
>>>> On 03/07/16 23:24, Matt Ranostay wrote:
>>>>> On Sun, Jul 3, 2016 at 6:41 AM, Jonathan Cameron <jic23@kernel.org> wrote:
>>>>>> On 02/07/16 23:13, Matt Ranostay wrote:
>>>>>>> On Sat, Jul 2, 2016 at 3:05 PM, Matt Ranostay <mranostay@gmail.com> wrote:
>>>>>>>> LMP91000EVM evaluation board has LMP91000 potentiostat along with an
>>>>>>>> 16-bit ADC for chemical sensoring applications.
>>>>>>>>
>>>>>>>> * add support for the TI LMP91000 potentiostat
>>>>>>>> * add support for ADC141S626 and ADC161S626 ADC chips
>>>>>>>
>>>>>>> Probably should have put what I am RFC'ing :).
>>>>>>>
>>>>>>> * does this belong in a new path drivers/iio/potentiostat ?
>>>>>> I'm going for drivers/iio/AFE/potentiostat with drivers/iio/AFE/amplifiers
>>>>>> as well to take the only similar driver we already have.
>>>>>>
>>>>>>> * first example of a iio consumer within drivers/iio, does it seems sane?
>>>>>> It's 'interesting'. You've worked around the whole question of how to handle
>>>>>> a mux by putting a push interface equipped client on top of the polled interface
>>>>>> of the ADC. It's an elegant solution that I'd never considered.
>>>>>>
>>>>>> By the very nature of a mux interface, unless we are piping the mux switching
>>>>>> out on the same trigger system as the read back, the actual read out must be
>>>>>> polled rather than self clocked. Only the mux knows when it is ready.
>>>>>> The triggered version has all sorts of additional complexity even if we had
>>>>>> output buffers already to go (such as requiring the output buffering to
>>>>>> 'lead' the input buffering to give the mux time to switch.
>>>>>>
>>>>>> Question to my mind is whether this is a generic and flexible enough approach
>>>>>> to use for this sort of device in the future... I think we have two classes
>>>>>> of 'analog device' that we need to support:
>>>>>>
>>>>>> 1) Simple all channels always there devices such as analog accelerometers
>>>>>> feeding into an ADC with a sequencer (or a software based sequencer).
>>>>>> In that case the data flow is clearly going to go over the buffered interface.
>>>>>> The accelerometer driver is just massaging the data for types / scale adjustments.
>>>>>> It has no influence on the sampling of the data.
>>>>>>
>>>>>> 2) The 'smart' front end with a mux. In this case the 'when to read' question
>>>>>> is driven by the front end, not the ADC. Games could be played to push the
>>>>>> sampling of data over to the ADC, but is it worth doing?
>>>>>>
>>>>>
>>>>> Probably over-engineering unless we actually find a need to do this in
>>>>> the future.
>>>> I get the feeling we'll end up with a high performance system needing this
>>>> at some point.
>>>>>
>>>>>> So if we wanted to do this, the AFE could itself export a trigger that is then
>>>>>> used by the ADC which in turn pushes data back to the AFE driver via the buffered
>>>>>> data interface. The AFE driver would then have to handle the demux of this
>>>>>> data stream into a coherent form to push out in it's own buffer.
>>>>>> This approach gains the following:
>>>>>> - quick data transfers, particularly if we are dealing with a multiple output
>>>>>> mux. e.g we might have a 16 to 4 mux into a 4 channel simultaneous sampling
>>>>>> (or sequenced) ADC. So in this case if the mux was set to provide all 16
>>>>>> channels in order we'd do 4 reads of the ADC getting 0 1 2 3, 4 5 6 7 etc.
>>>>>> The mux driver would then have to recombine these 16 channels before kicking
>>>>>> them out.
>>>>>
>>>>> Makes sense but there is a slight issue of the settling time for the
>>>>> temp channel is 2-3 milliseconds. Can't assume all mux reads are going
>>>>> to take the same time constant.
>>>> That's down to the mux driver to handle it. Only trigger once it's known
>>>> to be stable..
>>>
>>> Also how would the ADC report the data back it would almost need
>>> dynamically setup iio channels after mux gets setup, correct?
>>>
>>> 1) ADC driver probe
>>> 2) MUX driver probe
>>> 3) MUX registers it's data channels
>>> 4) ADC driver needs to enumerate them
>> Why does the ADC driver care?
>>
>> The Mux driver is the only bit that knows what the ADC is actually capturing
>> as it controls both the actual wire connections and the reporting to userspace
>> of results.
>>
>> So.
>> 1) ADC driver probe
>> 2) Mux driver probe (gets provided ADC channels - however many it controls
>> the inputs for).
>> 3) ADC trigger set to trigger provided by Mux.
>>
>> To give a simple example, lets consider a 2 input single channel mux going into
>> a single channel ADC. Mux trigger called (imaginatively) mux_trig0
>>
>> Mux is consumer of the ADC channel.
>>
>> Setup:
>> 1) Mux registers as a 'buffer' consumer of the ADC channel.
>> 2) Mux has a trigger exposed (which is how it controls the capture.)
>> 3) ADC trigger set to the mux exposed one.
>>
>> A scan. (triggered say by a high resolution timer trigger).
>> 1) Mux picks channel 1 and waits for it to stabilize.
>> 2) Mux 'fires' trigger to initiate a capture and gets the resulting callback
>> call with the value. Stashes it somewhere
>> 3) Mux selects channel 2 and waits for it to stabilize
>> 4) Mux 'fires' trigger to initiate a capture and gets the resulting callback
>> call with the value. Stashes it somewhere.
>> 5) Mux driver can then combine the two values to form the 'scan' and push
>> that to it's buffer complete with whatever timestamp makes sense.
>> This Mux driver controlled buffer is the one userspace uses to get the data.
>>
>
> Only question is how does the callback come into play here with a
> trigger? Not sure I have seen this in the API so far.
The ABI has been there a long time - just not much used :)
See buffers\industrialio-buffer-cb.c
Was original written to support pushing data out to the iio-input
bridge driver (which was last posted in 2012)...
Just got used (slightly wrongly) in the sunxi touchscreen driver
as well.
>
>> Missing bit of all this is a consumer being able to control the providers
>> trigger. Doubt that would be hard to add.
>>
>
> Worse case initially it will have to be manually set.
I think we'd have to automate it or this would all be really clunky
to use from userspace.
>
>> I think that covers all possible circumstances where we have explicit
>> control of the mux or at least the ability to set it to a known state.
>>
>> Jonathan
>>
>>>
>>>>>
>>>>>>
>>>>>> To do this we'd need to add an interface to allow the AFE/mux driver to set
>>>>>> the trigger for the ADC to its own.
>>>>>
>>>>> Of course in this case the ADC and LMP91000 device are using both the
>>>>> hrtimer trigger, albeit of course you can't do it at the same time. So
>>>>> it is polling no matter what.
>>>> Fair point.
>>>>>
>>>>>>
>>>>>> If we want to do this quickish I think that's about the lightest weight option
>>>>>> we can do.
>>>>>>
>>>>>> Now, the question is, what are the disadvantages of going with what you
>>>>>> have here for this driver but keeping in mind the above for when it matters?
>>>>>>
>>>>>> I'm guessing we never need to run this particularly driver very fast...
>>>>>> I'm inclined to say yes but would like some other opinions on this one!
>>>>>> (hence the expanded Cc list - please do pull in anyone else you think
>>>>>> might be interested!)
>>>>>
>>>>> Yeah the sample response of the sensor isn't that high speed. Maybe a
>>>>> few dozen hertz.
>>>>>
>>>>>>
>>>>>>> * ADC driver has no IIO_CHAN_INFO_SCALE due to no regulators being defined
>>>>>> Should be some defined. That was easy ;)
>>>>>>> * Should ADC value be signed or unsigned? -16636 is 0V, 0 is 2/VA ,
>>>>>>> 16635 is ~VA. Of course true zero is defined by the VREF voltage.
>>>>>> err. Odd. Go with signed I think.
>>>>>>>
>>>>>>>>
>>>>>>>> Matt Ranostay (2):
>>>>>>>> iio: adc: ti-adc1x1s: add support for TI 1-channel differential ADCs
>>>>>>>> iio: potentiostat: add LMP91000 support
>>>>>>>>
>>>>>>>> .../devicetree/bindings/iio/adc/ti-adc1x1s.txt | 16 ++
>>>>>>>> .../bindings/iio/potentiostat/lmp91000.txt | 28 ++
>>>>>>>> drivers/iio/Kconfig | 1 +
>>>>>>>> drivers/iio/Makefile | 1 +
>>>>>>>> drivers/iio/adc/Kconfig | 12 +
>>>>>>>> drivers/iio/adc/Makefile | 1 +
>>>>>>>> drivers/iio/adc/ti-adc1x1s.c | 233 ++++++++++++++++
>>>>>>>> drivers/iio/potentiostat/Kconfig | 21 ++
>>>>>>>> drivers/iio/potentiostat/Makefile | 6 +
>>>>>>>> drivers/iio/potentiostat/lmp91000.c | 303 +++++++++++++++++++++
>>>>>>>> 10 files changed, 622 insertions(+)
>>>>>>>> create mode 100644 Documentation/devicetree/bindings/iio/adc/ti-adc1x1s.txt
>>>>>>>> create mode 100644 Documentation/devicetree/bindings/iio/potentiostat/lmp91000.txt
>>>>>>>> create mode 100644 drivers/iio/adc/ti-adc1x1s.c
>>>>>>>> create mode 100644 drivers/iio/potentiostat/Kconfig
>>>>>>>> create mode 100644 drivers/iio/potentiostat/Makefile
>>>>>>>> create mode 100644 drivers/iio/potentiostat/lmp91000.c
>>>>>>>>
>>>>>>>> --
>>>>>>>> 2.7.4
>>>>>>>>
>>>>>>> --
>>>>>>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
>>>>>>> the body of a message to majordomo@vger.kernel.org
>>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>>>
>>>>>>
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
>>>>> the body of a message to majordomo@vger.kernel.org
>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>
>>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2016-07-24 12:25 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-02 22:05 [RFC 0/2] iio: add support for LMP91000EVM potentiostat board Matt Ranostay
2016-07-02 22:05 ` [RFC 1/2] iio: adc: ti-adc1x1s: add support for TI 1-channel differential ADCs Matt Ranostay
2016-07-03 13:04 ` Jonathan Cameron
2016-07-03 21:34 ` Matt Ranostay
2016-07-05 19:52 ` Jonathan Cameron
2016-07-04 3:05 ` Matt Ranostay
2016-07-05 19:53 ` Jonathan Cameron
2016-07-02 22:05 ` [RFC 2/2] iio: potentiostat: add LMP91000 support Matt Ranostay
2016-07-03 13:41 ` Jonathan Cameron
2016-07-03 21:59 ` Matt Ranostay
2016-07-05 19:57 ` Jonathan Cameron
2016-07-03 22:48 ` Matt Ranostay
2016-07-05 19:59 ` Jonathan Cameron
2016-07-02 22:13 ` [RFC 0/2] iio: add support for LMP91000EVM potentiostat board Matt Ranostay
2016-07-03 13:41 ` Jonathan Cameron
2016-07-03 22:24 ` Matt Ranostay
2016-07-05 19:56 ` Jonathan Cameron
2016-07-05 21:27 ` Matt Ranostay
2016-07-10 14:20 ` Jonathan Cameron
2016-07-14 3:36 ` Matt Ranostay
2016-07-24 12:25 ` Jonathan Cameron [this message]
2016-07-24 22:21 ` Matt Ranostay
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=525b949c-c8ad-ec4a-7a3f-41c783b3a26e@kernel.org \
--to=jic23@kernel.org \
--cc=daniel.baluta@intel.com \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=mranostay@gmail.com \
--cc=pmeerw@pmeerw.net \
/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;
as well as URLs for NNTP newsgroup(s).