Loading Documentation/devicetree/bindings/thermal/imx-thermal.txt +4 −0 Original line number Diff line number Diff line Loading @@ -8,10 +8,14 @@ Required properties: 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>; }; drivers/thermal/imx_thermal.c +20 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ * */ #include <linux/clk.h> #include <linux/cpu_cooling.h> #include <linux/cpufreq.h> #include <linux/delay.h> Loading Loading @@ -73,6 +74,7 @@ struct imx_thermal_data { unsigned long last_temp; bool irq_enabled; int irq; struct clk *thermal_clk; }; static void imx_set_alarm_temp(struct imx_thermal_data *data, Loading Loading @@ -457,6 +459,22 @@ static int imx_thermal_probe(struct platform_device *pdev) 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 */ Loading @@ -478,6 +496,8 @@ static int imx_thermal_remove(struct platform_device *pdev) /* 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); Loading drivers/thermal/intel_powerclamp.c +10 −1 Original line number Diff line number Diff line Loading @@ -206,6 +206,15 @@ static void find_target_mwait(void) } static bool has_pkg_state_counter(void) { u64 tmp; return !rdmsrl_safe(MSR_PKG_C2_RESIDENCY, &tmp) || !rdmsrl_safe(MSR_PKG_C3_RESIDENCY, &tmp) || !rdmsrl_safe(MSR_PKG_C6_RESIDENCY, &tmp) || !rdmsrl_safe(MSR_PKG_C7_RESIDENCY, &tmp); } static u64 pkg_state_counter(void) { u64 val; Loading Loading @@ -500,7 +509,7 @@ static int start_power_clamp(void) struct task_struct *thread; /* check if pkg cstate counter is completely 0, abort in this case */ if (!pkg_state_counter()) { if (!has_pkg_state_counter()) { pr_err("pkg cstate counter not functional, abort\n"); return -EINVAL; } Loading drivers/thermal/thermal_core.c +3 −0 Original line number Diff line number Diff line Loading @@ -781,6 +781,9 @@ emul_temp_store(struct device *dev, struct device_attribute *attr, ret = tz->ops->set_emul_temp(tz, temperature); } if (!ret) thermal_zone_device_update(tz); return ret ? ret : count; } static DEVICE_ATTR(emul_temp, S_IWUSR, NULL, emul_temp_store); Loading Loading
Documentation/devicetree/bindings/thermal/imx-thermal.txt +4 −0 Original line number Diff line number Diff line Loading @@ -8,10 +8,14 @@ Required properties: 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>; };
drivers/thermal/imx_thermal.c +20 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ * */ #include <linux/clk.h> #include <linux/cpu_cooling.h> #include <linux/cpufreq.h> #include <linux/delay.h> Loading Loading @@ -73,6 +74,7 @@ struct imx_thermal_data { unsigned long last_temp; bool irq_enabled; int irq; struct clk *thermal_clk; }; static void imx_set_alarm_temp(struct imx_thermal_data *data, Loading Loading @@ -457,6 +459,22 @@ static int imx_thermal_probe(struct platform_device *pdev) 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 */ Loading @@ -478,6 +496,8 @@ static int imx_thermal_remove(struct platform_device *pdev) /* 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); Loading
drivers/thermal/intel_powerclamp.c +10 −1 Original line number Diff line number Diff line Loading @@ -206,6 +206,15 @@ static void find_target_mwait(void) } static bool has_pkg_state_counter(void) { u64 tmp; return !rdmsrl_safe(MSR_PKG_C2_RESIDENCY, &tmp) || !rdmsrl_safe(MSR_PKG_C3_RESIDENCY, &tmp) || !rdmsrl_safe(MSR_PKG_C6_RESIDENCY, &tmp) || !rdmsrl_safe(MSR_PKG_C7_RESIDENCY, &tmp); } static u64 pkg_state_counter(void) { u64 val; Loading Loading @@ -500,7 +509,7 @@ static int start_power_clamp(void) struct task_struct *thread; /* check if pkg cstate counter is completely 0, abort in this case */ if (!pkg_state_counter()) { if (!has_pkg_state_counter()) { pr_err("pkg cstate counter not functional, abort\n"); return -EINVAL; } Loading
drivers/thermal/thermal_core.c +3 −0 Original line number Diff line number Diff line Loading @@ -781,6 +781,9 @@ emul_temp_store(struct device *dev, struct device_attribute *attr, ret = tz->ops->set_emul_temp(tz, temperature); } if (!ret) thermal_zone_device_update(tz); return ret ? ret : count; } static DEVICE_ATTR(emul_temp, S_IWUSR, NULL, emul_temp_store); Loading