diff options
Diffstat (limited to 'drivers/gpio/gpio-davinci.c')
| -rw-r--r-- | drivers/gpio/gpio-davinci.c | 26 | 
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c index df0d59570a84..3d000169285d 100644 --- a/drivers/gpio/gpio-davinci.c +++ b/drivers/gpio/gpio-davinci.c @@ -313,10 +313,16 @@ static int gpio_to_irq_unbanked(struct gpio_chip *chip, unsigned offset)  		return -ENODEV;  } -static int gpio_irq_type_unbanked(struct irq_data *d, unsigned trigger) +static int gpio_irq_type_unbanked(struct irq_data *data, unsigned trigger)  { -	struct davinci_gpio_regs __iomem *g = irq2regs(d->irq); -	u32 mask = (u32) irq_data_get_irq_handler_data(d); +	struct davinci_gpio_controller *d; +	struct davinci_gpio_regs __iomem *g; +	struct davinci_soc_info *soc_info = &davinci_soc_info; +	u32 mask; + +	d = (struct davinci_gpio_controller *)data->handler_data; +	g = (struct davinci_gpio_regs __iomem *)d->regs; +	mask = __gpio_mask(data->irq - soc_info->gpio_irq);  	if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))  		return -EINVAL; @@ -380,7 +386,7 @@ static int __init davinci_gpio_irq_setup(void)  	 * IRQ mux conflicts; gpio_irq_type_unbanked() is only for GPIOs.  	 */  	if (soc_info->gpio_unbanked) { -		static struct irq_chip gpio_irqchip_unbanked; +		static struct irq_chip_type gpio_unbanked;  		/* pass "bank 0" GPIO IRQs to AINTC */  		chips[0].chip.to_irq = gpio_to_irq_unbanked; @@ -388,9 +394,10 @@ static int __init davinci_gpio_irq_setup(void)  		/* AINTC handles mask/unmask; GPIO handles triggering */  		irq = bank_irq; -		gpio_irqchip_unbanked = *irq_get_chip(irq); -		gpio_irqchip_unbanked.name = "GPIO-AINTC"; -		gpio_irqchip_unbanked.irq_set_type = gpio_irq_type_unbanked; +		gpio_unbanked = *container_of(irq_get_chip(irq), +					      struct irq_chip_type, chip); +		gpio_unbanked.chip.name = "GPIO-AINTC"; +		gpio_unbanked.chip.irq_set_type = gpio_irq_type_unbanked;  		/* default trigger: both edges */  		g = gpio2regs(0); @@ -399,9 +406,8 @@ static int __init davinci_gpio_irq_setup(void)  		/* set the direct IRQs up to use that irqchip */  		for (gpio = 0; gpio < soc_info->gpio_unbanked; gpio++, irq++) { -			irq_set_chip(irq, &gpio_irqchip_unbanked); -			irq_set_handler_data(irq, (void *)__gpio_mask(gpio)); -			irq_set_chip_data(irq, (__force void *)g); +			irq_set_chip(irq, &gpio_unbanked.chip); +			irq_set_handler_data(irq, &chips[gpio / 32]);  			irq_set_status_flags(irq, IRQ_TYPE_EDGE_BOTH);  		}  |