From 10221d2847ef78cb0e4cbdcce9d7ab1b2df11d2a Mon Sep 17 00:00:00 2001 From: Dario Binacchi Date: Thu, 22 Apr 2021 18:35:58 +0200 Subject: [PATCH] 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 --- drivers/pinctrl/pinctrl-single.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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); }