diff mbox series

gpio: stmpe: Use irqchip template

Message ID 20200716100638.112451-1-linus.walleij@linaro.org
State Accepted
Commit 9745079609dfa14c8d88f88d06d7e720b0f29acd
Headers show
Series gpio: stmpe: Use irqchip template | expand

Commit Message

Linus Walleij July 16, 2020, 10:06 a.m. UTC
This makes the driver use the irqchip template to assign
properties to the gpio_irq_chip instead of using the
explicit calls to gpiochip_irqchip_add_nested() and
gpiochip_set_nested_irqchip(). The irqchip is instead
added while adding the gpiochip.

Cc: Patrice Chotard <patrice.chotard@st.com>
Cc: Alexandre TORGUE <alexandre.torgue@st.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

---
 drivers/gpio/gpio-stmpe.c | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

-- 
2.26.2

Comments

Patrice CHOTARD July 27, 2020, 12:32 p.m. UTC | #1
Hi Linus

On 7/16/20 12:06 PM, Linus Walleij wrote:
> This makes the driver use the irqchip template to assign

> properties to the gpio_irq_chip instead of using the

> explicit calls to gpiochip_irqchip_add_nested() and

> gpiochip_set_nested_irqchip(). The irqchip is instead

> added while adding the gpiochip.

>

> Cc: Patrice Chotard <patrice.chotard@st.com>

> Cc: Alexandre TORGUE <alexandre.torgue@st.com>

> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

> ---

>  drivers/gpio/gpio-stmpe.c | 24 +++++++++++-------------

>  1 file changed, 11 insertions(+), 13 deletions(-)

>

> diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c

> index 542706a852e6..395ee51445ea 100644

> --- a/drivers/gpio/gpio-stmpe.c

> +++ b/drivers/gpio/gpio-stmpe.c

> @@ -507,6 +507,8 @@ static int stmpe_gpio_probe(struct platform_device *pdev)

>  	}

>  

>  	if (irq > 0) {

> +		struct gpio_irq_chip *girq;

> +

>  		ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,

>  				stmpe_gpio_irq, IRQF_ONESHOT,

>  				"stmpe-gpio", stmpe_gpio);

> @@ -514,20 +516,16 @@ static int stmpe_gpio_probe(struct platform_device *pdev)

>  			dev_err(&pdev->dev, "unable to get irq: %d\n", ret);

>  			goto out_disable;

>  		}

> -		ret =  gpiochip_irqchip_add_nested(&stmpe_gpio->chip,

> -						   &stmpe_gpio_irq_chip,

> -						   0,

> -						   handle_simple_irq,

> -						   IRQ_TYPE_NONE);

> -		if (ret) {

> -			dev_err(&pdev->dev,

> -				"could not connect irqchip to gpiochip\n");

> -			goto out_disable;

> -		}

>  

> -		gpiochip_set_nested_irqchip(&stmpe_gpio->chip,

> -					    &stmpe_gpio_irq_chip,

> -					    irq);

> +		girq = &stmpe_gpio->chip.irq;

> +		girq->chip = &stmpe_gpio_irq_chip;

