aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaulik Shah <mkshah@codeaurora.org>2020-08-03 13:58:11 +0530
committerMohit Sharma <smohit@codeaurora.org>2020-08-10 09:28:08 +0530
commit06855494ea20af9ca41aae4d3c5d9c6501340486 (patch)
tree5f5fb2b4917b2b809115f64d8c4289a8a9526217
parent21387108f166b8371bb53677d8ebca2542232b54 (diff)
pinctrl: qcom: Add back irq_disable callback from msmmgpio irqchipLA.UM.8.13.r1-09600-SAIPAN.0
Commit 80654a5590cd26 ("pinctrl: qcom: Remove irq_disable callback from msmmgpio irqchip") removed irq_disable callback and started using irq_mask instead. msmgpio's parent PDC irq_chip will still use irq_disable and irq_mask callbacks separately. Add irq_disable callback back to allow it to reach its parent PDC irqchip. Change-Id: I256792c50ac7d4eea2d1ba0e76e13081bda65a7c Signed-off-by: Maulik Shah <mkshah@codeaurora.org>
-rw-r--r--drivers/pinctrl/qcom/pinctrl-msm.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
index 4d88da68ede7..f8ce0eac1ae8 100644
--- a/drivers/pinctrl/qcom/pinctrl-msm.c
+++ b/drivers/pinctrl/qcom/pinctrl-msm.c
@@ -778,6 +778,33 @@ static void msm_gpio_irq_unmask(struct irq_data *d)
_msm_gpio_irq_unmask(d, false);
}
+static void msm_gpio_irq_disable(struct irq_data *d)
+{
+ struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+ struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
+ struct irq_data *dir_conn_data;
+ irq_hw_number_t dir_conn_irq = 0;
+
+ if (d->parent_data) {
+ if (is_gpio_dual_edge(d, &dir_conn_irq)) {
+ dir_conn_data = irq_get_irq_data(dir_conn_irq);
+ if (!dir_conn_data)
+ return;
+
+ if (dir_conn_data->chip->irq_disable)
+ dir_conn_data->chip->irq_disable(dir_conn_data);
+ else
+ dir_conn_data->chip->irq_mask(dir_conn_data);
+ }
+ irq_chip_disable_parent(d);
+ }
+
+ if (test_bit(d->hwirq, pctrl->wakeup_masked_irqs))
+ return;
+
+ _msm_gpio_irq_mask(d);
+}
+
static void msm_gpio_irq_enable(struct irq_data *d)
{
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
@@ -1315,6 +1342,7 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
pctrl->irq_chip.name = "msmgpio";
pctrl->irq_chip.irq_eoi = irq_chip_eoi_parent;
pctrl->irq_chip.irq_enable = msm_gpio_irq_enable;
+ pctrl->irq_chip.irq_disable = msm_gpio_irq_disable;
pctrl->irq_chip.irq_mask = msm_gpio_irq_mask;
pctrl->irq_chip.irq_unmask = msm_gpio_irq_unmask;
pctrl->irq_chip.irq_ack = msm_gpio_irq_ack;