Quoting Andy Shevchenko (2018-03-23 04:36:04) > On Thu, 2018-03-22 at 19:16 -0500, Timur Tabi wrote: > > On 03/21/2018 11:58 AM, Stephen Boyd wrote: > > > +static int msm_gpio_init_valid_mask(struct gpio_chip *chip, > > > + struct msm_pinctrl *pctrl) > > > +{ > > > + int ret; > > > + unsigned int len, i; > > > + unsigned int max_gpios = pctrl->soc->ngpios; > > > + > > > + /* The number of GPIOs in the ACPI tables */ > > > + ret = device_property_read_u16_array(pctrl->dev, "gpios", > > > NULL, 0); > > > + if (ret > 0 && ret < max_gpios) { > > > > This needs to be ret <= max_gpios, otherwise it will fail if every > > GPIO > > is available. > > > > And it should print an error message and return an error code if ret > > > > > max_gpios. > > Perhaps makes sense to do the opposite condition > > if (ret < 0 || ret > max_gpios) { > ... error handling ... > } > Indeed. I already rewrote it like this two days ago: static int msm_gpio_init_valid_mask(struct gpio_chip *chip, struct msm_pinctrl *pctrl) { int ret; unsigned int len, i; unsigned int max_gpios = pctrl->soc->ngpios; u16 *tmp; /* The number of GPIOs in the ACPI tables */ len = ret = device_property_read_u16_array(pctrl->dev, "gpios", ULL, 0); if (ret < 0) return 0; if (ret > max_gpios) return -EINVAL; tmp = kmalloc_array(len, sizeof(*tmp), GFP_KERNEL); if (!tmp) return -ENOMEM; ret = device_property_read_u16_array(pctrl->dev, "gpios", tmp, en); if (ret < 0) { dev_err(pctrl->dev, "could not read list of GPIOs\n"); goto out; } bitmap_zero(chip->valid_mask, max_gpios); for (i = 0; i < len; i++) set_bit(tmp[i], chip->valid_mask); out: kfree(tmp); return ret; } I'll send the updated patches now. -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html