diff options
| author | Scott Wood <scottwood@freescale.com> | 2011-07-25 07:04:36 -0400 |
|---|---|---|
| committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2011-08-05 00:47:54 -0400 |
| commit | 26ee97672eaee9725bd7d66c3964579c4af7037d (patch) | |
| tree | 44bf32a68005bfc79758f654ded48e25b3e2144f | |
| parent | 326ed6a9bcf8d451a6d714d10c8b0f40941a3ed3 (diff) | |
powerpc: Return the_cpu_ spec from identify_cpu
Commit af9eef3c7b1ed004c378c89b87642f4937337d50 caused cpu_setup to see
the_cpu_spec, rather than the source struct. However, on 32-bit, the
return value of identify_cpu was being used for feature fixups, and
identify_cpu was returning the source struct. So if cpu_setup patches
the feature bits, the update won't affect the fixups.
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
| -rw-r--r-- | arch/powerpc/kernel/cputable.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 9fb933248ab6..fa44ff538861 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
| @@ -2051,7 +2051,8 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
| 2051 | 2051 | ||
| 2052 | static struct cpu_spec the_cpu_spec; | 2052 | static struct cpu_spec the_cpu_spec; |
| 2053 | 2053 | ||
| 2054 | static void __init setup_cpu_spec(unsigned long offset, struct cpu_spec *s) | 2054 | static struct cpu_spec * __init setup_cpu_spec(unsigned long offset, |
| 2055 | struct cpu_spec *s) | ||
| 2055 | { | 2056 | { |
| 2056 | struct cpu_spec *t = &the_cpu_spec; | 2057 | struct cpu_spec *t = &the_cpu_spec; |
| 2057 | struct cpu_spec old; | 2058 | struct cpu_spec old; |
| @@ -2114,6 +2115,8 @@ static void __init setup_cpu_spec(unsigned long offset, struct cpu_spec *s) | |||
| 2114 | t->cpu_setup(offset, t); | 2115 | t->cpu_setup(offset, t); |
| 2115 | } | 2116 | } |
| 2116 | #endif /* CONFIG_PPC64 || CONFIG_BOOKE */ | 2117 | #endif /* CONFIG_PPC64 || CONFIG_BOOKE */ |
| 2118 | |||
| 2119 | return t; | ||
| 2117 | } | 2120 | } |
| 2118 | 2121 | ||
| 2119 | struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr) | 2122 | struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr) |
| @@ -2124,10 +2127,8 @@ struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr) | |||
| 2124 | s = PTRRELOC(s); | 2127 | s = PTRRELOC(s); |
| 2125 | 2128 | ||
| 2126 | for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) { | 2129 | for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) { |
| 2127 | if ((pvr & s->pvr_mask) == s->pvr_value) { | 2130 | if ((pvr & s->pvr_mask) == s->pvr_value) |
| 2128 | setup_cpu_spec(offset, s); | 2131 | return setup_cpu_spec(offset, s); |
| 2129 | return s; | ||
| 2130 | } | ||
| 2131 | } | 2132 | } |
| 2132 | 2133 | ||
| 2133 | BUG(); | 2134 | BUG(); |
