[PATCH v4 3/3] gnss: ubx: add support for the reset gpio

From: Wolfram Sang
Date: Fri Nov 03 2023 - 18:56:28 EST


The Renesas KingFisher board includes a U-Blox Neo-M8 chip. This chip
has a reset pin which is also wired on the board. Add code to the driver
to support this reset pin. Because my GNSS device is hooked up via UART
and I2C simultaneously, I could verify functionality by opening/closing
the GNSS device using UART and see if the corresponding I2C device was
visible on the bus.

Signed-off-by: Wolfram Sang <wsa+renesas@xxxxxxxxxxxxxxxxxxxx>
Reviewed-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
---
drivers/gnss/ubx.c | 13 +++++++++++++
1 file changed, 13 insertions(+)

diff --git a/drivers/gnss/ubx.c b/drivers/gnss/ubx.c
index 9b76b101ba5e..e7d151cbc8c3 100644
--- a/drivers/gnss/ubx.c
+++ b/drivers/gnss/ubx.c
@@ -7,6 +7,7 @@

#include <linux/errno.h>
#include <linux/gnss.h>
+#include <linux/gpio/consumer.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
@@ -18,6 +19,7 @@

struct ubx_data {
struct regulator *vcc;
+ struct gpio_desc *reset_gpio;
};

static int ubx_set_active(struct gnss_serial *gserial)
@@ -29,6 +31,8 @@ static int ubx_set_active(struct gnss_serial *gserial)
if (ret)
return ret;

+ gpiod_set_value_cansleep(data->reset_gpio, 0);
+
return 0;
}

@@ -37,6 +41,8 @@ static int ubx_set_standby(struct gnss_serial *gserial)
struct ubx_data *data = gnss_serial_get_drvdata(gserial);
int ret;

+ gpiod_set_value_cansleep(data->reset_gpio, 1);
+
ret = regulator_disable(data->vcc);
if (ret)
return ret;
@@ -90,6 +96,13 @@ static int ubx_probe(struct serdev_device *serdev)
if (ret < 0 && ret != -ENODEV)
goto err_free_gserial;

+ /* Start with reset asserted */
+ data->reset_gpio = devm_gpiod_get_optional(&serdev->dev, "reset", GPIOD_OUT_HIGH);
+ if (IS_ERR(data->reset_gpio)) {
+ ret = PTR_ERR(data->reset_gpio);
+ goto err_free_gserial;
+ }
+
ret = gnss_serial_register(gserial);
if (ret)
goto err_free_gserial;
--
2.35.1