diff mbox series

[v1,01/21] hwmon: Fix the type of 'config' in struct hwmon_channel_info to u64

Message ID 20250121064519.18974-2-lihuisong@huawei.com (mailing list archive)
State New
Headers show
Series hwmon: Fix the type of 'config' in struct hwmon_channel_info to u64 | expand

Commit Message

lihuisong (C) Jan. 21, 2025, 6:44 a.m. UTC
Currently, the maximum number of hwmon channel attributes is 32 which is
limited by current hwmon core codes. And the power attributes are up to 31.
It's already encountered the issue of not adding attribute name to power
channel attribute.

So fix the type of 'config' in struct hwmon_channel_info to u64 so as to
support more attributes. For this goal, the following points are needed to
be done:
(1) Fix the type of 'config' in hwmon_channel_info structure to u64.
(2) Modify hwmon_num_channel_attrs() with hweight64.
(3) Type of BIT(xxx) in linux/hwmon.h is 'UL', need to modify to BIT_ULL.

Signed-off-by: Huisong Li <lihuisong@huawei.com>
---
 drivers/hwmon/hwmon.c |   4 +-
 include/linux/hwmon.h | 300 +++++++++++++++++++++---------------------
 2 files changed, 152 insertions(+), 152 deletions(-)

Comments

