]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
pinctrl: msm: Add ability for drivers to supply a reserved GPIO list
authorLee Jones <lee.jones@linaro.org>
Mon, 10 Jun 2019 08:42:08 +0000 (09:42 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 12 Jun 2019 07:12:49 +0000 (09:12 +0200)
When booting MSM based platforms with Device Tree or some ACPI
implementations, it is possible to provide a list of reserved pins
via the 'gpio-reserved-ranges' and 'gpios' properties respectively.
However some ACPI tables are not populated with this information,
thus it has to come from a knowledgable device driver instead.

Here we provide the MSM common driver with additional support to
parse this informtion and correctly populate the widely used
'valid_mask'.

Signed-off-by: Lee Jones <lee.jones@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/qcom/pinctrl-msm.c
drivers/pinctrl/qcom/pinctrl-msm.h

index ee8119879c4c952b4f01aec3f4684bb6d7e1dc69..3ac740b36508615141cbf857c7ac97e03e0b4cfe 100644 (file)
@@ -607,8 +607,23 @@ static int msm_gpio_init_valid_mask(struct gpio_chip *chip)
        int ret;
        unsigned int len, i;
        unsigned int max_gpios = pctrl->soc->ngpios;
+       const int *reserved = pctrl->soc->reserved_gpios;
        u16 *tmp;
 
+       /* Driver provided reserved list overrides DT and ACPI */
+       if (reserved) {
+               bitmap_fill(chip->valid_mask, max_gpios);
+               for (i = 0; reserved[i] >= 0; i++) {
+                       if (i >= max_gpios || reserved[i] >= max_gpios) {
+                               dev_err(pctrl->dev, "invalid list of reserved GPIOs\n");
+                               return -EINVAL;
+                       }
+                       clear_bit(reserved[i], chip->valid_mask);
+               }
+
+               return 0;
+       }
+
        /* The number of GPIOs in the ACPI tables */
        len = ret = device_property_read_u16_array(pctrl->dev, "gpios", NULL,
                                                   0);
@@ -964,6 +979,9 @@ static void msm_gpio_irq_handler(struct irq_desc *desc)
 
 static bool msm_gpio_needs_valid_mask(struct msm_pinctrl *pctrl)
 {
+       if (pctrl->soc->reserved_gpios)
+               return true;
+
        return device_property_read_u16_array(pctrl->dev, "gpios", NULL, 0) > 0;
 }
 
index c12048e54a6f01439eef9fa88bf061538d4ba2cf..23b93ae922696173f537edaf3f865577571e1509 100644 (file)
@@ -121,6 +121,7 @@ struct msm_pinctrl_soc_data {
        bool pull_no_keeper;
        const char *const *tiles;
        unsigned int ntiles;
+       const int *reserved_gpios;
 };
 
 extern const struct dev_pm_ops msm_pinctrl_dev_pm_ops;