lkml.org 
[lkml]   [2016]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 61/70] gpio: rcar: Add Runtime PM handling for interrupts
    Date
    v3.19.8-ckt17 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    From: Geert Uytterhoeven <geert+renesas@glider.be>

    commit b26a719bdba9aa926ceaadecc66e07623d2b8a53 upstream.

    The R-Car GPIO driver handles Runtime PM for requested GPIOs only.

    When using a GPIO purely as an interrupt source, no Runtime PM handling
    is done, and the GPIO module's clock may not be enabled.

    To fix this:
    - Add .irq_request_resources() and .irq_release_resources() callbacks
    to handle Runtime PM when an interrupt is requested,
    - Add irq_bus_lock() and sync_unlock() callbacks to handle Runtime PM
    when e.g. disabling/enabling an interrupt, or configuring the
    interrupt type.

    Fixes: d5c3d84657db57bd "net: phy: Avoid polling PHY with PHY_IGNORE_INTERRUPTS"
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    [ luis: backported to 3.16:
    - use gpio_to_priv() instead of gpiochip_get_data()
    - adjusted context ]
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/gpio/gpio-rcar.c | 42 ++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 42 insertions(+)

    diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c
    index 584484e..e2b370e 100644
    --- a/drivers/gpio/gpio-rcar.c
    +++ b/drivers/gpio/gpio-rcar.c
    @@ -187,6 +187,44 @@ static inline struct gpio_rcar_priv *gpio_to_priv(struct gpio_chip *chip)
    return container_of(chip, struct gpio_rcar_priv, gpio_chip);
    }

    +static void gpio_rcar_irq_bus_lock(struct irq_data *d)
    +{
    + struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
    + struct gpio_rcar_priv *p = gpio_to_priv(gc);
    +
    + pm_runtime_get_sync(&p->pdev->dev);
    +}
    +
    +static void gpio_rcar_irq_bus_sync_unlock(struct irq_data *d)
    +{
    + struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
    + struct gpio_rcar_priv *p = gpio_to_priv(gc);
    +
    + pm_runtime_put(&p->pdev->dev);
    +}
    +
    +
    +static int gpio_rcar_irq_request_resources(struct irq_data *d)
    +{
    + struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
    + struct gpio_rcar_priv *p = gpio_to_priv(gc);
    + int error;
    +
    + error = pm_runtime_get_sync(&p->pdev->dev);
    + if (error < 0)
    + return error;
    +
    + return 0;
    +}
    +
    +static void gpio_rcar_irq_release_resources(struct irq_data *d)
    +{
    + struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
    + struct gpio_rcar_priv *p = gpio_to_priv(gc);
    +
    + pm_runtime_put(&p->pdev->dev);
    +}
    +
    static void gpio_rcar_config_general_input_output_mode(struct gpio_chip *chip,
    unsigned int gpio,
    bool output)
    @@ -425,6 +463,10 @@ static int gpio_rcar_probe(struct platform_device *pdev)
    irq_chip->irq_mask = gpio_rcar_irq_disable;
    irq_chip->irq_unmask = gpio_rcar_irq_enable;
    irq_chip->irq_set_type = gpio_rcar_irq_set_type;
    + irq_chip->irq_bus_lock = gpio_rcar_irq_bus_lock;
    + irq_chip->irq_bus_sync_unlock = gpio_rcar_irq_bus_sync_unlock;
    + irq_chip->irq_request_resources = gpio_rcar_irq_request_resources;
    + irq_chip->irq_release_resources = gpio_rcar_irq_release_resources;
    irq_chip->flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_SET_TYPE_MASKED
    | IRQCHIP_MASK_ON_SUSPEND;

    --
    2.7.0
    \
     
     \ /
      Last update: 2016-03-16 22:01    [W:2.247 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site