.../bindings/iio/proximity/st,vl53l0x.yaml | 13 +- MAINTAINERS | 7 + drivers/iio/proximity/Kconfig | 15 + drivers/iio/proximity/Makefile | 1 + drivers/iio/proximity/vl53l1x-i2c.c | 795 ++++++++++++++++++ 5 files changed, 828 insertions(+), 3 deletions(-) create mode 100644 drivers/iio/proximity/vl53l1x-i2c.c
This series adds support for the STMicroelectronics VL53L1X Time-of-Flight ranging sensor. The VL53L1X is a ToF laser-ranging sensor with I2C interface, capable of measuring distances up to 4 meters. The driver supports both interrupt-driven and polled operation. Why a separate driver is needed (instead of extending vl53l0x-i2c.c): The VL53L1X is fundamentally different from the VL53L0X despite the similar naming. Extending the existing driver would require rewriting the majority of it. Key differences include: - A different register map (16-bit addresses vs. 8-bit addresses). - Requires a 91-byte firmware configuration blob to be loaded at boot. - Requires a VHV calibration cycle. - Has distance mode and timing budget configurations. - Uses the regmap API rather than raw i2c_smbus calls. I also reviewed other drivers in drivers/iio/proximity/ and can confirm this IP block does not appear to be shared by any other existing driver. Tested on Raspberry Pi 5 with a VL53L1X breakout board. Note on vdd-supply: vdd-supply is now required. The VL53L0X required a physical regulator, but it did not specify the requirement in the binding. It should have always been there. The VL53L1X also requires it. Hence I added the requirement. --- Changes in v7: - Add VL53L1X_REG_ prefix for register defines. - Use iio_push_to_buffers_with_ts(). - Use continuous ranging and drop postenable/predisable. - Add comments for XSHUT reset, default config values. - Drop vdd-supply description in binding and comment in driver. - Add ABI rationale for vdd-supply to commit message (per Krzysztof, Jonathan). Changes in v6: - Make vdd-supply required. Add descriptions to vdd-supply and reset-gpios (per Jonathan). - Check reset_control_deassert() return value (per Andy). - Use volatile table for result registers and caching for the rest. Also mark write-only registers. Changes in v5: - Patch 1: No changes. Collected Reviewed-by tag from Krzysztof Kozlowski. - Switch XSHUT pin handling from the GPIO consumer API to the Reset controller API. - Drop <linux/gpio/consumer.h> and include <linux/reset.h>. Changes in v4: - Move i2c_check_functionality() to the top of probe before allocations. - Use struct u32_fract for oscillator correction math. - Explicitly set .cache_type = REGCACHE_NONE. - Document intentional predisable drain - Use dev_err_probe() for firmware boot timeout and remove duplicate IRQ request error message. - Use sizeof() in regmap bulk read/writes instead of hardcoded lengths. - Add missing headers (<linux/math.h>, <linux/time.h>, <asm/byteorder.h>). - Various formatting cleanups per Andy's review. Changes in v3: - Merge DT binding into existing st,vl53l0x.yaml (per Krzysztof). - Use "reset-gpios" in the binding but xshut_gpio in the driver since that's the actual pin name. - Replace manual polling loops in chip_init and read_proximity with regmap_read_poll_timeout(). - Remove irq_get_trigger_type() and pass IRQF_NO_THREAD directly (per Andy). - Drop struct i2c_client from private data and store irq as int instead. Derive struct device from regmap where needed. - Add dev_err_probe() to first devm_request_irq() error path. - Replace linux/device.h with linux/dev_printk.h, add linux/array_size.h, linux/err.h, linux/types.h (per Andy). - Use USEC_PER_MSEC for poll timeouts. - Remove unnecessary casts. - Divide long config blob to 8 values per line. - Rename goto label to notify_and_clear_irq and drop unused dev_dbg. - Add datasheet section reference for boot delay comment. - vdd-supply no longer required in shared binding to avoid breaking existing st,vl53l0x devicetrees. Changes in v2: - Skip software reset in chip_init when xshut GPIO is available, since the device was already hardware-reset during power-on. - Rename "reset" GPIO to "xshut" to match the datasheet pin name and updated DT binding accordingly. - Make vdd-supply required in DT binding. - Use reg_sequence arrays and regmap_multi_reg_write() for distance mode configuration. - Switch to a hardirq handler with iio_trigger_poll() and IRQF_NO_THREAD instead of a threaded handler. - Drop IRQF_TRIGGER_FALLING fallback. Leave trigger type to firmware/DT. - Use iio_validate_own_trigger() instead of a custom validate_trigger, drop trig pointer from driver data. - Switch usleep_range() to fsleep() throughout and add comments for sleep values. - Don't fail probe on unknown model ID, just log with dev_info(). - Split stop_ranging cleanup into its own devm action, separate from power_off. - Add missing includes: device.h, bitfield.h, completion.h, mod_devicetable.h. - Use FIELD_GET() for range status checks. - Move configure_irq() closer to probe(), use dev_err_probe() for its error paths. - Fix buffer ops symmetry: postdisable -> predisable. - Drop reg_format_endian from regmap config. - Various alignment and formatting fixes. Link to v6: https://lore.kernel.org/linux-iio/20260319190738.151614-1-email@sirat.me Link to v5: https://lore.kernel.org/linux-iio/20260313113737.151881-1-email@sirat.me Link to v4: https://lore.kernel.org/linux-iio/20260312183721.40482-1-email@sirat.me Link to v3: https://lore.kernel.org/linux-iio/20260311224044.21480-1-email@sirat.me Link to v2: https://lore.kernel.org/linux-iio/20260308113728.40860-1-email@sirat.me Link to v1: https://lore.kernel.org/linux-iio/20260303090253.42076-1-email@sirat.me Siratul Islam (2): dt-bindings: iio: proximity: add ST VL53L1X ToF sensor iio: proximity: add driver for ST VL53L1X ToF sensor .../bindings/iio/proximity/st,vl53l0x.yaml | 13 +- MAINTAINERS | 7 + drivers/iio/proximity/Kconfig | 15 + drivers/iio/proximity/Makefile | 1 + drivers/iio/proximity/vl53l1x-i2c.c | 795 ++++++++++++++++++ 5 files changed, 828 insertions(+), 3 deletions(-) create mode 100644 drivers/iio/proximity/vl53l1x-i2c.c -- 2.53.0
On Wed, Mar 25, 2026 at 12:32:21PM +0600, Siratul Islam wrote: > This series adds support for the STMicroelectronics VL53L1X > Time-of-Flight ranging sensor. > > The VL53L1X is a ToF laser-ranging sensor with I2C interface, > capable of measuring distances up to 4 meters. The driver > supports both interrupt-driven and polled operation. > > Why a separate driver is needed (instead of extending vl53l0x-i2c.c): > The VL53L1X is fundamentally different from the VL53L0X despite the > similar naming. Extending the existing driver would require rewriting > the majority of it. > > Key differences include: > - A different register map (16-bit addresses vs. 8-bit addresses). > - Requires a 91-byte firmware configuration blob to be loaded at boot. > - Requires a VHV calibration cycle. > - Has distance mode and timing budget configurations. > - Uses the regmap API rather than raw i2c_smbus calls. > > I also reviewed other drivers in drivers/iio/proximity/ and can > confirm this IP block does not appear to be shared by any other > existing driver. > > Tested on Raspberry Pi 5 with a VL53L1X breakout board. > > Note on vdd-supply: > vdd-supply is now required. The VL53L0X required a physical > regulator, but it did not specify the requirement in the binding. > It should have always been there. The VL53L1X also requires it. > Hence I added the requirement. > > --- > Changes in v7: > - Add VL53L1X_REG_ prefix for register defines. > - Use iio_push_to_buffers_with_ts(). > - Use continuous ranging and drop postenable/predisable. > - Add comments for XSHUT reset, default config values. > - Drop vdd-supply description in binding and comment in driver. > - Add ABI rationale for vdd-supply to commit message (per Krzysztof, Jonathan). > > > Changes in v6: > - Make vdd-supply required. Add descriptions to vdd-supply and reset-gpios (per Jonathan). > - Check reset_control_deassert() return value (per Andy). > - Use volatile table for result registers and caching for the rest. Also mark write-only registers. So where did you explain dropping tag as I requested? Did you read the exact paragraph I asked you to read? Best regards, Krzysztof
On Wed, Mar 25, 2026 at 1:55 PM Krzysztof Kozlowski <krzk@kernel.org> wrote: > > On Wed, Mar 25, 2026 at 12:32:21PM +0600, Siratul Islam wrote: ... > > --- > > Changes in v7: > > - Add VL53L1X_REG_ prefix for register defines. > > - Use iio_push_to_buffers_with_ts(). > > - Use continuous ranging and drop postenable/predisable. > > - Add comments for XSHUT reset, default config values. > > - Drop vdd-supply description in binding and comment in driver. > > - Add ABI rationale for vdd-supply to commit message (per Krzysztof, Jonathan). > > > > > > Changes in v6: > > - Make vdd-supply required. Add descriptions to vdd-supply and reset-gpios (per Jonathan). > > - Check reset_control_deassert() return value (per Andy). > > - Use volatile table for result registers and caching for the rest. Also mark write-only registers. > > So where did you explain dropping tag as I requested? Did you read the > exact paragraph I asked you to read? > I dropped the tag in v6 and I was not sure if it was ok to modify the changelog of v6 when sending v7. But I will keep this in mind. Thanks, Sirat
© 2016 - 2026 Red Hat, Inc.