diff mbox series

[v2,1/3] kernel: Provide a __pow10() function

Message ID 20190507193504.28248-2-f.fainelli@gmail.com (mailing list archive)
State New, archived
Headers show
Series hwmon: scmi: Scale values to target desired HWMON units | expand

Commit Message

Florian Fainelli May 7, 2019, 7:35 p.m. UTC
Provide a simple macro that can return the value of 10 raised to a
positive integer. We are going to use this in order to scale units from
firmware to HWMON.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 include/linux/kernel.h | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Guenter Roeck May 7, 2019, 9:06 p.m. UTC | #1
On Tue, May 07, 2019 at 12:35:02PM -0700, Florian Fainelli wrote:
> Provide a simple macro that can return the value of 10 raised to a
> positive integer. We are going to use this in order to scale units from
> firmware to HWMON.
> 
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
>  include/linux/kernel.h | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
> index 2d14e21c16c0..62fc8bd84bc9 100644
> --- a/include/linux/kernel.h
> +++ b/include/linux/kernel.h
> @@ -294,6 +294,17 @@ static inline u32 reciprocal_scale(u32 val, u32 ep_ro)
>  	return (u32)(((u64) val * ep_ro) >> 32);
>  }
>  
> +/* Return in f the value of 10 raise to the power x */
> +#define __pow10(x, f)(					\
> +{							\
> +	typeof(x) __x = abs(x);				\
> +	f = 1;						\
> +	while (__x--)					\
> +		f *= 10;				\
> +	f;						\
> +}							\
> +)

Kind of unusual. I would have expected to use this like
	f = __pow10(x);
ie without having to provide f as parameter. That would be much less
confusing. I assume this is to make the result type independent, but
I am not sure if that is worth the trouble.

Are there users outside the hwmon code ? If not, it might be simpler
to keep it there for now.

Thanks,
Guenter

> +
>  #if defined(CONFIG_MMU) && \
>  	(defined(CONFIG_PROVE_LOCKING) || defined(CONFIG_DEBUG_ATOMIC_SLEEP))
>  #define might_fault() __might_fault(__FILE__, __LINE__)
> -- 
> 2.17.1
>
Florian Fainelli May 7, 2019, 9:49 p.m. UTC | #2
On 5/7/19 2:06 PM, Guenter Roeck wrote:
> On Tue, May 07, 2019 at 12:35:02PM -0700, Florian Fainelli wrote:
>> Provide a simple macro that can return the value of 10 raised to a
>> positive integer. We are going to use this in order to scale units from
>> firmware to HWMON.
>>
>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>> ---
>>  include/linux/kernel.h | 11 +++++++++++
>>  1 file changed, 11 insertions(+)
>>
>> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
>> index 2d14e21c16c0..62fc8bd84bc9 100644
>> --- a/include/linux/kernel.h
>> +++ b/include/linux/kernel.h
>> @@ -294,6 +294,17 @@ static inline u32 reciprocal_scale(u32 val, u32 ep_ro)
>>  	return (u32)(((u64) val * ep_ro) >> 32);
>>  }
>>  
>> +/* Return in f the value of 10 raise to the power x */
>> +#define __pow10(x, f)(					\
>> +{							\
>> +	typeof(x) __x = abs(x);				\
>> +	f = 1;						\
>> +	while (__x--)					\
>> +		f *= 10;				\
>> +	f;						\
>> +}							\
>> +)
> 
> Kind of unusual. I would have expected to use this like
> 	f = __pow10(x);
> ie without having to provide f as parameter. That would be much less
> confusing. I assume this is to make the result type independent, but
> I am not sure if that is worth the trouble.

Correct, that was the intent here.

> 
> Are there users outside the hwmon code ? If not, it might be simpler
> to keep it there for now.

There appears to be a few outside actually:

drivers/acpi/sbs.c::battery_scale
drivers/iio/common/hid-sensors/hid-sensor-attributes.c::pow_10

There could be others but those two came out as obvious candidates.

Would you be okay with a local pow10 function within scmi-hwmon.c and a
subsequent patch series providing a common function?
Guenter Roeck May 7, 2019, 11:21 p.m. UTC | #3
On 5/7/19 2:49 PM, Florian Fainelli wrote:
> On 5/7/19 2:06 PM, Guenter Roeck wrote:
>> On Tue, May 07, 2019 at 12:35:02PM -0700, Florian Fainelli wrote:
>>> Provide a simple macro that can return the value of 10 raised to a
>>> positive integer. We are going to use this in order to scale units from
>>> firmware to HWMON.
>>>
>>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>>> ---
>>>   include/linux/kernel.h | 11 +++++++++++
>>>   1 file changed, 11 insertions(+)
>>>
>>> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
>>> index 2d14e21c16c0..62fc8bd84bc9 100644
>>> --- a/include/linux/kernel.h
>>> +++ b/include/linux/kernel.h
>>> @@ -294,6 +294,17 @@ static inline u32 reciprocal_scale(u32 val, u32 ep_ro)
>>>   	return (u32)(((u64) val * ep_ro) >> 32);
>>>   }
>>>   
>>> +/* Return in f the value of 10 raise to the power x */
>>> +#define __pow10(x, f)(					\
>>> +{							\
>>> +	typeof(x) __x = abs(x);				\
>>> +	f = 1;						\
>>> +	while (__x--)					\
>>> +		f *= 10;				\
>>> +	f;						\
>>> +}							\
>>> +)
>>
>> Kind of unusual. I would have expected to use this like
>> 	f = __pow10(x);
>> ie without having to provide f as parameter. That would be much less
>> confusing. I assume this is to make the result type independent, but
>> I am not sure if that is worth the trouble.
> 
> Correct, that was the intent here.
> 
>>
>> Are there users outside the hwmon code ? If not, it might be simpler
>> to keep it there for now.
> 
> There appears to be a few outside actually:
> 
> drivers/acpi/sbs.c::battery_scale
> drivers/iio/common/hid-sensors/hid-sensor-attributes.c::pow_10
> 
> There could be others but those two came out as obvious candidates.
> 
> Would you be okay with a local pow10 function within scmi-hwmon.c and a
> subsequent patch series providing a common function?
> 

I would prefer that, actually, to reduce dependencies.

Thanks,
Guenter
diff mbox series

Patch

diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 2d14e21c16c0..62fc8bd84bc9 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -294,6 +294,17 @@  static inline u32 reciprocal_scale(u32 val, u32 ep_ro)
 	return (u32)(((u64) val * ep_ro) >> 32);
 }
 
+/* Return in f the value of 10 raise to the power x */
+#define __pow10(x, f)(					\
+{							\
+	typeof(x) __x = abs(x);				\
+	f = 1;						\
+	while (__x--)					\
+		f *= 10;				\
+	f;						\
+}							\
+)
+
 #if defined(CONFIG_MMU) && \
 	(defined(CONFIG_PROVE_LOCKING) || defined(CONFIG_DEBUG_ATOMIC_SLEEP))
 #define might_fault() __might_fault(__FILE__, __LINE__)