• Uwe Kleine-König's avatar
    pwm: keembay: Fix build failure with -Os · bb72e1db
    Uwe Kleine-König authored
    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: default avatarkernel test robot <lkp@intel.com>
    Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Tested-by: default avatarVijayakannan Ayyathurai <vijayakannan.ayyathurai@intel.com>
    Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
    bb72e1db
pwm-keembay.c 6.26 KB