Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp38393pxb; Mon, 8 Feb 2021 14:30:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJz6CSUi3AC83bEODaIBFVPSZsM5ufbfTt2bHDPtF1iOEnuSU8Xm9y3eUPfMKBXNVJlJDSFj X-Received: by 2002:a17:906:c318:: with SMTP id s24mr19020006ejz.187.1612823418457; Mon, 08 Feb 2021 14:30:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612823418; cv=none; d=google.com; s=arc-20160816; b=OkcdmLene/iR80LHdpWNPdK2wjDqS8sGD25ZlI38Lnche67CAOy9Dbe2MRwXgnM2Iq xlzDYpyLwI/t2ZlaM7AjXxfNBbVBNFgMTUbt2pYmr6B/M8daI1dHxTa8fsFz0fM7wu/T YrVEtFGu9moMFUgyyjkWdyI2HTFo9JSl/prtsxRO25iJmM5KFQLW79g4+OfLT7DWRsER zpouqh9jRrSlxfhzx250g2dQiZ+Vj1cuf3wzqPu+At0LGL/PME2UGlE39Jn6MtaY5ffi mjnFzt9h4bHFBtJFmu0Rvr3N8EQ9s7FU9AViMCa9fUeH/l91eBhcKxIwjwAvNKOJauYW Yhbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=1tdc6z/zHmfa0u7uglIhE+jPdvBd1dYrgz7Zf/7d1Oc=; b=o7WGPesidQNuBsTdoI1CFr3/IVG+NKn8M5CPILgPk7SkY2xasdnCPUczJLRDQNC78O OP1fHtSR40sZCGServuq5h4G0xJL4J03Dlm3BMYUWDlACH5LybXRq2FiqjNt8u68wsug Pk/d31rJSr5VdPGHScbm/2UI3enzZKJZoe23YwNbGf29fsnbAzb+9E5578pvSCgWzci7 KdWSMpbLDk/hc9GUw+WnPZfJmCsz9fX3yMwKtSgc+Is54H6MvFBA4s7Y46AVK4rKP6ZW NVlo9UvpEv8eXwnDK2jR8Sq8mpfUuL98mjTCO4KAwgL/MPa5s9m5w364SLcYNSql1vgo wcYA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y10si11608901ejp.751.2021.02.08.14.29.55; Mon, 08 Feb 2021 14:30:18 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230055AbhBHW1N (ORCPT + 99 others); Mon, 8 Feb 2021 17:27:13 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:49701 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230244AbhBHWYw (ORCPT ); Mon, 8 Feb 2021 17:24:52 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M58SY-1lALNj34rs-001Cu5; Mon, 08 Feb 2021 23:22:15 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 07/12] gpio: amd-fch: add oftree probing support Date: Mon, 8 Feb 2021 23:21:58 +0100 Message-Id: <20210208222203.22335-8-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:yTfMa/Q6JJwUZY+PPtP27G34rsIXtNT7w2QEAriQh7lzWzb8EOn r445EViP6HeIxHFmne2s3OKQ+BXq6kE05vthvyALzNGkxWM89QE1qNZykBBgx027Fldx4Bq bBO50iRiQDUndKYhtYoETSw84zA9vXFAQxkEV2C1R1pZT2nr/cQWY9X/6K8flGh7u9h8tZZ kV5OgQGBKuUlli3FqlWfg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:LxJTd96Aqis=:J6IRJlk1Ktory7oriGNIDR Vyrp6CCMyaLU+9AhEMngBAlqyVZ/sZ6X8CnU4/hm0Muoijcxq0qjV9UYDmpP4a6KnzA6bu/Zn HZUe+Cvek6z7XHHBoKJ9uI1M7eht2QwCMztDvnD7u3pRBOzf2rw4y6TjncP/E9fpgm8aZcftm EfN22T1ukRfsvQhd4h6NB0pse6ukxyYkJF8Ec83deiSe50zM6Jx0Ai0XyuodgxhQdG1YuYAg1 tBLyDc9VmvXjCC93iEL7WIYbBti0Gi83PmAqnvfO3JZGSfetznUJ0hJJpewxOHD1xioKS7kxt P4WlH3ztd3KD5tZCgQ6snXTUXvDrY5o3a2y4LPUiJ/oFb1vamHyENr49sDd+6BMjKpokc0Jfd zfBlTT5HEH7wVAufkeWM2smg/7UYr2CB/beLNcjpbnY3yO56Xn/MTmyTOGTgJ Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for probing via device tree. --- drivers/gpio/gpio-amd-fch.c | 58 +++++++++++++++++++++++++ include/dt-bindings/gpio/amd-fch-gpio.h | 36 +++++++++++++++ include/linux/platform_data/gpio/gpio-amd-fch.h | 24 ++-------- 3 files changed, 98 insertions(+), 20 deletions(-) create mode 100644 include/dt-bindings/gpio/amd-fch-gpio.h diff --git a/drivers/gpio/gpio-amd-fch.c b/drivers/gpio/gpio-amd-fch.c index 2a21354ed6a0..32024f99dae5 100644 --- a/drivers/gpio/gpio-amd-fch.c +++ b/drivers/gpio/gpio-amd-fch.c @@ -136,12 +136,61 @@ static int amd_fch_gpio_request(struct gpio_chip *chip, return 0; } +static struct amd_fch_gpio_pdata *load_pdata(struct device *dev) +{ + struct amd_fch_gpio_pdata *pdata; + int ret; + + pdata = devm_kzalloc(dev, sizeof(struct amd_fch_gpio_pdata), + GFP_KERNEL); + if (!pdata) + goto nomem; + + pdata->gpio_num = of_property_count_elems_of_size(dev->of_node, + "gpio-regs", + sizeof(u32)); + pdata->gpio_reg = devm_kzalloc(dev, sizeof(int)*pdata->gpio_num, + GFP_KERNEL); + if (!pdata->gpio_reg) + goto nomem; + + pdata->gpio_names = devm_kzalloc(dev, sizeof(char*)*pdata->gpio_num, + GFP_KERNEL); + if (!pdata->gpio_names) + goto nomem; + + ret = of_property_read_variable_u32_array(dev->of_node, "gpio-regs", + pdata->gpio_reg, + pdata->gpio_num, + pdata->gpio_num); + if (ret != pdata->gpio_num) { + dev_err(dev, "failed reading gpio-regs from DT: %d\n", ret); + return NULL; + } + + ret = of_property_read_string_array(dev->of_node, "gpio-line-names", + pdata->gpio_names, pdata->gpio_num); + if (ret != pdata->gpio_num) { + dev_err(dev, "failed reading gpio-names from DT: %d\n", ret); + return NULL; + } + + return pdata; + +nomem: + dev_err(dev, "load_pdata: failed allocating memory\n"); + return NULL; +} + static int amd_fch_gpio_probe(struct platform_device *pdev) { struct amd_fch_gpio_priv *priv; struct amd_fch_gpio_pdata *pdata; pdata = dev_get_platdata(&pdev->dev); + if (!pdata) + pdata = load_pdata(&pdev->dev); + if (!pdata) { dev_err(&pdev->dev, "no platform_data\n"); return -ENOENT; @@ -165,6 +214,9 @@ static int amd_fch_gpio_probe(struct platform_device *pdev) priv->gc.get_direction = amd_fch_gpio_get_direction; priv->gc.get = amd_fch_gpio_get; priv->gc.set = amd_fch_gpio_set; +#ifdef CONFIG_OF_GPIO + priv->gc.of_node = pdev->dev.of_node; +#endif spin_lock_init(&priv->lock); @@ -177,9 +229,15 @@ static int amd_fch_gpio_probe(struct platform_device *pdev) return devm_gpiochip_add_data(&pdev->dev, &priv->gc, priv); } +static const struct of_device_id amd_fch_gpio_of_match[] = { + { .compatible = "amd,fch-gpio" }, + {} +}; + static struct platform_driver amd_fch_gpio_driver = { .driver = { .name = AMD_FCH_GPIO_DRIVER_NAME, + .of_match_table = amd_fch_gpio_of_match, }, .probe = amd_fch_gpio_probe, }; diff --git a/include/dt-bindings/gpio/amd-fch-gpio.h b/include/dt-bindings/gpio/amd-fch-gpio.h new file mode 100644 index 000000000000..7a47e6debcdb --- /dev/null +++ b/include/dt-bindings/gpio/amd-fch-gpio.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +/* + * AMD FCH gpio platform data definitions + * + * Copyright (C) 2020 metux IT consult + * Author: Enrico Weigelt + * + */ + +#ifndef __DT_BINDINGS_GPIO_AMD_FCH_REGS_H +#define __DT_BINDINGS_GPIO_AMD_FCH_REGS_H + +/* + * gpio registers addresses + * + * these regs need to be assigned by board setup, since they're wired + * in very board specifici was, rarely documented, this should not be + * available to users. + */ +#define AMD_FCH_GPIO_REG_GPIO49 0x40 +#define AMD_FCH_GPIO_REG_GPIO50 0x41 +#define AMD_FCH_GPIO_REG_GPIO51 0x42 +#define AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 0x43 +#define AMD_FCH_GPIO_REG_GPIO57 0x44 +#define AMD_FCH_GPIO_REG_GPIO58 0x45 +#define AMD_FCH_GPIO_REG_GPIO59_DEVSLP1 0x46 +#define AMD_FCH_GPIO_REG_GPIO64 0x47 +#define AMD_FCH_GPIO_REG_GPIO68 0x48 +#define AMD_FCH_GPIO_REG_GPIO66_SPKR 0x5B +#define AMD_FCH_GPIO_REG_GPIO71 0x4D +#define AMD_FCH_GPIO_REG_GPIO32_GE1 0x59 +#define AMD_FCH_GPIO_REG_GPIO33_GE2 0x5A +#define AMT_FCH_GPIO_REG_GEVT22 0x09 + +#endif /* __DT_BINDINGS_GPIO_AMD_FCH_REGS_H */ diff --git a/include/linux/platform_data/gpio/gpio-amd-fch.h b/include/linux/platform_data/gpio/gpio-amd-fch.h index 255d51c9d36d..336f7387e82c 100644 --- a/include/linux/platform_data/gpio/gpio-amd-fch.h +++ b/include/linux/platform_data/gpio/gpio-amd-fch.h @@ -11,25 +11,9 @@ #ifndef __LINUX_PLATFORM_DATA_GPIO_AMD_FCH_H #define __LINUX_PLATFORM_DATA_GPIO_AMD_FCH_H -#define AMD_FCH_GPIO_DRIVER_NAME "gpio_amd_fch" +#include -/* - * gpio register index definitions - */ -#define AMD_FCH_GPIO_REG_GPIO49 0x40 -#define AMD_FCH_GPIO_REG_GPIO50 0x41 -#define AMD_FCH_GPIO_REG_GPIO51 0x42 -#define AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 0x43 -#define AMD_FCH_GPIO_REG_GPIO57 0x44 -#define AMD_FCH_GPIO_REG_GPIO58 0x45 -#define AMD_FCH_GPIO_REG_GPIO59_DEVSLP1 0x46 -#define AMD_FCH_GPIO_REG_GPIO64 0x47 -#define AMD_FCH_GPIO_REG_GPIO68 0x48 -#define AMD_FCH_GPIO_REG_GPIO66_SPKR 0x5B -#define AMD_FCH_GPIO_REG_GPIO71 0x4D -#define AMD_FCH_GPIO_REG_GPIO32_GE1 0x59 -#define AMD_FCH_GPIO_REG_GPIO33_GE2 0x5A -#define AMT_FCH_GPIO_REG_GEVT22 0x09 +#define AMD_FCH_GPIO_DRIVER_NAME "gpio_amd_fch" /* * struct amd_fch_gpio_pdata - GPIO chip platform data @@ -39,8 +23,8 @@ */ struct amd_fch_gpio_pdata { int gpio_num; - int *gpio_reg; - const char * const *gpio_names; + u32 *gpio_reg; + const char * *gpio_names; }; #endif /* __LINUX_PLATFORM_DATA_GPIO_AMD_FCH_H */ -- 2.11.0