From b4b20ad881f5a5c19ae9199547ddbb00fa4825eb Mon Sep 17 00:00:00 2001 From: Russell King Date: Sun, 13 Apr 2014 18:57:29 +0100 Subject: [PATCH] ARM: provide common method to clear bits in CPU control register Several places open-code this manipulation, let's consolidate this. Signed-off-by: Russell King --- arch/arm/mm/alignment.c | 5 ++--- arch/arm/mm/init.c | 10 ++++++++++ arch/arm/mm/mm.h | 4 ++++ arch/arm/mm/mmu.c | 10 ++++------ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index 1ab611ce5009..53e268fcae45 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c @@ -28,6 +28,7 @@ #include #include "fault.h" +#include "mm.h" /* * 32-bit misaligned trap handler (c) 1998 San Mehat (CCC) -July 1998 @@ -968,9 +969,7 @@ static int __init alignment_init(void) #ifdef CONFIG_CPU_CP15 if (cpu_is_v6_unaligned()) { - cr_alignment &= ~CR_A; - cr_no_alignment &= ~CR_A; - set_cr(cr_alignment); + set_cr(__clear_cr(CR_A)); ai_usermode = safe_usermode(ai_usermode, false); } #endif diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 2a77ba8796ae..94332b1ad4bc 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -36,6 +37,15 @@ #include "mm.h" +#ifdef CONFIG_CPU_CP15_MMU +unsigned long __init __clear_cr(unsigned long mask) +{ + cr_no_alignment = cr_no_alignment & ~mask; + cr_alignment = cr_alignment & ~mask; + return cr_alignment; +} +#endif + static phys_addr_t phys_initrd_start __initdata = 0; static unsigned long phys_initrd_size __initdata = 0; diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index 7ea641b7aa7d..ce727d47275c 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h @@ -2,6 +2,8 @@ #include #include +#include + /* the upper-most page table pointer */ extern pmd_t *top_pmd; @@ -93,3 +95,5 @@ extern phys_addr_t arm_lowmem_limit; void __init bootmem_init(void); void arm_mm_memblock_reserve(void); void dma_contiguous_remap(void); + +unsigned long __clear_cr(unsigned long mask); diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index b68c6b22e1c8..d97cb2d8953a 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -125,6 +125,7 @@ static struct cachepolicy cache_policies[] __initdata = { */ static int __init early_cachepolicy(char *p) { + unsigned long cr = get_cr(); int i; for (i = 0; i < ARRAY_SIZE(cache_policies); i++) { @@ -132,8 +133,7 @@ static int __init early_cachepolicy(char *p) if (memcmp(p, cache_policies[i].policy, len) == 0) { cachepolicy = i; - cr_alignment &= ~cache_policies[i].cr_mask; - cr_no_alignment &= ~cache_policies[i].cr_mask; + cr = __clear_cr(cache_policies[i].cr_mask); break; } } @@ -151,7 +151,7 @@ static int __init early_cachepolicy(char *p) cachepolicy = CPOLICY_WRITEBACK; } flush_cache_all(); - set_cr(cr_alignment); + set_cr(cr); return 0; } early_param("cachepolicy", early_cachepolicy); @@ -188,9 +188,7 @@ early_param("ecc", early_ecc); static int __init noalign_setup(char *__unused) { - cr_alignment &= ~CR_A; - cr_no_alignment &= ~CR_A; - set_cr(cr_alignment); + set_cr(__clear_cr(CR_A)); return 1; } __setup("noalign", noalign_setup); -- 2.34.1