diff options
Diffstat (limited to 'drivers/gpio/gpio-rcar.c')
| -rw-r--r-- | drivers/gpio/gpio-rcar.c | 20 | 
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c index 4d9a315cfd43..681c93fb9e70 100644 --- a/drivers/gpio/gpio-rcar.c +++ b/drivers/gpio/gpio-rcar.c @@ -284,6 +284,25 @@ static void gpio_rcar_set(struct gpio_chip *chip, unsigned offset, int value)  	spin_unlock_irqrestore(&p->lock, flags);  } +static void gpio_rcar_set_multiple(struct gpio_chip *chip, unsigned long *mask, +				   unsigned long *bits) +{ +	struct gpio_rcar_priv *p = gpiochip_get_data(chip); +	unsigned long flags; +	u32 val, bankmask; + +	bankmask = mask[0] & GENMASK(chip->ngpio - 1, 0); +	if (!bankmask) +		return; + +	spin_lock_irqsave(&p->lock, flags); +	val = gpio_rcar_read(p, OUTDT); +	val &= ~bankmask; +	val |= (bankmask & bits[0]); +	gpio_rcar_write(p, OUTDT, val); +	spin_unlock_irqrestore(&p->lock, flags); +} +  static int gpio_rcar_direction_output(struct gpio_chip *chip, unsigned offset,  				      int value)  { @@ -425,6 +444,7 @@ static int gpio_rcar_probe(struct platform_device *pdev)  	gpio_chip->get = gpio_rcar_get;  	gpio_chip->direction_output = gpio_rcar_direction_output;  	gpio_chip->set = gpio_rcar_set; +	gpio_chip->set_multiple = gpio_rcar_set_multiple;  	gpio_chip->label = name;  	gpio_chip->parent = dev;  	gpio_chip->owner = THIS_MODULE;  |