From patchwork Tue Apr 20 14:50:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Anderson X-Patchwork-Id: 1468368 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=secospa.onmicrosoft.com header.i=@secospa.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-secospa-onmicrosoft-com header.b=ILQB/Ae0; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FPmr06bpHz9vDx for ; Wed, 21 Apr 2021 00:52:32 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 116DD82B48; Tue, 20 Apr 2021 16:52:06 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=seco.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=secospa.onmicrosoft.com header.i=@secospa.onmicrosoft.com header.b="ILQB/Ae0"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id E917682B23; Tue, 20 Apr 2021 16:51:29 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER,SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on20618.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e1a::618]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 759E682B1F for ; Tue, 20 Apr 2021 16:51:22 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=seco.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sean.anderson@seco.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=XLmJIVmRBnD8pL0uIhkhhaOFKzBMwVZ5XxMXDOboJLsy/jf3WKEcU3lCR0O9qy55Ccsd32DNWPe9tSzkNzN/HdDJPhzG/U8n2zQ1FcmDfnmuJRayDDFf/Z5BdQV1JFf7g56k+s8zbxY6aQX9/cw2rIaOGJJPY+8E55W90mNEWgonGnfCVBVdcbohP40MwkVh3KmnoOkJF8aYjb/PKEHACAPB61cJh4GrhXMjz3UVY0F9QjCe+4o6TSsC2o7acwk201bfmBTK3XEdoTc2Qx+WiLnwPh3CRsQvVPpAXF7U4JerzsTsJpNFBNboneQn1VsNmTPw9uaZnS0z0dbI1hgz4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=0uXO+x2G2YIK4EZwT3rMKK6YBRYyDFv7U20ScJFpj2A=; b=Y0L1txcIJE5GdqG98VPqUqZpDgvUhElBU2Us7Oc9koCXEqt7OAXHfAWU/CZDgFsp1GUJN5wcgPN5FNcr+4Y6s6LrBRY7wJLkrRCQ28hR60x02+GYkfVHl1uSKqU6Nu2KxANg3UTKIK2nE0gW+z+k12t4GsZVxCLbnzECRdWhoWmjIc5u7RQBae6uEd3K8TI8Sy+XoeTc8AV1GkgQNNpS0STJqG3aSP6scsKxuU7jNj7HYz2UHVY1wlwdQOnCc/0Fcno09OyfMesIjhndejupjpWtldZGo6J5gTdg5pJ8lmyyeJ4UWo16HPNbVwf+PyedhDgxFtPZUEvUcvFlC7yRZw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=seco.com; dmarc=pass action=none header.from=seco.com; dkim=pass header.d=seco.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=secospa.onmicrosoft.com; s=selector2-secospa-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=0uXO+x2G2YIK4EZwT3rMKK6YBRYyDFv7U20ScJFpj2A=; b=ILQB/Ae0REhyd1DXrbTmV0j5eoFJQJhElx8BPkPNkhUxRkTdSXATvrE9tdlGnHxSDC9VPVf7Ac+c947AVVzBsP8npgHNLsEwkFVlG8dAP3ZeCrMubm085BlnH+kEPPISiyM0KL/DXq4neJnLnhVm+QGUhwzNapvAcyzw731LI0I= Authentication-Results: konsulko.com; dkim=none (message not signed) header.d=none;konsulko.com; dmarc=none action=none header.from=seco.com; Received: from DB7PR03MB4523.eurprd03.prod.outlook.com (2603:10a6:10:19::27) by DB9PR03MB7243.eurprd03.prod.outlook.com (2603:10a6:10:220::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4042.19; Tue, 20 Apr 2021 14:51:21 +0000 Received: from DB7PR03MB4523.eurprd03.prod.outlook.com ([fe80::9181:c45f:b367:9bdc]) by DB7PR03MB4523.eurprd03.prod.outlook.com ([fe80::9181:c45f:b367:9bdc%5]) with mapi id 15.20.4065.020; Tue, 20 Apr 2021 14:51:20 +0000 From: Sean Anderson To: Tom Rini , u-boot@lists.denx.de Cc: Simon Glass , Sean Anderson , Bin Meng Subject: [PATCH v4 4/5] sysinfo: Add gpio-sysinfo driver Date: Tue, 20 Apr 2021 10:50:57 -0400 Message-Id: <20210420145058.3934010-5-sean.anderson@seco.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210420145058.3934010-1-sean.anderson@seco.com> References: <20210420145058.3934010-1-sean.anderson@seco.com> X-Originating-IP: [50.195.82.171] X-ClientProxiedBy: BL1PR13CA0424.namprd13.prod.outlook.com (2603:10b6:208:2c3::9) To DB7PR03MB4523.eurprd03.prod.outlook.com (2603:10a6:10:19::27) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from plantagenet.inhand.com (50.195.82.171) by BL1PR13CA0424.namprd13.prod.outlook.com (2603:10b6:208:2c3::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4065.8 via Frontend Transport; Tue, 20 Apr 2021 14:51:20 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0e0272df-326a-458b-f9f2-08d9040bc2b8 X-MS-TrafficTypeDiagnostic: DB9PR03MB7243: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5516; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /MN3K7nJQ185hL/B1uHxexL91VnGc6krN/zrZ0p2/VVOrX4L7LbBHZE8zZPpEQovxVqYx7t9ZVuv2H7j84vp5iE2KGYw8OyfT+GxW9hTuuEf4RgtMJvWkQa9cBg1ms+ovI96tIWERp+JFsdhUqjhjCc9GOOzM//pR6lCQs3ukgJLBkTkiT310BDgBHKiZLw4vrUI7T8X7Pd5E22WoTgb/gvcsHVQl1AndgW08nasL4YDJxGAvdKbkoi204RG0vTVDD8mtpYbZuWPxlyfPbzAZR0hYoq3OD4HnPgBfsNEzjuceCZ00Q8DhJnyjWsSZDKd8Y7v49G4SIcSqF8WJIKNaeKAjRL3rfsPo3IjS2GTBwIrtGh2JIeNGBMI63MsPk7fgbxB2R97W354uhE0Tks1CNbDaeQJPhT6Xa9UHPnyeAk8CdU58vYSN5I8zjfFtf3qx2vS4/fAnILqC5j8JncGH74zYevAUcHiHfCmxeB0G4jpEU4cPWuIfGsmJ3nJfg/9O7JuuKymyF+esp+ifXFW0Gd08hdElJ4dvOjym3FHLJKCO2cmAeDFsVXunD/umApkP55UqxANSg0NSTZT3vjbdjKZ3nGl0WiahMbNQaEx06WPSzh4AHENObie5OiZ0YBJRpmOGdSGX2Y18pI8H+YBNhls6SmSFmeniOfb4B4Jv3c= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB7PR03MB4523.eurprd03.prod.outlook.com; PTR:; CAT:NONE; SFS:(366004)(16526019)(44832011)(498600001)(8936002)(1076003)(2906002)(186003)(6486002)(86362001)(66946007)(38350700002)(66556008)(4326008)(6666004)(38100700002)(8676002)(6512007)(6506007)(66476007)(26005)(956004)(54906003)(83380400001)(5660300002)(2616005)(52116002)(36756003); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: Lk2uimQiC4Dj12lARIiR76I7GLeNwhVrfMFIft/iL12VzuxOso8n2nEb6EfNLkWO0Q0rFJsbMta5dYRqkQnE/p5QAaUeh15s8qvR4nR+/G2lFBMH2NAbFi/JA8e+1afbLxD0X1iW21fCXb6+YtiiT58tSpj+DgO0opLHmrHecSPhxe0NpX/QwLKlVZIaUi/b8fJFMIv9l/0KTOCOD5Xz6Q9lUBqNi3NyeznEfZPisNaNI5io6Q4BgfN+Hv3H33XrbQ2tsu1l4TABLgYenmqiY3Q2OOsuXmNhEDH42NaN6JQ8A5Y+UQ23iWQK+jaS5K2hYSe1JZjnwneNSoqwLdx0FjW24Iie+ur0esY3+3W3MY11n8KHOxo9GN+3k79LwvUQ3qW40wwVJj2XgoFslp2yMI3wbO6uT1waBEvMCN6MbBjlH0KgMzePbuRc05o4bv6FsoTV4I2+reTi2KDDDEp3wEEEmjKsvV1mCFNQjLPdKOwHZMFr0ZfFih7zdz8pWL3p3BLyOPeyCHEWlWnunN3k/B/qguzFDOBaUObmy4amv28NSbvdg/u4V7l77M2I61/7EwfJUoR/ER81/Jy/F+RH1aNySRkNhTdy2xPlN0hwD9X83DPntwz0kwM8Su1W5RFHkIgD3zuD/DNeV5BqpqN5U167T80CxFnYBS9iMi88e7rHYweaGJS4lBc2pkH/ZkGEuQXXcQlRw5gnuf/szVac2Wg6RbUqWSqKev2TRweiEAW07Si17rLvqH9TK8a5MBw/j1j/lHH+JPxTqocDeNS3dv2rpH9cqD0n8axprtgZlh75Di8xs2F84RyhMkOylCBc0wLwtVxeL57o+2oF7rW+8/QbLnmc+O024OiS9OuJ9y5w15XcrlFwrNQChy2qarXPRT4UUtVF5Zxy4/9T0umUJRGyCuPFqUA+kv5XBbbZeffO4DdQz3HDvw01Ugeq7IxbenNQ/yee3G9XgookMG623avXoe2xG3mT4y3CUx5eXHnSAPObVAWeSHycqhrPcU4/jtFmovvYdOSKam4Dq0v/mr4KcGZOiLZYEeLCYXuKGOOrPksanEzzga7Ekf2u4z/FXbnWclebGvXaFed61rn0ZmpnrNvjS6EjqF/uwuCEpjRFYDcA0XHQYjFhwEnM6ZdR5fF2azgi1zCQWV9icAuATm8S12DIJRCwdV45/wZshYgDgq3/G51y0p5NyloH6zhIf87wl7Ocu1FYNy/y0Qy3h3Ve9wGH+aHlC5n68NkDc3TluTL5rZidU6aidLsx03JFMh1pyzfFqUUvYsgCMdxnOHo2B7DG7YdZ/vXvpH3eOHRJMedM5uQNe/JEcTMw31KC X-OriginatorOrg: seco.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0e0272df-326a-458b-f9f2-08d9040bc2b8 X-MS-Exchange-CrossTenant-AuthSource: DB7PR03MB4523.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Apr 2021 14:51:20.8749 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bebe97c3-6438-442e-ade3-ff17aa50e733 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: FOflAkLPweCA63B2CYs0My3GIBjLNlI9roqIQclu7av1w/DPocy9YXpj4TOshhJQxQ/sExtVm1LrYhEP5xYhHQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR03MB7243 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.4 at phobos.denx.de X-Virus-Status: Clean This uses the newly-added dm_gpio_get_values_as_int_base3 function to implement a sysinfo device. The revision map is stored in the device tree. Signed-off-by: Sean Anderson Reviewed-by: Simon Glass --- (no changes since v3) Changes in v3: - Fix assuming nonzero return from dm_gpio_get_values_as_int_base3 is an error. - Use SYSINFO_ID_BOARD_MODEL instead of SYSINFO_ID_REVISION Changes in v2: - Document sysinfo_gpio_priv - Fix unbalanced brace in sysinfo_gpio_get_int - Refactor driver to take advantage of the uclass detect ordering guarantee. - Reorder includes .../sysinfo/gpio-sysinfo.txt | 37 +++++ drivers/sysinfo/Kconfig | 8 + drivers/sysinfo/Makefile | 1 + drivers/sysinfo/gpio.c | 141 ++++++++++++++++++ 4 files changed, 187 insertions(+) create mode 100644 doc/device-tree-bindings/sysinfo/gpio-sysinfo.txt create mode 100644 drivers/sysinfo/gpio.c diff --git a/doc/device-tree-bindings/sysinfo/gpio-sysinfo.txt b/doc/device-tree-bindings/sysinfo/gpio-sysinfo.txt new file mode 100644 index 0000000000..b5739d94e9 --- /dev/null +++ b/doc/device-tree-bindings/sysinfo/gpio-sysinfo.txt @@ -0,0 +1,37 @@ +GPIO-based Sysinfo device + +This binding describes several GPIOs which specify a board revision. Each GPIO +forms a digit in a ternary revision number. This revision is then mapped to a +name using the revisions and names properties. + +Each GPIO may be floating, pulled-up, or pulled-down, mapping to digits 2, 1, +and 0, respectively. The first GPIO forms the least-significant digit of the +revision. For example, consider the property + + gpios = <&gpio 0>, <&gpio 1>, <&gpio 2>; + +If GPIO 0 is pulled-up, GPIO 1 is pulled-down, and GPIO 2 is floating, then the +revision would be + + 0t201 = 2*9 + 0*3 + 1*3 = 19 + +If instead GPIO 0 is floating, GPIO 1 is pulled-up, and GPIO 2 is pulled-down, +then the revision would be + + 0t012 = 0*9 + 1*3 + 2*1 = 5 + +Required properties: +- compatible: should be "gpio-sysinfo". +- gpios: should be a list of gpios forming the revision number, + least-significant-digit first +- revisions: a list of known revisions; any revisions not present will have the + name "unknown" +- names: the name of each revision in revisions + +Example: +sysinfo { + compatible = "gpio-sysinfo"; + gpios = <&gpio_a 15>, <&gpio_a 16>, <&gpio_a 17>; + revisions = <19>, <5>; + names = "rev_a", "foo"; +}; diff --git a/drivers/sysinfo/Kconfig b/drivers/sysinfo/Kconfig index 85c1e81e41..381dcd8844 100644 --- a/drivers/sysinfo/Kconfig +++ b/drivers/sysinfo/Kconfig @@ -30,4 +30,12 @@ config SYSINFO_SMBIOS one which provides a way to specify this SMBIOS information in the devicetree, without needing any board-specific functionality. +config SYSINFO_GPIO + bool "Enable gpio sysinfo driver" + help + Support querying gpios to determine board revision. This uses gpios to + form a ternary number (when they are pulled-up, -down, or floating). + This ternary number is then mapped to a board revision name using + device tree properties. + endif diff --git a/drivers/sysinfo/Makefile b/drivers/sysinfo/Makefile index 6d04fcba1d..d9f708b7ea 100644 --- a/drivers/sysinfo/Makefile +++ b/drivers/sysinfo/Makefile @@ -4,5 +4,6 @@ # Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc obj-y += sysinfo-uclass.o obj-$(CONFIG_SYSINFO_GAZERBEAM) += gazerbeam.o +obj-$(CONFIG_SYSINFO_GPIO) += gpio.o obj-$(CONFIG_SYSINFO_SANDBOX) += sandbox.o obj-$(CONFIG_SYSINFO_SMBIOS) += smbios.o diff --git a/drivers/sysinfo/gpio.c b/drivers/sysinfo/gpio.c new file mode 100644 index 0000000000..1d7f050998 --- /dev/null +++ b/drivers/sysinfo/gpio.c @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2021 Sean Anderson + */ + +#include +#include +#include +#include +#include +#include + +/** + * struct sysinfo_gpio_priv - GPIO sysinfo private data + * @gpios: List of GPIOs used to detect the revision + * @gpio_num: The number of GPIOs in @gpios + * @revision: The revision as detected from the GPIOs. + */ +struct sysinfo_gpio_priv { + struct gpio_desc *gpios; + int gpio_num, revision; +}; + +static int sysinfo_gpio_detect(struct udevice *dev) +{ + int ret; + struct sysinfo_gpio_priv *priv = dev_get_priv(dev); + + ret = dm_gpio_get_values_as_int_base3(priv->gpios, priv->gpio_num); + if (ret < 0) + return ret; + + priv->revision = ret; + return 0; +} + +static int sysinfo_gpio_get_int(struct udevice *dev, int id, int *val) +{ + struct sysinfo_gpio_priv *priv = dev_get_priv(dev); + + switch (id) { + case SYSINFO_ID_BOARD_MODEL: + *val = priv->revision; + return 0; + default: + return -EINVAL; + }; +} + +static int sysinfo_gpio_get_str(struct udevice *dev, int id, size_t size, char *val) +{ + struct sysinfo_gpio_priv *priv = dev_get_priv(dev); + + switch (id) { + case SYSINFO_ID_BOARD_MODEL: { + const char *name = NULL; + int i, ret; + u32 revision; + + for (i = 0; i < priv->gpio_num; i++) { + ret = dev_read_u32_index(dev, "revisions", i, + &revision); + if (ret) { + if (ret != -EOVERFLOW) + return ret; + break; + } + + if (revision == priv->revision) { + ret = dev_read_string_index(dev, "names", i, + &name); + if (ret < 0) + return ret; + break; + } + } + if (!name) + name = "unknown"; + + strncpy(val, name, size); + val[size - 1] = '\0'; + return 0; + } default: + return -EINVAL; + }; +} + +static const struct sysinfo_ops sysinfo_gpio_ops = { + .detect = sysinfo_gpio_detect, + .get_int = sysinfo_gpio_get_int, + .get_str = sysinfo_gpio_get_str, +}; + +static int sysinfo_gpio_probe(struct udevice *dev) +{ + int ret; + struct sysinfo_gpio_priv *priv = dev_get_priv(dev); + + priv->gpio_num = gpio_get_list_count(dev, "gpios"); + if (priv->gpio_num < 0) { + dev_err(dev, "could not get gpios length (err = %d)\n", + priv->gpio_num); + return priv->gpio_num; + } + + priv->gpios = calloc(priv->gpio_num, sizeof(*priv->gpios)); + if (!priv->gpios) { + dev_err(dev, "could not allocate memory for %d gpios\n", + priv->gpio_num); + return -ENOMEM; + } + + ret = gpio_request_list_by_name(dev, "gpios", priv->gpios, + priv->gpio_num, GPIOD_IS_IN); + if (ret != priv->gpio_num) { + dev_err(dev, "could not get gpios (err = %d)\n", + priv->gpio_num); + return ret; + } + + if (!dev_read_bool(dev, "revisions") || !dev_read_bool(dev, "names")) { + dev_err(dev, "revisions or names properties missing\n"); + return -ENOENT; + } + + return 0; +} + +static const struct udevice_id sysinfo_gpio_ids[] = { + { .compatible = "gpio-sysinfo" }, + { /* sentinel */ } +}; + +U_BOOT_DRIVER(sysinfo_gpio) = { + .name = "sysinfo_gpio", + .id = UCLASS_SYSINFO, + .of_match = sysinfo_gpio_ids, + .ops = &sysinfo_gpio_ops, + .priv_auto = sizeof(struct sysinfo_gpio_priv), + .probe = sysinfo_gpio_probe, +};