From: Kent Gibson <warthog618@gmail.com>
To: linux-gpio@vger.kernel.org, brgl@bgdev.pl,
linus.walleij@linaro.org, bamv2005@gmail.com
Cc: drew@pdp7.com, Kent Gibson <warthog618@gmail.com>
Subject: [PATCH v2 6/6] gpiolib: allow pull up/down on outputs
Date: Sat, 12 Oct 2019 09:56:28 +0800 [thread overview]
Message-ID: <20191012015628.9604-7-warthog618@gmail.com> (raw)
In-Reply-To: <20191012015628.9604-1-warthog618@gmail.com>
This patch allows pull up/down bias to be set on outputs.
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 <warthog618@gmail.com>
---
drivers/gpio/gpiolib.c | 35 +++++++++++++++++++++++------------
1 file changed, 23 insertions(+), 12 deletions(-)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index f90b20d548b9..9cc0f9077c7b 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -554,8 +554,9 @@ 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) &&
+ /* PULL_UP and PULL_DOWN flags only allowed for input or output mode. */
+ if (!((lflags & GPIOHANDLE_REQUEST_INPUT) ||
+ (lflags & GPIOHANDLE_REQUEST_OUTPUT)) &&
((lflags & GPIOHANDLE_REQUEST_PULL_UP) ||
(lflags & GPIOHANDLE_REQUEST_PULL_DOWN)))
return -EINVAL;
@@ -2932,6 +2933,24 @@ 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_PULL_UP, &desc->flags) &&
+ test_bit(FLAG_PULL_DOWN, &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)
+ 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
@@ -2979,16 +2998,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) &&
- test_bit(FLAG_PULL_DOWN, &desc->flags))
- gpio_set_config(chip, gpio_chip_hwgpio(desc),
- PIN_CONFIG_BIAS_DISABLE);
- else 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);
@@ -3114,6 +3124,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);
--
2.23.0
prev parent reply other threads:[~2019-10-12 1:57 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-12 1:56 [PATCH v2 0/6] gpio: expose pull-up/pull-down line flags to userspace Kent Gibson
2019-10-12 1:56 ` [PATCH v2 1/6] " Kent Gibson
2019-10-12 1:56 ` [PATCH v2 2/6] gpiolib: add support for pull up/down to lineevent_create Kent Gibson
2019-10-14 12:35 ` Bartosz Golaszewski
2019-10-14 12:58 ` Kent Gibson
2019-10-14 16:44 ` Bartosz Golaszewski
2019-10-12 1:56 ` [PATCH v2 3/6] gpio: mockup: add set_config to support pull up/down Kent Gibson
2019-10-12 1:56 ` [PATCH v2 4/6] gpiolib: pull requires explicit input mode Kent Gibson
2019-10-14 12:38 ` Bartosz Golaszewski
2019-10-14 12:54 ` Kent Gibson
2019-10-14 17:00 ` Bartosz Golaszewski
2019-10-15 0:52 ` Kent Gibson
2019-10-12 1:56 ` [PATCH v2 5/6] gpiolib: disable bias on inputs when pull up/down are both set Kent Gibson
2019-10-14 12:43 ` Bartosz Golaszewski
2019-10-14 13:04 ` Kent Gibson
2019-10-14 16:50 ` Bartosz Golaszewski
2019-10-15 0:58 ` Kent Gibson
2019-10-15 12:51 ` Bartosz Golaszewski
2019-10-16 1:01 ` Kent Gibson
2019-10-17 5:06 ` Kent Gibson
2019-10-18 8:03 ` Bartosz Golaszewski
2019-10-18 10:13 ` Kent Gibson
2019-10-21 14:57 ` Bartosz Golaszewski
2019-10-21 23:14 ` Kent Gibson
2019-10-22 3:11 ` Kent Gibson
2019-10-18 7:48 ` Bartosz Golaszewski
2019-10-18 9:42 ` Kent Gibson
2019-10-12 1:56 ` Kent Gibson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191012015628.9604-7-warthog618@gmail.com \
--to=warthog618@gmail.com \
--cc=bamv2005@gmail.com \
--cc=brgl@bgdev.pl \
--cc=drew@pdp7.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.