lkml.org 
[lkml]   [2017]   [Dec]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.4 16/59] pinctrl: st: add irq_request/release_resources callbacks
    Date
    From: Patrice Chotard <patrice.chotard@st.com>

    [ Upstream commit e855fa9a65c40788b5069abb0d094537daa22e05 ]

    When using GPIO as IRQ source, the GPIO must be configured
    in INPUT. Callbacks dedicated for this was missing in
    pinctrl-st driver.

    This fix the following kernel error when trying to lock a gpio
    as IRQ:

    [ 7.521095] gpio gpiochip7: (PIO11): gpiochip_lock_as_irq: tried to flag a GPIO set as output for IRQ
    [ 7.526018] gpio gpiochip7: (PIO11): unable to lock HW IRQ 6 for IRQ
    [ 7.529405] genirq: Failed to request resources for 0-0053 (irq 81) on irqchip GPIO

    Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    ---
    drivers/pinctrl/pinctrl-st.c | 30 ++++++++++++++++++++++++------
    1 file changed, 24 insertions(+), 6 deletions(-)

    diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c
    index b58d3f29148a..6908b6ce2074 100644
    --- a/drivers/pinctrl/pinctrl-st.c
    +++ b/drivers/pinctrl/pinctrl-st.c
    @@ -1338,6 +1338,22 @@ static void st_gpio_irq_unmask(struct irq_data *d)
    writel(BIT(d->hwirq), bank->base + REG_PIO_SET_PMASK);
    }

    +static int st_gpio_irq_request_resources(struct irq_data *d)
    +{
    + struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
    +
    + st_gpio_direction_input(gc, d->hwirq);
    +
    + return gpiochip_lock_as_irq(gc, d->hwirq);
    +}
    +
    +static void st_gpio_irq_release_resources(struct irq_data *d)
    +{
    + struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
    +
    + gpiochip_unlock_as_irq(gc, d->hwirq);
    +}
    +
    static int st_gpio_irq_set_type(struct irq_data *d, unsigned type)
    {
    struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
    @@ -1493,12 +1509,14 @@ static struct gpio_chip st_gpio_template = {
    };

    static struct irq_chip st_gpio_irqchip = {
    - .name = "GPIO",
    - .irq_disable = st_gpio_irq_mask,
    - .irq_mask = st_gpio_irq_mask,
    - .irq_unmask = st_gpio_irq_unmask,
    - .irq_set_type = st_gpio_irq_set_type,
    - .flags = IRQCHIP_SKIP_SET_WAKE,
    + .name = "GPIO",
    + .irq_request_resources = st_gpio_irq_request_resources,
    + .irq_release_resources = st_gpio_irq_release_resources,
    + .irq_disable = st_gpio_irq_mask,
    + .irq_mask = st_gpio_irq_mask,
    + .irq_unmask = st_gpio_irq_unmask,
    + .irq_set_type = st_gpio_irq_set_type,
    + .flags = IRQCHIP_SKIP_SET_WAKE,
    };

    static int st_gpiolib_register_bank(struct st_pinctrl *info,
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-12-13 03:01    [W:4.698 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site