2727 */
2828
2929#include <linux/acpi.h>
30- #include <linux/bitfield.h>
3130#include <linux/cleanup.h>
3231#include <linux/component.h>
3332#include <linux/container_of.h>
5958
6059#define LWMI_FEATURE_ID_FAN_RPM 0x03
6160
62- #define LWMI_TYPE_ID_NONE 0x00
63-
6461#define LWMI_FEATURE_VALUE_GET 17
6562#define LWMI_FEATURE_VALUE_SET 18
6663
7067
7168#define LWMI_FAN_DIV 100
7269
73- #define LWMI_ATTR_ID_FAN_RPM (x ) \
74- (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) | \
75- FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_RPM) | \
76- FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, LWMI_FAN_ID(x)))
70+ #define LWMI_ATTR_ID_FAN_RPM (x ) \
71+ lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \
72+ LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x))
7773
7874#define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other"
7975#define LWMI_OM_HWMON_NAME "lenovo_wmi_other"
@@ -616,12 +612,8 @@ static ssize_t attr_capdata01_show(struct kobject *kobj,
616612 u32 attribute_id ;
617613 int value , ret ;
618614
619- attribute_id =
620- FIELD_PREP (LWMI_ATTR_DEV_ID_MASK , tunable_attr -> device_id ) |
621- FIELD_PREP (LWMI_ATTR_FEAT_ID_MASK , tunable_attr -> feature_id ) |
622- FIELD_PREP (LWMI_ATTR_MODE_ID_MASK ,
623- LWMI_GZ_THERMAL_MODE_CUSTOM ) |
624- FIELD_PREP (LWMI_ATTR_TYPE_ID_MASK , tunable_attr -> type_id );
615+ attribute_id = lwmi_attr_id (tunable_attr -> device_id , tunable_attr -> feature_id ,
616+ LWMI_GZ_THERMAL_MODE_CUSTOM , tunable_attr -> type_id );
625617
626618 ret = lwmi_cd01_get_data (priv -> cd01_list , attribute_id , & capdata );
627619 if (ret )
@@ -686,10 +678,8 @@ static ssize_t attr_current_value_store(struct kobject *kobj,
686678 if (mode != LWMI_GZ_THERMAL_MODE_CUSTOM )
687679 return - EBUSY ;
688680
689- args .arg0 = FIELD_PREP (LWMI_ATTR_DEV_ID_MASK , tunable_attr -> device_id ) |
690- FIELD_PREP (LWMI_ATTR_FEAT_ID_MASK , tunable_attr -> feature_id ) |
691- FIELD_PREP (LWMI_ATTR_MODE_ID_MASK , tunable_attr -> cd_mode_id ) |
692- FIELD_PREP (LWMI_ATTR_TYPE_ID_MASK , tunable_attr -> type_id );
681+ args .arg0 = lwmi_attr_id (tunable_attr -> device_id , tunable_attr -> feature_id ,
682+ tunable_attr -> cd_mode_id , tunable_attr -> type_id );
693683
694684 ret = lwmi_cd01_get_data (priv -> cd01_list , args .arg0 , & capdata );
695685 if (ret )
@@ -702,10 +692,8 @@ static ssize_t attr_current_value_store(struct kobject *kobj,
702692 if (value < capdata .min_value || value > capdata .max_value )
703693 return - EINVAL ;
704694
705- args .arg0 = FIELD_PREP (LWMI_ATTR_DEV_ID_MASK , tunable_attr -> device_id ) |
706- FIELD_PREP (LWMI_ATTR_FEAT_ID_MASK , tunable_attr -> feature_id ) |
707- FIELD_PREP (LWMI_ATTR_MODE_ID_MASK , tunable_attr -> cv_mode_id ) |
708- FIELD_PREP (LWMI_ATTR_TYPE_ID_MASK , tunable_attr -> type_id );
695+ args .arg0 = lwmi_attr_id (tunable_attr -> device_id , tunable_attr -> feature_id ,
696+ tunable_attr -> cv_mode_id , tunable_attr -> type_id );
709697 args .arg1 = value ;
710698
711699 ret = lwmi_dev_evaluate_int (priv -> wdev , 0x0 , LWMI_FEATURE_VALUE_SET ,
@@ -750,10 +738,8 @@ static ssize_t attr_current_value_show(struct kobject *kobj,
750738 if (tunable_attr -> cv_mode_id == LWMI_GZ_THERMAL_MODE_NONE )
751739 mode = tunable_attr -> cv_mode_id ;
752740
753- args .arg0 = FIELD_PREP (LWMI_ATTR_DEV_ID_MASK , tunable_attr -> device_id ) |
754- FIELD_PREP (LWMI_ATTR_FEAT_ID_MASK , tunable_attr -> feature_id ) |
755- FIELD_PREP (LWMI_ATTR_MODE_ID_MASK , mode ) |
756- FIELD_PREP (LWMI_ATTR_TYPE_ID_MASK , tunable_attr -> type_id );
741+ args .arg0 = lwmi_attr_id (tunable_attr -> device_id , tunable_attr -> feature_id ,
742+ tunable_attr -> cv_mode_id , tunable_attr -> type_id );
757743
758744 ret = lwmi_dev_evaluate_int (priv -> wdev , 0x0 , LWMI_FEATURE_VALUE_GET ,
759745 (unsigned char * )& args , sizeof (args ),
@@ -794,10 +780,8 @@ static bool lwmi_attr_01_is_supported(struct tunable_attr_01 *tunable_attr)
794780
795781 /* Determine tunable_attr->cd_mode_id*/
796782 for (i = 0 ; i < ARRAY_SIZE (modes ); i ++ ) {
797- args .arg0 = FIELD_PREP (LWMI_ATTR_DEV_ID_MASK , tunable_attr -> device_id ) |
798- FIELD_PREP (LWMI_ATTR_FEAT_ID_MASK , tunable_attr -> feature_id ) |
799- FIELD_PREP (LWMI_ATTR_MODE_ID_MASK , modes [i ]) |
800- FIELD_PREP (LWMI_ATTR_TYPE_ID_MASK , tunable_attr -> type_id );
783+ args .arg0 = lwmi_attr_id (tunable_attr -> device_id , tunable_attr -> feature_id ,
784+ modes [i ], tunable_attr -> type_id );
801785
802786 ret = lwmi_cd01_get_data (priv -> cd01_list , args .arg0 , & capdata );
803787 if (ret || !capdata .supported )
@@ -810,15 +794,10 @@ static bool lwmi_attr_01_is_supported(struct tunable_attr_01 *tunable_attr)
810794 if (!cd_mode_found )
811795 return cd_mode_found ;
812796
813- dev_dbg (tunable_attr -> dev ,
814- "cd_mode_id: %#010x\n" , args .arg0 );
815-
816797 /* Determine tunable_attr->cv_mode_id, returns 1 if supported*/
817798 for (i = 0 ; i < ARRAY_SIZE (modes ); i ++ ) {
818- args .arg0 = FIELD_PREP (LWMI_ATTR_DEV_ID_MASK , tunable_attr -> device_id ) |
819- FIELD_PREP (LWMI_ATTR_FEAT_ID_MASK , tunable_attr -> feature_id ) |
820- FIELD_PREP (LWMI_ATTR_MODE_ID_MASK , modes [i ]) |
821- FIELD_PREP (LWMI_ATTR_TYPE_ID_MASK , tunable_attr -> type_id );
799+ args .arg0 = lwmi_attr_id (tunable_attr -> device_id , tunable_attr -> feature_id ,
800+ modes [i ], tunable_attr -> type_id );
822801
823802 ret = lwmi_dev_evaluate_int (priv -> wdev , 0x0 , LWMI_FEATURE_VALUE_GET ,
824803 (unsigned char * )& args , sizeof (args ),
@@ -833,7 +812,10 @@ static bool lwmi_attr_01_is_supported(struct tunable_attr_01 *tunable_attr)
833812 if (!cv_mode_found )
834813 return cv_mode_found ;
835814
836- dev_dbg (tunable_attr -> dev , "cv_mode_id: %#010x, attribute support level: %#010x\n" ,
815+ dev_dbg (tunable_attr -> dev ,
816+ "cd_mode_id: %#010x, cv_mode_id: %#010x, attribute support level: %#010x\n" ,
817+ lwmi_attr_id (tunable_attr -> device_id , tunable_attr -> feature_id ,
818+ tunable_attr -> cd_mode_id , tunable_attr -> type_id ),
837819 args .arg0 , capdata .supported );
838820
839821 return capdata .supported > 0 ? true : false;
0 commit comments