diff options
Diffstat (limited to 'drivers/gpio/gpio-syscon.c')
| -rw-r--r-- | drivers/gpio/gpio-syscon.c | 33 | 
1 files changed, 18 insertions, 15 deletions
diff --git a/drivers/gpio/gpio-syscon.c b/drivers/gpio/gpio-syscon.c index 5ab394ec81e6..f86f78655c24 100644 --- a/drivers/gpio/gpio-syscon.c +++ b/drivers/gpio/gpio-syscon.c @@ -40,8 +40,8 @@ struct syscon_gpio_data {  	unsigned int	bit_count;  	unsigned int	dat_bit_offset;  	unsigned int	dir_bit_offset; -	void		(*set)(struct gpio_chip *chip, -			       unsigned offset, int value); +	int		(*set)(struct gpio_chip *chip, unsigned int offset, +			       int value);  };  struct syscon_gpio_priv { @@ -68,17 +68,17 @@ static int syscon_gpio_get(struct gpio_chip *chip, unsigned offset)  	return !!(val & BIT(offs % SYSCON_REG_BITS));  } -static void syscon_gpio_set(struct gpio_chip *chip, unsigned offset, int val) +static int syscon_gpio_set(struct gpio_chip *chip, unsigned int offset, int val)  {  	struct syscon_gpio_priv *priv = gpiochip_get_data(chip);  	unsigned int offs;  	offs = priv->dreg_offset + priv->data->dat_bit_offset + offset; -	regmap_update_bits(priv->syscon, -			   (offs / SYSCON_REG_BITS) * SYSCON_REG_SIZE, -			   BIT(offs % SYSCON_REG_BITS), -			   val ? BIT(offs % SYSCON_REG_BITS) : 0); +	return regmap_update_bits(priv->syscon, +				  (offs / SYSCON_REG_BITS) * SYSCON_REG_SIZE, +				  BIT(offs % SYSCON_REG_BITS), +				  val ? BIT(offs % SYSCON_REG_BITS) : 0);  }  static int syscon_gpio_dir_in(struct gpio_chip *chip, unsigned offset) @@ -115,9 +115,7 @@ static int syscon_gpio_dir_out(struct gpio_chip *chip, unsigned offset, int val)  				   BIT(offs % SYSCON_REG_BITS));  	} -	chip->set(chip, offset, val); - -	return 0; +	return chip->set_rv(chip, offset, val);  }  static const struct syscon_gpio_data clps711x_mctrl_gpio = { @@ -127,8 +125,8 @@ static const struct syscon_gpio_data clps711x_mctrl_gpio = {  	.dat_bit_offset	= 0x40 * 8 + 8,  }; -static void rockchip_gpio_set(struct gpio_chip *chip, unsigned int offset, -			      int val) +static int rockchip_gpio_set(struct gpio_chip *chip, unsigned int offset, +			     int val)  {  	struct syscon_gpio_priv *priv = gpiochip_get_data(chip);  	unsigned int offs; @@ -144,6 +142,8 @@ static void rockchip_gpio_set(struct gpio_chip *chip, unsigned int offset,  			   data);  	if (ret < 0)  		dev_err(chip->parent, "gpio write failed ret(%d)\n", ret); + +	return ret;  }  static const struct syscon_gpio_data rockchip_rk3328_gpio_mute = { @@ -156,7 +156,8 @@ static const struct syscon_gpio_data rockchip_rk3328_gpio_mute = {  #define KEYSTONE_LOCK_BIT BIT(0) -static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val) +static int keystone_gpio_set(struct gpio_chip *chip, unsigned int offset, +			     int val)  {  	struct syscon_gpio_priv *priv = gpiochip_get_data(chip);  	unsigned int offs; @@ -165,7 +166,7 @@ static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val)  	offs = priv->dreg_offset + priv->data->dat_bit_offset + offset;  	if (!val) -		return; +		return 0;  	ret = regmap_update_bits(  			priv->syscon, @@ -174,6 +175,8 @@ static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val)  			BIT(offs % SYSCON_REG_BITS) | KEYSTONE_LOCK_BIT);  	if (ret < 0)  		dev_err(chip->parent, "gpio write failed ret(%d)\n", ret); + +	return ret;  }  static const struct syscon_gpio_data keystone_dsp_gpio = { @@ -248,7 +251,7 @@ static int syscon_gpio_probe(struct platform_device *pdev)  	if (priv->data->flags & GPIO_SYSCON_FEAT_IN)  		priv->chip.direction_input = syscon_gpio_dir_in;  	if (priv->data->flags & GPIO_SYSCON_FEAT_OUT) { -		priv->chip.set = priv->data->set ? : syscon_gpio_set; +		priv->chip.set_rv = priv->data->set ? : syscon_gpio_set;  		priv->chip.direction_output = syscon_gpio_dir_out;  	}  | 
