summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi, Ning <ning.li@intel.com>2014-04-17 11:45:37 +0800
committerBertolin, PierreX <pierrex.bertolin@intel.com>2017-02-27 02:49:58 -0800
commit2d32df3ef76cf914d81193989b55b35593f4dad7 (patch)
tree18e52ea0261d3ad24b0cf814450f7e0099312dd0
parent2376bf08fb047ad4777507ec57e3c59b72590b36 (diff)
downloadx86-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.c7
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: