[PATCH v3 3/3] pinctrl: qcom: Don't allow protected pins to be requested
From: Stephen Boyd <hidden>
Date: 2018-03-23 16:21:53
Also in:
linux-arm-msm, linux-devicetree, linux-gpio, lkml
Quoting Andy Shevchenko (2018-03-23 04:36:04)
On Thu, 2018-03-22 at 19:16 -0500, Timur Tabi wrote:quoted
On 03/21/2018 11:58 AM, Stephen Boyd wrote:quoted
+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 retquoted
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.