lkml.org 
[lkml]   [2019]   [Nov]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.3 011/140] pinctrl: intel: Allocate IRQ chip dynamic
    Date
    From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

    [ Upstream commit 57ff2df1b952c7934d7b0e1d3a2ec403ec76edec ]

    Keeping the IRQ chip definition static shares it with multiple instances of
    the GPIO chip in the system. This is bad and now we get this warning from
    GPIO library:

    "detected irqchip that is shared with multiple gpiochips: please fix the driver."

    Hence, move the IRQ chip definition from being driver static into the struct
    intel_pinctrl. So a unique IRQ chip is used for each GPIO chip instance.

    Fixes: ee1a6ca43dba ("pinctrl: intel: Add Intel Broxton pin controller support")
    Depends-on: 5ff56b015e85 ("pinctrl: intel: Disable GPIO pin interrupts in suspend")
    Reported-by: Federico Ricchiuto <fed.ricchiuto@gmail.com>
    Suggested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pinctrl/intel/pinctrl-intel.c | 27 ++++++++++++++-------------
    1 file changed, 14 insertions(+), 13 deletions(-)

    diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c
    index a18d6eefe6726..4323796cbe118 100644
    --- a/drivers/pinctrl/intel/pinctrl-intel.c
    +++ b/drivers/pinctrl/intel/pinctrl-intel.c
    @@ -96,6 +96,7 @@ struct intel_pinctrl_context {
    * @pctldesc: Pin controller description
    * @pctldev: Pointer to the pin controller device
    * @chip: GPIO chip in this pin controller
    + * @irqchip: IRQ chip in this pin controller
    * @soc: SoC/PCH specific pin configuration data
    * @communities: All communities in this pin controller
    * @ncommunities: Number of communities in this pin controller
    @@ -108,6 +109,7 @@ struct intel_pinctrl {
    struct pinctrl_desc pctldesc;
    struct pinctrl_dev *pctldev;
    struct gpio_chip chip;
    + struct irq_chip irqchip;
    const struct intel_pinctrl_soc_data *soc;
    struct intel_community *communities;
    size_t ncommunities;
    @@ -1081,16 +1083,6 @@ static irqreturn_t intel_gpio_irq(int irq, void *data)
    return ret;
    }

    -static struct irq_chip intel_gpio_irqchip = {
    - .name = "intel-gpio",
    - .irq_ack = intel_gpio_irq_ack,
    - .irq_mask = intel_gpio_irq_mask,
    - .irq_unmask = intel_gpio_irq_unmask,
    - .irq_set_type = intel_gpio_irq_type,
    - .irq_set_wake = intel_gpio_irq_wake,
    - .flags = IRQCHIP_MASK_ON_SUSPEND,
    -};
    -
    static int intel_gpio_add_pin_ranges(struct intel_pinctrl *pctrl,
    const struct intel_community *community)
    {
    @@ -1140,12 +1132,22 @@ static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)

    pctrl->chip = intel_gpio_chip;

    + /* Setup GPIO chip */
    pctrl->chip.ngpio = intel_gpio_ngpio(pctrl);
    pctrl->chip.label = dev_name(pctrl->dev);
    pctrl->chip.parent = pctrl->dev;
    pctrl->chip.base = -1;
    pctrl->irq = irq;

    + /* Setup IRQ chip */
    + pctrl->irqchip.name = dev_name(pctrl->dev);
    + pctrl->irqchip.irq_ack = intel_gpio_irq_ack;
    + pctrl->irqchip.irq_mask = intel_gpio_irq_mask;
    + pctrl->irqchip.irq_unmask = intel_gpio_irq_unmask;
    + pctrl->irqchip.irq_set_type = intel_gpio_irq_type;
    + pctrl->irqchip.irq_set_wake = intel_gpio_irq_wake;
    + pctrl->irqchip.flags = IRQCHIP_MASK_ON_SUSPEND;
    +
    ret = devm_gpiochip_add_data(pctrl->dev, &pctrl->chip, pctrl);
    if (ret) {
    dev_err(pctrl->dev, "failed to register gpiochip\n");
    @@ -1175,15 +1177,14 @@ static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
    return ret;
    }

    - ret = gpiochip_irqchip_add(&pctrl->chip, &intel_gpio_irqchip, 0,
    + ret = gpiochip_irqchip_add(&pctrl->chip, &pctrl->irqchip, 0,
    handle_bad_irq, IRQ_TYPE_NONE);
    if (ret) {
    dev_err(pctrl->dev, "failed to add irqchip\n");
    return ret;
    }

    - gpiochip_set_chained_irqchip(&pctrl->chip, &intel_gpio_irqchip, irq,
    - NULL);
    + gpiochip_set_chained_irqchip(&pctrl->chip, &pctrl->irqchip, irq, NULL);
    return 0;
    }

    --
    2.20.1


    \
     
     \ /
      Last update: 2019-11-08 20:16    [W:4.032 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site