Skip to content

Commit

Permalink
BACKPORT: gnss: add receiver type support
Browse files Browse the repository at this point in the history
Add a "type" device attribute and a "GNSS_TYPE" uevent variable which
can be used to determine the type of a GNSS receiver. The currently
identified types reflect the protocol(s) supported by a receiver:

	"NMEA"	NMEA 0183
	"SiRF"	SiRF Binary
	"UBX"	UBX

Note that both SiRF and UBX type receivers typically support a subset of
NMEA 0183 with vendor extensions (e.g. to allow switching to the vendor
protocol).

Signed-off-by: Johan Hovold <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
(cherry picked from commit 10f146639fee5ffaf7cf0081c1af518f7d0c533c)
[adelva: dropped changes to drivers that were not backported]
Bug: 146062677
Change-Id: Id272aaa9aa59df41d5d94014edc835f242e719a6
Signed-off-by: Alistair Delva <[email protected]>
  • Loading branch information
jhovold authored and adelva1984 committed Dec 11, 2019
1 parent 5c4bdeb commit 38361f5
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 0 deletions.
15 changes: 15 additions & 0 deletions Documentation/ABI/testing/sysfs-class-gnss
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
What: /sys/class/gnss/gnssN/type
Date: May 2018
KernelVersion: 4.18
Contact: Johan Hovold <[email protected]>
Description:
The GNSS receiver type. The currently identified types reflect
the protocol(s) supported by the receiver:

"NMEA" NMEA 0183
"SiRF" SiRF Binary
"UBX" UBX

Note that also non-"NMEA" type receivers typically support a
subset of NMEA 0183 with vendor extensions (e.g. to allow
switching to a vendor protocol).
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -5850,6 +5850,7 @@ F: include/uapi/linux/gigaset_dev.h
GNSS SUBSYSTEM
M: Johan Hovold <[email protected]>
S: Maintained
F: Documentation/ABI/testing/sysfs-class-gnss
F: Documentation/devicetree/bindings/gnss/
F: drivers/gnss/
F: include/linux/gnss.h
Expand Down
49 changes: 49 additions & 0 deletions drivers/gnss/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,52 @@ int gnss_insert_raw(struct gnss_device *gdev, const unsigned char *buf,
}
EXPORT_SYMBOL_GPL(gnss_insert_raw);

static const char * const gnss_type_names[GNSS_TYPE_COUNT] = {
[GNSS_TYPE_NMEA] = "NMEA",
[GNSS_TYPE_SIRF] = "SiRF",
[GNSS_TYPE_UBX] = "UBX",
};

static const char *gnss_type_name(struct gnss_device *gdev)
{
const char *name = NULL;

if (gdev->type < GNSS_TYPE_COUNT)
name = gnss_type_names[gdev->type];

if (!name)
dev_WARN(&gdev->dev, "type name not defined\n");

return name;
}

static ssize_t type_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct gnss_device *gdev = to_gnss_device(dev);

return sprintf(buf, "%s\n", gnss_type_name(gdev));
}
static DEVICE_ATTR_RO(type);

static struct attribute *gnss_attrs[] = {
&dev_attr_type.attr,
NULL,
};
ATTRIBUTE_GROUPS(gnss);

static int gnss_uevent(struct device *dev, struct kobj_uevent_env *env)
{
struct gnss_device *gdev = to_gnss_device(dev);
int ret;

ret = add_uevent_var(env, "GNSS_TYPE=%s", gnss_type_name(gdev));
if (ret)
return ret;

return 0;
}

static int __init gnss_module_init(void)
{
int ret;
Expand All @@ -347,6 +393,9 @@ static int __init gnss_module_init(void)
goto err_unregister_chrdev;
}

gnss_class->dev_groups = gnss_groups;
gnss_class->dev_uevent = gnss_uevent;

pr_info("GNSS driver registered with major %d\n", MAJOR(gnss_first));

return 0;
Expand Down
9 changes: 9 additions & 0 deletions include/linux/gnss.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@

struct gnss_device;

enum gnss_type {
GNSS_TYPE_NMEA = 0,
GNSS_TYPE_SIRF,
GNSS_TYPE_UBX,

GNSS_TYPE_COUNT
};

struct gnss_operations {
int (*open)(struct gnss_device *gdev);
void (*close)(struct gnss_device *gdev);
Expand All @@ -30,6 +38,7 @@ struct gnss_device {
struct cdev cdev;
int id;

enum gnss_type type;
unsigned long flags;

struct rw_semaphore rwsem;
Expand Down

0 comments on commit 38361f5

Please sign in to comment.