diff options
Diffstat (limited to 'drivers/gpio/gpio-davinci.c')
| -rw-r--r-- | drivers/gpio/gpio-davinci.c | 34 | 
1 files changed, 16 insertions, 18 deletions
diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c index 63fc7888c1d4..80a82492171e 100644 --- a/drivers/gpio/gpio-davinci.c +++ b/drivers/gpio/gpio-davinci.c @@ -68,15 +68,6 @@ static inline u32 __gpio_mask(unsigned gpio)  	return 1 << (gpio % 32);  } -static inline struct davinci_gpio_regs __iomem *irq2regs(struct irq_data *d) -{ -	struct davinci_gpio_regs __iomem *g; - -	g = (__force struct davinci_gpio_regs __iomem *)irq_data_get_irq_chip_data(d); - -	return g; -} -  static int davinci_gpio_irq_setup(struct platform_device *pdev);  /*--------------------------------------------------------------------------*/ @@ -255,19 +246,27 @@ static int davinci_gpio_probe(struct platform_device *pdev)  static void gpio_irq_mask(struct irq_data *d)  { -	struct davinci_gpio_regs __iomem *g = irq2regs(d); +	struct davinci_gpio_controller *chips = irq_data_get_irq_chip_data(d); +	irq_hw_number_t hwirq = irqd_to_hwirq(d); +	struct davinci_gpio_regs __iomem *g = chips->regs[hwirq / 32];  	uintptr_t mask = (uintptr_t)irq_data_get_irq_handler_data(d);  	writel_relaxed(mask, &g->clr_falling);  	writel_relaxed(mask, &g->clr_rising); + +	gpiochip_disable_irq(&chips->chip, hwirq);  }  static void gpio_irq_unmask(struct irq_data *d)  { -	struct davinci_gpio_regs __iomem *g = irq2regs(d); +	struct davinci_gpio_controller *chips = irq_data_get_irq_chip_data(d); +	irq_hw_number_t hwirq = irqd_to_hwirq(d); +	struct davinci_gpio_regs __iomem *g = chips->regs[hwirq / 32];  	uintptr_t mask = (uintptr_t)irq_data_get_irq_handler_data(d);  	unsigned status = irqd_get_trigger_type(d); +	gpiochip_enable_irq(&chips->chip, hwirq); +  	status &= IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING;  	if (!status)  		status = IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING; @@ -286,12 +285,13 @@ static int gpio_irq_type(struct irq_data *d, unsigned trigger)  	return 0;  } -static struct irq_chip gpio_irqchip = { +static const struct irq_chip gpio_irqchip = {  	.name		= "GPIO",  	.irq_unmask	= gpio_irq_unmask,  	.irq_mask	= gpio_irq_mask,  	.irq_set_type	= gpio_irq_type, -	.flags		= IRQCHIP_SET_TYPE_MASKED | IRQCHIP_SKIP_SET_WAKE, +	.flags		= IRQCHIP_IMMUTABLE | IRQCHIP_SET_TYPE_MASKED | IRQCHIP_SKIP_SET_WAKE, +	GPIOCHIP_IRQ_RESOURCE_HELPERS,  };  static void gpio_irq_handler(struct irq_desc *desc) @@ -399,12 +399,11 @@ davinci_gpio_irq_map(struct irq_domain *d, unsigned int irq,  {  	struct davinci_gpio_controller *chips =  				(struct davinci_gpio_controller *)d->host_data; -	struct davinci_gpio_regs __iomem *g = chips->regs[hw / 32];  	irq_set_chip_and_handler_name(irq, &gpio_irqchip, handle_simple_irq,  				"davinci_gpio");  	irq_set_irq_type(irq, IRQ_TYPE_NONE); -	irq_set_chip_data(irq, (__force void *)g); +	irq_set_chip_data(irq, (__force void *)chips);  	irq_set_handler_data(irq, (void *)(uintptr_t)__gpio_mask(hw));  	return 0; @@ -479,9 +478,8 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev)  			return irq;  		} -		irq_domain = irq_domain_add_legacy(dev->of_node, ngpio, irq, 0, -							&davinci_gpio_irq_ops, -							chips); +		irq_domain = irq_domain_create_legacy(of_fwnode_handle(dev->of_node), ngpio, irq, 0, +						      &davinci_gpio_irq_ops, chips);  		if (!irq_domain) {  			dev_err(dev, "Couldn't register an IRQ domain\n");  			return -ENODEV;  | 
