diff options
| -rw-r--r-- | arch/arm/kernel/pmu.c | 22 |
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, | |||
| 97 | irq, cpu); | 97 | irq, cpu); |
| 98 | return err; | 98 | return err; |
| 99 | #else | 99 | #else |
| 100 | return 0; | 100 | return -EINVAL; |
| 101 | #endif | 101 | #endif |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | static int | 104 | static int |
| 105 | init_cpu_pmu(void) | 105 | init_cpu_pmu(void) |
| 106 | { | 106 | { |
| 107 | int i, err = 0; | 107 | int i, irqs, err = 0; |
| 108 | struct platform_device *pdev = pmu_devices[ARM_PMU_DEVICE_CPU]; | 108 | struct platform_device *pdev = pmu_devices[ARM_PMU_DEVICE_CPU]; |
| 109 | 109 | ||
| 110 | if (!pdev) { | 110 | if (!pdev) |
| 111 | err = -ENODEV; | 111 | return -ENODEV; |
| 112 | goto out; | 112 | |
| 113 | } | 113 | irqs = pdev->num_resources; |
| 114 | |||
| 115 | /* | ||
| 116 | * If we have a single PMU interrupt that we can't shift, assume that | ||
| 117 | * we're running on a uniprocessor machine and continue. | ||
| 118 | */ | ||
| 119 | if (irqs == 1 && !irq_can_set_affinity(platform_get_irq(pdev, 0))) | ||
| 120 | return 0; | ||
| 114 | 121 | ||
| 115 | for (i = 0; i < pdev->num_resources; ++i) { | 122 | for (i = 0; i < irqs; ++i) { |
| 116 | err = set_irq_affinity(platform_get_irq(pdev, i), i); | 123 | err = set_irq_affinity(platform_get_irq(pdev, i), i); |
| 117 | if (err) | 124 | if (err) |
| 118 | break; | 125 | break; |
| 119 | } | 126 | } |
| 120 | 127 | ||
| 121 | out: | ||
| 122 | return err; | 128 | return err; |
| 123 | } | 129 | } |
| 124 | 130 | ||
