Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'clk-fixes-for-5.1' of https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux into clk-fixes

Pull Allwinner clk fixes from Maxime Ripard:

- Some fixes for odd cases of the NKMP clocks

* tag 'clk-fixes-for-5.1' of https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux:
clk: sunxi-ng: nkmp: Explain why zero width check is needed
clk: sunxi-ng: nkmp: Avoid GENMASK(-1, 0)

+19 -5
+19 -5
drivers/clk/sunxi-ng/ccu_nkmp.c
··· 167 167 unsigned long parent_rate) 168 168 { 169 169 struct ccu_nkmp *nkmp = hw_to_ccu_nkmp(hw); 170 - u32 n_mask, k_mask, m_mask, p_mask; 170 + u32 n_mask = 0, k_mask = 0, m_mask = 0, p_mask = 0; 171 171 struct _ccu_nkmp _nkmp; 172 172 unsigned long flags; 173 173 u32 reg; ··· 186 186 187 187 ccu_nkmp_find_best(parent_rate, rate, &_nkmp); 188 188 189 - n_mask = GENMASK(nkmp->n.width + nkmp->n.shift - 1, nkmp->n.shift); 190 - k_mask = GENMASK(nkmp->k.width + nkmp->k.shift - 1, nkmp->k.shift); 191 - m_mask = GENMASK(nkmp->m.width + nkmp->m.shift - 1, nkmp->m.shift); 192 - p_mask = GENMASK(nkmp->p.width + nkmp->p.shift - 1, nkmp->p.shift); 189 + /* 190 + * If width is 0, GENMASK() macro may not generate expected mask (0) 191 + * as it falls under undefined behaviour by C standard due to shifts 192 + * which are equal or greater than width of left operand. This can 193 + * be easily avoided by explicitly checking if width is 0. 194 + */ 195 + if (nkmp->n.width) 196 + n_mask = GENMASK(nkmp->n.width + nkmp->n.shift - 1, 197 + nkmp->n.shift); 198 + if (nkmp->k.width) 199 + k_mask = GENMASK(nkmp->k.width + nkmp->k.shift - 1, 200 + nkmp->k.shift); 201 + if (nkmp->m.width) 202 + m_mask = GENMASK(nkmp->m.width + nkmp->m.shift - 1, 203 + nkmp->m.shift); 204 + if (nkmp->p.width) 205 + p_mask = GENMASK(nkmp->p.width + nkmp->p.shift - 1, 206 + nkmp->p.shift); 193 207 194 208 spin_lock_irqsave(nkmp->common.lock, flags); 195 209