diff mbox series

[v2,2/2] gpio: Use new GPIO_LINE_DIRECTION

Message ID 42f40109e2926bca197b30fd9624c609653b23e5.1573029228.git.matti.vaittinen@fi.rohmeurope.com (mailing list archive)
State New, archived
Headers show
Series Add definition for GPIO direction | expand

Commit Message

Vaittinen, Matti Nov. 6, 2019, 8:54 a.m. UTC
It's hard for occasional GPIO code reader/writer to know if values 0/1
equal to IN or OUT. Use defined GPIO_LINE_DIRECTION_IN and
GPIO_LINE_DIRECTION_OUT to help them out.

NOTE - for gpio-amd-fch and gpio-bd9571mwv:
This commit also changes the return value for direction get to equal 1
for direction INPUT. Prior this commit these drivers might have
returned some other positive value but 1 for INPUT.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Acked-by: Scott Branden <scott.branden@broadcom.com>
Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>
Reviewed-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>

---

This patch contains same changes as v1 patches 2-61 did. v1 was splitted
into small patches in order to help reviewing but squashing was
requested by Linus Walleij. I maintained all acks/reviewed-by tags from
v1 series - so acks/review-by tags in this patch mean that specific
portion of changes have been acked/reviewed by tagger. Eg, whole patch
has not been reviewed/acked by persons mentioned. Please let me know if
this is not Ok to you.

 drivers/gpio/gpio-104-dio-48e.c     |  5 ++++-
 drivers/gpio/gpio-104-idi-48.c      |  2 +-
 drivers/gpio/gpio-104-idio-16.c     |  4 ++--
 drivers/gpio/gpio-74xx-mmio.c       |  5 ++++-
 drivers/gpio/gpio-amd-fch.c         |  2 +-
 drivers/gpio/gpio-aspeed.c          |  7 +++----
 drivers/gpio/gpio-bcm-kona.c        |  6 +++---
 drivers/gpio/gpio-bd70528.c         |  8 +++++---
 drivers/gpio/gpio-bd9571mwv.c       |  4 +++-
 drivers/gpio/gpio-dln2.c            |  6 +++---
 drivers/gpio/gpio-exar.c            |  5 ++++-
 drivers/gpio/gpio-f7188x.c          |  5 ++++-
 drivers/gpio/gpio-gpio-mm.c         |  5 ++++-
 drivers/gpio/gpio-htc-egpio.c       |  5 ++++-
 drivers/gpio/gpio-ich.c             |  5 ++++-
 drivers/gpio/gpio-kempld.c          |  5 ++++-
 drivers/gpio/gpio-lp873x.c          |  2 +-
 drivers/gpio/gpio-lp87565.c         |  5 ++++-
 drivers/gpio/gpio-madera.c          |  5 ++++-
 drivers/gpio/gpio-max3191x.c        |  2 +-
 drivers/gpio/gpio-merrifield.c      |  5 ++++-
 drivers/gpio/gpio-mmio.c            | 21 +++++++++++++++------
 drivers/gpio/gpio-mockup.c          | 11 +++--------
 drivers/gpio/gpio-moxtet.c          |  4 ++--
 drivers/gpio/gpio-mvebu.c           |  5 ++++-
 drivers/gpio/gpio-mxs.c             |  5 ++++-
 drivers/gpio/gpio-omap.c            |  6 ++++--
 drivers/gpio/gpio-pca953x.c         |  5 ++++-
 drivers/gpio/gpio-pci-idio-16.c     |  4 ++--
 drivers/gpio/gpio-pcie-idio-24.c    |  9 ++++++---
 drivers/gpio/gpio-pisosr.c          |  2 +-
 drivers/gpio/gpio-pl061.c           |  5 ++++-
 drivers/gpio/gpio-raspberrypi-exp.c |  5 ++++-
 drivers/gpio/gpio-rcar.c            |  5 ++++-
 drivers/gpio/gpio-reg.c             |  3 ++-
 drivers/gpio/gpio-sa1100.c          |  5 ++++-
 drivers/gpio/gpio-sama5d2-piobu.c   |  7 ++++---
 drivers/gpio/gpio-sch.c             |  5 ++++-
 drivers/gpio/gpio-sch311x.c         |  5 ++++-
 drivers/gpio/gpio-siox.c            |  4 ++--
 drivers/gpio/gpio-stmpe.c           |  5 ++++-
 drivers/gpio/gpio-tc3589x.c         |  5 ++++-
 drivers/gpio/gpio-tegra.c           |  5 ++++-
 drivers/gpio/gpio-tegra186.c        |  4 ++--
 drivers/gpio/gpio-thunderx.c        |  5 ++++-
 drivers/gpio/gpio-tpic2810.c        |  2 +-
 drivers/gpio/gpio-tps65086.c        |  2 +-
 drivers/gpio/gpio-tps65912.c        |  4 ++--
 drivers/gpio/gpio-tps68470.c        |  6 +++---
 drivers/gpio/gpio-tqmx86.c          |  5 ++++-
 drivers/gpio/gpio-ts4900.c          |  5 ++++-
 drivers/gpio/gpio-twl4030.c         | 10 +++++-----
 drivers/gpio/gpio-twl6040.c         |  3 +--
 drivers/gpio/gpio-uniphier.c        |  5 ++++-
 drivers/gpio/gpio-wcove.c           |  7 +++++--
 drivers/gpio/gpio-ws16c48.c         |  5 ++++-
 drivers/gpio/gpio-xgene.c           |  5 ++++-
 drivers/gpio/gpio-xra1403.c         |  5 ++++-
 drivers/gpio/gpio-xtensa.c          |  4 ++--
 drivers/gpio/gpio-zynq.c            |  7 +++++--
 60 files changed, 211 insertions(+), 102 deletions(-)

Comments

Andy Shevchenko Nov. 6, 2019, 2:22 p.m. UTC | #1
On Wed, Nov 06, 2019 at 10:54:12AM +0200, Matti Vaittinen wrote:
> It's hard for occasional GPIO code reader/writer to know if values 0/1
> equal to IN or OUT. Use defined GPIO_LINE_DIRECTION_IN and
> GPIO_LINE_DIRECTION_OUT to help them out.
> 
> NOTE - for gpio-amd-fch and gpio-bd9571mwv:
> This commit also changes the return value for direction get to equal 1
> for direction INPUT. Prior this commit these drivers might have
> returned some other positive value but 1 for INPUT.

>  drivers/gpio/gpio-ich.c             |  5 ++++-

>  drivers/gpio/gpio-merrifield.c      |  5 ++++-

>  drivers/gpio/gpio-pca953x.c         |  5 ++++-

>  drivers/gpio/gpio-sch.c             |  5 ++++-

>  drivers/gpio/gpio-wcove.c           |  7 +++++--

Since maintainers seems in favour of this and bloat-o-meter shows no difference
on selected module,

Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

for the stuff I'm involved in.

Thanks!

