From: Andy Shevchenko <andriy.shevchenko@intel.com>
To: Chang Yu <marcus.yu.56@gmail.com>
Cc: "Andy Shevchenko" <andy@kernel.org>,
"Jonathan Cameron" <jic23@kernel.org>,
"David Lechner" <dlechner@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>, "Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Shi Hao" <i.shihao.999@gmail.com>,
"Jose A. Perez de Azpillaga" <azpijr@gmail.com>,
"Joshua Crofts" <joshua.crofts1@gmail.com>,
linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 2/2] iio: light: add AS7343 multi-spectral sensor driver
Date: Mon, 14 Sep 2026 11:00:18 +0300 [thread overview]
Message-ID: <aqepkmQS_p6K1Bd6@ashevche-desk.local> (raw)
In-Reply-To: <20260912013912.51887-3-marcus.yu.56@gmail.com>
On Fri, Sep 11, 2026 at 06:39:12PM -0700, Chang Yu wrote:
> Add a driver for the AMS AS7343 14-channel multi-spectral sensor.
>
> The AS7343 is a 14-channel spectral sensor featuring 11 visible
> channels, 1 near-infrared channel, 1 clear channel (VIS), and 1
> flicker detection channel.
>
> The driver exposes 12 spectral channels (11 visible light and 1
> near-infrared) via sysfs. Runtime PM is implemented to stop
> measurements when the device is suspended or torn down. Power is
> never cut (PON=1 always) to preserve register values.
>
> Future patches will add configurable gain and integration time,
> interrupt support, buffered reads, VIS channel, and flicker
> detection.
...
> +/*
> + * Support for AMS AS7343 14-channel multi-spectral sensor.
> + * (7-bit I2C slave address 0x39)
> + *
> + * Based on the work of:
> + * Christian Eggers <ceggers@arri.de> (AS73211 driver)
> + *
> + * Copyright (c) 2026 Chang Yu <marcus.yu.56@gmail.com>
> + *
> + * Datasheets:
Why plural?
> + * https://look.ams-osram.com/m/5f2d27fff9a874d2/original/AS7343-14-Channel-Multi-Spectral-Sensor.pdf
> + *
> + * TODO:
> + * - Autosuspend
> + * - Support for configurable gain and integration time
> + * - Interrupt support
> + * - Add support for reading the VIS channel
> + * - Flicker detection
> + */
...
> +#define AS7343_ID 0x5a
> +/* AS7343 config registers */
> +#define AS7343_ENABLE 0x80
> +#define AS7343_ATIME 0x81
> +#define AS7343_ASTEP 0xd4
> +#define AS7343_CFG0 0xbf
> +
> +#define AS7343_CFG1 0xc6
> +#define AS7343_CFG20 0xd6
> +#define AS7343_CONTROL 0xfa
> +
> +/* AS7343 status registers */
> +#define AS7343_STATUS2 0x90
> +#define AS7343_STATUS3 0x91
> +#define AS7343_STATUS 0x93
> +#define AS7343_ASTATUS 0x94
> +#define AS7343_STATUS5 0xbb
> +#define AS7343_STATUS4 0xbc
> +#define AS7343_FD_STATUS 0xe3
> +
> +/* AS7343 spectral data registers */
> +#define AS7343_DATA_FZ 0x95
> +#define AS7343_DATA_FY 0x97
> +#define AS7343_DATA_FXL 0x99
> +#define AS7343_DATA_NIR 0x9b
> +#define AS7343_DATA_F2 0xa1
> +#define AS7343_DATA_F3 0xa3
> +#define AS7343_DATA_F4 0xa5
> +#define AS7343_DATA_F6 0xa7
> +#define AS7343_DATA_F1 0xad
> +#define AS7343_DATA_F7 0xaf
> +#define AS7343_DATA_F8 0xb1
> +#define AS7343_DATA_F5 0xb3
> +#define AS7343_DATA_FD_L 0xb7
> +#define AS7343_DATA_FD_H 0xb8
> +/* AS7343 FIFO buffer data registers */
> +#define AS7343_FIFO_LVL 0xfd
> +#define AS7343_FDATA_L 0xfe
> +#define AS7343_FDATA_H 0xff
Please, keep indentation for the registers the same. Also would be nice to have
them sorted by offset.
...
> +static int as7343_read_raw(struct iio_dev *indio_dev,
> + struct iio_chan_spec const *chan,
> + int *val, int *val2, long mask)
> +{
> + struct as7343_data *data = iio_priv(indio_dev);
> + unsigned int unused;
> + struct regmap *map;
> + struct device *dev;
> + __le16 result;
> + int ret;
> + map = data->regmap;
> + dev = regmap_get_device(map);
Assign them directly in the definition block above.
> + PM_RUNTIME_ACQUIRE_IF_ENABLED(dev, pm);
> + ret = PM_RUNTIME_ACQUIRE_ERR(&pm);
> + if (ret)
> + return ret;
> +
> + switch (mask) {
> + case IIO_CHAN_INFO_RAW: {
> + /* Wait until integration time passes for all 3 cycles. */
> + msleep(160);
> +
> + /*
> + * Reading ASTATUS latches all data registers to this read.
> + * We don't care about the returned saturation/gain status for
> + * now.
> + */
> + guard(mutex)(&data->mutex);
Blank line. Always make guard()() to be visible (by grouping it separately
from the other pieces of code).
> + ret = regmap_read(map, AS7343_ASTATUS, &unused);
> + if (ret)
> + return ret;
> +
> + ret = regmap_bulk_read(map, chan->address,
> + &result, sizeof(result));
> + if (ret)
> + return ret;
> +
> + *val = le16_to_cpu(result);
> + return IIO_VAL_INT;
> + }
> +
> + default:
> + return -EINVAL;
> + }
> +}
...
> +static int as7343_setup_device(struct device *dev, struct as7343_data *data)
> +{
> + struct regmap *map = data->regmap;
> + unsigned int val;
> + __le16 step;
> + int ret;
> +
> + /* Power on */
> + ret = regmap_set_bits(map, AS7343_ENABLE, AS7343_ENABLE_PON);
> + if (ret)
> + return ret;
> +
> + /* Need to set REG_BANK to 1 before we can access ID */
> + ret = regmap_set_bits(map, AS7343_CFG0, AS7343_CFG0_REG_BANK);
> + if (ret)
> + return ret;
> +
> + ret = regmap_read(map, AS7343_ID, &val);
> + if (ret)
> + return ret;
> + if (val != 0x81)
> + dev_info(dev, "Unknown device ID: %x\n", val);
Wouldn't be better to define 0x81 with meaningful name?
> + ret = regmap_clear_bits(map, AS7343_CFG0, AS7343_CFG0_REG_BANK);
> + if (ret)
> + return ret;
> +
> + /* Configure the SMUX to readout all channels */
> + ret = regmap_update_bits(map, AS7343_CFG20, AS7343_CFG20_AUTO_SMUX,
> + FIELD_PREP(AS7343_CFG20_AUTO_SMUX,
> + AS7343_CFG20_AUTO_SMUX_READOUT_ALL));
> + if (ret)
> + return ret;
> +
> + /* Set 50.1ms integration time and x256 gain for now */
> + step = cpu_to_le16(AS7343_ASTEP_VAL);
> + ret = regmap_bulk_write(map, AS7343_ASTEP, &step, sizeof(step));
> + if (ret)
> + return ret;
> +
> + ret = regmap_write(map, AS7343_ATIME, AS7343_ATIME_VAL);
> + if (ret)
> + return ret;
> +
> + return regmap_update_bits(map, AS7343_CFG1, AS7343_CFG1_AGAIN,
> + FIELD_PREP(AS7343_CFG1_AGAIN,
> + AS7343_CFG1_AGAIN_X256));
> +}
...
> +static int as7343_suspend(struct device *dev)
> +{
> + struct iio_dev *indio_dev = dev_get_drvdata(dev);
> + struct as7343_data *data = iio_priv(indio_dev);
> + struct regmap *map = data->regmap;
> + return regmap_clear_bits(map, AS7343_ENABLE, AS7343_ENABLE_SP_EN);
Can this mess up the raw read? If so, also needs a mutex to be held.
> +}
> +
> +static int as7343_resume(struct device *dev)
> +{
> + struct iio_dev *indio_dev = dev_get_drvdata(dev);
> + struct as7343_data *data = iio_priv(indio_dev);
> + struct regmap *map = data->regmap;
> +
> + return regmap_set_bits(map, AS7343_ENABLE, AS7343_ENABLE_SP_EN);
> +}
Same Q.
...
> +static void as7343_suspend_action(void *data)
> +{
> + struct device *dev = data;
Unneeded casting, can name parameter 'dev' above.
> + as7343_suspend(dev);
> +}
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2026-09-14 8:00 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-12 1:39 [PATCH v4 0/2] Add support for AS7343 multi-spectral sensor Chang Yu
2026-09-12 1:39 ` [PATCH v4 1/2] dt-bindings: iio: light: add as7343 Chang Yu
2026-09-13 0:56 ` Jonathan Cameron
2026-09-13 1:35 ` Chang Yu
2026-09-13 2:51 ` Jonathan Cameron
2026-09-13 3:20 ` Chang Yu
2026-09-13 17:14 ` Jonathan Cameron
2026-09-15 3:19 ` Chang Yu
2026-09-12 1:39 ` [PATCH v4 2/2] iio: light: add AS7343 multi-spectral sensor driver Chang Yu
2026-09-12 1:50 ` sashiko-bot
2026-09-13 2:47 ` Jonathan Cameron
2026-09-13 4:11 ` Chang Yu
2026-09-13 17:17 ` Jonathan Cameron
2026-09-14 8:00 ` Andy Shevchenko [this message]
2026-09-15 2:49 ` Chang Yu
2026-09-15 7:34 ` Andy Shevchenko
2026-09-16 4:04 ` Chang Yu
2026-09-17 3:01 ` Jonathan Cameron
2026-09-19 3:46 ` Chang Yu
2026-09-19 14:14 ` Andy Shevchenko
2026-09-13 0:30 ` [PATCH v4 0/2] Add support for AS7343 multi-spectral sensor Jonathan Cameron
2026-09-13 0:44 ` Chang Yu
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=aqepkmQS_p6K1Bd6@ashevche-desk.local \
--to=andriy.shevchenko@intel.com \
--cc=andy@kernel.org \
--cc=azpijr@gmail.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=i.shihao.999@gmail.com \
--cc=jic23@kernel.org \
--cc=joshua.crofts1@gmail.com \
--cc=krzk+dt@kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=marcus.yu.56@gmail.com \
--cc=nuno.sa@analog.com \
--cc=robh@kernel.org \
/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.