imx: thermal: imx_get_temp might be called before sensor clock is prepared
imx_get_temp might be called before the sensor clock is prepared thus resulting in a timeout of the first attempt to read temp: thermal thermal_zone0: failed to read out thermal zone 0 Happened to me on a Utilite Standard with IMX6 Dual SoC. Reason is that in imx_thermal_probe thermal_zone_device_register is called before the sensor clock is prepared. thermal_zone_device_register however calls thermal_zone_device_update which eventually calls imx_get_temp. Fix this by preparing the clock before calling thermal_zone_device_register. Signed-off-by: Heiner Kallweit <heiner.kallweit@web.de> Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
This commit is contained in:
parent
1d6a277757
commit
90a21ff582
|
@ -525,6 +525,30 @@ static int imx_thermal_probe(struct platform_device *pdev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data->thermal_clk = devm_clk_get(&pdev->dev, NULL);
|
||||||
|
if (IS_ERR(data->thermal_clk)) {
|
||||||
|
ret = PTR_ERR(data->thermal_clk);
|
||||||
|
if (ret != -EPROBE_DEFER)
|
||||||
|
dev_err(&pdev->dev,
|
||||||
|
"failed to get thermal clk: %d\n", ret);
|
||||||
|
cpufreq_cooling_unregister(data->cdev);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Thermal sensor needs clk on to get correct value, normally
|
||||||
|
* we should enable its clk before taking measurement and disable
|
||||||
|
* clk after measurement is done, but if alarm function is enabled,
|
||||||
|
* hardware will auto measure the temperature periodically, so we
|
||||||
|
* need to keep the clk always on for alarm function.
|
||||||
|
*/
|
||||||
|
ret = clk_prepare_enable(data->thermal_clk);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&pdev->dev, "failed to enable thermal clk: %d\n", ret);
|
||||||
|
cpufreq_cooling_unregister(data->cdev);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
data->tz = thermal_zone_device_register("imx_thermal_zone",
|
data->tz = thermal_zone_device_register("imx_thermal_zone",
|
||||||
IMX_TRIP_NUM,
|
IMX_TRIP_NUM,
|
||||||
BIT(IMX_TRIP_PASSIVE), data,
|
BIT(IMX_TRIP_PASSIVE), data,
|
||||||
|
@ -535,26 +559,11 @@ static int imx_thermal_probe(struct platform_device *pdev)
|
||||||
ret = PTR_ERR(data->tz);
|
ret = PTR_ERR(data->tz);
|
||||||
dev_err(&pdev->dev,
|
dev_err(&pdev->dev,
|
||||||
"failed to register thermal zone device %d\n", ret);
|
"failed to register thermal zone device %d\n", ret);
|
||||||
|
clk_disable_unprepare(data->thermal_clk);
|
||||||
cpufreq_cooling_unregister(data->cdev);
|
cpufreq_cooling_unregister(data->cdev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
data->thermal_clk = devm_clk_get(&pdev->dev, NULL);
|
|
||||||
if (IS_ERR(data->thermal_clk)) {
|
|
||||||
dev_warn(&pdev->dev, "failed to get thermal clk!\n");
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Thermal sensor needs clk on to get correct value, normally
|
|
||||||
* we should enable its clk before taking measurement and disable
|
|
||||||
* clk after measurement is done, but if alarm function is enabled,
|
|
||||||
* hardware will auto measure the temperature periodically, so we
|
|
||||||
* need to keep the clk always on for alarm function.
|
|
||||||
*/
|
|
||||||
ret = clk_prepare_enable(data->thermal_clk);
|
|
||||||
if (ret)
|
|
||||||
dev_warn(&pdev->dev, "failed to enable thermal clk: %d\n", ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enable measurements at ~ 10 Hz */
|
/* Enable measurements at ~ 10 Hz */
|
||||||
regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ);
|
regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ);
|
||||||
measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
|
measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
|
||||||
|
|
Loading…
Reference in New Issue