|
@@ -105,6 +105,32 @@ static void mpc8xxx_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
|
|
|
spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
|
|
}
|
|
|
|
|
|
+static void mpc8xxx_gpio_set_multiple(struct gpio_chip *gc,
|
|
|
+ unsigned long *mask, unsigned long *bits)
|
|
|
+{
|
|
|
+ struct of_mm_gpio_chip *mm = to_of_mm_gpio_chip(gc);
|
|
|
+ struct mpc8xxx_gpio_chip *mpc8xxx_gc = to_mpc8xxx_gpio_chip(mm);
|
|
|
+ unsigned long flags;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
|
|
+
|
|
|
+ for (i = 0; i < gc->ngpio; i++) {
|
|
|
+ if (*mask == 0)
|
|
|
+ break;
|
|
|
+ if (__test_and_clear_bit(i, mask)) {
|
|
|
+ if (test_bit(i, bits))
|
|
|
+ mpc8xxx_gc->data |= mpc8xxx_gpio2mask(i);
|
|
|
+ else
|
|
|
+ mpc8xxx_gc->data &= ~mpc8xxx_gpio2mask(i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ out_be32(mm->regs + GPIO_DAT, mpc8xxx_gc->data);
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);
|
|
|
+}
|
|
|
+
|
|
|
static int mpc8xxx_gpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
|
|
|
{
|
|
|
struct of_mm_gpio_chip *mm = to_of_mm_gpio_chip(gc);
|
|
@@ -344,6 +370,7 @@ static void __init mpc8xxx_add_controller(struct device_node *np)
|
|
|
gc->get = of_device_is_compatible(np, "fsl,mpc8572-gpio") ?
|
|
|
mpc8572_gpio_get : mpc8xxx_gpio_get;
|
|
|
gc->set = mpc8xxx_gpio_set;
|
|
|
+ gc->set_multiple = mpc8xxx_gpio_set_multiple;
|
|
|
gc->to_irq = mpc8xxx_gpio_to_irq;
|
|
|
|
|
|
ret = of_mm_gpiochip_add(np, mm_gc);
|