| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Maulik Shah <mkshah@codeaurora.org> |
| Date: Fri, 13 Sep 2019 15:59:17 -0600 |
| Subject: FROMLIST: drivers: irqchip: pdc: Add irqchip set/get state calls |
| |
| Add irqchip calls to set/get interrupt state from the parent interrupt |
| controller. When GPIOs are renabled as interrupt lines, it is desirable |
| to clear the interrupt state at the GIC. This avoids any unwanted |
| interrupt as a result of stale pending state recorded when the line was |
| used as a GPIO. |
| |
| Signed-off-by: Maulik Shah <mkshah@codeaurora.org> |
| [updated commit text] |
| Signed-off-by: Lina Iyer <ilina@codeaurora.org> |
| |
| BUG: 141169320 |
| TEST: Build and boot |
| |
| Change-Id: Ie0042161727f2c8b1ebe0dd2165cbc4f20612f30 |
| Signed-off-by: Maulik Shah <mkshah@codeaurora.org> |
| Link: https://patchwork.kernel.org/patch/11145349 |
| --- |
| drivers/irqchip/qcom-pdc.c | 21 +++++++++++++++++++++ |
| 1 file changed, 21 insertions(+) |
| |
| diff --git a/drivers/irqchip/qcom-pdc.c b/drivers/irqchip/qcom-pdc.c |
| index affb0bfa1701..2b49e704178d 100644 |
| --- a/drivers/irqchip/qcom-pdc.c |
| +++ b/drivers/irqchip/qcom-pdc.c |
| @@ -5,6 +5,7 @@ |
| |
| #include <linux/err.h> |
| #include <linux/init.h> |
| +#include <linux/interrupt.h> |
| #include <linux/irq.h> |
| #include <linux/irqchip.h> |
| #include <linux/irqdomain.h> |
| @@ -87,6 +88,24 @@ static void qcom_pdc_gic_disable(struct irq_data *d) |
| irq_chip_disable_parent(d); |
| } |
| |
| +static int qcom_pdc_gic_get_irqchip_state(struct irq_data *d, |
| + enum irqchip_irq_state which, bool *state) |
| +{ |
| + if (d->hwirq == GPIO_NO_WAKE_IRQ) |
| + return 0; |
| + |
| + return irq_chip_get_parent_state(d, which, state); |
| +} |
| + |
| +static int qcom_pdc_gic_set_irqchip_state(struct irq_data *d, |
| + enum irqchip_irq_state which, bool value) |
| +{ |
| + if (d->hwirq == GPIO_NO_WAKE_IRQ) |
| + return 0; |
| + |
| + return irq_chip_set_parent_state(d, which, value); |
| +} |
| + |
| static void qcom_pdc_gic_enable(struct irq_data *d) |
| { |
| if (d->hwirq == GPIO_NO_WAKE_IRQ) |
| @@ -248,6 +267,8 @@ static struct irq_chip qcom_pdc_gic_chip = { |
| .irq_unmask = qcom_pdc_gic_unmask, |
| .irq_disable = qcom_pdc_gic_disable, |
| .irq_enable = qcom_pdc_gic_enable, |
| + .irq_get_irqchip_state = qcom_pdc_gic_get_irqchip_state, |
| + .irq_set_irqchip_state = qcom_pdc_gic_set_irqchip_state, |
| .irq_retrigger = irq_chip_retrigger_hierarchy, |
| .irq_set_type = qcom_pdc_gic_set_type, |
| .flags = IRQCHIP_MASK_ON_SUSPEND | |