From patchwork Mon Oct 28 07:37:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1185203 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="tBZbLgZs"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 471mm55S0Wz9sPL for ; Mon, 28 Oct 2019 18:38:13 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729420AbfJ1HiD (ORCPT ); Mon, 28 Oct 2019 03:38:03 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:36752 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732043AbfJ1HiD (ORCPT ); Mon, 28 Oct 2019 03:38:03 -0400 Received: by mail-pg1-f194.google.com with SMTP id j22so309644pgh.3 for ; Mon, 28 Oct 2019 00:38:02 -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=+RS2E+pvrqE8M6rkF9KOwKfQynKI39Ni0QEkJ6FTAs8=; b=tBZbLgZsnPxNlb4wCp031zpRC905Os6mWS32kXueOQepfkC7Av5Fmmp04TV6uWjJvm ZlG1w2ezoVv+bzGOb/tOIlQxQrdMXJawmuuQPK0RpBnri1cqs4yhqWX+3bqbBM6IVcdc U0g6QBjaJ8LCffsOtmibOOlj/hXfAm5mdW1khI4qjKb0FQRwf9EwIf5bhVGQm53e2UXD 7yqj2sBzCU+kLx7HDCfe+oza2es8++l25qnT0xbxTPZzauR/jsAGK1MHo9iVRbtoBpdV c99HdfhIIg8SKyZxne2FAhr7FVdQI7Q5BlnH+mZOlaLHTNXbzFQKFkZwQ6LZ9mpRRwQh t2WQ== 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=+RS2E+pvrqE8M6rkF9KOwKfQynKI39Ni0QEkJ6FTAs8=; b=dmUH243mnThii374BOORg7c+UeFUG8qMticAZCKlQjz7wA1twsHhnuDzDlyKwlnzSl lIzjqKOxA2AEfti5UEl0agYuCLLUg6uOE900ccJe4fMFwc4OYoVf7pBo4fMBKgra7ku8 m04O/lLWUYEey7h7gPR0k4WG6PWLMJj4bYCYySEsaGvujGR319OLLcvjo2RuK2QkszmE 851ZwPsKwsG6q8K0+0/zuT3L5zkUrcNgU/qJyty7x61+MXsVf07IC69ylY/S+Nwojf3H uuGM5KKl4FC+4TG99gF4VCEvikJY+ejU0M1d9ez0dgGkW8LrGJSmrlSX4zSGellU6Pjt BckQ== X-Gm-Message-State: APjAAAXOo9N3a28cYUPdyBXf73WUcZzfdmCc9leFX3eb2+iql9Rxllnp +e1h+Y1K4uVWKTxqws380v83M1DOTVUF0wcQ X-Google-Smtp-Source: APXvYqyNMbAcroiowkfl0uy1YzxlDOgvUNm4CQgshu5+F3Wy0/sT6NiggADjw75X4l/vT9KvLQlMfQ== X-Received: by 2002:a17:90a:f991:: with SMTP id cq17mr20319254pjb.30.1572248282066; Mon, 28 Oct 2019 00:38:02 -0700 (PDT) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id b17sm11191015pfr.17.2019.10.28.00.37.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Oct 2019 00:38:01 -0700 (PDT) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, Kent Gibson Subject: [PATCH v4 1/5] gpio: expose pull-up/pull-down line flags to userspace Date: Mon, 28 Oct 2019 15:37:09 +0800 Message-Id: <20191028073713.25664-2-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191028073713.25664-1-warthog618@gmail.com> References: <20191028073713.25664-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] Signed-off-by: Kent Gibson --- drivers/gpio/gpiolib.c | 12 ++++++++++++ include/uapi/linux/gpio.h | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index e8964493c571..e80e689be2cc 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) @@ -592,6 +594,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 +1097,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 +2774,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 Oct 28 07:37:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1185204 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="tG3VU9HL"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 471mm64pbDz9s4Y for ; Mon, 28 Oct 2019 18:38:14 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732853AbfJ1HiH (ORCPT ); Mon, 28 Oct 2019 03:38:07 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:35670 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732043AbfJ1HiG (ORCPT ); Mon, 28 Oct 2019 03:38:06 -0400 Received: by mail-pg1-f195.google.com with SMTP id c8so6338642pgb.2 for ; Mon, 28 Oct 2019 00:38:06 -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=mXQP59Elz4pQKBc6wkSj/ourzYJVZdzHRKBxMLch/aA=; b=tG3VU9HL5ltK+Yf9sTp2b1QWkHCK51tswXKNQ2+C8f/UqS8nuCJPxjYR1CMVaqhAsd cKQsWgAwBcmmKigpFyX30jCeQPmhWZXNJ3Dopp0rMl6yCPAhZt5d0kr/n3VZX5Aa0AZH V3boOp4aMSPKS8yJAth2Dpo6br/sQY2iPh1Vj8HPRoQNUSvxfr32mn/BGE6W9nVS/Fgs X7JoLa8ELw74JG+LoQsZ33JuuczU0fLg+u2dHyaFeqd4YHWApVc7nOJo0fRsB/+ruKXk p3PbRuAGDqOJ9GT7yj9O8ZwIQ7Y6kIe0C9br1zKw5CftSJbHycemfHrHw8Qkc/kErQG3 RLVg== 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=mXQP59Elz4pQKBc6wkSj/ourzYJVZdzHRKBxMLch/aA=; b=Ma2mtt/wFovjojI1gh3nPu6T6TUTmwIPBDSZIySbHHgQ88Qg7jGkCaF60a8u9zmm3U aVBGzzf42kcc1MG5Rn1EaKYb1JhhtzUk67n3O3rp105r4RgpsY0DwPpuOIjAKl+kxOeM 1IUPsJSxTUqNHxrTb8EGL0qqAyTx1rBrvEiQKK2e+Yvx+nJ2tqt/+wSkUFwCt2n9JWCO AJKrZsuzGSuWTg2Vb3rVBFv40/JcexmlbGzDqZ4cyWfV7aoJFyy5kZjn0T807xD8KiPx UTmYCb7sz904XqAwazw8PU/vPjxadq5usFqhjDLW+WHTup91AEBdANKMEwHajIfl45d3 Ocfw== X-Gm-Message-State: APjAAAW/019KFE6vd73WIQ3WwlVJCZIUz7ux8u/j+hsrWDUzUgm7eRZ5 cNR2BbRlo+5jWvFGu8UMv35yvyro6DsvTHhA X-Google-Smtp-Source: APXvYqxDhwK2uv6/CoHJyr/nrapm4TKR21qic/nYDdK3Y6eDvLWHGtxco1ti2hMxgJtDqeFG66uOVw== X-Received: by 2002:a17:90a:a002:: with SMTP id q2mr18895202pjp.124.1572248285406; Mon, 28 Oct 2019 00:38:05 -0700 (PDT) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id b17sm11191015pfr.17.2019.10.28.00.38.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Oct 2019 00:38:04 -0700 (PDT) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, Kent Gibson Subject: [PATCH v4 2/5] gpiolib: add support for pull up/down to lineevent_create Date: Mon, 28 Oct 2019 15:37:10 +0800 Message-Id: <20191028073713.25664-3-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191028073713.25664-1-warthog618@gmail.com> References: <20191028073713.25664-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. Also restrict the application of bias to lines explicitly requested as inputs to prevent bias being applied to as-is line requests. Signed-off-by: Kent Gibson --- drivers/gpio/gpiolib.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index e80e689be2cc..7dfbb3676ee0 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -554,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; @@ -944,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 Oct 28 07:37:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1185205 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="IVRdALVe"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 471mm70zFjz9sP3 for ; Mon, 28 Oct 2019 18:38:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732984AbfJ1HiK (ORCPT ); Mon, 28 Oct 2019 03:38:10 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:39261 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732043AbfJ1HiJ (ORCPT ); Mon, 28 Oct 2019 03:38:09 -0400 Received: by mail-pl1-f196.google.com with SMTP id t12so547218plo.6 for ; Mon, 28 Oct 2019 00:38:09 -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=LsdGXAZDsLtoyIzrg5Nm/vCICJV/ZMXt/g2t+ZwO92U=; b=IVRdALVewCeKOhf/3dprfUokjJiXk4Nyvf9Dqgm/2HW09PFIVkADtmNEx1As4UMlXM ZSCA8ypu2pIkXInaUPjAhcH4I7Af3T1SnJ+lVF0UtgtAIX0bHUMFViLZpTdidYE/YTcG M0GWmlfKA4Mv/LyyP77gvjLKmKvJ9qCswQateofG3VFySFVDhMQFvqVUwdTEkV5c9EVD f2j6Obd2vXPXGMfZkepHbda2mXVDcvw5lup41enNRrdZCSUSDo/iem9c+LpyL27NJDHC 3ez/Ui9dsBrdbO+xtpzWp1XBQfHsYVZblKyGvgbMx/mQnYjIIT2VVEtHy9Q3Y3Yp2sd5 cbeg== 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=BpTj6by9Emd+hXYb8ApaDYpKkqFNDjoHvOtluEtcfrftJOLiC7VGwFyB21q9UZ9CjR 2TtLRrkGsyLnDKTqJNNJurZa69mU7ol2sZhPVJqcaSWYuiUOMtNYtvzFQLA/4+zRjQeg 6CiNWfQRC/xc3dPAB1sozzJlhkURGdfQk7P15oV47FrlYajkOa2JNdISkAyyUYCUJMdo 310wo/s7Aiym5kbHkb3sNfaxJYh0nCOXPW0oVdGrm7DhU9OUem8el3IjB/mpwrMxN4tL 7Vrwqepm0f9WAO8qzVYnKCkyw1nOmsWLfQDCcGLP52VuSFEtXCFwjb2vZC6wYyclUn87 ibbA== X-Gm-Message-State: APjAAAWrRXz1V+sJLVuU3Z0OS9/nWA6n4VgUbGbPel1wvnk+Eqox5slC rvLYaLGnPn6hnSRo5C6Xr1Nd23CtTPWhQhWO X-Google-Smtp-Source: APXvYqzcCB9xFHZFz2A/njwtyC2u9AMZ0iYoaDGhe1oL/Iv67NJLbQhibJHRrMPajJFkFavZOAilJw== X-Received: by 2002:a17:902:7089:: with SMTP id z9mr16727741plk.51.1572248288687; Mon, 28 Oct 2019 00:38:08 -0700 (PDT) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id b17sm11191015pfr.17.2019.10.28.00.38.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Oct 2019 00:38:08 -0700 (PDT) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, Kent Gibson Subject: [PATCH v4 3/5] gpio: mockup: add set_config to support pull up/down Date: Mon, 28 Oct 2019 15:37:11 +0800 Message-Id: <20191028073713.25664-4-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191028073713.25664-1-warthog618@gmail.com> References: <20191028073713.25664-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 Oct 28 07:37:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1185206 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="l+/zS4mh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 471mm7568Wz9sPV for ; Mon, 28 Oct 2019 18:38:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732980AbfJ1HiO (ORCPT ); Mon, 28 Oct 2019 03:38:14 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:43487 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732043AbfJ1HiO (ORCPT ); Mon, 28 Oct 2019 03:38:14 -0400 Received: by mail-pg1-f195.google.com with SMTP id l24so6311263pgh.10 for ; Mon, 28 Oct 2019 00:38:12 -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=ZkhZto+QMct+ZpMEaVqMJNlf+/jbxDs/0RAyQ9ZpcmM=; b=l+/zS4mhBeHKdwvX/K4bFJlasBPkWPU6ENyOTD46f9Ava7LGcMLSkMH8D0d3PCroDN CmTXoUy40lU6+/uH5rVR/MHxhQUGoGa9mO8xswvRRYdsQYURMSJ06n5uaRT3lFs0sQx3 tX0+UHC07d+g++VFNb16SRbhKGGzcAR36FpDjKiD55iNkfyL91QyKvOxWOzv0QC4TJwD jIwUO9FwoDsBtWNk+141auc+qXvp8s5oDCyWt+MDNq1ccy+Ie9n0qhwdfekaa5eNkd8E sitnFdxmWRkhy9iCqtoVdDwET4uWaDzhDMoeO/6UWrdXX4+wale6Fm6tQuycP5wkt0e5 AAOw== 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=ZkhZto+QMct+ZpMEaVqMJNlf+/jbxDs/0RAyQ9ZpcmM=; b=oizGs+Q+STREoCLplUq3RTpTQVr/AnxPrWrvfZpGHR2SM+EEqSl9rHEaysSwFgs59e GzuwT+Ql/8jWRZoiQsNr05+nOEpcyky3k3OeIGGFKOrQtizzDb8GO3B3YcxmqB47b5B4 hUoJKH/S60e/43eD6E6x8Be584uBgjTQ9kLp6fx85wzWJ09QaheZEtlE9BMq+Pr09QCE YDNywIKYoqJCigm2aKVwPzxnc1m+dcvq6xg9lSurBBGeVXAZ3GWZUajkr3jSVlVPC3n+ AHmbw+WqwhJcLGPIS+TJYbdfEGlyJT6Cf4f7V/HoEo+FZjwbKgmpZCLuFpuRPyGfQhAr S/pA== X-Gm-Message-State: APjAAAWnZLCN0BpLOY7aNcV57t1ET4XV1fXkU58aXDKRwdKrX7OYyvZV KbX38kmu5Ht0gMHzMfcDTQnmqGFMQquottXF X-Google-Smtp-Source: APXvYqwfs9WIcrAvajlQerL1ikLOF4R9D1LfjuzjHOvZZ4iyM1GkRxlHnVnRrW/yAEm12/KbR4xqXQ== X-Received: by 2002:a63:e055:: with SMTP id n21mr19238114pgj.411.1572248292128; Mon, 28 Oct 2019 00:38:12 -0700 (PDT) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id b17sm11191015pfr.17.2019.10.28.00.38.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Oct 2019 00:38:11 -0700 (PDT) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, Kent Gibson Subject: [PATCH v4 4/5] gpiolib: add support for disabling line bias Date: Mon, 28 Oct 2019 15:37:12 +0800 Message-Id: <20191028073713.25664-5-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191028073713.25664-1-warthog618@gmail.com> References: <20191028073713.25664-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, 56 insertions(+), 8 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 7dfbb3676ee0..177d25e19758 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,21 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)) return -EINVAL; + /* Bias flags only make sense for input mode. */ + if (!(lflags & GPIOHANDLE_REQUEST_INPUT) && + ((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) || + (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) || + (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP))) + 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 +977,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 +1136,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 +2817,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 +2944,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 +2958,23 @@ 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; + + if (test_bit(FLAG_BIAS_DISABLE, &desc->flags)) + bias |= PIN_CONFIG_BIAS_DISABLE; + if (test_bit(FLAG_PULL_UP, &desc->flags)) + bias |= PIN_CONFIG_BIAS_PULL_UP; + if (test_bit(FLAG_PULL_DOWN, &desc->flags)) + bias |= PIN_CONFIG_BIAS_PULL_DOWN; + + if (bias) + return gpio_set_config(chip, gpio_chip_hwgpio(desc), bias); + + return 0; +} + /** * gpiod_direction_input - set the GPIO direction to input * @desc: GPIO to set to input @@ -2972,12 +3022,7 @@ int gpiod_direction_input(struct gpio_desc *desc) 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); + 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 Oct 28 07:37:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Gibson X-Patchwork-Id: 1185207 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="qiZ9tbNQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 471mmB4v9Wz9s4Y for ; Mon, 28 Oct 2019 18:38:18 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732989AbfJ1HiS (ORCPT ); Mon, 28 Oct 2019 03:38:18 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:44310 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732043AbfJ1HiS (ORCPT ); Mon, 28 Oct 2019 03:38:18 -0400 Received: by mail-pf1-f193.google.com with SMTP id q26so2686657pfn.11 for ; Mon, 28 Oct 2019 00:38:16 -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=ehKV7ltIoKTEMy3G96ov92GcJaXVZr5SNSr+TsPmJDM=; b=qiZ9tbNQzBOIY10SnsyPXENa6RJKrD1SNdREiXD38AbGwklGC4vyf/NY8tHCkw2Wfx w3AzQwLf2TG06dOowpfDr5xE3/idU0zHUx0IzqNkvTRxo+EvbwOA6eSdOM/KFL+86JQK ombZEhfSfLhKki9tf71AQKpupwyY3sS/K6REIl31YLzvn57HQDD3xmQcivQrerpA0+mv 5wTS9bD/EY0nM8cXCsXIZOskB0RCtyek9isSu8wmvnwbEI1LICIHMMXFlkTQIbifr6Df j4WS2DN8gA8AFWOi0cW+jAtlUzaVGsZHM9e1UOnszUOkiacFttrvqbQgMyhY1OZQy2wE vQlQ== 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=ehKV7ltIoKTEMy3G96ov92GcJaXVZr5SNSr+TsPmJDM=; b=p5iBGqI2ON/ZXXoYVBpt1eE+yU/Actk/Y5rCOswtW5ZfzUQoKINWkg+4vxpoF2nJmV WeZy/1tlEwkBERt59M2NJK6t238XfPYJGHhi6XL9AmHwre6byRGaul9bg6z/R8r5I9xW YOG7LV0jNlzieI2ppXgMrr7IiE4UbG5/spiOwEgUOQaT39uvooxKKhb976Op3YiH+5DE PyqMXLCMZObFMcwg6nWkUKjpozPEzCEHvWjdMiwglRoH8NgUJlb1QLbi8FQ5ZdOb6CQ9 fYI/5ShlZ610b/4EKXyHaJaiThm0s61Q1Wy7ZksqZhg3Q9DJ1CilWwUx9ZjOJDe487qH jYSg== X-Gm-Message-State: APjAAAUfDlpGa/+yFy9JnzkU0YU5t3fFWKHcTMHzGLQYPH2fCP0p3vDy kgn+SfQWrJCx+4ZJkDZy1qBgzoXhhOtCClW2 X-Google-Smtp-Source: APXvYqzcIA3xT0O0A6u+riD/98qUkbHMBLCVeA708G8NxxvpJUGXPjiO+AQYKRYOKuUlV4VPexA7PQ== X-Received: by 2002:a63:fb4f:: with SMTP id w15mr18396565pgj.403.1572248295539; Mon, 28 Oct 2019 00:38:15 -0700 (PDT) Received: from sol.lan (220-235-109-115.dyn.iinet.net.au. [220.235.109.115]) by smtp.gmail.com with ESMTPSA id b17sm11191015pfr.17.2019.10.28.00.38.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Oct 2019 00:38:15 -0700 (PDT) From: Kent Gibson To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com, linus.walleij@linaro.org, bamv2005@gmail.com Cc: drew@pdp7.com, Kent Gibson Subject: [PATCH v4 5/5] gpiolib: add support for biasing output lines Date: Mon, 28 Oct 2019 15:37:13 +0800 Message-Id: <20191028073713.25664-6-warthog618@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191028073713.25664-1-warthog618@gmail.com> References: <20191028073713.25664-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 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 177d25e19758..56b2814b843e 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))) @@ -3148,6 +3149,7 @@ int gpiod_direction_output(struct gpio_desc *desc, int value) } set_output_value: + gpio_set_bias(gc, desc); return gpiod_direction_output_raw_commit(desc, value); } EXPORT_SYMBOL_GPL(gpiod_direction_output);