Russell King (Oracle) Jan. 21, 2025, 5:05 p.m. UTC | #1
On Tue, Jan 21, 2025 at 02:44:59PM +0800, Huisong Li wrote:
>   */
>  struct hwmon_channel_info {
>  	enum hwmon_sensor_types type;
> -	const u32 *config;
> +	const u64 *config;
>  };
>  
>  #define HWMON_CHANNEL_INFO(stype, ...)		\
>  	(&(const struct hwmon_channel_info) {	\
>  		.type = hwmon_##stype,		\
> -		.config = (const u32 []) {	\
> +		.config = (const u64 []) {	\
>  			__VA_ARGS__, 0		\
>  		}				\
>  	})

I'm sorry, but... no. Just no. Have you tried building with only your
first patch?

It will cause the compiler to barf on, e.g. the following:

static u32 marvell_hwmon_chip_config[] = {
...

static const struct hwmon_channel_info marvell_hwmon_chip = {
        .type = hwmon_chip,
        .config = marvell_hwmon_chip_config,
};

I suggest that you rearrange your series: first, do the conversions
to HWMON_CHANNEL_INFO() in the drivers you have.

At this point, if all the drivers that assign to hw_channel_info.config
have been converted, this patch 1 is then suitable.

If there are still drivers that assign a u32 array to
hw_channel_info.config, then you need to consider how to handle
that without causing regressions. You can't cast it between a u32
array and u64 array to silence the warning, because config[1]
won't point at the next entry.

I think your only option would be to combine the conversion of struct
hwmon_channel_info and the other drivers into a single patch. Slightly
annoying, but without introducing more preprocessor yuckiness, I don't
see another way.
Guenter Roeck Jan. 21, 2025, 5:32 p.m. UTC | #2
On 1/21/25 09:05, Russell King (Oracle) wrote:
> On Tue, Jan 21, 2025 at 02:44:59PM +0800, Huisong Li wrote:
>>    */
>>   struct hwmon_channel_info {
>>   	enum hwmon_sensor_types type;
>> -	const u32 *config;
>> +	const u64 *config;
>>   };
>>   
>>   #define HWMON_CHANNEL_INFO(stype, ...)		\
>>   	(&(const struct hwmon_channel_info) {	\
>>   		.type = hwmon_##stype,		\
>> -		.config = (const u32 []) {	\
>> +		.config = (const u64 []) {	\
>>   			__VA_ARGS__, 0		\
>>   		}				\
>>   	})
> 
> I'm sorry, but... no. Just no. Have you tried building with only your
> first patch?
> 
> It will cause the compiler to barf on, e.g. the following:
> 
> static u32 marvell_hwmon_chip_config[] = {
> ...
> 
> static const struct hwmon_channel_info marvell_hwmon_chip = {
>          .type = hwmon_chip,
>          .config = marvell_hwmon_chip_config,
> };
> 
> I suggest that you rearrange your series: first, do the conversions
> to HWMON_CHANNEL_INFO() in the drivers you have.
> 
> At this point, if all the drivers that assign to hw_channel_info.config
> have been converted, this patch 1 is then suitable.
> 
> If there are still drivers that assign a u32 array to
> hw_channel_info.config, then you need to consider how to handle
> that without causing regressions. You can't cast it between a u32
> array and u64 array to silence the warning, because config[1]
> won't point at the next entry.
> 
> I think your only option would be to combine the conversion of struct
> hwmon_channel_info and the other drivers into a single patch. Slightly
> annoying, but without introducing more preprocessor yuckiness, I don't
> see another way.
> 

This is moot because the series does not explain which attributes
would be added ... and it turns out the to-be-added attributes would be
non-standard and thus not be acceptable anyway. On top of that, if the
size of configuration fields ever becomes an issue, I would look for a
much less invasive solution.

The author of this series did not contact me before submitting it,
and I did not have a chance to prevent it from being submitted.
Still, sorry for the noise.

Guenter
lihuisong (C) Jan. 22, 2025, 3:34 a.m. UTC | #3
在 2025/1/22 1:05, Russell King (Oracle) 写道:
> On Tue, Jan 21, 2025 at 02:44:59PM +0800, Huisong Li wrote:
>>    */
>>   struct hwmon_channel_info {
>>   	enum hwmon_sensor_types type;
>> -	const u32 *config;
>> +	const u64 *config;
>>   };
>>   
>>   #define HWMON_CHANNEL_INFO(stype, ...)		\
>>   	(&(const struct hwmon_channel_info) {	\
>>   		.type = hwmon_##stype,		\
>> -		.config = (const u32 []) {	\
>> +		.config = (const u64 []) {	\
>>   			__VA_ARGS__, 0		\
>>   		}				\
>>   	})
> I'm sorry, but... no. Just no. Have you tried building with only your
> first patch?
>
> It will cause the compiler to barf on, e.g. the following:
>
> static u32 marvell_hwmon_chip_config[] = {
> ...
>
> static const struct hwmon_channel_info marvell_hwmon_chip = {
>          .type = hwmon_chip,
>          .config = marvell_hwmon_chip_config,
> };
>
> I suggest that you rearrange your series: first, do the conversions
> to HWMON_CHANNEL_INFO() in the drivers you have.
Yes.
>
> At this point, if all the drivers that assign to hw_channel_info.config
> have been converted, this patch 1 is then suitable.
>
> If there are still drivers that assign a u32 array to
> hw_channel_info.config, then you need to consider how to handle
> that without causing regressions. You can't cast it between a u32
> array and u64 array to silence the warning, because config[1]
> won't point at the next entry.
>
> I think your only option would be to combine the conversion of struct
> hwmon_channel_info and the other drivers into a single patch. Slightly
> annoying, but without introducing more preprocessor yuckiness, I don't
> see another way.
got it. Thanks for suggestion.
diff mbox series

Patch

diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
index 9703d60e9bbf..1fe8fa12cc60 100644
--- a/drivers/hwmon/hwmon.c
+++ b/drivers/hwmon/hwmon.c
@@ -790,7 +790,7 @@  static int hwmon_num_channel_attrs(const struct hwmon_channel_info *info)
 	int i, n;
 
 	for (i = n = 0; info->config[i]; i++)
-		n += hweight32(info->config[i]);
+		n += hweight64(info->config[i]);
 
 	return n;
 }
@@ -811,7 +811,7 @@  static int hwmon_genattrs(const void *drvdata,
 	template_size = __templates_size[info->type];
 
 	for (i = 0; info->config[i]; i++) {
-		u32 attr_mask = info->config[i];
+		u64 attr_mask = info->config[i];
 		u32 attr;
 
 		while (attr_mask) {
diff --git a/include/linux/hwmon.h b/include/linux/hwmon.h
index 3a63dff62d03..544266a58d07 100644
--- a/include/linux/hwmon.h
+++ b/include/linux/hwmon.h
@@ -48,20 +48,20 @@  enum hwmon_chip_attributes {
 	hwmon_chip_pec,
 };
 
-#define HWMON_C_TEMP_RESET_HISTORY	BIT(hwmon_chip_temp_reset_history)
-#define HWMON_C_IN_RESET_HISTORY	BIT(hwmon_chip_in_reset_history)
-#define HWMON_C_CURR_RESET_HISTORY	BIT(hwmon_chip_curr_reset_history)
-#define HWMON_C_POWER_RESET_HISTORY	BIT(hwmon_chip_power_reset_history)
-#define HWMON_C_REGISTER_TZ		BIT(hwmon_chip_register_tz)
-#define HWMON_C_UPDATE_INTERVAL		BIT(hwmon_chip_update_interval)
-#define HWMON_C_ALARMS			BIT(hwmon_chip_alarms)
-#define HWMON_C_SAMPLES			BIT(hwmon_chip_samples)
-#define HWMON_C_CURR_SAMPLES		BIT(hwmon_chip_curr_samples)
-#define HWMON_C_IN_SAMPLES		BIT(hwmon_chip_in_samples)
-#define HWMON_C_POWER_SAMPLES		BIT(hwmon_chip_power_samples)
-#define HWMON_C_TEMP_SAMPLES		BIT(hwmon_chip_temp_samples)
-#define HWMON_C_BEEP_ENABLE		BIT(hwmon_chip_beep_enable)
-#define HWMON_C_PEC			BIT(hwmon_chip_pec)
+#define HWMON_C_TEMP_RESET_HISTORY	BIT_ULL(hwmon_chip_temp_reset_history)
+#define HWMON_C_IN_RESET_HISTORY	BIT_ULL(hwmon_chip_in_reset_history)
+#define HWMON_C_CURR_RESET_HISTORY	BIT_ULL(hwmon_chip_curr_reset_history)
+#define HWMON_C_POWER_RESET_HISTORY	BIT_ULL(hwmon_chip_power_reset_history)
+#define HWMON_C_REGISTER_TZ		BIT_ULL(hwmon_chip_register_tz)
+#define HWMON_C_UPDATE_INTERVAL		BIT_ULL(hwmon_chip_update_interval)
+#define HWMON_C_ALARMS			BIT_ULL(hwmon_chip_alarms)
+#define HWMON_C_SAMPLES			BIT_ULL(hwmon_chip_samples)
+#define HWMON_C_CURR_SAMPLES		BIT_ULL(hwmon_chip_curr_samples)
+#define HWMON_C_IN_SAMPLES		BIT_ULL(hwmon_chip_in_samples)
+#define HWMON_C_POWER_SAMPLES		BIT_ULL(hwmon_chip_power_samples)
+#define HWMON_C_TEMP_SAMPLES		BIT_ULL(hwmon_chip_temp_samples)
+#define HWMON_C_BEEP_ENABLE		BIT_ULL(hwmon_chip_beep_enable)
+#define HWMON_C_PEC			BIT_ULL(hwmon_chip_pec)
 
 enum hwmon_temp_attributes {
 	hwmon_temp_enable,
@@ -94,34 +94,34 @@  enum hwmon_temp_attributes {
 	hwmon_temp_beep,
 };
 
-#define HWMON_T_ENABLE		BIT(hwmon_temp_enable)
-#define HWMON_T_INPUT		BIT(hwmon_temp_input)
-#define HWMON_T_TYPE		BIT(hwmon_temp_type)
-#define HWMON_T_LCRIT		BIT(hwmon_temp_lcrit)
-#define HWMON_T_LCRIT_HYST	BIT(hwmon_temp_lcrit_hyst)
-#define HWMON_T_MIN		BIT(hwmon_temp_min)
-#define HWMON_T_MIN_HYST	BIT(hwmon_temp_min_hyst)
-#define HWMON_T_MAX		BIT(hwmon_temp_max)
-#define HWMON_T_MAX_HYST	BIT(hwmon_temp_max_hyst)
-#define HWMON_T_CRIT		BIT(hwmon_temp_crit)
-#define HWMON_T_CRIT_HYST	BIT(hwmon_temp_crit_hyst)
-#define HWMON_T_EMERGENCY	BIT(hwmon_temp_emergency)
-#define HWMON_T_EMERGENCY_HYST	BIT(hwmon_temp_emergency_hyst)
-#define HWMON_T_ALARM		BIT(hwmon_temp_alarm)
-#define HWMON_T_MIN_ALARM	BIT(hwmon_temp_min_alarm)
-#define HWMON_T_MAX_ALARM	BIT(hwmon_temp_max_alarm)
-#define HWMON_T_CRIT_ALARM	BIT(hwmon_temp_crit_alarm)
-#define HWMON_T_LCRIT_ALARM	BIT(hwmon_temp_lcrit_alarm)
-#define HWMON_T_EMERGENCY_ALARM	BIT(hwmon_temp_emergency_alarm)
-#define HWMON_T_FAULT		BIT(hwmon_temp_fault)
-#define HWMON_T_OFFSET		BIT(hwmon_temp_offset)
-#define HWMON_T_LABEL		BIT(hwmon_temp_label)
-#define HWMON_T_LOWEST		BIT(hwmon_temp_lowest)
-#define HWMON_T_HIGHEST		BIT(hwmon_temp_highest)
-#define HWMON_T_RESET_HISTORY	BIT(hwmon_temp_reset_history)
-#define HWMON_T_RATED_MIN	BIT(hwmon_temp_rated_min)
-#define HWMON_T_RATED_MAX	BIT(hwmon_temp_rated_max)
-#define HWMON_T_BEEP		BIT(hwmon_temp_beep)
+#define HWMON_T_ENABLE		BIT_ULL(hwmon_temp_enable)
+#define HWMON_T_INPUT		BIT_ULL(hwmon_temp_input)
+#define HWMON_T_TYPE		BIT_ULL(hwmon_temp_type)
+#define HWMON_T_LCRIT		BIT_ULL(hwmon_temp_lcrit)
+#define HWMON_T_LCRIT_HYST	BIT_ULL(hwmon_temp_lcrit_hyst)
+#define HWMON_T_MIN		BIT_ULL(hwmon_temp_min)
+#define HWMON_T_MIN_HYST	BIT_ULL(hwmon_temp_min_hyst)
+#define HWMON_T_MAX		BIT_ULL(hwmon_temp_max)
+#define HWMON_T_MAX_HYST	BIT_ULL(hwmon_temp_max_hyst)
+#define HWMON_T_CRIT		BIT_ULL(hwmon_temp_crit)
+#define HWMON_T_CRIT_HYST	BIT_ULL(hwmon_temp_crit_hyst)
+#define HWMON_T_EMERGENCY	BIT_ULL(hwmon_temp_emergency)
+#define HWMON_T_EMERGENCY_HYST	BIT_ULL(hwmon_temp_emergency_hyst)
+#define HWMON_T_ALARM		BIT_ULL(hwmon_temp_alarm)
+#define HWMON_T_MIN_ALARM	BIT_ULL(hwmon_temp_min_alarm)
+#define HWMON_T_MAX_ALARM	BIT_ULL(hwmon_temp_max_alarm)
+#define HWMON_T_CRIT_ALARM	BIT_ULL(hwmon_temp_crit_alarm)
+#define HWMON_T_LCRIT_ALARM	BIT_ULL(hwmon_temp_lcrit_alarm)
+#define HWMON_T_EMERGENCY_ALARM	BIT_ULL(hwmon_temp_emergency_alarm)
+#define HWMON_T_FAULT		BIT_ULL(hwmon_temp_fault)
+#define HWMON_T_OFFSET		BIT_ULL(hwmon_temp_offset)
+#define HWMON_T_LABEL		BIT_ULL(hwmon_temp_label)
+#define HWMON_T_LOWEST		BIT_ULL(hwmon_temp_lowest)
+#define HWMON_T_HIGHEST		BIT_ULL(hwmon_temp_highest)
+#define HWMON_T_RESET_HISTORY	BIT_ULL(hwmon_temp_reset_history)
+#define HWMON_T_RATED_MIN	BIT_ULL(hwmon_temp_rated_min)
+#define HWMON_T_RATED_MAX	BIT_ULL(hwmon_temp_rated_max)
+#define HWMON_T_BEEP		BIT_ULL(hwmon_temp_beep)
 
 enum hwmon_in_attributes {
 	hwmon_in_enable,
@@ -146,26 +146,26 @@  enum hwmon_in_attributes {
 	hwmon_in_fault,
 };
 
-#define HWMON_I_ENABLE		BIT(hwmon_in_enable)
-#define HWMON_I_INPUT		BIT(hwmon_in_input)
-#define HWMON_I_MIN		BIT(hwmon_in_min)
-#define HWMON_I_MAX		BIT(hwmon_in_max)
-#define HWMON_I_LCRIT		BIT(hwmon_in_lcrit)
-#define HWMON_I_CRIT		BIT(hwmon_in_crit)
-#define HWMON_I_AVERAGE		BIT(hwmon_in_average)
-#define HWMON_I_LOWEST		BIT(hwmon_in_lowest)
-#define HWMON_I_HIGHEST		BIT(hwmon_in_highest)
-#define HWMON_I_RESET_HISTORY	BIT(hwmon_in_reset_history)
-#define HWMON_I_LABEL		BIT(hwmon_in_label)
-#define HWMON_I_ALARM		BIT(hwmon_in_alarm)
-#define HWMON_I_MIN_ALARM	BIT(hwmon_in_min_alarm)
-#define HWMON_I_MAX_ALARM	BIT(hwmon_in_max_alarm)
-#define HWMON_I_LCRIT_ALARM	BIT(hwmon_in_lcrit_alarm)
-#define HWMON_I_CRIT_ALARM	BIT(hwmon_in_crit_alarm)
-#define HWMON_I_RATED_MIN	BIT(hwmon_in_rated_min)
-#define HWMON_I_RATED_MAX	BIT(hwmon_in_rated_max)
-#define HWMON_I_BEEP		BIT(hwmon_in_beep)
-#define HWMON_I_FAULT		BIT(hwmon_in_fault)
+#define HWMON_I_ENABLE		BIT_ULL(hwmon_in_enable)
+#define HWMON_I_INPUT		BIT_ULL(hwmon_in_input)
+#define HWMON_I_MIN		BIT_ULL(hwmon_in_min)
+#define HWMON_I_MAX		BIT_ULL(hwmon_in_max)
+#define HWMON_I_LCRIT		BIT_ULL(hwmon_in_lcrit)
+#define HWMON_I_CRIT		BIT_ULL(hwmon_in_crit)
+#define HWMON_I_AVERAGE		BIT_ULL(hwmon_in_average)
+#define HWMON_I_LOWEST		BIT_ULL(hwmon_in_lowest)
+#define HWMON_I_HIGHEST		BIT_ULL(hwmon_in_highest)
+#define HWMON_I_RESET_HISTORY	BIT_ULL(hwmon_in_reset_history)
+#define HWMON_I_LABEL		BIT_ULL(hwmon_in_label)
+#define HWMON_I_ALARM		BIT_ULL(hwmon_in_alarm)
+#define HWMON_I_MIN_ALARM	BIT_ULL(hwmon_in_min_alarm)
+#define HWMON_I_MAX_ALARM	BIT_ULL(hwmon_in_max_alarm)
+#define HWMON_I_LCRIT_ALARM	BIT_ULL(hwmon_in_lcrit_alarm)
+#define HWMON_I_CRIT_ALARM	BIT_ULL(hwmon_in_crit_alarm)
+#define HWMON_I_RATED_MIN	BIT_ULL(hwmon_in_rated_min)
+#define HWMON_I_RATED_MAX	BIT_ULL(hwmon_in_rated_max)
+#define HWMON_I_BEEP		BIT_ULL(hwmon_in_beep)
+#define HWMON_I_FAULT		BIT_ULL(hwmon_in_fault)
 
 enum hwmon_curr_attributes {
 	hwmon_curr_enable,
@@ -189,25 +189,25 @@  enum hwmon_curr_attributes {
 	hwmon_curr_beep,
 };
 
-#define HWMON_C_ENABLE		BIT(hwmon_curr_enable)
-#define HWMON_C_INPUT		BIT(hwmon_curr_input)
-#define HWMON_C_MIN		BIT(hwmon_curr_min)
-#define HWMON_C_MAX		BIT(hwmon_curr_max)
-#define HWMON_C_LCRIT		BIT(hwmon_curr_lcrit)
-#define HWMON_C_CRIT		BIT(hwmon_curr_crit)
-#define HWMON_C_AVERAGE		BIT(hwmon_curr_average)
-#define HWMON_C_LOWEST		BIT(hwmon_curr_lowest)
-#define HWMON_C_HIGHEST		BIT(hwmon_curr_highest)
-#define HWMON_C_RESET_HISTORY	BIT(hwmon_curr_reset_history)
-#define HWMON_C_LABEL		BIT(hwmon_curr_label)
-#define HWMON_C_ALARM		BIT(hwmon_curr_alarm)
-#define HWMON_C_MIN_ALARM	BIT(hwmon_curr_min_alarm)
-#define HWMON_C_MAX_ALARM	BIT(hwmon_curr_max_alarm)
-#define HWMON_C_LCRIT_ALARM	BIT(hwmon_curr_lcrit_alarm)
-#define HWMON_C_CRIT_ALARM	BIT(hwmon_curr_crit_alarm)
-#define HWMON_C_RATED_MIN	BIT(hwmon_curr_rated_min)
-#define HWMON_C_RATED_MAX	BIT(hwmon_curr_rated_max)
-#define HWMON_C_BEEP		BIT(hwmon_curr_beep)
+#define HWMON_C_ENABLE		BIT_ULL(hwmon_curr_enable)
+#define HWMON_C_INPUT		BIT_ULL(hwmon_curr_input)
+#define HWMON_C_MIN		BIT_ULL(hwmon_curr_min)
+#define HWMON_C_MAX		BIT_ULL(hwmon_curr_max)
+#define HWMON_C_LCRIT		BIT_ULL(hwmon_curr_lcrit)
+#define HWMON_C_CRIT		BIT_ULL(hwmon_curr_crit)
+#define HWMON_C_AVERAGE		BIT_ULL(hwmon_curr_average)
+#define HWMON_C_LOWEST		BIT_ULL(hwmon_curr_lowest)
+#define HWMON_C_HIGHEST		BIT_ULL(hwmon_curr_highest)
+#define HWMON_C_RESET_HISTORY	BIT_ULL(hwmon_curr_reset_history)
+#define HWMON_C_LABEL		BIT_ULL(hwmon_curr_label)
+#define HWMON_C_ALARM		BIT_ULL(hwmon_curr_alarm)
+#define HWMON_C_MIN_ALARM	BIT_ULL(hwmon_curr_min_alarm)
+#define HWMON_C_MAX_ALARM	BIT_ULL(hwmon_curr_max_alarm)
+#define HWMON_C_LCRIT_ALARM	BIT_ULL(hwmon_curr_lcrit_alarm)
+#define HWMON_C_CRIT_ALARM	BIT_ULL(hwmon_curr_crit_alarm)
+#define HWMON_C_RATED_MIN	BIT_ULL(hwmon_curr_rated_min)
+#define HWMON_C_RATED_MAX	BIT_ULL(hwmon_curr_rated_max)
+#define HWMON_C_BEEP		BIT_ULL(hwmon_curr_beep)
 
 enum hwmon_power_attributes {
 	hwmon_power_enable,
@@ -243,37 +243,37 @@  enum hwmon_power_attributes {
 	hwmon_power_rated_max,
 };
 
-#define HWMON_P_ENABLE			BIT(hwmon_power_enable)
-#define HWMON_P_AVERAGE			BIT(hwmon_power_average)
-#define HWMON_P_AVERAGE_INTERVAL	BIT(hwmon_power_average_interval)
-#define HWMON_P_AVERAGE_INTERVAL_MAX	BIT(hwmon_power_average_interval_max)
-#define HWMON_P_AVERAGE_INTERVAL_MIN	BIT(hwmon_power_average_interval_min)
-#define HWMON_P_AVERAGE_HIGHEST		BIT(hwmon_power_average_highest)
-#define HWMON_P_AVERAGE_LOWEST		BIT(hwmon_power_average_lowest)
-#define HWMON_P_AVERAGE_MAX		BIT(hwmon_power_average_max)
-#define HWMON_P_AVERAGE_MIN		BIT(hwmon_power_average_min)
-#define HWMON_P_INPUT			BIT(hwmon_power_input)
-#define HWMON_P_INPUT_HIGHEST		BIT(hwmon_power_input_highest)
-#define HWMON_P_INPUT_LOWEST		BIT(hwmon_power_input_lowest)
-#define HWMON_P_RESET_HISTORY		BIT(hwmon_power_reset_history)
-#define HWMON_P_ACCURACY		BIT(hwmon_power_accuracy)
-#define HWMON_P_CAP			BIT(hwmon_power_cap)
-#define HWMON_P_CAP_HYST		BIT(hwmon_power_cap_hyst)
-#define HWMON_P_CAP_MAX			BIT(hwmon_power_cap_max)
-#define HWMON_P_CAP_MIN			BIT(hwmon_power_cap_min)
-#define HWMON_P_MIN			BIT(hwmon_power_min)
-#define HWMON_P_MAX			BIT(hwmon_power_max)
-#define HWMON_P_LCRIT			BIT(hwmon_power_lcrit)
-#define HWMON_P_CRIT			BIT(hwmon_power_crit)
-#define HWMON_P_LABEL			BIT(hwmon_power_label)
-#define HWMON_P_ALARM			BIT(hwmon_power_alarm)
-#define HWMON_P_CAP_ALARM		BIT(hwmon_power_cap_alarm)
-#define HWMON_P_MIN_ALARM		BIT(hwmon_power_min_alarm)
-#define HWMON_P_MAX_ALARM		BIT(hwmon_power_max_alarm)
-#define HWMON_P_LCRIT_ALARM		BIT(hwmon_power_lcrit_alarm)
-#define HWMON_P_CRIT_ALARM		BIT(hwmon_power_crit_alarm)
-#define HWMON_P_RATED_MIN		BIT(hwmon_power_rated_min)
-#define HWMON_P_RATED_MAX		BIT(hwmon_power_rated_max)
+#define HWMON_P_ENABLE			BIT_ULL(hwmon_power_enable)
+#define HWMON_P_AVERAGE			BIT_ULL(hwmon_power_average)
+#define HWMON_P_AVERAGE_INTERVAL	BIT_ULL(hwmon_power_average_interval)
+#define HWMON_P_AVERAGE_INTERVAL_MAX	BIT_ULL(hwmon_power_average_interval_max)
+#define HWMON_P_AVERAGE_INTERVAL_MIN	BIT_ULL(hwmon_power_average_interval_min)
+#define HWMON_P_AVERAGE_HIGHEST		BIT_ULL(hwmon_power_average_highest)
+#define HWMON_P_AVERAGE_LOWEST		BIT_ULL(hwmon_power_average_lowest)
+#define HWMON_P_AVERAGE_MAX		BIT_ULL(hwmon_power_average_max)
+#define HWMON_P_AVERAGE_MIN		BIT_ULL(hwmon_power_average_min)
+#define HWMON_P_INPUT			BIT_ULL(hwmon_power_input)
+#define HWMON_P_INPUT_HIGHEST		BIT_ULL(hwmon_power_input_highest)
+#define HWMON_P_INPUT_LOWEST		BIT_ULL(hwmon_power_input_lowest)
+#define HWMON_P_RESET_HISTORY		BIT_ULL(hwmon_power_reset_history)
+#define HWMON_P_ACCURACY		BIT_ULL(hwmon_power_accuracy)
+#define HWMON_P_CAP			BIT_ULL(hwmon_power_cap)
+#define HWMON_P_CAP_HYST		BIT_ULL(hwmon_power_cap_hyst)
+#define HWMON_P_CAP_MAX			BIT_ULL(hwmon_power_cap_max)
+#define HWMON_P_CAP_MIN			BIT_ULL(hwmon_power_cap_min)
+#define HWMON_P_MIN			BIT_ULL(hwmon_power_min)
+#define HWMON_P_MAX			BIT_ULL(hwmon_power_max)
+#define HWMON_P_LCRIT			BIT_ULL(hwmon_power_lcrit)
+#define HWMON_P_CRIT			BIT_ULL(hwmon_power_crit)
+#define HWMON_P_LABEL			BIT_ULL(hwmon_power_label)
+#define HWMON_P_ALARM			BIT_ULL(hwmon_power_alarm)
+#define HWMON_P_CAP_ALARM		BIT_ULL(hwmon_power_cap_alarm)
+#define HWMON_P_MIN_ALARM		BIT_ULL(hwmon_power_min_alarm)
+#define HWMON_P_MAX_ALARM		BIT_ULL(hwmon_power_max_alarm)
+#define HWMON_P_LCRIT_ALARM		BIT_ULL(hwmon_power_lcrit_alarm)
+#define HWMON_P_CRIT_ALARM		BIT_ULL(hwmon_power_crit_alarm)
+#define HWMON_P_RATED_MIN		BIT_ULL(hwmon_power_rated_min)
+#define HWMON_P_RATED_MAX		BIT_ULL(hwmon_power_rated_max)
 
 enum hwmon_energy_attributes {
 	hwmon_energy_enable,
@@ -281,9 +281,9 @@  enum hwmon_energy_attributes {
 	hwmon_energy_label,
 };
 
-#define HWMON_E_ENABLE			BIT(hwmon_energy_enable)
-#define HWMON_E_INPUT			BIT(hwmon_energy_input)
-#define HWMON_E_LABEL			BIT(hwmon_energy_label)
+#define HWMON_E_ENABLE			BIT_ULL(hwmon_energy_enable)
+#define HWMON_E_INPUT			BIT_ULL(hwmon_energy_input)
+#define HWMON_E_LABEL			BIT_ULL(hwmon_energy_label)
 
 enum hwmon_humidity_attributes {
 	hwmon_humidity_enable,
@@ -301,19 +301,19 @@  enum hwmon_humidity_attributes {
 	hwmon_humidity_max_alarm,
 };
 
-#define HWMON_H_ENABLE			BIT(hwmon_humidity_enable)
-#define HWMON_H_INPUT			BIT(hwmon_humidity_input)
-#define HWMON_H_LABEL			BIT(hwmon_humidity_label)
-#define HWMON_H_MIN			BIT(hwmon_humidity_min)
-#define HWMON_H_MIN_HYST		BIT(hwmon_humidity_min_hyst)
-#define HWMON_H_MAX			BIT(hwmon_humidity_max)
-#define HWMON_H_MAX_HYST		BIT(hwmon_humidity_max_hyst)
-#define HWMON_H_ALARM			BIT(hwmon_humidity_alarm)
-#define HWMON_H_FAULT			BIT(hwmon_humidity_fault)
-#define HWMON_H_RATED_MIN		BIT(hwmon_humidity_rated_min)
-#define HWMON_H_RATED_MAX		BIT(hwmon_humidity_rated_max)
-#define HWMON_H_MIN_ALARM		BIT(hwmon_humidity_min_alarm)
-#define HWMON_H_MAX_ALARM		BIT(hwmon_humidity_max_alarm)
+#define HWMON_H_ENABLE			BIT_ULL(hwmon_humidity_enable)
+#define HWMON_H_INPUT			BIT_ULL(hwmon_humidity_input)
+#define HWMON_H_LABEL			BIT_ULL(hwmon_humidity_label)
+#define HWMON_H_MIN			BIT_ULL(hwmon_humidity_min)
+#define HWMON_H_MIN_HYST		BIT_ULL(hwmon_humidity_min_hyst)
+#define HWMON_H_MAX			BIT_ULL(hwmon_humidity_max)
+#define HWMON_H_MAX_HYST		BIT_ULL(hwmon_humidity_max_hyst)
+#define HWMON_H_ALARM			BIT_ULL(hwmon_humidity_alarm)
+#define HWMON_H_FAULT			BIT_ULL(hwmon_humidity_fault)
+#define HWMON_H_RATED_MIN		BIT_ULL(hwmon_humidity_rated_min)
+#define HWMON_H_RATED_MAX		BIT_ULL(hwmon_humidity_rated_max)
+#define HWMON_H_MIN_ALARM		BIT_ULL(hwmon_humidity_min_alarm)
+#define HWMON_H_MAX_ALARM		BIT_ULL(hwmon_humidity_max_alarm)
 
 enum hwmon_fan_attributes {
 	hwmon_fan_enable,
@@ -331,19 +331,19 @@  enum hwmon_fan_attributes {
 	hwmon_fan_beep,
 };
 
-#define HWMON_F_ENABLE			BIT(hwmon_fan_enable)
-#define HWMON_F_INPUT			BIT(hwmon_fan_input)
-#define HWMON_F_LABEL			BIT(hwmon_fan_label)
-#define HWMON_F_MIN			BIT(hwmon_fan_min)
-#define HWMON_F_MAX			BIT(hwmon_fan_max)
-#define HWMON_F_DIV			BIT(hwmon_fan_div)
-#define HWMON_F_PULSES			BIT(hwmon_fan_pulses)
-#define HWMON_F_TARGET			BIT(hwmon_fan_target)
-#define HWMON_F_ALARM			BIT(hwmon_fan_alarm)
-#define HWMON_F_MIN_ALARM		BIT(hwmon_fan_min_alarm)
-#define HWMON_F_MAX_ALARM		BIT(hwmon_fan_max_alarm)
-#define HWMON_F_FAULT			BIT(hwmon_fan_fault)
-#define HWMON_F_BEEP			BIT(hwmon_fan_beep)
+#define HWMON_F_ENABLE			BIT_ULL(hwmon_fan_enable)
+#define HWMON_F_INPUT			BIT_ULL(hwmon_fan_input)
+#define HWMON_F_LABEL			BIT_ULL(hwmon_fan_label)
+#define HWMON_F_MIN			BIT_ULL(hwmon_fan_min)
+#define HWMON_F_MAX			BIT_ULL(hwmon_fan_max)
+#define HWMON_F_DIV			BIT_ULL(hwmon_fan_div)
+#define HWMON_F_PULSES			BIT_ULL(hwmon_fan_pulses)
+#define HWMON_F_TARGET			BIT_ULL(hwmon_fan_target)
+#define HWMON_F_ALARM			BIT_ULL(hwmon_fan_alarm)
+#define HWMON_F_MIN_ALARM		BIT_ULL(hwmon_fan_min_alarm)
+#define HWMON_F_MAX_ALARM		BIT_ULL(hwmon_fan_max_alarm)
+#define HWMON_F_FAULT			BIT_ULL(hwmon_fan_fault)
+#define HWMON_F_BEEP			BIT_ULL(hwmon_fan_beep)
 
 enum hwmon_pwm_attributes {
 	hwmon_pwm_input,
@@ -353,18 +353,18 @@  enum hwmon_pwm_attributes {
 	hwmon_pwm_auto_channels_temp,
 };
 
-#define HWMON_PWM_INPUT			BIT(hwmon_pwm_input)
-#define HWMON_PWM_ENABLE		BIT(hwmon_pwm_enable)
-#define HWMON_PWM_MODE			BIT(hwmon_pwm_mode)
-#define HWMON_PWM_FREQ			BIT(hwmon_pwm_freq)
-#define HWMON_PWM_AUTO_CHANNELS_TEMP	BIT(hwmon_pwm_auto_channels_temp)
+#define HWMON_PWM_INPUT			BIT_ULL(hwmon_pwm_input)
+#define HWMON_PWM_ENABLE		BIT_ULL(hwmon_pwm_enable)
+#define HWMON_PWM_MODE			BIT_ULL(hwmon_pwm_mode)
+#define HWMON_PWM_FREQ			BIT_ULL(hwmon_pwm_freq)
+#define HWMON_PWM_AUTO_CHANNELS_TEMP	BIT_ULL(hwmon_pwm_auto_channels_temp)
 
 enum hwmon_intrusion_attributes {
 	hwmon_intrusion_alarm,
 	hwmon_intrusion_beep,
 };
-#define HWMON_INTRUSION_ALARM		BIT(hwmon_intrusion_alarm)
-#define HWMON_INTRUSION_BEEP		BIT(hwmon_intrusion_beep)
+#define HWMON_INTRUSION_ALARM		BIT_ULL(hwmon_intrusion_alarm)
+#define HWMON_INTRUSION_BEEP		BIT_ULL(hwmon_intrusion_beep)
 
 /**
  * struct hwmon_ops - hwmon device operations
@@ -433,13 +433,13 @@  struct hwmon_ops {
  */
 struct hwmon_channel_info {
 	enum hwmon_sensor_types type;
-	const u32 *config;
+	const u64 *config;
 };
 
 #define HWMON_CHANNEL_INFO(stype, ...)		\
 	(&(const struct hwmon_channel_info) {	\
 		.type = hwmon_##stype,		\
-		.config = (const u32 []) {	\
+		.config = (const u64 []) {	\
 			__VA_ARGS__, 0		\
 		}				\
 	})