pwm: keembay: Fix build failure with -Os
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 16 Nov 2020 09:08:04 +0000 (10:08 +0100)
committerThierry Reding <thierry.reding@gmail.com>
Thu, 17 Dec 2020 13:19:00 +0000 (14:19 +0100)
commitbb72e1dbae0e759252fcdb4a97917200e165bf91
tree6e1eab0e0cb266874631ab2477a7540c5e145eca
parent765edf0bf019ff8a7ae2dedbccd8af370b0856b5
pwm: keembay: Fix build failure with -Os

The driver used this construct:

#define KMB_PWM_LEADIN_MASK             GENMASK(30, 0)

static inline void keembay_pwm_update_bits(struct keembay_pwm *priv, u32 mask,
   u32 val, u32 offset)
{
u32 buff = readl(priv->base + offset);

buff = u32_replace_bits(buff, val, mask);
writel(buff, priv->base + offset);
}

...
keembay_pwm_update_bits(priv, KMB_PWM_LEADIN_MASK, 0,
KMB_PWM_LEADIN_OFFSET(pwm->hwpwm));

With CONFIG_CC_OPTIMIZE_FOR_SIZE the compiler (here: gcc 10.2.0) this
triggers:

In file included from /home/uwe/gsrc/linux/drivers/pwm/pwm-keembay.c:16:
In function ‘field_multiplier’,
    inlined from ‘keembay_pwm_update_bits’ at /home/uwe/gsrc/linux/include/linux/bitfield.h:124:17:
/home/uwe/gsrc/linux/include/linux/bitfield.h:119:3: error: call to ‘__bad_mask’ declared with attribute error: bad bitfield mask
  119 |   __bad_mask();
      |   ^~~~~~~~~~~~
In function ‘field_multiplier’,
    inlined from ‘keembay_pwm_update_bits’ at /home/uwe/gsrc/linux/include/linux/bitfield.h:154:1:
/home/uwe/gsrc/linux/include/linux/bitfield.h:119:3: error: call to ‘__bad_mask’ declared with attribute error: bad bitfield mask
  119 |   __bad_mask();
      |   ^~~~~~~~~~~~

The compiler doesn't seem to be able to notice that with field being
0x3ffffff the expression

if ((field | (field - 1)) & ((field | (field - 1)) + 1))
__bad_mask();

can be optimized away.

So use __always_inline and document the problem in a comment to fix
this.

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Tested-by: Vijayakannan Ayyathurai <vijayakannan.ayyathurai@intel.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
drivers/pwm/pwm-keembay.c