On 6/2/20 12:12 AM, jun.li@xxxxxxx wrote: > From: Li Jun <jun.li@xxxxxxx> > > 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://lkml.org/lkml/2020/5/30/1 > > Cc: John Stultz <john.stultz@xxxxxxxxxx> > Signed-off-by: Li Jun <jun.li@xxxxxxx> Reviewed-by: Guenter Roeck <linux@xxxxxxxxxxxx> > --- > 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; > } > >