Skip to contentSkip to conversation

imx: thermal: imx_get_temp might be called before the sensor clock ist prepared

PATCH New Heiner Kallweit 1 participant 1 message Oct 6, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 imx: thermal: imx_get_temp might be called before the sensor clock ist prepared

imx_get_temp might be called before the sensor clock ist 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.

---
 drivers/thermal/imx_thermal.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)
drivers/thermal/imx_thermal.c +14 -14
index 461bf3d..ef50df6 100644
@@ -521,20 +521,6 @@ static int imx_thermal_probe(struct platform_device *pdev)
                return ret;
        }
 
-       data->tz = thermal_zone_device_register("imx_thermal_zone",
-                                               IMX_TRIP_NUM,
-                                               BIT(IMX_TRIP_PASSIVE), data,
-                                               &imx_tz_ops, NULL,
-                                               IMX_PASSIVE_DELAY,
-                                               IMX_POLLING_DELAY);
-       if (IS_ERR(data->tz)) {
-               ret = PTR_ERR(data->tz);
-               dev_err(&pdev->dev,
-                       "failed to register thermal zone device %d\n", ret);
-               cpufreq_cooling_unregister(data->cdev);
-               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");
@@ -551,6 +537,20 @@ static int imx_thermal_probe(struct platform_device *pdev)
                        dev_warn(&pdev->dev, "failed to enable thermal clk: %d\n", ret);
        }
 
+       data->tz = thermal_zone_device_register("imx_thermal_zone",
+                                               IMX_TRIP_NUM,
+                                               BIT(IMX_TRIP_PASSIVE), data,
+                                               &imx_tz_ops, NULL,
+                                               IMX_PASSIVE_DELAY,
+                                               IMX_POLLING_DELAY);
+       if (IS_ERR(data->tz)) {
+               ret = PTR_ERR(data->tz);
+               dev_err(&pdev->dev,
+                       "failed to register thermal zone device %d\n", ret);
+               cpufreq_cooling_unregister(data->cdev);
+               return ret;
+       }
+
        /* Enable measurements at ~ 10 Hz */
        regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ);
        measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */

--
2.1.2