mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
usb: typec: tcpci_rt1711h: avoid screaming irq causing boot hangs
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: ce08eaeb63 ("staging: typec: rt1711h typec chip driver")
Cc: stable <stable@vger.kernel.org> # v4.18+
Cc: John Stultz <john.stultz@linaro.org>
Reported-and-tested-by: John Stultz <john.stultz@linaro.org>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
Link: https://lore.kernel.org/r/20200604112118.38062-1-jun.li@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
07c112fb09
commit
302c570bf3
|
|
@ -179,26 +179,6 @@ static irqreturn_t rt1711h_irq(int irq, void *dev_id)
|
||||||
return tcpci_irq(chip->tcpci);
|
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)
|
static int rt1711h_sw_reset(struct rt1711h_chip *chip)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
@ -260,7 +240,8 @@ static int rt1711h_probe(struct i2c_client *client,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
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)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
@ -271,6 +252,14 @@ static int rt1711h_probe(struct i2c_client *client,
|
||||||
if (IS_ERR_OR_NULL(chip->tcpci))
|
if (IS_ERR_OR_NULL(chip->tcpci))
|
||||||
return PTR_ERR(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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user