From patchwork Wed Sep 11 07:52:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160715 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ptdsTxWi"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvJ95R1Pz9sNF for ; Wed, 11 Sep 2019 17:52:25 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727111AbfIKHwV (ORCPT ); Wed, 11 Sep 2019 03:52:21 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:43555 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727039AbfIKHwV (ORCPT ); Wed, 11 Sep 2019 03:52:21 -0400 Received: by mail-pl1-f193.google.com with SMTP id 4so9805897pld.10; Wed, 11 Sep 2019 00:52:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=N/GjfbWA+RT4gvpUShhTUqBALupjPg41fqn6WwTjqE8=; b=ptdsTxWiTvFUGvrlP5m+kPG3LJsr5ASlqVgee6QnmwutqeOF4XtZu+TpCsbObJA835 o85qjgzV3c84lTa5LkUKDnu5tu9O1qKqLvQyrS18y29TChjjHT8R/iSSkce33t9aOVsE hONq81j+SxOFVDN7fADn2XEtL3KExFt2A9qEj+uRKZrWiXfqeHV/fXND3zjLgAHlrNbL dbkqVNui7SrzfcEHddurH76YFOkyTgG42p2C3Pf3ZZx4Y2VzgZR15hp82o+gWbsS30MS 8fqDONmh9OWhfc5ft4ibDVWrZa7CuvtZBmNhvqL1gQhs47olKancZufT7AgiwYwi540H Xz7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=N/GjfbWA+RT4gvpUShhTUqBALupjPg41fqn6WwTjqE8=; b=jVUaxdOxqqxi9JQ7PW9tpPlKKl2ZvycZl94ByRq4I58qZcakJqmzyGLCHW+HY0vQrT CZMtq3DPMHdLvGcihm+KE7x4cFrOGfWuGPRi15iwwPNQkTm+yQw0PsYskKB5ea673ESA 2fSA1icgoploDf4m5f3j0MuNYv6242HGZ+fZtP5O8Jx0ZcjBipyOjlABhBeWRwdzk7ML lwFhiM+zX40h4o5pVKeItYUCEJJIjO4dTZYYY93pHZ7P9xwv5h4Jlq79pkUVt/rGiVy4 Gc3FLfuQQucnSkskaNHUNERw5/hgM2ZH6p0qvQUXulH40IaQHll+aeHU8bu86HWBuT71 98MQ== X-Gm-Message-State: APjAAAUViKauaaMl4jAJPbF/y6+KvPsV8tAW6e2dTebvDMEmF6SsFyYP tK/zjMjhXKF2DouI4e/6P6M= X-Google-Smtp-Source: APXvYqxIW0PX/nOXMMfVGvEomgvv0qKWZzTUpN7yhe8ZSsFC8YH78lNXUr9+MsjaA0JwM6OCWsVUEg== X-Received: by 2002:a17:902:9f96:: with SMTP id g22mr24631406plq.212.1568188340495; Wed, 11 Sep 2019 00:52:20 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:19 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH 01/11] gpiolib: of: add a fallback for wlf,reset GPIO name Date: Wed, 11 Sep 2019 00:52:05 -0700 Message-Id: <20190911075215.78047-2-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The old Arizona binding did not use -gpio or -gpios suffix, so devm_gpiod_get() does not work for it. As it is the one of a few users of devm_gpiod_get_from_of_node() API that I want to remove, I'd rather have a small quirk in the gpiolib OF handler, and switch Arizona driver to devm_gpiod_get(). Signed-off-by: Dmitry Torokhov --- drivers/gpio/gpiolib-of.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index b45b39c48a34..8b773f7d7724 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c @@ -438,6 +438,19 @@ static struct gpio_desc *of_find_regulator_gpio(struct device *dev, const char * return desc; } +static struct gpio_desc *of_find_arizona_gpio(struct device *dev, + const char *con_id, + enum of_gpio_flags *of_flags) +{ + if (!IS_ENABLED(CONFIG_MFD_ARIZONA)) + return ERR_PTR(-ENOENT); + + if (!con_id || strcmp(con_id, "wlf,reset")) + return ERR_PTR(-ENOENT); + + return of_get_named_gpiod_flags(dev->of_node, con_id, 0, of_flags); +} + struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, unsigned int idx, unsigned long *flags) { @@ -479,6 +492,9 @@ struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, desc = of_find_regulator_gpio(dev, con_id, &of_flags); } + if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT) + desc = of_find_arizona_gpio(dev, con_id, &of_flags); + if (IS_ERR(desc)) return desc; From patchwork Wed Sep 11 07:52:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160727 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="rqnkc1X9"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvK21qywz9s00 for ; Wed, 11 Sep 2019 17:53:10 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727151AbfIKHwZ (ORCPT ); Wed, 11 Sep 2019 03:52:25 -0400 Received: from mail-pf1-f195.google.com ([209.85.210.195]:40404 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727137AbfIKHwY (ORCPT ); Wed, 11 Sep 2019 03:52:24 -0400 Received: by mail-pf1-f195.google.com with SMTP id x127so13140282pfb.7; Wed, 11 Sep 2019 00:52:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=51aUTOSnvcLQf+P79cmPrM9loBkdI6A9ZLwOiaZPzyo=; b=rqnkc1X9ZeB2/DP9qO/oHLGiURvCmamjolmF3Fi+jRUhdmjxd3j34i69Fyl6VjDFnA ckXXTEUt99zUl9YchvNhE2apQQ+Y3I0yPxw5Fmq8Geza5q+WP5LqsCZV00vAUrCjqehi qEJXvvFMePJG8Xm3mpQ/Uw8FM6RokIJG85+U4CD2LuiiCU5GLyhWCz0nmdHzutNV46HV 4Ju4ywnPItQl21foHDgKVubG/IAric4zSBh5isuJpuSSNlaa61tU/PW8AKBrW7uhAsEv WZ12EYycqLndOS7mr9pO8oFHcknnPVDkERR9rCncABQrqVY9j/X4yh/dGF3b95UIdV4q +33g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=51aUTOSnvcLQf+P79cmPrM9loBkdI6A9ZLwOiaZPzyo=; b=C5Fyy5SH9WPGVFxAx967elc2tH17PTqa0Wlg1qRN/pM23AOb/PWR9l0RYjtMiyJTs4 81jBG69DqCyYvhThpjI9D4FMDncT5U18+Yj6NW3Z6ZgKV2f95tKZZU7BFuzOfr/r6hQS 4zleC7aPPQ+4JfEIzJWdkAtE50DKl/Th1Lu3N8TuJiR1wg72H8/yxOqCfRNuQAaaeqgC bEWCvPpcppJ5vCz/Yyc4eMpPZbfOZbFzU1Bt22CVe3+0m5K7EIy4odvwgQsUv+A5idRz Ctbcyq5dDok2irVN/VFqlSt3acLsJhwgK6NEl1W+HahX9wiR5TJ+xc+/MKv337fRWYDB DGzQ== X-Gm-Message-State: APjAAAXaoh4IPpq0FS4eXTNqkzRnG8tQh0yiuUI01sbvgS5zWC93r9Ph 3Rta4XUSX56jUPhonaHJYHc= X-Google-Smtp-Source: APXvYqwwsqargbsvdE+AwGvCGluX6ER3qn1ywDXmPbRRF3Tq0baH5IbrPOldSSRvHdB6bkMY9+ApPg== X-Received: by 2002:a17:90a:b88b:: with SMTP id o11mr4084973pjr.42.1568188342330; Wed, 11 Sep 2019 00:52:22 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:20 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH 02/11] gpiolib: introduce devm_fwnode_gpiod_get_index() Date: Wed, 11 Sep 2019 00:52:06 -0700 Message-Id: <20190911075215.78047-3-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org devm_fwnode_get_index_gpiod_from_child() is too long, besides the fwnode in question does not have to be a child of device node. Let's rename it to devm_fwnode_gpiod_get_index() and keep the old name for compatibility for now. Also let's add a devm_fwnode_gpiod_get() wrapper as majority of the callers need a single GPIO. Signed-off-by: Dmitry Torokhov --- drivers/gpio/gpiolib-devres.c | 19 ++++++++-------- include/linux/gpio/consumer.h | 41 ++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/drivers/gpio/gpiolib-devres.c b/drivers/gpio/gpiolib-devres.c index 0acc2cc6e868..190ce7c43b4e 100644 --- a/drivers/gpio/gpiolib-devres.c +++ b/drivers/gpio/gpiolib-devres.c @@ -185,12 +185,11 @@ struct gpio_desc *devm_gpiod_get_from_of_node(struct device *dev, EXPORT_SYMBOL(devm_gpiod_get_from_of_node); /** - * devm_fwnode_get_index_gpiod_from_child - get a GPIO descriptor from a - * device's child node + * devm_fwnode_gpiod_get_index - get a GPIO descriptor from a given node * @dev: GPIO consumer + * @fwnode: firmware node containing GPIO reference * @con_id: function within the GPIO consumer * @index: index of the GPIO to obtain in the consumer - * @child: firmware node (child of @dev) * @flags: GPIO initialization flags * @label: label to attach to the requested GPIO * @@ -200,11 +199,11 @@ EXPORT_SYMBOL(devm_gpiod_get_from_of_node); * On successful request the GPIO pin is configured in accordance with * provided @flags. */ -struct gpio_desc *devm_fwnode_get_index_gpiod_from_child(struct device *dev, - const char *con_id, int index, - struct fwnode_handle *child, - enum gpiod_flags flags, - const char *label) +struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev, + struct fwnode_handle *fwnode, + const char *con_id, int index, + enum gpiod_flags flags, + const char *label) { char prop_name[32]; /* 32 is max size of property name */ struct gpio_desc **dr; @@ -224,7 +223,7 @@ struct gpio_desc *devm_fwnode_get_index_gpiod_from_child(struct device *dev, snprintf(prop_name, sizeof(prop_name), "%s", gpio_suffixes[i]); - desc = fwnode_get_named_gpiod(child, prop_name, index, flags, + desc = fwnode_get_named_gpiod(fwnode, prop_name, index, flags, label); if (!IS_ERR(desc) || (PTR_ERR(desc) != -ENOENT)) break; @@ -239,7 +238,7 @@ struct gpio_desc *devm_fwnode_get_index_gpiod_from_child(struct device *dev, return desc; } -EXPORT_SYMBOL(devm_fwnode_get_index_gpiod_from_child); +EXPORT_SYMBOL(devm_fwnode_gpiod_get_index); /** * devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional() diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h index b70af921c614..dc0ddcd30515 100644 --- a/include/linux/gpio/consumer.h +++ b/include/linux/gpio/consumer.h @@ -176,11 +176,11 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, const char *propname, int index, enum gpiod_flags dflags, const char *label); -struct gpio_desc *devm_fwnode_get_index_gpiod_from_child(struct device *dev, - const char *con_id, int index, - struct fwnode_handle *child, - enum gpiod_flags flags, - const char *label); +struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev, + struct fwnode_handle *child, + const char *con_id, int index, + enum gpiod_flags flags, + const char *label); #else /* CONFIG_GPIOLIB */ @@ -531,6 +531,29 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, return ERR_PTR(-ENOSYS); } +static inline +struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev, + struct fwnode_handle *fwnode, + const char *con_id, int index, + enum gpiod_flags flags, + const char *label) +{ + return ERR_PTR(-ENOSYS); +} + +#endif /* CONFIG_GPIOLIB */ + +static inline +struct gpio_desc *devm_fwnode_gpiod_get(struct device *dev, + struct fwnode_handle *fwnode, + const char *con_id, + enum gpiod_flags flags, + const char *label) +{ + return devm_fwnode_gpiod_get_index(dev, fwnode, con_id, 0, + flags, label); +} + static inline struct gpio_desc *devm_fwnode_get_index_gpiod_from_child(struct device *dev, const char *con_id, int index, @@ -538,11 +561,10 @@ struct gpio_desc *devm_fwnode_get_index_gpiod_from_child(struct device *dev, enum gpiod_flags flags, const char *label) { - return ERR_PTR(-ENOSYS); + return devm_fwnode_gpiod_get_index(dev, child, con_id, index, + flags, label); } -#endif /* CONFIG_GPIOLIB */ - static inline struct gpio_desc *devm_fwnode_get_gpiod_from_child(struct device *dev, const char *con_id, @@ -550,8 +572,7 @@ struct gpio_desc *devm_fwnode_get_gpiod_from_child(struct device *dev, enum gpiod_flags flags, const char *label) { - return devm_fwnode_get_index_gpiod_from_child(dev, con_id, 0, child, - flags, label); + return devm_fwnode_gpiod_get_index(dev, child, con_id, 0, flags, label); } #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_OF_GPIO) From patchwork Wed Sep 11 07:52:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160728 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Yw4ZWghd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvK26c9Kz9sCJ for ; Wed, 11 Sep 2019 17:53:10 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727138AbfIKHwY (ORCPT ); Wed, 11 Sep 2019 03:52:24 -0400 Received: from mail-pg1-f196.google.com ([209.85.215.196]:44540 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727039AbfIKHwY (ORCPT ); Wed, 11 Sep 2019 03:52:24 -0400 Received: by mail-pg1-f196.google.com with SMTP id i18so11085908pgl.11; Wed, 11 Sep 2019 00:52:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3ZjTHObEKixs8LSO1T9izKW4ihbkh6Q2u2Ly3Tz9PLw=; b=Yw4ZWghdqi+tilfwEq8eGDvup5cVDslChdBq8mdHBtOVrwOkhRsJb7E61qIe0Ud3Ge VzPLQVsnMHe8WsyiKX4wvt5pzZycp53UJnB+S5NpKAqckqz5LcIE5IAUHaDs2Do8QFw1 5Rl6Bg/X1kiSaGlIn4TQBVEhmxpSP9DcmGrlCbcr3v3qLereTDbcGkHy15CJJwKGTtSD DCQ4WGJx1ntv0ELCXNJ0oB9MqWsJEWKFZaTxnA/iRQvH8ESsgKA9wjvRkrnZGBbaf6X+ NhK1QAnorfTSviS7JLXUWuk1YYtvs9ZcAY+yetuBKLYHeHR24DOqkeNRatzEYTaBsS5Y RfWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3ZjTHObEKixs8LSO1T9izKW4ihbkh6Q2u2Ly3Tz9PLw=; b=BNnPvHG28VhCYwzsXp9tCaw70rFDqZhUz6S3VlyIx8S0soJPnMJ33Q/cK6WrkbXRVV jrHnenIWCIwDF2iMy1gVRKHL0EsKy+x2e3qwZoczAjyRE/Yq/MpFmZh+SIyCmCjQBESB 1RYvYwQWJhwshnqcNs7xfPtpMs5WA/AFIAlWafIUjGFIAoTh//NUHdl6pJgoIMqRvx2O r0ih1uHUitr+C97EGfRdruYtExPf0OBe4iaTibYdbRVsJZxIzOaFhoT4RTYUxjukyYNn lws9FNxDDF+Ye2SgqwR6it+GM0LnJ4E6SHaIiI3fRcfVQUagf4Cmgzi2NusYXsBNSYwD cCvA== X-Gm-Message-State: APjAAAXrzrf7HAlhxaWcjn5LDffXYRBjZEPCHjXeJDgYM6vka2DRSUKc 7sl5aRwl/v/Lfq2ggaGRCKc= X-Google-Smtp-Source: APXvYqyfy5LHnZLdPp4PhaqHIf0Z/L0ZOO/vby33lSOxw+QjdTEMvTP56Yjd749vCj1i6F2wm1lt/A== X-Received: by 2002:a63:4522:: with SMTP id s34mr31462544pga.362.1568188343074; Wed, 11 Sep 2019 00:52:23 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:22 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH 03/11] gpiolib: introduce fwnode_gpiod_get_index() Date: Wed, 11 Sep 2019 00:52:07 -0700 Message-Id: <20190911075215.78047-4-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org This introduces fwnode_gpiod_get_index() that iterates through common gpio suffixes when trying to locate a GPIO within a given firmware node. We also switch devm_fwnode_gpiod_get_index() to call fwnode_gpiod_get_index() instead of iterating through GPIO suffixes on its own. Signed-off-by: Dmitry Torokhov --- drivers/gpio/gpiolib-devres.c | 16 +----------- drivers/gpio/gpiolib.c | 48 +++++++++++++++++++++++++++++++++++ include/linux/gpio/consumer.h | 13 ++++++++++ 3 files changed, 62 insertions(+), 15 deletions(-) diff --git a/drivers/gpio/gpiolib-devres.c b/drivers/gpio/gpiolib-devres.c index 190ce7c43b4e..693dcaf811bb 100644 --- a/drivers/gpio/gpiolib-devres.c +++ b/drivers/gpio/gpiolib-devres.c @@ -205,29 +205,15 @@ struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev, enum gpiod_flags flags, const char *label) { - char prop_name[32]; /* 32 is max size of property name */ struct gpio_desc **dr; struct gpio_desc *desc; - unsigned int i; dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *), GFP_KERNEL); if (!dr) return ERR_PTR(-ENOMEM); - for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) { - if (con_id) - snprintf(prop_name, sizeof(prop_name), "%s-%s", - con_id, gpio_suffixes[i]); - else - snprintf(prop_name, sizeof(prop_name), "%s", - gpio_suffixes[i]); - - desc = fwnode_get_named_gpiod(fwnode, prop_name, index, flags, - label); - if (!IS_ERR(desc) || (PTR_ERR(desc) != -ENOENT)) - break; - } + desc = fwnode_gpiod_get_index(fwnode, con_id, index, flags, label); if (IS_ERR(desc)) { devres_free(dr); return desc; diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index edc1ea68db20..f15e3880aae5 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -4314,6 +4314,54 @@ static int platform_gpio_count(struct device *dev, const char *con_id) return count; } +/** + * fwnode_gpiod_get_index - obtain a GPIO from firmware node + * @fwnode: handle of the firmware node + * @con_id: function within the GPIO consumer + * @index: index of the GPIO to obtain for the consumer + * @flags: GPIO initialization flags + * @label: label to attach to the requested GPIO + * + * This function can be used for drivers that get their configuration + * from opaque firmware. + * + * The function properly finds the corresponding GPIO using whatever is the + * underlying firmware interface and then makes sure that the GPIO + * descriptor is requested before it is returned to the caller. + * + * Returns: + * On successful request the GPIO pin is configured in accordance with + * provided @flags. + * + * In case of error an ERR_PTR() is returned. + */ +struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode, + const char *con_id, int index, + enum gpiod_flags flags, + const char *label) +{ + struct gpio_desc *desc; + char prop_name[32]; /* 32 is max size of property name */ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) { + if (con_id) + snprintf(prop_name, sizeof(prop_name), "%s-%s", + con_id, gpio_suffixes[i]); + else + snprintf(prop_name, sizeof(prop_name), "%s", + gpio_suffixes[i]); + + desc = fwnode_get_named_gpiod(fwnode, prop_name, index, flags, + label); + if (!IS_ERR(desc) || (PTR_ERR(desc) != -ENOENT)) + break; + } + + return desc; +} +EXPORT_SYMBOL_GPL(fwnode_gpiod_get_index); + /** * gpiod_count - return the number of GPIOs associated with a device / function * or -ENOENT if no GPIO has been assigned to the requested function diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h index dc0ddcd30515..5215fdba6b9a 100644 --- a/include/linux/gpio/consumer.h +++ b/include/linux/gpio/consumer.h @@ -176,6 +176,10 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, const char *propname, int index, enum gpiod_flags dflags, const char *label); +struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode, + const char *con_id, int index, + enum gpiod_flags flags, + const char *label); struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev, struct fwnode_handle *child, const char *con_id, int index, @@ -531,6 +535,15 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, return ERR_PTR(-ENOSYS); } +static inline +struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode, + const char *con_id, int index, + enum gpiod_flags flags, + const char *label) +{ + return ERR_PTR(-ENOSYS); +} + static inline struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev, struct fwnode_handle *fwnode, From patchwork Wed Sep 11 07:52:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160726 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="kMBQ3dMr"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvJy32Nkz9sP6 for ; Wed, 11 Sep 2019 17:53:06 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727197AbfIKHw1 (ORCPT ); Wed, 11 Sep 2019 03:52:27 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:38595 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727167AbfIKHw0 (ORCPT ); Wed, 11 Sep 2019 03:52:26 -0400 Received: by mail-pf1-f196.google.com with SMTP id h195so13156976pfe.5; Wed, 11 Sep 2019 00:52:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=h88MG2l81eiTdjzgkHJX15BXFcOh2ckomfV8YTYTFjU=; b=kMBQ3dMrsESr7TwZqim8jjaa2hJp3u+maVECjThf5KhPmfb7HZ0562mIg/dkSgsVxB 3zrz+6cT+bL8lNKexFDcv2CaCY0wdX3vkNNsRx0n4ZA5wy1kbIQA4fGgOB9LoYC2qePn 7WAX7Bypv/lPCEDSe1GjQUDCz8hgB6NeWoK7+SUS6c9rC/QgmVqb6uVbTZ9ot0DNS8xB 3K71OrksDrXb/BQLz72jnm8oD17ZgqzsD7lnxAl1rEBPMG4EwWyidqWv2IpquIsoDpUK gdc6qbMTi7Ea3Qx3M2opHAnaOBUYjZcnVwdj93ugzTXBHL3J9TBb3GyCzr9YdyNFI/2A TOTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=h88MG2l81eiTdjzgkHJX15BXFcOh2ckomfV8YTYTFjU=; b=imN6+G68ryW8N/vCInbN/6PJQEpzSnZ7axeu46/Wzb4/cELt6P+iMX5WkfAO9nhl1C Qwn7ykTGLrOJ6BMiG8wF8XDuJ90hh6F5a9dfm7w0a6nPJsd1Wurk05tMxW8SYVahClnB mTl1JJ87jAvubd4O6P2CXKc/1nAhlfRzphcysJE1bygH5alcas5qTGnCONRyEuLtaWAy twM2hAvpA5Q/tfXWXJFnYXFpfsTQkQnUislEKRd35YgoxlCBnhbXc4FqPvpmE2TD0wT/ X0vUYzdsblEKkBEw7ub44lEO3Mp3B7UkFqCiQ1R/RvLJ/SIc71jfjEOoNTicKzbyh4jo 6ZVg== X-Gm-Message-State: APjAAAV38PXueuqMZoGSCTff40aRfe5etwaP0w626qeU07ckNLB9xD0d YUj7RJs6HAg0p1jAXJUuvA0= X-Google-Smtp-Source: APXvYqwONOjWAlEXKobnYjYWQs5FrHnxNtmzqbN8TPKlC8jUIXa+3WVHFQ4DniPtIjcy4gPeDdwkIg== X-Received: by 2002:a17:90a:b63:: with SMTP id 90mr3979456pjq.96.1568188345092; Wed, 11 Sep 2019 00:52:25 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:23 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Andrew Lunn , "David S. Miller" , Florian Fainelli , Heiner Kallweit , Russell King , netdev@vger.kernel.org Subject: [PATCH 04/11] net: phylink: switch to using fwnode_gpiod_get_index() Date: Wed, 11 Sep 2019 00:52:08 -0700 Message-Id: <20190911075215.78047-5-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Instead of fwnode_get_named_gpiod() that I plan to hide away, let's use the new fwnode_gpiod_get_index() that mimics gpiod_get_index(), bit works with arbitrary firmware node. Signed-off-by: Dmitry Torokhov --- drivers/net/phy/phylink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index a45c5de96ab1..14b608991445 100644 --- a/drivers/net/phy/phylink.c +++ b/drivers/net/phy/phylink.c @@ -168,8 +168,8 @@ static int phylink_parse_fixedlink(struct phylink *pl, pl->link_config.pause |= MLO_PAUSE_ASYM; if (ret == 0) { - desc = fwnode_get_named_gpiod(fixed_node, "link-gpios", - 0, GPIOD_IN, "?"); + desc = fwnode_gpiod_get_index(fixed_node, "link", 0, + GPIOD_IN, "?"); if (!IS_ERR(desc)) pl->link_gpio = desc; From patchwork Wed Sep 11 07:52:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160724 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Ltqu+TEU"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvJw5FS1z9sNT for ; Wed, 11 Sep 2019 17:53:04 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727369AbfIKHwy (ORCPT ); Wed, 11 Sep 2019 03:52:54 -0400 Received: from mail-pf1-f195.google.com ([209.85.210.195]:37247 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727137AbfIKHw2 (ORCPT ); Wed, 11 Sep 2019 03:52:28 -0400 Received: by mail-pf1-f195.google.com with SMTP id y5so10402198pfo.4; Wed, 11 Sep 2019 00:52:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yydq7IrTbJ5Mn0GrNsXPbRYtxDVN0KgTjTrtKFntf60=; b=Ltqu+TEU7FSI/hPzl0RFyfurKjjUX7afeGm4MW6ahotv5YVbss5YxfaWejIRWegIKu KWWeLuiI+Gen0ZNJtVVneZyvpHIfHe3odmMl07oGmzQ5RHaJNPY39Cs2mUziex+prmCo 1Wr/haK3bk62QfEzx7Oxr6yx3qr7auEUzMcd2Rdh3HvNpNJy/uoCExLvO8h9Xy5ZKywv XI8K/D8WZoGdC5x+1/NXmOsDuZH3FNsNRpvbNsbxC8D3+moGkSXCr6ux96kwxfg23fPz SD6uUUu9lU6Q4lkiDDF6X3ZCgRlskWBypIwgRR+5ab3E2KygnCbpTuUDKkHfjCez+s8R 9whw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yydq7IrTbJ5Mn0GrNsXPbRYtxDVN0KgTjTrtKFntf60=; b=rzSF5/AUlEiB1K+I+ajDwWzOFg52HKRlb/j0U+iJpnxQyuLEfq+InTTNcFwpUjMub5 pAzwr9B6eTI7ESHXWTIaEUDWOnoKbRQ+lhAjiYF+RkW33UFC2Al+SAJIlbrXaGbKFz8W GzxtKwW/nWk4TV7n75R3BCTwQlJKNk+3mF6u8hSMSrmuv9U3PapL1R5f3BsYLzIZP4B7 6iXfmC8P/WoSpF0BDs/8/QTOb1+tg4ym363OZhblEB0H4I/oN46RqvzsAy0kNL11Ehhc vAPNXKIm/Kf+oirm8S9FPd5rTkXYX08BYA3YHUt0JjIiY13EPLoZ7ObzR8vVSs80Vi1b tbWg== X-Gm-Message-State: APjAAAWzFdkdHpfCFyQXCwrzWMVe76LBGJQeBYCOGlTRPFwe+14tm7G3 0lWzhwpuSlie9MelT1cyUqA= X-Google-Smtp-Source: APXvYqwg8K8Fw8ARsm6u5ykMqv/AVVwSEyOJ3Pa+I0iHWUcUVNmu1qHGqcn83BJVPOwR5bPFitOqNw== X-Received: by 2002:a65:438a:: with SMTP id m10mr1087350pgp.43.1568188346234; Wed, 11 Sep 2019 00:52:26 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:25 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Andrew Lunn , "David S. Miller" , Florian Fainelli , Heiner Kallweit , netdev@vger.kernel.org Subject: [PATCH 05/11] net: mdio: switch to using fwnode_gpiod_get_index() Date: Wed, 11 Sep 2019 00:52:09 -0700 Message-Id: <20190911075215.78047-6-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Instead of fwnode_get_named_gpiod() that I plan to hide away, let's use the new fwnode_gpiod_get_index() that mimics gpiod_get_index(), bit works with arbitrary firmware node. Signed-off-by: Dmitry Torokhov --- drivers/net/phy/mdio_bus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index ce940871331e..9ca51d678123 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -46,8 +46,8 @@ static int mdiobus_register_gpiod(struct mdio_device *mdiodev) /* Deassert the optional reset signal */ if (mdiodev->dev.of_node) - gpiod = fwnode_get_named_gpiod(&mdiodev->dev.of_node->fwnode, - "reset-gpios", 0, GPIOD_OUT_LOW, + gpiod = fwnode_gpiod_get_index(&mdiodev->dev.of_node->fwnode, + "reset", 0, GPIOD_OUT_LOW, "PHY reset"); if (IS_ERR(gpiod)) { if (PTR_ERR(gpiod) == -ENOENT || PTR_ERR(gpiod) == -ENOSYS) From patchwork Wed Sep 11 07:52:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160725 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="gousrssI"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvJx50d6z9sNk for ; Wed, 11 Sep 2019 17:53:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726889AbfIKHwy (ORCPT ); Wed, 11 Sep 2019 03:52:54 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:40412 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727213AbfIKHw2 (ORCPT ); Wed, 11 Sep 2019 03:52:28 -0400 Received: by mail-pf1-f194.google.com with SMTP id x127so13140414pfb.7; Wed, 11 Sep 2019 00:52:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=65psbidcDO0CPIrkMyNPrHv3R58h3YXHwN4mI+2C5o4=; b=gousrssIPukQ29gCfHUWB/JlJvT3ZfwR9DvQ+acLhprClxxW12JQp3XblRh6dVkEr0 d58eh5oTTF+bUcW2Fx9nPHXzWqSRH635X7LUNLYNMDLTFzZ/bCjEfkEM8ASgoTpTE/2Q Og+5qu6BYYKO0xkt6i2GC5s2av5Qooqs1L0eknjN8Wi8c5wHlVhH0opG5JtlkJOiyBHt 3UgSXiRWNHIucg97NiaXHUqBP/ZppS0x5ob6XlwBcV1tvepryyMDFz6s4rgsYqbztH0D zdF67XMzIXLpIoabDv/RII70hePB8qrJy3GHoxaGwz8r1sDBZSRslKBpAtxlbFFaesdU CUnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=65psbidcDO0CPIrkMyNPrHv3R58h3YXHwN4mI+2C5o4=; b=K05VaZ7UtO8HemtGI9n/o2mnLao9NHY2pMh9l4q5iC3x2LbNY5rxnTi4AqrI/LlZRl peXbYZwEqShojUOi8ynL9DPwJyrXlNBaJvYYZVlun2BWbGWeeqOWUiz+a0ZauoYt5UZ6 MbnOxjHg+5FVv7AlYpVaYVWA07mKuVHXs960OBcQHJAsdiiUt5dA4XmNLREN4kwXykq9 QipzrW07un85pzyBdkS76l48Uknt5dv35OWfzAW284UVL9gTnOJzplmFhVtTKzs6MLCs M5KA6WKeJETFPzeWGn2UIi7Ca8yvl9ptbyEvPRguiVla/+PA4bq0hl6b/V4ZKG32z624 Rvfw== X-Gm-Message-State: APjAAAUJkBTLrlL/aLcjawztgmWOU/R/SUdw+QwMwOkPAm+E0nYcr7Mr OjU2kC9tPKldjW5etSJ1qtpGEpB4RA4= X-Google-Smtp-Source: APXvYqyLxG3qHNsE28JgaCm3PaY2gBvHPOH0XnvA43dLZtsleF60v1vMfX/a4i4rKt34mlqcl18JPA== X-Received: by 2002:a17:90a:e292:: with SMTP id d18mr4093999pjz.100.1568188347317; Wed, 11 Sep 2019 00:52:27 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:26 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Andrzej Hajda , Daniel Vetter , David Airlie , Jernej Skrabec , Jonas Karlman , Laurent Pinchart , Neil Armstrong , dri-devel@lists.freedesktop.org Subject: [PATCH 06/11] drm/bridge: ti-tfp410: switch to using fwnode_gpiod_get_index() Date: Wed, 11 Sep 2019 00:52:10 -0700 Message-Id: <20190911075215.78047-7-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Instead of fwnode_get_named_gpiod() that I plan to hide away, let's use the new fwnode_gpiod_get_index() that mimics gpiod_get_index(), bit works with arbitrary firmware node. Signed-off-by: Dmitry Torokhov Reviewed-by: Laurent Pinchart --- drivers/gpu/drm/bridge/ti-tfp410.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c b/drivers/gpu/drm/bridge/ti-tfp410.c index 61cc2354ef1b..d9c9c9ebad2b 100644 --- a/drivers/gpu/drm/bridge/ti-tfp410.c +++ b/drivers/gpu/drm/bridge/ti-tfp410.c @@ -284,8 +284,8 @@ static int tfp410_get_connector_properties(struct tfp410 *dvi) else dvi->connector_type = DRM_MODE_CONNECTOR_DVID; - dvi->hpd = fwnode_get_named_gpiod(&connector_node->fwnode, - "hpd-gpios", 0, GPIOD_IN, "hpd"); + dvi->hpd = fwnode_gpiod_get_index(&connector_node->fwnode, + "hpd", 0, GPIOD_IN, "hpd"); if (IS_ERR(dvi->hpd)) { ret = PTR_ERR(dvi->hpd); dvi->hpd = NULL; From patchwork Wed Sep 11 07:52:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160722 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="O1LmxtXZ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvJj0Gjxz9sCJ for ; Wed, 11 Sep 2019 17:52:53 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727248AbfIKHw3 (ORCPT ); Wed, 11 Sep 2019 03:52:29 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:36533 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727232AbfIKHw3 (ORCPT ); Wed, 11 Sep 2019 03:52:29 -0400 Received: by mail-pg1-f195.google.com with SMTP id j191so568919pgd.3; Wed, 11 Sep 2019 00:52:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=xxrtIfSruvrXHw4q7jKv1F46B8PQJ0pGIOgebDon1hA=; b=O1LmxtXZigIBphs1DwmQApvNXGIG79sP7qyLAVkvGSf0mot+9HkTtFO9nlSA9x9iuE bk0I+rZnmjBksAXZyI8+E/CperrUyDsD69KfZhCZihiSyMhdj0xYtKtUJFC67/apf9E4 gqf/kpiiu4h4nhR5h1zyiu+eYrCLsYYrD4lD5d88Lci955PhIZxkJBO6y/5d6IH2roeO gNBxeNCDqio4x/X0vl/m7m6ibp9dtqCwrydybiIwP6679vHLyQg4WrWk3DBv07emPet5 KqxsrYNdqjNQgS/0UI7FND112zt+0GeU2C+1QBNoMYdQr9QqP14W7ccGA9jhWJKF79fc grUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xxrtIfSruvrXHw4q7jKv1F46B8PQJ0pGIOgebDon1hA=; b=UC5Ju+xSZEA+4VOE3dATsmJFlkA0TND3uWQElTFsf4SWXT1+FDJVon6bJYwPTj2Pid achXxfyPTSx98cxwAlE29tklmKyyNCl8Ftkp01auGjRwMaeeD0UAQC5LjepT+Emg+len 0WaHPN5Ealp4Do9eZBl8gvZjopvOCMZJsBagXaGXkoviEMZOY4eILZFM2BG6CZ40CFix AZD+AkpH3zXmSwLAbuMuBKShg2rD46Ap5DGW4ZmFiU4JQs2xojby8Ynb5QY4ghOpUZ8M VCX+H46KUTTMr1BwQnE2GQIjzvg4mLcZwUr48sF0f+GnRbxQ40toZNOxa691X0TrwUgJ ZE3g== X-Gm-Message-State: APjAAAV/MLddHZAGNKfPlGrWvcY+qm1sguDFygLt09Hoq60HZENubcBr wKEujne4/4JIiLHRfaBZj8Y= X-Google-Smtp-Source: APXvYqxzV10kyx30B4mcUy5MrnFZL1M7/hU1vEaVzNb1qZE6gzjvIGja4ITH+2F73YPFiJrPwJXuOw== X-Received: by 2002:a62:db84:: with SMTP id f126mr41629628pfg.25.1568188348113; Wed, 11 Sep 2019 00:52:28 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:27 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH 07/11] gpliolib: make fwnode_get_named_gpiod() static Date: Wed, 11 Sep 2019 00:52:11 -0700 Message-Id: <20190911075215.78047-8-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Now that there are no external users of fwnode_get_named_gpiod() we can make it static. Signed-off-by: Dmitry Torokhov --- drivers/gpio/gpiolib.c | 108 ++++++++++++++-------------------- include/linux/gpio/consumer.h | 13 ---- 2 files changed, 43 insertions(+), 78 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index f15e3880aae5..54db2c42e9a0 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -4314,6 +4314,49 @@ static int platform_gpio_count(struct device *dev, const char *con_id) return count; } +static struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, + const char *propname, int index, + enum gpiod_flags dflags, + const char *label) +{ + unsigned long lflags = GPIO_LOOKUP_FLAGS_DEFAULT; + struct gpio_desc *desc = ERR_PTR(-ENODEV); + int ret; + + if (!fwnode) + return ERR_PTR(-EINVAL); + + if (is_of_node(fwnode)) { + desc = gpiod_get_from_of_node(to_of_node(fwnode), + propname, index, + dflags, + label); + return desc; + } else if (is_acpi_node(fwnode)) { + struct acpi_gpio_info info; + + desc = acpi_node_get_gpiod(fwnode, propname, index, &info); + if (IS_ERR(desc)) + return desc; + + acpi_gpio_update_gpiod_flags(&dflags, &info); + acpi_gpio_update_gpiod_lookup_flags(&lflags, &info); + } + + /* Currently only ACPI takes this path */ + ret = gpiod_request(desc, label); + if (ret) + return ERR_PTR(ret); + + ret = gpiod_configure_flags(desc, propname, lflags, dflags); + if (ret < 0) { + gpiod_put(desc); + return ERR_PTR(ret); + } + + return desc; +} + /** * fwnode_gpiod_get_index - obtain a GPIO from firmware node * @fwnode: handle of the firmware node @@ -4574,71 +4617,6 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev, } EXPORT_SYMBOL_GPL(gpiod_get_index); -/** - * fwnode_get_named_gpiod - obtain a GPIO from firmware node - * @fwnode: handle of the firmware node - * @propname: name of the firmware property representing the GPIO - * @index: index of the GPIO to obtain for the consumer - * @dflags: GPIO initialization flags - * @label: label to attach to the requested GPIO - * - * This function can be used for drivers that get their configuration - * from opaque firmware. - * - * The function properly finds the corresponding GPIO using whatever is the - * underlying firmware interface and then makes sure that the GPIO - * descriptor is requested before it is returned to the caller. - * - * Returns: - * On successful request the GPIO pin is configured in accordance with - * provided @dflags. - * - * In case of error an ERR_PTR() is returned. - */ -struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, - const char *propname, int index, - enum gpiod_flags dflags, - const char *label) -{ - unsigned long lflags = GPIO_LOOKUP_FLAGS_DEFAULT; - struct gpio_desc *desc = ERR_PTR(-ENODEV); - int ret; - - if (!fwnode) - return ERR_PTR(-EINVAL); - - if (is_of_node(fwnode)) { - desc = gpiod_get_from_of_node(to_of_node(fwnode), - propname, index, - dflags, - label); - return desc; - } else if (is_acpi_node(fwnode)) { - struct acpi_gpio_info info; - - desc = acpi_node_get_gpiod(fwnode, propname, index, &info); - if (IS_ERR(desc)) - return desc; - - acpi_gpio_update_gpiod_flags(&dflags, &info); - acpi_gpio_update_gpiod_lookup_flags(&lflags, &info); - } - - /* Currently only ACPI takes this path */ - ret = gpiod_request(desc, label); - if (ret) - return ERR_PTR(ret); - - ret = gpiod_configure_flags(desc, propname, lflags, dflags); - if (ret < 0) { - gpiod_put(desc); - return ERR_PTR(ret); - } - - return desc; -} -EXPORT_SYMBOL_GPL(fwnode_get_named_gpiod); - /** * gpiod_get_index_optional - obtain an optional GPIO from a multi-index GPIO * function diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h index 5215fdba6b9a..2f5e825f4601 100644 --- a/include/linux/gpio/consumer.h +++ b/include/linux/gpio/consumer.h @@ -172,10 +172,6 @@ int desc_to_gpio(const struct gpio_desc *desc); /* Child properties interface */ struct fwnode_handle; -struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, - const char *propname, int index, - enum gpiod_flags dflags, - const char *label); struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode, const char *con_id, int index, enum gpiod_flags flags, @@ -526,15 +522,6 @@ static inline int desc_to_gpio(const struct gpio_desc *desc) /* Child properties interface */ struct fwnode_handle; -static inline -struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, - const char *propname, int index, - enum gpiod_flags dflags, - const char *label) -{ - return ERR_PTR(-ENOSYS); -} - static inline struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode, const char *con_id, int index, From patchwork Wed Sep 11 07:52:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160717 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="CykovYYC"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvJJ6YXjz9sCJ for ; Wed, 11 Sep 2019 17:52:32 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727264AbfIKHwb (ORCPT ); Wed, 11 Sep 2019 03:52:31 -0400 Received: from mail-pf1-f195.google.com ([209.85.210.195]:39417 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727255AbfIKHwa (ORCPT ); Wed, 11 Sep 2019 03:52:30 -0400 Received: by mail-pf1-f195.google.com with SMTP id i1so4304061pfa.6; Wed, 11 Sep 2019 00:52:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=K0mtFDbuxn1IOZpcxM11NR5KyKNmc2EZSsbKRNbTKgY=; b=CykovYYCJFbtebwlWICvDMJzoqPcbgpvsGwITSV6y3b8FIbS1do4wJZZRms1RWaZqa 2p+YcSXvU36gBOx7g7zGJJ44eH54nekRMd0WF2Ymje7PQsHUnaUoMIWeF5dP0fAwmhVC ZwpxaPSPKF8hjWnGSpl+7yDlJ5RsPXxQC9Zp1BMB2NY1oGlpMCUg6jghADLX5GU/QZ7n pkYMLtm95Cu5J12ZS4xyxuZ7vgr0iAUUUposPu+Ji0t+D1JX/rGERbZ1nhNkfB3O55Vi FY4Uohsr+CPps9J8vMKmYJDaIGY1S1rejCM6RnUFT0sMqUKOWUj1WvcKQ13XzKPuYVJz B8xA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=K0mtFDbuxn1IOZpcxM11NR5KyKNmc2EZSsbKRNbTKgY=; b=GiA0UNqfQhb/MoPKWQrirMZ6mUS4eLAD3UWg7hE0O1e0VgLm4hXaIypb9TGNBn/+6L t56kEX9Q3F2bchtNO0j7hIjE8jAXZJviX1YbcS7dCzCV/IoAgDkFKueXhotcvmvXMiUn qJgX4pS6Sr/q+nPEt8CyXofcSUIt0gxqm89EmF0CqmKiJUqVn8wPDQ4vTkwHIpsyMum/ 4Lhj1ueKQvOSnAOpFisNZM3DLa7OHk1/qtYoS1+UAWWJiearl00jjBAHx+VI/brCAu/z sR8HhjDFsX1e4OfLQQ9hhmSKOreK9xdQwdlHENXLRopMhOeKsYwE8lqmEhcW9Gzv2jbG mb3Q== X-Gm-Message-State: APjAAAWoLp6Nl8evGUi7iBd0Il2GEJa98M3sXu+H9xRuovR5AmEVqI4M uctD5hnxf79Fln8+XBUxCgM= X-Google-Smtp-Source: APXvYqx3AbemSW3KwBi6m5s2E+P/uo/TESCr7naFP/MlL1ueVqjqu723RCisd4yivomsuqFjx+hP9Q== X-Received: by 2002:a65:4489:: with SMTP id l9mr32580551pgq.207.1568188349075; Wed, 11 Sep 2019 00:52:29 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:28 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH 08/11] gpiolib: of: tease apart of_find_gpio() Date: Wed, 11 Sep 2019 00:52:12 -0700 Message-Id: <20190911075215.78047-9-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Tease apart of_find_gpio() into common function that works on the firmware node, and a fallback handler that works on the device structure, so that we can later use of_find_gpio() in fwnode_gpiod_get_index(). Signed-off-by: Dmitry Torokhov --- drivers/gpio/gpiolib-of.c | 149 +++++++++++++++++++------------------- drivers/gpio/gpiolib-of.h | 26 +++++-- drivers/gpio/gpiolib.c | 7 +- 3 files changed, 99 insertions(+), 83 deletions(-) diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index 8b773f7d7724..1d1a18e0ad93 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c @@ -276,6 +276,28 @@ int of_get_named_gpio_flags(struct device_node *np, const char *list_name, } EXPORT_SYMBOL(of_get_named_gpio_flags); +static void of_gpio_flags_to_lookup(enum of_gpio_flags of_flags, + unsigned long *flags) +{ + if (of_flags & OF_GPIO_ACTIVE_LOW) + *flags |= GPIO_ACTIVE_LOW; + + if (of_flags & OF_GPIO_SINGLE_ENDED) { + if (of_flags & OF_GPIO_OPEN_DRAIN) + *flags |= GPIO_OPEN_DRAIN; + else + *flags |= GPIO_OPEN_SOURCE; + } + + if (of_flags & OF_GPIO_TRANSITORY) + *flags |= GPIO_TRANSITORY; + + if (of_flags & OF_GPIO_PULL_UP) + *flags |= GPIO_PULL_UP; + if (of_flags & OF_GPIO_PULL_DOWN) + *flags |= GPIO_PULL_DOWN; +} + /** * gpiod_get_from_of_node() - obtain a GPIO from an OF node * @node: handle of the OF node @@ -298,10 +320,6 @@ struct gpio_desc *gpiod_get_from_of_node(struct device_node *node, unsigned long lflags = GPIO_LOOKUP_FLAGS_DEFAULT; struct gpio_desc *desc; enum of_gpio_flags flags; - bool active_low = false; - bool single_ended = false; - bool open_drain = false; - bool transitory = false; int ret; desc = of_get_named_gpiod_flags(node, propname, @@ -311,29 +329,13 @@ struct gpio_desc *gpiod_get_from_of_node(struct device_node *node, return desc; } - active_low = flags & OF_GPIO_ACTIVE_LOW; - single_ended = flags & OF_GPIO_SINGLE_ENDED; - open_drain = flags & OF_GPIO_OPEN_DRAIN; - transitory = flags & OF_GPIO_TRANSITORY; - ret = gpiod_request(desc, label); if (ret == -EBUSY && (flags & GPIOD_FLAGS_BIT_NONEXCLUSIVE)) return desc; if (ret) return ERR_PTR(ret); - if (active_low) - lflags |= GPIO_ACTIVE_LOW; - - if (single_ended) { - if (open_drain) - lflags |= GPIO_OPEN_DRAIN; - else - lflags |= GPIO_OPEN_SOURCE; - } - - if (transitory) - lflags |= GPIO_TRANSITORY; + of_gpio_flags_to_lookup(flags, &lflags); ret = gpiod_configure_flags(desc, propname, lflags, dflags); if (ret < 0) { @@ -345,6 +347,46 @@ struct gpio_desc *gpiod_get_from_of_node(struct device_node *node, } EXPORT_SYMBOL(gpiod_get_from_of_node); +static struct gpio_desc *of_find_node_gpio(struct device_node *np, + const char *con_id, unsigned int idx, + enum of_gpio_flags *of_flags) +{ + struct gpio_desc *desc; + char prop_name[32]; /* 32 is max size of property name */ + unsigned int i; + + /* Try GPIO property "foo-gpios" and "foo-gpio" */ + for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) { + if (con_id) + snprintf(prop_name, sizeof(prop_name), "%s-%s", con_id, + gpio_suffixes[i]); + else + snprintf(prop_name, sizeof(prop_name), "%s", + gpio_suffixes[i]); + + desc = of_get_named_gpiod_flags(np, prop_name, idx, of_flags); + if (!IS_ERR(desc) || PTR_ERR(desc) != -ENOENT) + break; + } + + return desc; +} + +struct gpio_desc *of_find_gpio(struct fwnode_handle *fwnode, + const char *con_id, unsigned int idx, + unsigned long *flags) +{ + struct device_node *np = to_of_node(fwnode); + struct gpio_desc *desc; + enum of_gpio_flags of_flags; + + desc = of_find_node_gpio(np, con_id, idx, &of_flags); + if (!IS_ERR(desc)) + of_gpio_flags_to_lookup(of_flags, flags); + + return desc; +} + /* * The SPI GPIO bindings happened before we managed to establish that GPIO * properties should be named "foo-gpios" so we have this special kludge for @@ -383,7 +425,7 @@ static struct gpio_desc *of_find_spi_gpio(struct device *dev, const char *con_id static struct gpio_desc *of_find_spi_cs_gpio(struct device *dev, const char *con_id, unsigned int idx, - unsigned long *flags) + enum of_gpio_flags *of_flags) { struct device_node *np = dev->of_node; @@ -403,7 +445,7 @@ static struct gpio_desc *of_find_spi_cs_gpio(struct device *dev, * uses just "gpios" so translate to that when "cs-gpios" is * requested. */ - return of_find_gpio(dev, NULL, idx, flags); + return of_find_node_gpio(dev->of_node, NULL, idx, of_flags); } /* @@ -451,41 +493,18 @@ static struct gpio_desc *of_find_arizona_gpio(struct device *dev, return of_get_named_gpiod_flags(dev->of_node, con_id, 0, of_flags); } -struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, - unsigned int idx, unsigned long *flags) +struct gpio_desc *of_find_gpio_fallback(struct device *dev, + const char *con_id, unsigned int idx, + unsigned long *flags) { - char prop_name[32]; /* 32 is max size of property name */ - enum of_gpio_flags of_flags; struct gpio_desc *desc; - unsigned int i; - - /* Try GPIO property "foo-gpios" and "foo-gpio" */ - for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) { - if (con_id) - snprintf(prop_name, sizeof(prop_name), "%s-%s", con_id, - gpio_suffixes[i]); - else - snprintf(prop_name, sizeof(prop_name), "%s", - gpio_suffixes[i]); - - desc = of_get_named_gpiod_flags(dev->of_node, prop_name, idx, - &of_flags); - - if (!IS_ERR(desc) || PTR_ERR(desc) != -ENOENT) - break; - } + enum of_gpio_flags of_flags; - if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT) { - /* Special handling for SPI GPIOs if used */ - desc = of_find_spi_gpio(dev, con_id, &of_flags); - } + /* Special handling for SPI GPIOs if used */ + desc = of_find_spi_gpio(dev, con_id, &of_flags); - if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT) { - /* This quirk looks up flags and all */ - desc = of_find_spi_cs_gpio(dev, con_id, idx, flags); - if (!IS_ERR(desc)) - return desc; - } + if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT) + desc = of_find_spi_cs_gpio(dev, con_id, idx, &of_flags); if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT) { /* Special handling for regulator GPIOs if used */ @@ -495,26 +514,8 @@ struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, if (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT) desc = of_find_arizona_gpio(dev, con_id, &of_flags); - if (IS_ERR(desc)) - return desc; - - if (of_flags & OF_GPIO_ACTIVE_LOW) - *flags |= GPIO_ACTIVE_LOW; - - if (of_flags & OF_GPIO_SINGLE_ENDED) { - if (of_flags & OF_GPIO_OPEN_DRAIN) - *flags |= GPIO_OPEN_DRAIN; - else - *flags |= GPIO_OPEN_SOURCE; - } - - if (of_flags & OF_GPIO_TRANSITORY) - *flags |= GPIO_TRANSITORY; - - if (of_flags & OF_GPIO_PULL_UP) - *flags |= GPIO_PULL_UP; - if (of_flags & OF_GPIO_PULL_DOWN) - *flags |= GPIO_PULL_DOWN; + if (!IS_ERR(desc)) + of_gpio_flags_to_lookup(of_flags, flags); return desc; } diff --git a/drivers/gpio/gpiolib-of.h b/drivers/gpio/gpiolib-of.h index 454d1658ee2d..580539cd995f 100644 --- a/drivers/gpio/gpiolib-of.h +++ b/drivers/gpio/gpiolib-of.h @@ -3,14 +3,17 @@ #ifndef GPIOLIB_OF_H #define GPIOLIB_OF_H +struct fwnode_handle; struct gpio_chip; enum of_gpio_flags; #ifdef CONFIG_OF_GPIO -struct gpio_desc *of_find_gpio(struct device *dev, - const char *con_id, - unsigned int idx, - unsigned long *lookupflags); +struct gpio_desc *of_find_gpio(struct fwnode_handle *fwnode, + const char *con_id, unsigned int idx, + unsigned long *flags); +struct gpio_desc *of_find_gpio_fallback(struct device *dev, + const char *con_id, unsigned int idx, + unsigned long *flags); struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np, const char *list_name, int index, enum of_gpio_flags *flags); int of_gpiochip_add(struct gpio_chip *gc); @@ -18,10 +21,17 @@ void of_gpiochip_remove(struct gpio_chip *gc); int of_gpio_get_count(struct device *dev, const char *con_id); bool of_gpio_need_valid_mask(const struct gpio_chip *gc); #else -static inline struct gpio_desc *of_find_gpio(struct device *dev, - const char *con_id, - unsigned int idx, - unsigned long *lookupflags) +static inline +struct gpio_desc *of_find_gpio(struct fwnode_handle *fwnode, + const char *con_id, unsigned int idx, + unsigned long *flags) +{ + return ERR_PTR(-ENOENT); +} +static inline +struct gpio_desc *of_find_gpio_fallback(struct device *dev, + const char *con_id, unsigned int idx, + unsigned long *flags) { return ERR_PTR(-ENOENT); } diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 54db2c42e9a0..1248e61f9a23 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -4562,7 +4562,12 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev, /* Using device tree? */ if (IS_ENABLED(CONFIG_OF) && dev->of_node) { dev_dbg(dev, "using device tree for GPIO lookup\n"); - desc = of_find_gpio(dev, con_id, idx, &lookupflags); + desc = of_find_gpio(dev_fwnode(dev), + con_id, idx, &lookupflags); + if (desc == ERR_PTR(-ENOENT)) + desc = of_find_gpio_fallback(dev, con_id, idx, + &lookupflags); + } else if (ACPI_COMPANION(dev)) { dev_dbg(dev, "using ACPI for GPIO lookup\n"); desc = acpi_find_gpio(dev, con_id, idx, &flags, &lookupflags); From patchwork Wed Sep 11 07:52:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160718 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="iUhv4bg3"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvJL020Gz9sNx for ; Wed, 11 Sep 2019 17:52:34 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727274AbfIKHwc (ORCPT ); Wed, 11 Sep 2019 03:52:32 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:46852 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727259AbfIKHwb (ORCPT ); Wed, 11 Sep 2019 03:52:31 -0400 Received: by mail-pf1-f196.google.com with SMTP id q5so13125535pfg.13; Wed, 11 Sep 2019 00:52:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=d8sM5opJG43/oMJGd+vUXu/Jf8ktApOUdWkyRE4vC5g=; b=iUhv4bg3cE1uGHcMOYuOTmdVGsImmIkPPep1vYlZ4RhzFawuGGh9f6dWWYSS/53kGI zb8+VfBu65TDA3DAO3Wp7dT5Pn4nF+Lf8nj6VZ4kzoDEVXepQzoiqckC0sF3iT6erMn2 +NaI4jVunVvszbv8q5QkoXwJH27QgGZKlF/fOI1tD7L44SLU7v7rEhPQb9niFVYZaFFI FM0SS1byvAMdEuIQCyazmpCmgEwRDCmV2h/qIlb05puVtmXU8+brjhW1tUGEJBCbD2m5 A909GBidewWRna3xU/P+P9Rm3rwddIemGU2b8YCry45zGe1lMwRhjleC5A4Nwp16BMt/ o4ZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=d8sM5opJG43/oMJGd+vUXu/Jf8ktApOUdWkyRE4vC5g=; b=JA56flA8JLnMbhQOd8+YjCuiWhgDvn6yqz/SAz3DrqynpcvWaBlWA8rJhRTFNPyn0s U0Bjgdrj7tEuajHaKB1caP4wSuaebDfq/pbwGoocaG7sVh47Ak+ffJYMwaNYGcWhIcaK yZl/8I6s+TrArahD+iizvNAjOfrbd04M37Bz3sq9au+cSbQh+qt67aJt+SQZTTh6C8fl jO/evqT/OO+O8yKQb4Kry/Nc1S87/cN9jVfnn+vb/8+8p3DFJoKTQ8h9DlpmXb57A/fs 10wJvFx0iHiLJbgccXJo/QClp8gS27/tI0SfICBlLNqAMlWvt1UApjYBhz+7TsmO6Uyw ajsA== X-Gm-Message-State: APjAAAXIhHt6SoyQWlSnEqF4MJBKar4DnaLyGn9nRJ4fmd39yuoHrdEO O9R2orLLvjelZGpjUhPOXLg= X-Google-Smtp-Source: APXvYqx4yStbx4hEG2ye41cPbuNrASmOr85tSU1M+GTgDe4ihmdbWBxnZX0I3Y6aNRnhBe8axC7v1Q== X-Received: by 2002:a63:6f8f:: with SMTP id k137mr31567108pgc.90.1568188350163; Wed, 11 Sep 2019 00:52:30 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:29 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Bartosz Golaszewski , linux-acpi@vger.kernel.org Subject: [PATCH 09/11] gpiolib: of: tease apart acpi_find_gpio() Date: Wed, 11 Sep 2019 00:52:13 -0700 Message-Id: <20190911075215.78047-10-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Tease apart acpi_find_gpio() into common function that works on the firmware node, and a fallback handler that works on the ACPI device structure, so that we can later use acpi_find_gpio() in fwnode_gpiod_get_index(). Signed-off-by: Dmitry Torokhov --- drivers/gpio/gpiolib-acpi.c | 77 +++++++++++++++++++++++++------------ drivers/gpio/gpiolib-acpi.h | 17 +++++++- drivers/gpio/gpiolib.c | 8 +++- 3 files changed, 74 insertions(+), 28 deletions(-) diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index 2b6fdc9947f7..8174db1bc02e 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -728,29 +728,35 @@ static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev, return ret ? ERR_PTR(ret) : lookup.desc; } -static bool acpi_can_fallback_to_crs(struct acpi_device *adev, - const char *con_id) +static int acpi_finalize_gpio_lookup(struct acpi_gpio_info *info, + enum gpiod_flags *dflags, + unsigned long *lookupflags) { - /* Never allow fallback if the device has properties */ - if (acpi_dev_has_props(adev) || adev->driver_gpios) - return false; + if (info->gpioint && + (*dflags == GPIOD_OUT_LOW || *dflags == GPIOD_OUT_HIGH)) { + dev_dbg(&info->adev->dev, + "refusing GpioInt() entry when doing GPIOD_OUT_* lookup\n"); + return -ENOENT; + } - return con_id == NULL; + acpi_gpio_update_gpiod_flags(dflags, info); + acpi_gpio_update_gpiod_lookup_flags(lookupflags, info); + + return 0; } -struct gpio_desc *acpi_find_gpio(struct device *dev, - const char *con_id, - unsigned int idx, +struct gpio_desc *acpi_find_gpio(struct fwnode_handle *fwnode, + const char *con_id, unsigned int idx, enum gpiod_flags *dflags, unsigned long *lookupflags) { - struct acpi_device *adev = ACPI_COMPANION(dev); struct acpi_gpio_info info; struct gpio_desc *desc; char propname[32]; int i; + int error; - /* Try first from _DSD */ + /* Try GPIOs from _DSD */ for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) { if (con_id) { snprintf(propname, sizeof(propname), "%s-%s", @@ -760,31 +766,52 @@ struct gpio_desc *acpi_find_gpio(struct device *dev, gpio_suffixes[i]); } - desc = acpi_get_gpiod_by_index(adev, propname, idx, &info); + desc = acpi_node_get_gpiod(fwnode, propname, idx, &info); if (!IS_ERR(desc)) break; if (PTR_ERR(desc) == -EPROBE_DEFER) return ERR_CAST(desc); } - /* Then from plain _CRS GPIOs */ - if (IS_ERR(desc)) { - if (!acpi_can_fallback_to_crs(adev, con_id)) - return ERR_PTR(-ENOENT); - - desc = acpi_get_gpiod_by_index(adev, NULL, idx, &info); - if (IS_ERR(desc)) - return desc; + if (!IS_ERR(desc)) { + error = acpi_finalize_gpio_lookup(&info, dflags, lookupflags); + if (error) + return ERR_PTR(error); } - if (info.gpioint && - (*dflags == GPIOD_OUT_LOW || *dflags == GPIOD_OUT_HIGH)) { - dev_dbg(dev, "refusing GpioInt() entry when doing GPIOD_OUT_* lookup\n"); + return desc; +} + +static bool acpi_can_fallback_to_crs(struct acpi_device *adev, + const char *con_id) +{ + /* Never allow fallback if the device has properties */ + if (acpi_dev_has_props(adev) || adev->driver_gpios) + return false; + + return con_id == NULL; +} + +struct gpio_desc *acpi_find_gpio_fallback(struct acpi_device *adev, + const char *con_id, unsigned int idx, + enum gpiod_flags *dflags, + unsigned long *lookupflags) +{ + struct acpi_gpio_info info; + struct gpio_desc *desc; + int error; + + /* Then from plain _CRS GPIOs */ + if (!acpi_can_fallback_to_crs(adev, con_id)) return ERR_PTR(-ENOENT); + + desc = acpi_get_gpiod_by_index(adev, NULL, idx, &info); + if (!IS_ERR(desc)) { + error = acpi_finalize_gpio_lookup(&info, dflags, lookupflags); + if (error) + return ERR_PTR(error); } - acpi_gpio_update_gpiod_flags(dflags, &info); - acpi_gpio_update_gpiod_lookup_flags(lookupflags, &info); return desc; } diff --git a/drivers/gpio/gpiolib-acpi.h b/drivers/gpio/gpiolib-acpi.h index 1c6d65cf0629..ea97a3822116 100644 --- a/drivers/gpio/gpiolib-acpi.h +++ b/drivers/gpio/gpiolib-acpi.h @@ -9,6 +9,7 @@ #define GPIOLIB_ACPI_H struct acpi_device; +struct fwnode_handle; /** * struct acpi_gpio_info - ACPI GPIO specific information @@ -42,11 +43,16 @@ int acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, int acpi_gpio_update_gpiod_lookup_flags(unsigned long *lookupflags, struct acpi_gpio_info *info); -struct gpio_desc *acpi_find_gpio(struct device *dev, +struct gpio_desc *acpi_find_gpio(struct fwnode_handle *fwnode, const char *con_id, unsigned int idx, enum gpiod_flags *dflags, unsigned long *lookupflags); +struct gpio_desc *acpi_find_gpio_fallback(struct acpi_device *adev, + const char *con_id, + unsigned int idx, + enum gpiod_flags *dflags, + unsigned long *lookupflags); struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, const char *propname, int index, struct acpi_gpio_info *info); @@ -75,13 +81,20 @@ acpi_gpio_update_gpiod_lookup_flags(unsigned long *lookupflags, } static inline struct gpio_desc * -acpi_find_gpio(struct device *dev, const char *con_id, +acpi_find_gpio(struct firmware_node *fwnode, const char *con_id, unsigned int idx, enum gpiod_flags *dflags, unsigned long *lookupflags) { return ERR_PTR(-ENOENT); } static inline struct gpio_desc * +acpi_find_gpio_fallback(struct acpi_device *adev, const char *con_id, + unsigned int idx, enum gpiod_flags *dflags, + unsigned long *lookupflags) +{ + return ERR_PTR(-ENOENT); +} +static inline struct gpio_desc * acpi_node_get_gpiod(struct fwnode_handle *fwnode, const char *propname, int index, struct acpi_gpio_info *info) { diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 1248e61f9a23..2d8dd67ab03d 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -4570,7 +4570,13 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev, } else if (ACPI_COMPANION(dev)) { dev_dbg(dev, "using ACPI for GPIO lookup\n"); - desc = acpi_find_gpio(dev, con_id, idx, &flags, &lookupflags); + desc = acpi_find_gpio(dev_fwnode(dev), con_id, idx, + &flags, &lookupflags); + if (desc == ERR_PTR(-ENOENT)) + desc = acpi_find_gpio_fallback( + ACPI_COMPANION(dev), + con_id, idx, + &flags, &lookupflags); } } From patchwork Wed Sep 11 07:52:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160721 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="kgtseBrK"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvJg1S7yz9sP6 for ; Wed, 11 Sep 2019 17:52:51 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727339AbfIKHwn (ORCPT ); Wed, 11 Sep 2019 03:52:43 -0400 Received: from mail-pg1-f196.google.com ([209.85.215.196]:42695 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727273AbfIKHwd (ORCPT ); Wed, 11 Sep 2019 03:52:33 -0400 Received: by mail-pg1-f196.google.com with SMTP id p3so11098852pgb.9; Wed, 11 Sep 2019 00:52:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BdTKaY3wA6DjyTzXunn2GDLjirzBeCjbyMCd9Q0RtXU=; b=kgtseBrKNduTLuDjbf+nnJfdWUe8R6hU2sBucrtHaER8AtaPZLffUBKQ7zr0QZJuqF oeoKniXWWDZK8gJzw9FSP/j5nBkubXBrI10oYeE9PVsotY487y5rDday1tQ328IofVUl uWk8sYrpOvYwH8lv+ejRqzLyqOwwf9AbKuGQxjPRq4ocGwj8vglWmt60hz/802ikWROk ZHwdjZR2Tm9qg9MzzgaIrR8fia5I0Cr/wazaDf5FAjoJz9/+HdUyeobTaW2DQMoHtqiD uD9Tqe+arzgxU8ab1jz9M8h0oa+UKpOpNdSZEQj7qWNIxKN7YMSOVqOHiqdmmAZdrItj mD+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BdTKaY3wA6DjyTzXunn2GDLjirzBeCjbyMCd9Q0RtXU=; b=G5bha0BY9oOWHVJ3FQYcmy3K3uZYknbUDF6CDkX+I2JKyVbaPU58RpaJ/3+MPs8/Jz I7MoCL8nF/4FFsxgbo9GBRd0MWk7/jiuXTsoqQQQ+HabDFeZDrNIz5PTbFRZc6XOoMV5 QXYVwLHYx5ZpI/ycvMnI63ta2hMG+2uioj3jg4twIcmRpV7Lx6g8QouiC76YfFwHWE8S qpbdw6WBSA/zWMbWRdeR9/0FXCnu4h/KkOeZVkFLD8Rbr2LRAux6i3jw7/ouwye/qkbh q130/FF6S2yBCu6POZ5jt46jRIO+aaVfkbURzTytzlpB6dcfualV2fSVsrGzDRcdKsdP 0IjA== X-Gm-Message-State: APjAAAXEvZZCkhTG+4L8lYz6GGhTfPlL5gXIhRDhzZPdGcskWUoh772w 4YhJGvKpfBm/4KxZknPQsFI= X-Google-Smtp-Source: APXvYqxR5dIGPzXEbPMdcLUx9cMDAZtHeouY8WeRdC3/qhWi1953gvlbApVo01HjGtj0xBjIFP7bAw== X-Received: by 2002:a17:90a:ac16:: with SMTP id o22mr4076730pjq.8.1568188351279; Wed, 11 Sep 2019 00:52:31 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:30 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Bartosz Golaszewski , linux-acpi@vger.kernel.org Subject: [PATCH 10/11] gpiolib: consolidate fwnode GPIO lookups Date: Wed, 11 Sep 2019 00:52:14 -0700 Message-Id: <20190911075215.78047-11-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Ensure that all paths to obtain/look up GPIOD from generic consumer-visible APIs go through the new fwnode_locate_gpiod(), so that we can easily extend the support for new firmware mechanisms. Signed-off-by: Dmitry Torokhov --- drivers/gpio/gpiolib-acpi.c | 88 +++++++++++++++---------------- drivers/gpio/gpiolib-acpi.h | 10 ---- drivers/gpio/gpiolib.c | 100 ++++++++++++------------------------ 3 files changed, 77 insertions(+), 121 deletions(-) diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index 8174db1bc02e..13907add5027 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -728,6 +728,50 @@ static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev, return ret ? ERR_PTR(ret) : lookup.desc; } +/** + * acpi_node_get_gpiod() - get a GPIO descriptor from ACPI resources + * @fwnode: pointer to an ACPI firmware node to get the GPIO information from + * @propname: Property name of the GPIO + * @index: index of GpioIo/GpioInt resource (starting from %0) + * @info: info pointer to fill in (optional) + * + * If @fwnode is an ACPI device object, call acpi_get_gpiod_by_index() for it. + * Otherwise (i.e. it is a data-only non-device object), use the property-based + * GPIO lookup to get to the GPIO resource with the relevant information and use + * that to obtain the GPIO descriptor to return. + * + * If the GPIO cannot be translated or there is an error an ERR_PTR is + * returned. + */ +static struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, + const char *propname, int index, + struct acpi_gpio_info *info) +{ + struct acpi_gpio_lookup lookup; + struct acpi_device *adev; + int ret; + + adev = to_acpi_device_node(fwnode); + if (adev) + return acpi_get_gpiod_by_index(adev, propname, index, info); + + if (!is_acpi_data_node(fwnode)) + return ERR_PTR(-ENODEV); + + if (!propname) + return ERR_PTR(-EINVAL); + + memset(&lookup, 0, sizeof(lookup)); + lookup.index = index; + + ret = acpi_gpio_property_lookup(fwnode, propname, index, &lookup); + if (ret) + return ERR_PTR(ret); + + ret = acpi_gpio_resource_lookup(&lookup, info); + return ret ? ERR_PTR(ret) : lookup.desc; +} + static int acpi_finalize_gpio_lookup(struct acpi_gpio_info *info, enum gpiod_flags *dflags, unsigned long *lookupflags) @@ -815,50 +859,6 @@ struct gpio_desc *acpi_find_gpio_fallback(struct acpi_device *adev, return desc; } -/** - * acpi_node_get_gpiod() - get a GPIO descriptor from ACPI resources - * @fwnode: pointer to an ACPI firmware node to get the GPIO information from - * @propname: Property name of the GPIO - * @index: index of GpioIo/GpioInt resource (starting from %0) - * @info: info pointer to fill in (optional) - * - * If @fwnode is an ACPI device object, call acpi_get_gpiod_by_index() for it. - * Otherwise (i.e. it is a data-only non-device object), use the property-based - * GPIO lookup to get to the GPIO resource with the relevant information and use - * that to obtain the GPIO descriptor to return. - * - * If the GPIO cannot be translated or there is an error an ERR_PTR is - * returned. - */ -struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, - const char *propname, int index, - struct acpi_gpio_info *info) -{ - struct acpi_gpio_lookup lookup; - struct acpi_device *adev; - int ret; - - adev = to_acpi_device_node(fwnode); - if (adev) - return acpi_get_gpiod_by_index(adev, propname, index, info); - - if (!is_acpi_data_node(fwnode)) - return ERR_PTR(-ENODEV); - - if (!propname) - return ERR_PTR(-EINVAL); - - memset(&lookup, 0, sizeof(lookup)); - lookup.index = index; - - ret = acpi_gpio_property_lookup(fwnode, propname, index, &lookup); - if (ret) - return ERR_PTR(ret); - - ret = acpi_gpio_resource_lookup(&lookup, info); - return ret ? ERR_PTR(ret) : lookup.desc; -} - /** * acpi_dev_gpio_irq_get() - Find GpioInt and translate it to Linux IRQ number * @adev: pointer to a ACPI device to get IRQ from diff --git a/drivers/gpio/gpiolib-acpi.h b/drivers/gpio/gpiolib-acpi.h index ea97a3822116..047df1d5c7fa 100644 --- a/drivers/gpio/gpiolib-acpi.h +++ b/drivers/gpio/gpiolib-acpi.h @@ -53,10 +53,6 @@ struct gpio_desc *acpi_find_gpio_fallback(struct acpi_device *adev, unsigned int idx, enum gpiod_flags *dflags, unsigned long *lookupflags); -struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, - const char *propname, int index, - struct acpi_gpio_info *info); - int acpi_gpio_count(struct device *dev, const char *con_id); #else static inline void acpi_gpiochip_add(struct gpio_chip *chip) { } @@ -94,12 +90,6 @@ acpi_find_gpio_fallback(struct acpi_device *adev, const char *con_id, { return ERR_PTR(-ENOENT); } -static inline struct gpio_desc * -acpi_node_get_gpiod(struct fwnode_handle *fwnode, const char *propname, - int index, struct acpi_gpio_info *info) -{ - return ERR_PTR(-ENXIO); -} static inline int acpi_gpio_count(struct device *dev, const char *con_id) { return -ENODEV; diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 2d8dd67ab03d..6534dcd6e406 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -4314,44 +4314,27 @@ static int platform_gpio_count(struct device *dev, const char *con_id) return count; } -static struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, - const char *propname, int index, - enum gpiod_flags dflags, - const char *label) +static struct gpio_desc *fwnode_locate_gpiod(struct fwnode_handle *fwnode, + struct device *dev, + const char *con_id, int idx, + enum gpiod_flags *flags, + unsigned long *lookupflags) { - unsigned long lflags = GPIO_LOOKUP_FLAGS_DEFAULT; struct gpio_desc *desc = ERR_PTR(-ENODEV); - int ret; - - if (!fwnode) - return ERR_PTR(-EINVAL); if (is_of_node(fwnode)) { - desc = gpiod_get_from_of_node(to_of_node(fwnode), - propname, index, - dflags, - label); - return desc; + dev_dbg(dev, "using device tree for GPIO lookup\n"); + desc = of_find_gpio(fwnode, con_id, idx, lookupflags); + if (desc == ERR_PTR(-ENOENT) && dev) + desc = of_find_gpio_fallback(dev, con_id, idx, + lookupflags); } else if (is_acpi_node(fwnode)) { - struct acpi_gpio_info info; - - desc = acpi_node_get_gpiod(fwnode, propname, index, &info); - if (IS_ERR(desc)) - return desc; - - acpi_gpio_update_gpiod_flags(&dflags, &info); - acpi_gpio_update_gpiod_lookup_flags(&lflags, &info); - } - - /* Currently only ACPI takes this path */ - ret = gpiod_request(desc, label); - if (ret) - return ERR_PTR(ret); - - ret = gpiod_configure_flags(desc, propname, lflags, dflags); - if (ret < 0) { - gpiod_put(desc); - return ERR_PTR(ret); + dev_dbg(dev, "using ACPI for GPIO lookup\n"); + desc = acpi_find_gpio(fwnode, con_id, idx, flags, lookupflags); + if (desc == ERR_PTR(-ENOENT) && dev) + desc = acpi_find_gpio_fallback(ACPI_COMPANION(dev), + con_id, idx, + flags, lookupflags); } return desc; @@ -4383,22 +4366,23 @@ struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode, enum gpiod_flags flags, const char *label) { + unsigned long lookupflags = GPIO_LOOKUP_FLAGS_DEFAULT; struct gpio_desc *desc; - char prop_name[32]; /* 32 is max size of property name */ - unsigned int i; + int error; - for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) { - if (con_id) - snprintf(prop_name, sizeof(prop_name), "%s-%s", - con_id, gpio_suffixes[i]); - else - snprintf(prop_name, sizeof(prop_name), "%s", - gpio_suffixes[i]); + desc = fwnode_locate_gpiod(fwnode, NULL, con_id, index, + &flags, &lookupflags); + if (IS_ERR(desc)) + return desc; - desc = fwnode_get_named_gpiod(fwnode, prop_name, index, flags, - label); - if (!IS_ERR(desc) || (PTR_ERR(desc) != -ENOENT)) - break; + error = gpiod_request(desc, label); + if (error) + return ERR_PTR(error); + + error = gpiod_configure_flags(desc, con_id, lookupflags, flags); + if (error < 0) { + gpiod_put(desc); + return ERR_PTR(error); } return desc; @@ -4558,27 +4542,9 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev, dev_dbg(dev, "GPIO lookup for consumer %s\n", con_id); - if (dev) { - /* Using device tree? */ - if (IS_ENABLED(CONFIG_OF) && dev->of_node) { - dev_dbg(dev, "using device tree for GPIO lookup\n"); - desc = of_find_gpio(dev_fwnode(dev), - con_id, idx, &lookupflags); - if (desc == ERR_PTR(-ENOENT)) - desc = of_find_gpio_fallback(dev, con_id, idx, - &lookupflags); - - } else if (ACPI_COMPANION(dev)) { - dev_dbg(dev, "using ACPI for GPIO lookup\n"); - desc = acpi_find_gpio(dev_fwnode(dev), con_id, idx, - &flags, &lookupflags); - if (desc == ERR_PTR(-ENOENT)) - desc = acpi_find_gpio_fallback( - ACPI_COMPANION(dev), - con_id, idx, - &flags, &lookupflags); - } - } + if (dev) + desc = fwnode_locate_gpiod(dev_fwnode(dev), dev, con_id, idx, + &flags, &lookupflags); /* * Either we are not using DT or ACPI, or their lookup did not return From patchwork Wed Sep 11 07:52:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Torokhov X-Patchwork-Id: 1160720 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bwMX/jqD"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46SvJf3SVyz9sNx for ; Wed, 11 Sep 2019 17:52:50 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727346AbfIKHwn (ORCPT ); Wed, 11 Sep 2019 03:52:43 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:39423 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727281AbfIKHwd (ORCPT ); Wed, 11 Sep 2019 03:52:33 -0400 Received: by mail-pf1-f196.google.com with SMTP id i1so4304148pfa.6; Wed, 11 Sep 2019 00:52:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gKLtdokeOoRF3SRWNOq5UT1zY3ZXy0T2vFi4VcDT30o=; b=bwMX/jqDCuA3mgnugHD0og1w1xqERquBp3pjLXh9xr4ZtLEGTSDW+BphHSD2VintP4 dmMbfwifJ7PGuRV5Kx8GiZwPQvrcHKuxW9KG0PFUlDW8d9VTRVSg8FT6fRXu0Mn/PTg5 ruyxr1SYJDXMcdrlB8GjKKLW2oeqsKXe890uetXIvVpXUxArc7zPw+ViSkwZKkwxLowR kHu74qN8sHbhRgOFs3dDO78pwWpK5ADAkrGifbAYWYnk5ZmN7CV0+PMrYUv7gGCWKHxs V3ereFdZzMvw3W8001Da8RH4mDywWfQcA/jtpJdrAcgQCMyN3JZU7xVrpTl2MBAQ5J2J 2V/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gKLtdokeOoRF3SRWNOq5UT1zY3ZXy0T2vFi4VcDT30o=; b=Vwa8g31uuOD8uUH44L5DMllUE8Sxs5vbNFOw5F3viiaidyIEQF5i1nu19pwQPbtB19 BNi3fHaNAb1GuQRZTtZnk65lLUUtRoguAe47NAkDTpJ95r1oKBOUfzst2LNJ4kRjKDAW 39J4a9J9SVkpbTN6C4M+IIu/VuFhdDWw+/8LUDxiabQc1aw+1u1/xjt1CM39i0QoZqp+ a2p4i6FcxLjFrFSLDywjMYxuAaUWkUm0xARuYBJ6NIyaSvsHRJV/+5r8cztq+nzX7yrW oxnyHK3CDb+M1Gr1NuZZ/u3dcpiVAw5Pq5Z1mNZtzpVeY3ODau61MYPcmBZkC3tNEaCS +tAw== X-Gm-Message-State: APjAAAXZ+j3Ze6Mb/U0XWUOAJ0YyPEj57FQOMWe+NkFhkfZY1BqFd+vq 6hnyLOhKc0GyPJc2r5CTBso= X-Google-Smtp-Source: APXvYqw6at7dv7tZ/aC8L4GCiaU6acQ/RkIsI4G1MnS2IAJcx1wKj4CXMTmGu4N5sjAy34LaJybNhA== X-Received: by 2002:a63:fc52:: with SMTP id r18mr31872839pgk.378.1568188352173; Wed, 11 Sep 2019 00:52:32 -0700 (PDT) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:3adc:b08c:7acc:b325]) by smtp.gmail.com with ESMTPSA id u2sm8582445pgp.66.2019.09.11.00.52.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2019 00:52:31 -0700 (PDT) From: Dmitry Torokhov To: Linus Walleij Cc: Andy Shevchenko , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH 11/11] gpiolib: add support for software nodes Date: Wed, 11 Sep 2019 00:52:15 -0700 Message-Id: <20190911075215.78047-12-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.23.0.162.g0b9fbb3734-goog In-Reply-To: <20190911075215.78047-1-dmitry.torokhov@gmail.com> References: <20190911075215.78047-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Now that static device properties understand notion of child nodes and references, let's teach gpiolib to handle them: - GPIOs are represented as a references to software nodes representing gpiochip - references must have 2 arguments - GPIO number within the chip and GPIO flags (GPIO_ACTIVE_LOW/GPIO_ACTIVE_HIGH, etc). - name of the software node representing gpiochip must match label of the gpiochip, as we use it to locate gpiochip structure at runtime. const struct software_node gpio_bank_b_node = { .name = "B", }; const struct property_entry simone_key_enter_props[] __initconst = { PROPERTY_ENTRY_U32("linux,code", KEY_ENTER), PROPERTY_ENTRY_STRING("label", "enter"), PROPERTY_ENTRY_REF("gpios", &gpio_bank_b_node, 123, GPIO_ACTIVE_LOW), { } }; Signed-off-by: Dmitry Torokhov --- drivers/gpio/Makefile | 1 + drivers/gpio/gpiolib-swnode.c | 92 +++++++++++++++++++++++++++++++++++ drivers/gpio/gpiolib-swnode.h | 13 +++++ drivers/gpio/gpiolib.c | 31 ++++++++++-- 4 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 drivers/gpio/gpiolib-swnode.c create mode 100644 drivers/gpio/gpiolib-swnode.h diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index d2fd19c15bae..41869ba725e2 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -7,6 +7,7 @@ obj-$(CONFIG_GPIOLIB) += gpiolib.o obj-$(CONFIG_GPIOLIB) += gpiolib-devres.o obj-$(CONFIG_GPIOLIB) += gpiolib-legacy.o obj-$(CONFIG_GPIOLIB) += gpiolib-devprop.o +obj-$(CONFIG_GPIOLIB) += gpiolib-swnode.o obj-$(CONFIG_OF_GPIO) += gpiolib-of.o obj-$(CONFIG_GPIO_SYSFS) += gpiolib-sysfs.o obj-$(CONFIG_GPIO_ACPI) += gpiolib-acpi.o diff --git a/drivers/gpio/gpiolib-swnode.c b/drivers/gpio/gpiolib-swnode.c new file mode 100644 index 000000000000..a20d73cc9a3f --- /dev/null +++ b/drivers/gpio/gpiolib-swnode.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Software Node helpers for the GPIO API + * + * Copyright 2019 Google LLC + */ +#include +#include +#include + +#include "gpiolib.h" +#include "gpiolib-swnode.h" + +static int swnode_gpiochip_match_name(struct gpio_chip *chip, void *data) +{ + return !strcmp(chip->label, data); +} + +struct gpio_desc *swnode_find_gpio(struct fwnode_handle *fwnode, + const char *con_id, unsigned int idx, + unsigned long *flags) +{ + const struct software_node *chip_node; + const struct software_node *swnode; + struct fwnode_reference_args args; + struct gpio_chip *chip; + char prop_name[32]; /* 32 is max size of property name */ + int error; + + swnode = to_software_node(fwnode); + if (!swnode) + return ERR_PTR(-EINVAL); + + /* + * Note we do not need to try both -gpios and -gpio suffixes, + * as, unlike OF and ACPI, we can fix software nodes to conform + * to the proper binding. + */ + if (con_id) + snprintf(prop_name, sizeof(prop_name), "%s-gpios", con_id); + else + stracpy(prop_name, "gpios"); + + /* + * We expect all swnode-described GPIOs have GPIO number and + * polarity arguments, hence nargs is set to 2. + */ + error = fwnode_property_get_reference_args(fwnode, prop_name, NULL, + 2, idx, &args); + if (error) { + pr_debug("%s: can't parse '%s' property of node '%s[%d]'\n", + __func__, prop_name, swnode->name ?: "unnamed", idx); + return ERR_PTR(error); + } + + chip_node = to_software_node(args.fwnode); + if (!chip_node || !chip_node->name) + return ERR_PTR(-EINVAL); + + chip = gpiochip_find((void *)chip_node->name, + swnode_gpiochip_match_name); + if (!chip) + return ERR_PTR(-EPROBE_DEFER); + + /* We expect native GPIO flags */ + *flags = args.args[1]; + + return gpiochip_get_desc(chip, args.args[0]); +} + +int swnode_gpio_count(struct fwnode_handle *fwnode, const char *con_id) +{ + struct fwnode_reference_args args; + char prop_name[32]; + int count; + + if (con_id) + snprintf(prop_name, sizeof(prop_name), "%s-gpios", con_id); + else + stracpy(prop_name, "gpios"); + + /* + * This is not very efficient, but GPIO lists usually have only + * 1 or 2 entries. + */ + count = 0; + while (fwnode_property_get_reference_args(fwnode, prop_name, NULL, + 0, count, &args) == 0) + count++; + + return count ? count : -ENOENT; +} diff --git a/drivers/gpio/gpiolib-swnode.h b/drivers/gpio/gpiolib-swnode.h new file mode 100644 index 000000000000..afd51c9b6e34 --- /dev/null +++ b/drivers/gpio/gpiolib-swnode.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef GPIOLIB_SWNODE_H +#define GPIOLIB_SWNODE_H + +struct fwnode_handle; + +struct gpio_desc *swnode_find_gpio(struct fwnode_handle *fwnode, + const char *con_id, unsigned int idx, + unsigned long *flags); +int swnode_gpio_count(struct fwnode_handle *fwnode, const char *con_id); + +#endif /* GPIOLIB_SWNODE_H */ diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 6534dcd6e406..0f41b4b9b8ba 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -31,6 +31,7 @@ #include "gpiolib.h" #include "gpiolib-of.h" #include "gpiolib-acpi.h" +#include "gpiolib-swnode.h" #define CREATE_TRACE_POINTS #include @@ -4335,6 +4336,16 @@ static struct gpio_desc *fwnode_locate_gpiod(struct fwnode_handle *fwnode, desc = acpi_find_gpio_fallback(ACPI_COMPANION(dev), con_id, idx, flags, lookupflags); + } else if (is_software_node(fwnode)) { + dev_dbg(dev, "using software node for GPIO lookup\n"); + desc = swnode_find_gpio(fwnode, con_id, idx, lookupflags); + } + + if (IS_ERR(desc) && + !IS_ERR_OR_NULL(fwnode) && + is_software_node(fwnode->secondary)) { + desc = swnode_find_gpio(fwnode->secondary, + con_id, idx, lookupflags); } return desc; @@ -4397,12 +4408,24 @@ EXPORT_SYMBOL_GPL(fwnode_gpiod_get_index); */ int gpiod_count(struct device *dev, const char *con_id) { + struct fwnode_handle *fwnode; int count = -ENOENT; - if (IS_ENABLED(CONFIG_OF) && dev && dev->of_node) - count = of_gpio_get_count(dev, con_id); - else if (IS_ENABLED(CONFIG_ACPI) && dev && ACPI_HANDLE(dev)) - count = acpi_gpio_count(dev, con_id); + if (dev) { + fwnode = dev_fwnode(dev); + if (is_of_node(fwnode)) + count = of_gpio_get_count(dev, con_id); + else if (is_acpi_device_node(fwnode)) + count = acpi_gpio_count(dev, con_id); + else if (is_software_node(fwnode)) + count = swnode_gpio_count(fwnode, con_id); + + if (count < 0 && + !IS_ERR_OR_NULL(fwnode) && + is_software_node(fwnode->secondary)) { + count = swnode_gpio_count(fwnode, con_id); + } + } if (count < 0) count = platform_gpio_count(dev, con_id);