From: Jonathan Cameron <jic23@kernel.org>
To: Atharva Tiwari <atharvatiwarilinuxdev@gmail.com>
Cc: "Bjorn Helgaas" <bhelgaas@google.com>,
"Thomas Gleixner" <tglx@kernel.org>,
"Ingo Molnar" <mingo@redhat.com>,
"Borislav Petkov" <bp@alien8.de>,
"Dave Hansen" <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
"Rafael J. Wysocki" <rafael@kernel.org>,
"Len Brown" <lenb@kernel.org>,
"Linus Walleij" <linusw@kernel.org>,
"Bartosz Golaszewski" <brgl@kernel.org>,
"Sven Peter" <sven@kernel.org>, "Janne Grunau" <j@jannau.net>,
"Neal Gompa" <neal@gompa.dev>,
"Guenter Roeck" <linux@roeck-us.net>,
"David Lechner" <dlechner@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>,
"Andy Shevchenko" <andy@kernel.org>, "Lee Jones" <lee@kernel.org>,
"Pavel Machek" <pavel@kernel.org>,
"Griffin Kroah-Hartman" <griffin@kroah.com>,
"Hans de Goede" <hansg@kernel.org>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
"Sebastian Reichel" <sre@kernel.org>,
"Alexandre Belloni" <alexandre.belloni@bootlin.com>,
"Wim Van Sebroeck" <wim@linux-watchdog.org>,
"Jarkko Sakkinen" <jarkko@kernel.org>,
"Mimi Zohar" <zohar@linux.ibm.com>,
"Roberto Sassu" <roberto.sassu@huawei.com>,
"Dmitry Kasatkin" <dmitry.kasatkin@gmail.com>,
"Eric Snowberg" <eric.snowberg@oracle.com>,
"Paul Moore" <paul@paul-moore.com>,
"James Morris" <jmorris@namei.org>,
"Serge E. Hallyn" <serge@hallyn.com>,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
linux-acpi@vger.kernel.org, linux-gpio@vger.kernel.org,
asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
linux-hwmon@vger.kernel.org, linux-iio@vger.kernel.org,
linux-leds@vger.kernel.org, mfd@lists.linux.dev,
platform-driver-x86@vger.kernel.org, linux-pm@vger.kernel.org,
linux-rtc@vger.kernel.org, linux-watchdog@vger.kernel.org,
linux-integrity@vger.kernel.org, keyrings@vger.kernel.org,
linux-security-module@vger.kernel.org
Subject: Re: [RFC PATCH 04/14] iio/light: add new driver for macsmc
Date: Sun, 1 Nov 2026 01:28:12 +0000 [thread overview]
Message-ID: <20261101012812.3661789c@jic23-hlaptop> (raw)
In-Reply-To: <20261029085504.3547-5-atharvatiwarilinuxdev@gmail.com>
On Thu, 29 Oct 2026 04:52:01 -0400
Atharva Tiwari <atharvatiwarilinuxdev@gmail.com> wrote:
> Add a driver for the ambient light sensors, exposed through
> the standard IIO interface with left and right channels.
>
> This replaces the light sensor support in applesmc.
>
> Signed-off-by: Atharva Tiwari <atharvatiwarilinuxdev@gmail.com>
Hi Atharva,
Given I'm generally in favour of bringing the overall
driver to modern standard subsystems, I'll just do a quick
review of the actual code in the IIO drivers.
Various comments inline.
thanks,
Jonathan
> diff --git a/drivers/iio/light/macsmc-light.c b/drivers/iio/light/macsmc-light.c
> new file mode 100644
> index 000000000..9d4532b34
> --- /dev/null
> +++ b/drivers/iio/light/macsmc-light.c
> @@ -0,0 +1,189 @@
> +// SPDX-License-Identifier: GPL-2.0 OR MIT
> +/*
> + * Apple SMC Light Sensor Driver
> + *
> + * Copyright (C) 2026 Atharva Tiwari <atharvatiwarilinuxdev@gmail.com>
> + *
> + * Based on drivers/hwmom/applesmc.c:
> + * Copyright (C) 2007 Nicolas Boichat <nicolas@boichat.ch>
> + * Copyright (C) 2010 Henrik Rydberg <rydberg@euromail.se>
> + */
> +
> +#include <linux/iio/events.h>
> +#include <linux/iio/iio.h>
> +#include <linux/byteorder/generic.h>
> +#include <linux/mfd/macsmc.h>
> +#include <linux/platform_device.h>
> +#include <linux/unaligned.h>
Give these a sanity check against other drivers
and what is used. For instance I'd expect the notifier chain
header. For IIO we follow IWYU roughly for all files.
I don't want to assume what is in mfd/macsmc.h given
that may change in subtle ways in future.
> +
> +enum {
> + LEFT_LIGHT = 0,
> + RIGHT_LIGHT
Add trailing comma. Whilst that may always be the last value
it's not a terminating style entry so we tend to assume
maybe one day something will come after it.
> +};
> +
> +struct macsmc_light {
> + struct apple_smc *smc;
> + struct notifier_block nb;
> + struct iio_dev *indio_dev;
> + u8 size;
Size of what? Can we have a more informative name?
> +};
> +
> +static int macsmc_light_read_raw(struct iio_dev *indio_dev,
> + const struct iio_chan_spec *chan,
> + int *val, int *val2, long mask)
> +
> +{
> + struct macsmc_light *drv = iio_priv(indio_dev);
> + u8 buffer[10];
> + int ret;
> +
> + if (mask != IIO_CHAN_INFO_RAW)
> + return -EINVAL;
> +
> + switch (chan->channel) {
> + case LEFT_LIGHT:
> + ret = apple_smc_read(drv->smc, SMC_KEY(ALV0), buffer, drv->size);
> + if (ret < 0)
> + return ret;
> +
> + if (drv->size == 10)
> + *val = be16_to_cpu(get_unaligned_be16(buffer + 6)) >> 10;
odd.... You only pull 4 bits from the buffer and they are all in one byte.
Why can't you do that without this dance via big endian conversions?
Also get_unaligned_be16() got you a value in cpu endian. If this were a
big endian CPU be16_to_cpu() would be a noop, but it's not. So this just
undid the endian handling and we are back to whatever the buffer ordering is.
> + else
> + *val = buffer[2];
> +
> + break;
> + case RIGHT_LIGHT:
> + if (drv->size == 10) {
> + *val = 0;
> + break;
> + }
> + ret = apple_smc_read(drv->smc, SMC_KEY(ALV1), buffer, drv->size);
> + if (ret < 0)
> + return ret;
> +
> + *val = buffer[2];
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return IIO_VAL_INT;
> +}
> +
> +static int macsmc_light_event(struct notifier_block *nb, unsigned long event, void *data)
> +{
> + struct macsmc_light *drv = container_of(nb, struct macsmc_light, nb);
struct iio_dev indio_dev = drv->indio_dev;
> + s64 timestamp = iio_get_time_ns(drv->indio_dev);
> +
> + /* check if event is for us */
> + if (event != 0x2A)
Give that a define in some common header...
> + return NOTIFY_DONE;
> +
> + iio_push_event(drv->indio_dev,
> + IIO_UNMOD_EVENT_CODE(IIO_LIGHT,
> + LEFT_LIGHT,
> + IIO_EV_TYPE_CHANGE,
> + IIO_EV_DIR_EITHER),
> + timestamp);
iio_push_event(indio_dev,
IIO_UNMOD_EVENT_CODE(IIO_LIGHT, LEFT_LIGHT,
IIO_EV_TYPE_CHANGE,
IIO_EV_DIR_EITHER),
timestamp);
> +
> + if (drv->size != 10) {
Why is size relevant? I'd add a comment, or a flag that names
what that means. I guess we have one signal for one or two
sensors depending on what is present? Then you are correct
to just signal them both.
> + iio_push_event(drv->indio_dev,
> + IIO_UNMOD_EVENT_CODE(IIO_LIGHT,
> + RIGHT_LIGHT,
> + IIO_EV_TYPE_CHANGE,
> + IIO_EV_DIR_EITHER),
> + timestamp);
> + }
> +
> + return NOTIFY_OK;
> +}
> +
> +static void macsmc_light_unregister_notifier(void *data)
> +{
> + struct macsmc_light *drv = data;
> +
> + blocking_notifier_chain_unregister(drv->smc->event_handlers,
> + &drv->nb);
> +}
> +
> +static const struct iio_event_spec macsmc_light_events[] = {
> + {
> + .type = IIO_EV_TYPE_CHANGE,
> + .dir = IIO_EV_DIR_EITHER,
> + .mask_separate = BIT(IIO_EV_INFO_ENABLE),
> + },
> +};
> +
> +static const struct iio_chan_spec macsmc_light_channels[] = {
> + {
> + .type = IIO_LIGHT,
> + .channel = LEFT_LIGHT,
> + .extend_name = "left",
No to extend_name. That's a piece of ancient bad design (was mind
so I can be rude ;). Use the read_label callback and provide labels
for the channels to indicate the equivalent info.
The extend_name thing makes a mess for standard userspace by putting
free form text into the middle of file names. Userspace folk
objected rather strongly to that a long time back :(
> + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> + .event_spec = macsmc_light_events,
> + .num_event_specs = ARRAY_SIZE(macsmc_light_events),
> + },
> + {
> + .type = IIO_LIGHT,
> + .channel = RIGHT_LIGHT,
> + .extend_name = "right",
> + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> + .event_spec = macsmc_light_events,
> + .num_event_specs = ARRAY_SIZE(macsmc_light_events),
> + },
> +};
> +
> +static const struct iio_info macsmc_light_info = {
> + .read_raw = macsmc_light_read_raw,
> +};
> +
> +static int macsmc_light_probe(struct platform_device *pdev)
> +{
There are enough uses of pdev->dev in here that I'd introduce
struct device *dev = &pdev->dev;
as the dev to use for devm calls.
> + struct iio_dev *indio_dev;
> + struct macsmc_light *drv;
> + struct apple_smc_key_info info;
> + int ret;
> +
> + indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*drv));
> + if (!indio_dev)
> + return -ENOMEM;
> +
> + drv = iio_priv(indio_dev);
> + drv->smc = dev_get_drvdata(pdev->dev.parent);
> +
> + ret = apple_smc_get_key_info(drv->smc, SMC_KEY(ALV0), &info);
> + if (ret < 0)
> + return -ENODEV;
> +
> + drv->size = info.size;
> + drv->indio_dev = indio_dev;
> + drv->nb.notifier_call = macsmc_light_event;
> + ret = blocking_notifier_chain_register(drv->smc->event_handlers, &drv->nb);
> + if (ret)
> + return ret;
> +
> + ret = devm_add_action_or_reset(&pdev->dev, macsmc_light_unregister_notifier, drv);
I wonder how many users there would be a devm_blocking_notifier_chain_register()
as it could be done more elegantly than this by stashing everything needed for
the unregister call. Perhaps not something for this patch set though.
> + if (ret)
> + return ret;
> +
> + indio_dev->name = "macsmc-light";
> + indio_dev->modes = INDIO_DIRECT_MODE;
> + indio_dev->info = &macsmc_light_info;
> + indio_dev->channels = macsmc_light_channels;
> + indio_dev->num_channels = ARRAY_SIZE(macsmc_light_channels);
> +
> + return devm_iio_device_register(&pdev->dev, indio_dev);
> +}
next prev parent reply other threads:[~2026-11-01 1:28 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 8:51 [RFC PATCH 00/14] Add macsmc support for Intel Macs, replacing applesmc Atharva Tiwari
2026-10-29 8:51 ` [RFC PATCH 01/14] treewide: Add backend for macsmc Atharva Tiwari
2026-10-29 9:20 ` sashiko-bot
2026-10-29 8:51 ` [RFC PATCH 02/14] platform/x86: add backend for macsmc in intel macs Atharva Tiwari
2026-10-29 9:23 ` sashiko-bot
2026-10-29 12:59 ` Ilpo Järvinen
2026-10-29 8:52 ` [RFC PATCH 03/14] watchdog: add driver for apple smc Atharva Tiwari
2026-10-29 9:17 ` sashiko-bot
2026-10-29 13:30 ` Andy Shevchenko
2026-10-29 8:52 ` [RFC PATCH 04/14] iio/light: add new driver for macsmc Atharva Tiwari
2026-10-29 9:17 ` sashiko-bot
2026-11-01 1:28 ` Jonathan Cameron [this message]
2026-10-29 8:52 ` [RFC PATCH 05/14] iio/accel: add driver for apple SMS Atharva Tiwari
2026-10-29 9:20 ` sashiko-bot
2026-11-01 1:35 ` Jonathan Cameron
2026-10-29 8:52 ` [RFC PATCH 06/14] leds: add support for macsmc kbl Atharva Tiwari
2026-10-29 9:16 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 07/14] rtc: add support for x86 macs in macsmc-rtc Atharva Tiwari
2026-10-29 9:15 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 08/14] treewide: Add a flag to detect the Apple T2 chip Atharva Tiwari
2026-10-29 9:11 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 09/14] treewide: disable other rtc's in t2 macs Atharva Tiwari
2026-10-29 9:16 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 10/14] power/supply: add support for x86 macs in macsmc-power Atharva Tiwari
2026-10-29 9:19 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 11/14] acpi: disable battery and adapter for x86 apple machines Atharva Tiwari
2026-10-29 9:13 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 12/14] hwmon/macsmc: add more types Atharva Tiwari
2026-10-29 9:18 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 13/14] hwmon: add support for x86 macs in macsmc-hwmon Atharva Tiwari
2026-10-29 9:20 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 14/14] mfd/macsmc: add ioctl to access smc keys Atharva Tiwari
2026-10-29 9:26 ` sashiko-bot
2026-11-01 1:38 ` Jonathan Cameron
2026-11-01 1:07 ` [RFC PATCH 00/14] Add macsmc support for Intel Macs, replacing applesmc Jonathan Cameron
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=20261101012812.3661789c@jic23-hlaptop \
--to=jic23@kernel.org \
--cc=alexandre.belloni@bootlin.com \
--cc=andy@kernel.org \
--cc=asahi@lists.linux.dev \
--cc=atharvatiwarilinuxdev@gmail.com \
--cc=bhelgaas@google.com \
--cc=bp@alien8.de \
--cc=brgl@kernel.org \
--cc=dave.hansen@linux.intel.com \
--cc=dlechner@baylibre.com \
--cc=dmitry.kasatkin@gmail.com \
--cc=eric.snowberg@oracle.com \
--cc=griffin@kroah.com \
--cc=hansg@kernel.org \
--cc=hpa@zytor.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=j@jannau.net \
--cc=jarkko@kernel.org \
--cc=jmorris@namei.org \
--cc=keyrings@vger.kernel.org \
--cc=lee@kernel.org \
--cc=lenb@kernel.org \
--cc=linusw@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-rtc@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=mfd@lists.linux.dev \
--cc=mingo@redhat.com \
--cc=neal@gompa.dev \
--cc=nuno.sa@analog.com \
--cc=paul@paul-moore.com \
--cc=pavel@kernel.org \
--cc=platform-driver-x86@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=roberto.sassu@huawei.com \
--cc=serge@hallyn.com \
--cc=sre@kernel.org \
--cc=sven@kernel.org \
--cc=tglx@kernel.org \
--cc=wim@linux-watchdog.org \
--cc=x86@kernel.org \
--cc=zohar@linux.ibm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox