linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH] gpiolib: make gpiod_direction_output take a logical value, add gpiod_direction_output_raw
@ 2014-01-07 11:34 Philipp Zabel
  2014-01-12  7:44 ` Alexandre Courbot
  2014-02-07  8:48 ` Linus Walleij
  0 siblings, 2 replies; 4+ messages in thread
From: Philipp Zabel @ 2014-01-07 11:34 UTC (permalink / raw)
  To: linux-gpio
  Cc: linux-kernel, Linus Walleij, Alexandre Courbot, Rob Landley,
	Arnd Bergmann, Maxime Ripard, kernel, Philipp Zabel

The documentation was not clear about whether gpio_direction_output should take
a logical value or the physical level on the output line, i.e. whether the
ACTIVE_LOW status would be taken into account.
This converts gpiod_direction_output to use the logical level and adds a new
gpiod_direction_output_raw for the raw value.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
---
 Documentation/gpio/consumer.txt |  1 +
 drivers/gpio/gpiolib.c          | 67 +++++++++++++++++++++++++++++------------
 include/asm-generic/gpio.h      |  2 +-
 include/linux/gpio/consumer.h   |  7 +++++
 4 files changed, 57 insertions(+), 20 deletions(-)

diff --git a/Documentation/gpio/consumer.txt b/Documentation/gpio/consumer.txt
index 07c74a3..4dc4809 100644
--- a/Documentation/gpio/consumer.txt
+++ b/Documentation/gpio/consumer.txt
@@ -150,6 +150,7 @@ raw line value:
 	void gpiod_set_raw_value(struct gpio_desc *desc, int value)
 	int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
 	void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)
