lkml.org 
[lkml]   [2019]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 3/8] pinctrl: msm: Add ability for drivers to supply a reserved GPIO list
    Date
    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>
    ---
    drivers/pinctrl/qcom/pinctrl-msm.c | 18 ++++++++++++++++++
    drivers/pinctrl/qcom/pinctrl-msm.h | 1 +
    2 files changed, 19 insertions(+)

    diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
    index ee8119879c4c..3ac740b36508 100644
    --- a/drivers/pinctrl/qcom/pinctrl-msm.c
    +++ b/drivers/pinctrl/qcom/pinctrl-msm.c
    @@ -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;
    }

    diff --git a/drivers/pinctrl/qcom/pinctrl-msm.h b/drivers/pinctrl/qcom/pinctrl-msm.h
    index c12048e54a6f..23b93ae92269 100644
    --- a/drivers/pinctrl/qcom/pinctrl-msm.h
    +++ b/drivers/pinctrl/qcom/pinctrl-msm.h
    @@ -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;
    --
    2.17.1
    \
     
     \ /
      Last update: 2019-06-07 10:29    [W:2.423 / U:0.156 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site