[OpenWrt-Devel] [PATCH] brcm63xx: fix external IRQs

dani dgcbueu at gmail.com
Mon Apr 11 07:26:15 EDT 2016


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 at gmail.com>
diff --git a/target/linux/brcm63xx/patches-4.1/321-irqchip-add-support-for-bcm6345-style-external-inter.patch b/target/linux/brcm63xx/patches-4.1/321-irqchip-add-support-for-bcm6345-style-external-inter.patch
index 5ee5ee2..4dd5130 100644
--- a/target/linux/brcm63xx/patches-4.1/321-irqchip-add-support-for-bcm6345-style-external-inter.patch
+++ b/target/linux/brcm63xx/patches-4.1/321-irqchip-add-support-for-bcm6345-style-external-inter.patch
@@ -148,7 +148,7 @@ Signed-off-by: Jonas Gorski <jogo at openwrt.org>
 +
 +	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);
 +}
@@ -161,7 +161,7 @@ Signed-off-by: Jonas Gorski <jogo at openwrt.org>
 +
 +	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);
 +}
@@ -174,7 +174,7 @@ Signed-off-by: Jonas Gorski <jogo at openwrt.org>
 +
 +	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);
 +}
@@ -222,17 +222,17 @@ Signed-off-by: Jonas Gorski <jogo at openwrt.org>
 +	reg = __raw_readl(priv->reg);
 +
 +	if (levelsense)
-+		reg |= hwirq << (EXTIRQ_CFG_LEVELSENSE * priv->shift);
++		reg |= 1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift);
 +	else
-+		reg &= ~(hwirq << (EXTIRQ_CFG_LEVELSENSE * priv->shift));
++		reg &= ~(1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift));
 +	if (sense)
-+		reg |= hwirq << (EXTIRQ_CFG_SENSE * priv->shift);
++		reg |= 1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift);
 +	else
-+		reg &= ~(hwirq << (EXTIRQ_CFG_SENSE * priv->shift));
++		reg &= ~(1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift));
 +	if (bothedge)
-+		reg |= hwirq << (EXTIRQ_CFG_BOTHEDGE * priv->shift);
++		reg |= 1 << (hwirq + EXTIRQ_CFG_BOTHEDGE * priv->shift);
 +	else
-+		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);
diff --git a/target/linux/brcm63xx/patches-4.4/321-irqchip-add-support-for-bcm6345-style-external-inter.patch b/target/linux/brcm63xx/patches-4.4/321-irqchip-add-support-for-bcm6345-style-external-inter.patch
index 4f4d7bd..2526456 100644
--- a/target/linux/brcm63xx/patches-4.4/321-irqchip-add-support-for-bcm6345-style-external-inter.patch
+++ b/target/linux/brcm63xx/patches-4.4/321-irqchip-add-support-for-bcm6345-style-external-inter.patch
@@ -148,7 +148,7 @@ Signed-off-by: Jonas Gorski <jogo at openwrt.org>
 +
 +	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);
 +}
@@ -161,7 +161,7 @@ Signed-off-by: Jonas Gorski <jogo at openwrt.org>
 +
 +	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);
 +}
@@ -174,7 +174,7 @@ Signed-off-by: Jonas Gorski <jogo at openwrt.org>
 +
 +	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);
 +}
@@ -222,17 +222,17 @@ Signed-off-by: Jonas Gorski <jogo at openwrt.org>
 +	reg = __raw_readl(priv->reg);
 +
 +	if (levelsense)
-+		reg |= hwirq << (EXTIRQ_CFG_LEVELSENSE * priv->shift);
++		reg |= 1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift);
 +	else
-+		reg &= ~(hwirq << (EXTIRQ_CFG_LEVELSENSE * priv->shift));
++		reg &= ~(1 << (hwirq + EXTIRQ_CFG_LEVELSENSE * priv->shift));
 +	if (sense)
-+		reg |= hwirq << (EXTIRQ_CFG_SENSE * priv->shift);
++		reg |= 1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift);
 +	else
-+		reg &= ~(hwirq << (EXTIRQ_CFG_SENSE * priv->shift));
++		reg &= ~(1 << (hwirq + EXTIRQ_CFG_SENSE * priv->shift));
 +	if (bothedge)
-+		reg |= hwirq << (EXTIRQ_CFG_BOTHEDGE * priv->shift);
++		reg |= 1 << (hwirq + EXTIRQ_CFG_BOTHEDGE * priv->shift);
 +	else
-+		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);
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list