* [PATCH v3 1/5] gpio: expose pull-up/pull-down line flags to userspace
2019-10-20 14:42 [PATCH v3 0/5] gpio: expose line bias flags to userspace Kent Gibson
@ 2019-10-20 14:42 ` Kent Gibson
2019-10-20 14:42 ` [PATCH v3 2/5] gpiolib: add support for pull up/down to lineevent_create Kent Gibson
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Kent Gibson @ 2019-10-20 14:42 UTC (permalink / raw)
To: linux-gpio, bgolaszewski, linus.walleij, bamv2005; +Cc: drew
From: Drew Fustini <drew@pdp7.com>
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 <drew@pdp7.com>
---
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..604dc17b3207 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_PULL_UP | \
+ GPIOHANDLE_REQUEST_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_PULL_DOWN)
+ set_bit(FLAG_PULL_DOWN, &desc->flags);
+ if (lflags & GPIOHANDLE_REQUEST_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_PULL_DOWN;
+ if (test_bit(FLAG_PULL_UP, &desc->flags))
+ lineinfo.flags |= GPIOLINE_FLAG_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..c2d1f7d908d6 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_PULL_UP (1UL << 5)
+#define GPIOLINE_FLAG_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_PULL_UP (1UL << 5)
+#define GPIOHANDLE_REQUEST_PULL_DOWN (1UL << 6)
/**
* struct gpiohandle_request - Information about a GPIO handle request
--
2.23.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 2/5] gpiolib: add support for pull up/down to lineevent_create
2019-10-20 14:42 [PATCH v3 0/5] gpio: expose line bias flags to userspace Kent Gibson
2019-10-20 14:42 ` [PATCH v3 1/5] gpio: expose pull-up/pull-down line " Kent Gibson
@ 2019-10-20 14:42 ` Kent Gibson
2019-10-20 14:42 ` [PATCH v3 3/5] gpio: mockup: add set_config to support pull up/down Kent Gibson
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Kent Gibson @ 2019-10-20 14:42 UTC (permalink / raw)
To: linux-gpio, bgolaszewski, linus.walleij, bamv2005; +Cc: drew, Kent Gibson
This patch adds support for pull up/down to lineevent_create.
Use cases include receiving asynchronous presses from a
push button without an external pull up/down.
The patch also restricts 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 <warthog618@gmail.com>
---
drivers/gpio/gpiolib.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 604dc17b3207..eef964417521 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_PULL_UP) ||
+ (lflags & GPIOHANDLE_REQUEST_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_PULL_DOWN)
+ set_bit(FLAG_PULL_DOWN, &desc->flags);
+ if (lflags & GPIOHANDLE_REQUEST_PULL_UP)
+ set_bit(FLAG_PULL_UP, &desc->flags);
ret = gpiod_direction_input(desc);
if (ret)
--
2.23.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 3/5] gpio: mockup: add set_config to support pull up/down
2019-10-20 14:42 [PATCH v3 0/5] gpio: expose line bias flags to userspace Kent Gibson
2019-10-20 14:42 ` [PATCH v3 1/5] gpio: expose pull-up/pull-down line " Kent Gibson
2019-10-20 14:42 ` [PATCH v3 2/5] gpiolib: add support for pull up/down to lineevent_create Kent Gibson
@ 2019-10-20 14:42 ` Kent Gibson
2019-10-20 14:42 ` [PATCH v3 4/5] gpiolib: add support for disabling line bias Kent Gibson
2019-10-20 14:42 ` [PATCH v3 5/5] gpiolib: add support for biasing output lines Kent Gibson
4 siblings, 0 replies; 6+ messages in thread
From: Kent Gibson @ 2019-10-20 14:42 UTC (permalink / raw)
To: linux-gpio, bgolaszewski, linus.walleij, bamv2005; +Cc: drew, Kent Gibson
This patch adds 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 <warthog618@gmail.com>
---
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;
--
2.23.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 4/5] gpiolib: add support for disabling line bias
2019-10-20 14:42 [PATCH v3 0/5] gpio: expose line bias flags to userspace Kent Gibson
` (2 preceding siblings ...)
2019-10-20 14:42 ` [PATCH v3 3/5] gpio: mockup: add set_config to support pull up/down Kent Gibson
@ 2019-10-20 14:42 ` Kent Gibson
2019-10-20 14:42 ` [PATCH v3 5/5] gpiolib: add support for biasing output lines Kent Gibson
4 siblings, 0 replies; 6+ messages in thread
From: Kent Gibson @ 2019-10-20 14:42 UTC (permalink / raw)
To: linux-gpio, bgolaszewski, linus.walleij, bamv2005; +Cc: drew, Kent Gibson
This patch allows 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 <warthog618@gmail.com>
---
drivers/gpio/gpiolib.c | 63 ++++++++++++++++++++++++++++-----------
drivers/gpio/gpiolib.h | 1 +
include/uapi/linux/gpio.h | 10 ++++---
3 files changed, 53 insertions(+), 21 deletions(-)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index eef964417521..b6fdaedc793a 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -421,8 +421,9 @@ struct linehandle_state {
(GPIOHANDLE_REQUEST_INPUT | \
GPIOHANDLE_REQUEST_OUTPUT | \
GPIOHANDLE_REQUEST_ACTIVE_LOW | \
- GPIOHANDLE_REQUEST_PULL_UP | \
- GPIOHANDLE_REQUEST_PULL_DOWN | \
+ GPIOHANDLE_REQUEST_BIAS_DISABLE | \
+ GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | \
+ GPIOHANDLE_REQUEST_BIAS_PULL_UP | \
GPIOHANDLE_REQUEST_OPEN_DRAIN | \
GPIOHANDLE_REQUEST_OPEN_SOURCE)
@@ -554,10 +555,11 @@ 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_PULL_UP) ||
- (lflags & GPIOHANDLE_REQUEST_PULL_DOWN)))
+ ((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) ||
+ (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) ||
+ (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP)))
return -EINVAL;
lh = kzalloc(sizeof(*lh), GFP_KERNEL);
@@ -600,9 +602,11 @@ 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_PULL_DOWN)
+ 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_PULL_UP)
+ if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP)
set_bit(FLAG_PULL_UP, &desc->flags);
ret = gpiod_set_transitory(desc, false);
@@ -924,6 +928,13 @@ 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;
+
le = kzalloc(sizeof(*le), GFP_KERNEL);
if (!le)
return -ENOMEM;
@@ -950,9 +961,11 @@ 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_PULL_DOWN)
+ 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_PULL_UP)
+ if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP)
set_bit(FLAG_PULL_UP, &desc->flags);
ret = gpiod_direction_input(desc);
@@ -1107,10 +1120,12 @@ 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_PULL_DOWN;
+ lineinfo.flags |= GPIOLINE_FLAG_BIAS_PULL_DOWN;
if (test_bit(FLAG_PULL_UP, &desc->flags))
- lineinfo.flags |= GPIOLINE_FLAG_PULL_UP;
+ lineinfo.flags |= GPIOLINE_FLAG_BIAS_PULL_UP;
if (copy_to_user(ip, &lineinfo, sizeof(lineinfo)))
return -EFAULT;
@@ -2786,6 +2801,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 +2928,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 +2942,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 +3006,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 c2d1f7d908d6..300c2151e9f7 100644
--- a/include/uapi/linux/gpio.h
+++ b/include/uapi/linux/gpio.h
@@ -33,8 +33,9 @@ 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_PULL_UP (1UL << 5)
-#define GPIOLINE_FLAG_PULL_DOWN (1UL << 6)
+#define GPIOLINE_FLAG_BIAS_DISABLE (1UL << 5)
+#define GPIOLINE_FLAG_BIAS_PULL_DOWN (1UL << 6)
+#define GPIOLINE_FLAG_BIAS_PULL_UP (1UL << 7)
/**
* struct gpioline_info - Information about a certain GPIO line
@@ -64,8 +65,9 @@ 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_PULL_UP (1UL << 5)
-#define GPIOHANDLE_REQUEST_PULL_DOWN (1UL << 6)
+#define GPIOHANDLE_REQUEST_BIAS_DISABLE (1UL << 5)
+#define GPIOHANDLE_REQUEST_BIAS_PULL_DOWN (1UL << 6)
+#define GPIOHANDLE_REQUEST_BIAS_PULL_UP (1UL << 7)
/**
* struct gpiohandle_request - Information about a GPIO handle request
--
2.23.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 5/5] gpiolib: add support for biasing output lines
2019-10-20 14:42 [PATCH v3 0/5] gpio: expose line bias flags to userspace Kent Gibson
` (3 preceding siblings ...)
2019-10-20 14:42 ` [PATCH v3 4/5] gpiolib: add support for disabling line bias Kent Gibson
@ 2019-10-20 14:42 ` Kent Gibson
4 siblings, 0 replies; 6+ messages in thread
From: Kent Gibson @ 2019-10-20 14:42 UTC (permalink / raw)
To: linux-gpio, bgolaszewski, linus.walleij, bamv2005; +Cc: drew, Kent Gibson
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 | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index b6fdaedc793a..f1f6a390e7f5 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_DOWN) ||
(lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP)))
@@ -3132,6 +3133,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
^ permalink raw reply related [flat|nested] 6+ messages in thread