mbox series

[v7,0/5] Support ROHM BU27034 ALS sensor

Message ID cover.1680263956.git.mazziesaccount@gmail.com (mailing list archive)
Headers show
Series Support ROHM BU27034 ALS sensor | expand

Message

Matti Vaittinen March 31, 2023, 12:40 p.m. UTC
Support ROHM BU27034 ALS sensor

This series adds support for ROHM BU27034 Ambient Light Sensor.

The BU27034 has configurable gain and measurement (integration) time
settings. Both of these have inversely proportional relation to the
sensor's intensity channel scale.

Many users only set the scale, which means that many drivers attempt to
'guess' the best gain+time combination to meet the scale. Usually this
is the biggest integration time which allows setting the requested
scale. Typically, increasing the integration time has better accuracy
than increasing the gain, which often amplifies the noise as well as the
real signal.

However, there may be cases where more responsive sensors are needed.
So, in some cases the longest integration times may not be what the user
prefers. The driver has no way of knowing this.

Hence, the approach taken by this series is to allow user to set both
the scale and the integration time with following logic:

1. When scale is set, the existing integration time is tried to be
   maintained as a first priority.
   1a) If the requested scale can't be met by current time, then also
       other time + gain combinations are searched. If scale can be met
       by some other integration time, then the new time may be applied.
       If the time setting is common for all channels, then also other
       channels must be able to maintain their scale with this new time
       (by changing their gain). The new times are scanned in the order
       of preference (typically the longest times first).
   1b) If the requested scale can be met using current time, then only
       the gain for the channel is changed.

2. When the integration time change - scale is tried to be maintained.
   When integration time change is requested also gain for all impacted
   channels is adjusted so that the scale is not changed, or is chaned
   as little as possible. This is different from the RFCv1 where the
   request was rejected if suitable gain couldn't be found for some
   channel(s).

This logic is simple. When total gain (either caused by time or hw-gain)
is doubled, the scale gets halved. Also, the supported times are given a
'multiplier' value which tells how much they increase the total gain.

However, when I wrote this logic in bu27034 driver, I made quite a few
errors on the way - and driver got pretty big. As I am writing drivers
for two other sensors (RGB C/IR + flicker BU27010 and RGB C/IR BU27008)
with similar gain-time-scale logic I thought that adding common helpers
for these computations might be wise. I hope this way all the bugs will
be concentrated in one place and not in every individual driver ;)

Hence, this series also intriduces IIO gain-time-scale helpers
(abbreviated as gts-helpers). I have also written  a couple of KUnit tests
for the most hairy parts but those are not part of this series as they
depend on kunit_devices which are not yet supported in-tree. I'll send
those tests as a separate patch (or series) when the Kunit dependencies
are merged in-tree. Meanwhile the interested people can find the tests
from my private playground:
https://github.com/M-Vaittinen/linux/tree/iio-gts-tests
(Tests are not maintained there so some porting may be needed if/when
things change in mainline.

Finally, these added helpers do provide some value also for drivers
which only:
 a) allow gain change
  or
 b) allow changing both the time and gain while trying to maintain the
    scale.

For a) we provide the gain - selector (register value) table format +
selector to gain look-ups, gain <-> scale conversions and the available
scales helpers.

For latter case we also provide the time-tables, and actually all the
APIs should be usable by setting the time multiplier to 1. (not testeted
thoroughly though).

Revision history:
v6 => v7:
- Drop Kunit tests for gts-helpers. These will be sent as a follow-up
  when dependencies get in-tree.
- BU27034 driver:
  - Prevent use of a "bogus" gain value in integration time setting.
  - Minor styling
- GTS helpers:
  - Let caller know whether the iio_gts_find_new_gain_by_old_gain_time()
    or iio_gts_find_new_gain_sel_by_old_gain_time() updated the new_gain
    in a case where the call fails. This can be relevant to callers like
    can be seen in BU27034 integration time setting.
v5 => v6:
- Just a minor fixes in iio-gts-helpers and bu27034 driver.
- Kunit device helper for a test device creation.
- IIO GTS tests use kunit device helper.

v4 => v5: Mostly fixes to review comments from Andy and Jonathan.
- more accurate change-log in individual patches
- copy code from DRM test helper instead of moving it to simplify
  merging
- document all exported GTS helpers.
- inline a few GTS helpers
- use again Milli lux for the bu27034 with RAW IIO_LIGHT channel and scale
- Fix bug from added in v4 bu27034 time setting.

