diff options
Diffstat (limited to 'drivers/gpio/gpio-em.c')
| -rw-r--r-- | drivers/gpio/gpio-em.c | 28 | 
1 files changed, 25 insertions, 3 deletions
diff --git a/drivers/gpio/gpio-em.c b/drivers/gpio/gpio-em.c index ec190361bf2e..1e98a9873967 100644 --- a/drivers/gpio/gpio-em.c +++ b/drivers/gpio/gpio-em.c @@ -99,6 +99,27 @@ static void em_gio_irq_enable(struct irq_data *d)  	em_gio_write(p, GIO_IEN, BIT(irqd_to_hwirq(d)));  } +static unsigned int em_gio_irq_startup(struct irq_data *d) +{ +	struct em_gio_priv *p = irq_data_get_irq_chip_data(d); + +	if (gpio_lock_as_irq(&p->gpio_chip, irqd_to_hwirq(d))) +		dev_err(p->gpio_chip.dev, +			"unable to lock HW IRQ %lu for IRQ\n", +			irqd_to_hwirq(d)); +	em_gio_irq_enable(d); +	return 0; +} + +static void em_gio_irq_shutdown(struct irq_data *d) +{ +	struct em_gio_priv *p = irq_data_get_irq_chip_data(d); + +	em_gio_irq_disable(d); +	gpio_unlock_as_irq(&p->gpio_chip, irqd_to_hwirq(d)); +} + +  #define GIO_ASYNC(x) (x + 8)  static unsigned char em_gio_sense_table[IRQ_TYPE_SENSE_MASK + 1] = { @@ -328,6 +349,7 @@ static int em_gio_probe(struct platform_device *pdev)  	gpio_chip->request = em_gio_request;  	gpio_chip->free = em_gio_free;  	gpio_chip->label = name; +	gpio_chip->dev = &pdev->dev;  	gpio_chip->owner = THIS_MODULE;  	gpio_chip->base = pdata->gpio_base;  	gpio_chip->ngpio = pdata->number_of_pins; @@ -336,10 +358,10 @@ static int em_gio_probe(struct platform_device *pdev)  	irq_chip->name = name;  	irq_chip->irq_mask = em_gio_irq_disable;  	irq_chip->irq_unmask = em_gio_irq_enable; -	irq_chip->irq_enable = em_gio_irq_enable; -	irq_chip->irq_disable = em_gio_irq_disable;  	irq_chip->irq_set_type = em_gio_irq_set_type; -	irq_chip->flags	= IRQCHIP_SKIP_SET_WAKE; +	irq_chip->irq_startup = em_gio_irq_startup; +	irq_chip->irq_shutdown = em_gio_irq_shutdown; +	irq_chip->flags	= IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND;  	p->irq_domain = irq_domain_add_simple(pdev->dev.of_node,  					      pdata->number_of_pins,  |