> diff --git a/drivers/gpio/gpio-ich.c b/drivers/gpio/gpio-ich.c
> index 90bf7742f9b0..2f086d0aa1f4 100644
> --- a/drivers/gpio/gpio-ich.c
> +++ b/drivers/gpio/gpio-ich.c
> @@ -159,7 +159,10 @@ static bool ichx_gpio_check_available(struct gpio_chip *gpio, unsigned nr)
>  
>  static int ichx_gpio_get_direction(struct gpio_chip *gpio, unsigned nr)
>  {
> -	return ichx_read_bit(GPIO_IO_SEL, nr);
> +	if (ichx_read_bit(GPIO_IO_SEL, nr))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int ichx_gpio_direction_input(struct gpio_chip *gpio, unsigned nr)

> diff --git a/drivers/gpio/gpio-merrifield.c b/drivers/gpio/gpio-merrifield.c
> index 2f1e9da81c1e..d4fa6e9560f3 100644
> --- a/drivers/gpio/gpio-merrifield.c
> +++ b/drivers/gpio/gpio-merrifield.c
> @@ -162,7 +162,10 @@ static int mrfld_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
>  {
>  	void __iomem *gpdr = gpio_reg(chip, offset, GPDR);
>  
> -	return !(readl(gpdr) & BIT(offset % 32));
> +	if (readl(gpdr) & BIT(offset % 32))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int mrfld_gpio_set_debounce(struct gpio_chip *chip, unsigned int offset,

> diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
> index de5d1383f28d..82122c3c688a 100644
> --- a/drivers/gpio/gpio-pca953x.c
> +++ b/drivers/gpio/gpio-pca953x.c
> @@ -449,7 +449,10 @@ static int pca953x_gpio_get_direction(struct gpio_chip *gc, unsigned off)
>  	if (ret < 0)
>  		return ret;
>  
> -	return !!(reg_val & bit);
> +	if (reg_val & bit)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static void pca953x_gpio_set_multiple(struct gpio_chip *gc,

> diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c
> index fb143f28c386..c65f35b68202 100644
> --- a/drivers/gpio/gpio-sch.c
> +++ b/drivers/gpio/gpio-sch.c
> @@ -127,7 +127,10 @@ static int sch_gpio_get_direction(struct gpio_chip *gc, unsigned gpio_num)
>  {
>  	struct sch_gpio *sch = gpiochip_get_data(gc);
>  
> -	return sch_gpio_reg_get(sch, gpio_num, GIO);
> +	if (sch_gpio_reg_get(sch, gpio_num, GIO))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static const struct gpio_chip sch_gpio_chip = {

> diff --git a/drivers/gpio/gpio-wcove.c b/drivers/gpio/gpio-wcove.c
> index 444fe9e7f04a..8b481b3c1ebe 100644
> --- a/drivers/gpio/gpio-wcove.c
> +++ b/drivers/gpio/gpio-wcove.c
> @@ -170,13 +170,16 @@ static int wcove_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio)
>  	int ret, reg = to_reg(gpio, CTRL_OUT);
>  
>  	if (reg < 0)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>  
>  	ret = regmap_read(wg->regmap, reg, &val);
>  	if (ret)
>  		return ret;
>  
> -	return !(val & CTLO_DIR_OUT);
> +	if (val & CTLO_DIR_OUT)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int wcove_gpio_get(struct gpio_chip *chip, unsigned int gpio)
William Breathitt Gray Nov. 6, 2019, 2:43 p.m. UTC | #2
On Wed, Nov 06, 2019 at 10:54:12AM +0200, Matti Vaittinen wrote:
> It's hard for occasional GPIO code reader/writer to know if values 0/1
> equal to IN or OUT. Use defined GPIO_LINE_DIRECTION_IN and
> GPIO_LINE_DIRECTION_OUT to help them out.
> 
> NOTE - for gpio-amd-fch and gpio-bd9571mwv:
> This commit also changes the return value for direction get to equal 1
> for direction INPUT. Prior this commit these drivers might have
> returned some other positive value but 1 for INPUT.
> 
> Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
> Acked-by: Scott Branden <scott.branden@broadcom.com>
> Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>
> Reviewed-by: Michal Simek <michal.simek@xilinx.com>
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>

Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com>

> 
> ---
> 
> This patch contains same changes as v1 patches 2-61 did. v1 was splitted
> into small patches in order to help reviewing but squashing was
> requested by Linus Walleij. I maintained all acks/reviewed-by tags from
> v1 series - so acks/review-by tags in this patch mean that specific
> portion of changes have been acked/reviewed by tagger. Eg, whole patch
> has not been reviewed/acked by persons mentioned. Please let me know if
> this is not Ok to you.
> 
>  drivers/gpio/gpio-104-dio-48e.c     |  5 ++++-
>  drivers/gpio/gpio-104-idi-48.c      |  2 +-
>  drivers/gpio/gpio-104-idio-16.c     |  4 ++--
>  drivers/gpio/gpio-74xx-mmio.c       |  5 ++++-
>  drivers/gpio/gpio-amd-fch.c         |  2 +-
>  drivers/gpio/gpio-aspeed.c          |  7 +++----
>  drivers/gpio/gpio-bcm-kona.c        |  6 +++---
>  drivers/gpio/gpio-bd70528.c         |  8 +++++---
>  drivers/gpio/gpio-bd9571mwv.c       |  4 +++-
>  drivers/gpio/gpio-dln2.c            |  6 +++---
>  drivers/gpio/gpio-exar.c            |  5 ++++-
>  drivers/gpio/gpio-f7188x.c          |  5 ++++-
>  drivers/gpio/gpio-gpio-mm.c         |  5 ++++-
>  drivers/gpio/gpio-htc-egpio.c       |  5 ++++-
>  drivers/gpio/gpio-ich.c             |  5 ++++-
>  drivers/gpio/gpio-kempld.c          |  5 ++++-
>  drivers/gpio/gpio-lp873x.c          |  2 +-
>  drivers/gpio/gpio-lp87565.c         |  5 ++++-
>  drivers/gpio/gpio-madera.c          |  5 ++++-
>  drivers/gpio/gpio-max3191x.c        |  2 +-
>  drivers/gpio/gpio-merrifield.c      |  5 ++++-
>  drivers/gpio/gpio-mmio.c            | 21 +++++++++++++++------
>  drivers/gpio/gpio-mockup.c          | 11 +++--------
>  drivers/gpio/gpio-moxtet.c          |  4 ++--
>  drivers/gpio/gpio-mvebu.c           |  5 ++++-
>  drivers/gpio/gpio-mxs.c             |  5 ++++-
>  drivers/gpio/gpio-omap.c            |  6 ++++--
>  drivers/gpio/gpio-pca953x.c         |  5 ++++-
>  drivers/gpio/gpio-pci-idio-16.c     |  4 ++--
>  drivers/gpio/gpio-pcie-idio-24.c    |  9 ++++++---
>  drivers/gpio/gpio-pisosr.c          |  2 +-
>  drivers/gpio/gpio-pl061.c           |  5 ++++-
>  drivers/gpio/gpio-raspberrypi-exp.c |  5 ++++-
>  drivers/gpio/gpio-rcar.c            |  5 ++++-
>  drivers/gpio/gpio-reg.c             |  3 ++-
>  drivers/gpio/gpio-sa1100.c          |  5 ++++-
>  drivers/gpio/gpio-sama5d2-piobu.c   |  7 ++++---
>  drivers/gpio/gpio-sch.c             |  5 ++++-
>  drivers/gpio/gpio-sch311x.c         |  5 ++++-
>  drivers/gpio/gpio-siox.c            |  4 ++--
>  drivers/gpio/gpio-stmpe.c           |  5 ++++-
>  drivers/gpio/gpio-tc3589x.c         |  5 ++++-
>  drivers/gpio/gpio-tegra.c           |  5 ++++-
>  drivers/gpio/gpio-tegra186.c        |  4 ++--
>  drivers/gpio/gpio-thunderx.c        |  5 ++++-
>  drivers/gpio/gpio-tpic2810.c        |  2 +-
>  drivers/gpio/gpio-tps65086.c        |  2 +-
>  drivers/gpio/gpio-tps65912.c        |  4 ++--
>  drivers/gpio/gpio-tps68470.c        |  6 +++---
>  drivers/gpio/gpio-tqmx86.c          |  5 ++++-
>  drivers/gpio/gpio-ts4900.c          |  5 ++++-
>  drivers/gpio/gpio-twl4030.c         | 10 +++++-----
>  drivers/gpio/gpio-twl6040.c         |  3 +--
>  drivers/gpio/gpio-uniphier.c        |  5 ++++-
>  drivers/gpio/gpio-wcove.c           |  7 +++++--
>  drivers/gpio/gpio-ws16c48.c         |  5 ++++-
>  drivers/gpio/gpio-xgene.c           |  5 ++++-
>  drivers/gpio/gpio-xra1403.c         |  5 ++++-
>  drivers/gpio/gpio-xtensa.c          |  4 ++--
>  drivers/gpio/gpio-zynq.c            |  7 +++++--
>  60 files changed, 211 insertions(+), 102 deletions(-)
> 
> diff --git a/drivers/gpio/gpio-104-dio-48e.c b/drivers/gpio/gpio-104-dio-48e.c
> index a44fa8af5b0d..400c09b905f8 100644
> --- a/drivers/gpio/gpio-104-dio-48e.c
> +++ b/drivers/gpio/gpio-104-dio-48e.c
> @@ -59,7 +59,10 @@ static int dio48e_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  	const unsigned port = offset / 8;
>  	const unsigned mask = BIT(offset % 8);
>  
> -	return !!(dio48egpio->io_state[port] & mask);
> +	if (dio48egpio->io_state[port] & mask)
> +		return  GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int dio48e_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-104-idi-48.c b/drivers/gpio/gpio-104-idi-48.c
> index 79dead61e776..c50329ab493a 100644
> --- a/drivers/gpio/gpio-104-idi-48.c
> +++ b/drivers/gpio/gpio-104-idi-48.c
> @@ -53,7 +53,7 @@ struct idi_48_gpio {
>  
>  static int idi_48_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  {
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int idi_48_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-104-idio-16.c b/drivers/gpio/gpio-104-idio-16.c
> index 8d2f51cd9d91..5752d9dab148 100644
> --- a/drivers/gpio/gpio-104-idio-16.c
> +++ b/drivers/gpio/gpio-104-idio-16.c
> @@ -51,9 +51,9 @@ struct idio_16_gpio {
>  static int idio_16_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  {
>  	if (offset > 15)
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>  
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int idio_16_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-74xx-mmio.c b/drivers/gpio/gpio-74xx-mmio.c
> index 83a2286d93f6..173e06758e6c 100644
> --- a/drivers/gpio/gpio-74xx-mmio.c
> +++ b/drivers/gpio/gpio-74xx-mmio.c
> @@ -77,7 +77,10 @@ static int mmio_74xx_get_direction(struct gpio_chip *gc, unsigned offset)
>  {
>  	struct mmio_74xx_gpio_priv *priv = gpiochip_get_data(gc);
>  
> -	return !(priv->flags & MMIO_74XX_DIR_OUT);
> +	if (priv->flags & MMIO_74XX_DIR_OUT)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return  GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int mmio_74xx_dir_in(struct gpio_chip *gc, unsigned int gpio)
> diff --git a/drivers/gpio/gpio-amd-fch.c b/drivers/gpio/gpio-amd-fch.c
> index 181df1581df5..4e44ba4d7423 100644
> --- a/drivers/gpio/gpio-amd-fch.c
> +++ b/drivers/gpio/gpio-amd-fch.c
> @@ -92,7 +92,7 @@ static int amd_fch_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
>  	ret = (readl_relaxed(ptr) & AMD_FCH_GPIO_FLAG_DIRECTION);
>  	spin_unlock_irqrestore(&priv->lock, flags);
>  
> -	return ret;
> +	return ret ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static void amd_fch_gpio_set(struct gpio_chip *gc,
> diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c
> index 09e53c5f3b0a..f1037b61f763 100644
> --- a/drivers/gpio/gpio-aspeed.c
> +++ b/drivers/gpio/gpio-aspeed.c
> @@ -487,10 +487,10 @@ static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>  	u32 val;
>  
>  	if (!have_input(gpio, offset))
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>  
>  	if (!have_output(gpio, offset))
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>  
>  	spin_lock_irqsave(&gpio->lock, flags);
>  
> @@ -498,8 +498,7 @@ static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>  
>  	spin_unlock_irqrestore(&gpio->lock, flags);
>  
> -	return !val;
> -
> +	return val ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static inline int irqd_to_aspeed_gpio_data(struct irq_data *d,
> diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c
> index 9fa6d3a967d2..4122683eb1f9 100644
> --- a/drivers/gpio/gpio-bcm-kona.c
> +++ b/drivers/gpio/gpio-bcm-kona.c
> @@ -127,7 +127,7 @@ static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio)
>  	u32 val;
>  
>  	val = readl(reg_base + GPIO_CONTROL(gpio)) & GPIO_GPCTR0_IOTR_MASK;
> -	return !!val;
> +	return val ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
> @@ -144,7 +144,7 @@ static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
>  	raw_spin_lock_irqsave(&kona_gpio->lock, flags);
>  
>  	/* this function only applies to output pin */
> -	if (bcm_kona_gpio_get_dir(chip, gpio) == 1)
> +	if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN)
>  		goto out;
>  
>  	reg_offset = value ? GPIO_OUT_SET(bank_id) : GPIO_OUT_CLEAR(bank_id);
> @@ -170,7 +170,7 @@ static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio)
>  	reg_base = kona_gpio->reg_base;
>  	raw_spin_lock_irqsave(&kona_gpio->lock, flags);
>  
> -	if (bcm_kona_gpio_get_dir(chip, gpio) == 1)
> +	if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN)
>  		reg_offset = GPIO_IN_STATUS(bank_id);
>  	else
>  		reg_offset = GPIO_OUT_STATUS(bank_id);
> diff --git a/drivers/gpio/gpio-bd70528.c b/drivers/gpio/gpio-bd70528.c
> index 0c1ead12d883..734be6b752d0 100644
> --- a/drivers/gpio/gpio-bd70528.c
> +++ b/drivers/gpio/gpio-bd70528.c
> @@ -54,8 +54,10 @@ static int bd70528_get_direction(struct gpio_chip *chip, unsigned int offset)
>  		dev_err(bdgpio->chip.dev, "Could not read gpio direction\n");
>  		return ret;
>  	}
> +	if (val & BD70528_GPIO_OUT_EN_MASK)
> +		return GPIO_LINE_DIRECTION_OUT;
>  
> -	return !(val & BD70528_GPIO_OUT_EN_MASK);
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int bd70528_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
> @@ -166,9 +168,9 @@ static int bd70528_gpio_get(struct gpio_chip *chip, unsigned int offset)
>  	 * locking would make no sense.
>  	 */
>  	ret = bd70528_get_direction(chip, offset);
> -	if (ret == 0)
> +	if (ret == GPIO_LINE_DIRECTION_OUT)
>  		ret = bd70528_gpio_get_o(bdgpio, offset);
> -	else if (ret == 1)
> +	else if (ret == GPIO_LINE_DIRECTION_IN)
>  		ret = bd70528_gpio_get_i(bdgpio, offset);
>  	else
>  		dev_err(bdgpio->chip.dev, "failed to read GPIO direction\n");
> diff --git a/drivers/gpio/gpio-bd9571mwv.c b/drivers/gpio/gpio-bd9571mwv.c
> index 5224a946e8ab..c0abc9c6851b 100644
> --- a/drivers/gpio/gpio-bd9571mwv.c
> +++ b/drivers/gpio/gpio-bd9571mwv.c
> @@ -37,8 +37,10 @@ static int bd9571mwv_gpio_get_direction(struct gpio_chip *chip,
>  	ret = regmap_read(gpio->bd->regmap, BD9571MWV_GPIO_DIR, &val);
>  	if (ret < 0)
>  		return ret;
> +	if (val & BIT(offset))
> +		return GPIO_LINE_DIRECTION_IN;
>  
> -	return val & BIT(offset);
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int bd9571mwv_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-dln2.c b/drivers/gpio/gpio-dln2.c
> index 8a33c2fc174d..26b40c8b8a12 100644
> --- a/drivers/gpio/gpio-dln2.c
> +++ b/drivers/gpio/gpio-dln2.c
> @@ -200,9 +200,9 @@ static int dln2_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  	struct dln2_gpio *dln2 = gpiochip_get_data(chip);
>  
>  	if (test_bit(offset, dln2->output_enabled))
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>  
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int dln2_gpio_get(struct gpio_chip *chip, unsigned int offset)
> @@ -214,7 +214,7 @@ static int dln2_gpio_get(struct gpio_chip *chip, unsigned int offset)
>  	if (dir < 0)
>  		return dir;
>  
> -	if (dir == 1)
> +	if (dir == GPIO_LINE_DIRECTION_IN)
>  		return dln2_gpio_pin_get_in_val(dln2, offset);
>  
>  	return dln2_gpio_pin_get_out_val(dln2, offset);
> diff --git a/drivers/gpio/gpio-exar.c b/drivers/gpio/gpio-exar.c
> index fae327d5b06e..da1ef0b1c291 100644
> --- a/drivers/gpio/gpio-exar.c
> +++ b/drivers/gpio/gpio-exar.c
> @@ -77,7 +77,10 @@ static int exar_get_direction(struct gpio_chip *chip, unsigned int offset)
>  		EXAR_OFFSET_MPIOSEL_HI : EXAR_OFFSET_MPIOSEL_LO;
>  	unsigned int bit  = (offset + exar_gpio->first_pin) % 8;
>  
> -	return !!(exar_get(chip, addr) & BIT(bit));
> +	if (exar_get(chip, addr) & BIT(bit))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int exar_get_value(struct gpio_chip *chip, unsigned int offset)
> diff --git a/drivers/gpio/gpio-f7188x.c b/drivers/gpio/gpio-f7188x.c
> index fdc639f856f1..cadd02993539 100644
> --- a/drivers/gpio/gpio-f7188x.c
> +++ b/drivers/gpio/gpio-f7188x.c
> @@ -250,7 +250,10 @@ static int f7188x_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  
>  	superio_exit(sio->addr);
>  
> -	return !(dir & 1 << offset);
> +	if (dir & 1 << offset)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int f7188x_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-gpio-mm.c b/drivers/gpio/gpio-gpio-mm.c
> index 78a1db24e931..c22d6f94129c 100644
> --- a/drivers/gpio/gpio-gpio-mm.c
> +++ b/drivers/gpio/gpio-gpio-mm.c
> @@ -52,7 +52,10 @@ static int gpiomm_gpio_get_direction(struct gpio_chip *chip,
>  	const unsigned int port = offset / 8;
>  	const unsigned int mask = BIT(offset % 8);
>  
> -	return !!(gpiommgpio->io_state[port] & mask);
> +	if (gpiommgpio->io_state[port] & mask)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int gpiomm_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-htc-egpio.c b/drivers/gpio/gpio-htc-egpio.c
> index 8aa23d70b1e6..a40bd56673fe 100644
> --- a/drivers/gpio/gpio-htc-egpio.c
> +++ b/drivers/gpio/gpio-htc-egpio.c
> @@ -220,7 +220,10 @@ static int egpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  
>  	egpio = gpiochip_get_data(chip);
>  
> -	return !test_bit(offset, &egpio->is_out);
> +	if (test_bit(offset, &egpio->is_out))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static void egpio_write_cache(struct egpio_info *ei)
> diff --git a/drivers/gpio/gpio-ich.c b/drivers/gpio/gpio-ich.c
> index 90bf7742f9b0..2f086d0aa1f4 100644
> --- a/drivers/gpio/gpio-ich.c
> +++ b/drivers/gpio/gpio-ich.c
> @@ -159,7 +159,10 @@ static bool ichx_gpio_check_available(struct gpio_chip *gpio, unsigned nr)
>  
>  static int ichx_gpio_get_direction(struct gpio_chip *gpio, unsigned nr)
>  {
> -	return ichx_read_bit(GPIO_IO_SEL, nr);
> +	if (ichx_read_bit(GPIO_IO_SEL, nr))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int ichx_gpio_direction_input(struct gpio_chip *gpio, unsigned nr)
> diff --git a/drivers/gpio/gpio-kempld.c b/drivers/gpio/gpio-kempld.c
> index ef51638f3f75..4ea15f08e0f4 100644
> --- a/drivers/gpio/gpio-kempld.c
> +++ b/drivers/gpio/gpio-kempld.c
> @@ -104,7 +104,10 @@ static int kempld_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  	struct kempld_gpio_data *gpio = gpiochip_get_data(chip);
>  	struct kempld_device_data *pld = gpio->pld;
>  
> -	return !kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset);
> +	if (kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int kempld_gpio_pincount(struct kempld_device_data *pld)
> diff --git a/drivers/gpio/gpio-lp873x.c b/drivers/gpio/gpio-lp873x.c
> index 801995dd9b26..70fad87ff2db 100644
> --- a/drivers/gpio/gpio-lp873x.c
> +++ b/drivers/gpio/gpio-lp873x.c
> @@ -33,7 +33,7 @@ static int lp873x_gpio_get_direction(struct gpio_chip *chip,
>  				     unsigned int offset)
>  {
>  	/* This device is output only */
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int lp873x_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-lp87565.c b/drivers/gpio/gpio-lp87565.c
> index a121c8f10610..e1244520cf7d 100644
> --- a/drivers/gpio/gpio-lp87565.c
> +++ b/drivers/gpio/gpio-lp87565.c
> @@ -57,7 +57,10 @@ static int lp87565_gpio_get_direction(struct gpio_chip *chip,
>  	if (ret < 0)
>  		return ret;
>  
> -	return !(val & BIT(offset));
> +	if (val & BIT(offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int lp87565_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-madera.c b/drivers/gpio/gpio-madera.c
> index 7086f8b5388f..8f38303fcbc4 100644
> --- a/drivers/gpio/gpio-madera.c
> +++ b/drivers/gpio/gpio-madera.c
> @@ -34,7 +34,10 @@ static int madera_gpio_get_direction(struct gpio_chip *chip,
>  	if (ret < 0)
>  		return ret;
>  
> -	return !!(val & MADERA_GP1_DIR_MASK);
> +	if (val & MADERA_GP1_DIR_MASK)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int madera_gpio_direction_in(struct gpio_chip *chip, unsigned int offset)
> diff --git a/drivers/gpio/gpio-max3191x.c b/drivers/gpio/gpio-max3191x.c
> index 4b4b2ceb82fc..0696d5a21431 100644
> --- a/drivers/gpio/gpio-max3191x.c
> +++ b/drivers/gpio/gpio-max3191x.c
> @@ -94,7 +94,7 @@ DECLARE_CRC8_TABLE(max3191x_crc8);
>  
>  static int max3191x_get_direction(struct gpio_chip *gpio, unsigned int offset)
>  {
> -	return 1; /* always in */
> +	return GPIO_LINE_DIRECTION_IN; /* always in */
>  }
>  
>  static int max3191x_direction_input(struct gpio_chip *gpio, unsigned int offset)
> diff --git a/drivers/gpio/gpio-merrifield.c b/drivers/gpio/gpio-merrifield.c
> index 2f1e9da81c1e..d4fa6e9560f3 100644
> --- a/drivers/gpio/gpio-merrifield.c
> +++ b/drivers/gpio/gpio-merrifield.c
> @@ -162,7 +162,10 @@ static int mrfld_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
>  {
>  	void __iomem *gpdr = gpio_reg(chip, offset, GPDR);
>  
> -	return !(readl(gpdr) & BIT(offset % 32));
> +	if (readl(gpdr) & BIT(offset % 32))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int mrfld_gpio_set_debounce(struct gpio_chip *chip, unsigned int offset,
> diff --git a/drivers/gpio/gpio-mmio.c b/drivers/gpio/gpio-mmio.c
> index 6f904c874678..cd07c948649f 100644
> --- a/drivers/gpio/gpio-mmio.c
> +++ b/drivers/gpio/gpio-mmio.c
> @@ -370,15 +370,24 @@ static int bgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
>  static int bgpio_get_dir(struct gpio_chip *gc, unsigned int gpio)
>  {
>  	/* Return 0 if output, 1 if input */
> -	if (gc->bgpio_dir_unreadable)
> -		return !(gc->bgpio_dir & bgpio_line2mask(gc, gpio));
> -	if (gc->reg_dir_out)
> -		return !(gc->read_reg(gc->reg_dir_out) & bgpio_line2mask(gc, gpio));
> +	if (gc->bgpio_dir_unreadable) {
> +		if (gc->bgpio_dir & bgpio_line2mask(gc, gpio))
> +			return GPIO_LINE_DIRECTION_OUT;
> +		return GPIO_LINE_DIRECTION_IN;
> +	}
> +
> +	if (gc->reg_dir_out) {
> +		if (gc->read_reg(gc->reg_dir_out) & bgpio_line2mask(gc, gpio))
> +			return GPIO_LINE_DIRECTION_OUT;
> +		return GPIO_LINE_DIRECTION_IN;
> +	}
> +
>  	if (gc->reg_dir_in)
> -		return !!(gc->read_reg(gc->reg_dir_in) & bgpio_line2mask(gc, gpio));
> +		if (!(gc->read_reg(gc->reg_dir_in) & bgpio_line2mask(gc, gpio)))
> +			return GPIO_LINE_DIRECTION_OUT;
>  
>  	/* This should not happen */
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int bgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
> diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c
> index 213aedc97dc2..47c172b2f5ad 100644
> --- a/drivers/gpio/gpio-mockup.c
> +++ b/drivers/gpio/gpio-mockup.c
> @@ -34,14 +34,9 @@
>  
>  #define gpio_mockup_err(...)	pr_err(GPIO_MOCKUP_NAME ": " __VA_ARGS__)
>  
> -enum {
> -	GPIO_MOCKUP_DIR_IN = 0,
> -	GPIO_MOCKUP_DIR_OUT = 1,
> -};
> -
>  /*
>   * struct gpio_pin_status - structure describing a GPIO status
> - * @dir:       Configures direction of gpio as "in" or "out", 0=in, 1=out
> + * @dir:       Configures direction of gpio as "in" or "out"
>   * @value:     Configures status of the gpio as 0(low) or 1(high)
>   */
>  struct gpio_mockup_line_status {
> @@ -152,7 +147,7 @@ static int gpio_mockup_dirout(struct gpio_chip *gc,
>  	struct gpio_mockup_chip *chip = gpiochip_get_data(gc);
>  
>  	mutex_lock(&chip->lock);
> -	chip->lines[offset].dir = GPIO_MOCKUP_DIR_OUT;
> +	chip->lines[offset].dir = GPIO_LINE_DIRECTION_OUT;
>  	__gpio_mockup_set(chip, offset, value);
>  	mutex_unlock(&chip->lock);
>  
> @@ -164,7 +159,7 @@ static int gpio_mockup_dirin(struct gpio_chip *gc, unsigned int offset)
>  	struct gpio_mockup_chip *chip = gpiochip_get_data(gc);
>  
>  	mutex_lock(&chip->lock);
> -	chip->lines[offset].dir = GPIO_MOCKUP_DIR_IN;
> +	chip->lines[offset].dir = GPIO_LINE_DIRECTION_IN;
>  	mutex_unlock(&chip->lock);
>  
>  	return 0;
> diff --git a/drivers/gpio/gpio-moxtet.c b/drivers/gpio/gpio-moxtet.c
> index 3fd729994a38..8299909318f4 100644
> --- a/drivers/gpio/gpio-moxtet.c
> +++ b/drivers/gpio/gpio-moxtet.c
> @@ -78,9 +78,9 @@ static int moxtet_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>  
>  	/* All lines are hard wired to be either input or output, not both. */
>  	if (chip->desc->in_mask & BIT(offset))
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>  	else if (chip->desc->out_mask & BIT(offset))
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>  	else
>  		return -EINVAL;
>  }
> diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
> index 6c0687694341..9b2adf0ef880 100644
> --- a/drivers/gpio/gpio-mvebu.c
> +++ b/drivers/gpio/gpio-mvebu.c
> @@ -384,7 +384,10 @@ static int mvebu_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
>  
>  	regmap_read(mvchip->regs, GPIO_IO_CONF_OFF + mvchip->offset, &u);
>  
> -	return !!(u & BIT(pin));
> +	if (u & BIT(pin))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int mvebu_gpio_to_irq(struct gpio_chip *chip, unsigned int pin)
> diff --git a/drivers/gpio/gpio-mxs.c b/drivers/gpio/gpio-mxs.c
> index 5e5437a2c607..c4a314c68555 100644
> --- a/drivers/gpio/gpio-mxs.c
> +++ b/drivers/gpio/gpio-mxs.c
> @@ -248,7 +248,10 @@ static int mxs_gpio_get_direction(struct gpio_chip *gc, unsigned offset)
>  	u32 dir;
>  
>  	dir = readl(port->base + PINCTRL_DOE(port));
> -	return !(dir & mask);
> +	if (dir & mask)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static const struct platform_device_id mxs_gpio_ids[] = {
> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> index d0f27084a942..3bd8adaeed9e 100644
> --- a/drivers/gpio/gpio-omap.c
> +++ b/drivers/gpio/gpio-omap.c
> @@ -805,8 +805,10 @@ static int omap_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct gpio_bank *bank = gpiochip_get_data(chip);
>  
> -	return !!(readl_relaxed(bank->base + bank->regs->direction) &
> -		  BIT(offset));
> +	if (readl_relaxed(bank->base + bank->regs->direction) & BIT(offset))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int omap_gpio_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
> index de5d1383f28d..82122c3c688a 100644
> --- a/drivers/gpio/gpio-pca953x.c
> +++ b/drivers/gpio/gpio-pca953x.c
> @@ -449,7 +449,10 @@ static int pca953x_gpio_get_direction(struct gpio_chip *gc, unsigned off)
>  	if (ret < 0)
>  		return ret;
>  
> -	return !!(reg_val & bit);
> +	if (reg_val & bit)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
> diff --git a/drivers/gpio/gpio-pci-idio-16.c b/drivers/gpio/gpio-pci-idio-16.c
> index 5aa136a6a3e0..df51dd08bdfe 100644
> --- a/drivers/gpio/gpio-pci-idio-16.c
> +++ b/drivers/gpio/gpio-pci-idio-16.c
> @@ -61,9 +61,9 @@ static int idio_16_gpio_get_direction(struct gpio_chip *chip,
>  	unsigned int offset)
>  {
>  	if (offset > 15)
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>  
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int idio_16_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-pcie-idio-24.c b/drivers/gpio/gpio-pcie-idio-24.c
> index 52f1647a46fd..44c1e4fc489f 100644
> --- a/drivers/gpio/gpio-pcie-idio-24.c
> +++ b/drivers/gpio/gpio-pcie-idio-24.c
> @@ -104,15 +104,18 @@ static int idio_24_gpio_get_direction(struct gpio_chip *chip,
>  
>  	/* FET Outputs */
>  	if (offset < 24)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>  
>  	/* Isolated Inputs */
>  	if (offset < 48)
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>  
>  	/* TTL/CMOS I/O */
>  	/* OUT MODE = 1 when TTL/CMOS Output Mode is set */
> -	return !(ioread8(&idio24gpio->reg->ctl) & out_mode_mask);
> +	if (ioread8(&idio24gpio->reg->ctl) & out_mode_mask)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int idio_24_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-pisosr.c b/drivers/gpio/gpio-pisosr.c
> index f809a5a8e9eb..1331b2a94679 100644
> --- a/drivers/gpio/gpio-pisosr.c
> +++ b/drivers/gpio/gpio-pisosr.c
> @@ -65,7 +65,7 @@ static int pisosr_gpio_get_direction(struct gpio_chip *chip,
>  				     unsigned offset)
>  {
>  	/* This device always input */
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int pisosr_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c
> index 722ce5cf861e..5df7782e348f 100644
> --- a/drivers/gpio/gpio-pl061.c
> +++ b/drivers/gpio/gpio-pl061.c
> @@ -63,7 +63,10 @@ static int pl061_get_direction(struct gpio_chip *gc, unsigned offset)
>  {
>  	struct pl061 *pl061 = gpiochip_get_data(gc);
>  
> -	return !(readb(pl061->base + GPIODIR) & BIT(offset));
> +	if (readb(pl061->base + GPIODIR) & BIT(offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int pl061_direction_input(struct gpio_chip *gc, unsigned offset)
> diff --git a/drivers/gpio/gpio-raspberrypi-exp.c b/drivers/gpio/gpio-raspberrypi-exp.c
> index b77ea16ffa03..bb100e0124e6 100644
> --- a/drivers/gpio/gpio-raspberrypi-exp.c
> +++ b/drivers/gpio/gpio-raspberrypi-exp.c
> @@ -147,7 +147,10 @@ static int rpi_exp_gpio_get_direction(struct gpio_chip *gc, unsigned int off)
>  			get.gpio);
>  		return ret ? ret : -EIO;
>  	}
> -	return !get.direction;
> +	if (get.direction)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int rpi_exp_gpio_get(struct gpio_chip *gc, unsigned int off)
> diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c
> index 187984d26f47..d7e6e68c25af 100644
> --- a/drivers/gpio/gpio-rcar.c
> +++ b/drivers/gpio/gpio-rcar.c
> @@ -279,7 +279,10 @@ static int gpio_rcar_get_direction(struct gpio_chip *chip, unsigned int offset)
>  {
>  	struct gpio_rcar_priv *p = gpiochip_get_data(chip);
>  
> -	return !(gpio_rcar_read(p, INOUTSEL) & BIT(offset));
> +	if (gpio_rcar_read(p, INOUTSEL) & BIT(offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-reg.c b/drivers/gpio/gpio-reg.c
> index fdc7a9d5b382..d35169bde25a 100644
> --- a/drivers/gpio/gpio-reg.c
> +++ b/drivers/gpio/gpio-reg.c
> @@ -26,7 +26,8 @@ static int gpio_reg_get_direction(struct gpio_chip *gc, unsigned offset)
>  {
>  	struct gpio_reg *r = to_gpio_reg(gc);
>  
> -	return r->direction & BIT(offset) ? 1 : 0;
> +	return r->direction & BIT(offset) ? GPIO_LINE_DIRECTION_IN :
> +					    GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int gpio_reg_direction_output(struct gpio_chip *gc, unsigned offset,
> diff --git a/drivers/gpio/gpio-sa1100.c b/drivers/gpio/gpio-sa1100.c
> index 46b7cf23fb0f..edff5e81489f 100644
> --- a/drivers/gpio/gpio-sa1100.c
> +++ b/drivers/gpio/gpio-sa1100.c
> @@ -53,7 +53,10 @@ static int sa1100_get_direction(struct gpio_chip *chip, unsigned offset)
>  {
>  	void __iomem *gpdr = sa1100_gpio_chip(chip)->membase + R_GPDR;
>  
> -	return !(readl_relaxed(gpdr) & BIT(offset));
> +	if (readl_relaxed(gpdr) & BIT(offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int sa1100_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-sama5d2-piobu.c b/drivers/gpio/gpio-sama5d2-piobu.c
> index 7d718557092e..b04c561f3280 100644
> --- a/drivers/gpio/gpio-sama5d2-piobu.c
> +++ b/drivers/gpio/gpio-sama5d2-piobu.c
> @@ -119,7 +119,8 @@ static int sama5d2_piobu_get_direction(struct gpio_chip *chip,
>  	if (ret < 0)
>  		return ret;
>  
> -	return (ret == PIOBU_IN) ? 1 : 0;
> +	return (ret == PIOBU_IN) ? GPIO_LINE_DIRECTION_IN :
> +				   GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  /**
> @@ -154,9 +155,9 @@ static int sama5d2_piobu_get(struct gpio_chip *chip, unsigned int pin)
>  	/* if pin is input, read value from PDS else read from SOD */
>  	int ret = sama5d2_piobu_get_direction(chip, pin);
>  
> -	if (ret == 1)
> +	if (ret == GPIO_LINE_DIRECTION_IN)
>  		ret = sama5d2_piobu_read_value(chip, pin, PIOBU_PDS);
> -	else if (!ret)
> +	else if (ret == GPIO_LINE_DIRECTION_OUT)
>  		ret = sama5d2_piobu_read_value(chip, pin, PIOBU_SOD);
>  
>  	if (ret < 0)
> diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c
> index fb143f28c386..c65f35b68202 100644
> --- a/drivers/gpio/gpio-sch.c
> +++ b/drivers/gpio/gpio-sch.c
> @@ -127,7 +127,10 @@ static int sch_gpio_get_direction(struct gpio_chip *gc, unsigned gpio_num)
>  {
>  	struct sch_gpio *sch = gpiochip_get_data(gc);
>  
> -	return sch_gpio_reg_get(sch, gpio_num, GIO);
> +	if (sch_gpio_reg_get(sch, gpio_num, GIO))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static const struct gpio_chip sch_gpio_chip = {
> diff --git a/drivers/gpio/gpio-sch311x.c b/drivers/gpio/gpio-sch311x.c
> index 8ecf336c9af4..da01e1cad7cb 100644
> --- a/drivers/gpio/gpio-sch311x.c
> +++ b/drivers/gpio/gpio-sch311x.c
> @@ -228,7 +228,10 @@ static int sch311x_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  	data = inb(block->runtime_reg + block->config_regs[offset]);
>  	spin_unlock(&block->lock);
>  
> -	return !!(data & SCH311X_GPIO_CONF_DIR);
> +	if (data & SCH311X_GPIO_CONF_DIR)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int sch311x_gpio_set_config(struct gpio_chip *chip, unsigned offset,
> diff --git a/drivers/gpio/gpio-siox.c b/drivers/gpio/gpio-siox.c
> index 006a7e6a75f2..311f66757b92 100644
> --- a/drivers/gpio/gpio-siox.c
> +++ b/drivers/gpio/gpio-siox.c
> @@ -203,9 +203,9 @@ static int gpio_siox_direction_output(struct gpio_chip *chip,
>  static int gpio_siox_get_direction(struct gpio_chip *chip, unsigned int offset)
>  {
>  	if (offset < 12)
> -		return 1; /* input */
> +		return GPIO_LINE_DIRECTION_IN;
>  	else
> -		return 0; /* output */
> +		return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int gpio_siox_probe(struct siox_device *sdevice)
> diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c
> index 994d542daf53..542706a852e6 100644
> --- a/drivers/gpio/gpio-stmpe.c
> +++ b/drivers/gpio/gpio-stmpe.c
> @@ -84,7 +84,10 @@ static int stmpe_gpio_get_direction(struct gpio_chip *chip,
>  	if (ret < 0)
>  		return ret;
>  
> -	return !(ret & mask);
> +	if (ret & mask)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int stmpe_gpio_direction_output(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-tc3589x.c b/drivers/gpio/gpio-tc3589x.c
> index 75b1135b383a..6be0684cfa49 100644
> --- a/drivers/gpio/gpio-tc3589x.c
> +++ b/drivers/gpio/gpio-tc3589x.c
> @@ -97,7 +97,10 @@ static int tc3589x_gpio_get_direction(struct gpio_chip *chip,
>  	if (ret < 0)
>  		return ret;
>  
> -	return !(ret & BIT(pos));
> +	if (ret & BIT(pos))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int tc3589x_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
> diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c
> index 8a01d3694b28..6fdfe4c5303e 100644
> --- a/drivers/gpio/gpio-tegra.c
> +++ b/drivers/gpio/gpio-tegra.c
> @@ -215,7 +215,10 @@ static int tegra_gpio_get_direction(struct gpio_chip *chip,
>  
>  	oe = tegra_gpio_readl(tgi, GPIO_OE(tgi, offset));
>  
> -	return !(oe & pin_mask);
> +	if (oe & pin_mask)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int tegra_gpio_set_debounce(struct gpio_chip *chip, unsigned int offset,
> diff --git a/drivers/gpio/gpio-tegra186.c b/drivers/gpio/gpio-tegra186.c
> index 8a2a69178925..57185b96c110 100644
> --- a/drivers/gpio/gpio-tegra186.c
> +++ b/drivers/gpio/gpio-tegra186.c
> @@ -111,9 +111,9 @@ static int tegra186_gpio_get_direction(struct gpio_chip *chip,
>  
>  	value = readl(base + TEGRA186_GPIO_ENABLE_CONFIG);
>  	if (value & TEGRA186_GPIO_ENABLE_CONFIG_OUT)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>  
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int tegra186_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-thunderx.c b/drivers/gpio/gpio-thunderx.c
> index ddad5c7ea617..d08d86a22b1f 100644
> --- a/drivers/gpio/gpio-thunderx.c
> +++ b/drivers/gpio/gpio-thunderx.c
> @@ -169,7 +169,10 @@ static int thunderx_gpio_get_direction(struct gpio_chip *chip, unsigned int line
>  
>  	bit_cfg = readq(txgpio->register_base + bit_cfg_reg(line));
>  
> -	return !(bit_cfg & GPIO_BIT_CFG_TX_OE);
> +	if (bit_cfg & GPIO_BIT_CFG_TX_OE)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int thunderx_gpio_set_config(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-tpic2810.c b/drivers/gpio/gpio-tpic2810.c
> index c8b34d787eed..99d5a84a9129 100644
> --- a/drivers/gpio/gpio-tpic2810.c
> +++ b/drivers/gpio/gpio-tpic2810.c
> @@ -39,7 +39,7 @@ static int tpic2810_get_direction(struct gpio_chip *chip,
>  				  unsigned offset)
>  {
>  	/* This device always output */
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int tpic2810_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-tps65086.c b/drivers/gpio/gpio-tps65086.c
> index 2eea98ff4ea3..1e9d8262d0ff 100644
> --- a/drivers/gpio/gpio-tps65086.c
> +++ b/drivers/gpio/gpio-tps65086.c
> @@ -21,7 +21,7 @@ static int tps65086_gpio_get_direction(struct gpio_chip *chip,
>  				       unsigned offset)
>  {
>  	/* This device is output only */
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int tps65086_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-tps65912.c b/drivers/gpio/gpio-tps65912.c
> index 3ad68bd78282..510d9ed9fd2a 100644
> --- a/drivers/gpio/gpio-tps65912.c
> +++ b/drivers/gpio/gpio-tps65912.c
> @@ -32,9 +32,9 @@ static int tps65912_gpio_get_direction(struct gpio_chip *gc,
>  		return ret;
>  
>  	if (val & GPIO_CFG_MASK)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>  	else
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int tps65912_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
> diff --git a/drivers/gpio/gpio-tps68470.c b/drivers/gpio/gpio-tps68470.c
> index aff6e504c666..f7f5f770e0fb 100644
> --- a/drivers/gpio/gpio-tps68470.c
> +++ b/drivers/gpio/gpio-tps68470.c
> @@ -47,7 +47,6 @@ static int tps68470_gpio_get(struct gpio_chip *gc, unsigned int offset)
>  	return !!(val & BIT(offset));
>  }
>  
> -/* Return 0 if output, 1 if input */
>  static int tps68470_gpio_get_direction(struct gpio_chip *gc,
>  				       unsigned int offset)
>  {
> @@ -57,7 +56,7 @@ static int tps68470_gpio_get_direction(struct gpio_chip *gc,
>  
>  	/* rest are always outputs */
>  	if (offset >= TPS68470_N_REGULAR_GPIO)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>  
>  	ret = regmap_read(regmap, TPS68470_GPIO_CTL_REG_A(offset), &val);
>  	if (ret) {
> @@ -67,7 +66,8 @@ static int tps68470_gpio_get_direction(struct gpio_chip *gc,
>  	}
>  
>  	val &= TPS68470_GPIO_MODE_MASK;
> -	return val >= TPS68470_GPIO_MODE_OUT_CMOS ? 0 : 1;
> +	return val >= TPS68470_GPIO_MODE_OUT_CMOS ? GPIO_LINE_DIRECTION_OUT :
> +						    GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static void tps68470_gpio_set(struct gpio_chip *gc, unsigned int offset,
> diff --git a/drivers/gpio/gpio-tqmx86.c b/drivers/gpio/gpio-tqmx86.c
> index a3109bcaa0ac..5022e0ad0fae 100644
> --- a/drivers/gpio/gpio-tqmx86.c
> +++ b/drivers/gpio/gpio-tqmx86.c
> @@ -101,7 +101,10 @@ static int tqmx86_gpio_direction_output(struct gpio_chip *chip,
>  static int tqmx86_gpio_get_direction(struct gpio_chip *chip,
>  				     unsigned int offset)
>  {
> -	return !!(TQMX86_DIR_INPUT_MASK & BIT(offset));
> +	if (TQMX86_DIR_INPUT_MASK & BIT(offset))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static void tqmx86_gpio_irq_mask(struct irq_data *data)
> diff --git a/drivers/gpio/gpio-ts4900.c b/drivers/gpio/gpio-ts4900.c
> index 1da8d0586329..d885032cf814 100644
> --- a/drivers/gpio/gpio-ts4900.c
> +++ b/drivers/gpio/gpio-ts4900.c
> @@ -44,7 +44,10 @@ static int ts4900_gpio_get_direction(struct gpio_chip *chip,
>  
>  	regmap_read(priv->regmap, offset, &reg);
>  
> -	return !(reg & TS4900_GPIO_OE);
> +	if (reg & TS4900_GPIO_OE)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int ts4900_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c
> index fbfb648d3502..de249726230e 100644
> --- a/drivers/gpio/gpio-twl4030.c
> +++ b/drivers/gpio/gpio-twl4030.c
> @@ -165,10 +165,10 @@ static int twl4030_get_gpio_direction(int gpio)
>  	if (ret < 0)
>  		return ret;
>  
> -	/* 1 = output, but gpiolib semantics are inverse so invert */
> -	ret = !(ret & d_msk);
> +	if (ret & d_msk)
> +		return GPIO_LINE_DIRECTION_OUT;
>  
> -	return ret;
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int twl4030_set_gpio_dataout(int gpio, int enable)
> @@ -380,10 +380,10 @@ static int twl_get_direction(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct gpio_twl4030_priv *priv = gpiochip_get_data(chip);
>  	/*
> -	 * Default 0 = output
> +	 * Default GPIO_LINE_DIRECTION_OUT
>  	 * LED GPIOs >= TWL4030_GPIO_MAX are always output
>  	 */
> -	int ret = 0;
> +	int ret = GPIO_LINE_DIRECTION_OUT;
>  
>  	mutex_lock(&priv->mutex);
>  	if (offset < TWL4030_GPIO_MAX) {
> diff --git a/drivers/gpio/gpio-twl6040.c b/drivers/gpio/gpio-twl6040.c
> index c845b2ff1f43..648fb418d775 100644
> --- a/drivers/gpio/gpio-twl6040.c
> +++ b/drivers/gpio/gpio-twl6040.c
> @@ -34,8 +34,7 @@ static int twl6040gpo_get(struct gpio_chip *chip, unsigned offset)
>  
>  static int twl6040gpo_get_direction(struct gpio_chip *chip, unsigned offset)
>  {
> -	/* This means "out" */
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int twl6040gpo_direction_out(struct gpio_chip *chip, unsigned offset,
> diff --git a/drivers/gpio/gpio-uniphier.c b/drivers/gpio/gpio-uniphier.c
> index 93cdcc41e9fb..bd203e8fa58e 100644
> --- a/drivers/gpio/gpio-uniphier.c
> +++ b/drivers/gpio/gpio-uniphier.c
> @@ -113,7 +113,10 @@ static int uniphier_gpio_offset_read(struct gpio_chip *chip,
>  static int uniphier_gpio_get_direction(struct gpio_chip *chip,
>  				       unsigned int offset)
>  {
> -	return uniphier_gpio_offset_read(chip, offset, UNIPHIER_GPIO_PORT_DIR);
> +	if (uniphier_gpio_offset_read(chip, offset, UNIPHIER_GPIO_PORT_DIR))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int uniphier_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-wcove.c b/drivers/gpio/gpio-wcove.c
> index 444fe9e7f04a..8b481b3c1ebe 100644
> --- a/drivers/gpio/gpio-wcove.c
> +++ b/drivers/gpio/gpio-wcove.c
> @@ -170,13 +170,16 @@ static int wcove_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio)
>  	int ret, reg = to_reg(gpio, CTRL_OUT);
>  
>  	if (reg < 0)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>  
>  	ret = regmap_read(wg->regmap, reg, &val);
>  	if (ret)
>  		return ret;
>  
> -	return !(val & CTLO_DIR_OUT);
> +	if (val & CTLO_DIR_OUT)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  static int wcove_gpio_get(struct gpio_chip *chip, unsigned int gpio)
> diff --git a/drivers/gpio/gpio-ws16c48.c b/drivers/gpio/gpio-ws16c48.c
> index e0ef66b6a237..fe456bea81f6 100644
> --- a/drivers/gpio/gpio-ws16c48.c
> +++ b/drivers/gpio/gpio-ws16c48.c
> @@ -56,7 +56,10 @@ static int ws16c48_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  	const unsigned port = offset / 8;
>  	const unsigned mask = BIT(offset % 8);
>  
> -	return !!(ws16c48gpio->io_state[port] & mask);
> +	if (ws16c48gpio->io_state[port] & mask)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int ws16c48_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-xgene.c b/drivers/gpio/gpio-xgene.c
> index a6e66ac18e1f..532b0df8a1f2 100644
> --- a/drivers/gpio/gpio-xgene.c
> +++ b/drivers/gpio/gpio-xgene.c
> @@ -80,7 +80,10 @@ static int xgene_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>  	bank_offset = GPIO_SET_DR_OFFSET + GPIO_BANK_OFFSET(offset);
>  	bit_offset = GPIO_BIT_OFFSET(offset);
>  
> -	return !!(ioread32(chip->base + bank_offset) & BIT(bit_offset));
> +	if (ioread32(chip->base + bank_offset) & BIT(bit_offset))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int xgene_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
> diff --git a/drivers/gpio/gpio-xra1403.c b/drivers/gpio/gpio-xra1403.c
> index 05f1998c11a4..31b5072b2df0 100644
> --- a/drivers/gpio/gpio-xra1403.c
> +++ b/drivers/gpio/gpio-xra1403.c
> @@ -83,7 +83,10 @@ static int xra1403_get_direction(struct gpio_chip *chip, unsigned int offset)
>  	if (ret)
>  		return ret;
>  
> -	return !!(val & BIT(offset % 8));
> +	if (val & BIT(offset % 8))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>  }
>  
>  static int xra1403_get(struct gpio_chip *chip, unsigned int offset)
> diff --git a/drivers/gpio/gpio-xtensa.c b/drivers/gpio/gpio-xtensa.c
> index 43d3fa5f511a..08d7c3b32038 100644
> --- a/drivers/gpio/gpio-xtensa.c
> +++ b/drivers/gpio/gpio-xtensa.c
> @@ -72,7 +72,7 @@ static inline void disable_cp(unsigned long flags, unsigned long cpenable)
>  
>  static int xtensa_impwire_get_direction(struct gpio_chip *gc, unsigned offset)
>  {
> -	return 1; /* input only */
> +	return GPIO_LINE_DIRECTION_IN; /* input only */
>  }
>  
>  static int xtensa_impwire_get_value(struct gpio_chip *gc, unsigned offset)
> @@ -95,7 +95,7 @@ static void xtensa_impwire_set_value(struct gpio_chip *gc, unsigned offset,
>  
>  static int xtensa_expstate_get_direction(struct gpio_chip *gc, unsigned offset)
>  {
> -	return 0; /* output only */
> +	return GPIO_LINE_DIRECTION_OUT; /* output only */
>  }
>  
>  static int xtensa_expstate_get_value(struct gpio_chip *gc, unsigned offset)
> diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c
> index cd475ff4bcad..4c3f6370eab4 100644
> --- a/drivers/gpio/gpio-zynq.c
> +++ b/drivers/gpio/gpio-zynq.c
> @@ -360,7 +360,7 @@ static int zynq_gpio_dir_out(struct gpio_chip *chip, unsigned int pin,
>   *
>   * This function returns the direction of the specified GPIO.
>   *
> - * Return: 0 for output, 1 for input
> + * Return: GPIO_LINE_DIRECTION_OUT or GPIO_LINE_DIRECTION_IN
>   */
>  static int zynq_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
>  {
> @@ -372,7 +372,10 @@ static int zynq_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
>  
>  	reg = readl_relaxed(gpio->base_addr + ZYNQ_GPIO_DIRM_OFFSET(bank_num));
>  
> -	return !(reg & BIT(bank_pin_num));
> +	if (reg & BIT(bank_pin_num))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>  }
>  
>  /**
> -- 
> 2.21.0
> 
> 
> -- 
> Matti Vaittinen, Linux device drivers
> ROHM Semiconductors, Finland SWDC
> Kiviharjunlenkki 1E
> 90220 OULU
> FINLAND
> 
> ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
> Simon says - in Latin please.
> ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
> Thanks to Simon Glass for the translation =]
Kuppuswamy Sathyanarayanan Nov. 6, 2019, 5:35 p.m. UTC | #3
On 11/6/19 12:54 AM, Matti Vaittinen wrote:
> It's hard for occasional GPIO code reader/writer to know if values 0/1
> equal to IN or OUT. Use defined GPIO_LINE_DIRECTION_IN and
> GPIO_LINE_DIRECTION_OUT to help them out.
>
> NOTE - for gpio-amd-fch and gpio-bd9571mwv:
> This commit also changes the return value for direction get to equal 1
> for direction INPUT. Prior this commit these drivers might have
> returned some other positive value but 1 for INPUT.
>
> Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
> Acked-by: Scott Branden <scott.branden@broadcom.com>
> Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>
> Reviewed-by: Michal Simek <michal.simek@xilinx.com>
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
>
> ---

For wcove GPIO driver,

Acked-by: Kuppuswamy Sathyanarayanan 
<sathyanarayanan.kuppuswamy@linux.intel.com>

>
> This patch contains same changes as v1 patches 2-61 did. v1 was splitted
> into small patches in order to help reviewing but squashing was
> requested by Linus Walleij. I maintained all acks/reviewed-by tags from
> v1 series - so acks/review-by tags in this patch mean that specific
> portion of changes have been acked/reviewed by tagger. Eg, whole patch
> has not been reviewed/acked by persons mentioned. Please let me know if
> this is not Ok to you.
>
>   drivers/gpio/gpio-104-dio-48e.c     |  5 ++++-
>   drivers/gpio/gpio-104-idi-48.c      |  2 +-
>   drivers/gpio/gpio-104-idio-16.c     |  4 ++--
>   drivers/gpio/gpio-74xx-mmio.c       |  5 ++++-
>   drivers/gpio/gpio-amd-fch.c         |  2 +-
>   drivers/gpio/gpio-aspeed.c          |  7 +++----
>   drivers/gpio/gpio-bcm-kona.c        |  6 +++---
>   drivers/gpio/gpio-bd70528.c         |  8 +++++---
>   drivers/gpio/gpio-bd9571mwv.c       |  4 +++-
>   drivers/gpio/gpio-dln2.c            |  6 +++---
>   drivers/gpio/gpio-exar.c            |  5 ++++-
>   drivers/gpio/gpio-f7188x.c          |  5 ++++-
>   drivers/gpio/gpio-gpio-mm.c         |  5 ++++-
>   drivers/gpio/gpio-htc-egpio.c       |  5 ++++-
>   drivers/gpio/gpio-ich.c             |  5 ++++-
>   drivers/gpio/gpio-kempld.c          |  5 ++++-
>   drivers/gpio/gpio-lp873x.c          |  2 +-
>   drivers/gpio/gpio-lp87565.c         |  5 ++++-
>   drivers/gpio/gpio-madera.c          |  5 ++++-
>   drivers/gpio/gpio-max3191x.c        |  2 +-
>   drivers/gpio/gpio-merrifield.c      |  5 ++++-
>   drivers/gpio/gpio-mmio.c            | 21 +++++++++++++++------
>   drivers/gpio/gpio-mockup.c          | 11 +++--------
>   drivers/gpio/gpio-moxtet.c          |  4 ++--
>   drivers/gpio/gpio-mvebu.c           |  5 ++++-
>   drivers/gpio/gpio-mxs.c             |  5 ++++-
>   drivers/gpio/gpio-omap.c            |  6 ++++--
>   drivers/gpio/gpio-pca953x.c         |  5 ++++-
>   drivers/gpio/gpio-pci-idio-16.c     |  4 ++--
>   drivers/gpio/gpio-pcie-idio-24.c    |  9 ++++++---
>   drivers/gpio/gpio-pisosr.c          |  2 +-
>   drivers/gpio/gpio-pl061.c           |  5 ++++-
>   drivers/gpio/gpio-raspberrypi-exp.c |  5 ++++-
>   drivers/gpio/gpio-rcar.c            |  5 ++++-
>   drivers/gpio/gpio-reg.c             |  3 ++-
>   drivers/gpio/gpio-sa1100.c          |  5 ++++-
>   drivers/gpio/gpio-sama5d2-piobu.c   |  7 ++++---
>   drivers/gpio/gpio-sch.c             |  5 ++++-
>   drivers/gpio/gpio-sch311x.c         |  5 ++++-
>   drivers/gpio/gpio-siox.c            |  4 ++--
>   drivers/gpio/gpio-stmpe.c           |  5 ++++-
>   drivers/gpio/gpio-tc3589x.c         |  5 ++++-
>   drivers/gpio/gpio-tegra.c           |  5 ++++-
>   drivers/gpio/gpio-tegra186.c        |  4 ++--
>   drivers/gpio/gpio-thunderx.c        |  5 ++++-
>   drivers/gpio/gpio-tpic2810.c        |  2 +-
>   drivers/gpio/gpio-tps65086.c        |  2 +-
>   drivers/gpio/gpio-tps65912.c        |  4 ++--
>   drivers/gpio/gpio-tps68470.c        |  6 +++---
>   drivers/gpio/gpio-tqmx86.c          |  5 ++++-
>   drivers/gpio/gpio-ts4900.c          |  5 ++++-
>   drivers/gpio/gpio-twl4030.c         | 10 +++++-----
>   drivers/gpio/gpio-twl6040.c         |  3 +--
>   drivers/gpio/gpio-uniphier.c        |  5 ++++-
>   drivers/gpio/gpio-wcove.c           |  7 +++++--
>   drivers/gpio/gpio-ws16c48.c         |  5 ++++-
>   drivers/gpio/gpio-xgene.c           |  5 ++++-
>   drivers/gpio/gpio-xra1403.c         |  5 ++++-
>   drivers/gpio/gpio-xtensa.c          |  4 ++--
>   drivers/gpio/gpio-zynq.c            |  7 +++++--
>   60 files changed, 211 insertions(+), 102 deletions(-)
>
> diff --git a/drivers/gpio/gpio-104-dio-48e.c b/drivers/gpio/gpio-104-dio-48e.c
> index a44fa8af5b0d..400c09b905f8 100644
> --- a/drivers/gpio/gpio-104-dio-48e.c
> +++ b/drivers/gpio/gpio-104-dio-48e.c
> @@ -59,7 +59,10 @@ static int dio48e_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   	const unsigned port = offset / 8;
>   	const unsigned mask = BIT(offset % 8);
>   
> -	return !!(dio48egpio->io_state[port] & mask);
> +	if (dio48egpio->io_state[port] & mask)
> +		return  GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int dio48e_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-104-idi-48.c b/drivers/gpio/gpio-104-idi-48.c
> index 79dead61e776..c50329ab493a 100644
> --- a/drivers/gpio/gpio-104-idi-48.c
> +++ b/drivers/gpio/gpio-104-idi-48.c
> @@ -53,7 +53,7 @@ struct idi_48_gpio {
>   
>   static int idi_48_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   {
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int idi_48_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-104-idio-16.c b/drivers/gpio/gpio-104-idio-16.c
> index 8d2f51cd9d91..5752d9dab148 100644
> --- a/drivers/gpio/gpio-104-idio-16.c
> +++ b/drivers/gpio/gpio-104-idio-16.c
> @@ -51,9 +51,9 @@ struct idio_16_gpio {
>   static int idio_16_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   {
>   	if (offset > 15)
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>   
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int idio_16_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-74xx-mmio.c b/drivers/gpio/gpio-74xx-mmio.c
> index 83a2286d93f6..173e06758e6c 100644
> --- a/drivers/gpio/gpio-74xx-mmio.c
> +++ b/drivers/gpio/gpio-74xx-mmio.c
> @@ -77,7 +77,10 @@ static int mmio_74xx_get_direction(struct gpio_chip *gc, unsigned offset)
>   {
>   	struct mmio_74xx_gpio_priv *priv = gpiochip_get_data(gc);
>   
> -	return !(priv->flags & MMIO_74XX_DIR_OUT);
> +	if (priv->flags & MMIO_74XX_DIR_OUT)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return  GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int mmio_74xx_dir_in(struct gpio_chip *gc, unsigned int gpio)
> diff --git a/drivers/gpio/gpio-amd-fch.c b/drivers/gpio/gpio-amd-fch.c
> index 181df1581df5..4e44ba4d7423 100644
> --- a/drivers/gpio/gpio-amd-fch.c
> +++ b/drivers/gpio/gpio-amd-fch.c
> @@ -92,7 +92,7 @@ static int amd_fch_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
>   	ret = (readl_relaxed(ptr) & AMD_FCH_GPIO_FLAG_DIRECTION);
>   	spin_unlock_irqrestore(&priv->lock, flags);
>   
> -	return ret;
> +	return ret ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static void amd_fch_gpio_set(struct gpio_chip *gc,
> diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c
> index 09e53c5f3b0a..f1037b61f763 100644
> --- a/drivers/gpio/gpio-aspeed.c
> +++ b/drivers/gpio/gpio-aspeed.c
> @@ -487,10 +487,10 @@ static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>   	u32 val;
>   
>   	if (!have_input(gpio, offset))
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>   
>   	if (!have_output(gpio, offset))
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>   
>   	spin_lock_irqsave(&gpio->lock, flags);
>   
> @@ -498,8 +498,7 @@ static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>   
>   	spin_unlock_irqrestore(&gpio->lock, flags);
>   
> -	return !val;
> -
> +	return val ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static inline int irqd_to_aspeed_gpio_data(struct irq_data *d,
> diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c
> index 9fa6d3a967d2..4122683eb1f9 100644
> --- a/drivers/gpio/gpio-bcm-kona.c
> +++ b/drivers/gpio/gpio-bcm-kona.c
> @@ -127,7 +127,7 @@ static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio)
>   	u32 val;
>   
>   	val = readl(reg_base + GPIO_CONTROL(gpio)) & GPIO_GPCTR0_IOTR_MASK;
> -	return !!val;
> +	return val ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
> @@ -144,7 +144,7 @@ static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
>   	raw_spin_lock_irqsave(&kona_gpio->lock, flags);
>   
>   	/* this function only applies to output pin */
> -	if (bcm_kona_gpio_get_dir(chip, gpio) == 1)
> +	if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN)
>   		goto out;
>   
>   	reg_offset = value ? GPIO_OUT_SET(bank_id) : GPIO_OUT_CLEAR(bank_id);
> @@ -170,7 +170,7 @@ static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio)
>   	reg_base = kona_gpio->reg_base;
>   	raw_spin_lock_irqsave(&kona_gpio->lock, flags);
>   
> -	if (bcm_kona_gpio_get_dir(chip, gpio) == 1)
> +	if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN)
>   		reg_offset = GPIO_IN_STATUS(bank_id);
>   	else
>   		reg_offset = GPIO_OUT_STATUS(bank_id);
> diff --git a/drivers/gpio/gpio-bd70528.c b/drivers/gpio/gpio-bd70528.c
> index 0c1ead12d883..734be6b752d0 100644
> --- a/drivers/gpio/gpio-bd70528.c
> +++ b/drivers/gpio/gpio-bd70528.c
> @@ -54,8 +54,10 @@ static int bd70528_get_direction(struct gpio_chip *chip, unsigned int offset)
>   		dev_err(bdgpio->chip.dev, "Could not read gpio direction\n");
>   		return ret;
>   	}
> +	if (val & BD70528_GPIO_OUT_EN_MASK)
> +		return GPIO_LINE_DIRECTION_OUT;
>   
> -	return !(val & BD70528_GPIO_OUT_EN_MASK);
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int bd70528_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
> @@ -166,9 +168,9 @@ static int bd70528_gpio_get(struct gpio_chip *chip, unsigned int offset)
>   	 * locking would make no sense.
>   	 */
>   	ret = bd70528_get_direction(chip, offset);
> -	if (ret == 0)
> +	if (ret == GPIO_LINE_DIRECTION_OUT)
>   		ret = bd70528_gpio_get_o(bdgpio, offset);
> -	else if (ret == 1)
> +	else if (ret == GPIO_LINE_DIRECTION_IN)
>   		ret = bd70528_gpio_get_i(bdgpio, offset);
>   	else
>   		dev_err(bdgpio->chip.dev, "failed to read GPIO direction\n");
> diff --git a/drivers/gpio/gpio-bd9571mwv.c b/drivers/gpio/gpio-bd9571mwv.c
> index 5224a946e8ab..c0abc9c6851b 100644
> --- a/drivers/gpio/gpio-bd9571mwv.c
> +++ b/drivers/gpio/gpio-bd9571mwv.c
> @@ -37,8 +37,10 @@ static int bd9571mwv_gpio_get_direction(struct gpio_chip *chip,
>   	ret = regmap_read(gpio->bd->regmap, BD9571MWV_GPIO_DIR, &val);
>   	if (ret < 0)
>   		return ret;
> +	if (val & BIT(offset))
> +		return GPIO_LINE_DIRECTION_IN;
>   
> -	return val & BIT(offset);
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int bd9571mwv_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-dln2.c b/drivers/gpio/gpio-dln2.c
> index 8a33c2fc174d..26b40c8b8a12 100644
> --- a/drivers/gpio/gpio-dln2.c
> +++ b/drivers/gpio/gpio-dln2.c
> @@ -200,9 +200,9 @@ static int dln2_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   	struct dln2_gpio *dln2 = gpiochip_get_data(chip);
>   
>   	if (test_bit(offset, dln2->output_enabled))
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>   
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int dln2_gpio_get(struct gpio_chip *chip, unsigned int offset)
> @@ -214,7 +214,7 @@ static int dln2_gpio_get(struct gpio_chip *chip, unsigned int offset)
>   	if (dir < 0)
>   		return dir;
>   
> -	if (dir == 1)
> +	if (dir == GPIO_LINE_DIRECTION_IN)
>   		return dln2_gpio_pin_get_in_val(dln2, offset);
>   
>   	return dln2_gpio_pin_get_out_val(dln2, offset);
> diff --git a/drivers/gpio/gpio-exar.c b/drivers/gpio/gpio-exar.c
> index fae327d5b06e..da1ef0b1c291 100644
> --- a/drivers/gpio/gpio-exar.c
> +++ b/drivers/gpio/gpio-exar.c
> @@ -77,7 +77,10 @@ static int exar_get_direction(struct gpio_chip *chip, unsigned int offset)
>   		EXAR_OFFSET_MPIOSEL_HI : EXAR_OFFSET_MPIOSEL_LO;
>   	unsigned int bit  = (offset + exar_gpio->first_pin) % 8;
>   
> -	return !!(exar_get(chip, addr) & BIT(bit));
> +	if (exar_get(chip, addr) & BIT(bit))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int exar_get_value(struct gpio_chip *chip, unsigned int offset)
> diff --git a/drivers/gpio/gpio-f7188x.c b/drivers/gpio/gpio-f7188x.c
> index fdc639f856f1..cadd02993539 100644
> --- a/drivers/gpio/gpio-f7188x.c
> +++ b/drivers/gpio/gpio-f7188x.c
> @@ -250,7 +250,10 @@ static int f7188x_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   
>   	superio_exit(sio->addr);
>   
> -	return !(dir & 1 << offset);
> +	if (dir & 1 << offset)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int f7188x_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-gpio-mm.c b/drivers/gpio/gpio-gpio-mm.c
> index 78a1db24e931..c22d6f94129c 100644
> --- a/drivers/gpio/gpio-gpio-mm.c
> +++ b/drivers/gpio/gpio-gpio-mm.c
> @@ -52,7 +52,10 @@ static int gpiomm_gpio_get_direction(struct gpio_chip *chip,
>   	const unsigned int port = offset / 8;
>   	const unsigned int mask = BIT(offset % 8);
>   
> -	return !!(gpiommgpio->io_state[port] & mask);
> +	if (gpiommgpio->io_state[port] & mask)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int gpiomm_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-htc-egpio.c b/drivers/gpio/gpio-htc-egpio.c
> index 8aa23d70b1e6..a40bd56673fe 100644
> --- a/drivers/gpio/gpio-htc-egpio.c
> +++ b/drivers/gpio/gpio-htc-egpio.c
> @@ -220,7 +220,10 @@ static int egpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   
>   	egpio = gpiochip_get_data(chip);
>   
> -	return !test_bit(offset, &egpio->is_out);
> +	if (test_bit(offset, &egpio->is_out))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static void egpio_write_cache(struct egpio_info *ei)
> diff --git a/drivers/gpio/gpio-ich.c b/drivers/gpio/gpio-ich.c
> index 90bf7742f9b0..2f086d0aa1f4 100644
> --- a/drivers/gpio/gpio-ich.c
> +++ b/drivers/gpio/gpio-ich.c
> @@ -159,7 +159,10 @@ static bool ichx_gpio_check_available(struct gpio_chip *gpio, unsigned nr)
>   
>   static int ichx_gpio_get_direction(struct gpio_chip *gpio, unsigned nr)
>   {
> -	return ichx_read_bit(GPIO_IO_SEL, nr);
> +	if (ichx_read_bit(GPIO_IO_SEL, nr))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int ichx_gpio_direction_input(struct gpio_chip *gpio, unsigned nr)
> diff --git a/drivers/gpio/gpio-kempld.c b/drivers/gpio/gpio-kempld.c
> index ef51638f3f75..4ea15f08e0f4 100644
> --- a/drivers/gpio/gpio-kempld.c
> +++ b/drivers/gpio/gpio-kempld.c
> @@ -104,7 +104,10 @@ static int kempld_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   	struct kempld_gpio_data *gpio = gpiochip_get_data(chip);
>   	struct kempld_device_data *pld = gpio->pld;
>   
> -	return !kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset);
> +	if (kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int kempld_gpio_pincount(struct kempld_device_data *pld)
> diff --git a/drivers/gpio/gpio-lp873x.c b/drivers/gpio/gpio-lp873x.c
> index 801995dd9b26..70fad87ff2db 100644
> --- a/drivers/gpio/gpio-lp873x.c
> +++ b/drivers/gpio/gpio-lp873x.c
> @@ -33,7 +33,7 @@ static int lp873x_gpio_get_direction(struct gpio_chip *chip,
>   				     unsigned int offset)
>   {
>   	/* This device is output only */
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int lp873x_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-lp87565.c b/drivers/gpio/gpio-lp87565.c
> index a121c8f10610..e1244520cf7d 100644
> --- a/drivers/gpio/gpio-lp87565.c
> +++ b/drivers/gpio/gpio-lp87565.c
> @@ -57,7 +57,10 @@ static int lp87565_gpio_get_direction(struct gpio_chip *chip,
>   	if (ret < 0)
>   		return ret;
>   
> -	return !(val & BIT(offset));
> +	if (val & BIT(offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int lp87565_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-madera.c b/drivers/gpio/gpio-madera.c
> index 7086f8b5388f..8f38303fcbc4 100644
> --- a/drivers/gpio/gpio-madera.c
> +++ b/drivers/gpio/gpio-madera.c
> @@ -34,7 +34,10 @@ static int madera_gpio_get_direction(struct gpio_chip *chip,
>   	if (ret < 0)
>   		return ret;
>   
> -	return !!(val & MADERA_GP1_DIR_MASK);
> +	if (val & MADERA_GP1_DIR_MASK)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int madera_gpio_direction_in(struct gpio_chip *chip, unsigned int offset)
> diff --git a/drivers/gpio/gpio-max3191x.c b/drivers/gpio/gpio-max3191x.c
> index 4b4b2ceb82fc..0696d5a21431 100644
> --- a/drivers/gpio/gpio-max3191x.c
> +++ b/drivers/gpio/gpio-max3191x.c
> @@ -94,7 +94,7 @@ DECLARE_CRC8_TABLE(max3191x_crc8);
>   
>   static int max3191x_get_direction(struct gpio_chip *gpio, unsigned int offset)
>   {
> -	return 1; /* always in */
> +	return GPIO_LINE_DIRECTION_IN; /* always in */
>   }
>   
>   static int max3191x_direction_input(struct gpio_chip *gpio, unsigned int offset)
> diff --git a/drivers/gpio/gpio-merrifield.c b/drivers/gpio/gpio-merrifield.c
> index 2f1e9da81c1e..d4fa6e9560f3 100644
> --- a/drivers/gpio/gpio-merrifield.c
> +++ b/drivers/gpio/gpio-merrifield.c
> @@ -162,7 +162,10 @@ static int mrfld_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
>   {
>   	void __iomem *gpdr = gpio_reg(chip, offset, GPDR);
>   
> -	return !(readl(gpdr) & BIT(offset % 32));
> +	if (readl(gpdr) & BIT(offset % 32))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int mrfld_gpio_set_debounce(struct gpio_chip *chip, unsigned int offset,
> diff --git a/drivers/gpio/gpio-mmio.c b/drivers/gpio/gpio-mmio.c
> index 6f904c874678..cd07c948649f 100644
> --- a/drivers/gpio/gpio-mmio.c
> +++ b/drivers/gpio/gpio-mmio.c
> @@ -370,15 +370,24 @@ static int bgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
>   static int bgpio_get_dir(struct gpio_chip *gc, unsigned int gpio)
>   {
>   	/* Return 0 if output, 1 if input */
> -	if (gc->bgpio_dir_unreadable)
> -		return !(gc->bgpio_dir & bgpio_line2mask(gc, gpio));
> -	if (gc->reg_dir_out)
> -		return !(gc->read_reg(gc->reg_dir_out) & bgpio_line2mask(gc, gpio));
> +	if (gc->bgpio_dir_unreadable) {
> +		if (gc->bgpio_dir & bgpio_line2mask(gc, gpio))
> +			return GPIO_LINE_DIRECTION_OUT;
> +		return GPIO_LINE_DIRECTION_IN;
> +	}
> +
> +	if (gc->reg_dir_out) {
> +		if (gc->read_reg(gc->reg_dir_out) & bgpio_line2mask(gc, gpio))
> +			return GPIO_LINE_DIRECTION_OUT;
> +		return GPIO_LINE_DIRECTION_IN;
> +	}
> +
>   	if (gc->reg_dir_in)
> -		return !!(gc->read_reg(gc->reg_dir_in) & bgpio_line2mask(gc, gpio));
> +		if (!(gc->read_reg(gc->reg_dir_in) & bgpio_line2mask(gc, gpio)))
> +			return GPIO_LINE_DIRECTION_OUT;
>   
>   	/* This should not happen */
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int bgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
> diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c
> index 213aedc97dc2..47c172b2f5ad 100644
> --- a/drivers/gpio/gpio-mockup.c
> +++ b/drivers/gpio/gpio-mockup.c
> @@ -34,14 +34,9 @@
>   
>   #define gpio_mockup_err(...)	pr_err(GPIO_MOCKUP_NAME ": " __VA_ARGS__)
>   
> -enum {
> -	GPIO_MOCKUP_DIR_IN = 0,
> -	GPIO_MOCKUP_DIR_OUT = 1,
> -};
> -
>   /*
>    * struct gpio_pin_status - structure describing a GPIO status
> - * @dir:       Configures direction of gpio as "in" or "out", 0=in, 1=out
> + * @dir:       Configures direction of gpio as "in" or "out"
>    * @value:     Configures status of the gpio as 0(low) or 1(high)
>    */
>   struct gpio_mockup_line_status {
> @@ -152,7 +147,7 @@ static int gpio_mockup_dirout(struct gpio_chip *gc,
>   	struct gpio_mockup_chip *chip = gpiochip_get_data(gc);
>   
>   	mutex_lock(&chip->lock);
> -	chip->lines[offset].dir = GPIO_MOCKUP_DIR_OUT;
> +	chip->lines[offset].dir = GPIO_LINE_DIRECTION_OUT;
>   	__gpio_mockup_set(chip, offset, value);
>   	mutex_unlock(&chip->lock);
>   
> @@ -164,7 +159,7 @@ static int gpio_mockup_dirin(struct gpio_chip *gc, unsigned int offset)
>   	struct gpio_mockup_chip *chip = gpiochip_get_data(gc);
>   
>   	mutex_lock(&chip->lock);
> -	chip->lines[offset].dir = GPIO_MOCKUP_DIR_IN;
> +	chip->lines[offset].dir = GPIO_LINE_DIRECTION_IN;
>   	mutex_unlock(&chip->lock);
>   
>   	return 0;
> diff --git a/drivers/gpio/gpio-moxtet.c b/drivers/gpio/gpio-moxtet.c
> index 3fd729994a38..8299909318f4 100644
> --- a/drivers/gpio/gpio-moxtet.c
> +++ b/drivers/gpio/gpio-moxtet.c
> @@ -78,9 +78,9 @@ static int moxtet_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>   
>   	/* All lines are hard wired to be either input or output, not both. */
>   	if (chip->desc->in_mask & BIT(offset))
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>   	else if (chip->desc->out_mask & BIT(offset))
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>   	else
>   		return -EINVAL;
>   }
> diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
> index 6c0687694341..9b2adf0ef880 100644
> --- a/drivers/gpio/gpio-mvebu.c
> +++ b/drivers/gpio/gpio-mvebu.c
> @@ -384,7 +384,10 @@ static int mvebu_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
>   
>   	regmap_read(mvchip->regs, GPIO_IO_CONF_OFF + mvchip->offset, &u);
>   
> -	return !!(u & BIT(pin));
> +	if (u & BIT(pin))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int mvebu_gpio_to_irq(struct gpio_chip *chip, unsigned int pin)
> diff --git a/drivers/gpio/gpio-mxs.c b/drivers/gpio/gpio-mxs.c
> index 5e5437a2c607..c4a314c68555 100644
> --- a/drivers/gpio/gpio-mxs.c
> +++ b/drivers/gpio/gpio-mxs.c
> @@ -248,7 +248,10 @@ static int mxs_gpio_get_direction(struct gpio_chip *gc, unsigned offset)
>   	u32 dir;
>   
>   	dir = readl(port->base + PINCTRL_DOE(port));
> -	return !(dir & mask);
> +	if (dir & mask)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static const struct platform_device_id mxs_gpio_ids[] = {
> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> index d0f27084a942..3bd8adaeed9e 100644
> --- a/drivers/gpio/gpio-omap.c
> +++ b/drivers/gpio/gpio-omap.c
> @@ -805,8 +805,10 @@ static int omap_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   {
>   	struct gpio_bank *bank = gpiochip_get_data(chip);
>   
> -	return !!(readl_relaxed(bank->base + bank->regs->direction) &
> -		  BIT(offset));
> +	if (readl_relaxed(bank->base + bank->regs->direction) & BIT(offset))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int omap_gpio_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
> index de5d1383f28d..82122c3c688a 100644
> --- a/drivers/gpio/gpio-pca953x.c
> +++ b/drivers/gpio/gpio-pca953x.c
> @@ -449,7 +449,10 @@ static int pca953x_gpio_get_direction(struct gpio_chip *gc, unsigned off)
>   	if (ret < 0)
>   		return ret;
>   
> -	return !!(reg_val & bit);
> +	if (reg_val & bit)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
> diff --git a/drivers/gpio/gpio-pci-idio-16.c b/drivers/gpio/gpio-pci-idio-16.c
> index 5aa136a6a3e0..df51dd08bdfe 100644
> --- a/drivers/gpio/gpio-pci-idio-16.c
> +++ b/drivers/gpio/gpio-pci-idio-16.c
> @@ -61,9 +61,9 @@ static int idio_16_gpio_get_direction(struct gpio_chip *chip,
>   	unsigned int offset)
>   {
>   	if (offset > 15)
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>   
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int idio_16_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-pcie-idio-24.c b/drivers/gpio/gpio-pcie-idio-24.c
> index 52f1647a46fd..44c1e4fc489f 100644
> --- a/drivers/gpio/gpio-pcie-idio-24.c
> +++ b/drivers/gpio/gpio-pcie-idio-24.c
> @@ -104,15 +104,18 @@ static int idio_24_gpio_get_direction(struct gpio_chip *chip,
>   
>   	/* FET Outputs */
>   	if (offset < 24)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>   
>   	/* Isolated Inputs */
>   	if (offset < 48)
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>   
>   	/* TTL/CMOS I/O */
>   	/* OUT MODE = 1 when TTL/CMOS Output Mode is set */
> -	return !(ioread8(&idio24gpio->reg->ctl) & out_mode_mask);
> +	if (ioread8(&idio24gpio->reg->ctl) & out_mode_mask)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int idio_24_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-pisosr.c b/drivers/gpio/gpio-pisosr.c
> index f809a5a8e9eb..1331b2a94679 100644
> --- a/drivers/gpio/gpio-pisosr.c
> +++ b/drivers/gpio/gpio-pisosr.c
> @@ -65,7 +65,7 @@ static int pisosr_gpio_get_direction(struct gpio_chip *chip,
>   				     unsigned offset)
>   {
>   	/* This device always input */
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int pisosr_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c
> index 722ce5cf861e..5df7782e348f 100644
> --- a/drivers/gpio/gpio-pl061.c
> +++ b/drivers/gpio/gpio-pl061.c
> @@ -63,7 +63,10 @@ static int pl061_get_direction(struct gpio_chip *gc, unsigned offset)
>   {
>   	struct pl061 *pl061 = gpiochip_get_data(gc);
>   
> -	return !(readb(pl061->base + GPIODIR) & BIT(offset));
> +	if (readb(pl061->base + GPIODIR) & BIT(offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int pl061_direction_input(struct gpio_chip *gc, unsigned offset)
> diff --git a/drivers/gpio/gpio-raspberrypi-exp.c b/drivers/gpio/gpio-raspberrypi-exp.c
> index b77ea16ffa03..bb100e0124e6 100644
> --- a/drivers/gpio/gpio-raspberrypi-exp.c
> +++ b/drivers/gpio/gpio-raspberrypi-exp.c
> @@ -147,7 +147,10 @@ static int rpi_exp_gpio_get_direction(struct gpio_chip *gc, unsigned int off)
>   			get.gpio);
>   		return ret ? ret : -EIO;
>   	}
> -	return !get.direction;
> +	if (get.direction)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int rpi_exp_gpio_get(struct gpio_chip *gc, unsigned int off)
> diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c
> index 187984d26f47..d7e6e68c25af 100644
> --- a/drivers/gpio/gpio-rcar.c
> +++ b/drivers/gpio/gpio-rcar.c
> @@ -279,7 +279,10 @@ static int gpio_rcar_get_direction(struct gpio_chip *chip, unsigned int offset)
>   {
>   	struct gpio_rcar_priv *p = gpiochip_get_data(chip);
>   
> -	return !(gpio_rcar_read(p, INOUTSEL) & BIT(offset));
> +	if (gpio_rcar_read(p, INOUTSEL) & BIT(offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-reg.c b/drivers/gpio/gpio-reg.c
> index fdc7a9d5b382..d35169bde25a 100644
> --- a/drivers/gpio/gpio-reg.c
> +++ b/drivers/gpio/gpio-reg.c
> @@ -26,7 +26,8 @@ static int gpio_reg_get_direction(struct gpio_chip *gc, unsigned offset)
>   {
>   	struct gpio_reg *r = to_gpio_reg(gc);
>   
> -	return r->direction & BIT(offset) ? 1 : 0;
> +	return r->direction & BIT(offset) ? GPIO_LINE_DIRECTION_IN :
> +					    GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int gpio_reg_direction_output(struct gpio_chip *gc, unsigned offset,
> diff --git a/drivers/gpio/gpio-sa1100.c b/drivers/gpio/gpio-sa1100.c
> index 46b7cf23fb0f..edff5e81489f 100644
> --- a/drivers/gpio/gpio-sa1100.c
> +++ b/drivers/gpio/gpio-sa1100.c
> @@ -53,7 +53,10 @@ static int sa1100_get_direction(struct gpio_chip *chip, unsigned offset)
>   {
>   	void __iomem *gpdr = sa1100_gpio_chip(chip)->membase + R_GPDR;
>   
> -	return !(readl_relaxed(gpdr) & BIT(offset));
> +	if (readl_relaxed(gpdr) & BIT(offset))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int sa1100_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-sama5d2-piobu.c b/drivers/gpio/gpio-sama5d2-piobu.c
> index 7d718557092e..b04c561f3280 100644
> --- a/drivers/gpio/gpio-sama5d2-piobu.c
> +++ b/drivers/gpio/gpio-sama5d2-piobu.c
> @@ -119,7 +119,8 @@ static int sama5d2_piobu_get_direction(struct gpio_chip *chip,
>   	if (ret < 0)
>   		return ret;
>   
> -	return (ret == PIOBU_IN) ? 1 : 0;
> +	return (ret == PIOBU_IN) ? GPIO_LINE_DIRECTION_IN :
> +				   GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   /**
> @@ -154,9 +155,9 @@ static int sama5d2_piobu_get(struct gpio_chip *chip, unsigned int pin)
>   	/* if pin is input, read value from PDS else read from SOD */
>   	int ret = sama5d2_piobu_get_direction(chip, pin);
>   
> -	if (ret == 1)
> +	if (ret == GPIO_LINE_DIRECTION_IN)
>   		ret = sama5d2_piobu_read_value(chip, pin, PIOBU_PDS);
> -	else if (!ret)
> +	else if (ret == GPIO_LINE_DIRECTION_OUT)
>   		ret = sama5d2_piobu_read_value(chip, pin, PIOBU_SOD);
>   
>   	if (ret < 0)
> diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c
> index fb143f28c386..c65f35b68202 100644
> --- a/drivers/gpio/gpio-sch.c
> +++ b/drivers/gpio/gpio-sch.c
> @@ -127,7 +127,10 @@ static int sch_gpio_get_direction(struct gpio_chip *gc, unsigned gpio_num)
>   {
>   	struct sch_gpio *sch = gpiochip_get_data(gc);
>   
> -	return sch_gpio_reg_get(sch, gpio_num, GIO);
> +	if (sch_gpio_reg_get(sch, gpio_num, GIO))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static const struct gpio_chip sch_gpio_chip = {
> diff --git a/drivers/gpio/gpio-sch311x.c b/drivers/gpio/gpio-sch311x.c
> index 8ecf336c9af4..da01e1cad7cb 100644
> --- a/drivers/gpio/gpio-sch311x.c
> +++ b/drivers/gpio/gpio-sch311x.c
> @@ -228,7 +228,10 @@ static int sch311x_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   	data = inb(block->runtime_reg + block->config_regs[offset]);
>   	spin_unlock(&block->lock);
>   
> -	return !!(data & SCH311X_GPIO_CONF_DIR);
> +	if (data & SCH311X_GPIO_CONF_DIR)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int sch311x_gpio_set_config(struct gpio_chip *chip, unsigned offset,
> diff --git a/drivers/gpio/gpio-siox.c b/drivers/gpio/gpio-siox.c
> index 006a7e6a75f2..311f66757b92 100644
> --- a/drivers/gpio/gpio-siox.c
> +++ b/drivers/gpio/gpio-siox.c
> @@ -203,9 +203,9 @@ static int gpio_siox_direction_output(struct gpio_chip *chip,
>   static int gpio_siox_get_direction(struct gpio_chip *chip, unsigned int offset)
>   {
>   	if (offset < 12)
> -		return 1; /* input */
> +		return GPIO_LINE_DIRECTION_IN;
>   	else
> -		return 0; /* output */
> +		return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int gpio_siox_probe(struct siox_device *sdevice)
> diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c
> index 994d542daf53..542706a852e6 100644
> --- a/drivers/gpio/gpio-stmpe.c
> +++ b/drivers/gpio/gpio-stmpe.c
> @@ -84,7 +84,10 @@ static int stmpe_gpio_get_direction(struct gpio_chip *chip,
>   	if (ret < 0)
>   		return ret;
>   
> -	return !(ret & mask);
> +	if (ret & mask)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int stmpe_gpio_direction_output(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-tc3589x.c b/drivers/gpio/gpio-tc3589x.c
> index 75b1135b383a..6be0684cfa49 100644
> --- a/drivers/gpio/gpio-tc3589x.c
> +++ b/drivers/gpio/gpio-tc3589x.c
> @@ -97,7 +97,10 @@ static int tc3589x_gpio_get_direction(struct gpio_chip *chip,
>   	if (ret < 0)
>   		return ret;
>   
> -	return !(ret & BIT(pos));
> +	if (ret & BIT(pos))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int tc3589x_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
> diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c
> index 8a01d3694b28..6fdfe4c5303e 100644
> --- a/drivers/gpio/gpio-tegra.c
> +++ b/drivers/gpio/gpio-tegra.c
> @@ -215,7 +215,10 @@ static int tegra_gpio_get_direction(struct gpio_chip *chip,
>   
>   	oe = tegra_gpio_readl(tgi, GPIO_OE(tgi, offset));
>   
> -	return !(oe & pin_mask);
> +	if (oe & pin_mask)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int tegra_gpio_set_debounce(struct gpio_chip *chip, unsigned int offset,
> diff --git a/drivers/gpio/gpio-tegra186.c b/drivers/gpio/gpio-tegra186.c
> index 8a2a69178925..57185b96c110 100644
> --- a/drivers/gpio/gpio-tegra186.c
> +++ b/drivers/gpio/gpio-tegra186.c
> @@ -111,9 +111,9 @@ static int tegra186_gpio_get_direction(struct gpio_chip *chip,
>   
>   	value = readl(base + TEGRA186_GPIO_ENABLE_CONFIG);
>   	if (value & TEGRA186_GPIO_ENABLE_CONFIG_OUT)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>   
> -	return 1;
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int tegra186_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-thunderx.c b/drivers/gpio/gpio-thunderx.c
> index ddad5c7ea617..d08d86a22b1f 100644
> --- a/drivers/gpio/gpio-thunderx.c
> +++ b/drivers/gpio/gpio-thunderx.c
> @@ -169,7 +169,10 @@ static int thunderx_gpio_get_direction(struct gpio_chip *chip, unsigned int line
>   
>   	bit_cfg = readq(txgpio->register_base + bit_cfg_reg(line));
>   
> -	return !(bit_cfg & GPIO_BIT_CFG_TX_OE);
> +	if (bit_cfg & GPIO_BIT_CFG_TX_OE)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int thunderx_gpio_set_config(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-tpic2810.c b/drivers/gpio/gpio-tpic2810.c
> index c8b34d787eed..99d5a84a9129 100644
> --- a/drivers/gpio/gpio-tpic2810.c
> +++ b/drivers/gpio/gpio-tpic2810.c
> @@ -39,7 +39,7 @@ static int tpic2810_get_direction(struct gpio_chip *chip,
>   				  unsigned offset)
>   {
>   	/* This device always output */
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int tpic2810_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-tps65086.c b/drivers/gpio/gpio-tps65086.c
> index 2eea98ff4ea3..1e9d8262d0ff 100644
> --- a/drivers/gpio/gpio-tps65086.c
> +++ b/drivers/gpio/gpio-tps65086.c
> @@ -21,7 +21,7 @@ static int tps65086_gpio_get_direction(struct gpio_chip *chip,
>   				       unsigned offset)
>   {
>   	/* This device is output only */
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int tps65086_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-tps65912.c b/drivers/gpio/gpio-tps65912.c
> index 3ad68bd78282..510d9ed9fd2a 100644
> --- a/drivers/gpio/gpio-tps65912.c
> +++ b/drivers/gpio/gpio-tps65912.c
> @@ -32,9 +32,9 @@ static int tps65912_gpio_get_direction(struct gpio_chip *gc,
>   		return ret;
>   
>   	if (val & GPIO_CFG_MASK)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>   	else
> -		return 1;
> +		return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int tps65912_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
> diff --git a/drivers/gpio/gpio-tps68470.c b/drivers/gpio/gpio-tps68470.c
> index aff6e504c666..f7f5f770e0fb 100644
> --- a/drivers/gpio/gpio-tps68470.c
> +++ b/drivers/gpio/gpio-tps68470.c
> @@ -47,7 +47,6 @@ static int tps68470_gpio_get(struct gpio_chip *gc, unsigned int offset)
>   	return !!(val & BIT(offset));
>   }
>   
> -/* Return 0 if output, 1 if input */
>   static int tps68470_gpio_get_direction(struct gpio_chip *gc,
>   				       unsigned int offset)
>   {
> @@ -57,7 +56,7 @@ static int tps68470_gpio_get_direction(struct gpio_chip *gc,
>   
>   	/* rest are always outputs */
>   	if (offset >= TPS68470_N_REGULAR_GPIO)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>   
>   	ret = regmap_read(regmap, TPS68470_GPIO_CTL_REG_A(offset), &val);
>   	if (ret) {
> @@ -67,7 +66,8 @@ static int tps68470_gpio_get_direction(struct gpio_chip *gc,
>   	}
>   
>   	val &= TPS68470_GPIO_MODE_MASK;
> -	return val >= TPS68470_GPIO_MODE_OUT_CMOS ? 0 : 1;
> +	return val >= TPS68470_GPIO_MODE_OUT_CMOS ? GPIO_LINE_DIRECTION_OUT :
> +						    GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static void tps68470_gpio_set(struct gpio_chip *gc, unsigned int offset,
> diff --git a/drivers/gpio/gpio-tqmx86.c b/drivers/gpio/gpio-tqmx86.c
> index a3109bcaa0ac..5022e0ad0fae 100644
> --- a/drivers/gpio/gpio-tqmx86.c
> +++ b/drivers/gpio/gpio-tqmx86.c
> @@ -101,7 +101,10 @@ static int tqmx86_gpio_direction_output(struct gpio_chip *chip,
>   static int tqmx86_gpio_get_direction(struct gpio_chip *chip,
>   				     unsigned int offset)
>   {
> -	return !!(TQMX86_DIR_INPUT_MASK & BIT(offset));
> +	if (TQMX86_DIR_INPUT_MASK & BIT(offset))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static void tqmx86_gpio_irq_mask(struct irq_data *data)
> diff --git a/drivers/gpio/gpio-ts4900.c b/drivers/gpio/gpio-ts4900.c
> index 1da8d0586329..d885032cf814 100644
> --- a/drivers/gpio/gpio-ts4900.c
> +++ b/drivers/gpio/gpio-ts4900.c
> @@ -44,7 +44,10 @@ static int ts4900_gpio_get_direction(struct gpio_chip *chip,
>   
>   	regmap_read(priv->regmap, offset, &reg);
>   
> -	return !(reg & TS4900_GPIO_OE);
> +	if (reg & TS4900_GPIO_OE)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int ts4900_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c
> index fbfb648d3502..de249726230e 100644
> --- a/drivers/gpio/gpio-twl4030.c
> +++ b/drivers/gpio/gpio-twl4030.c
> @@ -165,10 +165,10 @@ static int twl4030_get_gpio_direction(int gpio)
>   	if (ret < 0)
>   		return ret;
>   
> -	/* 1 = output, but gpiolib semantics are inverse so invert */
> -	ret = !(ret & d_msk);
> +	if (ret & d_msk)
> +		return GPIO_LINE_DIRECTION_OUT;
>   
> -	return ret;
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int twl4030_set_gpio_dataout(int gpio, int enable)
> @@ -380,10 +380,10 @@ static int twl_get_direction(struct gpio_chip *chip, unsigned offset)
>   {
>   	struct gpio_twl4030_priv *priv = gpiochip_get_data(chip);
>   	/*
> -	 * Default 0 = output
> +	 * Default GPIO_LINE_DIRECTION_OUT
>   	 * LED GPIOs >= TWL4030_GPIO_MAX are always output
>   	 */
> -	int ret = 0;
> +	int ret = GPIO_LINE_DIRECTION_OUT;
>   
>   	mutex_lock(&priv->mutex);
>   	if (offset < TWL4030_GPIO_MAX) {
> diff --git a/drivers/gpio/gpio-twl6040.c b/drivers/gpio/gpio-twl6040.c
> index c845b2ff1f43..648fb418d775 100644
> --- a/drivers/gpio/gpio-twl6040.c
> +++ b/drivers/gpio/gpio-twl6040.c
> @@ -34,8 +34,7 @@ static int twl6040gpo_get(struct gpio_chip *chip, unsigned offset)
>   
>   static int twl6040gpo_get_direction(struct gpio_chip *chip, unsigned offset)
>   {
> -	/* This means "out" */
> -	return 0;
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int twl6040gpo_direction_out(struct gpio_chip *chip, unsigned offset,
> diff --git a/drivers/gpio/gpio-uniphier.c b/drivers/gpio/gpio-uniphier.c
> index 93cdcc41e9fb..bd203e8fa58e 100644
> --- a/drivers/gpio/gpio-uniphier.c
> +++ b/drivers/gpio/gpio-uniphier.c
> @@ -113,7 +113,10 @@ static int uniphier_gpio_offset_read(struct gpio_chip *chip,
>   static int uniphier_gpio_get_direction(struct gpio_chip *chip,
>   				       unsigned int offset)
>   {
> -	return uniphier_gpio_offset_read(chip, offset, UNIPHIER_GPIO_PORT_DIR);
> +	if (uniphier_gpio_offset_read(chip, offset, UNIPHIER_GPIO_PORT_DIR))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int uniphier_gpio_direction_input(struct gpio_chip *chip,
> diff --git a/drivers/gpio/gpio-wcove.c b/drivers/gpio/gpio-wcove.c
> index 444fe9e7f04a..8b481b3c1ebe 100644
> --- a/drivers/gpio/gpio-wcove.c
> +++ b/drivers/gpio/gpio-wcove.c
> @@ -170,13 +170,16 @@ static int wcove_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio)
>   	int ret, reg = to_reg(gpio, CTRL_OUT);
>   
>   	if (reg < 0)
> -		return 0;
> +		return GPIO_LINE_DIRECTION_OUT;
>   
>   	ret = regmap_read(wg->regmap, reg, &val);
>   	if (ret)
>   		return ret;
>   
> -	return !(val & CTLO_DIR_OUT);
> +	if (val & CTLO_DIR_OUT)
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   static int wcove_gpio_get(struct gpio_chip *chip, unsigned int gpio)
> diff --git a/drivers/gpio/gpio-ws16c48.c b/drivers/gpio/gpio-ws16c48.c
> index e0ef66b6a237..fe456bea81f6 100644
> --- a/drivers/gpio/gpio-ws16c48.c
> +++ b/drivers/gpio/gpio-ws16c48.c
> @@ -56,7 +56,10 @@ static int ws16c48_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>   	const unsigned port = offset / 8;
>   	const unsigned mask = BIT(offset % 8);
>   
> -	return !!(ws16c48gpio->io_state[port] & mask);
> +	if (ws16c48gpio->io_state[port] & mask)
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int ws16c48_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
> diff --git a/drivers/gpio/gpio-xgene.c b/drivers/gpio/gpio-xgene.c
> index a6e66ac18e1f..532b0df8a1f2 100644
> --- a/drivers/gpio/gpio-xgene.c
> +++ b/drivers/gpio/gpio-xgene.c
> @@ -80,7 +80,10 @@ static int xgene_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>   	bank_offset = GPIO_SET_DR_OFFSET + GPIO_BANK_OFFSET(offset);
>   	bit_offset = GPIO_BIT_OFFSET(offset);
>   
> -	return !!(ioread32(chip->base + bank_offset) & BIT(bit_offset));
> +	if (ioread32(chip->base + bank_offset) & BIT(bit_offset))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int xgene_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
> diff --git a/drivers/gpio/gpio-xra1403.c b/drivers/gpio/gpio-xra1403.c
> index 05f1998c11a4..31b5072b2df0 100644
> --- a/drivers/gpio/gpio-xra1403.c
> +++ b/drivers/gpio/gpio-xra1403.c
> @@ -83,7 +83,10 @@ static int xra1403_get_direction(struct gpio_chip *chip, unsigned int offset)
>   	if (ret)
>   		return ret;
>   
> -	return !!(val & BIT(offset % 8));
> +	if (val & BIT(offset % 8))
> +		return GPIO_LINE_DIRECTION_IN;
> +
> +	return GPIO_LINE_DIRECTION_OUT;
>   }
>   
>   static int xra1403_get(struct gpio_chip *chip, unsigned int offset)
> diff --git a/drivers/gpio/gpio-xtensa.c b/drivers/gpio/gpio-xtensa.c
> index 43d3fa5f511a..08d7c3b32038 100644
> --- a/drivers/gpio/gpio-xtensa.c
> +++ b/drivers/gpio/gpio-xtensa.c
> @@ -72,7 +72,7 @@ static inline void disable_cp(unsigned long flags, unsigned long cpenable)
>   
>   static int xtensa_impwire_get_direction(struct gpio_chip *gc, unsigned offset)
>   {
> -	return 1; /* input only */
> +	return GPIO_LINE_DIRECTION_IN; /* input only */
>   }
>   
>   static int xtensa_impwire_get_value(struct gpio_chip *gc, unsigned offset)
> @@ -95,7 +95,7 @@ static void xtensa_impwire_set_value(struct gpio_chip *gc, unsigned offset,
>   
>   static int xtensa_expstate_get_direction(struct gpio_chip *gc, unsigned offset)
>   {
> -	return 0; /* output only */
> +	return GPIO_LINE_DIRECTION_OUT; /* output only */
>   }
>   
>   static int xtensa_expstate_get_value(struct gpio_chip *gc, unsigned offset)
> diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c
> index cd475ff4bcad..4c3f6370eab4 100644
> --- a/drivers/gpio/gpio-zynq.c
> +++ b/drivers/gpio/gpio-zynq.c
> @@ -360,7 +360,7 @@ static int zynq_gpio_dir_out(struct gpio_chip *chip, unsigned int pin,
>    *
>    * This function returns the direction of the specified GPIO.
>    *
> - * Return: 0 for output, 1 for input
> + * Return: GPIO_LINE_DIRECTION_OUT or GPIO_LINE_DIRECTION_IN
>    */
>   static int zynq_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
>   {
> @@ -372,7 +372,10 @@ static int zynq_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
>   
>   	reg = readl_relaxed(gpio->base_addr + ZYNQ_GPIO_DIRM_OFFSET(bank_num));
>   
> -	return !(reg & BIT(bank_pin_num));
> +	if (reg & BIT(bank_pin_num))
> +		return GPIO_LINE_DIRECTION_OUT;
> +
> +	return GPIO_LINE_DIRECTION_IN;
>   }
>   
>   /**
diff mbox series

Patch

diff --git a/drivers/gpio/gpio-104-dio-48e.c b/drivers/gpio/gpio-104-dio-48e.c
index a44fa8af5b0d..400c09b905f8 100644
--- a/drivers/gpio/gpio-104-dio-48e.c
+++ b/drivers/gpio/gpio-104-dio-48e.c
@@ -59,7 +59,10 @@  static int dio48e_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 	const unsigned port = offset / 8;
 	const unsigned mask = BIT(offset % 8);
 
-	return !!(dio48egpio->io_state[port] & mask);
+	if (dio48egpio->io_state[port] & mask)
+		return  GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int dio48e_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
diff --git a/drivers/gpio/gpio-104-idi-48.c b/drivers/gpio/gpio-104-idi-48.c
index 79dead61e776..c50329ab493a 100644
--- a/drivers/gpio/gpio-104-idi-48.c
+++ b/drivers/gpio/gpio-104-idi-48.c
@@ -53,7 +53,7 @@  struct idi_48_gpio {
 
 static int idi_48_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 {
-	return 1;
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int idi_48_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
diff --git a/drivers/gpio/gpio-104-idio-16.c b/drivers/gpio/gpio-104-idio-16.c
index 8d2f51cd9d91..5752d9dab148 100644
--- a/drivers/gpio/gpio-104-idio-16.c
+++ b/drivers/gpio/gpio-104-idio-16.c
@@ -51,9 +51,9 @@  struct idio_16_gpio {
 static int idio_16_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 {
 	if (offset > 15)
-		return 1;
+		return GPIO_LINE_DIRECTION_IN;
 
-	return 0;
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int idio_16_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
diff --git a/drivers/gpio/gpio-74xx-mmio.c b/drivers/gpio/gpio-74xx-mmio.c
index 83a2286d93f6..173e06758e6c 100644
--- a/drivers/gpio/gpio-74xx-mmio.c
+++ b/drivers/gpio/gpio-74xx-mmio.c
@@ -77,7 +77,10 @@  static int mmio_74xx_get_direction(struct gpio_chip *gc, unsigned offset)
 {
 	struct mmio_74xx_gpio_priv *priv = gpiochip_get_data(gc);
 
-	return !(priv->flags & MMIO_74XX_DIR_OUT);
+	if (priv->flags & MMIO_74XX_DIR_OUT)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return  GPIO_LINE_DIRECTION_IN;
 }
 
 static int mmio_74xx_dir_in(struct gpio_chip *gc, unsigned int gpio)
diff --git a/drivers/gpio/gpio-amd-fch.c b/drivers/gpio/gpio-amd-fch.c
index 181df1581df5..4e44ba4d7423 100644
--- a/drivers/gpio/gpio-amd-fch.c
+++ b/drivers/gpio/gpio-amd-fch.c
@@ -92,7 +92,7 @@  static int amd_fch_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
 	ret = (readl_relaxed(ptr) & AMD_FCH_GPIO_FLAG_DIRECTION);
 	spin_unlock_irqrestore(&priv->lock, flags);
 
-	return ret;
+	return ret ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
 }
 
 static void amd_fch_gpio_set(struct gpio_chip *gc,
diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c
index 09e53c5f3b0a..f1037b61f763 100644
--- a/drivers/gpio/gpio-aspeed.c
+++ b/drivers/gpio/gpio-aspeed.c
@@ -487,10 +487,10 @@  static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
 	u32 val;
 
 	if (!have_input(gpio, offset))
-		return 0;
+		return GPIO_LINE_DIRECTION_OUT;
 
 	if (!have_output(gpio, offset))
-		return 1;
+		return GPIO_LINE_DIRECTION_IN;
 
 	spin_lock_irqsave(&gpio->lock, flags);
 
@@ -498,8 +498,7 @@  static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
 
 	spin_unlock_irqrestore(&gpio->lock, flags);
 
-	return !val;
-
+	return val ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN;
 }
 
 static inline int irqd_to_aspeed_gpio_data(struct irq_data *d,
diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c
index 9fa6d3a967d2..4122683eb1f9 100644
--- a/drivers/gpio/gpio-bcm-kona.c
+++ b/drivers/gpio/gpio-bcm-kona.c
@@ -127,7 +127,7 @@  static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio)
 	u32 val;
 
 	val = readl(reg_base + GPIO_CONTROL(gpio)) & GPIO_GPCTR0_IOTR_MASK;
-	return !!val;
+	return val ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
 }
 
 static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
@@ -144,7 +144,7 @@  static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
 	raw_spin_lock_irqsave(&kona_gpio->lock, flags);
 
 	/* this function only applies to output pin */
-	if (bcm_kona_gpio_get_dir(chip, gpio) == 1)
+	if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN)
 		goto out;
 
 	reg_offset = value ? GPIO_OUT_SET(bank_id) : GPIO_OUT_CLEAR(bank_id);
@@ -170,7 +170,7 @@  static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio)
 	reg_base = kona_gpio->reg_base;
 	raw_spin_lock_irqsave(&kona_gpio->lock, flags);
 
-	if (bcm_kona_gpio_get_dir(chip, gpio) == 1)
+	if (bcm_kona_gpio_get_dir(chip, gpio) == GPIO_LINE_DIRECTION_IN)
 		reg_offset = GPIO_IN_STATUS(bank_id);
 	else
 		reg_offset = GPIO_OUT_STATUS(bank_id);
diff --git a/drivers/gpio/gpio-bd70528.c b/drivers/gpio/gpio-bd70528.c
index 0c1ead12d883..734be6b752d0 100644
--- a/drivers/gpio/gpio-bd70528.c
+++ b/drivers/gpio/gpio-bd70528.c
@@ -54,8 +54,10 @@  static int bd70528_get_direction(struct gpio_chip *chip, unsigned int offset)
 		dev_err(bdgpio->chip.dev, "Could not read gpio direction\n");
 		return ret;
 	}
+	if (val & BD70528_GPIO_OUT_EN_MASK)
+		return GPIO_LINE_DIRECTION_OUT;
 
-	return !(val & BD70528_GPIO_OUT_EN_MASK);
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int bd70528_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
@@ -166,9 +168,9 @@  static int bd70528_gpio_get(struct gpio_chip *chip, unsigned int offset)
 	 * locking would make no sense.
 	 */
 	ret = bd70528_get_direction(chip, offset);
-	if (ret == 0)
+	if (ret == GPIO_LINE_DIRECTION_OUT)
 		ret = bd70528_gpio_get_o(bdgpio, offset);
-	else if (ret == 1)
+	else if (ret == GPIO_LINE_DIRECTION_IN)
 		ret = bd70528_gpio_get_i(bdgpio, offset);
 	else
 		dev_err(bdgpio->chip.dev, "failed to read GPIO direction\n");
diff --git a/drivers/gpio/gpio-bd9571mwv.c b/drivers/gpio/gpio-bd9571mwv.c
index 5224a946e8ab..c0abc9c6851b 100644
--- a/drivers/gpio/gpio-bd9571mwv.c
+++ b/drivers/gpio/gpio-bd9571mwv.c
@@ -37,8 +37,10 @@  static int bd9571mwv_gpio_get_direction(struct gpio_chip *chip,
 	ret = regmap_read(gpio->bd->regmap, BD9571MWV_GPIO_DIR, &val);
 	if (ret < 0)
 		return ret;
+	if (val & BIT(offset))
+		return GPIO_LINE_DIRECTION_IN;
 
-	return val & BIT(offset);
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int bd9571mwv_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-dln2.c b/drivers/gpio/gpio-dln2.c
index 8a33c2fc174d..26b40c8b8a12 100644
--- a/drivers/gpio/gpio-dln2.c
+++ b/drivers/gpio/gpio-dln2.c
@@ -200,9 +200,9 @@  static int dln2_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 	struct dln2_gpio *dln2 = gpiochip_get_data(chip);
 
 	if (test_bit(offset, dln2->output_enabled))
-		return 0;
+		return GPIO_LINE_DIRECTION_OUT;
 
-	return 1;
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int dln2_gpio_get(struct gpio_chip *chip, unsigned int offset)
@@ -214,7 +214,7 @@  static int dln2_gpio_get(struct gpio_chip *chip, unsigned int offset)
 	if (dir < 0)
 		return dir;
 
-	if (dir == 1)
+	if (dir == GPIO_LINE_DIRECTION_IN)
 		return dln2_gpio_pin_get_in_val(dln2, offset);
 
 	return dln2_gpio_pin_get_out_val(dln2, offset);
diff --git a/drivers/gpio/gpio-exar.c b/drivers/gpio/gpio-exar.c
index fae327d5b06e..da1ef0b1c291 100644
--- a/drivers/gpio/gpio-exar.c
+++ b/drivers/gpio/gpio-exar.c
@@ -77,7 +77,10 @@  static int exar_get_direction(struct gpio_chip *chip, unsigned int offset)
 		EXAR_OFFSET_MPIOSEL_HI : EXAR_OFFSET_MPIOSEL_LO;
 	unsigned int bit  = (offset + exar_gpio->first_pin) % 8;
 
-	return !!(exar_get(chip, addr) & BIT(bit));
+	if (exar_get(chip, addr) & BIT(bit))
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int exar_get_value(struct gpio_chip *chip, unsigned int offset)
diff --git a/drivers/gpio/gpio-f7188x.c b/drivers/gpio/gpio-f7188x.c
index fdc639f856f1..cadd02993539 100644
--- a/drivers/gpio/gpio-f7188x.c
+++ b/drivers/gpio/gpio-f7188x.c
@@ -250,7 +250,10 @@  static int f7188x_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 
 	superio_exit(sio->addr);
 
-	return !(dir & 1 << offset);
+	if (dir & 1 << offset)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int f7188x_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
diff --git a/drivers/gpio/gpio-gpio-mm.c b/drivers/gpio/gpio-gpio-mm.c
index 78a1db24e931..c22d6f94129c 100644
--- a/drivers/gpio/gpio-gpio-mm.c
+++ b/drivers/gpio/gpio-gpio-mm.c
@@ -52,7 +52,10 @@  static int gpiomm_gpio_get_direction(struct gpio_chip *chip,
 	const unsigned int port = offset / 8;
 	const unsigned int mask = BIT(offset % 8);
 
-	return !!(gpiommgpio->io_state[port] & mask);
+	if (gpiommgpio->io_state[port] & mask)
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int gpiomm_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-htc-egpio.c b/drivers/gpio/gpio-htc-egpio.c
index 8aa23d70b1e6..a40bd56673fe 100644
--- a/drivers/gpio/gpio-htc-egpio.c
+++ b/drivers/gpio/gpio-htc-egpio.c
@@ -220,7 +220,10 @@  static int egpio_get_direction(struct gpio_chip *chip, unsigned offset)
 
 	egpio = gpiochip_get_data(chip);
 
-	return !test_bit(offset, &egpio->is_out);
+	if (test_bit(offset, &egpio->is_out))
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static void egpio_write_cache(struct egpio_info *ei)
diff --git a/drivers/gpio/gpio-ich.c b/drivers/gpio/gpio-ich.c
index 90bf7742f9b0..2f086d0aa1f4 100644
--- a/drivers/gpio/gpio-ich.c
+++ b/drivers/gpio/gpio-ich.c
@@ -159,7 +159,10 @@  static bool ichx_gpio_check_available(struct gpio_chip *gpio, unsigned nr)
 
 static int ichx_gpio_get_direction(struct gpio_chip *gpio, unsigned nr)
 {
-	return ichx_read_bit(GPIO_IO_SEL, nr);
+	if (ichx_read_bit(GPIO_IO_SEL, nr))
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int ichx_gpio_direction_input(struct gpio_chip *gpio, unsigned nr)
diff --git a/drivers/gpio/gpio-kempld.c b/drivers/gpio/gpio-kempld.c
index ef51638f3f75..4ea15f08e0f4 100644
--- a/drivers/gpio/gpio-kempld.c
+++ b/drivers/gpio/gpio-kempld.c
@@ -104,7 +104,10 @@  static int kempld_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 	struct kempld_gpio_data *gpio = gpiochip_get_data(chip);
 	struct kempld_device_data *pld = gpio->pld;
 
-	return !kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset);
+	if (kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset))
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int kempld_gpio_pincount(struct kempld_device_data *pld)
diff --git a/drivers/gpio/gpio-lp873x.c b/drivers/gpio/gpio-lp873x.c
index 801995dd9b26..70fad87ff2db 100644
--- a/drivers/gpio/gpio-lp873x.c
+++ b/drivers/gpio/gpio-lp873x.c
@@ -33,7 +33,7 @@  static int lp873x_gpio_get_direction(struct gpio_chip *chip,
 				     unsigned int offset)
 {
 	/* This device is output only */
-	return 0;
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int lp873x_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-lp87565.c b/drivers/gpio/gpio-lp87565.c
index a121c8f10610..e1244520cf7d 100644
--- a/drivers/gpio/gpio-lp87565.c
+++ b/drivers/gpio/gpio-lp87565.c
@@ -57,7 +57,10 @@  static int lp87565_gpio_get_direction(struct gpio_chip *chip,
 	if (ret < 0)
 		return ret;
 
-	return !(val & BIT(offset));
+	if (val & BIT(offset))
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int lp87565_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-madera.c b/drivers/gpio/gpio-madera.c
index 7086f8b5388f..8f38303fcbc4 100644
--- a/drivers/gpio/gpio-madera.c
+++ b/drivers/gpio/gpio-madera.c
@@ -34,7 +34,10 @@  static int madera_gpio_get_direction(struct gpio_chip *chip,
 	if (ret < 0)
 		return ret;
 
-	return !!(val & MADERA_GP1_DIR_MASK);
+	if (val & MADERA_GP1_DIR_MASK)
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int madera_gpio_direction_in(struct gpio_chip *chip, unsigned int offset)
diff --git a/drivers/gpio/gpio-max3191x.c b/drivers/gpio/gpio-max3191x.c
index 4b4b2ceb82fc..0696d5a21431 100644
--- a/drivers/gpio/gpio-max3191x.c
+++ b/drivers/gpio/gpio-max3191x.c
@@ -94,7 +94,7 @@  DECLARE_CRC8_TABLE(max3191x_crc8);
 
 static int max3191x_get_direction(struct gpio_chip *gpio, unsigned int offset)
 {
-	return 1; /* always in */
+	return GPIO_LINE_DIRECTION_IN; /* always in */
 }
 
 static int max3191x_direction_input(struct gpio_chip *gpio, unsigned int offset)
diff --git a/drivers/gpio/gpio-merrifield.c b/drivers/gpio/gpio-merrifield.c
index 2f1e9da81c1e..d4fa6e9560f3 100644
--- a/drivers/gpio/gpio-merrifield.c
+++ b/drivers/gpio/gpio-merrifield.c
@@ -162,7 +162,10 @@  static int mrfld_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
 {
 	void __iomem *gpdr = gpio_reg(chip, offset, GPDR);
 
-	return !(readl(gpdr) & BIT(offset % 32));
+	if (readl(gpdr) & BIT(offset % 32))
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int mrfld_gpio_set_debounce(struct gpio_chip *chip, unsigned int offset,
diff --git a/drivers/gpio/gpio-mmio.c b/drivers/gpio/gpio-mmio.c
index 6f904c874678..cd07c948649f 100644
--- a/drivers/gpio/gpio-mmio.c
+++ b/drivers/gpio/gpio-mmio.c
@@ -370,15 +370,24 @@  static int bgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
 static int bgpio_get_dir(struct gpio_chip *gc, unsigned int gpio)
 {
 	/* Return 0 if output, 1 if input */
-	if (gc->bgpio_dir_unreadable)
-		return !(gc->bgpio_dir & bgpio_line2mask(gc, gpio));
-	if (gc->reg_dir_out)
-		return !(gc->read_reg(gc->reg_dir_out) & bgpio_line2mask(gc, gpio));
+	if (gc->bgpio_dir_unreadable) {
+		if (gc->bgpio_dir & bgpio_line2mask(gc, gpio))
+			return GPIO_LINE_DIRECTION_OUT;
+		return GPIO_LINE_DIRECTION_IN;
+	}
+
+	if (gc->reg_dir_out) {
+		if (gc->read_reg(gc->reg_dir_out) & bgpio_line2mask(gc, gpio))
+			return GPIO_LINE_DIRECTION_OUT;
+		return GPIO_LINE_DIRECTION_IN;
+	}
+
 	if (gc->reg_dir_in)
-		return !!(gc->read_reg(gc->reg_dir_in) & bgpio_line2mask(gc, gpio));
+		if (!(gc->read_reg(gc->reg_dir_in) & bgpio_line2mask(gc, gpio)))
+			return GPIO_LINE_DIRECTION_OUT;
 
 	/* This should not happen */
-	return 1;
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int bgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c
index 213aedc97dc2..47c172b2f5ad 100644
--- a/drivers/gpio/gpio-mockup.c
+++ b/drivers/gpio/gpio-mockup.c
@@ -34,14 +34,9 @@ 
 
 #define gpio_mockup_err(...)	pr_err(GPIO_MOCKUP_NAME ": " __VA_ARGS__)
 
-enum {
-	GPIO_MOCKUP_DIR_IN = 0,
-	GPIO_MOCKUP_DIR_OUT = 1,
-};
-
 /*
  * struct gpio_pin_status - structure describing a GPIO status
- * @dir:       Configures direction of gpio as "in" or "out", 0=in, 1=out
+ * @dir:       Configures direction of gpio as "in" or "out"
  * @value:     Configures status of the gpio as 0(low) or 1(high)
  */
 struct gpio_mockup_line_status {
@@ -152,7 +147,7 @@  static int gpio_mockup_dirout(struct gpio_chip *gc,
 	struct gpio_mockup_chip *chip = gpiochip_get_data(gc);
 
 	mutex_lock(&chip->lock);
-	chip->lines[offset].dir = GPIO_MOCKUP_DIR_OUT;
+	chip->lines[offset].dir = GPIO_LINE_DIRECTION_OUT;
 	__gpio_mockup_set(chip, offset, value);
 	mutex_unlock(&chip->lock);
 
@@ -164,7 +159,7 @@  static int gpio_mockup_dirin(struct gpio_chip *gc, unsigned int offset)
 	struct gpio_mockup_chip *chip = gpiochip_get_data(gc);
 
 	mutex_lock(&chip->lock);
-	chip->lines[offset].dir = GPIO_MOCKUP_DIR_IN;
+	chip->lines[offset].dir = GPIO_LINE_DIRECTION_IN;
 	mutex_unlock(&chip->lock);
 
 	return 0;
diff --git a/drivers/gpio/gpio-moxtet.c b/drivers/gpio/gpio-moxtet.c
index 3fd729994a38..8299909318f4 100644
--- a/drivers/gpio/gpio-moxtet.c
+++ b/drivers/gpio/gpio-moxtet.c
@@ -78,9 +78,9 @@  static int moxtet_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
 
 	/* All lines are hard wired to be either input or output, not both. */
 	if (chip->desc->in_mask & BIT(offset))
-		return 1;
+		return GPIO_LINE_DIRECTION_IN;
 	else if (chip->desc->out_mask & BIT(offset))
-		return 0;
+		return GPIO_LINE_DIRECTION_OUT;
 	else
 		return -EINVAL;
 }
diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
index 6c0687694341..9b2adf0ef880 100644
--- a/drivers/gpio/gpio-mvebu.c
+++ b/drivers/gpio/gpio-mvebu.c
@@ -384,7 +384,10 @@  static int mvebu_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
 
 	regmap_read(mvchip->regs, GPIO_IO_CONF_OFF + mvchip->offset, &u);
 
-	return !!(u & BIT(pin));
+	if (u & BIT(pin))
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int mvebu_gpio_to_irq(struct gpio_chip *chip, unsigned int pin)
diff --git a/drivers/gpio/gpio-mxs.c b/drivers/gpio/gpio-mxs.c
index 5e5437a2c607..c4a314c68555 100644
--- a/drivers/gpio/gpio-mxs.c
+++ b/drivers/gpio/gpio-mxs.c
@@ -248,7 +248,10 @@  static int mxs_gpio_get_direction(struct gpio_chip *gc, unsigned offset)
 	u32 dir;
 
 	dir = readl(port->base + PINCTRL_DOE(port));
-	return !(dir & mask);
+	if (dir & mask)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static const struct platform_device_id mxs_gpio_ids[] = {
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index d0f27084a942..3bd8adaeed9e 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -805,8 +805,10 @@  static int omap_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 {
 	struct gpio_bank *bank = gpiochip_get_data(chip);
 
-	return !!(readl_relaxed(bank->base + bank->regs->direction) &
-		  BIT(offset));
+	if (readl_relaxed(bank->base + bank->regs->direction) & BIT(offset))
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int omap_gpio_input(struct gpio_chip *chip, unsigned offset)
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
index de5d1383f28d..82122c3c688a 100644
--- a/drivers/gpio/gpio-pca953x.c
+++ b/drivers/gpio/gpio-pca953x.c
@@ -449,7 +449,10 @@  static int pca953x_gpio_get_direction(struct gpio_chip *gc, unsigned off)
 	if (ret < 0)
 		return ret;
 
-	return !!(reg_val & bit);
+	if (reg_val & bit)
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
diff --git a/drivers/gpio/gpio-pci-idio-16.c b/drivers/gpio/gpio-pci-idio-16.c
index 5aa136a6a3e0..df51dd08bdfe 100644
--- a/drivers/gpio/gpio-pci-idio-16.c
+++ b/drivers/gpio/gpio-pci-idio-16.c
@@ -61,9 +61,9 @@  static int idio_16_gpio_get_direction(struct gpio_chip *chip,
 	unsigned int offset)
 {
 	if (offset > 15)
-		return 1;
+		return GPIO_LINE_DIRECTION_IN;
 
-	return 0;
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int idio_16_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-pcie-idio-24.c b/drivers/gpio/gpio-pcie-idio-24.c
index 52f1647a46fd..44c1e4fc489f 100644
--- a/drivers/gpio/gpio-pcie-idio-24.c
+++ b/drivers/gpio/gpio-pcie-idio-24.c
@@ -104,15 +104,18 @@  static int idio_24_gpio_get_direction(struct gpio_chip *chip,
 
 	/* FET Outputs */
 	if (offset < 24)
-		return 0;
+		return GPIO_LINE_DIRECTION_OUT;
 
 	/* Isolated Inputs */
 	if (offset < 48)
-		return 1;
+		return GPIO_LINE_DIRECTION_IN;
 
 	/* TTL/CMOS I/O */
 	/* OUT MODE = 1 when TTL/CMOS Output Mode is set */
-	return !(ioread8(&idio24gpio->reg->ctl) & out_mode_mask);
+	if (ioread8(&idio24gpio->reg->ctl) & out_mode_mask)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int idio_24_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-pisosr.c b/drivers/gpio/gpio-pisosr.c
index f809a5a8e9eb..1331b2a94679 100644
--- a/drivers/gpio/gpio-pisosr.c
+++ b/drivers/gpio/gpio-pisosr.c
@@ -65,7 +65,7 @@  static int pisosr_gpio_get_direction(struct gpio_chip *chip,
 				     unsigned offset)
 {
 	/* This device always input */
-	return 1;
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int pisosr_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c
index 722ce5cf861e..5df7782e348f 100644
--- a/drivers/gpio/gpio-pl061.c
+++ b/drivers/gpio/gpio-pl061.c
@@ -63,7 +63,10 @@  static int pl061_get_direction(struct gpio_chip *gc, unsigned offset)
 {
 	struct pl061 *pl061 = gpiochip_get_data(gc);
 
-	return !(readb(pl061->base + GPIODIR) & BIT(offset));
+	if (readb(pl061->base + GPIODIR) & BIT(offset))
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int pl061_direction_input(struct gpio_chip *gc, unsigned offset)
diff --git a/drivers/gpio/gpio-raspberrypi-exp.c b/drivers/gpio/gpio-raspberrypi-exp.c
index b77ea16ffa03..bb100e0124e6 100644
--- a/drivers/gpio/gpio-raspberrypi-exp.c
+++ b/drivers/gpio/gpio-raspberrypi-exp.c
@@ -147,7 +147,10 @@  static int rpi_exp_gpio_get_direction(struct gpio_chip *gc, unsigned int off)
 			get.gpio);
 		return ret ? ret : -EIO;
 	}
-	return !get.direction;
+	if (get.direction)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int rpi_exp_gpio_get(struct gpio_chip *gc, unsigned int off)
diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c
index 187984d26f47..d7e6e68c25af 100644
--- a/drivers/gpio/gpio-rcar.c
+++ b/drivers/gpio/gpio-rcar.c
@@ -279,7 +279,10 @@  static int gpio_rcar_get_direction(struct gpio_chip *chip, unsigned int offset)
 {
 	struct gpio_rcar_priv *p = gpiochip_get_data(chip);
 
-	return !(gpio_rcar_read(p, INOUTSEL) & BIT(offset));
+	if (gpio_rcar_read(p, INOUTSEL) & BIT(offset))
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset)
diff --git a/drivers/gpio/gpio-reg.c b/drivers/gpio/gpio-reg.c
index fdc7a9d5b382..d35169bde25a 100644
--- a/drivers/gpio/gpio-reg.c
+++ b/drivers/gpio/gpio-reg.c
@@ -26,7 +26,8 @@  static int gpio_reg_get_direction(struct gpio_chip *gc, unsigned offset)
 {
 	struct gpio_reg *r = to_gpio_reg(gc);
 
-	return r->direction & BIT(offset) ? 1 : 0;
+	return r->direction & BIT(offset) ? GPIO_LINE_DIRECTION_IN :
+					    GPIO_LINE_DIRECTION_OUT;
 }
 
 static int gpio_reg_direction_output(struct gpio_chip *gc, unsigned offset,
diff --git a/drivers/gpio/gpio-sa1100.c b/drivers/gpio/gpio-sa1100.c
index 46b7cf23fb0f..edff5e81489f 100644
--- a/drivers/gpio/gpio-sa1100.c
+++ b/drivers/gpio/gpio-sa1100.c
@@ -53,7 +53,10 @@  static int sa1100_get_direction(struct gpio_chip *chip, unsigned offset)
 {
 	void __iomem *gpdr = sa1100_gpio_chip(chip)->membase + R_GPDR;
 
-	return !(readl_relaxed(gpdr) & BIT(offset));
+	if (readl_relaxed(gpdr) & BIT(offset))
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int sa1100_direction_input(struct gpio_chip *chip, unsigned offset)
diff --git a/drivers/gpio/gpio-sama5d2-piobu.c b/drivers/gpio/gpio-sama5d2-piobu.c
index 7d718557092e..b04c561f3280 100644
--- a/drivers/gpio/gpio-sama5d2-piobu.c
+++ b/drivers/gpio/gpio-sama5d2-piobu.c
@@ -119,7 +119,8 @@  static int sama5d2_piobu_get_direction(struct gpio_chip *chip,
 	if (ret < 0)
 		return ret;
 
-	return (ret == PIOBU_IN) ? 1 : 0;
+	return (ret == PIOBU_IN) ? GPIO_LINE_DIRECTION_IN :
+				   GPIO_LINE_DIRECTION_OUT;
 }
 
 /**
@@ -154,9 +155,9 @@  static int sama5d2_piobu_get(struct gpio_chip *chip, unsigned int pin)
 	/* if pin is input, read value from PDS else read from SOD */
 	int ret = sama5d2_piobu_get_direction(chip, pin);
 
-	if (ret == 1)
+	if (ret == GPIO_LINE_DIRECTION_IN)
 		ret = sama5d2_piobu_read_value(chip, pin, PIOBU_PDS);
-	else if (!ret)
+	else if (ret == GPIO_LINE_DIRECTION_OUT)
 		ret = sama5d2_piobu_read_value(chip, pin, PIOBU_SOD);
 
 	if (ret < 0)
diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c
index fb143f28c386..c65f35b68202 100644
--- a/drivers/gpio/gpio-sch.c
+++ b/drivers/gpio/gpio-sch.c
@@ -127,7 +127,10 @@  static int sch_gpio_get_direction(struct gpio_chip *gc, unsigned gpio_num)
 {
 	struct sch_gpio *sch = gpiochip_get_data(gc);
 
-	return sch_gpio_reg_get(sch, gpio_num, GIO);
+	if (sch_gpio_reg_get(sch, gpio_num, GIO))
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static const struct gpio_chip sch_gpio_chip = {
diff --git a/drivers/gpio/gpio-sch311x.c b/drivers/gpio/gpio-sch311x.c
index 8ecf336c9af4..da01e1cad7cb 100644
--- a/drivers/gpio/gpio-sch311x.c
+++ b/drivers/gpio/gpio-sch311x.c
@@ -228,7 +228,10 @@  static int sch311x_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 	data = inb(block->runtime_reg + block->config_regs[offset]);
 	spin_unlock(&block->lock);
 
-	return !!(data & SCH311X_GPIO_CONF_DIR);
+	if (data & SCH311X_GPIO_CONF_DIR)
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int sch311x_gpio_set_config(struct gpio_chip *chip, unsigned offset,
diff --git a/drivers/gpio/gpio-siox.c b/drivers/gpio/gpio-siox.c
index 006a7e6a75f2..311f66757b92 100644
--- a/drivers/gpio/gpio-siox.c
+++ b/drivers/gpio/gpio-siox.c
@@ -203,9 +203,9 @@  static int gpio_siox_direction_output(struct gpio_chip *chip,
 static int gpio_siox_get_direction(struct gpio_chip *chip, unsigned int offset)
 {
 	if (offset < 12)
-		return 1; /* input */
+		return GPIO_LINE_DIRECTION_IN;
 	else
-		return 0; /* output */
+		return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int gpio_siox_probe(struct siox_device *sdevice)
diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c
index 994d542daf53..542706a852e6 100644
--- a/drivers/gpio/gpio-stmpe.c
+++ b/drivers/gpio/gpio-stmpe.c
@@ -84,7 +84,10 @@  static int stmpe_gpio_get_direction(struct gpio_chip *chip,
 	if (ret < 0)
 		return ret;
 
-	return !(ret & mask);
+	if (ret & mask)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int stmpe_gpio_direction_output(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-tc3589x.c b/drivers/gpio/gpio-tc3589x.c
index 75b1135b383a..6be0684cfa49 100644
--- a/drivers/gpio/gpio-tc3589x.c
+++ b/drivers/gpio/gpio-tc3589x.c
@@ -97,7 +97,10 @@  static int tc3589x_gpio_get_direction(struct gpio_chip *chip,
 	if (ret < 0)
 		return ret;
 
-	return !(ret & BIT(pos));
+	if (ret & BIT(pos))
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int tc3589x_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c
index 8a01d3694b28..6fdfe4c5303e 100644
--- a/drivers/gpio/gpio-tegra.c
+++ b/drivers/gpio/gpio-tegra.c
@@ -215,7 +215,10 @@  static int tegra_gpio_get_direction(struct gpio_chip *chip,
 
 	oe = tegra_gpio_readl(tgi, GPIO_OE(tgi, offset));
 
-	return !(oe & pin_mask);
+	if (oe & pin_mask)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int tegra_gpio_set_debounce(struct gpio_chip *chip, unsigned int offset,
diff --git a/drivers/gpio/gpio-tegra186.c b/drivers/gpio/gpio-tegra186.c
index 8a2a69178925..57185b96c110 100644
--- a/drivers/gpio/gpio-tegra186.c
+++ b/drivers/gpio/gpio-tegra186.c
@@ -111,9 +111,9 @@  static int tegra186_gpio_get_direction(struct gpio_chip *chip,
 
 	value = readl(base + TEGRA186_GPIO_ENABLE_CONFIG);
 	if (value & TEGRA186_GPIO_ENABLE_CONFIG_OUT)
-		return 0;
+		return GPIO_LINE_DIRECTION_OUT;
 
-	return 1;
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int tegra186_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-thunderx.c b/drivers/gpio/gpio-thunderx.c
index ddad5c7ea617..d08d86a22b1f 100644
--- a/drivers/gpio/gpio-thunderx.c
+++ b/drivers/gpio/gpio-thunderx.c
@@ -169,7 +169,10 @@  static int thunderx_gpio_get_direction(struct gpio_chip *chip, unsigned int line
 
 	bit_cfg = readq(txgpio->register_base + bit_cfg_reg(line));
 
-	return !(bit_cfg & GPIO_BIT_CFG_TX_OE);
+	if (bit_cfg & GPIO_BIT_CFG_TX_OE)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int thunderx_gpio_set_config(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-tpic2810.c b/drivers/gpio/gpio-tpic2810.c
index c8b34d787eed..99d5a84a9129 100644
--- a/drivers/gpio/gpio-tpic2810.c
+++ b/drivers/gpio/gpio-tpic2810.c
@@ -39,7 +39,7 @@  static int tpic2810_get_direction(struct gpio_chip *chip,
 				  unsigned offset)
 {
 	/* This device always output */
-	return 0;
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int tpic2810_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-tps65086.c b/drivers/gpio/gpio-tps65086.c
index 2eea98ff4ea3..1e9d8262d0ff 100644
--- a/drivers/gpio/gpio-tps65086.c
+++ b/drivers/gpio/gpio-tps65086.c
@@ -21,7 +21,7 @@  static int tps65086_gpio_get_direction(struct gpio_chip *chip,
 				       unsigned offset)
 {
 	/* This device is output only */
-	return 0;
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int tps65086_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-tps65912.c b/drivers/gpio/gpio-tps65912.c
index 3ad68bd78282..510d9ed9fd2a 100644
--- a/drivers/gpio/gpio-tps65912.c
+++ b/drivers/gpio/gpio-tps65912.c
@@ -32,9 +32,9 @@  static int tps65912_gpio_get_direction(struct gpio_chip *gc,
 		return ret;
 
 	if (val & GPIO_CFG_MASK)
-		return 0;
+		return GPIO_LINE_DIRECTION_OUT;
 	else
-		return 1;
+		return GPIO_LINE_DIRECTION_IN;
 }
 
 static int tps65912_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
diff --git a/drivers/gpio/gpio-tps68470.c b/drivers/gpio/gpio-tps68470.c
index aff6e504c666..f7f5f770e0fb 100644
--- a/drivers/gpio/gpio-tps68470.c
+++ b/drivers/gpio/gpio-tps68470.c
@@ -47,7 +47,6 @@  static int tps68470_gpio_get(struct gpio_chip *gc, unsigned int offset)
 	return !!(val & BIT(offset));
 }
 
-/* Return 0 if output, 1 if input */
 static int tps68470_gpio_get_direction(struct gpio_chip *gc,
 				       unsigned int offset)
 {
@@ -57,7 +56,7 @@  static int tps68470_gpio_get_direction(struct gpio_chip *gc,
 
 	/* rest are always outputs */
 	if (offset >= TPS68470_N_REGULAR_GPIO)
-		return 0;
+		return GPIO_LINE_DIRECTION_OUT;
 
 	ret = regmap_read(regmap, TPS68470_GPIO_CTL_REG_A(offset), &val);
 	if (ret) {
@@ -67,7 +66,8 @@  static int tps68470_gpio_get_direction(struct gpio_chip *gc,
 	}
 
 	val &= TPS68470_GPIO_MODE_MASK;
-	return val >= TPS68470_GPIO_MODE_OUT_CMOS ? 0 : 1;
+	return val >= TPS68470_GPIO_MODE_OUT_CMOS ? GPIO_LINE_DIRECTION_OUT :
+						    GPIO_LINE_DIRECTION_IN;
 }
 
 static void tps68470_gpio_set(struct gpio_chip *gc, unsigned int offset,
diff --git a/drivers/gpio/gpio-tqmx86.c b/drivers/gpio/gpio-tqmx86.c
index a3109bcaa0ac..5022e0ad0fae 100644
--- a/drivers/gpio/gpio-tqmx86.c
+++ b/drivers/gpio/gpio-tqmx86.c
@@ -101,7 +101,10 @@  static int tqmx86_gpio_direction_output(struct gpio_chip *chip,
 static int tqmx86_gpio_get_direction(struct gpio_chip *chip,
 				     unsigned int offset)
 {
-	return !!(TQMX86_DIR_INPUT_MASK & BIT(offset));
+	if (TQMX86_DIR_INPUT_MASK & BIT(offset))
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static void tqmx86_gpio_irq_mask(struct irq_data *data)
diff --git a/drivers/gpio/gpio-ts4900.c b/drivers/gpio/gpio-ts4900.c
index 1da8d0586329..d885032cf814 100644
--- a/drivers/gpio/gpio-ts4900.c
+++ b/drivers/gpio/gpio-ts4900.c
@@ -44,7 +44,10 @@  static int ts4900_gpio_get_direction(struct gpio_chip *chip,
 
 	regmap_read(priv->regmap, offset, &reg);
 
-	return !(reg & TS4900_GPIO_OE);
+	if (reg & TS4900_GPIO_OE)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int ts4900_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c
index fbfb648d3502..de249726230e 100644
--- a/drivers/gpio/gpio-twl4030.c
+++ b/drivers/gpio/gpio-twl4030.c
@@ -165,10 +165,10 @@  static int twl4030_get_gpio_direction(int gpio)
 	if (ret < 0)
 		return ret;
 
-	/* 1 = output, but gpiolib semantics are inverse so invert */
-	ret = !(ret & d_msk);
+	if (ret & d_msk)
+		return GPIO_LINE_DIRECTION_OUT;
 
-	return ret;
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int twl4030_set_gpio_dataout(int gpio, int enable)
@@ -380,10 +380,10 @@  static int twl_get_direction(struct gpio_chip *chip, unsigned offset)
 {
 	struct gpio_twl4030_priv *priv = gpiochip_get_data(chip);
 	/*
-	 * Default 0 = output
+	 * Default GPIO_LINE_DIRECTION_OUT
 	 * LED GPIOs >= TWL4030_GPIO_MAX are always output
 	 */
-	int ret = 0;
+	int ret = GPIO_LINE_DIRECTION_OUT;
 
 	mutex_lock(&priv->mutex);
 	if (offset < TWL4030_GPIO_MAX) {
diff --git a/drivers/gpio/gpio-twl6040.c b/drivers/gpio/gpio-twl6040.c
index c845b2ff1f43..648fb418d775 100644
--- a/drivers/gpio/gpio-twl6040.c
+++ b/drivers/gpio/gpio-twl6040.c
@@ -34,8 +34,7 @@  static int twl6040gpo_get(struct gpio_chip *chip, unsigned offset)
 
 static int twl6040gpo_get_direction(struct gpio_chip *chip, unsigned offset)
 {
-	/* This means "out" */
-	return 0;
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int twl6040gpo_direction_out(struct gpio_chip *chip, unsigned offset,
diff --git a/drivers/gpio/gpio-uniphier.c b/drivers/gpio/gpio-uniphier.c
index 93cdcc41e9fb..bd203e8fa58e 100644
--- a/drivers/gpio/gpio-uniphier.c
+++ b/drivers/gpio/gpio-uniphier.c
@@ -113,7 +113,10 @@  static int uniphier_gpio_offset_read(struct gpio_chip *chip,
 static int uniphier_gpio_get_direction(struct gpio_chip *chip,
 				       unsigned int offset)
 {
-	return uniphier_gpio_offset_read(chip, offset, UNIPHIER_GPIO_PORT_DIR);
+	if (uniphier_gpio_offset_read(chip, offset, UNIPHIER_GPIO_PORT_DIR))
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int uniphier_gpio_direction_input(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpio-wcove.c b/drivers/gpio/gpio-wcove.c
index 444fe9e7f04a..8b481b3c1ebe 100644
--- a/drivers/gpio/gpio-wcove.c
+++ b/drivers/gpio/gpio-wcove.c
@@ -170,13 +170,16 @@  static int wcove_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio)
 	int ret, reg = to_reg(gpio, CTRL_OUT);
 
 	if (reg < 0)
-		return 0;
+		return GPIO_LINE_DIRECTION_OUT;
 
 	ret = regmap_read(wg->regmap, reg, &val);
 	if (ret)
 		return ret;
 
-	return !(val & CTLO_DIR_OUT);
+	if (val & CTLO_DIR_OUT)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 static int wcove_gpio_get(struct gpio_chip *chip, unsigned int gpio)
diff --git a/drivers/gpio/gpio-ws16c48.c b/drivers/gpio/gpio-ws16c48.c
index e0ef66b6a237..fe456bea81f6 100644
--- a/drivers/gpio/gpio-ws16c48.c
+++ b/drivers/gpio/gpio-ws16c48.c
@@ -56,7 +56,10 @@  static int ws16c48_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 	const unsigned port = offset / 8;
 	const unsigned mask = BIT(offset % 8);
 
-	return !!(ws16c48gpio->io_state[port] & mask);
+	if (ws16c48gpio->io_state[port] & mask)
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int ws16c48_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
diff --git a/drivers/gpio/gpio-xgene.c b/drivers/gpio/gpio-xgene.c
index a6e66ac18e1f..532b0df8a1f2 100644
--- a/drivers/gpio/gpio-xgene.c
+++ b/drivers/gpio/gpio-xgene.c
@@ -80,7 +80,10 @@  static int xgene_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
 	bank_offset = GPIO_SET_DR_OFFSET + GPIO_BANK_OFFSET(offset);
 	bit_offset = GPIO_BIT_OFFSET(offset);
 
-	return !!(ioread32(chip->base + bank_offset) & BIT(bit_offset));
+	if (ioread32(chip->base + bank_offset) & BIT(bit_offset))
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int xgene_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
diff --git a/drivers/gpio/gpio-xra1403.c b/drivers/gpio/gpio-xra1403.c
index 05f1998c11a4..31b5072b2df0 100644
--- a/drivers/gpio/gpio-xra1403.c
+++ b/drivers/gpio/gpio-xra1403.c
@@ -83,7 +83,10 @@  static int xra1403_get_direction(struct gpio_chip *chip, unsigned int offset)
 	if (ret)
 		return ret;
 
-	return !!(val & BIT(offset % 8));
+	if (val & BIT(offset % 8))
+		return GPIO_LINE_DIRECTION_IN;
+
+	return GPIO_LINE_DIRECTION_OUT;
 }
 
 static int xra1403_get(struct gpio_chip *chip, unsigned int offset)
diff --git a/drivers/gpio/gpio-xtensa.c b/drivers/gpio/gpio-xtensa.c
index 43d3fa5f511a..08d7c3b32038 100644
--- a/drivers/gpio/gpio-xtensa.c
+++ b/drivers/gpio/gpio-xtensa.c
@@ -72,7 +72,7 @@  static inline void disable_cp(unsigned long flags, unsigned long cpenable)
 
 static int xtensa_impwire_get_direction(struct gpio_chip *gc, unsigned offset)
 {
-	return 1; /* input only */
+	return GPIO_LINE_DIRECTION_IN; /* input only */
 }
 
 static int xtensa_impwire_get_value(struct gpio_chip *gc, unsigned offset)
@@ -95,7 +95,7 @@  static void xtensa_impwire_set_value(struct gpio_chip *gc, unsigned offset,
 
 static int xtensa_expstate_get_direction(struct gpio_chip *gc, unsigned offset)
 {
-	return 0; /* output only */
+	return GPIO_LINE_DIRECTION_OUT; /* output only */
 }
 
 static int xtensa_expstate_get_value(struct gpio_chip *gc, unsigned offset)
diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c
index cd475ff4bcad..4c3f6370eab4 100644
--- a/drivers/gpio/gpio-zynq.c
+++ b/drivers/gpio/gpio-zynq.c
@@ -360,7 +360,7 @@  static int zynq_gpio_dir_out(struct gpio_chip *chip, unsigned int pin,
  *
  * This function returns the direction of the specified GPIO.
  *
- * Return: 0 for output, 1 for input
+ * Return: GPIO_LINE_DIRECTION_OUT or GPIO_LINE_DIRECTION_IN
  */
 static int zynq_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
 {
@@ -372,7 +372,10 @@  static int zynq_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
 
 	reg = readl_relaxed(gpio->base_addr + ZYNQ_GPIO_DIRM_OFFSET(bank_num));
 
-	return !(reg & BIT(bank_pin_num));
+	if (reg & BIT(bank_pin_num))
+		return GPIO_LINE_DIRECTION_OUT;
+
+	return GPIO_LINE_DIRECTION_IN;
 }
 
 /**