v3 => v4: (Still mostly fixes to review comments from Andy and Jonathan)
- more accurate change-log in individual patches
- dt-binding and maintainer patches unchanged.
- dropped unused helpers and converted ones currently used only internally
  to static.
- extracted "dummy device" creation helpers from DRM tests.
- added tests for devm APIs
- dropped scale for PROCESSED channel in BU27034 and converted mLux
  values to luxes
- dropped channel 2 GAIN setting which can't be done due to HW
  limitations.

v2 => v3: (Mostly fixes to review comments from Andy and Jonathan)
- dt-binding and maintainer patches unchanged.
- iio-gts-helper tests: Use namespaces
- iio-gts-helpers + bu27034 plenty of changes. See more comprehensive
  changelog in individual patches.

RFCv1 => v2:
  dt-bindings:
	- Fix binding file name and id by using comma instead of a hyphen to
	  separate the vendor and part names.
  gts-helpers:
	- fix include guardian
	- Improve kernel doc for iio_init_iio_gts.
	- Add iio_gts_scale_to_total_gain
	- Add iio_gts_total_gain_to_scale
	- Fix review comments from Jonathan
	  - add documentation to few functions
	  - replace 0xffffffffffffffffLLU by U64_MAX
	  - some styling fixes
	  - drop unnecessary NULL checks
	  - order function arguments by  in / out purpose
	  - drop GAIN_SCALE_ITIME_MS()
	- Add helpers for available scales and times
	- Rename to iio-gts-helpers
  gts-tests:
	- add tests for available scales/times helpers
	- adapt to renamed iio-gts-helpers.h header
  bu27034-driver:
	- (really) protect read-only registers
	- fix get and set gain
	- buffered mode
	- Protect the whole sequences including meas_en/meas_dis to avoid messing
	  up the enable / disable order
	- typofixes / doc improvements
	- change dropped GAIN_SCALE_ITIME_MS() to GAIN_SCALE_ITIME_US()
	- use more accurate scale for lux channel (milli lux)
	- provide available scales / integration times (using helpers).
	- adapt to renamed iio-gts-helpers.h file
	- bu27034 - longer lines in Kconfig
	- Drop bu27034_meas_en and bu27034_meas_dis wrappers.
	- Change device-name from bu27034-als to bu27034
  MAINTAINERS:
	- Add iio-list

---

Matti Vaittinen (5):
  iio: light: Add gain-time-scale helpers
  MAINTAINERS: Add IIO gain-time-scale helpers
  dt-bindings: iio: light: Support ROHM BU27034
  iio: light: ROHM BU27034 Ambient Light Sensor
  MAINTAINERS: Add ROHM BU27034

 .../bindings/iio/light/rohm,bu27034.yaml      |   46 +
 MAINTAINERS                                   |   14 +
 drivers/iio/Kconfig                           |    3 +
 drivers/iio/Makefile                          |    1 +
 drivers/iio/industrialio-gts-helper.c         | 1077 ++++++++++++
 drivers/iio/light/Kconfig                     |   14 +
 drivers/iio/light/Makefile                    |    1 +
 drivers/iio/light/rohm-bu27034.c              | 1498 +++++++++++++++++
 include/linux/iio/iio-gts-helper.h            |  206 +++
 9 files changed, 2860 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/light/rohm,bu27034.yaml
 create mode 100644 drivers/iio/industrialio-gts-helper.c
 create mode 100644 drivers/iio/light/rohm-bu27034.c
 create mode 100644 include/linux/iio/iio-gts-helper.h


base-commit: eeac8ede17557680855031c6f305ece2378af326

Comments

Matti Vaittinen March 4, 2024, 12:38 p.m. UTC | #1
Hi deee Ho peeps!

On 3/31/23 15:40, Matti Vaittinen wrote:
> Support ROHM BU27034 ALS sensor
> 
> This series adds support for ROHM BU27034 Ambient Light Sensor.

I have one word for all of you who worked to get the ROHM BU27034NUC 
driver working in upstream.

Meh.

I just found out that the BU27034 sensor which was developed when I 
wrote this driver had some "manufacturing issues"... The full model 
number was BU27034NUC. The has been cancelled, and, as far as I know, no 
significant number of those were manufactured.

The issues of BU27034NUC were solved, and new model BU27034ANUC was 
developed and is available in the ROHM catalog.

I did also learn that this new model BU27034ANUC is _not_ functionally 
equivalent to the BU27034NUC. I am currently clarifying all the 
differences, and I have requested the HQ to send me a sample for driver 
development and verification work.

This far I've come to know at least following differences:

