Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp4326609imm; Wed, 30 May 2018 03:37:57 -0700 (PDT) X-Google-Smtp-Source: ADUXVKI1sPhaxeWXe/yxSR1pgJNo8R89R5F7zz0m82qUdJx6oN4bcKYDsgs0s06LDJtq89LY8Y1E X-Received: by 2002:a17:902:205:: with SMTP id 5-v6mr2244449plc.301.1527676677358; Wed, 30 May 2018 03:37:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527676677; cv=none; d=google.com; s=arc-20160816; b=mGlvFidZdbioxt/m8IXOkooMVy+1VW135BNFPmYso4WTSArgi4wCjV0zii+a4jvARr C66yeEnv5Nv3fD3nQYTS1lJWGlJNFxzYYYMWR/SV6xiaMqegKN8bmRuoXNphL+pBQ2BD ji2bx7/RysxJNaDPhIAf9B5tHMuXacrAZfRHsUnM17cieDXUw8xgMISbmWmnYyjt9wwL olK7whz0mx3F5qRKcRfPAd/HogyvXwt+mAKwNO/WRL1fujoQwgE+nJHJ8voNqQ4DaI2B YcHt9UAR8nJBPLZWMgytJ0huhLI2j3oa6Exjnn82fkVEexlMXXaCG5idl2lHDgyjxD1q 5wNA== 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=D5sdNjE/tZaPDYDyChEa57V9MUNi9SEnP3rqxjK8m9Q=; b=Gki1mJqXt2qbHS3kNfSy0gszp5VPGi5r+aWDuzdvPbY00QVopV2wozx8GMVIEYEOf/ 4k6XcaN6EQbJz2RvCOaKX7ivWZLL8FVzeHwxQKNvfaGiRSTr0/MRh43ccfmAF6cNzpkg 5GVuiHUuC0g6aaM1AREf7zZhWfB2FTzdUlEPiju9ncRvb1eRqWEUXK6IHYf9LKqMAngA oc14EHkQRxxWUw170TPHsc0xn8rh68zoGGy5xzim66NbSnECYvdByEYj15xOufevHZxU Vm0UM2q1t1VRJKLER6UwhtNuOauJeBVabTM9zm87RVgDTxIZC+V8dygW1iUIl0Awv9g+ Kr2A== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=Skts2ssI; 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 j65-v6si27106889pgc.552.2018.05.30.03.37.43; Wed, 30 May 2018 03:37:57 -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=Skts2ssI; 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 S1752256AbeE3Kfg (ORCPT + 99 others); Wed, 30 May 2018 06:35:36 -0400 Received: from mail-lf0-f65.google.com ([209.85.215.65]:37839 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751586AbeE3KeN (ORCPT ); Wed, 30 May 2018 06:34:13 -0400 Received: by mail-lf0-f65.google.com with SMTP id r2-v6so3485518lff.4; Wed, 30 May 2018 03:34:12 -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=D5sdNjE/tZaPDYDyChEa57V9MUNi9SEnP3rqxjK8m9Q=; b=Skts2ssIvfk5PVG7z3+K0mc8sOeahYnRP1f+JIGmYJR+otrfPIDGXEcuXgdSY06qw1 i1U3md/j3vRL0lkJO7w/u+6TgT2lX45drcTxhcHOBZnD4jy8C8WcFSr8h3wlMqF8902r l2FvIobOJNg7Pz7yMGQFn/6tVIl1dxK2j1EJ+e9VKBWB8z/mtRMPBPK/25A5JVtaSrvW dyhgHGjjjmFoyZPmSK2DHkj3H49+t9/M8ocPY35ZUKN+ptuJCuKz0kWU8LgN4gTlYQmw f856k4VnA80VpPvOBSK6/PLpDHuVHztVNr/olnuBKlzn6hZ9dk1KnR2dnT76mYil6hIR bB6A== 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=D5sdNjE/tZaPDYDyChEa57V9MUNi9SEnP3rqxjK8m9Q=; b=bRlNF13DRn3rBKCde2XxPTic4+OtvzMWjAkrpQojde1/pHphiBPlb04ggYa+hDmaOD 7NGMgxibbfGPYM8JEr37+hEE2cnnd8zhNPXaFhBzDJBxfHVVb69k7PCmxBs8A+xLM+5z cr5y+mzlIieyh7y//TpS43hYkQ0M1YxG2FjkR8yDZJ+nyDjtnVtmyrY0A/b2YIS8HrFZ 2ybcKT9/1Zef5PnalDKh8vGVX0M6AgnUbqchgnFFuKvjpps4MzfFJjYnIhbV3sXSng/I 0cI2/m78XOSQnCCgHn1GMaDbDnpeC1tQPc4jkBt6++S8jab1JT/O9spXOpjcAKEFu9h1 lIsA== X-Gm-Message-State: ALKqPwd2Ga+Kaa1uU9kU4VyHvBTwAWNg4zDksTwVH+VFsPIzyq92/bS1 RyRqPLNCnXRnk9L2IFBHDbc= X-Received: by 2002:a2e:9003:: with SMTP id h3-v6mr1658317ljg.33.1527676451742; Wed, 30 May 2018 03:34:11 -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 t9-v6sm6956694ljh.66.2018.05.30.03.34.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 May 2018 03:34:09 -0700 (PDT) Received: from johan by xi.terra with local (Exim 4.90_1) (envelope-from ) id 1fNyQh-0005Qc-6W; Wed, 30 May 2018 12:34:07 +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 v2 8/8] gnss: add device type support Date: Wed, 30 May 2018 12:32:42 +0200 Message-Id: <20180530103242.20773-9-johan@kernel.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180530103242.20773-1-johan@kernel.org> References: <20180530103242.20773-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 device. The currently identified types reflect the protocol(s) supported by a device: "NMEA" NMEA 0183 "SiRF" SiRF Binary "UBX" UBX Note that both SiRF and UBX type devices 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..3bcdf8e2496a --- /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 device type. The currently identified types reflect + the protocol(s) supported by the device: + + "NMEA" NMEA 0183 + "SiRF" SiRF Binary + "UBX" UBX + + Note that also non-"NMEA" type devices 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.0