diff mbox series

platform/x86: intel_int0002_vgpio: Pass irqchip when adding gpiochip

Message ID 20191022210128.12042-1-linus.walleij@linaro.org (mailing list archive)
State Accepted, archived
Headers show
Series platform/x86: intel_int0002_vgpio: Pass irqchip when adding gpiochip | expand

Commit Message

Linus Walleij Oct. 22, 2019, 9:01 p.m. UTC
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.

Cc: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/platform/x86/intel_int0002_vgpio.c | 28 +++++++++++-----------
 1 file changed, 14 insertions(+), 14 deletions(-)

Comments

Andy Shevchenko Oct. 23, 2019, 7:07 p.m. UTC | #1
On Wed, Oct 23, 2019 at 12:03 AM Linus Walleij <linus.walleij@linaro.org> 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@redhat.com>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  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
>
Hans de Goede Oct. 24, 2019, 11:25 a.m. UTC | #2
Hi,

On 22-10-2019 23:01, Linus Walleij 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.
> 
> Cc: Hans de Goede <hdegoede@redhat.com>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

I've tested this on a CHT device which supports wake by USB keyboard
through the INT0002 vGPIO device. Everything still works fine:

Tested-by: Hans de Goede <hdegoede@redhat.com>

Regards,

Hans



> ---
>   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;
>   }
>
diff mbox series

Patch

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;
 }