- The DATA2 (IR) channel is removed. So is the gain setting for it. This
   should very much simplify the gain logic.
- Some of the gains were removed.
- The 5ms integration time was removed. (The support of 5ms was severely
   limited on original BU27034NUC too so driver did not support that
   anyways).
- The light sensitivity curves had changed so the lux calculation will
   be changed.

One thing that has _not_ changed though is the part-id :rolleyes:

My preferred approach would be to convert the in-tree bu27034 driver to 
support this new variant. I think it makes sense because:
- (I expect) the amount of code to review will be much smaller this way
   than it would be if current driver was completely removed, and new one
   submitted.
- This change will not break existing users as there should not be such
   (judging the statement that the original BU27034NUC was cancelled
   before it was sold "en masse").

It sure is possible to drop the existing driver and submit a new one 
too, but I think it will be quite a bit more work with no strong benefits.

I expect the rest of the information to be shared to me during the next 
couple of days, and I hope I can start testing the driver immediately 
when I get the HW.

My question is, do you prefer the changes to be sent as one "support 
BU27034ANUC patch, of would you rather see changes splitted to pieces 
like: "adapt lux calculation to support BU27034ANUC", "remove obsolete 
DATA2 channel", "remove unsupported gains"...? Furthermore, the DT 
compatible was just rohm,bu27034 and did not include the ending "nuc". 
Should that compatible be removed and a new one with "anuc"-suffix be 
added to denote the new sensor?

I am truly sorry for all the unnecessary reviewing and maintenance work 
you guys did. I can assure you I didn't go through it for fun either - 
even if the coding was fun :) I guess even the "upstream early" process 
has it's weaknesses...

Yours,
	-- Matti
Jonathan Cameron March 9, 2024, 5:50 p.m. UTC | #2
On Mon, 4 Mar 2024 14:38:38 +0200
Matti Vaittinen <mazziesaccount@gmail.com> wrote:

> Hi deee Ho peeps!
> 
> On 3/31/23 15:40, Matti Vaittinen wrote:
> > Support ROHM BU27034 ALS sensor
> > 
> > This series adds support for ROHM BU27034 Ambient Light Sensor.  
> 
> I have one word for all of you who worked to get the ROHM BU27034NUC 
> driver working in upstream.
> 
> Meh.
> 
> I just found out that the BU27034 sensor which was developed when I 
> wrote this driver had some "manufacturing issues"... The full model 
> number was BU27034NUC. The has been cancelled, and, as far as I know, no 
> significant number of those were manufactured.

ouch. We all have some cancelled products in our history!
When that happens I usually go eat cake and moan at anyone standing
near by. At least this seems like there will be some direct use of
the work done (sometimes you just have to list the things learnt along
the way).

> 
> The issues of BU27034NUC were solved, and new model BU27034ANUC was 
> developed and is available in the ROHM catalog.
> 
> I did also learn that this new model BU27034ANUC is _not_ functionally 
> equivalent to the BU27034NUC. I am currently clarifying all the 
> differences, and I have requested the HQ to send me a sample for driver 
> development and verification work.
> 
> This far I've come to know at least following differences:
> 
> - The DATA2 (IR) channel is removed. So is the gain setting for it. This
>    should very much simplify the gain logic.
> - Some of the gains were removed.
> - The 5ms integration time was removed. (The support of 5ms was severely
>    limited on original BU27034NUC too so driver did not support that
>    anyways).
> - The light sensitivity curves had changed so the lux calculation will
>    be changed.
> 
> One thing that has _not_ changed though is the part-id :rolleyes:

*sigh* Not even a version number?  Even unreleased / prototype parts should have
different IDs if anything in the interface changed.

> 
> My preferred approach would be to convert the in-tree bu27034 driver to 
> support this new variant. I think it makes sense because:
> - (I expect) the amount of code to review will be much smaller this way
>    than it would be if current driver was completely removed, and new one
>    submitted.
> - This change will not break existing users as there should not be such
>    (judging the statement that the original BU27034NUC was cancelled
>    before it was sold "en masse").
> 
> It sure is possible to drop the existing driver and submit a new one 
> too, but I think it will be quite a bit more work with no strong benefits.

Agreed, modify the existing driver. Just needs a clear statement in
patch descriptions that the original part is not expected to be in the wild.

> 
> I expect the rest of the information to be shared to me during the next 
> couple of days, and I hope I can start testing the driver immediately 
> when I get the HW.
> 
> My question is, do you prefer the changes to be sent as one "support 
> BU27034ANUC patch, of would you rather see changes splitted to pieces 
> like: "adapt lux calculation to support BU27034ANUC", "remove obsolete 
> DATA2 channel", "remove unsupported gains"...? Furthermore, the DT 
> compatible was just rohm,bu27034 and did not include the ending "nuc". 

