From patchwork Mon Mar 1 20:46:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Anderson X-Patchwork-Id: 1445755 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=4Hq6kocA; 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 4DqC4g6t4kz9sS8 for ; Tue, 2 Mar 2021 07:47:31 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 274C08204C; Mon, 1 Mar 2021 21:46:50 +0100 (CET) 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="4Hq6kocA"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 99CAE82016; Mon, 1 Mar 2021 21:46:40 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2062b.outbound.protection.outlook.com [IPv6:2a01:111:f400:7d00::62b]) (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 83AB0803AB for ; Mon, 1 Mar 2021 21:46:32 +0100 (CET) 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=OEi1WRb6w1/wGamW6feRgVvTNqVnULRIYuhXGkCRPZjy++loI7xNAUWwWA3hJ/G5ZPlUv22+WHXe/g/NSI0Ec/PPgMnLsq3x+gB/q5tyC36fK/NKwu5lm7aR+UzerqfSzC72w5O+xZFaveLK4otiOTn4Q+eI/9Gcs7tnKj2GMgtbuqbg0+jpVE0EPsaWX/0CkFjaWNbl8v4wjuKfbYMqYMMDU8qKy4twOauNRPiYX/tLhDZ0WyUZ4U9XWHTu4cfxtPe1IJn/Q5Twi3h+Ockq/IHv6VOCqLYNJnzJGeIX6Aq+mFLvzNgzNtVvhyVONPIblagEDQ2IgEPH4MDStGp3Bg== 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=3mIoGit+6XQo1EzOiQnjhS3mdlXkmQSt9OAnaGtshAA=; b=HgpotlKDkEQs+NMBzunRK5Ca7bpo+DUOd/I8f8QS1Z3gbaZR35HNAcePBwDBY4FeJyS8dRH5MkhnGvzbS0DjcLv3A202qibBj+MYTvdEIZT0x75oF3jreGlepFtSx+PmR4cnk2SITf68PXTZuMyAcC8HxIRoVDKEhm4oQQbQk9tQZ8Oypliz3/T4ofthZLir/piwmST2kqevVnsqzluavO3X1heEldM0zoB8zx+ByDx+kFo1gsTTeLLL59jizNG8EmwdK1fD2DGdf1dLDAP6VMxi1aiZfnIPe6jtd7wtkG29txz2oXFOAsN7NGT2JIzvXwQ9Twl5uHR1wYIIRaq9ag== 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=3mIoGit+6XQo1EzOiQnjhS3mdlXkmQSt9OAnaGtshAA=; b=4Hq6kocAG/FOI7AfL/JQxWPQy0XkHXxOvGB4SjMXSrB2Cfns4piPxw5sQIiZN0FOC1fyD5TQ2mi+tR9OM5+eNURXpOq9MVM4wUu5kG5RgDZ22SRjI+JDO0pL6un/GLB5iQssnFCwpujaQUJCLo2bVcmTOgj7rbzPMo5hqBLP468= Authentication-Results: chromium.org; dkim=none (message not signed) header.d=none;chromium.org; dmarc=none action=none header.from=seco.com; Received: from DB7PR03MB4523.eurprd03.prod.outlook.com (2603:10a6:10:19::27) by DBAPR03MB6408.eurprd03.prod.outlook.com (2603:10a6:10:194::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.23; Mon, 1 Mar 2021 20:46:31 +0000 Received: from DB7PR03MB4523.eurprd03.prod.outlook.com ([fe80::941:c90c:b9da:2290]) by DB7PR03MB4523.eurprd03.prod.outlook.com ([fe80::941:c90c:b9da:2290%4]) with mapi id 15.20.3890.028; Mon, 1 Mar 2021 20:46:31 +0000 From: Sean Anderson To: Simon Glass , u-boot@lists.denx.de Cc: Sean Anderson , Bin Meng Subject: [PATCH 4/5] sysinfo: Add gpio-sysinfo driver Date: Mon, 1 Mar 2021 15:46:02 -0500 Message-Id: <20210301204603.2730666-5-sean.anderson@seco.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210301204603.2730666-1-sean.anderson@seco.com> References: <20210301204603.2730666-1-sean.anderson@seco.com> X-Originating-IP: [50.195.82.171] X-ClientProxiedBy: BL1PR13CA0207.namprd13.prod.outlook.com (2603:10b6:208:2be::32) 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 BL1PR13CA0207.namprd13.prod.outlook.com (2603:10b6:208:2be::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3912.11 via Frontend Transport; Mon, 1 Mar 2021 20:46:30 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 6f364f85-5c29-4fdd-c140-08d8dcf31822 X-MS-TrafficTypeDiagnostic: DBAPR03MB6408: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:4714; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: x7R+vLRvHhnHFMchxKugSINWr0eUGLk2ktnPS242ICGnaqLNv7s2yleZyd6mJRJbxT531nMXAlTZz8DjX0fi26EAi5+hXkgJmd8hVrojqIe1Ft3Q5EatKf2uFylHcvBYpWCARfeGYSgG209gi245ENL9T7pX6H37LJDK5Q40dm/bdUcgWcw7A6mCjMofv/naPOA1mrjYFgDxKF832WH7j8/lw6TWS6mLCqN3lqbb5jOjFtUMEEGRj14fffQz/FphodpVcL7yEmibpggpdBiivVhbFB1gFU5wLC4Zns5l6ORky5r8jWslIT7vaqiUfsXny+WgF+q/lfqt3wTxT1iciQxhJjRz8rjrvlXg5goujgOLWcXt0YnqUDV+UfNP990n8HaZQtGkjDRyc/szpwN3IrixVihhx2vZKA86mg64WcO/DMdQGjFQ3afqMj+W+zT+dMk07/V5sS5P5oAbYlMoJAh6bUxKQHtgHaiHG8KUf9S7zDfLRBhjPL0B9OUPmod5G8k8Nf11eT+JXTK+JHE+7Q== 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:(39840400004)(376002)(136003)(366004)(396003)(346002)(316002)(86362001)(478600001)(186003)(6512007)(6486002)(36756003)(26005)(1076003)(54906003)(16526019)(52116002)(83380400001)(6666004)(6506007)(956004)(66476007)(2616005)(66946007)(66556008)(5660300002)(2906002)(8676002)(4326008)(8936002)(44832011); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: UrUiD4eV0racVyUgwaWNpW0h5R1PFKXgRkxUavSiOyNQqV5UAfstLGzMqqnCLUnjnFEIFOMUzw1Tq4UmZuwb4p3BHFAaK/j31I+qLSnqFM8bOfy6o0QHTG7lY9gtf9szdN/Ti90Mx6DfTuAlVoulakdf/qD7E8QsrNLXxCbGpKVYFQjVFdjeYNo9w3KXJvQwWQrzJD9oCy5oGWsM4skjJAseHUrZICC5kLSZXll0QiWCdXzMg1bTD+td63Y4oyYsCSd0GRFWHzOlhxsKCgSgoO9CUYaH7DZT5aCr9Uh/zjwraT6N1VXYDc0OO5x+O3fzAAquUJnKRen6hVfCgvC2f6MYPNTLo6dlr03PwR+OT68FnWMMpTy+VW0YdXPHnxNOOc1qTEtmKuku80JL6puB/Gw0NPevIJpzXoGKgSj/1dhKocNSIUg6ZmoeM6YOwYOzgBXOQ4eWRFbv48w+0ui3vWCh2hI8g0nXpXG+6ZpwTqT/kl3d0a9Wz5p2qSAxRTR0DomCiGJkw8fE+pM/CN8hcFDi4Z5gIe5/7a7kfx5UJi7TOPYYGu36ntxYCcClvAfsw2JDUItRg15T8+DggyzYxi3WY90jaQQmV+v/6DNIAQ7LWCQ+xm0NO8YnBFKaPcLAtbwmg+2n9M+CkG+b2bSSZcW20TK5rJol8wJWhRJ+zuuoCacxtI36i9a0tRp1Gtr1bMLA2XLGG7le4/beFcw9P67qcerZi0k6R5+SaiMioQ10UIivE7nf8jotoEthqApuOugq5H2mZoc4h2CS8vQzT+aLFfeVmi7JUPYgS80ndBcPoYeh8G7aS4wLioDgzKTWlRHE1/lMWOJQV2xk46gkzyFplDfJ01gqMDuIDNni0z/gPQds5CSl5qdX44foWbYKNg76x2eR6GrFsab9WC3EIjAj+LoSMz0S5jHxvuSu6uOKdpn1fe4C5WlwG/GWAekeRPZ6F2RbbGu103jeN84oZAR7kOEp2bn0M0bhN1JISEJC1L2HEVa3KCl7tpwhOj39XgXpfBoVMt+SIOKLOQAgoYQu9Mipl65Qq2R1xnSh2w/PHUW3GN3Ew6N2WW5SZonE3GdoBtXVEUAp67u/AFkvqQxkTvK8jMIvI4GHKt7riVMfWOsZx/tZf4Byn0Gt/F4SDWsA8LY3/6tYUZ5lx8yv1atpurJTL2ia1zsiRpgvoskMz6n2ARG1JQp9LJfm14+PyqBYnCV9LerMpzhmH8EjlPFJr/gbEEGd1MmVglf17Ynb4Z64tfmRLAWAf/ouo+ixv3/Z4q4FCkkkHxU2Uhrp0Xo3wRYvnHiwy6+QsnLATnvNb5lpO76cwoMfn8R032fC X-OriginatorOrg: seco.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6f364f85-5c29-4fdd-c140-08d8dcf31822 X-MS-Exchange-CrossTenant-AuthSource: DB7PR03MB4523.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Mar 2021 20:46:31.5928 (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: 3x/tCXfUgg6cZQq6S5JY5G5Lqx4wV/ghvKspTmTPVJUtia/o4jMwhvr17nAYwGLSH6sx33j9iK3NfQqmmlQrwA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBAPR03MB6408 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 --- .../sysinfo/gpio-sysinfo.txt | 37 +++++ drivers/sysinfo/Kconfig | 8 + drivers/sysinfo/Makefile | 1 + drivers/sysinfo/gpio.c | 138 ++++++++++++++++++ 4 files changed, 184 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..6a0eff3ec9 --- /dev/null +++ b/drivers/sysinfo/gpio.c @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2021 Sean Anderson + */ + +#include +#include +#include +#include +#include +#include + +struct sysinfo_gpio_priv { + struct gpio_desc *gpios; + int gpio_num, revision; +}; + +static int sysinfo_gpio_detect(struct udevice *dev) +{ + struct sysinfo_gpio_priv *priv = dev_get_priv(dev); + + priv->revision = dm_gpio_get_values_as_int_base3(priv->gpios, + priv->gpio_num); + return priv->revision < 0 ? priv->revision : 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_REVISION: + if (priv->revision < 0) { + return priv->revision; + *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_REVISION: { + const char *name = NULL; + int i, ret; + u32 revision; + + if (priv->revision < 0) + return priv->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; + } + + priv->revision = -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, +};