From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Matti Vaittinen <mazziesaccount@gmail.com>
Cc: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>,
Jonathan Cameron <jic23@kernel.org>,
Lars-Peter Clausen <lars@metafoo.de>,
Paul Gazzillo <paul@pgazz.com>,
Zhigang Shi <Zhigang.Shi@liteon.com>,
Shreeya Patel <shreeya.patel@collabora.com>,
Dmitry Osipenko <dmitry.osipenko@collabora.com>,
linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org
Subject: Re: [PATCH v2 5/6] iio: light: ROHM BU27034 Ambient Light Sensor
Date: Thu, 2 Mar 2023 17:34:40 +0200 [thread overview]
Message-ID: <ZADCEPc1ZKczhEpE@smile.fi.intel.com> (raw)
In-Reply-To: <874d59be98703bb58a98fea72138de5b94d71a52.1677750859.git.mazziesaccount@gmail.com>
On Thu, Mar 02, 2023 at 12:58:59PM +0200, Matti Vaittinen wrote:
> ROHM BU27034 is an ambient light sesnor with 3 channels and 3 photo diodes
> capable of detecting a very wide range of illuminance. Typical application
> is adjusting LCD and backlight power of TVs and mobile phones.
>
> Add initial support for the ROHM BU27034 ambient light sensor.
>
> NOTE:
> - Driver exposes 4 channels. One IIO_LIGHT channel providing the
> calculated lux values based on measured data from diodes #0 and
> #1. Additionally 3 IIO_INTENSITY channels are emitting the raw
> register data from all diodes for more intense user-space
> computations.
> - Sensor has adjustible GAIN values ranging from 1x to 4096x.
> - Sensor has adjustible measurement times 5, 55, 100, 200 and
> 400 mS. Driver does not support 5 mS which has special
> limitations.
> - Driver exposes standard 'scale' adjustment which is
> implemented by:
> 1) Trying to adjust only the GAIN
> 2) If GAIN adjustment only can't provide requested
> scale, adjusting both the time and the gain is
> attempted.
> - Driver exposes writable INT_TIME property which can be used
> for adjusting the measurement time. Time adjustment will also
> cause the driver to adjust the GAIN so that the overall scale
> is not changed.
> - Runtime PM is not implemented.
> - Driver starts the measurement on the background when it is
> probed. This improves the respnse time to read-requests
> compared to starting the read only when data is requested.
> When the most accurate 400 mS measurement time is used, data reads
> would last quite long if measurement was started only on
> demand. This, however, is not appealing for users who would
> prefere power saving over measurement response time.
...
> +config ROHM_BU27034
> + tristate "ROHM BU27034 ambient light sensor"
> + depends on I2C
How? I do not see a such.
> + select REGMAP_I2C
> + select IIO_GTS_HELPER
> + help
> + Enable support for the ROHM BU27034 ambient light sensor. ROHM BU27034
> + is an ambient light sesnor with 3 channels and 3 photo diodes capable
> + of detecting a very wide range of illuminance.
> + Typical application is adjusting LCD and backlight power of TVs and
> + mobile phones.
Module name?
...
> obj-$(CONFIG_OPT3001) += opt3001.o
> obj-$(CONFIG_PA12203001) += pa12203001.o
> +obj-$(CONFIG_ROHM_BU27034) += rohm-bu27034.o
If you see, most of the components are without vendor prefix, why rohm is
special? Like you are expecting the very same filename for something else?
> obj-$(CONFIG_RPR0521) += rpr0521.o
> obj-$(CONFIG_SENSORS_TSL2563) += tsl2563.o
> obj-$(CONFIG_SI1133) += si1133.o
...
> +#include <linux/iio/iio.h>
> +#include <linux/iio/buffer.h>
> +#include <linux/iio/kfifo_buf.h>
Sorted?
...
> +#define BU27034_REG_DATA0_LO 0x50
> +#define BU27034_REG_DATA1_LO 0x52
> +#define BU27034_REG_DATA2_LO 0x54
I would drop _LO in all these
> +#define BU27034_REG_DATA2_HI 0x55
and rename somehow this to something like _END / _MAX (similar to the fields.
Perhaps you would need _START / _MIN above.
...
> +/*
> + * Available scales with gain 1x - 4096x, timings 55, 100, 200, 400 mS
> + * Time impacts to gain: 1x, 2x, 4x, 8x.
> + *
> + * => Max total gain is HWGAIN * gain by integration time (8 * 4096) = 32768
> + *
> + * Using NANO precision for scale we must use scale 64x corresponding gain 1x
> + * to avoid precision loss. (32x would result scale 976 562.5(nanos).
> + */
> +#define BU27034_SCALE_1X 64
> +
> +#define BU27034_GSEL_1X 0x00
> +#define BU27034_GSEL_4X 0x08
> +#define BU27034_GSEL_16X 0x0a
> +#define BU27034_GSEL_32X 0x0b
> +#define BU27034_GSEL_64X 0x0c
> +#define BU27034_GSEL_256X 0x18
> +#define BU27034_GSEL_512X 0x19
> +#define BU27034_GSEL_1024X 0x1a
> +#define BU27034_GSEL_2048X 0x1b
> +#define BU27034_GSEL_4096X 0x1c
Shouldn't the values be in plain decimal?
Otherwise I would like to understand bit mapping inside these hex values.
...
> + .indexed = 1 \
+ Comma at the end.
...
> + static const int reg[] = {
> + [BU27034_CHAN_DATA0] = BU27034_REG_MODE_CONTROL2,
> + [BU27034_CHAN_DATA1] = BU27034_REG_MODE_CONTROL3,
> + [BU27034_CHAN_DATA2] = BU27034_REG_MODE_CONTROL2
Ditto.
> + };
...
> + struct bu27034_gain_check gains[3] = {
> + { .chan = BU27034_CHAN_DATA0, },
> + { .chan = BU27034_CHAN_DATA1, },
Inner commas are not needed.
> + { .chan = BU27034_CHAN_DATA2 }
But here the outer one is good to have.
> + };
...
> + if (chan == BU27034_CHAN_ALS) {
> + if (val == 0 && val2 == 1000)
> + return 0;
> + else
Redundant 'else'. And probably here is better to use standard pattern for
"checking for error first".
> + return -EINVAL;
> + }
...
> + if (helper64 < 0xFFFFFFFFFFFFFLLU) {
Perhaps this needs a definition.
> + helper64 *= gain0;
> + do_div(helper64, ch0);
> + } else {
> + do_div(helper64, ch0);
> + helper64 *= gain0;
> + }
> + /* Same overflow check here */
Why not a helper function?
> + if (helper64 < 0xFFFFFFFFFFFFFLLU) {
> + helper64 *= gain0;
> + do_div(helper64, helper);
> + } else {
> + do_div(helper64, helper);
> + helper64 *= gain0;
> + }
...
> + return (val & BU27034_MASK_VALID);
Unneeded parentheses.
...
> +retry:
> + /* Get new value from sensor if data is ready */
> + if (bu27034_has_valid_sample(data)) {
> + ret = regmap_bulk_read(data->regmap, BU27034_REG_DATA0_LO,
> + res, size);
> + if (ret)
> + return ret;
> +
> + bu27034_invalidate_read_data(data);
> + } else {
> + /* No new data in sensor. Wait and retry */
> + msleep(25);
> +
> + goto retry;
There is no way out. What might go wrong?
> + }
...
> + ret = bu27034_get_int_time(data);
_get_int_time_us() ? (Looking at the below code)
> + if (ret < 0)
> + return ret;
> +
> + msleep(ret / 1000);
...
> + * Avoid div by zeroi. Not using max() as the data may not be in
zeroi?
...
> + if (!res[0])
Positive conditional?
> + ch0 = 1;
> + else
> + ch0 = le16_to_cpu(res[0]);
> +
> + if (!res[1])
> + ch1 = 1;
Ditto.
> + else
> + ch1 = le16_to_cpu(res[1]);
But why not to read and convert first and then check. This at least will
correctly compare 0 to the LE16 0 (yes, it's the same for 0, but strictly
speaking the bits order of lvalue and rvalue is different).
...
> + switch (mask) {
> + case IIO_CHAN_INFO_INT_TIME:
> + return iio_gts_avail_times(&data->gts, vals, type, length);
> + case IIO_CHAN_INFO_SCALE:
> + return iio_gts_all_avail_scales(&data->gts, vals, type, length);
> + default:
> + break;
> + }
> +
> + return -EINVAL;
You may do it from default case.
...
> + ret = regmap_read_poll_timeout(data->regmap, BU27034_REG_MODE_CONTROL4,
> + val, (val & BU27034_MASK_VALID),
Redundant parentheses.
> + BU27034_DATA_WAIT_TIME_US,
> + BU27034_TOTAL_DATA_WAIT_TIME_US);
> + if (ret) {
> + dev_err(data->dev, "data polling %s\n",
> + !(val & BU27034_MASK_VALID) ? "timeout" : "fail");
Why not positive conditional in ternary?
> + return ret;
> + }
...
> + fwnode = dev_fwnode(dev);
> + if (!fwnode)
> + return -ENODEV;
So, you deliberately disable a possibility to instantiate this from user space,
why?
...
> + ret = devm_iio_kfifo_buffer_setup(dev, idev, &bu27034_buffer_ops);
> +
> + ret = devm_iio_device_register(dev, idev);
Don't you find something strange in between?
> + if (ret < 0)
> + return dev_err_probe(dev, ret,
> + "Unable to register iio device\n");
...
> + { .compatible = "rohm,bu27034", },
Inner comma is not needed.
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2023-03-02 15:34 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-02 10:57 [PATCH v2 0/6] Support ROHM BU27034 ALS sensor Matti Vaittinen
2023-03-02 10:57 ` [PATCH v2 1/6] dt-bindings: iio: light: Support ROHM BU27034 Matti Vaittinen
2023-03-02 10:57 ` [PATCH v2 2/6] iio: light: Add gain-time-scale helpers Matti Vaittinen
2023-03-02 15:05 ` Andy Shevchenko
2023-03-03 7:54 ` Vaittinen, Matti
2023-03-06 11:13 ` Andy Shevchenko
2023-03-13 11:31 ` Matti Vaittinen
2023-03-13 14:39 ` Andy Shevchenko
2023-03-14 10:28 ` Matti Vaittinen
2023-03-14 11:31 ` Andy Shevchenko
2023-03-14 11:36 ` Andy Shevchenko
2023-03-15 7:20 ` Vaittinen, Matti
2023-03-18 16:49 ` Jonathan Cameron
2023-03-04 18:35 ` Jonathan Cameron
2023-03-04 19:42 ` Matti Vaittinen
2023-03-06 11:15 ` Andy Shevchenko
2023-03-02 10:58 ` [PATCH v2 3/6] iio: test: test " Matti Vaittinen
2023-03-02 10:58 ` [PATCH v2 4/6] MAINTAINERS: Add IIO " Matti Vaittinen
2023-03-02 10:58 ` [PATCH v2 5/6] iio: light: ROHM BU27034 Ambient Light Sensor Matti Vaittinen
2023-03-02 14:17 ` Matti Vaittinen
2023-03-02 15:34 ` Andy Shevchenko [this message]
2023-03-03 9:17 ` Matti Vaittinen
2023-03-04 19:02 ` Jonathan Cameron
2023-03-04 20:28 ` Matti Vaittinen
2023-03-04 20:17 ` Jonathan Cameron
2023-03-05 12:22 ` Matti Vaittinen
2023-03-12 15:36 ` Jonathan Cameron
2023-03-13 9:39 ` Matti Vaittinen
2023-03-18 16:54 ` Jonathan Cameron
2023-03-19 15:59 ` Matti Vaittinen
2023-03-14 9:39 ` Matti Vaittinen
2023-03-18 16:57 ` Jonathan Cameron
2023-03-05 13:10 ` Matti Vaittinen
2023-03-06 11:21 ` Andy Shevchenko
2023-03-13 8:54 ` Matti Vaittinen
2023-03-02 10:59 ` [PATCH v2 6/6] MAINTAINERS: Add ROHM BU27034 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=ZADCEPc1ZKczhEpE@smile.fi.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=Zhigang.Shi@liteon.com \
--cc=dmitry.osipenko@collabora.com \
--cc=jic23@kernel.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=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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.