Hi Eduardo and Rui, On Fri, Feb 2, 2018 at 4:17 PM, Fabio Estevam <festevam@xxxxxxxxx> wrote: > From: Mikhail Lappo <mikhail.lappo@xxxxxxxxxxx> > > When device boots with T > T_trip_1 and requests interrupt, > the race condition takes place. The interrupt comes before > THERMAL_DEVICE_ENABLED is set. This leads to an attempt to > reading sensor value from irq and disabling the sensor, based on > the data->mode field, which expected to be THERMAL_DEVICE_ENABLED, > but still stays as THERMAL_DEVICE_DISABLED. Afher this issue > sensor is never re-enabled, as the driver state is wrong. > > Fix this problem by setting the 'data' members prior to > requesting the interrupts. > > Fixes: 37713a1e8e4c ("thermal: imx: implement thermal alarm interrupt handling") > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Mikhail Lappo <mikhail.lappo@xxxxxxxxxxx> > Signed-off-by: Fabio Estevam <fabio.estevam@xxxxxxx> A gentle ping on this patch. > --- > drivers/thermal/imx_thermal.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c > index a67781b..ee3a215 100644 > --- a/drivers/thermal/imx_thermal.c > +++ b/drivers/thermal/imx_thermal.c > @@ -637,6 +637,9 @@ static int imx_thermal_probe(struct platform_device *pdev) > regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_POWER_DOWN); > regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_MEASURE_TEMP); > > + data->irq_enabled = true; > + data->mode = THERMAL_DEVICE_ENABLED; > + > ret = devm_request_threaded_irq(&pdev->dev, data->irq, > imx_thermal_alarm_irq, imx_thermal_alarm_irq_thread, > 0, "imx_thermal", data); > @@ -649,9 +652,6 @@ static int imx_thermal_probe(struct platform_device *pdev) > return ret; > } > > - data->irq_enabled = true; > - data->mode = THERMAL_DEVICE_ENABLED; > - > return 0; > } > > -- > 2.7.4 >