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>
+
+ raw_spin_lock(&priv->lock);
+ reg = __raw_readl(priv->reg);
+
+ raw_spin_lock(&priv->lock);
+ 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_spin_unlock(&priv->lock);
+}
+ __raw_writel(reg, priv->reg);
+ raw_spin_unlock(&priv->lock);
+}
+
+ raw_spin_lock(&priv->lock);
+ reg = __raw_readl(priv->reg);
+
+ raw_spin_lock(&priv->lock);
+ 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_spin_unlock(&priv->lock);
+}
+ __raw_writel(reg, priv->reg);
+ raw_spin_unlock(&priv->lock);
+}
+
+ raw_spin_lock(&priv->lock);
+ reg = __raw_readl(priv->reg);
+
+ raw_spin_lock(&priv->lock);
+ 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_spin_unlock(&priv->lock);
+}
+ __raw_writel(reg, priv->reg);
+ raw_spin_unlock(&priv->lock);
+}
+ reg = __raw_readl(priv->reg);
+
+ if (levelsense)
+ reg = __raw_readl(priv->reg);
+
+ if (levelsense)
-+ reg |= hwirq << (EXTIRQ_CFG_LEVELSENSE * priv->shift);
++ reg |= 1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift);
-+ reg &= ~(hwirq << (EXTIRQ_CFG_LEVELSENSE * priv->shift));
++ reg &= ~(1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift));
-+ reg |= hwirq << (EXTIRQ_CFG_SENSE * priv->shift);
++ reg |= 1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift);
-+ reg &= ~(hwirq << (EXTIRQ_CFG_SENSE * priv->shift));
++ reg &= ~(1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift));
-+ reg |= hwirq << (EXTIRQ_CFG_BOTHEDGE * priv->shift);
++ reg |= 1 << (hwirq + EXTIRQ_CFG_BOTHEDGE * priv->shift);
-+ reg &= ~(hwirq << (EXTIRQ_CFG_BOTHEDGE * priv->shift));
++ reg &= ~(1 << (hwirq + EXTIRQ_CFG_BOTHEDGE * priv->shift));
+
+ __raw_writel(reg, priv->reg);
+ raw_spin_unlock(&priv->lock);
+
+ __raw_writel(reg, priv->reg);
+ raw_spin_unlock(&priv->lock);