[PATCH v8 0/2] iio: proximity: add driver for ST VL53L1X ToF sensor

Siratul Islam posted 2 patches 1 week, 1 day ago
.../bindings/iio/proximity/st,vl53l0x.yaml    |  24 +-
MAINTAINERS                                   |   7 +
drivers/iio/proximity/Kconfig                 |  15 +
drivers/iio/proximity/Makefile                |   1 +
drivers/iio/proximity/vl53l1x-i2c.c           | 756 ++++++++++++++++++
5 files changed, 800 insertions(+), 3 deletions(-)
create mode 100644 drivers/iio/proximity/vl53l1x-i2c.c
[PATCH v8 0/2] iio: proximity: add driver for ST VL53L1X ToF sensor
Posted by Siratul Islam 1 week, 1 day ago
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 required for st,vl53l1x. It is not globally required
for backwards compatibility with existing st,vl53l0x devicetrees
that omit it.

---
Changes in v8:
- Use devm_regulator_get_enable() and devm_reset_control_get_optional_exclusive_deasserted().
- Drop i2c_check_functionality().
- Remove power_on/power_off helpers.
- Require vdd-supply only for st,vl53l1x.


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.
- Drop tag from Krzysztof Kozlowski for vdd-supply requirement change.

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 v7: https://lore.kernel.org/linux-iio/20260325063254.18062-1-email@sirat.me
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    |  24 +-
 MAINTAINERS                                   |   7 +
 drivers/iio/proximity/Kconfig                 |  15 +
 drivers/iio/proximity/Makefile                |   1 +
 drivers/iio/proximity/vl53l1x-i2c.c           | 756 ++++++++++++++++++
 5 files changed, 800 insertions(+), 3 deletions(-)
 create mode 100644 drivers/iio/proximity/vl53l1x-i2c.c

--
2.53.0
Re: [PATCH v8 0/2] iio: proximity: add driver for ST VL53L1X ToF sensor
Posted by Jonathan Cameron 1 week ago
On Thu, 26 Mar 2026 02:19:40 +0600
Siratul Islam <email@sirat.me> 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 required for st,vl53l1x. It is not globally required
> for backwards compatibility with existing st,vl53l0x devicetrees
> that omit it.
Applied to the testing branch of iio.git.

Thanks,

J
> 
> ---
> Changes in v8:
> - Use devm_regulator_get_enable() and devm_reset_control_get_optional_exclusive_deasserted().
> - Drop i2c_check_functionality().
> - Remove power_on/power_off helpers.
> - Require vdd-supply only for st,vl53l1x.
> 
> 
> 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.
> - Drop tag from Krzysztof Kozlowski for vdd-supply requirement change.
> 
> 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 v7: https://lore.kernel.org/linux-iio/20260325063254.18062-1-email@sirat.me
> 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    |  24 +-
>  MAINTAINERS                                   |   7 +
>  drivers/iio/proximity/Kconfig                 |  15 +
>  drivers/iio/proximity/Makefile                |   1 +
>  drivers/iio/proximity/vl53l1x-i2c.c           | 756 ++++++++++++++++++
>  5 files changed, 800 insertions(+), 3 deletions(-)
>  create mode 100644 drivers/iio/proximity/vl53l1x-i2c.c
> 
> --
> 2.53.0
> 
>
Re: [PATCH v8 0/2] iio: proximity: add driver for ST VL53L1X ToF sensor
Posted by Sirat 1 week ago
On Thu, Mar 26, 2026 at 2:25 PM Jonathan Cameron <jic23@kernel.org> wrote:
>
> On Thu, 26 Mar 2026 02:19:40 +0600
> Siratul Islam <email@sirat.me> wrote:
>
...
> Applied to the testing branch of iio.git.
>
> Thanks,
>
> J

Thanks for applying the patch. Thanks to you and all the reviewers.
The code it ended up becoming is much superior to what I initially
had.

Best regards
Sirat