+	int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
 
 The active-low state of a GPIO can also be queried using the following call:
 
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 85f772c..f04f1e6 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -330,9 +330,9 @@ static ssize_t gpio_direction_store(struct device *dev,
 	if (!test_bit(FLAG_EXPORT, &desc->flags))
 		status = -EIO;
 	else if (sysfs_streq(buf, "high"))
-		status = gpiod_direction_output(desc, 1);
+		status = gpiod_direction_output_raw(desc, 1);
 	else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low"))
-		status = gpiod_direction_output(desc, 0);
+		status = gpiod_direction_output_raw(desc, 0);
 	else if (sysfs_streq(buf, "in"))
 		status = gpiod_direction_input(desc);
 	else
@@ -1579,7 +1579,7 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
 	if (flags & GPIOF_DIR_IN)
 		err = gpiod_direction_input(desc);
 	else
-		err = gpiod_direction_output(desc,
+		err = gpiod_direction_output_raw(desc,
 				(flags & GPIOF_INIT_HIGH) ? 1 : 0);
 
 	if (err)
@@ -1744,28 +1744,13 @@ fail:
 }
 EXPORT_SYMBOL_GPL(gpiod_direction_input);
 
-/**
- * gpiod_direction_output - set the GPIO direction to input
- * @desc:	GPIO to set to output
- * @value:	initial output value of the GPIO
- *
- * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
- * be called safely on it. The initial value of the output must be specified.
- *
- * Return 0 in case of success, else an error code.
- */
-int gpiod_direction_output(struct gpio_desc *desc, int value)
+static int _gpiod_direction_output_raw(struct gpio_desc *desc, int value)
 {
 	unsigned long		flags;
 	struct gpio_chip	*chip;
 	int			status = -EINVAL;
 	int offset;
 
-	if (!desc || !desc->chip) {
-		pr_warn("%s: invalid GPIO\n", __func__);
-		return -EINVAL;
-	}
-
 	/* GPIOs used for IRQs shall not be set as output */
 	if (test_bit(FLAG_USED_AS_IRQ, &desc->flags)) {
 		gpiod_err(desc,
@@ -1827,6 +1812,50 @@ fail:
 		gpiod_dbg(desc, "%s: gpio status %d\n", __func__, status);
 	return status;
 }
+
+/**
+ * gpiod_direction_output_raw - set the GPIO direction to output
+ * @desc:	GPIO to set to output
+ * @value:	initial output value of the GPIO
+ *
+ * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
+ * be called safely on it. The initial value of the output must be specified
+ * as raw value on the physical line without regard for the ACTIVE_LOW status.
+ *
+ * Return 0 in case of success, else an error code.
+ */
+int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
+{
+	if (!desc || !desc->chip) {
+		pr_warn("%s: invalid GPIO\n", __func__);
+		return -EINVAL;
+	}
+	return _gpiod_direction_output_raw(desc, value);
+}
+EXPORT_SYMBOL_GPL(gpiod_direction_output_raw);
+
+/**
+ * gpiod_direction_output - set the GPIO direction to input
+ * @desc:	GPIO to set to output
+ * @value:	initial output value of the GPIO
+ *
+ * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
+ * be called safely on it. The initial value of the output must be specified
+ * as the logical value of the GPIO, i.e. taking its ACTIVE_LOW status into
+ * account.
+ *
+ * Return 0 in case of success, else an error code.
+ */
+int gpiod_direction_output(struct gpio_desc *desc, int value)
+{
+	if (!desc || !desc->chip) {
+		pr_warn("%s: invalid GPIO\n", __func__);
+		return -EINVAL;
+	}
+	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
+		value = !value;
+	return _gpiod_direction_output_raw(desc, value);
+}
 EXPORT_SYMBOL_GPL(gpiod_direction_output);
 
 /**
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index a5f56a0..23e3645 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -69,7 +69,7 @@ static inline int gpio_direction_input(unsigned gpio)
 }
 static inline int gpio_direction_output(unsigned gpio, int value)
 {
-	return gpiod_direction_output(gpio_to_desc(gpio), value);
+	return gpiod_direction_output_raw(gpio_to_desc(gpio), value);
 }
 
 static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h
index 4d34dbb..3879943 100644
--- a/include/linux/gpio/consumer.h
+++ b/include/linux/gpio/consumer.h
@@ -36,6 +36,7 @@ void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
 int gpiod_get_direction(const struct gpio_desc *desc);
 int gpiod_direction_input(struct gpio_desc *desc);
 int gpiod_direction_output(struct gpio_desc *desc, int value);
+int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
 
 /* Value get/set from non-sleeping context */
 int gpiod_get_value(const struct gpio_desc *desc);
@@ -121,6 +122,12 @@ static inline int gpiod_direction_output(struct gpio_desc *desc, int value)
 	WARN_ON(1);
 	return -ENOSYS;
 }
+static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
+{
+	/* GPIO can never have been requested */
+	WARN_ON(1);
+	return -ENOSYS;
+}
 
 
 static inline int gpiod_get_value(const struct gpio_desc *desc)
-- 
1.8.5.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [RFC PATCH] gpiolib: make gpiod_direction_output take a logical value, add gpiod_direction_output_raw
  2014-01-07 11:34 [RFC PATCH] gpiolib: make gpiod_direction_output take a logical value, add gpiod_direction_output_raw Philipp Zabel
@ 2014-01-12  7:44 ` Alexandre Courbot
  2014-02-06 15:54   ` Philipp Zabel
  2014-02-07  8:48 ` Linus Walleij
  1 sibling, 1 reply; 4+ messages in thread
From: Alexandre Courbot @ 2014-01-12  7:44 UTC (permalink / raw)
  To: Philipp Zabel
  Cc: linux-gpio, Linux Kernel Mailing List, Linus Walleij,
	Rob Landley, Arnd Bergmann, Maxime Ripard, kernel

Hi Philipp,

On Tue, Jan 7, 2014 at 8:34 PM, Philipp Zabel <p.zabel@pengutronix.de> wrote:
> The documentation was not clear about whether gpio_direction_output should take
> a logical value or the physical level on the output line, i.e. whether the
> ACTIVE_LOW status would be taken into account.
> This converts gpiod_direction_output to use the logical level and adds a new
> gpiod_direction_output_raw for the raw value.

Thanks for taking the time to craft this! The patch seems to do
exactly what we discussed and looks good to me. Maybe Linus can let us
know what he thinks about it? Unless there are reasons against it, I
think this should be merged ASAP as we want to gpiod API to converge
to something stable ASAP.

Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>

>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
>  Documentation/gpio/consumer.txt |  1 +
>  drivers/gpio/gpiolib.c          | 67 +++++++++++++++++++++++++++++------------
>  include/asm-generic/gpio.h      |  2 +-
>  include/linux/gpio/consumer.h   |  7 +++++
>  4 files changed, 57 insertions(+), 20 deletions(-)
>
> diff --git a/Documentation/gpio/consumer.txt b/Documentation/gpio/consumer.txt
> index 07c74a3..4dc4809 100644
> --- a/Documentation/gpio/consumer.txt
> +++ b/Documentation/gpio/consumer.txt
> @@ -150,6 +150,7 @@ raw line value:
>         void gpiod_set_raw_value(struct gpio_desc *desc, int value)
>         int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
>         void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)
> +       int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
>
>  The active-low state of a GPIO can also be queried using the following call:
>
> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> index 85f772c..f04f1e6 100644
> --- a/drivers/gpio/gpiolib.c
> +++ b/drivers/gpio/gpiolib.c
> @@ -330,9 +330,9 @@ static ssize_t gpio_direction_store(struct device *dev,
>         if (!test_bit(FLAG_EXPORT, &desc->flags))
>                 status = -EIO;
>         else if (sysfs_streq(buf, "high"))
> -               status = gpiod_direction_output(desc, 1);
> +               status = gpiod_direction_output_raw(desc, 1);
>         else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low"))
> -               status = gpiod_direction_output(desc, 0);
> +               status = gpiod_direction_output_raw(desc, 0);
>         else if (sysfs_streq(buf, "in"))
>                 status = gpiod_direction_input(desc);
>         else
> @@ -1579,7 +1579,7 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
>         if (flags & GPIOF_DIR_IN)
>                 err = gpiod_direction_input(desc);
>         else
> -               err = gpiod_direction_output(desc,
> +               err = gpiod_direction_output_raw(desc,
>                                 (flags & GPIOF_INIT_HIGH) ? 1 : 0);
>
>         if (err)
> @@ -1744,28 +1744,13 @@ fail:
>  }
>  EXPORT_SYMBOL_GPL(gpiod_direction_input);
>
> -/**
> - * gpiod_direction_output - set the GPIO direction to input
> - * @desc:      GPIO to set to output
> - * @value:     initial output value of the GPIO
> - *
> - * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
> - * be called safely on it. The initial value of the output must be specified.
> - *
> - * Return 0 in case of success, else an error code.
> - */
> -int gpiod_direction_output(struct gpio_desc *desc, int value)
> +static int _gpiod_direction_output_raw(struct gpio_desc *desc, int value)
>  {
>         unsigned long           flags;
>         struct gpio_chip        *chip;
>         int                     status = -EINVAL;
>         int offset;
>
> -       if (!desc || !desc->chip) {
> -               pr_warn("%s: invalid GPIO\n", __func__);
> -               return -EINVAL;
> -       }
> -
>         /* GPIOs used for IRQs shall not be set as output */
>         if (test_bit(FLAG_USED_AS_IRQ, &desc->flags)) {
>                 gpiod_err(desc,
> @@ -1827,6 +1812,50 @@ fail:
>                 gpiod_dbg(desc, "%s: gpio status %d\n", __func__, status);
>         return status;
>  }
> +
> +/**
> + * gpiod_direction_output_raw - set the GPIO direction to output
> + * @desc:      GPIO to set to output
> + * @value:     initial output value of the GPIO
> + *
> + * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
> + * be called safely on it. The initial value of the output must be specified
> + * as raw value on the physical line without regard for the ACTIVE_LOW status.
> + *
> + * Return 0 in case of success, else an error code.
> + */
> +int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
> +{
> +       if (!desc || !desc->chip) {
> +               pr_warn("%s: invalid GPIO\n", __func__);
> +               return -EINVAL;
> +       }
> +       return _gpiod_direction_output_raw(desc, value);
> +}
> +EXPORT_SYMBOL_GPL(gpiod_direction_output_raw);
> +
> +/**
> + * gpiod_direction_output - set the GPIO direction to input
> + * @desc:      GPIO to set to output
> + * @value:     initial output value of the GPIO
> + *
> + * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
> + * be called safely on it. The initial value of the output must be specified
> + * as the logical value of the GPIO, i.e. taking its ACTIVE_LOW status into
> + * account.
> + *
> + * Return 0 in case of success, else an error code.
> + */
> +int gpiod_direction_output(struct gpio_desc *desc, int value)
> +{
> +       if (!desc || !desc->chip) {
> +               pr_warn("%s: invalid GPIO\n", __func__);
> +               return -EINVAL;
> +       }
> +       if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
> +               value = !value;
> +       return _gpiod_direction_output_raw(desc, value);
> +}
>  EXPORT_SYMBOL_GPL(gpiod_direction_output);
>
>  /**
> diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
> index a5f56a0..23e3645 100644
> --- a/include/asm-generic/gpio.h
> +++ b/include/asm-generic/gpio.h
> @@ -69,7 +69,7 @@ static inline int gpio_direction_input(unsigned gpio)
>  }
>  static inline int gpio_direction_output(unsigned gpio, int value)
>  {
> -       return gpiod_direction_output(gpio_to_desc(gpio), value);
> +       return gpiod_direction_output_raw(gpio_to_desc(gpio), value);
>  }
>
>  static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
> diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h
> index 4d34dbb..3879943 100644
> --- a/include/linux/gpio/consumer.h
> +++ b/include/linux/gpio/consumer.h
> @@ -36,6 +36,7 @@ void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
>  int gpiod_get_direction(const struct gpio_desc *desc);
>  int gpiod_direction_input(struct gpio_desc *desc);
>  int gpiod_direction_output(struct gpio_desc *desc, int value);
> +int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
>
>  /* Value get/set from non-sleeping context */
>  int gpiod_get_value(const struct gpio_desc *desc);
> @@ -121,6 +122,12 @@ static inline int gpiod_direction_output(struct gpio_desc *desc, int value)
>         WARN_ON(1);
>         return -ENOSYS;
>  }
> +static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
> +{
> +       /* GPIO can never have been requested */
> +       WARN_ON(1);
> +       return -ENOSYS;
> +}
>
>
>  static inline int gpiod_get_value(const struct gpio_desc *desc)
> --
> 1.8.5.2
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC PATCH] gpiolib: make gpiod_direction_output take a logical value, add gpiod_direction_output_raw
  2014-01-12  7:44 ` Alexandre Courbot
@ 2014-02-06 15:54   ` Philipp Zabel
  0 siblings, 0 replies; 4+ messages in thread
From: Philipp Zabel @ 2014-02-06 15:54 UTC (permalink / raw)
  To: Linus Walleij, Alexandre Courbot
  Cc: linux-gpio, Linux Kernel Mailing List, Rob Landley,
	Arnd Bergmann, Maxime Ripard, kernel

Hi Linus,

Am Sonntag, den 12.01.2014, 16:44 +0900 schrieb Alexandre Courbot:
> Hi Philipp,
> 
> On Tue, Jan 7, 2014 at 8:34 PM, Philipp Zabel <p.zabel@pengutronix.de> wrote:
> > The documentation was not clear about whether gpio_direction_output should take
> > a logical value or the physical level on the output line, i.e. whether the
> > ACTIVE_LOW status would be taken into account.
> > This converts gpiod_direction_output to use the logical level and adds a new
> > gpiod_direction_output_raw for the raw value.
> 
> Thanks for taking the time to craft this! The patch seems to do
> exactly what we discussed and looks good to me. Maybe Linus can let us
> know what he thinks about it? Unless there are reasons against it, I
> think this should be merged ASAP as we want to gpiod API to converge
> to something stable ASAP.
> 
> Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>

could you have a look at this patch?

thanks
Philipp

> > Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> > ---
> >  Documentation/gpio/consumer.txt |  1 +
> >  drivers/gpio/gpiolib.c          | 67 +++++++++++++++++++++++++++++------------
> >  include/asm-generic/gpio.h      |  2 +-
> >  include/linux/gpio/consumer.h   |  7 +++++
> >  4 files changed, 57 insertions(+), 20 deletions(-)
> >
> > diff --git a/Documentation/gpio/consumer.txt b/Documentation/gpio/consumer.txt
> > index 07c74a3..4dc4809 100644
> > --- a/Documentation/gpio/consumer.txt
> > +++ b/Documentation/gpio/consumer.txt
> > @@ -150,6 +150,7 @@ raw line value:
> >         void gpiod_set_raw_value(struct gpio_desc *desc, int value)
> >         int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
> >         void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)
> > +       int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
> >
> >  The active-low state of a GPIO can also be queried using the following call:
> >
> > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> > index 85f772c..f04f1e6 100644
> > --- a/drivers/gpio/gpiolib.c
> > +++ b/drivers/gpio/gpiolib.c
> > @@ -330,9 +330,9 @@ static ssize_t gpio_direction_store(struct device *dev,
> >         if (!test_bit(FLAG_EXPORT, &desc->flags))
> >                 status = -EIO;
> >         else if (sysfs_streq(buf, "high"))
> > -               status = gpiod_direction_output(desc, 1);
> > +               status = gpiod_direction_output_raw(desc, 1);
> >         else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low"))
> > -               status = gpiod_direction_output(desc, 0);
> > +               status = gpiod_direction_output_raw(desc, 0);
> >         else if (sysfs_streq(buf, "in"))
> >                 status = gpiod_direction_input(desc);
> >         else
> > @@ -1579,7 +1579,7 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
> >         if (flags & GPIOF_DIR_IN)
> >                 err = gpiod_direction_input(desc);
> >         else
> > -               err = gpiod_direction_output(desc,
> > +               err = gpiod_direction_output_raw(desc,
> >                                 (flags & GPIOF_INIT_HIGH) ? 1 : 0);
> >
> >         if (err)
> > @@ -1744,28 +1744,13 @@ fail:
> >  }
> >  EXPORT_SYMBOL_GPL(gpiod_direction_input);
> >
> > -/**
> > - * gpiod_direction_output - set the GPIO direction to input
> > - * @desc:      GPIO to set to output
> > - * @value:     initial output value of the GPIO
> > - *
> > - * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
> > - * be called safely on it. The initial value of the output must be specified.
> > - *
> > - * Return 0 in case of success, else an error code.
> > - */
> > -int gpiod_direction_output(struct gpio_desc *desc, int value)
> > +static int _gpiod_direction_output_raw(struct gpio_desc *desc, int value)
> >  {
> >         unsigned long           flags;
> >         struct gpio_chip        *chip;
> >         int                     status = -EINVAL;
> >         int offset;
> >
> > -       if (!desc || !desc->chip) {
> > -               pr_warn("%s: invalid GPIO\n", __func__);
> > -               return -EINVAL;
> > -       }
> > -
> >         /* GPIOs used for IRQs shall not be set as output */
> >         if (test_bit(FLAG_USED_AS_IRQ, &desc->flags)) {
> >                 gpiod_err(desc,
> > @@ -1827,6 +1812,50 @@ fail:
> >                 gpiod_dbg(desc, "%s: gpio status %d\n", __func__, status);
> >         return status;
> >  }
> > +
> > +/**
> > + * gpiod_direction_output_raw - set the GPIO direction to output
> > + * @desc:      GPIO to set to output
> > + * @value:     initial output value of the GPIO
> > + *
> > + * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
> > + * be called safely on it. The initial value of the output must be specified
> > + * as raw value on the physical line without regard for the ACTIVE_LOW status.
> > + *
> > + * Return 0 in case of success, else an error code.
> > + */
> > +int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
> > +{
> > +       if (!desc || !desc->chip) {
> > +               pr_warn("%s: invalid GPIO\n", __func__);
> > +               return -EINVAL;
> > +       }
> > +       return _gpiod_direction_output_raw(desc, value);
> > +}
> > +EXPORT_SYMBOL_GPL(gpiod_direction_output_raw);
> > +
> > +/**
> > + * gpiod_direction_output - set the GPIO direction to input
> > + * @desc:      GPIO to set to output
> > + * @value:     initial output value of the GPIO
> > + *
> > + * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
> > + * be called safely on it. The initial value of the output must be specified
> > + * as the logical value of the GPIO, i.e. taking its ACTIVE_LOW status into
> > + * account.
> > + *
> > + * Return 0 in case of success, else an error code.
> > + */
> > +int gpiod_direction_output(struct gpio_desc *desc, int value)
> > +{
> > +       if (!desc || !desc->chip) {
> > +               pr_warn("%s: invalid GPIO\n", __func__);
> > +               return -EINVAL;
> > +       }
> > +       if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
> > +               value = !value;
> > +       return _gpiod_direction_output_raw(desc, value);
> > +}
> >  EXPORT_SYMBOL_GPL(gpiod_direction_output);
> >
> >  /**
> > diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
> > index a5f56a0..23e3645 100644
> > --- a/include/asm-generic/gpio.h
> > +++ b/include/asm-generic/gpio.h
> > @@ -69,7 +69,7 @@ static inline int gpio_direction_input(unsigned gpio)
> >  }
> >  static inline int gpio_direction_output(unsigned gpio, int value)
> >  {
> > -       return gpiod_direction_output(gpio_to_desc(gpio), value);
> > +       return gpiod_direction_output_raw(gpio_to_desc(gpio), value);
> >  }
> >
> >  static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
> > diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h
> > index 4d34dbb..3879943 100644
> > --- a/include/linux/gpio/consumer.h
> > +++ b/include/linux/gpio/consumer.h
> > @@ -36,6 +36,7 @@ void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
> >  int gpiod_get_direction(const struct gpio_desc *desc);
> >  int gpiod_direction_input(struct gpio_desc *desc);
> >  int gpiod_direction_output(struct gpio_desc *desc, int value);
> > +int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
> >
> >  /* Value get/set from non-sleeping context */
> >  int gpiod_get_value(const struct gpio_desc *desc);
> > @@ -121,6 +122,12 @@ static inline int gpiod_direction_output(struct gpio_desc *desc, int value)
> >         WARN_ON(1);
> >         return -ENOSYS;
> >  }
> > +static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
> > +{
> > +       /* GPIO can never have been requested */
> > +       WARN_ON(1);
> > +       return -ENOSYS;
> > +}
> >
> >
> >  static inline int gpiod_get_value(const struct gpio_desc *desc)
> > --
> > 1.8.5.2
> >
> 



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC PATCH] gpiolib: make gpiod_direction_output take a logical value, add gpiod_direction_output_raw
  2014-01-07 11:34 [RFC PATCH] gpiolib: make gpiod_direction_output take a logical value, add gpiod_direction_output_raw Philipp Zabel
  2014-01-12  7:44 ` Alexandre Courbot
@ 2014-02-07  8:48 ` Linus Walleij
  1 sibling, 0 replies; 4+ messages in thread
From: Linus Walleij @ 2014-02-07  8:48 UTC (permalink / raw)
  To: Philipp Zabel
  Cc: linux-gpio, linux-kernel, Alexandre Courbot, Rob Landley,
	Arnd Bergmann, Maxime Ripard, Sascha Hauer

On Tue, Jan 7, 2014 at 12:34 PM, Philipp Zabel <p.zabel@pengutronix.de> wrote:

> The documentation was not clear about whether gpio_direction_output should take
> a logical value or the physical level on the output line, i.e. whether the
> ACTIVE_LOW status would be taken into account.
> This converts gpiod_direction_output to use the logical level and adds a new
> gpiod_direction_output_raw for the raw value.
>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>

OK we have consensus on this, patch applied for v3.15 with Alexandre's Review
tag.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-02-07  8:48 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-01-07 11:34 [RFC PATCH] gpiolib: make gpiod_direction_output take a logical value, add gpiod_direction_output_raw Philipp Zabel
2014-01-12  7:44 ` Alexandre Courbot
2014-02-06 15:54   ` Philipp Zabel
2014-02-07  8:48 ` Linus Walleij

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).