The default serial speed was hardcoded in the code.
Rename current-speed to default-speed.
Add a function parameter that lets the subdrivers specify their
default speed.
If not specified fallback to the device-tree default-speed.

Signed-off-by: Loys Ollivier <[email protected]>
---
 drivers/gnss/mtk.c    |  6 +++++-
 drivers/gnss/serial.c | 21 +++++++++++++--------
 drivers/gnss/serial.h |  3 ++-
 drivers/gnss/ubx.c    |  3 ++-
 4 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/drivers/gnss/mtk.c b/drivers/gnss/mtk.c
index d1fc55560daf..a1a89f0cc75c 100644
--- a/drivers/gnss/mtk.c
+++ b/drivers/gnss/mtk.c
@@ -16,6 +16,10 @@
 
 #include "serial.h"
 
+static uint serial_speed = 9600; /* Serial speed (baud rate) */
+module_param(serial_speed, uint, 0644);
+MODULE_PARM_DESC(serial_speed, "Serial baud rate (bit/s), (default = 9600)");
+
 struct mtk_data {
        struct regulator *vbackup;
        struct regulator *vcc;
@@ -69,7 +73,7 @@ static int mtk_probe(struct serdev_device *serdev)
        struct mtk_data *data;
        int ret;
 
-       gserial = gnss_serial_allocate(serdev, sizeof(*data));
+       gserial = gnss_serial_allocate(serdev, sizeof(*data), serial_speed);
        if (IS_ERR(gserial)) {
                ret = PTR_ERR(gserial);
                return ret;
diff --git a/drivers/gnss/serial.c b/drivers/gnss/serial.c
index def64b36d994..706fc5b46811 100644
--- a/drivers/gnss/serial.c
+++ b/drivers/gnss/serial.c
@@ -103,17 +103,13 @@ static int gnss_serial_set_power(struct gnss_serial 
*gserial,
        return gserial->ops->set_power(gserial, state);
 }
 
-/*
- * FIXME: need to provide subdriver defaults or separate dt parsing from
- * allocation.
- */
 static int gnss_serial_parse_dt(struct serdev_device *serdev)
 {
        struct gnss_serial *gserial = serdev_device_get_drvdata(serdev);
        struct device_node *node = serdev->dev.of_node;
-       u32 speed = 4800;
+       uint speed;
 
-       of_property_read_u32(node, "current-speed", &speed);
+       of_property_read_u32(node, "default-speed", &speed);
 
        gserial->speed = speed;
 
@@ -121,7 +117,8 @@ static int gnss_serial_parse_dt(struct serdev_device 
*serdev)
 }
 
 struct gnss_serial *gnss_serial_allocate(struct serdev_device *serdev,
-                                               size_t data_size)
+                                        size_t data_size,
+                                        uint serial_speed)
 {
        struct gnss_serial *gserial;
        struct gnss_device *gdev;
@@ -146,10 +143,18 @@ struct gnss_serial *gnss_serial_allocate(struct 
serdev_device *serdev,
        serdev_device_set_drvdata(serdev, gserial);
        serdev_device_set_client_ops(serdev, &gnss_serial_serdev_ops);
 
-       ret = gnss_serial_parse_dt(serdev);
+       /* Serial speed provided by subdriver takes precedence over dt*/
+       if (!serial_speed)
+               ret = gnss_serial_parse_dt(serdev);
+       else
+               gserial->speed = serial_speed;
+
        if (ret)
                goto err_put_device;
 
+       if (!gserial->speed)
+               return -EINVAL;
+
        return gserial;
 
 err_put_device:
diff --git a/drivers/gnss/serial.h b/drivers/gnss/serial.h
index 980ffdc86c2a..29212b57a739 100644
--- a/drivers/gnss/serial.h
+++ b/drivers/gnss/serial.h
@@ -33,7 +33,8 @@ struct gnss_serial_ops {
 extern const struct dev_pm_ops gnss_serial_pm_ops;
 
 struct gnss_serial *gnss_serial_allocate(struct serdev_device *gserial,
-                                               size_t data_size);
+                                        size_t data_size,
+                                        uint serial_speed);
 void gnss_serial_free(struct gnss_serial *gserial);
 
 int gnss_serial_register(struct gnss_serial *gserial);
diff --git a/drivers/gnss/ubx.c b/drivers/gnss/ubx.c
index 12568aebb7f6..6cfcb2eebdfd 100644
--- a/drivers/gnss/ubx.c
+++ b/drivers/gnss/ubx.c
@@ -68,8 +68,9 @@ static int ubx_probe(struct serdev_device *serdev)
        struct gnss_serial *gserial;
        struct ubx_data *data;
        int ret;
+       uint speed = 4800;
 
-       gserial = gnss_serial_allocate(serdev, sizeof(*data));
+       gserial = gnss_serial_allocate(serdev, sizeof(*data), speed);
        if (IS_ERR(gserial)) {
                ret = PTR_ERR(gserial);
                return ret;
-- 
2.7.4

Reply via email to