> +		/* This will 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_simple_irq;

> +		girq->threaded = true;

>  	}

>  

>  	platform_set_drvdata(pdev, stmpe_gpio);


Reviewed-by: Patrice Chotard <patrice.chotard@st.com>


Thanks
Serge Semin July 27, 2020, 9:13 p.m. UTC | #2
On Thu, Jul 16, 2020 at 12:06:38PM +0200, Linus Walleij wrote:
> This makes the driver use the irqchip template to assign

> properties to the gpio_irq_chip instead of using the

> explicit calls to gpiochip_irqchip_add_nested() and

> gpiochip_set_nested_irqchip(). The irqchip is instead

> added while adding the gpiochip.

> 

> Cc: Patrice Chotard <patrice.chotard@st.com>

> Cc: Alexandre TORGUE <alexandre.torgue@st.com>

> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

> ---

>  drivers/gpio/gpio-stmpe.c | 24 +++++++++++-------------

>  1 file changed, 11 insertions(+), 13 deletions(-)

> 

> diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c

> index 542706a852e6..395ee51445ea 100644

> --- a/drivers/gpio/gpio-stmpe.c

> +++ b/drivers/gpio/gpio-stmpe.c

> @@ -507,6 +507,8 @@ static int stmpe_gpio_probe(struct platform_device *pdev)

>  	}

>  

>  	if (irq > 0) {

> +		struct gpio_irq_chip *girq;

> +

>  		ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,

>  				stmpe_gpio_irq, IRQF_ONESHOT,

>  				"stmpe-gpio", stmpe_gpio);

> @@ -514,20 +516,16 @@ static int stmpe_gpio_probe(struct platform_device *pdev)

>  			dev_err(&pdev->dev, "unable to get irq: %d\n", ret);

>  			goto out_disable;

>  		}

> -		ret =  gpiochip_irqchip_add_nested(&stmpe_gpio->chip,

> -						   &stmpe_gpio_irq_chip,

> -						   0,

> -						   handle_simple_irq,

> -						   IRQ_TYPE_NONE);

> -		if (ret) {

> -			dev_err(&pdev->dev,

> -				"could not connect irqchip to gpiochip\n");

> -			goto out_disable;

> -		}

>  

> -		gpiochip_set_nested_irqchip(&stmpe_gpio->chip,

> -					    &stmpe_gpio_irq_chip,

> -					    irq);


> +		girq = &stmpe_gpio->chip.irq;

> +		girq->chip = &stmpe_gpio_irq_chip;

> +		/* This will 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_simple_irq;

> +		girq->threaded = true;


Hmm, the GPIO-irq-chip setting are initialized after the GPIO-chip has been
registered by calling the gpiochip_add_data() method earlier in this method.
That means the IRQ-chip won't be created by the GPIOlib, which will introduce a
bug. In order to fix the problem it's better to move the whole "if (irq > 0)
{...}" clause to be executed before the gpiochip_add_data() function invocation.

Though I could misunderstood something...

-Sergey

>  	}

>  

>  	platform_set_drvdata(pdev, stmpe_gpio);

> -- 

> 2.26.2

>
Linus Walleij July 28, 2020, 7:28 a.m. UTC | #3
On Mon, Jul 27, 2020 at 11:13 PM Serge Semin <fancer.lancer@gmail.com> wrote:

> Hmm, the GPIO-irq-chip setting are initialized after the GPIO-chip has been

> registered by calling the gpiochip_add_data() method earlier in this method.

> That means the IRQ-chip won't be created by the GPIOlib, which will introduce a

> bug. In order to fix the problem it's better to move the whole "if (irq > 0)

> {...}" clause to be executed before the gpiochip_add_data() function invocation.

>

> Though I could misunderstood something...


Ah what a mistake, thank you so much for looking through this patch and
spotting this! I sent a fix.

Yours,
Linus Walleij
diff mbox series

Patch

diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c
index 542706a852e6..395ee51445ea 100644
--- a/drivers/gpio/gpio-stmpe.c
+++ b/drivers/gpio/gpio-stmpe.c
@@ -507,6 +507,8 @@  static int stmpe_gpio_probe(struct platform_device *pdev)
 	}
 
 	if (irq > 0) {
+		struct gpio_irq_chip *girq;
+
 		ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
 				stmpe_gpio_irq, IRQF_ONESHOT,
 				"stmpe-gpio", stmpe_gpio);
@@ -514,20 +516,16 @@  static int stmpe_gpio_probe(struct platform_device *pdev)
 			dev_err(&pdev->dev, "unable to get irq: %d\n", ret);
 			goto out_disable;
 		}
-		ret =  gpiochip_irqchip_add_nested(&stmpe_gpio->chip,
-						   &stmpe_gpio_irq_chip,
-						   0,
-						   handle_simple_irq,
-						   IRQ_TYPE_NONE);
-		if (ret) {
-			dev_err(&pdev->dev,
-				"could not connect irqchip to gpiochip\n");
-			goto out_disable;
-		}
 
-		gpiochip_set_nested_irqchip(&stmpe_gpio->chip,
-					    &stmpe_gpio_irq_chip,
-					    irq);
+		girq = &stmpe_gpio->chip.irq;
+		girq->chip = &stmpe_gpio_irq_chip;
+		/* This will 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_simple_irq;
+		girq->threaded = true;
 	}
 
 	platform_set_drvdata(pdev, stmpe_gpio);