2022-05-12 20:57:42

by Markuss Broks

[permalink] [raw]
Subject: [PATCH v2 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]>

v2:
- Fix a nasty issue: turns out grouping the pinctrl makes it not apply,
which was the main cause of edge interrupts not working correctly and
having to use level interrupts, which caused a large amount of false
detections.
- handle the irq type more gracefully: if it's not provided, default
to falling edge, but if it's provided, then use the provided one.

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-12 23:08:21

by Markuss Broks

[permalink] [raw]
Subject: [PATCH v2 5/5] arm64: dts: qcom: msm8998-xperia: Introduce ToF sensor support

This patch adds device tree support for the VL53L0X ToF sensor
found on all Yoshino devices.

Signed-off-by: Markuss Broks <[email protected]>
---
.../dts/qcom/msm8998-sony-xperia-yoshino.dtsi | 33 +++++++++++++++++++
1 file changed, 33 insertions(+)

diff --git a/arch/arm64/boot/dts/qcom/msm8998-sony-xperia-yoshino.dtsi b/arch/arm64/boot/dts/qcom/msm8998-sony-xperia-yoshino.dtsi
index 47488a1aecae..a95fa29aa18b 100644
--- a/arch/arm64/boot/dts/qcom/msm8998-sony-xperia-yoshino.dtsi
+++ b/arch/arm64/boot/dts/qcom/msm8998-sony-xperia-yoshino.dtsi
@@ -245,6 +245,24 @@ &blsp2_uart1 {
status = "okay";
};

+&blsp2_i2c2 {
+ status = "okay";
+
+ proximity@29 {
+ compatible = "st,vl53l0x";
+ reg = <0x29>;
+
+ interrupt-parent = <&tlmm>;
+ interrupts = <22 IRQ_TYPE_EDGE_FALLING>;
+
+ reset-gpios = <&tlmm 27 GPIO_ACTIVE_LOW>;
+ vdd-supply = <&cam_vio_vreg>;
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&tof_int &tof_reset>;
+ };
+};
+
&ibb {
regulator-min-microamp = <800000>;
regulator-max-microamp = <800000>;
@@ -621,6 +639,21 @@ hall_sensor0_default: acc-cover-open {
input-enable;
};

+ tof_int: tof-int {
+ pins = "gpio22";
+ function = "gpio";
+ bias-pull-up;
+ drive-strength = <2>;
+ input-enable;
+ };
+
+ tof_reset: tof-reset {
+ pins = "gpio27";
+ function = "gpio";
+ bias-disable;
+ drive-strength = <2>;
+ };
+
ts_int_n: ts-int-n {
pins = "gpio125";
function = "gpio";
--
2.36.1


2022-05-13 19:22:46

by Markuss Broks

[permalink] [raw]
Subject: [PATCH v2 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.36.1


2022-05-14 02:36:06

by Krzysztof Kozlowski

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

On 11/05/2022 23:47, Markuss Broks wrote:
> This patch adds the optional properties for the VL53L0X ToF sensor to the
> device-tree binding.

No "this patch":
https://elixir.bootlin.com/linux/v5.17.1/source/Documentation/process/submitting-patches.rst#L95

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


Acked-by: Krzysztof Kozlowski <[email protected]>

Best regards,
Krzysztof

2022-05-14 02:43:11

by Markuss Broks

[permalink] [raw]
Subject: [PATCH v2 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 ef2c063dfa1c..e65c4fcd32d6 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)
@@ -191,10 +192,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)
@@ -209,6 +231,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.36.1


2022-05-14 03:27:31

by Markuss Broks

[permalink] [raw]
Subject: [PATCH v2 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 e65c4fcd32d6..7aa9c1e95006 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)
@@ -196,6 +198,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);
}

@@ -207,6 +211,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;
@@ -236,6 +242,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.36.1