@@ -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;
@@ -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:
@@ -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);
@@ -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;
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 <lollivier@baylibre.com> --- 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(-)