diff options
Diffstat (limited to 'drivers/gpio/gpio-adnp.c')
| -rw-r--r-- | drivers/gpio/gpio-adnp.c | 25 | 
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c index b204033acaeb..6fc6206b38bd 100644 --- a/drivers/gpio/gpio-adnp.c +++ b/drivers/gpio/gpio-adnp.c @@ -260,7 +260,7 @@ static int adnp_gpio_setup(struct adnp *adnp, unsigned int num_gpios)  	chip->direction_output = adnp_gpio_direction_output;  	chip->get = adnp_gpio_get;  	chip->set = adnp_gpio_set; -	chip->can_sleep = 1; +	chip->can_sleep = true;  	if (IS_ENABLED(CONFIG_DEBUG_FS))  		chip->dbg_show = adnp_gpio_dbg_show; @@ -408,6 +408,27 @@ static void adnp_irq_bus_unlock(struct irq_data *data)  	mutex_unlock(&adnp->irq_lock);  } +static unsigned int adnp_irq_startup(struct irq_data *data) +{ +	struct adnp *adnp = irq_data_get_irq_chip_data(data); + +	if (gpio_lock_as_irq(&adnp->gpio, data->hwirq)) +		dev_err(adnp->gpio.dev, +			"unable to lock HW IRQ %lu for IRQ\n", +			data->hwirq); +	/* Satisfy the .enable semantics by unmasking the line */ +	adnp_irq_unmask(data); +	return 0; +} + +static void adnp_irq_shutdown(struct irq_data *data) +{ +	struct adnp *adnp = irq_data_get_irq_chip_data(data); + +	adnp_irq_mask(data); +	gpio_unlock_as_irq(&adnp->gpio, data->hwirq); +} +  static struct irq_chip adnp_irq_chip = {  	.name = "gpio-adnp",  	.irq_mask = adnp_irq_mask, @@ -415,6 +436,8 @@ static struct irq_chip adnp_irq_chip = {  	.irq_set_type = adnp_irq_set_type,  	.irq_bus_lock = adnp_irq_bus_lock,  	.irq_bus_sync_unlock = adnp_irq_bus_unlock, +	.irq_startup = adnp_irq_startup, +	.irq_shutdown = adnp_irq_shutdown,  };  static int adnp_irq_map(struct irq_domain *domain, unsigned int irq,  |