From patchwork Mon Nov 4 15:38:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1189018 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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="SAP1RXmt"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 476H681dj2z9sCJ for ; Tue, 5 Nov 2019 02:39:28 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727838AbfKDPj1 (ORCPT ); Mon, 4 Nov 2019 10:39:27 -0500 Received: from mail-pl1-f194.google.com ([209.85.214.194]:37831 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727891AbfKDPj1 (ORCPT ); Mon, 4 Nov 2019 10:39:27 -0500 Received: by mail-pl1-f194.google.com with SMTP id p13so7723227pll.4 for ; Mon, 04 Nov 2019 07:39:27 -0800 (PST) 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=2aM20PTVnKKVPzWeWkBlSsYQUFnZaDUnWU64bXMZpRM=; b=SAP1RXmtJRyIvRaQEtdbLTqToCmh+CM91d7lRTYc3WQJpKHkzK1CFeZ0mGZd7SXHY+ px4KNhUo0Qz73cn3hi3wnowtqsCmlqboLwh0dWoVaC/E9IK8eN8xjQb+uyIQp77WRmdJ b4SWpIgQ5TbM401FkTwpZgphAOTPTlqzloY4pOO/55NyI6KQD2/DhM99xhO9KzOKKdci 7TW1l6LFr90/yRApMGsZObtXpgoJFjEj7L9LTUDI/VWDGE6eYLWqykI3o3EN5/jq4Gwr w/CCtwZ1ps0OkzNmscCSlN9zULaaXKmVKaaypnj4L8qXXhrYDazEEkfmnRUy2GcHvZIv r+Ag== 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=2aM20PTVnKKVPzWeWkBlSsYQUFnZaDUnWU64bXMZpRM=; b=TuQ1tfsaYJ+pHGbRco2KVt69qzPtiyOIdQx8iceSOiuGL5EkPE3PVK2pOQBHDaZM9N dWqz2iQeQCWf+1mV+s/8taBX6HuyFXAQ4GAuCr16GA+SdeBzGQn6KBQn8u96NVM1uRk+ 3Rvw73dMlNgfY4wj1NKaNTEY1CnGFoDYtkTgAr+VhZvXHrNLs2ISaFTui17vujFkVeFp iUPHkvOOECMDUYU8ggQVGwrY3AeFxWEZweKUBEy1KAGY2NpRePe0kZJ6gNLO31if/Q+f 89A0OEx9NKcltaZyuPG0m96DblTDilQSYg+CrFHaM1MBi5s/FPbHyw28gz175kDrRknS v5XA== X-Gm-Message-State: APjAAAXbMidgMSdEkUGaYg0ZNhojV964v8ukKVyAFMs5EAuAtHJ3RkTX ql3FBTgrrGlz/F7uyVV8F4FmwfwK37o6yw== X-Google-Smtp-Source: APXvYqyw1y13DD0cE8LnfYTNFWN6+ul9jePlMamOPBHapSHa2F+HZQnhIbUemgM/PF+tXDvtnrCTTg== X-Received: by 2002:a17:902:8348:: with SMTP id z8mr14716323pln.130.1572881966055; Mon, 04 Nov 2019 07:39:26 -0800 (PST) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id a66sm5819761pfb.166.2019.11.04.07.39.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Nov 2019 07:39:25 -0800 (PST) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, thomas.petazzoni@bootlin.com, Kent Gibson Subject: [PATCH v5 1/7] gpio: expose pull-up/pull-down line flags to userspace Date: Mon, 4 Nov 2019 23:38:35 +0800 Message-Id: <20191104153841.16911-2-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191104153841.16911-1-warthog618@gmail.com> References: <20191104153841.16911-1-warthog618@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 From: Drew Fustini Add pull-up/pull-down flags to the gpio line get and set ioctl() calls. Use cases include a push button that does not have an external resistor. Addition use cases described by Limor Fried (ladyada) of Adafruit in this PR for Adafruit_Blinka Python lib: https://github.com/adafruit/Adafruit_Blinka/pull/59 Signed-off-by: Drew Fustini [Kent: added BIAS to GPIO flag names and restrict application to input lines] Signed-off-by: Kent Gibson --- drivers/gpio/gpiolib.c | 18 ++++++++++++++++++ include/uapi/linux/gpio.h | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index e8964493c571..035022bf0ef9 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -421,6 +421,8 @@ struct linehandle_state { (GPIOHANDLE_REQUEST_INPUT | \ GPIOHANDLE_REQUEST_OUTPUT | \ GPIOHANDLE_REQUEST_ACTIVE_LOW | \ + GPIOHANDLE_REQUEST_BIAS_PULL_UP | \ + GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | \ GPIOHANDLE_REQUEST_OPEN_DRAIN | \ GPIOHANDLE_REQUEST_OPEN_SOURCE) @@ -552,6 +554,12 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE))) return -EINVAL; + /* PULL_UP and PULL_DOWN flags only make sense for input mode. */ + if (!(lflags & GPIOHANDLE_REQUEST_INPUT) && + ((lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) || + (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN))) + return -EINVAL; + lh = kzalloc(sizeof(*lh), GFP_KERNEL); if (!lh) return -ENOMEM; @@ -592,6 +600,10 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) set_bit(FLAG_OPEN_DRAIN, &desc->flags); if (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE) set_bit(FLAG_OPEN_SOURCE, &desc->flags); + if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) + set_bit(FLAG_PULL_DOWN, &desc->flags); + if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) + set_bit(FLAG_PULL_UP, &desc->flags); ret = gpiod_set_transitory(desc, false); if (ret < 0) @@ -1091,6 +1103,10 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) if (test_bit(FLAG_OPEN_SOURCE, &desc->flags)) lineinfo.flags |= (GPIOLINE_FLAG_OPEN_SOURCE | GPIOLINE_FLAG_IS_OUT); + if (test_bit(FLAG_PULL_DOWN, &desc->flags)) + lineinfo.flags |= GPIOLINE_FLAG_BIAS_PULL_DOWN; + if (test_bit(FLAG_PULL_UP, &desc->flags)) + lineinfo.flags |= GPIOLINE_FLAG_BIAS_PULL_UP; if (copy_to_user(ip, &lineinfo, sizeof(lineinfo))) return -EFAULT; @@ -2764,6 +2780,8 @@ static bool gpiod_free_commit(struct gpio_desc *desc) clear_bit(FLAG_REQUESTED, &desc->flags); clear_bit(FLAG_OPEN_DRAIN, &desc->flags); clear_bit(FLAG_OPEN_SOURCE, &desc->flags); + clear_bit(FLAG_PULL_UP, &desc->flags); + clear_bit(FLAG_PULL_DOWN, &desc->flags); clear_bit(FLAG_IS_HOGGED, &desc->flags); ret = true; } diff --git a/include/uapi/linux/gpio.h b/include/uapi/linux/gpio.h index 4ebfe0ac6c5b..39e6c7854d63 100644 --- a/include/uapi/linux/gpio.h +++ b/include/uapi/linux/gpio.h @@ -33,6 +33,8 @@ struct gpiochip_info { #define GPIOLINE_FLAG_ACTIVE_LOW (1UL << 2) #define GPIOLINE_FLAG_OPEN_DRAIN (1UL << 3) #define GPIOLINE_FLAG_OPEN_SOURCE (1UL << 4) +#define GPIOLINE_FLAG_BIAS_PULL_UP (1UL << 5) +#define GPIOLINE_FLAG_BIAS_PULL_DOWN (1UL << 6) /** * struct gpioline_info - Information about a certain GPIO line @@ -62,6 +64,8 @@ struct gpioline_info { #define GPIOHANDLE_REQUEST_ACTIVE_LOW (1UL << 2) #define GPIOHANDLE_REQUEST_OPEN_DRAIN (1UL << 3) #define GPIOHANDLE_REQUEST_OPEN_SOURCE (1UL << 4) +#define GPIOHANDLE_REQUEST_BIAS_PULL_UP (1UL << 5) +#define GPIOHANDLE_REQUEST_BIAS_PULL_DOWN (1UL << 6) /** * struct gpiohandle_request - Information about a GPIO handle request From patchwork Mon Nov 4 15:38:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1189019 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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="PUkYUlk5"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 476H6C2Pstz9sCJ for ; Tue, 5 Nov 2019 02:39:31 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728392AbfKDPjb (ORCPT ); Mon, 4 Nov 2019 10:39:31 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:46605 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727891AbfKDPja (ORCPT ); Mon, 4 Nov 2019 10:39:30 -0500 Received: by mail-pf1-f196.google.com with SMTP id 193so11121241pfc.13 for ; Mon, 04 Nov 2019 07:39:30 -0800 (PST) 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=RFonsfzsFJDEDDj0KVoaMXdViXF1/jFMFFTbqbNe28g=; b=PUkYUlk5lyo4VfBYdLMm+5Y5h7KChZzPk5YmU2Tki8dN4z3c8nrvq+wXuIn+OzhEwg dXdHCfeWO1x9F1MxsiLmRJFd5eJI/iT8d0t1Egx4rYGzFoJrtbeZRwCq/9F7vdyLLDUT bmjSBEYVZwgy9xNTRmcX5vCZ/Pd99Y5cYm6H6N4GDEAu3Zoi6NW+GjWapUOzVWM98sJ/ ivi+YA4y+qzg7nBJY6lPr8wgukXP5nWHE5ntexq0u3vf8yg+kOpJVxqnheyWYsPlPfC6 2sad1u2OKltSIDDiRnm9icnu07PVP14PolOVpgXuikHj+e8qdBhAohuUJek/vz2hBVUd 03SQ== 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=RFonsfzsFJDEDDj0KVoaMXdViXF1/jFMFFTbqbNe28g=; b=preUAMOUHE0pnZxBp3rxwt38miZmJrCfR6cp35vxBFqRGWBYJiqBfTODpkJmbJ/fYJ nJh0l7O/VwwjBSOhIU0qeReKnLL38luLaR8WB9CFN0eSLMeFlaLcnp/DUrn9BSZKF9ic 5RuH4F3+LfsDUbAdtjf5KJJwjfaglZ2V6Bl+IyryfgEwL7w7EhCh+s18pJ0qCDJsjHyA dZmc1VcyG2hszXITotCZ+D1FswBiey1kjlr7xBu/YOrXSCFstRsAk/tSbUKP67RsAHoA jX+c/2YsvoE0ouZyYyTVv6t+DDSUmBOXZo7TcflK6VMmRU1X292tGOCQfl/560/mmmNF wUIQ== X-Gm-Message-State: APjAAAU0FvPtqm/Lf4KF4midbSdp6HoY4gPnUju7FXOAu+cT2DXyo/ae 5QITax2kjaLIlCsb6H891fPcljKo+sGdxw== X-Google-Smtp-Source: APXvYqxrh8fCSK6FrZso+g7Dp2Ljr+UUDAoVhOm3JcfAA5YNMIZwKFkZ4vzIUKECRl3lVNZ+YBPokw== X-Received: by 2002:a62:2942:: with SMTP id p63mr24507019pfp.110.1572881969764; Mon, 04 Nov 2019 07:39:29 -0800 (PST) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id a66sm5819761pfb.166.2019.11.04.07.39.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Nov 2019 07:39:29 -0800 (PST) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, thomas.petazzoni@bootlin.com, Kent Gibson Subject: [PATCH v5 2/7] gpiolib: add support for pull up/down to lineevent_create Date: Mon, 4 Nov 2019 23:38:36 +0800 Message-Id: <20191104153841.16911-3-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191104153841.16911-1-warthog618@gmail.com> References: <20191104153841.16911-1-warthog618@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 Add support for pull up/down to lineevent_create. Use cases include receiving asynchronous presses from a push button without an external pull up/down. Signed-off-by: Kent Gibson --- drivers/gpio/gpiolib.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 035022bf0ef9..7dfbb3676ee0 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -950,6 +950,10 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW) set_bit(FLAG_ACTIVE_LOW, &desc->flags); + if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) + set_bit(FLAG_PULL_DOWN, &desc->flags); + if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) + set_bit(FLAG_PULL_UP, &desc->flags); ret = gpiod_direction_input(desc); if (ret) From patchwork Mon Nov 4 15:38:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1189020 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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="kx0h5uY2"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 476H6H20G0z9sCJ for ; Tue, 5 Nov 2019 02:39:35 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728510AbfKDPje (ORCPT ); Mon, 4 Nov 2019 10:39:34 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:33393 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727891AbfKDPje (ORCPT ); Mon, 4 Nov 2019 10:39:34 -0500 Received: by mail-pf1-f194.google.com with SMTP id c184so12440049pfb.0 for ; Mon, 04 Nov 2019 07:39:34 -0800 (PST) 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=TuzOJKOk9PucNDzuRDkw8sfUrjUYJfWp7RmpLniNaFY=; b=kx0h5uY2WbH85fmU9F6OQ0Rkpn262XizE6/xhvzMk+4aIKOhBgo4bJPZ7lgoHQ6bXD ECeAc137oaOtFRP4KeiEcSz9ods+62xAaDRhkCBTu7uTE+r+ps2/Xf6GmCRZTFsmwM6C PWO5ff/BoNI/Eors6ZfZ9uDnJvjBVFKuDGBXQylbWqf9xa9+3a6r3IHNp9uoH7ng/JAp G7g2hX2H818iTfqwMZB/1ZSdVu7oxrTLO0sKQ6q2UeERlUijHfvwxUVaISboY/1uJf1h kLfBMaQIew/UDiaSjlnjcJLfbl8JdcUW3giPFuYbetnTsjI42dJBOGjGFlcXVT9JKYLS E3OQ== 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=TuzOJKOk9PucNDzuRDkw8sfUrjUYJfWp7RmpLniNaFY=; b=NlU0yxlhQ9GnLf4i2G8771RW7f5bOS25pdl0ZhtnJbqoTK+g4jR66FBYt17qaR0d3d y0oIxYypnv6u/5C1vMOmLoetUt00zttQkTBB9myRRYw2H3CJt9BhtNfG3jgOhLCERHs7 iRr8S01xakWamKPxmBcsWdBJNTYg9JUSIZLrC3vC3kciRf+3sth6cNwAo1B5KSFrvIGo mIBYhsJrrnqe7yBrT2oNU6hXRTE5d6944X0D59q8v67JBMj+8jmtkPTLFrZujh5GB2BG nVLh+LyYYKV++DaAIhigOt56wgVmShW562Sp45qLS9GasTUTvMUClN8YWZT4T57umH3K N3jw== X-Gm-Message-State: APjAAAW/GvGyXi5FEfgkOpUdK6oEa8hLyzOp6leX6NOoYZNihOQC0yZn H2skc0iBzlSZaRFREJ3km9TmbOemEaKRog== X-Google-Smtp-Source: APXvYqyV2XuLvn1qsc3BHNVH9eLZarrWM6Kte02R9Lc5/0GYjyIDjLJqIIFbqVlfcI3W2aJYMAbaLA== X-Received: by 2002:a63:d10c:: with SMTP id k12mr31956238pgg.344.1572881973430; Mon, 04 Nov 2019 07:39:33 -0800 (PST) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id a66sm5819761pfb.166.2019.11.04.07.39.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Nov 2019 07:39:32 -0800 (PST) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, thomas.petazzoni@bootlin.com, Kent Gibson Subject: [PATCH v5 3/7] gpiolib: add support for disabling line bias Date: Mon, 4 Nov 2019 23:38:37 +0800 Message-Id: <20191104153841.16911-4-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191104153841.16911-1-warthog618@gmail.com> References: <20191104153841.16911-1-warthog618@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 Allow pull up/down bias to be disabled, allowing the line to float or to be biased only by external circuitry. Use case is for where the bias has been applied previously, either by default or by the user, but that setting may conflict with the current use of the line. Signed-off-by: Kent Gibson --- drivers/gpio/gpiolib.c | 61 ++++++++++++++++++++++++++++++++------- drivers/gpio/gpiolib.h | 1 + include/uapi/linux/gpio.h | 2 ++ 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 7dfbb3676ee0..7d8ff52ada42 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -423,6 +423,7 @@ struct linehandle_state { GPIOHANDLE_REQUEST_ACTIVE_LOW | \ GPIOHANDLE_REQUEST_BIAS_PULL_UP | \ GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | \ + GPIOHANDLE_REQUEST_BIAS_DISABLE | \ GPIOHANDLE_REQUEST_OPEN_DRAIN | \ GPIOHANDLE_REQUEST_OPEN_SOURCE) @@ -554,12 +555,21 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE))) return -EINVAL; - /* PULL_UP and PULL_DOWN flags only make sense for input mode. */ + /* Bias flags only allowed for input mode. */ if (!(lflags & GPIOHANDLE_REQUEST_INPUT) && - ((lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) || + ((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) || + (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) || (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN))) return -EINVAL; + /* Only one bias flag can be set. */ + if (((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) && + (lflags & (GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | + GPIOHANDLE_REQUEST_BIAS_PULL_UP))) || + ((lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) && + (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP))) + return -EINVAL; + lh = kzalloc(sizeof(*lh), GFP_KERNEL); if (!lh) return -ENOMEM; @@ -600,6 +610,8 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) set_bit(FLAG_OPEN_DRAIN, &desc->flags); if (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE) set_bit(FLAG_OPEN_SOURCE, &desc->flags); + if (lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) + set_bit(FLAG_BIAS_DISABLE, &desc->flags); if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) set_bit(FLAG_PULL_DOWN, &desc->flags); if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) @@ -924,6 +936,14 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)) return -EINVAL; + /* Only one bias flag can be set. */ + if (((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) && + (lflags & (GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | + GPIOHANDLE_REQUEST_BIAS_PULL_UP))) || + ((lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) && + (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP))) + return -EINVAL; + le = kzalloc(sizeof(*le), GFP_KERNEL); if (!le) return -ENOMEM; @@ -950,6 +970,8 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW) set_bit(FLAG_ACTIVE_LOW, &desc->flags); + if (lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) + set_bit(FLAG_BIAS_DISABLE, &desc->flags); if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) set_bit(FLAG_PULL_DOWN, &desc->flags); if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) @@ -1107,6 +1129,8 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) if (test_bit(FLAG_OPEN_SOURCE, &desc->flags)) lineinfo.flags |= (GPIOLINE_FLAG_OPEN_SOURCE | GPIOLINE_FLAG_IS_OUT); + if (test_bit(FLAG_BIAS_DISABLE, &desc->flags)) + lineinfo.flags |= GPIOLINE_FLAG_BIAS_DISABLE; if (test_bit(FLAG_PULL_DOWN, &desc->flags)) lineinfo.flags |= GPIOLINE_FLAG_BIAS_PULL_DOWN; if (test_bit(FLAG_PULL_UP, &desc->flags)) @@ -2786,6 +2810,7 @@ static bool gpiod_free_commit(struct gpio_desc *desc) clear_bit(FLAG_OPEN_SOURCE, &desc->flags); clear_bit(FLAG_PULL_UP, &desc->flags); clear_bit(FLAG_PULL_DOWN, &desc->flags); + clear_bit(FLAG_BIAS_DISABLE, &desc->flags); clear_bit(FLAG_IS_HOGGED, &desc->flags); ret = true; } @@ -2912,6 +2937,7 @@ static int gpio_set_config(struct gpio_chip *gc, unsigned offset, unsigned arg; switch (mode) { + case PIN_CONFIG_BIAS_DISABLE: case PIN_CONFIG_BIAS_PULL_DOWN: case PIN_CONFIG_BIAS_PULL_UP: arg = 1; @@ -2925,6 +2951,26 @@ static int gpio_set_config(struct gpio_chip *gc, unsigned offset, return gc->set_config ? gc->set_config(gc, offset, config) : -ENOTSUPP; } +static int gpio_set_bias(struct gpio_chip *chip, struct gpio_desc *desc) +{ + int bias = 0; + int ret = 0; + + if (test_bit(FLAG_BIAS_DISABLE, &desc->flags)) + bias = PIN_CONFIG_BIAS_DISABLE; + else if (test_bit(FLAG_PULL_UP, &desc->flags)) + bias = PIN_CONFIG_BIAS_PULL_UP; + else if (test_bit(FLAG_PULL_DOWN, &desc->flags)) + bias = PIN_CONFIG_BIAS_PULL_DOWN; + + if (bias) { + ret = gpio_set_config(chip, gpio_chip_hwgpio(desc), bias); + if (ret != -ENOTSUPP) + return ret; + } + return 0; +} + /** * gpiod_direction_input - set the GPIO direction to input * @desc: GPIO to set to input @@ -2969,15 +3015,10 @@ int gpiod_direction_input(struct gpio_desc *desc) __func__); return -EIO; } - if (ret == 0) + if (ret == 0) { clear_bit(FLAG_IS_OUT, &desc->flags); - - if (test_bit(FLAG_PULL_UP, &desc->flags)) - gpio_set_config(chip, gpio_chip_hwgpio(desc), - PIN_CONFIG_BIAS_PULL_UP); - else if (test_bit(FLAG_PULL_DOWN, &desc->flags)) - gpio_set_config(chip, gpio_chip_hwgpio(desc), - PIN_CONFIG_BIAS_PULL_DOWN); + ret = gpio_set_bias(chip, desc); + } trace_gpio_direction(desc_to_gpio(desc), 1, ret); diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h index b8b10a409c7b..ca9bc1e4803c 100644 --- a/drivers/gpio/gpiolib.h +++ b/drivers/gpio/gpiolib.h @@ -110,6 +110,7 @@ struct gpio_desc { #define FLAG_TRANSITORY 12 /* GPIO may lose value in sleep or reset */ #define FLAG_PULL_UP 13 /* GPIO has pull up enabled */ #define FLAG_PULL_DOWN 14 /* GPIO has pull down enabled */ +#define FLAG_BIAS_DISABLE 15 /* GPIO has pull disabled */ /* Connection label */ const char *label; diff --git a/include/uapi/linux/gpio.h b/include/uapi/linux/gpio.h index 39e6c7854d63..7cc21c3b0839 100644 --- a/include/uapi/linux/gpio.h +++ b/include/uapi/linux/gpio.h @@ -35,6 +35,7 @@ struct gpiochip_info { #define GPIOLINE_FLAG_OPEN_SOURCE (1UL << 4) #define GPIOLINE_FLAG_BIAS_PULL_UP (1UL << 5) #define GPIOLINE_FLAG_BIAS_PULL_DOWN (1UL << 6) +#define GPIOLINE_FLAG_BIAS_DISABLE (1UL << 7) /** * struct gpioline_info - Information about a certain GPIO line @@ -66,6 +67,7 @@ struct gpioline_info { #define GPIOHANDLE_REQUEST_OPEN_SOURCE (1UL << 4) #define GPIOHANDLE_REQUEST_BIAS_PULL_UP (1UL << 5) #define GPIOHANDLE_REQUEST_BIAS_PULL_DOWN (1UL << 6) +#define GPIOHANDLE_REQUEST_BIAS_DISABLE (1UL << 7) /** * struct gpiohandle_request - Information about a GPIO handle request From patchwork Mon Nov 4 15:38:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1189021 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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="Lrq5Tvg2"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 476H6L5ndnz9sCJ for ; Tue, 5 Nov 2019 02:39:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729051AbfKDPji (ORCPT ); Mon, 4 Nov 2019 10:39:38 -0500 Received: from mail-pf1-f193.google.com ([209.85.210.193]:34207 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727891AbfKDPji (ORCPT ); Mon, 4 Nov 2019 10:39:38 -0500 Received: by mail-pf1-f193.google.com with SMTP id n13so716044pff.1 for ; Mon, 04 Nov 2019 07:39:38 -0800 (PST) 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=6raOhOND06klFsKlr/jnva9F9j0rsalhrUFCEioucRs=; b=Lrq5Tvg2GvpKT7ZtRWKxC0amZFRHkr4kj1tuDGae/3GoFZQser118NCqsyHTpz9Q9Q 80Yo0Ce9Pudwg1TYa8Wqkf98Wksz2HlUByj7yzVh8ZkE27aL8pS4uDCL9DLWeajFZZFJ 2AB607KInpNCRGYdDQ1T4YhZpnm9DCHEYEVagYkliRMRb/SlePNYf6nOADnt7zBbBuLv wWygBs6jn1k/rERNuSgo6KLZmBOZUg2rAm//Kdltat8F9cE17Zva4v4g74zjl5cGfmSt z42dYQCxGHq9OK2M0K9nnhtAmw8xrI1zWSIYncSw1hTbejzNStCoF4XPDigO6U1/m3ki HDMw== 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=6raOhOND06klFsKlr/jnva9F9j0rsalhrUFCEioucRs=; b=tzWQjhazK/B0rQbfbwK1wk4bP2nGsdxjbMc262Mox3HS+60mGDt0jrLtL9EbZomora 34r7nUoXcXZLDANbhlPrQFY4fOxKiEzYjBNtj9gQh6/pAodNrvJji/BNESnFPVEGhOa0 eJX1mkYq0bHFzu41SuP61Lavy0LHr+/CwsGpSVJbqtPg1sw+3qu5hV/92brzepmMjf3x dsKF5C6l2v2QzCsljSXUtvTXssGFlvJiH24p780ub2on46eP3qxUb0d9/Z/4JDpIq/tT 6lBY0qu5HvNf9F05i3xLQNmbtepXNISjLEdgxPKimvy8MVhUkZtJOpo10sowLIp8b9lu sFhg== X-Gm-Message-State: APjAAAWio4l1NE6mUTe5YEnTbbI04zKAP4zSppyTZqTb4CQCxoEZGcmk N8lm8A+pIQi/1FNSVY+wiNk9c6kibRqsjQ== X-Google-Smtp-Source: APXvYqwRsMZIzgtMm9PjM/wDEc1b+iQECFwJDl5qR7SKY25EAW1uRTYN594zAimidcRMGQDbKdn7eg== X-Received: by 2002:a65:5c0a:: with SMTP id u10mr9999299pgr.315.1572881977164; Mon, 04 Nov 2019 07:39:37 -0800 (PST) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id a66sm5819761pfb.166.2019.11.04.07.39.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Nov 2019 07:39:36 -0800 (PST) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, thomas.petazzoni@bootlin.com, Kent Gibson Subject: [PATCH v5 4/7] gpiolib: add support for biasing output lines Date: Mon, 4 Nov 2019 23:38:38 +0800 Message-Id: <20191104153841.16911-5-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191104153841.16911-1-warthog618@gmail.com> References: <20191104153841.16911-1-warthog618@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 Allow pull up/down bias to be set on output lines. Use case is for open source or open drain applications where internal pull up/down may conflict with external biasing. Signed-off-by: Kent Gibson --- drivers/gpio/gpiolib.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 7d8ff52ada42..de08d1a4a3fb 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -555,8 +555,9 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE))) return -EINVAL; - /* Bias flags only allowed for input mode. */ - if (!(lflags & GPIOHANDLE_REQUEST_INPUT) && + /* Bias flags only allowed for input or output mode. */ + if (!((lflags & GPIOHANDLE_REQUEST_INPUT) || + (lflags & GPIOHANDLE_REQUEST_OUTPUT)) && ((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) || (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) || (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN))) @@ -3144,6 +3145,9 @@ int gpiod_direction_output(struct gpio_desc *desc, int value) } set_output_value: + ret = gpio_set_bias(gc, desc); + if (ret) + return ret; return gpiod_direction_output_raw_commit(desc, value); } EXPORT_SYMBOL_GPL(gpiod_direction_output); From patchwork Mon Nov 4 15:38:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1189022 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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="b24QYCts"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 476H6T0wx6z9sP3 for ; Tue, 5 Nov 2019 02:39:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729277AbfKDPjn (ORCPT ); Mon, 4 Nov 2019 10:39:43 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:44617 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729346AbfKDPjn (ORCPT ); Mon, 4 Nov 2019 10:39:43 -0500 Received: by mail-pg1-f194.google.com with SMTP id f19so2415942pgk.11 for ; Mon, 04 Nov 2019 07:39:42 -0800 (PST) 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=LsdGXAZDsLtoyIzrg5Nm/vCICJV/ZMXt/g2t+ZwO92U=; b=b24QYCts9VHaVNFeysyVd5CLKl9Ve0ndM8ix/d9V7JBxoSdOCP3ycSPm7p9uQS2X5N TqJuZMnAZoHJF5XVvdJzrp2YQdEwLjhPimX2mSUamA9GBayqslMHqRq1YhDefCQAhxg/ a+lbxx2Kvnc36ojjq87Qxwa06cMEiM77kl7tACIu9EiskFm9hCr7DzsgfBtnP5Sht+6q EBi+HIYin53n6q7kVM2+wQUN+bH5DeACYdmDvCfd/fbqIy/sLvfxhdX9i+4NwgnFE6nc 1Yw2fi4e5mkv29+mVt49sJvq+lR2cgfLrhWec9xaXc+D/8WmVcTmjiNVfVb9iNbeucz9 WArQ== 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=LsdGXAZDsLtoyIzrg5Nm/vCICJV/ZMXt/g2t+ZwO92U=; b=SmsPWb0DCbOLAb6A4d0VXOim+oXx0Up+ieQ0PO8JX2+CbHEKh/salhLW8fKjkC7jXY tt2NDw++ONIKYGYUl1KIzYAbiTCdi40ZHaZLyWOd90oaNDHwQX7+Dhn1M4wfnQ4yGLlS +kVARNCMB/lqmoVuB2j2wjkJh35uf2YUPzvvBrctTtYDL5corPRuJw/THiSzQt9LixMh Mt+QkVQweqxuq2Hdr9A5M+bndD5BT+vyGeBMzjozO9Y1xwjNXIvvIbDYlxDJOaNzdszL 7AOPbn9d02zKPq0F8M5gX0YtqsjC3rvQjZQkiKDNda2UguWAwGoTA8THRgJ23kWLO3qv NegA== X-Gm-Message-State: APjAAAVePu66Lp6PsLUTdQjlz8zFj9t34SB4+3gKvLHI7CtYatCjaBOX IuNUIAbV4Rr8DGG78rGDeh0tdgYhSS+M5g== X-Google-Smtp-Source: APXvYqzX8cndBJLjLRclPdjTAAVcKtrtDhEOtIVho+oRgKR2UJFFXahe6YB/a+wJ7eER2hdZGK0R5A== X-Received: by 2002:a62:1d8d:: with SMTP id d135mr4940247pfd.172.1572881981501; Mon, 04 Nov 2019 07:39:41 -0800 (PST) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id a66sm5819761pfb.166.2019.11.04.07.39.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Nov 2019 07:39:40 -0800 (PST) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, thomas.petazzoni@bootlin.com, Kent Gibson Subject: [PATCH v5 5/7] gpio: mockup: add set_config to support pull up/down Date: Mon, 4 Nov 2019 23:38:39 +0800 Message-Id: <20191104153841.16911-6-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191104153841.16911-1-warthog618@gmail.com> References: <20191104153841.16911-1-warthog618@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 Add support for the pull up/down state set via gpiolib line requests to be reflected in the state of the mockup. Use case is for testing of the GPIO uAPI, specifically the pull up/down flags. Signed-off-by: Kent Gibson --- drivers/gpio/gpio-mockup.c | 94 ++++++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 34 deletions(-) diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c index 213aedc97dc2..c28219962ae2 100644 --- a/drivers/gpio/gpio-mockup.c +++ b/drivers/gpio/gpio-mockup.c @@ -146,6 +146,61 @@ static void gpio_mockup_set_multiple(struct gpio_chip *gc, mutex_unlock(&chip->lock); } +static int gpio_mockup_apply_pull(struct gpio_mockup_chip *chip, + unsigned int offset, int value) +{ + struct gpio_desc *desc; + struct gpio_chip *gc; + struct irq_sim *sim; + int curr, irq, irq_type; + + gc = &chip->gc; + desc = &gc->gpiodev->descs[offset]; + sim = &chip->irqsim; + + mutex_lock(&chip->lock); + + if (test_bit(FLAG_REQUESTED, &desc->flags) && + !test_bit(FLAG_IS_OUT, &desc->flags)) { + curr = __gpio_mockup_get(chip, offset); + if (curr == value) + goto out; + + irq = irq_sim_irqnum(sim, offset); + irq_type = irq_get_trigger_type(irq); + + if ((value == 1 && (irq_type & IRQ_TYPE_EDGE_RISING)) || + (value == 0 && (irq_type & IRQ_TYPE_EDGE_FALLING))) + irq_sim_fire(sim, offset); + } + + /* Change the value unless we're actively driving the line. */ + if (!test_bit(FLAG_REQUESTED, &desc->flags) || + !test_bit(FLAG_IS_OUT, &desc->flags)) + __gpio_mockup_set(chip, offset, value); + +out: + chip->lines[offset].pull = value; + mutex_unlock(&chip->lock); + return 0; +} + +static int gpio_mockup_set_config(struct gpio_chip *gc, + unsigned int offset, unsigned long config) +{ + struct gpio_mockup_chip *chip = gpiochip_get_data(gc); + + switch (pinconf_to_config_param(config)) { + case PIN_CONFIG_BIAS_PULL_UP: + return gpio_mockup_apply_pull(chip, offset, 1); + case PIN_CONFIG_BIAS_PULL_DOWN: + return gpio_mockup_apply_pull(chip, offset, 0); + default: + break; + } + return -ENOTSUPP; +} + static int gpio_mockup_dirout(struct gpio_chip *gc, unsigned int offset, int value) { @@ -226,12 +281,8 @@ static ssize_t gpio_mockup_debugfs_write(struct file *file, size_t size, loff_t *ppos) { struct gpio_mockup_dbgfs_private *priv; - int rv, val, curr, irq, irq_type; - struct gpio_mockup_chip *chip; + int rv, val; struct seq_file *sfile; - struct gpio_desc *desc; - struct gpio_chip *gc; - struct irq_sim *sim; if (*ppos != 0) return -EINVAL; @@ -244,35 +295,9 @@ static ssize_t gpio_mockup_debugfs_write(struct file *file, sfile = file->private_data; priv = sfile->private; - chip = priv->chip; - gc = &chip->gc; - desc = &gc->gpiodev->descs[priv->offset]; - sim = &chip->irqsim; - - mutex_lock(&chip->lock); - - if (test_bit(FLAG_REQUESTED, &desc->flags) && - !test_bit(FLAG_IS_OUT, &desc->flags)) { - curr = __gpio_mockup_get(chip, priv->offset); - if (curr == val) - goto out; - - irq = irq_sim_irqnum(sim, priv->offset); - irq_type = irq_get_trigger_type(irq); - - if ((val == 1 && (irq_type & IRQ_TYPE_EDGE_RISING)) || - (val == 0 && (irq_type & IRQ_TYPE_EDGE_FALLING))) - irq_sim_fire(sim, priv->offset); - } - - /* Change the value unless we're actively driving the line. */ - if (!test_bit(FLAG_REQUESTED, &desc->flags) || - !test_bit(FLAG_IS_OUT, &desc->flags)) - __gpio_mockup_set(chip, priv->offset, val); - -out: - chip->lines[priv->offset].pull = val; - mutex_unlock(&chip->lock); + rv = gpio_mockup_apply_pull(priv->chip, priv->offset, val); + if (rv) + return rv; return size; } @@ -418,6 +443,7 @@ static int gpio_mockup_probe(struct platform_device *pdev) gc->direction_output = gpio_mockup_dirout; gc->direction_input = gpio_mockup_dirin; gc->get_direction = gpio_mockup_get_direction; + gc->set_config = gpio_mockup_set_config; gc->to_irq = gpio_mockup_to_irq; gc->free = gpio_mockup_free; From patchwork Mon Nov 4 15:38:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1189023 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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="YuVvIQPE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 476H6W0ZXQz9sP3 for ; Tue, 5 Nov 2019 02:39:47 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729350AbfKDPjq (ORCPT ); Mon, 4 Nov 2019 10:39:46 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:39504 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729345AbfKDPjq (ORCPT ); Mon, 4 Nov 2019 10:39:46 -0500 Received: by mail-pf1-f196.google.com with SMTP id x28so9206248pfo.6 for ; Mon, 04 Nov 2019 07:39:46 -0800 (PST) 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=PVF06suk+GS5QSDML5bLCCsO5ufmUnHDRZmiLrCd3J4=; b=YuVvIQPEoU+NVP+kfjbudXCbXF4kJvKzyxrxdB4QteyqiAfLUkZKJNSDSrXB+xybNR /IgZjjZNlx7MITZCV77oEa8RlTNh+7oHCLw058DgI7wmfcWJGYJFXb9zkxi3Q7rlpYTQ N7BZoPpdpQ3wUDbsKiH50hEgnI87kNe8cqwQYnLfCjzcyvjz1kCRggwRtKymGbbwBpF9 xcoqwQp33Q+Vr2bg+698AlKGr3sOAovoVpLlMrXn6x76lfvZrf0ZrJTODbzjeLoOMe1Z C4IkqcPHc6go/VB76VZWd3mBKccymHoxPRUVWq4iGDGU2Ltu7zkKs46stSYtLB4bAsUD jiEw== 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=PVF06suk+GS5QSDML5bLCCsO5ufmUnHDRZmiLrCd3J4=; b=P2F8xd1/PRRqfCBfX/aTTu8RBW/QgRtouggvU5kajxnpF+6aykN5CLkqglFqrre62+ IYl1uXYipVzPfwI8w2ntDYh2A0r5VsUO5AKBSKq0/ohK8A+YruMU/LJ4UNd9O7RPkn+L Go6dA/Br4t9LIupuyiNs81uWim1h6X910rQTih1Glx6QobHhFa5BLu9htvMftJG5jSm8 ONnhgejiMRNuOwflTwEazqiR3FHKRBjo9jjHIRWMWfyYSonnJj5DCyTA1bo4I7BGkkfH n7uXDmSNKdfnexP/Z9reQHbzDR8OJSfncaQmdsBAAfFDThG8Qjz20Mnc8KIAyj982bDR YLzw== X-Gm-Message-State: APjAAAVB/kRh8ZoYZha5PZ0pM4VJMCP7XQT/+n5nDDMa1V9ksiP5Dby+ CpKo3n3v+ImOEDO99qGKcFrbCtwPdCR9AQ== X-Google-Smtp-Source: APXvYqzL/SjRdKltoGZhpefGXoJF073+g1IuhThQXpAWzrks1HJJrSfhROSDsW88GGTHEB+GZCDbxA== X-Received: by 2002:a63:4081:: with SMTP id n123mr4336543pga.444.1572881985188; Mon, 04 Nov 2019 07:39:45 -0800 (PST) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id a66sm5819761pfb.166.2019.11.04.07.39.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Nov 2019 07:39:44 -0800 (PST) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, thomas.petazzoni@bootlin.com, Kent Gibson Subject: [PATCH v5 6/7] gpiolib: move validation of line handle flags into helper function Date: Mon, 4 Nov 2019 23:38:40 +0800 Message-Id: <20191104153841.16911-7-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191104153841.16911-1-warthog618@gmail.com> References: <20191104153841.16911-1-warthog618@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 Move validation of line handle flags into helper function. This reduces the size and complexity of linehandle_create and allows the validation to be reused elsewhere. Signed-off-by: Kent Gibson --- drivers/gpio/gpiolib.c | 93 +++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 42 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index de08d1a4a3fb..dac1914155cc 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -427,6 +427,54 @@ struct linehandle_state { GPIOHANDLE_REQUEST_OPEN_DRAIN | \ GPIOHANDLE_REQUEST_OPEN_SOURCE) +static int linehandle_validate_flags(u32 flags) +{ + /* Return an error if an unknown flag is set */ + if (flags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) + return -EINVAL; + + /* + * Do not allow both INPUT & OUTPUT flags to be set as they are + * contradictory. + */ + if ((flags & GPIOHANDLE_REQUEST_INPUT) && + (flags & GPIOHANDLE_REQUEST_OUTPUT)) + return -EINVAL; + + /* + * Do not allow OPEN_SOURCE & OPEN_DRAIN flags in a single request. If + * the hardware actually supports enabling both at the same time the + * electrical result would be disastrous. + */ + if ((flags & GPIOHANDLE_REQUEST_OPEN_DRAIN) && + (flags & GPIOHANDLE_REQUEST_OPEN_SOURCE)) + return -EINVAL; + + /* OPEN_DRAIN and OPEN_SOURCE flags only make sense for output mode. */ + if (!(flags & GPIOHANDLE_REQUEST_OUTPUT) && + ((flags & GPIOHANDLE_REQUEST_OPEN_DRAIN) || + (flags & GPIOHANDLE_REQUEST_OPEN_SOURCE))) + return -EINVAL; + + /* Bias flags only allowed for input or output mode. */ + if (!((flags & GPIOHANDLE_REQUEST_INPUT) || + (flags & GPIOHANDLE_REQUEST_OUTPUT)) && + ((flags & GPIOHANDLE_REQUEST_BIAS_DISABLE) || + (flags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) || + (flags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN))) + return -EINVAL; + + /* Only one bias flag can be set. */ + if (((flags & GPIOHANDLE_REQUEST_BIAS_DISABLE) && + (flags & (GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | + GPIOHANDLE_REQUEST_BIAS_PULL_UP))) || + ((flags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) && + (flags & GPIOHANDLE_REQUEST_BIAS_PULL_UP))) + return -EINVAL; + + return 0; +} + static long linehandle_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { @@ -528,48 +576,9 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) lflags = handlereq.flags; - /* Return an error if an unknown flag is set */ - if (lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) - return -EINVAL; - - /* - * Do not allow both INPUT & OUTPUT flags to be set as they are - * contradictory. - */ - if ((lflags & GPIOHANDLE_REQUEST_INPUT) && - (lflags & GPIOHANDLE_REQUEST_OUTPUT)) - return -EINVAL; - - /* - * Do not allow OPEN_SOURCE & OPEN_DRAIN flags in a single request. If - * the hardware actually supports enabling both at the same time the - * electrical result would be disastrous. - */ - if ((lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN) && - (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)) - return -EINVAL; - - /* OPEN_DRAIN and OPEN_SOURCE flags only make sense for output mode. */ - if (!(lflags & GPIOHANDLE_REQUEST_OUTPUT) && - ((lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN) || - (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE))) - return -EINVAL; - - /* Bias flags only allowed for input or output mode. */ - if (!((lflags & GPIOHANDLE_REQUEST_INPUT) || - (lflags & GPIOHANDLE_REQUEST_OUTPUT)) && - ((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) || - (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) || - (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN))) - return -EINVAL; - - /* Only one bias flag can be set. */ - if (((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) && - (lflags & (GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | - GPIOHANDLE_REQUEST_BIAS_PULL_UP))) || - ((lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) && - (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP))) - return -EINVAL; + ret = linehandle_validate_flags(lflags); + if (ret) + return ret; lh = kzalloc(sizeof(*lh), GFP_KERNEL); if (!lh) From patchwork Mon Nov 4 15:38:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1189024 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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="VIVMW79+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 476H6b0SH7z9sP3 for ; Tue, 5 Nov 2019 02:39:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729351AbfKDPju (ORCPT ); Mon, 4 Nov 2019 10:39:50 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:33778 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728322AbfKDPju (ORCPT ); Mon, 4 Nov 2019 10:39:50 -0500 Received: by mail-pg1-f193.google.com with SMTP id u23so11541759pgo.0 for ; Mon, 04 Nov 2019 07:39:49 -0800 (PST) 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=O3HzsmylXY4ayZlnRzLkoobhBcXnohSTvUIVbv7ngfA=; b=VIVMW79+orHKTbjiQG4a1k4oZUY/y5Ae+FnmH4VxVnVpiHRlr1uZa17niuf7d50T7E kjggIdSRSMx/+33rA5BYnou059XYfFnmzxfm3YP6xE/hSrucJvUXUIzpn6JnTy5qjmpz F8v+/BAdG7qLImh/6mklALT77W91ev1BQ7y5oEuBgsldSULooBR227kTupFDVLY+PX8S JNDESy2x0Qg8TmjHS9jTrxjcBcIdA0gvP/l35i1Q8Ft2Mjus6eEVc6ZW1lna8Pq3BR/M +7+HYMwtbOXyNaJ6fVMwUu6lT0p+OqkaXZqI3NMfLLngl+iCrURCl8QSX5BOUsOwrnlu puLQ== 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=O3HzsmylXY4ayZlnRzLkoobhBcXnohSTvUIVbv7ngfA=; b=Zjz6dwbBEERKLquIHzMwZsFpr1nMQMkYIRJn2BRr2/7jDbJoy4xgrZeAbgzQgfZ2q7 7lZq4CizsdumkYQh3O1h7sZtzF/LBP4JIttC7oB3S0hBZaPqgT/j1hRyoDVRHuxe2f8o rYkt3p1k845EfutilZJxdKlkfimDuY2X41luHijhYQXfq4UZxP0NCrXsuLxOgW1wDJsi uEWczg0OzUBRRzGmjEICyUZuYyJX7H43gp+F4D+fV65syZPxT7PzqjR08Nva74XkMTJi 3b8PLhePTUK/dEoOKhUuDUBQxAIixuZgLpDWxzJGiPMFIIpKdyQuJ91+Np1gkgLpgRRk e0+w== X-Gm-Message-State: APjAAAUY9eRegDfnuNo1k0NyDUgN2TmA14UdIy1xjCXyYIMeH+EfDsPf dMDLAYwalsT0qD7H5spMTan/h7gWO1Ne9A== X-Google-Smtp-Source: APXvYqxcyZ9eoTlCmzJQpDUoMXexT1bwGmBsYImELyonuWDxRiRHjS8s/lmXAGc+RJQJ4DtTWZGBcg== X-Received: by 2002:a65:5a06:: with SMTP id y6mr31265726pgs.9.1572881988907; Mon, 04 Nov 2019 07:39:48 -0800 (PST) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id a66sm5819761pfb.166.2019.11.04.07.39.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Nov 2019 07:39:48 -0800 (PST) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, thomas.petazzoni@bootlin.com, Kent Gibson Subject: [PATCH v5 7/7] gpio: add new SET_CONFIG ioctl() to gpio chardev Date: Mon, 4 Nov 2019 23:38:41 +0800 Message-Id: <20191104153841.16911-8-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191104153841.16911-1-warthog618@gmail.com> References: <20191104153841.16911-1-warthog618@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 Add the GPIOHANDLE_SET_CONFIG_IOCTL to the gpio chardev. The ioctl allows some of the configuration of a requested handle to be changed without having to release the line. The primary use case is the changing of direction for bi-directional lines. Based on initial work by Bartosz Golaszewski Signed-off-by: Kent Gibson --- drivers/gpio/gpiolib.c | 69 +++++++++++++++++++++++++++++++++++++++ include/uapi/linux/gpio.h | 18 ++++++++++ 2 files changed, 87 insertions(+) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index dac1914155cc..969c0eb878df 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -475,6 +475,73 @@ static int linehandle_validate_flags(u32 flags) return 0; } +static void linehandle_configure_flag(unsigned long *flagsp, + u32 bit, bool active) +{ + if (active) + set_bit(bit, flagsp); + else + clear_bit(bit, flagsp); +} + +static long linehandle_set_config(struct linehandle_state *lh, + void __user *ip) +{ + struct gpiohandle_config gcnf; + struct gpio_desc *desc; + int i, ret; + u32 lflags; + unsigned long *flagsp; + + if (copy_from_user(&gcnf, ip, sizeof(gcnf))) + return -EFAULT; + + lflags = gcnf.flags; + ret = linehandle_validate_flags(lflags); + if (ret) + return ret; + + for (i = 0; i < lh->numdescs; i++) { + desc = lh->descs[i]; + flagsp = &desc->flags; + + linehandle_configure_flag(flagsp, FLAG_ACTIVE_LOW, + lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW); + + linehandle_configure_flag(flagsp, FLAG_OPEN_DRAIN, + lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN); + + linehandle_configure_flag(flagsp, FLAG_OPEN_SOURCE, + lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE); + + linehandle_configure_flag(flagsp, FLAG_PULL_UP, + lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP); + + linehandle_configure_flag(flagsp, FLAG_PULL_DOWN, + lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN); + + linehandle_configure_flag(flagsp, FLAG_BIAS_DISABLE, + lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE); + + /* + * Lines have to be requested explicitly for input + * or output, else the line will be treated "as is". + */ + if (lflags & GPIOHANDLE_REQUEST_OUTPUT) { + int val = !!gcnf.default_values[i]; + + ret = gpiod_direction_output(desc, val); + if (ret) + return ret; + } else if (lflags & GPIOHANDLE_REQUEST_INPUT) { + ret = gpiod_direction_input(desc); + if (ret) + return ret; + } + } + return 0; +} + static long linehandle_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { @@ -525,6 +592,8 @@ static long linehandle_ioctl(struct file *filep, unsigned int cmd, lh->descs, NULL, vals); + } else if (cmd == GPIOHANDLE_SET_CONFIG_IOCTL) { + return linehandle_set_config(lh, ip); } return -EINVAL; } diff --git a/include/uapi/linux/gpio.h b/include/uapi/linux/gpio.h index 7cc21c3b0839..799cf823d493 100644 --- a/include/uapi/linux/gpio.h +++ b/include/uapi/linux/gpio.h @@ -100,6 +100,24 @@ struct gpiohandle_request { int fd; }; +/** + * struct gpiohandle_config - Configuration for a GPIO handle request + * @flags: updated flags for the requested GPIO lines, such as + * GPIOHANDLE_REQUEST_OUTPUT, GPIOHANDLE_REQUEST_ACTIVE_LOW etc, OR:ed + * together + * @default_values: if the GPIOHANDLE_REQUEST_OUTPUT is set in flags, + * this specifies the default output value, should be 0 (low) or + * 1 (high), anything else than 0 or 1 will be interpreted as 1 (high) + * @padding: reserved for future use and should be zero filled + */ +struct gpiohandle_config { + __u32 flags; + __u8 default_values[GPIOHANDLES_MAX]; + __u32 padding[4]; /* padding for future use */ +}; + +#define GPIOHANDLE_SET_CONFIG_IOCTL _IOWR(0xB4, 0x0a, struct gpiohandle_config) + /** * struct gpiohandle_data - Information of values on a GPIO handle * @values: when getting the state of lines this contains the current