2022-05-11 02:21:19

by Markuss Broks

[permalink] [raw]
Subject: [PATCH 0/5] Add support for ToF sensor on Yoshino platform

This series adds support for the ToF proximity sensor installed on
Yoshino devices. As part of this series, support handling the reset
GPIO and VDD supply by the VL53L0X driver. Also stop hardcoding the
interrupt type, since on Yoshino devices it seems that edge triggering
doesn't work properly.

Tested on Sony Xperia XZ1 (poplar).

Cc: Konrad Dybcio <[email protected]>
Cc: Marijn Suijten <[email protected]>
Cc: AngeloGioacchino Del Regno <[email protected]>

Markuss Broks (5):
dt-bindings: proximity: vl53l0x: Document optional supply and GPIO
properties
proximity: vl53l0x: Get interrupt type from DT
proximity: vl53l0x: Handle the VDD regulator
proximity: vl53l0x: Handle the reset GPIO
arm64: dts: qcom: msm8998-xperia: Introduce ToF sensor support

.../bindings/iio/proximity/st,vl53l0x.yaml | 5 ++
.../dts/qcom/msm8998-sony-xperia-yoshino.dtsi | 34 +++++++++++++
drivers/iio/proximity/vl53l0x-i2c.c | 50 ++++++++++++++++++-
3 files changed, 88 insertions(+), 1 deletion(-)

--
2.35.1



2022-05-11 06:50:00

by Markuss Broks

[permalink] [raw]
Subject: [PATCH 4/5] proximity: vl53l0x: Handle the reset GPIO

Handle the GPIO connected to the XSHUT/RST_N pin of VL53L0X.

Signed-off-by: Markuss Broks <[email protected]>
---
drivers/iio/proximity/vl53l0x-i2c.c | 11 +++++++++++
1 file changed, 11 insertions(+)

diff --git a/drivers/iio/proximity/vl53l0x-i2c.c b/drivers/iio/proximity/vl53l0x-i2c.c
index 74aeb2548ef6..47022bc1504e 100644
--- a/drivers/iio/proximity/vl53l0x-i2c.c
+++ b/drivers/iio/proximity/vl53l0x-i2c.c
@@ -15,6 +15,7 @@
*/

#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/module.h>
@@ -43,6 +44,7 @@ struct vl53l0x_data {
struct i2c_client *client;
struct completion completion;
struct regulator *vdd_supply;
+ struct gpio_desc *reset_gpio;
};

static irqreturn_t vl53l0x_handle_irq(int irq, void *priv)
@@ -192,6 +194,8 @@ static void vl53l0x_power_off(void *_data)
{
struct vl53l0x_data *data = _data;

+ gpiod_set_value_cansleep(data->reset_gpio, 1);
+
regulator_disable(data->vdd_supply);
}

@@ -203,6 +207,8 @@ static int vl53l0x_power_on(struct vl53l0x_data *data)
if (ret)
return ret;

+ gpiod_set_value_cansleep(data->reset_gpio, 0);
+
usleep_range(3200, 5000);

return 0;
@@ -232,6 +238,11 @@ static int vl53l0x_probe(struct i2c_client *client)
return dev_err_probe(&client->dev, PTR_ERR(data->vdd_supply),
"Unable to get VDD regulator\n");

+ data->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_OUT_HIGH);
+ if (IS_ERR(data->reset_gpio))
+ return dev_err_probe(&client->dev, PTR_ERR(data->reset_gpio),
+ "Cannot get reset GPIO\n");
+
error = devm_add_action_or_reset(&client->dev, vl53l0x_power_off, data);
if (error)
return dev_err_probe(&client->dev, error,
--
2.35.1


2022-05-11 08:54:53

by Markuss Broks

[permalink] [raw]
Subject: [PATCH 3/5] proximity: vl53l0x: Handle the VDD regulator

Handle the regulator supplying the VDD pin of VL53L0X.

Signed-off-by: Markuss Broks <[email protected]>
---
drivers/iio/proximity/vl53l0x-i2c.c | 37 +++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)

diff --git a/drivers/iio/proximity/vl53l0x-i2c.c b/drivers/iio/proximity/vl53l0x-i2c.c
index 16f809c479cb..74aeb2548ef6 100644
--- a/drivers/iio/proximity/vl53l0x-i2c.c
+++ b/drivers/iio/proximity/vl53l0x-i2c.c
@@ -42,6 +42,7 @@
struct vl53l0x_data {
struct i2c_client *client;
struct completion completion;
+ struct regulator *vdd_supply;
};

