1/* SPDX-License-Identifier:	GPL-2.0+ */
2/*
3 *  Routines to access the system control register
4 *
5 *  Copyright (c) 2019 Heinrich Schuchardt
6 */
7
8#include <linux/linkage.h>
9
10/*
11 * void allow_unaligned(void) - allow unaligned access
12 *
13 * This routine sets the enable unaligned data support flag and clears the
14 * aligned flag in the system control register.
15 * After calling this routine unaligned access does no longer leads to a
16 * data abort or undefined behavior but is handled by the CPU.
17 * For details see the "ARM Architecture Reference Manual" for ARMv6.
18 */
19ENTRY(allow_unaligned)
20	mrc	p15, 0, r0, c1, c0, 0	@ load system control register
21	orr	r0, r0, #1 << 22	@ set unaligned data support flag
22	bic	r0, r0, #2		@ clear aligned flag
23	mcr	p15, 0, r0, c1, c0, 0	@ write system control register
24	bx	lr			@ return
25ENDPROC(allow_unaligned)
26