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