diff options
author | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2019-11-10 04:10:27 +0100 |
---|---|---|
committer | Jagan Teki <jagan@amarulasolutions.com> | 2019-12-18 20:13:34 +0530 |
commit | 9bd34a69a453d409792e08c00953ce8862145e65 (patch) | |
tree | 41e7ca0029f1728f8960f9b392a5569f75c58513 /arch/arm/cpu/armv7 | |
parent | 643366bcd5e32878a951e39b8b553b794695b026 (diff) |
sunxi: psci: avoid error address-of-packed-member
Compiling with GCC 9.2.1 leads to build errors:
arch/arm/cpu/armv7/sunxi/psci.c: In function ‘sunxi_cpu_set_power’:
arch/arm/cpu/armv7/sunxi/psci.c:144:21: error: taking address of packed
member of ‘struct sunxi_cpucfg_reg’ may result in an unaligned pointer
value [-Werror=address-of-packed-member]
144 | sunxi_power_switch(&cpucfg->cpu1_pwr_clamp, &cpucfg->cpu1_pwroff,
| ^~~~~~~~~~~~~~~~~~~~~~~
arch/arm/cpu/armv7/sunxi/psci.c:144:46: error: taking address of packed
member of ‘struct sunxi_cpucfg_reg’ may result in an unaligned pointer
value [-Werror=address-of-packed-member]
144 | sunxi_power_switch(&cpucfg->cpu1_pwr_clamp, &cpucfg->cpu1_pwroff,
| ^~~~~~~~~~~~~~~~~~~~
Use memcpy() and void* pointers to resolve the problem caused by packing
the struct sunxi_cpucfg_reg.
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Acked-by: Jagan Teki <jagan@amarulasolutions.com>
Diffstat (limited to 'arch/arm/cpu/armv7')
-rw-r--r-- | arch/arm/cpu/armv7/sunxi/psci.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/arch/arm/cpu/armv7/sunxi/psci.c b/arch/arm/cpu/armv7/sunxi/psci.c index 2c5d99e9ac..5b689004e8 100644 --- a/arch/arm/cpu/armv7/sunxi/psci.c +++ b/arch/arm/cpu/armv7/sunxi/psci.c @@ -75,7 +75,7 @@ static void __secure __mdelay(u32 ms) isb(); } -static void __secure clamp_release(u32 __maybe_unused *clamp) +static void __secure clamp_release(void __maybe_unused *clamp) { #if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN7I) || \ defined(CONFIG_MACH_SUN8I_H3) || \ @@ -90,7 +90,7 @@ static void __secure clamp_release(u32 __maybe_unused *clamp) #endif } -static void __secure clamp_set(u32 __maybe_unused *clamp) +static void __secure clamp_set(void __maybe_unused *clamp) { #if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN7I) || \ defined(CONFIG_MACH_SUN8I_H3) || \ @@ -99,22 +99,28 @@ static void __secure clamp_set(u32 __maybe_unused *clamp) #endif } -static void __secure sunxi_power_switch(u32 *clamp, u32 *pwroff, bool on, +static void __secure sunxi_power_switch(void *clamp, void *pwroff_ptr, bool on, int cpu) { + u32 pwroff; + + memcpy(&pwroff, pwroff_ptr, sizeof(u32)); + if (on) { /* Release power clamp */ clamp_release(clamp); /* Clear power gating */ - clrbits_le32(pwroff, BIT(cpu)); + clrbits_le32(&pwroff, BIT(cpu)); } else { /* Set power gating */ - setbits_le32(pwroff, BIT(cpu)); + setbits_le32(&pwroff, BIT(cpu)); /* Activate power clamp */ clamp_set(clamp); } + + memcpy(pwroff_ptr, &pwroff, sizeof(u32)); } #ifdef CONFIG_MACH_SUN8I_R40 |