calibration data, e.g. OCOTP on imx6q.  The details about calibration data
   can be found in SoC Reference Manual.
 
+Optional properties:
+- clocks : thermal sensor's clock source.
+
 Example:
 
 tempmon {
        compatible = "fsl,imx6q-tempmon";
        fsl,tempmon = <&anatop>;
        fsl,tempmon-data = <&ocotp>;
+       clocks = <&clks 172>;
 };
 
  *
  */
 
+#include <linux/clk.h>
 #include <linux/cpu_cooling.h>
 #include <linux/cpufreq.h>
 #include <linux/delay.h>
        unsigned long last_temp;
        bool irq_enabled;
        int irq;
+       struct clk *thermal_clk;
 };
 
 static void imx_set_alarm_temp(struct imx_thermal_data *data,
                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 */
        regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ);
        measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
 
        /* Disable measurements */
        regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_POWER_DOWN);
+       if (!IS_ERR(data->thermal_clk))
+               clk_disable_unprepare(data->thermal_clk);
 
        thermal_zone_device_unregister(data->tz);
        cpufreq_cooling_unregister(data->cdev);