diff options
Diffstat (limited to 'arch/arm/kernel/crunch.c')
-rw-r--r-- | arch/arm/kernel/crunch.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/arch/arm/kernel/crunch.c b/arch/arm/kernel/crunch.c index 99995c2b2312..769abe15cf91 100644 --- a/arch/arm/kernel/crunch.c +++ b/arch/arm/kernel/crunch.c | |||
@@ -31,7 +31,7 @@ void crunch_task_release(struct thread_info *thread) | |||
31 | 31 | ||
32 | static int crunch_enabled(u32 devcfg) | 32 | static int crunch_enabled(u32 devcfg) |
33 | { | 33 | { |
34 | return !!(devcfg & EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE); | 34 | return !!(devcfg & EP93XX_SYSCON_DEVCFG_CPENA); |
35 | } | 35 | } |
36 | 36 | ||
37 | static int crunch_do(struct notifier_block *self, unsigned long cmd, void *t) | 37 | static int crunch_do(struct notifier_block *self, unsigned long cmd, void *t) |
@@ -56,11 +56,16 @@ static int crunch_do(struct notifier_block *self, unsigned long cmd, void *t) | |||
56 | break; | 56 | break; |
57 | 57 | ||
58 | case THREAD_NOTIFY_SWITCH: | 58 | case THREAD_NOTIFY_SWITCH: |
59 | devcfg = __raw_readl(EP93XX_SYSCON_DEVICE_CONFIG); | 59 | devcfg = __raw_readl(EP93XX_SYSCON_DEVCFG); |
60 | if (crunch_enabled(devcfg) || crunch_owner == crunch_state) { | 60 | if (crunch_enabled(devcfg) || crunch_owner == crunch_state) { |
61 | devcfg ^= EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE; | 61 | /* |
62 | * We don't use ep93xx_syscon_swlocked_write() here | ||
63 | * because we are on the context switch path and | ||
64 | * preemption is already disabled. | ||
65 | */ | ||
66 | devcfg ^= EP93XX_SYSCON_DEVCFG_CPENA; | ||
62 | __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK); | 67 | __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK); |
63 | __raw_writel(devcfg, EP93XX_SYSCON_DEVICE_CONFIG); | 68 | __raw_writel(devcfg, EP93XX_SYSCON_DEVCFG); |
64 | } | 69 | } |
65 | break; | 70 | break; |
66 | } | 71 | } |