mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	gpio: Use new GPIO_LINE_DIRECTION
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: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com> Acked-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
		
							parent
							
								
									9208b1e77d
								
							
						
					
					
						commit
						e42615ec23
					
				
					 60 changed files with 211 additions and 102 deletions
				
			
		| 
						 | 
					@ -59,7 +59,10 @@ static int dio48e_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
	const unsigned port = offset / 8;
 | 
						const unsigned port = offset / 8;
 | 
				
			||||||
	const unsigned mask = BIT(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)
 | 
					static int dio48e_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,7 +53,7 @@ struct idi_48_gpio {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int idi_48_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
					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)
 | 
					static int idi_48_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,9 +51,9 @@ struct idio_16_gpio {
 | 
				
			||||||
static int idio_16_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
					static int idio_16_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (offset > 15)
 | 
						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)
 | 
					static int idio_16_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
						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)
 | 
					static int mmio_74xx_dir_in(struct gpio_chip *gc, unsigned int gpio)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
						ret = (readl_relaxed(ptr) & AMD_FCH_GPIO_FLAG_DIRECTION);
 | 
				
			||||||
	spin_unlock_irqrestore(&priv->lock, flags);
 | 
						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,
 | 
					static void amd_fch_gpio_set(struct gpio_chip *gc,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -487,10 +487,10 @@ static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
 | 
				
			||||||
	u32 val;
 | 
						u32 val;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!have_input(gpio, offset))
 | 
						if (!have_input(gpio, offset))
 | 
				
			||||||
		return 0;
 | 
							return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!have_output(gpio, offset))
 | 
						if (!have_output(gpio, offset))
 | 
				
			||||||
		return 1;
 | 
							return GPIO_LINE_DIRECTION_IN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_lock_irqsave(&gpio->lock, flags);
 | 
						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);
 | 
						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,
 | 
					static inline int irqd_to_aspeed_gpio_data(struct irq_data *d,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,7 +127,7 @@ static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio)
 | 
				
			||||||
	u32 val;
 | 
						u32 val;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	val = readl(reg_base + GPIO_CONTROL(gpio)) & GPIO_GPCTR0_IOTR_MASK;
 | 
						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)
 | 
					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);
 | 
						raw_spin_lock_irqsave(&kona_gpio->lock, flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* this function only applies to output pin */
 | 
						/* 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;
 | 
							goto out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	reg_offset = value ? GPIO_OUT_SET(bank_id) : GPIO_OUT_CLEAR(bank_id);
 | 
						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;
 | 
						reg_base = kona_gpio->reg_base;
 | 
				
			||||||
	raw_spin_lock_irqsave(&kona_gpio->lock, flags);
 | 
						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);
 | 
							reg_offset = GPIO_IN_STATUS(bank_id);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		reg_offset = GPIO_OUT_STATUS(bank_id);
 | 
							reg_offset = GPIO_OUT_STATUS(bank_id);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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");
 | 
							dev_err(bdgpio->chip.dev, "Could not read gpio direction\n");
 | 
				
			||||||
		return ret;
 | 
							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,
 | 
					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.
 | 
						 * locking would make no sense.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	ret = bd70528_get_direction(chip, offset);
 | 
						ret = bd70528_get_direction(chip, offset);
 | 
				
			||||||
	if (ret == 0)
 | 
						if (ret == GPIO_LINE_DIRECTION_OUT)
 | 
				
			||||||
		ret = bd70528_gpio_get_o(bdgpio, offset);
 | 
							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);
 | 
							ret = bd70528_gpio_get_i(bdgpio, offset);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		dev_err(bdgpio->chip.dev, "failed to read GPIO direction\n");
 | 
							dev_err(bdgpio->chip.dev, "failed to read GPIO direction\n");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,8 +37,10 @@ static int bd9571mwv_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
	ret = regmap_read(gpio->bd->regmap, BD9571MWV_GPIO_DIR, &val);
 | 
						ret = regmap_read(gpio->bd->regmap, BD9571MWV_GPIO_DIR, &val);
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							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,
 | 
					static int bd9571mwv_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -200,9 +200,9 @@ static int dln2_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
	struct dln2_gpio *dln2 = gpiochip_get_data(chip);
 | 
						struct dln2_gpio *dln2 = gpiochip_get_data(chip);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (test_bit(offset, dln2->output_enabled))
 | 
						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)
 | 
					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)
 | 
						if (dir < 0)
 | 
				
			||||||
		return dir;
 | 
							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_in_val(dln2, offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return dln2_gpio_pin_get_out_val(dln2, offset);
 | 
						return dln2_gpio_pin_get_out_val(dln2, offset);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,7 +77,10 @@ static int exar_get_direction(struct gpio_chip *chip, unsigned int offset)
 | 
				
			||||||
		EXAR_OFFSET_MPIOSEL_HI : EXAR_OFFSET_MPIOSEL_LO;
 | 
							EXAR_OFFSET_MPIOSEL_HI : EXAR_OFFSET_MPIOSEL_LO;
 | 
				
			||||||
	unsigned int bit  = (offset + exar_gpio->first_pin) % 8;
 | 
						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)
 | 
					static int exar_get_value(struct gpio_chip *chip, unsigned int offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -250,7 +250,10 @@ static int f7188x_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	superio_exit(sio->addr);
 | 
						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)
 | 
					static int f7188x_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,7 +52,10 @@ static int gpiomm_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
	const unsigned int port = offset / 8;
 | 
						const unsigned int port = offset / 8;
 | 
				
			||||||
	const unsigned int mask = BIT(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,
 | 
					static int gpiomm_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -220,7 +220,10 @@ static int egpio_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	egpio = gpiochip_get_data(chip);
 | 
						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)
 | 
					static void egpio_write_cache(struct egpio_info *ei)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
					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)
 | 
					static int ichx_gpio_direction_input(struct gpio_chip *gpio, unsigned nr)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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_gpio_data *gpio = gpiochip_get_data(chip);
 | 
				
			||||||
	struct kempld_device_data *pld = gpio->pld;
 | 
						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)
 | 
					static int kempld_gpio_pincount(struct kempld_device_data *pld)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,7 @@ static int lp873x_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
				     unsigned int offset)
 | 
									     unsigned int offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* This device is output only */
 | 
						/* This device is output only */
 | 
				
			||||||
	return 0;
 | 
						return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int lp873x_gpio_direction_input(struct gpio_chip *chip,
 | 
					static int lp873x_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,10 @@ static int lp87565_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							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,
 | 
					static int lp87565_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,10 @@ static int madera_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							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)
 | 
					static int madera_gpio_direction_in(struct gpio_chip *chip, unsigned int offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,7 @@ DECLARE_CRC8_TABLE(max3191x_crc8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int max3191x_get_direction(struct gpio_chip *gpio, unsigned int offset)
 | 
					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)
 | 
					static int max3191x_direction_input(struct gpio_chip *gpio, unsigned int offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
						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,
 | 
					static int mrfld_gpio_set_debounce(struct gpio_chip *chip, unsigned int offset,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
					static int bgpio_get_dir(struct gpio_chip *gc, unsigned int gpio)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Return 0 if output, 1 if input */
 | 
						/* Return 0 if output, 1 if input */
 | 
				
			||||||
	if (gc->bgpio_dir_unreadable)
 | 
						if (gc->bgpio_dir_unreadable) {
 | 
				
			||||||
		return !(gc->bgpio_dir & bgpio_line2mask(gc, gpio));
 | 
							if (gc->bgpio_dir & bgpio_line2mask(gc, gpio))
 | 
				
			||||||
	if (gc->reg_dir_out)
 | 
								return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
		return !(gc->read_reg(gc->reg_dir_out) & bgpio_line2mask(gc, gpio));
 | 
							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)
 | 
						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 */
 | 
						/* 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)
 | 
					static int bgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,14 +34,9 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define gpio_mockup_err(...)	pr_err(GPIO_MOCKUP_NAME ": " __VA_ARGS__)
 | 
					#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
 | 
					 * 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)
 | 
					 * @value:     Configures status of the gpio as 0(low) or 1(high)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct gpio_mockup_line_status {
 | 
					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);
 | 
						struct gpio_mockup_chip *chip = gpiochip_get_data(gc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&chip->lock);
 | 
						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);
 | 
						__gpio_mockup_set(chip, offset, value);
 | 
				
			||||||
	mutex_unlock(&chip->lock);
 | 
						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);
 | 
						struct gpio_mockup_chip *chip = gpiochip_get_data(gc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&chip->lock);
 | 
						mutex_lock(&chip->lock);
 | 
				
			||||||
	chip->lines[offset].dir = GPIO_MOCKUP_DIR_IN;
 | 
						chip->lines[offset].dir = GPIO_LINE_DIRECTION_IN;
 | 
				
			||||||
	mutex_unlock(&chip->lock);
 | 
						mutex_unlock(&chip->lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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. */
 | 
						/* All lines are hard wired to be either input or output, not both. */
 | 
				
			||||||
	if (chip->desc->in_mask & BIT(offset))
 | 
						if (chip->desc->in_mask & BIT(offset))
 | 
				
			||||||
		return 1;
 | 
							return GPIO_LINE_DIRECTION_IN;
 | 
				
			||||||
	else if (chip->desc->out_mask & BIT(offset))
 | 
						else if (chip->desc->out_mask & BIT(offset))
 | 
				
			||||||
		return 0;
 | 
							return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
						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)
 | 
					static int mvebu_gpio_to_irq(struct gpio_chip *chip, unsigned int pin)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,7 +248,10 @@ static int mxs_gpio_get_direction(struct gpio_chip *gc, unsigned offset)
 | 
				
			||||||
	u32 dir;
 | 
						u32 dir;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dir = readl(port->base + PINCTRL_DOE(port));
 | 
						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[] = {
 | 
					static const struct platform_device_id mxs_gpio_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -805,8 +805,10 @@ static int omap_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct gpio_bank *bank = gpiochip_get_data(chip);
 | 
						struct gpio_bank *bank = gpiochip_get_data(chip);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return !!(readl_relaxed(bank->base + bank->regs->direction) &
 | 
						if (readl_relaxed(bank->base + bank->regs->direction) & BIT(offset))
 | 
				
			||||||
		  BIT(offset));
 | 
							return GPIO_LINE_DIRECTION_IN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int omap_gpio_input(struct gpio_chip *chip, unsigned offset)
 | 
					static int omap_gpio_input(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -449,7 +449,10 @@ static int pca953x_gpio_get_direction(struct gpio_chip *gc, unsigned off)
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							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,
 | 
					static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,9 +61,9 @@ static int idio_16_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
	unsigned int offset)
 | 
						unsigned int offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (offset > 15)
 | 
						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,
 | 
					static int idio_16_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -104,15 +104,18 @@ static int idio_24_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* FET Outputs */
 | 
						/* FET Outputs */
 | 
				
			||||||
	if (offset < 24)
 | 
						if (offset < 24)
 | 
				
			||||||
		return 0;
 | 
							return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Isolated Inputs */
 | 
						/* Isolated Inputs */
 | 
				
			||||||
	if (offset < 48)
 | 
						if (offset < 48)
 | 
				
			||||||
		return 1;
 | 
							return GPIO_LINE_DIRECTION_IN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* TTL/CMOS I/O */
 | 
						/* TTL/CMOS I/O */
 | 
				
			||||||
	/* OUT MODE = 1 when TTL/CMOS Output Mode is set */
 | 
						/* 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,
 | 
					static int idio_24_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,7 +65,7 @@ static int pisosr_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
				     unsigned offset)
 | 
									     unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* This device always input */
 | 
						/* This device always input */
 | 
				
			||||||
	return 1;
 | 
						return GPIO_LINE_DIRECTION_IN;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pisosr_gpio_direction_input(struct gpio_chip *chip,
 | 
					static int pisosr_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,7 +63,10 @@ static int pl061_get_direction(struct gpio_chip *gc, unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pl061 *pl061 = gpiochip_get_data(gc);
 | 
						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)
 | 
					static int pl061_direction_input(struct gpio_chip *gc, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -147,7 +147,10 @@ static int rpi_exp_gpio_get_direction(struct gpio_chip *gc, unsigned int off)
 | 
				
			||||||
			get.gpio);
 | 
								get.gpio);
 | 
				
			||||||
		return ret ? ret : -EIO;
 | 
							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)
 | 
					static int rpi_exp_gpio_get(struct gpio_chip *gc, unsigned int off)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
						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)
 | 
					static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,8 @@ static int gpio_reg_get_direction(struct gpio_chip *gc, unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct gpio_reg *r = to_gpio_reg(gc);
 | 
						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,
 | 
					static int gpio_reg_direction_output(struct gpio_chip *gc, unsigned offset,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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;
 | 
						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)
 | 
					static int sa1100_direction_input(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,7 +119,8 @@ static int sama5d2_piobu_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							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 */
 | 
						/* if pin is input, read value from PDS else read from SOD */
 | 
				
			||||||
	int ret = sama5d2_piobu_get_direction(chip, pin);
 | 
						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);
 | 
							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);
 | 
							ret = sama5d2_piobu_read_value(chip, pin, PIOBU_SOD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
						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 = {
 | 
					static const struct gpio_chip sch_gpio_chip = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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]);
 | 
						data = inb(block->runtime_reg + block->config_regs[offset]);
 | 
				
			||||||
	spin_unlock(&block->lock);
 | 
						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,
 | 
					static int sch311x_gpio_set_config(struct gpio_chip *chip, unsigned offset,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
					static int gpio_siox_get_direction(struct gpio_chip *chip, unsigned int offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (offset < 12)
 | 
						if (offset < 12)
 | 
				
			||||||
		return 1; /* input */
 | 
							return GPIO_LINE_DIRECTION_IN;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		return 0; /* output */
 | 
							return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int gpio_siox_probe(struct siox_device *sdevice)
 | 
					static int gpio_siox_probe(struct siox_device *sdevice)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,7 +84,10 @@ static int stmpe_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							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,
 | 
					static int stmpe_gpio_direction_output(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,7 +97,10 @@ static int tc3589x_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							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,
 | 
					static int tc3589x_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -215,7 +215,10 @@ static int tegra_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	oe = tegra_gpio_readl(tgi, GPIO_OE(tgi, offset));
 | 
						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,
 | 
					static int tegra_gpio_set_debounce(struct gpio_chip *chip, unsigned int offset,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,9 +111,9 @@ static int tegra186_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	value = readl(base + TEGRA186_GPIO_ENABLE_CONFIG);
 | 
						value = readl(base + TEGRA186_GPIO_ENABLE_CONFIG);
 | 
				
			||||||
	if (value & TEGRA186_GPIO_ENABLE_CONFIG_OUT)
 | 
						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,
 | 
					static int tegra186_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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));
 | 
						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,
 | 
					static int thunderx_gpio_set_config(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ static int tpic2810_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
				  unsigned offset)
 | 
									  unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* This device always output */
 | 
						/* This device always output */
 | 
				
			||||||
	return 0;
 | 
						return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tpic2810_direction_input(struct gpio_chip *chip,
 | 
					static int tpic2810_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,7 @@ static int tps65086_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
				       unsigned offset)
 | 
									       unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* This device is output only */
 | 
						/* This device is output only */
 | 
				
			||||||
	return 0;
 | 
						return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tps65086_gpio_direction_input(struct gpio_chip *chip,
 | 
					static int tps65086_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,9 +32,9 @@ static int tps65912_gpio_get_direction(struct gpio_chip *gc,
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (val & GPIO_CFG_MASK)
 | 
						if (val & GPIO_CFG_MASK)
 | 
				
			||||||
		return 0;
 | 
							return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		return 1;
 | 
							return GPIO_LINE_DIRECTION_IN;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tps65912_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
 | 
					static int tps65912_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,7 +47,6 @@ static int tps68470_gpio_get(struct gpio_chip *gc, unsigned int offset)
 | 
				
			||||||
	return !!(val & BIT(offset));
 | 
						return !!(val & BIT(offset));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Return 0 if output, 1 if input */
 | 
					 | 
				
			||||||
static int tps68470_gpio_get_direction(struct gpio_chip *gc,
 | 
					static int tps68470_gpio_get_direction(struct gpio_chip *gc,
 | 
				
			||||||
				       unsigned int offset)
 | 
									       unsigned int offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -57,7 +56,7 @@ static int tps68470_gpio_get_direction(struct gpio_chip *gc,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* rest are always outputs */
 | 
						/* rest are always outputs */
 | 
				
			||||||
	if (offset >= TPS68470_N_REGULAR_GPIO)
 | 
						if (offset >= TPS68470_N_REGULAR_GPIO)
 | 
				
			||||||
		return 0;
 | 
							return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = regmap_read(regmap, TPS68470_GPIO_CTL_REG_A(offset), &val);
 | 
						ret = regmap_read(regmap, TPS68470_GPIO_CTL_REG_A(offset), &val);
 | 
				
			||||||
	if (ret) {
 | 
						if (ret) {
 | 
				
			||||||
| 
						 | 
					@ -67,7 +66,8 @@ static int tps68470_gpio_get_direction(struct gpio_chip *gc,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	val &= TPS68470_GPIO_MODE_MASK;
 | 
						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,
 | 
					static void tps68470_gpio_set(struct gpio_chip *gc, unsigned int offset,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -101,7 +101,10 @@ static int tqmx86_gpio_direction_output(struct gpio_chip *chip,
 | 
				
			||||||
static int tqmx86_gpio_get_direction(struct gpio_chip *chip,
 | 
					static int tqmx86_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
				     unsigned int offset)
 | 
									     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)
 | 
					static void tqmx86_gpio_irq_mask(struct irq_data *data)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,10 @@ static int ts4900_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	regmap_read(priv->regmap, offset, ®);
 | 
						regmap_read(priv->regmap, offset, ®);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	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,
 | 
					static int ts4900_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -165,10 +165,10 @@ static int twl4030_get_gpio_direction(int gpio)
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* 1 = output, but gpiolib semantics are inverse so invert */
 | 
						if (ret & d_msk)
 | 
				
			||||||
	ret = !(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)
 | 
					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);
 | 
						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
 | 
						 * LED GPIOs >= TWL4030_GPIO_MAX are always output
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	int ret = 0;
 | 
						int ret = GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&priv->mutex);
 | 
						mutex_lock(&priv->mutex);
 | 
				
			||||||
	if (offset < TWL4030_GPIO_MAX) {
 | 
						if (offset < TWL4030_GPIO_MAX) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
					static int twl6040gpo_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* This means "out" */
 | 
						return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int twl6040gpo_direction_out(struct gpio_chip *chip, unsigned offset,
 | 
					static int twl6040gpo_direction_out(struct gpio_chip *chip, unsigned offset,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -113,7 +113,10 @@ static int uniphier_gpio_offset_read(struct gpio_chip *chip,
 | 
				
			||||||
static int uniphier_gpio_get_direction(struct gpio_chip *chip,
 | 
					static int uniphier_gpio_get_direction(struct gpio_chip *chip,
 | 
				
			||||||
				       unsigned int offset)
 | 
									       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,
 | 
					static int uniphier_gpio_direction_input(struct gpio_chip *chip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
						int ret, reg = to_reg(gpio, CTRL_OUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (reg < 0)
 | 
						if (reg < 0)
 | 
				
			||||||
		return 0;
 | 
							return GPIO_LINE_DIRECTION_OUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = regmap_read(wg->regmap, reg, &val);
 | 
						ret = regmap_read(wg->regmap, reg, &val);
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		return 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)
 | 
					static int wcove_gpio_get(struct gpio_chip *chip, unsigned int gpio)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,7 +56,10 @@ static int ws16c48_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
	const unsigned port = offset / 8;
 | 
						const unsigned port = offset / 8;
 | 
				
			||||||
	const unsigned mask = BIT(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)
 | 
					static int ws16c48_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
						bank_offset = GPIO_SET_DR_OFFSET + GPIO_BANK_OFFSET(offset);
 | 
				
			||||||
	bit_offset = GPIO_BIT_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)
 | 
					static int xgene_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,7 +83,10 @@ static int xra1403_get_direction(struct gpio_chip *chip, unsigned int offset)
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		return 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)
 | 
					static int xra1403_get(struct gpio_chip *chip, unsigned int offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
					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)
 | 
					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)
 | 
					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)
 | 
					static int xtensa_expstate_get_value(struct gpio_chip *gc, unsigned offset)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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.
 | 
					 * 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)
 | 
					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));
 | 
						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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue