summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2011-12-09 19:21:36 -0800
committerVarun Wadekar <vwadekar@nvidia.com>2011-12-21 12:06:22 +0530
commita43895ffdda87f651ef75f74b6f0e98524775a8d (patch)
tree9bcbe3b32251436eeafae2386adb15cdcb37bdc2
parentc120cd23315024dd1edd2f268a6a3c73826f826d (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>
-rw-r--r--arch/arm/mach-tegra/pm-t3.c22
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)