diff options
Diffstat (limited to 'drivers/gpio/gpio-mpc8xxx.c')
| -rw-r--r-- | drivers/gpio/gpio-mpc8xxx.c | 17 | 
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c index a0b33a216d4..d7d6d72eba3 100644 --- a/drivers/gpio/gpio-mpc8xxx.c +++ b/drivers/gpio/gpio-mpc8xxx.c @@ -14,6 +14,7 @@  #include <linux/io.h>  #include <linux/of.h>  #include <linux/of_gpio.h> +#include <linux/of_irq.h>  #include <linux/gpio.h>  #include <linux/slab.h>  #include <linux/irq.h> @@ -69,10 +70,14 @@ static int mpc8572_gpio_get(struct gpio_chip *gc, unsigned int gpio)  	u32 val;  	struct of_mm_gpio_chip *mm = to_of_mm_gpio_chip(gc);  	struct mpc8xxx_gpio_chip *mpc8xxx_gc = to_mpc8xxx_gpio_chip(mm); +	u32 out_mask, out_shadow; -	val = in_be32(mm->regs + GPIO_DAT) & ~in_be32(mm->regs + GPIO_DIR); +	out_mask = in_be32(mm->regs + GPIO_DIR); -	return (val | mpc8xxx_gc->data) & mpc8xxx_gpio2mask(gpio); +	val = in_be32(mm->regs + GPIO_DAT) & ~out_mask; +	out_shadow = mpc8xxx_gc->data & out_mask; + +	return (val | out_shadow) & mpc8xxx_gpio2mask(gpio);  }  static int mpc8xxx_gpio_get(struct gpio_chip *gc, unsigned int gpio) @@ -282,16 +287,16 @@ static struct irq_chip mpc8xxx_irq_chip = {  	.irq_set_type	= mpc8xxx_irq_set_type,  }; -static int mpc8xxx_gpio_irq_map(struct irq_domain *h, unsigned int virq, -				irq_hw_number_t hw) +static int mpc8xxx_gpio_irq_map(struct irq_domain *h, unsigned int irq, +				irq_hw_number_t hwirq)  {  	struct mpc8xxx_gpio_chip *mpc8xxx_gc = h->host_data;  	if (mpc8xxx_gc->of_dev_id_data)  		mpc8xxx_irq_chip.irq_set_type = mpc8xxx_gc->of_dev_id_data; -	irq_set_chip_data(virq, h->host_data); -	irq_set_chip_and_handler(virq, &mpc8xxx_irq_chip, handle_level_irq); +	irq_set_chip_data(irq, h->host_data); +	irq_set_chip_and_handler(irq, &mpc8xxx_irq_chip, handle_level_irq);  	return 0;  }  | 
