[PATCH v3 3/3] pinctrl: qcom: Don't allow protected pins to be requested
Stephen Boyd
swboyd at chromium.org
Fri Mar 23 09:21:47 PDT 2018
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.
More information about the linux-arm-kernel
mailing list