brcm63xx: fix external IRQs

External IRQs are currently broken, fix the BCM6345_EXT_IRQ driver.

Since the adoption of the new driver irq-bcm6345-ext, in Chaos Calmer,
external IRQs don't work. It seems there were some minor errors at the initial
development of the driver.

This patch fixes the ticket https://dev.openwrt.org/ticket/21613

Signed-off-by: Daniel Gonzalez <dgcbueu@gmail.com>
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
This commit is contained in:
Daniel Gonzalez 2016-04-11 13:26:15 +02:00 committed by Jonas Gorski
parent 6b5f6d6601
commit 29444e4754

View File

@ -148,7 +148,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+ +
+ raw_spin_lock(&priv->lock); + raw_spin_lock(&priv->lock);
+ reg = __raw_readl(priv->reg); + reg = __raw_readl(priv->reg);
+ reg |= hwirq << (EXTIRQ_CFG_CLEAR * priv->shift); + reg |= 1 << (hwirq + EXTIRQ_CFG_CLEAR * priv->shift);
+ __raw_writel(reg, priv->reg); + __raw_writel(reg, priv->reg);
+ raw_spin_unlock(&priv->lock); + raw_spin_unlock(&priv->lock);
+} +}
@ -161,7 +161,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+ +
+ raw_spin_lock(&priv->lock); + raw_spin_lock(&priv->lock);
+ reg = __raw_readl(priv->reg); + reg = __raw_readl(priv->reg);
+ reg &= ~(hwirq << (EXTIRQ_CFG_MASK * priv->shift)); + reg &= ~(1 << (hwirq + EXTIRQ_CFG_MASK * priv->shift));
+ __raw_writel(reg, priv->reg); + __raw_writel(reg, priv->reg);
+ raw_spin_unlock(&priv->lock); + raw_spin_unlock(&priv->lock);
+} +}
@ -174,7 +174,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+ +
+ raw_spin_lock(&priv->lock); + raw_spin_lock(&priv->lock);
+ reg = __raw_readl(priv->reg); + reg = __raw_readl(priv->reg);
+ reg |= hwirq << (EXTIRQ_CFG_MASK * priv->shift); + reg |= 1 << (hwirq + EXTIRQ_CFG_MASK * priv->shift);
+ __raw_writel(reg, priv->reg); + __raw_writel(reg, priv->reg);
+ raw_spin_unlock(&priv->lock); + raw_spin_unlock(&priv->lock);
+} +}
@ -222,17 +222,17 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+ reg = __raw_readl(priv->reg); + reg = __raw_readl(priv->reg);
+ +
+ if (levelsense) + if (levelsense)
+ reg |= hwirq << (EXTIRQ_CFG_LEVELSENSE * priv->shift); + reg |= 1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift);
+ else + else
+ reg &= ~(hwirq << (EXTIRQ_CFG_LEVELSENSE * priv->shift)); + reg &= ~(1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift));
+ if (sense) + if (sense)
+ reg |= hwirq << (EXTIRQ_CFG_SENSE * priv->shift); + reg |= 1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift);
+ else + else
+ reg &= ~(hwirq << (EXTIRQ_CFG_SENSE * priv->shift)); + reg &= ~(1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift));
+ if (bothedge) + if (bothedge)
+ reg |= hwirq << (EXTIRQ_CFG_BOTHEDGE * priv->shift); + reg |= 1 << (hwirq + EXTIRQ_CFG_BOTHEDGE * priv->shift);
+ else + else
+ reg &= ~(hwirq << (EXTIRQ_CFG_BOTHEDGE * priv->shift)); + reg &= ~(1 << (hwirq + EXTIRQ_CFG_BOTHEDGE * priv->shift));
+ +
+ __raw_writel(reg, priv->reg); + __raw_writel(reg, priv->reg);
+ raw_spin_unlock(&priv->lock); + raw_spin_unlock(&priv->lock);