.../bindings/iio/health/adi,max86150.yaml | 78 ++ MAINTAINERS | 7 + drivers/iio/health/Kconfig | 13 + drivers/iio/health/Makefile | 1 + drivers/iio/health/max86150.c | 691 ++++++++++++++++++ 5 files changed, 790 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/health/adi,max86150.yaml create mode 100644 drivers/iio/health/max86150.c
Sorry for the long gap since v9. Between then and now the driver's buffer implementation was rewritten from the kfifo-based design onto the standard IIO hardware-trigger and triggered-buffer framework, and I read through every open comment from every reviewer before sending this rather than sending again too quickly. I used AI assistance (Claude, Sonnet 5) while working through this, for understanding kernel conventions and cross-checking against subsystem patterns; that's disclosed via Assisted-by: Claude:claude-sonnet-5 tags on both patches per Documentation/process/coding-assistants.rst, and the design decisions and responsibility for what's here are mine. Both patches now build and link cleanly (make M=drivers/iio/health), checkpatch.pl reports 0 errors/0 warnings, and pahole confirms the driver's private struct is 56 bytes/1 cacheline with only the expected padding for timestamp alignment. Testing: booted a kernel with this driver under virtme-ng/QEMU against an i2c-stub device. Confirmed: probe correctly aborts with -ENODEV on a part-ID mismatch (stub registers default to 0) and correctly binds once the stub's PART_ID register is preset to 0x1E; the resulting IIO device exposes the expected in_intensity_red_raw/in_intensity_ir_raw/ in_voltage_raw channels; direct reads on those channels time out cleanly through the IIO_DEV_ACQUIRE_DIRECT_MODE()/regmap_read_poll_timeout() path (i2c-stub never asserts PPG_RDY, so a ~25ms ETIMEDOUT is expected, not a hang or crash); and module removal runs devm cleanup correctly (SYS_CTRL read back with SHDN set after unbind, clean rmmod). Not tested: i2c-stub has no interrupt line, so the actual interrupt-driven path (max86150_trigger_enable(), the threaded max86150_trigger_handler() FIFO drain, and buffer enable/disable) was not exercised. That's the part of this series with the most new logic and I don't have real hardware on hand to test it against; flagging this explicitly rather than implying full coverage. Changes since v9: - Rewrote the buffer implementation around devm_iio_trigger_alloc() + devm_iio_triggered_buffer_setup() instead of the kfifo buffer and manual postenable/predisable pair. The hard-irq handler now only reads and clears INT_STATUS1 before calling iio_trigger_poll(); the threaded trigger handler does the FIFO drain. This relies on the trigger core's own attach/detach synchronization instead of an explicit iio_buffer_enabled() guard or synchronize_irq(), which the old design needed to avoid a NULL active_scan_mask race on teardown (Sashiko, both HIGH severity findings) - Clear the stale A_FULL status bit before arming INT_ENABLE1, and clear stale PPG_RDY before polling in the direct-read path; both prevent a previously-latched flag from firing against garbage state (Sashiko HIGH; Joshua) - Use iio_get_time_ns(indio_dev) instead of ktime_get_ns() so timestamps respect the configured IIO clock source (Sashiko MEDIUM) - Zero the scan buffer before each push so disabled channels don't leak stale data (Sashiko LOW) - Added array_size.h, err.h, types.h; added a blank line before the iio/ include group (Andy Shevchenko, Joshua) - Dropped the free-standing FIFO_A_FULL_VAL/PPG_SR_100HZ/ADC_RGE_16384 single-value defines; inlined the FIFO threshold at its point of use with an explanatory comment, and listed the full set of PPG_SR (naming the single-/double-pulse variants) and PPG_ADC_RGE register values instead of just the one in use (Jonathan Cameron) - Removed the unneeded __aligned(IIO_DMA_MINALIGN) on the plain I2C FIFO read buffer -- that alignment is for the IIO DMA buffer path, not a bounce-buffer requirement I2C opts into (Jonathan Cameron) - Switched read_raw() to IIO_DEV_ACQUIRE_DIRECT_MODE()/ IIO_DEV_ACQUIRE_FAILED(), with the read logic pulled into a max86150_do_read_raw() helper (Jonathan Cameron) - Dropped irq_get_trigger_type(): the device has no register to reconfigure interrupt polarity or type, so IRQF_ONESHOT alone is sufficient (Jonathan Cameron) - Checked max86150_powerdown()'s regmap calls and log failures with dev_warn(); fixed it to use regmap_set_bits() instead of a plain regmap_write() for the shutdown bit so it no longer clobbers the rest of SYS_CTRL (Joshua) - Added blank lines between each regmap write + error-check block for readability (Joshua) - Declared the FIFO-drain loop variable at point of use (Joshua) - Added a datasheet-referenced comment and blank line around the SYS_RESET self-clear delay (Joshua) - Moved the sample_period_ns assignment next to the PPG_CONFIG1 write it's derived from, instead of sitting among unrelated LED_PA writes (Jonathan Cameron) - Trimmed the redundant "get/" from regulator failure messages, since devm_regulator_get_enable() is a single combined call (Joshua) - Fixed the MAINTAINERS entry to sort alphabetically among the other MAX-prefixed entries (Sashiko LOW) - Removed the Kconfig paragraph describing the driver's channels instead of the hardware (Joshua) - Added the avdd-supply and vref-supply properties and renamed vled-supply to leds-supply, to cover all four independent supply rails in the datasheet power tree (found while re-verifying the binding against the driver) - Fixed the DT binding example's interrupt flag from IRQ_TYPE_EDGE_FALLING to IRQ_TYPE_LEVEL_LOW to match the driver's actual level-triggered interrupt handling - Fixed .validate_trigger in iio_info to iio_validate_own_trigger(); the previous iio_trigger_validate_own_device() has its arguments in the opposite order and belongs on iio_trigger_ops.validate_device, where it's used correctly. Caught by actually building the module, not just reading the diff. - Threaded this series properly with git send-email --thread this time (Andy Shevchenko, Krzysztof Kozlowski) - Added Nuno S\ufffd\ufffd, Michael Hennerich and David Lechner to Cc, per scripts/get_maintainer.pl -- this is an Analog Devices part and I'd missed CCing ADI's own IIO maintainers on every version so far - Part-ID mismatch now aborts probe with dev_err_probe(dev, -ENODEV, ...) instead of logging and continuing. This goes beyond the dev_info() vs dev_warn() log-level question raised in review: a mismatched part ID means we're either talking to the wrong device or something on the bus is wrong, and running chip_init() writes against an unverified chip seemed like the riskier default (Joshua) Md Shofiqul Islam (2): dt-bindings: iio: health: add adi,max86150 iio: health: add MAX86150 ECG and PPG biosensor driver .../bindings/iio/health/adi,max86150.yaml | 78 ++ MAINTAINERS | 7 + drivers/iio/health/Kconfig | 13 + drivers/iio/health/Makefile | 1 + drivers/iio/health/max86150.c | 691 ++++++++++++++++++ 5 files changed, 790 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/health/adi,max86150.yaml create mode 100644 drivers/iio/health/max86150.c -- 2.51.1
On Fri, 2026-07-17 at 23:11 +0300, Md Shofiqul Islam wrote: > Sorry for the long gap since v9. Between then and now the driver's > buffer implementation was rewritten from the kfifo-based design onto > the standard IIO hardware-trigger and triggered-buffer framework, and > I read through every open comment from every reviewer before sending > this rather than sending again too quickly. > ... > > Changes since v9: > - Rewrote the buffer implementation around devm_iio_trigger_alloc() + > devm_iio_triggered_buffer_setup() instead of the kfifo buffer and > manual postenable/predisable pair. The hard-irq handler now only > reads and clears INT_STATUS1 before calling iio_trigger_poll(); > the threaded trigger handler does the FIFO drain. This relies on > the trigger core's own attach/detach synchronization instead of an > explicit iio_buffer_enabled() guard or synchronize_irq(), which the > old design needed to avoid a NULL active_scan_mask race on teardown > (Sashiko, both HIGH severity findings) > ... > > -- > 2.51.1 Not sure if it was said already, but please include change log from older versions too. You could keep the description short, and include Links to each version as well. It is difficult to hunt them down one by one from lore. Also, don't send "To" a list. send your patches to Maintainers and Cc Reviewers and lists. -- Best regards, Sirat
© 2016 - 2026 Red Hat, Inc.