diff options
author | Bai Ping <b51503@freescale.com> | 2015-09-08 23:55:03 +0800 |
---|---|---|
committer | Octavian Purdila <octavian.purdila@nxp.com> | 2017-02-23 14:21:42 +0200 |
commit | df5cadc8e993ef75f8d0783dc49f5d423bedcf27 (patch) | |
tree | d0b2113b21d72d60fd6b67185cbc4eeff0f49bd8 /drivers/thermal/imx_thermal.c | |
parent | 0ce6299708add1f8e5780b0aaf400ae36ca06cea (diff) |
MLK-11518-03 thermal: imx enable devfreq cooling
Enable devfreq cooling to trigger GPU freq change when
hot trip is reached.
Make sure thermal driver loaded after cpufreq is loaded,
otherwise, cpu_cooling will not get valid cpufreq table,
hence cpu_cooling will be not working.
Signed-off-by: Bai Ping <b51503@freescale.com>
Diffstat (limited to 'drivers/thermal/imx_thermal.c')
-rw-r--r-- | drivers/thermal/imx_thermal.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c index 4bb983da25db..4a0d374370be 100644 --- a/drivers/thermal/imx_thermal.c +++ b/drivers/thermal/imx_thermal.c @@ -11,6 +11,7 @@ #include <linux/cpu_cooling.h> #include <linux/delay.h> #include <linux/device.h> +#include <linux/device_cooling.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/io.h> @@ -216,7 +217,7 @@ static struct thermal_soc_data thermal_imx7d_data = { struct imx_thermal_data { struct thermal_zone_device *tz; - struct thermal_cooling_device *cdev; + struct thermal_cooling_device *cdev[2]; enum thermal_device_mode mode; struct regmap *tempmon; u32 c1, c2; /* See formula in imx_get_sensor_data() */ @@ -735,9 +736,9 @@ static int imx_thermal_probe(struct platform_device *pdev) regmap_write(map, data->socdata->sensor_ctrl + REG_SET, data->socdata->power_down_mask); - data->cdev = cpufreq_cooling_register(cpu_present_mask); - if (IS_ERR(data->cdev)) { - ret = PTR_ERR(data->cdev); + data->cdev[0] = cpufreq_cooling_register(cpu_present_mask); + if (IS_ERR(data->cdev[0])) { + ret = PTR_ERR(data->cdev[0]); if (ret != -EPROBE_DEFER) dev_err(&pdev->dev, "failed to register cpufreq cooling device: %d\n", @@ -745,13 +746,25 @@ static int imx_thermal_probe(struct platform_device *pdev) return ret; } + data->cdev[1] = devfreq_cooling_register(); + if (IS_ERR(data->cdev[1])) { + ret = PTR_ERR(data->cdev[1]); + if (ret != -EPROBE_DEFER) { + dev_err(&pdev->dev, + "failed to register cpufreq cooling device: %d\n", + ret); + cpufreq_cooling_unregister(data->cdev[0]); + } + 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); + cpufreq_cooling_unregister(data->cdev[0]); return ret; } @@ -765,7 +778,8 @@ static int imx_thermal_probe(struct platform_device *pdev) 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); + cpufreq_cooling_unregister(data->cdev[0]); + devfreq_cooling_unregister(data->cdev[1]); return ret; } @@ -780,7 +794,8 @@ static int imx_thermal_probe(struct platform_device *pdev) dev_err(&pdev->dev, "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[0]); + devfreq_cooling_unregister(data->cdev[1]); return ret; } @@ -812,7 +827,8 @@ static int imx_thermal_probe(struct platform_device *pdev) dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret); clk_disable_unprepare(data->thermal_clk); thermal_zone_device_unregister(data->tz); - cpufreq_cooling_unregister(data->cdev); + cpufreq_cooling_unregister(data->cdev[0]); + devfreq_cooling_unregister(data->cdev[1]); return ret; } @@ -834,7 +850,8 @@ static int imx_thermal_remove(struct platform_device *pdev) clk_disable_unprepare(data->thermal_clk); thermal_zone_device_unregister(data->tz); - cpufreq_cooling_unregister(data->cdev); + cpufreq_cooling_unregister(data->cdev[0]); + devfreq_cooling_unregister(data->cdev[1]); return 0; } |