summaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/pmu.c
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2011-02-18 16:21:06 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2011-02-19 12:24:05 +0100
commit71efb063f4a145ae420be054f5a91dcf7c19b375 (patch)
tree2fb96d55e39d687d378822b1598dca72c79b720e /arch/arm/kernel/pmu.c
parentARM: 6741/1: errata: pl310 cache sync operation may be faulty (diff)
downloadlinux-71efb063f4a145ae420be054f5a91dcf7c19b375.tar.xz
linux-71efb063f4a145ae420be054f5a91dcf7c19b375.zip
ARM: 6742/1: pmu: avoid setting IRQ affinity on UP systems
Now that we can execute a CONFIG_SMP kernel on a uniprocessor system, extra care has to be taken in the PMU IRQ affinity setting code to ensure that we don't always fail to initialise. This patch changes the CPU PMU initialisation code so that when we only have a single IRQ, whose affinity can not be changed at the controller, we report success (0) rather than -EINVAL. Reported-by: Avik Sil <avik.sil@linaro.org> Acked-by: Jamie Iles <jamie@jamieiles.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/pmu.c')
-rw-r--r--arch/arm/kernel/pmu.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/arch/arm/kernel/pmu.c b/arch/arm/kernel/pmu.c
index b8af96ea62e6..2c79eec19262 100644
--- a/arch/arm/kernel/pmu.c
+++ b/arch/arm/kernel/pmu.c
@@ -97,28 +97,34 @@ set_irq_affinity(int irq,
irq, cpu);
return err;
#else
- return 0;
+ return -EINVAL;
#endif
}
static int
init_cpu_pmu(void)
{
- int i, err = 0;
+ int i, irqs, err = 0;
struct platform_device *pdev = pmu_devices[ARM_PMU_DEVICE_CPU];
- if (!pdev) {
- err = -ENODEV;
- goto out;
- }
+ if (!pdev)
+ return -ENODEV;
+
+ irqs = pdev->num_resources;
+
+ /*
+ * If we have a single PMU interrupt that we can't shift, assume that
+ * we're running on a uniprocessor machine and continue.
+ */
+ if (irqs == 1 && !irq_can_set_affinity(platform_get_irq(pdev, 0)))
+ return 0;
- for (i = 0; i < pdev->num_resources; ++i) {
+ for (i = 0; i < irqs; ++i) {
err = set_irq_affinity(platform_get_irq(pdev, i), i);
if (err)
break;
}
-out:
return err;
}