Re: [PATCH] platform/x86: intel_int0002_vgpio: Pass irqchip when adding gpiochip

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Oct 23, 2019 at 12:03 AM Linus Walleij <linus.walleij@xxxxxxxxxx> wrote:
>
> We need to convert all old gpio irqchips to pass the irqchip
> setup along when adding the gpio_chip. For more info see
> drivers/gpio/TODO.
>
> For chained irqchips this is a pretty straight-forward
> conversion. This driver requests the IRQ directly in the driver
> so it needs to pass a NULL parent handler. We may revisit this
> code later and pull reqular shared IRQ handler into
> gpiolib, so leave a FIXME.
>

Thanks!
Code looks fine to me, though I will wait for Hans to confirm it
doesn't break anything.

> Cc: Hans de Goede <hdegoede@xxxxxxxxxx>
> Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx>
> ---
>  drivers/platform/x86/intel_int0002_vgpio.c | 28 +++++++++++-----------
>  1 file changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/platform/x86/intel_int0002_vgpio.c b/drivers/platform/x86/intel_int0002_vgpio.c
> index af233b7b77f2..f14e2c5f9da5 100644
> --- a/drivers/platform/x86/intel_int0002_vgpio.c
> +++ b/drivers/platform/x86/intel_int0002_vgpio.c
> @@ -164,8 +164,8 @@ static int int0002_probe(struct platform_device *pdev)
>  {
>         struct device *dev = &pdev->dev;
>         const struct x86_cpu_id *cpu_id;
> -       struct irq_chip *irq_chip;
>         struct gpio_chip *chip;
> +       struct gpio_irq_chip *girq;
>         int irq, ret;
>
>         /* Menlow has a different INT0002 device? <sigh> */
> @@ -192,15 +192,11 @@ static int int0002_probe(struct platform_device *pdev)
>         chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1;
>         chip->irq.init_valid_mask = int0002_init_irq_valid_mask;
>
> -       ret = devm_gpiochip_add_data(&pdev->dev, chip, NULL);
> -       if (ret) {
> -               dev_err(dev, "Error adding gpio chip: %d\n", ret);
> -               return ret;
> -       }
> -
>         /*
> -        * We manually request the irq here instead of passing a flow-handler
> +        * We directly request the irq here instead of passing a flow-handler
>          * to gpiochip_set_chained_irqchip, because the irq is shared.
> +        * FIXME: augment this if we managed to pull handling of shared
> +        * IRQs into gpiolib.
>          */
>         ret = devm_request_irq(dev, irq, int0002_irq,
>                                IRQF_SHARED, "INT0002", chip);
> @@ -209,17 +205,21 @@ static int int0002_probe(struct platform_device *pdev)
>                 return ret;
>         }
>
> -       irq_chip = (struct irq_chip *)cpu_id->driver_data;
> +       girq = &chip->irq;
> +       girq->chip = (struct irq_chip *)cpu_id->driver_data;
> +       /* This let us handle the parent IRQ in the driver */
> +       girq->parent_handler = NULL;
> +       girq->num_parents = 0;
> +       girq->parents = NULL;
> +       girq->default_type = IRQ_TYPE_NONE;
> +       girq->handler = handle_edge_irq;
>
> -       ret = gpiochip_irqchip_add(chip, irq_chip, 0, handle_edge_irq,
> -                                  IRQ_TYPE_NONE);
> +       ret = devm_gpiochip_add_data(dev, chip, NULL);
>         if (ret) {
> -               dev_err(dev, "Error adding irqchip: %d\n", ret);
> +               dev_err(dev, "Error adding gpio chip: %d\n", ret);
>                 return ret;
>         }
>
> -       gpiochip_set_chained_irqchip(chip, irq_chip, irq, NULL);
> -
>         device_init_wakeup(dev, true);
>         return 0;
>  }
> --
> 2.21.0
>


-- 
With Best Regards,
Andy Shevchenko



[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux