diff mbox

thermal: imx: use cpufreq cooling of registration method

Message ID 20171103164203.5805-1-bst@pengutronix.de (mailing list archive)
State Changes Requested
Delegated to: Eduardo Valentin
Headers show

Commit Message

Bastian Krause Nov. 3, 2017, 4:42 p.m. UTC
The of variant of cpufreq_cooling_register links the cooling device to
the device tree node provided.

This makes it possible to bind the cpufreq cooling device to a custom
thermal zone via a cooling-maps entry like:

	cooling-maps {
		map0 {
			trip = <&board_alert>;
			cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
		};
	};

Assuming a cpu node exists with label "cpu0" and #cooling-cells
property.

Signed-off-by: Bastian Stender <bst@pengutronix.de>
---
 drivers/thermal/imx_thermal.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Comments

Eduardo Valentin Nov. 6, 2017, 1:57 a.m. UTC | #1
Hello Bastian,

On Fri, Nov 03, 2017 at 05:42:03PM +0100, Bastian Stender wrote:
> The of variant of cpufreq_cooling_register links the cooling device to
> the device tree node provided.
> 
> This makes it possible to bind the cpufreq cooling device to a custom
> thermal zone via a cooling-maps entry like:
> 
> 	cooling-maps {
> 		map0 {
> 			trip = <&board_alert>;
> 			cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
> 		};
> 	};
> 
> Assuming a cpu node exists with label "cpu0" and #cooling-cells
> property.
> 
> Signed-off-by: Bastian Stender <bst@pengutronix.de>
> ---
>  drivers/thermal/imx_thermal.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
> index 4798b4b1fd77..de71cd3bb03a 100644
> --- a/drivers/thermal/imx_thermal.c
> +++ b/drivers/thermal/imx_thermal.c
> @@ -473,6 +473,8 @@ MODULE_DEVICE_TABLE(of, of_imx_thermal_match);
>  
>  static int imx_thermal_probe(struct platform_device *pdev)
>  {
> +	struct device_node *np;
> +	struct device *cpu_dev;
>  	struct imx_thermal_data *data;
>  	struct regmap *map;
>  	int measure_freq;
> @@ -533,7 +535,19 @@ static int imx_thermal_probe(struct platform_device *pdev)
>  		return -EPROBE_DEFER;
>  	}
>  
> -	data->cdev = cpufreq_cooling_register(data->policy);
> +	cpu_dev = get_cpu_device(0);
> +	if (!cpu_dev) {
> +		pr_err("%s: failed to get cpu0 device\n", __func__);
> +		return -ENODEV;
> +	}
> +
> +	np = of_node_get(cpu_dev->of_node);
> +	if (!np) {
> +		dev_err(cpu_dev, "failed to find cpu0 node\n");
> +		return -ENOENT;
> +	}
> +
> +	data->cdev = of_cpufreq_cooling_register(np, data->policy);

This would actually be better suited if added to IMX cpufreq driver
instead. Any reason to attempt to add to the thermal driver?

>  	if (IS_ERR(data->cdev)) {
>  		ret = PTR_ERR(data->cdev);
>  		dev_err(&pdev->dev,
> -- 
> 2.11.0
>
Bastian Krause Nov. 7, 2017, 10:26 a.m. UTC | #2
Hi Eduardo,

On 11/06/2017 02:57 AM, Eduardo Valentin wrote:
> On Fri, Nov 03, 2017 at 05:42:03PM +0100, Bastian Stender wrote:
>> The of variant of cpufreq_cooling_register links the cooling device to
>> the device tree node provided.
>>
>> This makes it possible to bind the cpufreq cooling device to a custom
>> thermal zone via a cooling-maps entry like:
>>
>> 	cooling-maps {
>> 		map0 {
>> 			trip = <&board_alert>;
>> 			cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
>> 		};
>> 	};
>>
>> Assuming a cpu node exists with label "cpu0" and #cooling-cells
>> property.
>>
>> Signed-off-by: Bastian Stender <bst@pengutronix.de>
>> ---
>>   drivers/thermal/imx_thermal.c | 16 +++++++++++++++-
>>   1 file changed, 15 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
>> index 4798b4b1fd77..de71cd3bb03a 100644
>> --- a/drivers/thermal/imx_thermal.c
>> +++ b/drivers/thermal/imx_thermal.c
>> @@ -473,6 +473,8 @@ MODULE_DEVICE_TABLE(of, of_imx_thermal_match);
>>   
>>   static int imx_thermal_probe(struct platform_device *pdev)
>>   {
>> +	struct device_node *np;
>> +	struct device *cpu_dev;
>>   	struct imx_thermal_data *data;
>>   	struct regmap *map;
>>   	int measure_freq;
>> @@ -533,7 +535,19 @@ static int imx_thermal_probe(struct platform_device *pdev)
>>   		return -EPROBE_DEFER;
>>   	}
>>   
>> -	data->cdev = cpufreq_cooling_register(data->policy);
>> +	cpu_dev = get_cpu_device(0);
>> +	if (!cpu_dev) {
>> +		pr_err("%s: failed to get cpu0 device\n", __func__);
>> +		return -ENODEV;
>> +	}
>> +
>> +	np = of_node_get(cpu_dev->of_node);
>> +	if (!np) {
>> +		dev_err(cpu_dev, "failed to find cpu0 node\n");
>> +		return -ENOENT;
>> +	}
>> +
>> +	data->cdev = of_cpufreq_cooling_register(np, data->policy);
> 
> This would actually be better suited if added to IMX cpufreq driver 
> instead. Any reason to attempt to add to the thermal driver?

Yes, you are right. Leaving the cooling device in imx_thermal.c was just
the path of least resistance. I will have a look in moving the cooling
device to the IMX cpufreq driver.

Regards,
Bastian
diff mbox

Patch

diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
index 4798b4b1fd77..de71cd3bb03a 100644
--- a/drivers/thermal/imx_thermal.c
+++ b/drivers/thermal/imx_thermal.c
@@ -473,6 +473,8 @@  MODULE_DEVICE_TABLE(of, of_imx_thermal_match);
 
 static int imx_thermal_probe(struct platform_device *pdev)
 {
+	struct device_node *np;
+	struct device *cpu_dev;
 	struct imx_thermal_data *data;
 	struct regmap *map;
 	int measure_freq;
@@ -533,7 +535,19 @@  static int imx_thermal_probe(struct platform_device *pdev)
 		return -EPROBE_DEFER;
 	}
 
-	data->cdev = cpufreq_cooling_register(data->policy);
+	cpu_dev = get_cpu_device(0);
+	if (!cpu_dev) {
+		pr_err("%s: failed to get cpu0 device\n", __func__);
+		return -ENODEV;
+	}
+
+	np = of_node_get(cpu_dev->of_node);
+	if (!np) {
+		dev_err(cpu_dev, "failed to find cpu0 node\n");
+		return -ENOENT;
+	}
+
+	data->cdev = of_cpufreq_cooling_register(np, data->policy);
 	if (IS_ERR(data->cdev)) {
 		ret = PTR_ERR(data->cdev);
 		dev_err(&pdev->dev,