From: Dario Binacchi Date: Thu, 22 Apr 2021 16:35:58 +0000 (+0200) Subject: pinctrl: single: check function mask to be non-zero X-Git-Url: http://git.dujemihanovic.xyz/login.html?a=commitdiff_plain;h=69414d86ed57bf7b55ccd79d3d5ca5a01987a5b7;p=u-boot.git pinctrl: single: check function mask to be non-zero Otherwise it can generate a division by zero, which has an undefined behavior. Signed-off-by: Dario Binacchi --- diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 48bdd0f6f5..17f3818dd1 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c @@ -335,6 +335,10 @@ static int single_configure_bits(struct udevice *dev, phys_addr_t reg; u32 offset, val, mask, bit_pos, val_pos, mask_pos, submask; + /* If function mask is null, needn't enable it. */ + if (!pdata->mask) + return 0; + npins_in_reg = pdata->width / priv->bits_per_pin; func = single_allocate_function(dev, count * npins_in_reg); if (IS_ERR(func)) @@ -469,6 +473,11 @@ static int single_probe(struct udevice *dev) priv->npins = size / (pdata->width / BITS_PER_BYTE); if (pdata->bits_per_mux) { + if (!pdata->mask) { + dev_err(dev, "function mask needs to be non-zero\n"); + return -EINVAL; + } + priv->bits_per_pin = fls(pdata->mask); priv->npins *= (pdata->width / priv->bits_per_pin); }