diff options
author | Alex Frid <afrid@nvidia.com> | 2011-12-09 19:21:36 -0800 |
---|---|---|
committer | Varun Wadekar <vwadekar@nvidia.com> | 2011-12-21 12:06:22 +0530 |
commit | a43895ffdda87f651ef75f74b6f0e98524775a8d (patch) | |
tree | 9bcbe3b32251436eeafae2386adb15cdcb37bdc2 /arch/arm | |
parent | c120cd23315024dd1edd2f268a6a3c73826f826d (diff) |
ARM: tegra: power: Restore IRQ multiple CPU affinity
Restore IRQ affinity to multiple CPUs after LP=>G CPU mode switch.
Change-Id: Id7c263f2a11535669d1e9988f4e15b240a7fde38
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/69329
Reviewed-by: Lokesh Pathak <lpathak@nvidia.com>
Tested-by: Lokesh Pathak <lpathak@nvidia.com>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-tegra/pm-t3.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/arch/arm/mach-tegra/pm-t3.c b/arch/arm/mach-tegra/pm-t3.c index 23ff0fe4c97c..6e7bc03cdc34 100644 --- a/arch/arm/mach-tegra/pm-t3.c +++ b/arch/arm/mach-tegra/pm-t3.c @@ -23,6 +23,7 @@ #include <linux/interrupt.h> #include <linux/clk.h> #include <linux/delay.h> +#include <linux/irq.h> #include <mach/gpio.h> #include <mach/iomap.h> @@ -261,8 +262,25 @@ static void cluster_switch_epilog_gic(void) max_irq = readl(gic_base + GIC_DIST_CTR) & 0x1f; max_irq = (max_irq + 1) * 32; - for (i = 32; i < max_irq; i += 4) - writel(0x01010101, gic_base + GIC_DIST_TARGET + i * 4 / 4); + for (i = 32; i < max_irq; i += 4) { + u32 val = 0x01010101; +#ifdef CONFIG_GIC_SET_MULTIPLE_CPUS + unsigned int irq; + for (irq = i; irq < (i + 4); irq++) { + struct cpumask mask; + struct irq_desc *desc = irq_to_desc(irq); + + if (desc && desc->affinity_hint && + desc->irq_data.affinity) { + if (cpumask_and(&mask, desc->affinity_hint, + desc->irq_data.affinity)) + val |= (*cpumask_bits(&mask) & 0xff) << + ((irq & 3) * 8); + } + } +#endif + writel(val, gic_base + GIC_DIST_TARGET + i * 4 / 4); + } } void tegra_cluster_switch_epilog(unsigned int flags) |