diff mbox

thermal: of: fix cooling_spec.args for 64bit

Message ID 1430972952-16303-1-git-send-email-wni@nvidia.com (mailing list archive)
State Rejected
Delegated to: Zhang Rui
Headers show

Commit Message

Wei Ni May 7, 2015, 4:29 a.m. UTC
The THERMAL_NO_LIMIT is defined as -1UL, when it is set in DT,
the of-thermal will use of_parse_phandle_with_args() to parse it.
Since the args is uint32_t, so in 32bit system, the of framework
will read it as 0xffffffff, it's the expected value "-1".
But in 64bit system, this value is read as 0x00000000ffffffff,
it's not a negative value, it will cause problems.

This change can fix this issue.

Signed-off-by: Wei Ni <wni@nvidia.com>
---
 drivers/thermal/of-thermal.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Punit Agrawal May 7, 2015, 9:51 a.m. UTC | #1
Wei Ni <wni@nvidia.com> writes:

> The THERMAL_NO_LIMIT is defined as -1UL, when it is set in DT,
> the of-thermal will use of_parse_phandle_with_args() to parse it.
> Since the args is uint32_t, so in 32bit system, the of framework
> will read it as 0xffffffff, it's the expected value "-1".
> But in 64bit system, this value is read as 0x00000000ffffffff,
> it's not a negative value, it will cause problems.
>
> This change can fix this issue.

If I understand the issue correctly, a patch fixing this is already
merged. Does "commit a940cb34f: thermal: Fix cdev registration with
THERMAL_NO_LIMIT on 64bit" not work for you?

>
> Signed-off-by: Wei Ni <wni@nvidia.com>
> ---
>  drivers/thermal/of-thermal.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c
> index 9e8c614103ef..8d6b4070dea3 100644
> --- a/drivers/thermal/of-thermal.c
> +++ b/drivers/thermal/of-thermal.c
> @@ -613,8 +613,10 @@ static int thermal_of_populate_bind_params(struct device_node *np,
>  	}
>  	__tbp->cooling_device = cooling_spec.np;
>  	if (cooling_spec.args_count >= 2) { /* at least min and max */
> -		__tbp->min = cooling_spec.args[0];
> -		__tbp->max = cooling_spec.args[1];
> +		__tbp->min = cooling_spec.args[0] == -1U ?
> +			THERMAL_NO_LIMIT : cooling_spec.args[0];
> +		__tbp->max = cooling_spec.args[1] == -1U ?
> +			THERMAL_NO_LIMIT : cooling_spec.args[1];
>  	} else {
>  		pr_err("wrong reference to cooling device, missing limits\n");
>  	}
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Wei Ni May 7, 2015, 10:21 a.m. UTC | #2
On 2015?05?07? 17:51, Punit Agrawal wrote:
> Wei Ni <wni@nvidia.com> writes:
> 
>> The THERMAL_NO_LIMIT is defined as -1UL, when it is set in DT,
>> the of-thermal will use of_parse_phandle_with_args() to parse it.
>> Since the args is uint32_t, so in 32bit system, the of framework
>> will read it as 0xffffffff, it's the expected value "-1".
>> But in 64bit system, this value is read as 0x00000000ffffffff,
>> it's not a negative value, it will cause problems.
>>
>> This change can fix this issue.
> 
> If I understand the issue correctly, a patch fixing this is already
> merged. Does "commit a940cb34f: thermal: Fix cdev registration with
> THERMAL_NO_LIMIT on 64bit" not work for you?

Hmm, yes, this fix can work for me.
I made a mistake, and didn't notice this change.
Sorry, please ignore my patch.

Wei.

> 
>>
>> Signed-off-by: Wei Ni <wni@nvidia.com>
>> ---
>>  drivers/thermal/of-thermal.c | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c
>> index 9e8c614103ef..8d6b4070dea3 100644
>> --- a/drivers/thermal/of-thermal.c
>> +++ b/drivers/thermal/of-thermal.c
>> @@ -613,8 +613,10 @@ static int thermal_of_populate_bind_params(struct device_node *np,
>>  	}
>>  	__tbp->cooling_device = cooling_spec.np;
>>  	if (cooling_spec.args_count >= 2) { /* at least min and max */
>> -		__tbp->min = cooling_spec.args[0];
>> -		__tbp->max = cooling_spec.args[1];
>> +		__tbp->min = cooling_spec.args[0] == -1U ?
>> +			THERMAL_NO_LIMIT : cooling_spec.args[0];
>> +		__tbp->max = cooling_spec.args[1] == -1U ?
>> +			THERMAL_NO_LIMIT : cooling_spec.args[1];
>>  	} else {
>>  		pr_err("wrong reference to cooling device, missing limits\n");
>>  	}
-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may contain
confidential information.  Any unauthorized review, use, disclosure or distribution
is prohibited.  If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c
index 9e8c614103ef..8d6b4070dea3 100644
--- a/drivers/thermal/of-thermal.c
+++ b/drivers/thermal/of-thermal.c
@@ -613,8 +613,10 @@  static int thermal_of_populate_bind_params(struct device_node *np,
 	}
 	__tbp->cooling_device = cooling_spec.np;
 	if (cooling_spec.args_count >= 2) { /* at least min and max */
-		__tbp->min = cooling_spec.args[0];
-		__tbp->max = cooling_spec.args[1];
+		__tbp->min = cooling_spec.args[0] == -1U ?
+			THERMAL_NO_LIMIT : cooling_spec.args[0];
+		__tbp->max = cooling_spec.args[1] == -1U ?
+			THERMAL_NO_LIMIT : cooling_spec.args[1];
 	} else {
 		pr_err("wrong reference to cooling device, missing limits\n");
 	}