diff mbox series

[v2] usb: typec: tcpci_rt1711h: avoid screaming irq causing boot hangs

Message ID 20200603010251.38273-1-jun.li@nxp.com (mailing list archive)
State Superseded
Headers show
Series [v2] usb: typec: tcpci_rt1711h: avoid screaming irq causing boot hangs | expand

Commit Message

Jun Li June 3, 2020, 1:02 a.m. UTC
From: Li Jun <jun.li@nxp.com>

John reported screaming irq caused by rt1711h when system boot[1],
this is because irq request is done before tcpci_register_port(),
so the chip->tcpci has not been setup, irq handler is entered but
can't do anything, this patch is to address this by moving the irq
request after tcpci_register_port().

[1] https://lore.kernel.org/linux-usb/20200530040157.31038-1-john.stultz@linaro.org

Fixes: ce08eaeb6388 ("staging: typec: rt1711h typec chip driver")
Cc: John Stultz <john.stultz@linaro.org>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
changes for v2:
- Add fix tag.
- Use lore.kernel.org link.
- Add Guenter's R-b tag.

 drivers/usb/typec/tcpm/tcpci_rt1711h.c | 31 ++++++++++---------------------
 1 file changed, 10 insertions(+), 21 deletions(-)

Comments

John Stultz June 3, 2020, 11:33 p.m. UTC | #1
On Tue, Jun 2, 2020 at 6:18 PM <jun.li@nxp.com> wrote:
>
> From: Li Jun <jun.li@nxp.com>
>
> John reported screaming irq caused by rt1711h when system boot[1],
> this is because irq request is done before tcpci_register_port(),
> so the chip->tcpci has not been setup, irq handler is entered but
> can't do anything, this patch is to address this by moving the irq
> request after tcpci_register_port().
>
> [1] https://lore.kernel.org/linux-usb/20200530040157.31038-1-john.stultz@linaro.org
>
> Fixes: ce08eaeb6388 ("staging: typec: rt1711h typec chip driver")
> Cc: John Stultz <john.stultz@linaro.org>
> Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> Signed-off-by: Li Jun <jun.li@nxp.com>

Thanks so much for this, and sorry for my delay here.

Tested-by: John Stultz <john.stultz@linaro.org>


thanks
-john
Heikki Krogerus June 4, 2020, 10:53 a.m. UTC | #2
On Wed, Jun 03, 2020 at 09:02:51AM +0800, jun.li@nxp.com wrote:
> From: Li Jun <jun.li@nxp.com>
> 
> John reported screaming irq caused by rt1711h when system boot[1],
> this is because irq request is done before tcpci_register_port(),
> so the chip->tcpci has not been setup, irq handler is entered but
> can't do anything, this patch is to address this by moving the irq
> request after tcpci_register_port().
> 
> [1] https://lore.kernel.org/linux-usb/20200530040157.31038-1-john.stultz@linaro.org
> 
> Fixes: ce08eaeb6388 ("staging: typec: rt1711h typec chip driver")
> Cc: John Stultz <john.stultz@linaro.org>
> Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> Signed-off-by: Li Jun <jun.li@nxp.com>

No Cc: <stable@vger.kernel.org> ? In any case, FWIW:

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
> changes for v2:
> - Add fix tag.
> - Use lore.kernel.org link.
> - Add Guenter's R-b tag.
> 
>  drivers/usb/typec/tcpm/tcpci_rt1711h.c | 31 ++++++++++---------------------
>  1 file changed, 10 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> index 0173890..b56a088 100644
> --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> @@ -179,26 +179,6 @@ static irqreturn_t rt1711h_irq(int irq, void *dev_id)
>  	return tcpci_irq(chip->tcpci);
>  }
>  
> -static int rt1711h_init_alert(struct rt1711h_chip *chip,
> -			      struct i2c_client *client)
> -{
> -	int ret;
> -
> -	/* Disable chip interrupts before requesting irq */
> -	ret = rt1711h_write16(chip, TCPC_ALERT_MASK, 0);
> -	if (ret < 0)
> -		return ret;
> -
> -	ret = devm_request_threaded_irq(chip->dev, client->irq, NULL,
> -					rt1711h_irq,
> -					IRQF_ONESHOT | IRQF_TRIGGER_LOW,
> -					dev_name(chip->dev), chip);
> -	if (ret < 0)
> -		return ret;
> -	enable_irq_wake(client->irq);
> -	return 0;
> -}
> -
>  static int rt1711h_sw_reset(struct rt1711h_chip *chip)
>  {
>  	int ret;
> @@ -260,7 +240,8 @@ static int rt1711h_probe(struct i2c_client *client,
>  	if (ret < 0)
>  		return ret;
>  
> -	ret = rt1711h_init_alert(chip, client);
> +	/* Disable chip interrupts before requesting irq */
> +	ret = rt1711h_write16(chip, TCPC_ALERT_MASK, 0);
>  	if (ret < 0)
>  		return ret;
>  
> @@ -271,6 +252,14 @@ static int rt1711h_probe(struct i2c_client *client,
>  	if (IS_ERR_OR_NULL(chip->tcpci))
>  		return PTR_ERR(chip->tcpci);
>  
> +	ret = devm_request_threaded_irq(chip->dev, client->irq, NULL,
> +					rt1711h_irq,
> +					IRQF_ONESHOT | IRQF_TRIGGER_LOW,
> +					dev_name(chip->dev), chip);
> +	if (ret < 0)
> +		return ret;
> +	enable_irq_wake(client->irq);
> +
>  	return 0;
>  }

thanks,
diff mbox series

Patch

diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
index 0173890..b56a088 100644
--- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
+++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
@@ -179,26 +179,6 @@  static irqreturn_t rt1711h_irq(int irq, void *dev_id)
 	return tcpci_irq(chip->tcpci);
 }
 
-static int rt1711h_init_alert(struct rt1711h_chip *chip,
-			      struct i2c_client *client)
-{
-	int ret;
-
-	/* Disable chip interrupts before requesting irq */
-	ret = rt1711h_write16(chip, TCPC_ALERT_MASK, 0);
-	if (ret < 0)
-		return ret;
-
-	ret = devm_request_threaded_irq(chip->dev, client->irq, NULL,
-					rt1711h_irq,
-					IRQF_ONESHOT | IRQF_TRIGGER_LOW,
-					dev_name(chip->dev), chip);
-	if (ret < 0)
-		return ret;
-	enable_irq_wake(client->irq);
-	return 0;
-}
-
 static int rt1711h_sw_reset(struct rt1711h_chip *chip)
 {
 	int ret;
@@ -260,7 +240,8 @@  static int rt1711h_probe(struct i2c_client *client,
 	if (ret < 0)
 		return ret;
 
-	ret = rt1711h_init_alert(chip, client);
+	/* Disable chip interrupts before requesting irq */
+	ret = rt1711h_write16(chip, TCPC_ALERT_MASK, 0);
 	if (ret < 0)
 		return ret;
 
@@ -271,6 +252,14 @@  static int rt1711h_probe(struct i2c_client *client,
 	if (IS_ERR_OR_NULL(chip->tcpci))
 		return PTR_ERR(chip->tcpci);
 
+	ret = devm_request_threaded_irq(chip->dev, client->irq, NULL,
+					rt1711h_irq,
+					IRQF_ONESHOT | IRQF_TRIGGER_LOW,
+					dev_name(chip->dev), chip);
+	if (ret < 0)
+		return ret;
+	enable_irq_wake(client->irq);
+
 	return 0;
 }