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>
This commit is contained in:
Heinrich Schuchardt 2019-11-10 04:10:27 +01:00 committed by Jagan Teki
parent 643366bcd5
commit 9bd34a69a4

View file

@ -75,7 +75,7 @@ static void __secure __mdelay(u32 ms)
isb(); 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) || \ #if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN7I) || \
defined(CONFIG_MACH_SUN8I_H3) || \ defined(CONFIG_MACH_SUN8I_H3) || \
@ -90,7 +90,7 @@ static void __secure clamp_release(u32 __maybe_unused *clamp)
#endif #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) || \ #if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN7I) || \
defined(CONFIG_MACH_SUN8I_H3) || \ defined(CONFIG_MACH_SUN8I_H3) || \
@ -99,22 +99,28 @@ static void __secure clamp_set(u32 __maybe_unused *clamp)
#endif #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) int cpu)
{ {
u32 pwroff;
memcpy(&pwroff, pwroff_ptr, sizeof(u32));
if (on) { if (on) {
/* Release power clamp */ /* Release power clamp */
clamp_release(clamp); clamp_release(clamp);
/* Clear power gating */ /* Clear power gating */
clrbits_le32(pwroff, BIT(cpu)); clrbits_le32(&pwroff, BIT(cpu));
} else { } else {
/* Set power gating */ /* Set power gating */
setbits_le32(pwroff, BIT(cpu)); setbits_le32(&pwroff, BIT(cpu));
/* Activate power clamp */ /* Activate power clamp */
clamp_set(clamp); clamp_set(clamp);
} }
memcpy(pwroff_ptr, &pwroff, sizeof(u32));
} }
#ifdef CONFIG_MACH_SUN8I_R40 #ifdef CONFIG_MACH_SUN8I_R40