Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp328188imm; Fri, 1 Jun 2018 01:25:46 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKX+zGoi/VLOEYzlFSd7gExg1QoiBTvsMWySIQ+OtkIRnGE/MfgN9s9U1xZEXYDcEAi1SYy X-Received: by 2002:a17:902:bd95:: with SMTP id q21-v6mr9879607pls.237.1527841546859; Fri, 01 Jun 2018 01:25:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527841546; cv=none; d=google.com; s=arc-20160816; b=FfKNtckuHgV9WSbP/qBmnacaGLThJaCJBnSmqn1TyC4CfvzVGCQFFmOpRoN0hqwtJZ 1y+VrbxrF9v3B3fU79Z5Fn3gcdnPEUXeXF5RREUumgHU13iqV9xrEbGUvoa8+MJHDm5F zYbxEJf+lR2ZYiTGDxRlUvl/dxMlIZNiYWOM4qFmWZmU0x8vNuv+ZVgdtFwkO26+ImV3 hWU7MtE2rpkm13bHux0GjwpyLSAhJPa+pPV5DUfxpdjKzgB6s9ToArmZRcZQpxdhl8Hr mDyIWmob9f+euNe4AnHkX06U91U3uyrIZQcL2buZFkbkevbyINeRt9Ux3OZmrklEXCGC cagQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=CXbJx4c9LVj6wqIbn3WJj94YpIbb/0Dh8Va4jF1/Hmo=; b=icfBaN1bTcLHV24bCVXdKQoP8b7q/B9h8Fm7GMhQNpNlBRk6u/JKcugQQBoAl03QX7 bqZz0PQEaSfq4y79dK8bBie8XjYeYJtTypTEHyO2/F7nxG2bYTXZZhgcSOU7ko8G+Ru7 4mOx1MGWBlTB8YUj7rjUqGQVwY6Qz0dwbXr7Rf1wSNrwVmTqv+J+T5Np0snuma/k4r3A K2nrhGmm4FsBjbizZow6hTv8Ku/3TUZ8bzbfrkFP14ni/CN8Tzik9LdioczHjRcLHRZ0 FPARGy66PB2Vvcv4x2EUuRN5T4RuShekD5VFUVD/B8oZ/s5MVjVjDZQ4WzU4nEHdKU8S 9RKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=aq0r5o4W; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s3-v6si39082761plb.394.2018.06.01.01.25.30; Fri, 01 Jun 2018 01:25:46 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=aq0r5o4W; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751562AbeFAIYB (ORCPT + 99 others); Fri, 1 Jun 2018 04:24:01 -0400 Received: from mail-lf0-f65.google.com ([209.85.215.65]:38931 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751157AbeFAIXa (ORCPT ); Fri, 1 Jun 2018 04:23:30 -0400 Received: by mail-lf0-f65.google.com with SMTP id t134-v6so13599107lff.6; Fri, 01 Jun 2018 01:23:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=CXbJx4c9LVj6wqIbn3WJj94YpIbb/0Dh8Va4jF1/Hmo=; b=aq0r5o4WEbl3f4FHP/rrLYiVWE7KK91Oz+YYQUHIqzPxd14H5vN3Q+0DbCJQ6M9O45 WR2tQ9u48XwWr1XiKkuviCSQpJdxEeSATRxcRc1lauwbP4R10hnOXDIWXQVizanPayde TqQzqarcA2kzp75de8IdRA3nCh5ZtMbbS3J+bmDreega7AzEYj0wKE5mbSaKcvo2fUOo sSWNISaRmlvHXTQOpd0EJTbRyBamZlC2m/tGny2D+uVe5yK7+oXh4jiAewOdi+/7cG1r 6EQFwPqscTBWbgnkbmCKSoT4x1AaFlHA+hLrwIzjQrrLV2D868cCAipGA9KHopgEeBUh 7+Hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=CXbJx4c9LVj6wqIbn3WJj94YpIbb/0Dh8Va4jF1/Hmo=; b=XiU5pE4OnupIl8YBEhuPplw0ayOA8BYxjz8z7UjKXj8Cn8KQNOmty4NLPGQ1CrdtBB laA3V8UFMfh7waKyUoa0R39o4+LWpQvrR9ev8V+Pzwni3pR01VE+Nw78D286tm3jacR6 fp9yLL49EhvfnvJpJqkdBGGeBMr7Zi1G6oR1tvyUmDRst/6FKKHyreWtyJL9zmESccAf BY7Vf+fyN+sqrI6stZMXAA2xtLrnqy+2XfN63jQGu+Qc9BSxEyblfs7YH9+iOIq93Sif J6/oAQ+5O8dkY8eEmwLeK72YXDR1sJB3y1LgPNNShRl9613/FP1ajAqI83IhaEHcL3Uo EW7g== X-Gm-Message-State: ALKqPwfhTjx4Kad2WX1wwszXJxr7+NQh76fs44+2ysJkYzkS0zpjR5pa 4wgHCfDfUyax0sTMzPOi1OI= X-Received: by 2002:a19:51db:: with SMTP id g88-v6mr6432467lfl.78.1527841408685; Fri, 01 Jun 2018 01:23:28 -0700 (PDT) Received: from xi.terra (c-8bb2e655.07-184-6d6c6d4.bbcust.telenor.se. [85.230.178.139]) by smtp.gmail.com with ESMTPSA id f14-v6sm2241593ljj.15.2018.06.01.01.23.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Jun 2018 01:23:24 -0700 (PDT) Received: from johan by xi.terra with local (Exim 4.90_1) (envelope-from ) id 1fOfLC-0004ak-4i; Fri, 01 Jun 2018 10:23:18 +0200 From: Johan Hovold To: Greg Kroah-Hartman , Rob Herring , Mark Rutland Cc: Andreas Kemnade , Arnd Bergmann , "H . Nikolaus Schaller" , Pavel Machek , Marcel Holtmann , Sebastian Reichel , Tony Lindgren , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Johan Hovold Subject: [PATCH v3 8/8] gnss: add receiver type support Date: Fri, 1 Jun 2018 10:22:59 +0200 Message-Id: <20180601082259.17563-9-johan@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180601082259.17563-1-johan@kernel.org> References: <20180601082259.17563-1-johan@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- Documentation/ABI/testing/sysfs-class-gnss | 15 +++++++ MAINTAINERS | 1 + drivers/gnss/core.c | 49 ++++++++++++++++++++++ drivers/gnss/sirf.c | 1 + drivers/gnss/ubx.c | 2 + include/linux/gnss.h | 9 ++++ 6 files changed, 77 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-class-gnss diff --git a/Documentation/ABI/testing/sysfs-class-gnss b/Documentation/ABI/testing/sysfs-class-gnss new file mode 100644 index 000000000000..2467b6900eae --- /dev/null +++ b/Documentation/ABI/testing/sysfs-class-gnss @@ -0,0 +1,15 @@ +What: /sys/class/gnss/gnssN/type +Date: May 2018 +KernelVersion: 4.18 +Contact: Johan Hovold +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). diff --git a/MAINTAINERS b/MAINTAINERS index fa219e80a1f8..e666bc28a102 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -5965,6 +5965,7 @@ F: include/uapi/linux/gigaset_dev.h GNSS SUBSYSTEM M: Johan Hovold S: Maintained +F: Documentation/ABI/testing/sysfs-class-gnss F: Documentation/devicetree/bindings/gnss/ F: drivers/gnss/ F: include/linux/gnss.h diff --git a/drivers/gnss/core.c b/drivers/gnss/core.c index 307894ca2725..f30ef8338b3a 100644 --- a/drivers/gnss/core.c +++ b/drivers/gnss/core.c @@ -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; @@ -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; diff --git a/drivers/gnss/sirf.c b/drivers/gnss/sirf.c index 5fb0f730db48..79cb98950013 100644 --- a/drivers/gnss/sirf.c +++ b/drivers/gnss/sirf.c @@ -267,6 +267,7 @@ static int sirf_probe(struct serdev_device *serdev) if (!gdev) return -ENOMEM; + gdev->type = GNSS_TYPE_SIRF; gdev->ops = &sirf_gnss_ops; gnss_set_drvdata(gdev, data); diff --git a/drivers/gnss/ubx.c b/drivers/gnss/ubx.c index ecddfb362a6f..902b6854b7db 100644 --- a/drivers/gnss/ubx.c +++ b/drivers/gnss/ubx.c @@ -77,6 +77,8 @@ static int ubx_probe(struct serdev_device *serdev) gserial->ops = &ubx_gserial_ops; + gserial->gdev->type = GNSS_TYPE_UBX; + data = gnss_serial_get_drvdata(gserial); data->vcc = devm_regulator_get(&serdev->dev, "vcc"); diff --git a/include/linux/gnss.h b/include/linux/gnss.h index e26aeac1e0e2..43546977098c 100644 --- a/include/linux/gnss.h +++ b/include/linux/gnss.h @@ -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); @@ -30,6 +38,7 @@ struct gnss_device { struct cdev cdev; int id; + enum gnss_type type; unsigned long flags; struct rw_semaphore rwsem; -- 2.17.1