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:
Vitaliy Sochnev 2026-09-15 20:41:28 +01:00 committed by Daniel Lezcano
parent 7cbf4366da
commit 7efceedd23

View File

@ -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,