Separate patches preferred for each feature / type of change. Mostly
they'll hopefully be trivial to review.

> Should that compatible be removed and a new one with "anuc"-suffix be 
> added to denote the new sensor?

Yes. The binding patch in particular will need a really clear statement
that we believe there are none in products in the wild.

> 
> I am truly sorry for all the unnecessary reviewing and maintenance work 
> you guys did. I can assure you I didn't go through it for fun either - 
> even if the coding was fun :) I guess even the "upstream early" process 
> has it's weaknesses...

True enough. It's always 'interesting' to not know if / when a product
you've upstreamed code for will launch.

Jonathan

> 
> Yours,
> 	-- Matti
>
Matti Vaittinen March 11, 2024, 9:15 a.m. UTC | #3
On 3/9/24 19:50, Jonathan Cameron wrote:
> On Mon, 4 Mar 2024 14:38:38 +0200
> Matti Vaittinen <mazziesaccount@gmail.com> wrote:

>> I just found out that the BU27034 sensor which was developed when I
>> wrote this driver had some "manufacturing issues"... The full model
>> number was BU27034NUC. The has been cancelled, and, as far as I know, no
>> significant number of those were manufactured.
> 
> ouch. We all have some cancelled products in our history!
> When that happens I usually go eat cake and moan at anyone standing
> near by.

I like that approach :) Luckily, this was just a sensor. It was much 
more painful back in the Nokia when some of the BTS variants were 
cancelled. It flushed 'man years' of work instead of 'man months' :)

> At least this seems like there will be some direct use of
> the work done (sometimes you just have to list the things learnt along
> the way).

Yes! It wasn't all wasted effort!

>> One thing that has _not_ changed though is the part-id :rolleyes:
> 
> *sigh* Not even a version number?

No.

> Even unreleased / prototype parts should have
> different IDs if anything in the interface changed.

...tell me about it... Well, I tried to send feedback - but I am not 
convinced this is not happening again. I think I could fill a book with 
feedback which has had not been listened in the past - but who knows, 
occasionally feedback also works. So, we can keep trying. :)

>> My preferred approach would be to convert the in-tree bu27034 driver to
>> support this new variant. I think it makes sense because:
>> - (I expect) the amount of code to review will be much smaller this way
>>     than it would be if current driver was completely removed, and new one
>>     submitted.
>> - This change will not break existing users as there should not be such
>>     (judging the statement that the original BU27034NUC was cancelled
>>     before it was sold "en masse").
>>
>> It sure is possible to drop the existing driver and submit a new one
>> too, but I think it will be quite a bit more work with no strong benefits.
> 
> Agreed, modify the existing driver. Just needs a clear statement in
> patch descriptions that the original part is not expected to be in the wild.

ack.

>> I expect the rest of the information to be shared to me during the next
>> couple of days, and I hope I can start testing the driver immediately
>> when I get the HW.
>>
>> My question is, do you prefer the changes to be sent as one "support
>> BU27034ANUC patch, of would you rather see changes splitted to pieces
>> like: "adapt lux calculation to support BU27034ANUC", "remove obsolete
>> DATA2 channel", "remove unsupported gains"...? Furthermore, the DT
>> compatible was just rohm,bu27034 and did not include the ending "nuc".
> 
> Separate patches preferred for each feature / type of change. Mostly
> they'll hopefully be trivial to review.

I've drafted most of the changes and it seems they are more or less 
trivial. I've not yet received the hardware so the changes are 100% 
untested though.

>> Should that compatible be removed and a new one with "anuc"-suffix be
>> added to denote the new sensor?
> 
> Yes. The binding patch in particular will need a really clear statement
> that we believe there are none in products in the wild.

ack.

>> I am truly sorry for all the unnecessary reviewing and maintenance work
>> you guys did. I can assure you I didn't go through it for fun either -
>> even if the coding was fun :) I guess even the "upstream early" process
>> has it's weaknesses...
> 
> True enough. It's always 'interesting' to not know if / when a product
> you've upstreamed code for will launch.

Indeed. Almost as interesting as having patches for a new product in 
your "to be sent" - folder for 3 years waiting for the product to launch 
to get permission to send the patches... Don't we all love maintaining 
off-tree patches when we have that creeping feeling the patches will 
never be allowed to be sent...? Asking for a friend :rolleyes:

Yours,
	-- Matti