mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
thermal/drivers/airoha: Request the EN7581 IRQ after zone registration
The EN7581 IRQ is requested before the thermal zone is registered, and
the handler passes priv->tz to thermal_zone_device_update(). Unbind
leaves the monitor interrupt enabled, so an interrupt pending on the
next bind fires while priv->tz is NULL. On a Nokia XG-040G-MD this
oopses in thermal_zone_device_update(). On unbind, devres also frees the
zone before the IRQ.
Request the IRQ in post_probe, after zone registration.
Fixes: 42de37f40e ("thermal/drivers: Add support for Airoha EN7581 thermal sensor")
Signed-off-by: Vitaliy Sochnev <sochnev.v.74@gmail.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@kernel.org>
Link: https://patch.msgid.link/20260915194128.42508-1-sochnev.v.74@gmail.com
This commit is contained in:
parent
7cbf4366da
commit
7efceedd23
|
|
@ -528,7 +528,7 @@ static int en7581_thermal_probe(struct platform_device *pdev,
|
|||
struct device_node *chip_scu_np;
|
||||
struct device *dev = &pdev->dev;
|
||||
void __iomem *base;
|
||||
int i, irq, ret;
|
||||
int i;
|
||||
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(base))
|
||||
|
|
@ -567,16 +567,6 @@ static int en7581_thermal_probe(struct platform_device *pdev,
|
|||
of_address_to_resource(chip_scu_np, 0, &priv->scu_adc_res);
|
||||
of_node_put(chip_scu_np);
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||
en7581_thermal_irq, IRQF_ONESHOT,
|
||||
pdev->name, priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
en7581_thermal_setup_monitor(priv);
|
||||
en7581_thermal_setup_adc_val(dev, priv);
|
||||
|
||||
|
|
@ -586,6 +576,18 @@ static int en7581_thermal_probe(struct platform_device *pdev,
|
|||
static int en7581_thermal_post_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct airoha_thermal_priv *priv = platform_get_drvdata(pdev);
|
||||
int irq, ret;
|
||||
|
||||
/* After zone registration: the handler uses priv->tz */
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||
en7581_thermal_irq, IRQF_ONESHOT,
|
||||
pdev->name, priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Enable LOW and HIGH interrupt (if supported) */
|
||||
regmap_write(priv->map, EN7581_TEMPMONINT,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user