static irqreturn_t vl53l0x_handle_irq(int irq, void *priv)
@@ -187,10 +188,31 @@ static const struct iio_info vl53l0x_info = {
.read_raw = vl53l0x_read_raw,
};

+static void vl53l0x_power_off(void *_data)
+{
+ struct vl53l0x_data *data = _data;
+
+ regulator_disable(data->vdd_supply);
+}
+
+static int vl53l0x_power_on(struct vl53l0x_data *data)
+{
+ int ret;
+
+ ret = regulator_enable(data->vdd_supply);
+ if (ret)
+ return ret;
+
+ usleep_range(3200, 5000);
+
+ return 0;
+}
+
static int vl53l0x_probe(struct i2c_client *client)
{
struct vl53l0x_data *data;
struct iio_dev *indio_dev;
+ int error;

indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
if (!indio_dev)
@@ -205,6 +227,21 @@ static int vl53l0x_probe(struct i2c_client *client)
I2C_FUNC_SMBUS_BYTE_DATA))
return -EOPNOTSUPP;

+ data->vdd_supply = devm_regulator_get_optional(&client->dev, "vdd");
+ if (IS_ERR(data->vdd_supply))
+ return dev_err_probe(&client->dev, PTR_ERR(data->vdd_supply),
+ "Unable to get VDD regulator\n");
+
+ error = devm_add_action_or_reset(&client->dev, vl53l0x_power_off, data);
+ if (error)
+ return dev_err_probe(&client->dev, error,
+ "Failed to install poweroff action\n");
+
+ error = vl53l0x_power_on(data);
+ if (error)
+ return dev_err_probe(&client->dev, error,
+ "Failed to power on the chip\n");
+
indio_dev->name = "vl53l0x";
indio_dev->info = &vl53l0x_info;
indio_dev->channels = vl53l0x_channels;
--
2.35.1


2022-05-11 09:13:39

by Markuss Broks

[permalink] [raw]
Subject: [PATCH 2/5] proximity: vl53l0x: Get interrupt type from DT

On some boards interrupt type might be different than TRIGGER_FALLING,
like hardcoded in driver. Leave interrupt flags as they were pre-configured
from the device-tree.

Signed-off-by: Markuss Broks <[email protected]>
---
drivers/iio/proximity/vl53l0x-i2c.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/iio/proximity/vl53l0x-i2c.c b/drivers/iio/proximity/vl53l0x-i2c.c
index 661a79ea200d..16f809c479cb 100644
--- a/drivers/iio/proximity/vl53l0x-i2c.c
+++ b/drivers/iio/proximity/vl53l0x-i2c.c
@@ -61,7 +61,7 @@ static int vl53l0x_configure_irq(struct i2c_client *client,
int ret;

ret = devm_request_irq(&client->dev, client->irq, vl53l0x_handle_irq,
- IRQF_TRIGGER_FALLING, indio_dev->name, indio_dev);
+ 0, indio_dev->name, indio_dev);
if (ret) {
dev_err(&client->dev, "devm_request_irq error: %d\n", ret);
return ret;
--
2.35.1


2022-05-11 09:55:52

by Markuss Broks

[permalink] [raw]
Subject: [PATCH 1/5] dt-bindings: proximity: vl53l0x: Document optional supply and GPIO properties

This patch adds the optional properties for the VL53L0X ToF sensor to the
device-tree binding.

Signed-off-by: Markuss Broks <[email protected]>
---
.../devicetree/bindings/iio/proximity/st,vl53l0x.yaml | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/Documentation/devicetree/bindings/iio/proximity/st,vl53l0x.yaml b/Documentation/devicetree/bindings/iio/proximity/st,vl53l0x.yaml
index 656460d9d8c8..322befc41de6 100644
--- a/Documentation/devicetree/bindings/iio/proximity/st,vl53l0x.yaml
+++ b/Documentation/devicetree/bindings/iio/proximity/st,vl53l0x.yaml
@@ -19,6 +19,11 @@ properties:
interrupts:
maxItems: 1

+ reset-gpios:
+ maxItems: 1
+
+ vdd-supply: true
+
required:
- compatible
- reg
--
2.35.1