diff options
author | Li, Ning <ning.li@intel.com> | 2014-04-17 11:45:37 +0800 |
---|---|---|
committer | Bertolin, PierreX <pierrex.bertolin@intel.com> | 2017-02-27 02:49:58 -0800 |
commit | 2d32df3ef76cf914d81193989b55b35593f4dad7 (patch) | |
tree | 18e52ea0261d3ad24b0cf814450f7e0099312dd0 | |
parent | 2376bf08fb047ad4777507ec57e3c59b72590b36 (diff) | |
download | x86-2d32df3ef76cf914d81193989b55b35593f4dad7.tar.gz |
gpio-langwell: clear interrupt status during unmask if it's level trigger
Ported from 3.10. Original hash:
64bea5de1658e55df773c35727765c902775569b
BZ: 187229
Clear interrupt status again during unmask if it's level trigger to
prevent interrupt fired twice.
Change-Id: Ia1e5b1a7db9de5c49df5390f5d1737f109b18278
Tracked-On: https://jira01.devtools.intel.com/browse/AW-4388
Signed-off-by: Li, Ning <ning.li@intel.com>
Reviewed-on: https://android.intel.com/569552
Reviewed-by: Chaumette, HubertX <hubertx.chaumette@intel.com>
Tested-by: Chaumette, HubertX <hubertx.chaumette@intel.com>
Reviewed-by: Ghaddab, RiadhX <riadhx.ghaddab@intel.com>
Reviewed-by: Deverge, Jean-francoisX <jean-francoisx.deverge@intel.com>
Reviewed-by: Dubray, SimonX <simonx.dubray@intel.com>
Reviewed-by: Hu, Bingquan <bingquan.hu@intel.com>
Reviewed-by: Bel Aj Ali, HabibX <habibx.bel.aj.ali@intel.com>
Reviewed-by: Tasayco Loarte, VictorX <victorx.tasayco.loarte@intel.com>
-rw-r--r-- | drivers/gpio/gpio-langwell.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-langwell.c b/drivers/gpio/gpio-langwell.c index 33c8da887220..04d65e1c82d2 100644 --- a/drivers/gpio/gpio-langwell.c +++ b/drivers/gpio/gpio-langwell.c @@ -616,6 +616,7 @@ static void lnw_irq_unmask(struct irq_data *d) struct lnw_gpio *lnw = irq_data_get_irq_chip_data(d); u32 gpio = irqd_to_hwirq(d); void __iomem *gpit; + void __iomem *gisr; if (gpio >= lnw->chip.ngpio) return; @@ -630,6 +631,12 @@ static void lnw_irq_unmask(struct irq_data *d) break; case TANGIER_GPIO: + gpit = gpio_reg(&lnw->chip, gpio, GITR); + gisr = gpio_reg(&lnw->chip, gpio, GISR); + + if (readl(gpit) & BIT(gpio % 32)) + writel(BIT(gpio % 32), gisr); + lnw_set_maskunmask(d, GIMR, 1); break; default: |