platform/x86: hp-wmi: Driver refactoring and cleanups
cover platform/x86: hp-wmi: Driver refactoring and cleanups
From: "Darren Hart (VMware)" <[email protected]>
This series factors out some redundant code, cleans up a number of style issues, modernizes the sysfs usage, and cleans up the return paths. All told, the driver is reduced in size by 37 lines (3.6%).
I do not have an HP laptop, so I'm hoping Carlo can help out with some testing. In particular we need to verify that hotkeys and sysfs continue to work as before.
This series is also available here for convenience:git://git.infradead.org/users/dvhart/linux-platform-drivers-x86.git hp-wmi
Darren Hart (VMware) (9):
platform/x86: hp-wmi: Cleanup local variable declarations platform/x86: hp-wmi: Add bios_args initializer platform/x86: hp-wmi: Standardize enum usage for constants platform/x86: hp-wmi: Refactor redundant HPWMI_READ functions platform/x86: hp-wmi: Cleanup wireless get_(hw|sw)state functions platform/x86: hp-wmi: Refactor dock and tablet state fetchers platform/x86: hp-wmi: Use DEVICE_ATTR_(RO|RW) helper macros platform/x86: hp-wmi: Do not shadow errors in sysfs show functions platform/x86: hp-wmi: Cleanup exit paths
drivers/platform/x86/hp-wmi.c | 385 +++++++++++++++++++----------------------- 1 file changed, 174 insertions(+), 211 deletions(-)
Signature · 1 line
2.9.3
PATCH 1/9 platform/x86: hp-wmi: Cleanup local variable declarations
From: "Darren Hart (VMware)" <[email protected]>
Declare like types on one line. Order declarations in decreasing length where possible.
--- drivers/platform/x86/hp-wmi.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-)
drivers/platform/x86/hp-wmi.c +13 -16
@@ -346,15 +346,14 @@ static const struct rfkill_ops hp_wmi_rfkill_ops = {static bool hp_wmi_get_sw_state (enum hp_wmi_radio r) { +int mask =0x200 << (r *8 );int wireless =0 ; -int mask; +hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , &wireless,sizeof (wireless),sizeof (wireless));/* TBD: Pass error */ - mask =0x200 << (r *8 ); -if (wireless & mask)return false;else
@@ -363,15 +362,14 @@ static bool hp_wmi_get_sw_state(enum hp_wmi_radio r)static bool hp_wmi_get_hw_state (enum hp_wmi_radio r) { +int mask =0x800 << (r *8 );int wireless =0 ; -int mask; +hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , &wireless,sizeof (wireless),sizeof (wireless));/* TBD: Pass error */ - mask =0x800 << (r *8 ); -if (wireless & mask)return false;else
@@ -395,8 +393,8 @@ static const struct rfkill_ops hp_wmi_rfkill2_ops = {static int hp_wmi_rfkill2_refresh (void ) { -int err, i;struct bios_rfkill2_state state; +int err, i; err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,0 , &state,0 ,sizeof (state));
@@ -502,9 +500,9 @@ static ssize_t set_als(struct device *dev, struct device_attribute *attr,static ssize_t set_postcode (struct device *dev,struct device_attribute *attr,const char *buf,size_t count) { +long unsigned int tmp2;int ret;u32 tmp; -long unsigned int tmp2; ret =kstrtoul (buf,10 , &tmp2);if (ret || tmp2 !=1 )
@@ -530,11 +528,11 @@ static DEVICE_ATTR(postcode, S_IRUGO | S_IWUSR, show_postcode, set_postcode);static void hp_wmi_notify (u32 value,void *context) {struct acpi_buffer response = {ACPI_ALLOCATE_BUFFER ,NULL }; -union acpi_object *obj;u32 event_id, event_data; +union acpi_object *obj;int key_code =0 , ret; -u32 *location;acpi_status status; +u32 *location; status =wmi_get_event_data (value, &response);if (status !=AE_OK ) {
@@ -645,8 +643,7 @@ static void hp_wmi_notify(u32 value, void *context)static int __init hp_wmi_input_setup (void ) {acpi_status status; -int err; -int val; +int err, val; hp_wmi_input_dev =input_allocate_device ();if (!hp_wmi_input_dev)
@@ -719,8 +716,7 @@ static void cleanup_sysfs(struct platform_device *device)static int __init hp_wmi_rfkill_setup (struct platform_device *device) { -int err; -int wireless =0 ; +int err, wireless =0 ; err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , &wireless,sizeof (wireless),sizeof (wireless));
@@ -804,8 +800,9 @@ static int __init hp_wmi_rfkill_setup(struct platform_device *device)static int __init hp_wmi_rfkill2_setup (struct platform_device *device) { -int err, i;struct bios_rfkill2_state state; +int err, i; + err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,0 , &state,0 ,sizeof (state));if (err)
@@ -1002,9 +999,9 @@ static struct platform_driver hp_wmi_driver = {static int __init hp_wmi_init (void ) { -int err;int event_capable =wmi_has_guid (HPWMI_EVENT_GUID );int bios_capable =wmi_has_guid (HPWMI_BIOS_GUID ); +int err;if (!bios_capable && !event_capable)return -ENODEV ;
Signature · 1 line
2.9.3
PATCH 2/9 platform/x86: hp-wmi: Add bios_args initializer
In reply to Darren HartFrom: "Darren Hart (VMware)" <[email protected]>
Cleanup the hp_wmi_perform_query function some by providing a bios_args initializer. No functional changes.
--- drivers/platform/x86/hp-wmi.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
drivers/platform/x86/hp-wmi.c +11 -10
@@ -93,6 +93,13 @@ struct bios_args {u32 data; }; +#define BIOS_ARGS_INIT (write, ctype, size) \ + (struct bios_args) { .signature = 0x55434553, \ + .command = (write) ? 0x2 : 0x1, \ + .commandtype = (ctype), \ + .datasize = (size), \ + .data = 0 } +struct bios_return {u32 sigpass;u32 return_code;
@@ -190,18 +197,12 @@ static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES];static int hp_wmi_perform_query (int query,int write,void *buffer,int insize,int outsize) { -struct bios_return *bios_return; -int actual_outsize; -union acpi_object *obj; -struct bios_args args = { - .signature =0x55434553 , - .command = write ?0x2 :0x1 , - .commandtype = query, - .datasize = insize, - .data =0 , - }; +struct bios_args args =BIOS_ARGS_INIT (write, query, insize);struct acpi_buffer input = {sizeof (struct bios_args ), &args };struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER ,NULL }; +struct bios_return *bios_return; +union acpi_object *obj; +int actual_outsize;u32 rc;if (WARN_ON (insize >sizeof (args.data)))
Signature · 1 line
2.9.3
Re: [PATCH 2/9] platform/x86: hp-wmi: Add bios_args initializer
Quoted 4 lines · Darren Hart
From: "Darren Hart (VMware)" <[email protected]>
Cleanup the
hp_wmi_perform_queryfunction some by providing abios_argsinitializer. No functional changes.
Is it going to be used only once?
If so, I would go with current code.
Quoted 50 lines
Signed-off-by Darren Hart (VMware) <[email protected]>--- drivers/platform/x86/hp-wmi.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)drivers/platform/x86/hp-wmi.c +11
-11@@ -93,6 +93,13 @@ struct bios_args {u32 data; }; +#define BIOS_ARGS_INIT (write, ctype, size) \ + (struct bios_args) { .signature = 0x55434553, \ + .command = (write) ? 0x2 : 0x1, \ + .commandtype = (ctype), \ + .datasize = (size), \ + .data = 0 } +struct bios_return {u32 sigpass;u32 return_code;@@ -190,18 +197,12 @@ static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES];static int hp_wmi_perform_query (int query,int write,void *buffer,int insize,int outsize) { -struct bios_return *bios_return; -int actual_outsize; -union acpi_object *obj; -struct bios_args args = { - .signature =0x55434553 , - .command = write ?0x2 :0x1 , - .commandtype = query, - .datasize = insize, - .data =0 , - }; +struct bios_args args =BIOS_ARGS_INIT (write, query, insize);struct acpi_buffer input = {sizeof (struct bios_args ), &args };struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER ,NULL }; +struct bios_return *bios_return; +union acpi_object *obj; +int actual_outsize;u32 rc;if (WARN_ON (insize >sizeof (args.data))) --2.9.3
Signature · 2 lines
With Best Regards, Andy Shevchenko
PATCH 3/9 platform/x86: hp-wmi: Standardize enum usage for constants
In reply to Darren HartFrom: "Darren Hart (VMware)" <[email protected]>
Use enums consistently throughout the hp-wmi driver for groups of related constants. Use hex and align the assignment within groups. Move the *QUERY constants into an enum, create a new enum defining the READ, WRITE, and ODM constants and use them instead of 0 and 1 at the call sites.
--- drivers/platform/x86/hp-wmi.c | 119 +++++++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 55 deletions(-)
drivers/platform/x86/hp-wmi.c +64 -55
@@ -48,41 +48,29 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");#define HPWMI_EVENT_GUID "95F24279-4D7B-4334-9387-ACCDC67EF61C"#define HPWMI_BIOS_GUID "5FB7F034-2C63-45e9-BE91-3D44E2C707E4" -#define HPWMI_DISPLAY_QUERY 0x1 -#define HPWMI_HDDTEMP_QUERY 0x2 -#define HPWMI_ALS_QUERY 0x3 -#define HPWMI_HARDWARE_QUERY 0x4 -#define HPWMI_WIRELESS_QUERY 0x5 -#define HPWMI_BIOS_QUERY 0x9 -#define HPWMI_FEATURE_QUERY 0xb -#define HPWMI_HOTKEY_QUERY 0xc -#define HPWMI_FEATURE2_QUERY 0xd -#define HPWMI_WIRELESS2_QUERY 0x1b -#define HPWMI_POSTCODEERROR_QUERY 0x2a -enum hp_wmi_radio { -HPWMI_WIFI =0 , -HPWMI_BLUETOOTH =1 , -HPWMI_WWAN =2 , -HPWMI_GPS =3 , +HPWMI_WIFI =0x0 , +HPWMI_BLUETOOTH =0x1 , +HPWMI_WWAN =0x2 , +HPWMI_GPS =0x3 , };enum hp_wmi_event_ids { -HPWMI_DOCK_EVENT =1 , -HPWMI_PARK_HDD =2 , -HPWMI_SMART_ADAPTER =3 , -HPWMI_BEZEL_BUTTON =4 , -HPWMI_WIRELESS =5 , -HPWMI_CPU_BATTERY_THROTTLE =6 , -HPWMI_LOCK_SWITCH =7 , -HPWMI_LID_SWITCH =8 , -HPWMI_SCREEN_ROTATION =9 , -HPWMI_COOLSENSE_SYSTEM_MOBILE =0x0A , -HPWMI_COOLSENSE_SYSTEM_HOT =0x0B , -HPWMI_PROXIMITY_SENSOR =0x0C , -HPWMI_BACKLIT_KB_BRIGHTNESS =0x0D , -HPWMI_PEAKSHIFT_PERIOD =0x0F , -HPWMI_BATTERY_CHARGE_PERIOD =0x10 , +HPWMI_DOCK_EVENT =0x01 , +HPWMI_PARK_HDD =0x02 , +HPWMI_SMART_ADAPTER =0x03 , +HPWMI_BEZEL_BUTTON =0x04 , +HPWMI_WIRELESS =0x05 , +HPWMI_CPU_BATTERY_THROTTLE =0x06 , +HPWMI_LOCK_SWITCH =0x07 , +HPWMI_LID_SWITCH =0x08 , +HPWMI_SCREEN_ROTATION =0x09 , +HPWMI_COOLSENSE_SYSTEM_MOBILE =0x0A , +HPWMI_COOLSENSE_SYSTEM_HOT =0x0B , +HPWMI_PROXIMITY_SENSOR =0x0C , +HPWMI_BACKLIT_KB_BRIGHTNESS =0x0D , +HPWMI_PEAKSHIFT_PERIOD =0x0F , +HPWMI_BATTERY_CHARGE_PERIOD =0x10 , };struct bios_args {
@@ -93,6 +81,27 @@ struct bios_args {u32 data; }; +enum hp_wmi_commandtype { +HPWMI_DISPLAY_QUERY =0x01 , +HPWMI_HDDTEMP_QUERY =0x02 , +HPWMI_ALS_QUERY =0x03 , +HPWMI_HARDWARE_QUERY =0x04 , +HPWMI_WIRELESS_QUERY =0x05 , +HPWMI_BATTERY_QUERY =0x07 , +HPWMI_BIOS_QUERY =0x09 , +HPWMI_FEATURE_QUERY =0x0b , +HPWMI_HOTKEY_QUERY =0x0c , +HPWMI_FEATURE2_QUERY =0x0d , +HPWMI_WIRELESS2_QUERY =0x1b , +HPWMI_POSTCODEERROR_QUERY =0x2a , +}; + +enum hp_wmi_command { +HPWMI_READ =0x00 , +HPWMI_WRITE =0x01 , +HPWMI_ODM =0x03 , +}; +#define BIOS_ARGS_INIT (write, ctype, size) \ (struct bios_args) { .signature = 0x55434553, \ .command = (write) ? 0x2 : 0x1, \
@@ -177,8 +186,8 @@ static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES];/* * hp_wmi_perform_query * -* query: The commandtype -> What should be queried -* write: The command -> 0 read, 1 write, 3 ODM specific +* query: The commandtype (enum hp_wmi_commandtype) +* write: The command (enum hp_wmi_command) * buffer: Buffer used as input and/or output * insize: Size of input buffer * outsize: Size of output buffer
@@ -189,10 +198,10 @@ static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES];* -EINVAL if the output buffer size exceeds buffersize * * Note: The buffersize must at least be the maximum of the input and output -* size. E.g. Battery info query (0x7) is defined to have 1 byte input +* size. E.g. Battery info query is defined to have 1 byte input * and 128 byte output. The caller would do: * buffer = kzalloc(128, GFP_KERNEL); -* ret = hp_wmi_perform_query(0x7, 0, buffer, 1, 128) +* ret = hp_wmi_perform_query(HPWMI_BATTERY_QUERY, HPWMI_READ, buffer, 1, 128) */ static int hp_wmi_perform_query (int query,int write,void *buffer,int insize,int outsize)
@@ -246,7 +255,7 @@ static int hp_wmi_perform_query(int query, int write, void *buffer,static int hp_wmi_display_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_DISPLAY_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_DISPLAY_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -256,7 +265,7 @@ static int hp_wmi_display_state(void)static int hp_wmi_hddtemp_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HDDTEMP_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_HDDTEMP_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -266,7 +275,7 @@ static int hp_wmi_hddtemp_state(void)static int hp_wmi_als_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -276,7 +285,7 @@ static int hp_wmi_als_state(void)static int hp_wmi_dock_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)
@@ -288,7 +297,7 @@ static int hp_wmi_dock_state(void)static int hp_wmi_tablet_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -299,7 +308,7 @@ static int hp_wmi_tablet_state(void)static int __init hp_wmi_bios_2008_later (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_FEATURE_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_FEATURE_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (!ret)return 1 ;
@@ -310,7 +319,7 @@ static int __init hp_wmi_bios_2008_later(void)static int __init hp_wmi_bios_2009_later (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_FEATURE2_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_FEATURE2_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (!ret)return 1 ;
@@ -321,7 +330,7 @@ static int __init hp_wmi_bios_2009_later(void)static int __init hp_wmi_enable_hotkeys (void ) {int value =0x6e ; -int ret =hp_wmi_perform_query (HPWMI_BIOS_QUERY ,1 , &value, +int ret =hp_wmi_perform_query (HPWMI_BIOS_QUERY ,HPWMI_WRITE , &value,sizeof (value),0 );if (ret)return ret <0 ? ret : -EINVAL ;
@@ -334,7 +343,7 @@ static int hp_wmi_set_block(void *data, bool blocked)int query =BIT (r +8 ) | ((!blocked) << r);int ret; - ret =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,1 , + ret =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_WRITE , &query,sizeof (query),0 );if (ret)return ret <0 ? ret : -EINVAL ;
@@ -350,7 +359,7 @@ static bool hp_wmi_get_sw_state(enum hp_wmi_radio r)int mask =0x200 << (r *8 );int wireless =0 ; -hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , +hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless,sizeof (wireless),sizeof (wireless));/* TBD: Pass error */
@@ -366,7 +375,7 @@ static bool hp_wmi_get_hw_state(enum hp_wmi_radio r)int mask =0x800 << (r *8 );int wireless =0 ; -hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , +hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless,sizeof (wireless),sizeof (wireless));/* TBD: Pass error */
@@ -382,7 +391,7 @@ static int hp_wmi_rfkill2_set_block(void *data, bool blocked)int rfkill_id = (int )(long )data;char buffer[4 ] = {0x01 ,0x00 , rfkill_id, !blocked }; -if (hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,1 , +if (hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_WRITE , buffer,sizeof (buffer),0 ))return -EINVAL ;return 0 ;
@@ -397,7 +406,7 @@ static int hp_wmi_rfkill2_refresh(void)struct bios_rfkill2_state state;int err, i; - err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,0 , &state, + err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_READ , &state,0 ,sizeof (state));if (err)return err;
@@ -424,7 +433,7 @@ static int hp_wmi_rfkill2_refresh(void)static int hp_wmi_post_code_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -490,7 +499,7 @@ static ssize_t set_als(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {u32 tmp =simple_strtoul (buf,NULL ,10 ); -int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,1 , &tmp, +int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,HPWMI_WRITE , &tmp,sizeof (tmp),sizeof (tmp));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -511,7 +520,7 @@ static ssize_t set_postcode(struct device *dev, struct device_attribute *attr,/* Clear the POST error code. It is kept until until cleared. */ tmp = (u32 ) tmp2; - ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,1 , &tmp, + ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,HPWMI_WRITE , &tmp,sizeof (tmp),sizeof (tmp));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -584,7 +593,7 @@ static void hp_wmi_notify(u32 value, void *context)case HPWMI_SMART_ADAPTER :break ;case HPWMI_BEZEL_BUTTON : - ret =hp_wmi_perform_query (HPWMI_HOTKEY_QUERY ,0 , + ret =hp_wmi_perform_query (HPWMI_HOTKEY_QUERY ,HPWMI_READ , &key_code,sizeof (key_code),sizeof (key_code));
@@ -719,12 +728,12 @@ static int __init hp_wmi_rfkill_setup(struct platform_device *device) {int err, wireless =0 ; - err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , &wireless, + err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless,sizeof (wireless),sizeof (wireless));if (err)return err; - err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,1 , &wireless, + err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_WRITE , &wireless,sizeof (wireless),0 );if (err)return err;
@@ -804,7 +813,7 @@ static int __init hp_wmi_rfkill2_setup(struct platform_device *device)struct bios_rfkill2_state state;int err, i; - err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,0 , &state, + err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_READ , &state,0 ,sizeof (state));if (err)return err;
Signature · 1 line
2.9.3
Re: [PATCH 3/9] platform/x86: hp-wmi: Standardize enum usage for constants
Quoted 8 lines · Darren Hart
From: "Darren Hart (VMware)" <[email protected]>
Use enums consistently throughout the hp-wmi driver for groups of related constants. Use hex and align the assignment within groups. Move the *QUERY constants into an enum, create a new enum defining the READ, WRITE, and ODM constants and use them instead of 0 and 1 at the call sites.
Looks good to me:
Quoted 302 lines
Signed-off-by Darren Hart (VMware) <[email protected]>--- drivers/platform/x86/hp-wmi.c | 119 +++++++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 55 deletions(-)drivers/platform/x86/hp-wmi.c +64
-56@@ -48,41 +48,29 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");#define HPWMI_EVENT_GUID "95F24279-4D7B-4334-9387-ACCDC67EF61C"#define HPWMI_BIOS_GUID "5FB7F034-2C63-45e9-BE91-3D44E2C707E4" -#define HPWMI_DISPLAY_QUERY 0x1 -#define HPWMI_HDDTEMP_QUERY 0x2 -#define HPWMI_ALS_QUERY 0x3 -#define HPWMI_HARDWARE_QUERY 0x4 -#define HPWMI_WIRELESS_QUERY 0x5 -#define HPWMI_BIOS_QUERY 0x9 -#define HPWMI_FEATURE_QUERY 0xb -#define HPWMI_HOTKEY_QUERY 0xc -#define HPWMI_FEATURE2_QUERY 0xd -#define HPWMI_WIRELESS2_QUERY 0x1b -#define HPWMI_POSTCODEERROR_QUERY 0x2a -enum hp_wmi_radio { -HPWMI_WIFI =0 , -HPWMI_BLUETOOTH =1 , -HPWMI_WWAN =2 , -HPWMI_GPS =3 , +HPWMI_WIFI =0x0 , +HPWMI_BLUETOOTH =0x1 , +HPWMI_WWAN =0x2 , +HPWMI_GPS =0x3 , };enum hp_wmi_event_ids { -HPWMI_DOCK_EVENT =1 , -HPWMI_PARK_HDD =2 , -HPWMI_SMART_ADAPTER =3 , -HPWMI_BEZEL_BUTTON =4 , -HPWMI_WIRELESS =5 , -HPWMI_CPU_BATTERY_THROTTLE =6 , -HPWMI_LOCK_SWITCH =7 , -HPWMI_LID_SWITCH =8 , -HPWMI_SCREEN_ROTATION =9 , -HPWMI_COOLSENSE_SYSTEM_MOBILE =0x0A , -HPWMI_COOLSENSE_SYSTEM_HOT =0x0B , -HPWMI_PROXIMITY_SENSOR =0x0C , -HPWMI_BACKLIT_KB_BRIGHTNESS =0x0D , -HPWMI_PEAKSHIFT_PERIOD =0x0F , -HPWMI_BATTERY_CHARGE_PERIOD =0x10 , +HPWMI_DOCK_EVENT =0x01 , +HPWMI_PARK_HDD =0x02 , +HPWMI_SMART_ADAPTER =0x03 , +HPWMI_BEZEL_BUTTON =0x04 , +HPWMI_WIRELESS =0x05 , +HPWMI_CPU_BATTERY_THROTTLE =0x06 , +HPWMI_LOCK_SWITCH =0x07 , +HPWMI_LID_SWITCH =0x08 , +HPWMI_SCREEN_ROTATION =0x09 , +HPWMI_COOLSENSE_SYSTEM_MOBILE =0x0A , +HPWMI_COOLSENSE_SYSTEM_HOT =0x0B , +HPWMI_PROXIMITY_SENSOR =0x0C , +HPWMI_BACKLIT_KB_BRIGHTNESS =0x0D , +HPWMI_PEAKSHIFT_PERIOD =0x0F , +HPWMI_BATTERY_CHARGE_PERIOD =0x10 , };struct bios_args {@@ -93,6 +81,27 @@ struct bios_args {u32 data; }; +enum hp_wmi_commandtype { +HPWMI_DISPLAY_QUERY =0x01 , +HPWMI_HDDTEMP_QUERY =0x02 , +HPWMI_ALS_QUERY =0x03 , +HPWMI_HARDWARE_QUERY =0x04 , +HPWMI_WIRELESS_QUERY =0x05 , +HPWMI_BATTERY_QUERY =0x07 , +HPWMI_BIOS_QUERY =0x09 , +HPWMI_FEATURE_QUERY =0x0b , +HPWMI_HOTKEY_QUERY =0x0c , +HPWMI_FEATURE2_QUERY =0x0d , +HPWMI_WIRELESS2_QUERY =0x1b , +HPWMI_POSTCODEERROR_QUERY =0x2a , +}; + +enum hp_wmi_command { +HPWMI_READ =0x00 , +HPWMI_WRITE =0x01 , +HPWMI_ODM =0x03 , +}; +#define BIOS_ARGS_INIT (write, ctype, size) \ (struct bios_args) { .signature = 0x55434553, \ .command = (write) ? 0x2 : 0x1, \@@ -177,8 +186,8 @@ static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES];/* * hp_wmi_perform_query * -* query: The commandtype -> What should be queried -* write: The command -> 0 read, 1 write, 3 ODM specific +* query: The commandtype (enum hp_wmi_commandtype) +* write: The command (enum hp_wmi_command) * buffer: Buffer used as input and/or output * insize: Size of input buffer * outsize: Size of output buffer @@ -189,10 +198,10 @@ static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES];* -EINVAL if the output buffer size exceeds buffersize * * Note: The buffersize must at least be the maximum of the input and output -* size. E.g. Battery info query (0x7) is defined to have 1 byte input +* size. E.g. Battery info query is defined to have 1 byte input * and 128 byte output. The caller would do: * buffer = kzalloc(128, GFP_KERNEL); -* ret = hp_wmi_perform_query(0x7, 0, buffer, 1, 128) +* ret = hp_wmi_perform_query(HPWMI_BATTERY_QUERY, HPWMI_READ, buffer, 1, 128) */ static int hp_wmi_perform_query (int query,int write,void *buffer,int insize,int outsize)@@ -246,7 +255,7 @@ static int hp_wmi_perform_query(int query, int write, void *buffer,static int hp_wmi_display_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_DISPLAY_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_DISPLAY_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;@@ -256,7 +265,7 @@ static int hp_wmi_display_state(void)static int hp_wmi_hddtemp_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HDDTEMP_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_HDDTEMP_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;@@ -266,7 +275,7 @@ static int hp_wmi_hddtemp_state(void)static int hp_wmi_als_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;@@ -276,7 +285,7 @@ static int hp_wmi_als_state(void)static int hp_wmi_dock_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)@@ -288,7 +297,7 @@ static int hp_wmi_dock_state(void)static int hp_wmi_tablet_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;@@ -299,7 +308,7 @@ static int hp_wmi_tablet_state(void)static int __init hp_wmi_bios_2008_later (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_FEATURE_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_FEATURE_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (!ret)return 1 ;@@ -310,7 +319,7 @@ static int __init hp_wmi_bios_2008_later(void)static int __init hp_wmi_bios_2009_later (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_FEATURE2_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_FEATURE2_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (!ret)return 1 ;@@ -321,7 +330,7 @@ static int __init hp_wmi_bios_2009_later(void)static int __init hp_wmi_enable_hotkeys (void ) {int value =0x6e ; -int ret =hp_wmi_perform_query (HPWMI_BIOS_QUERY ,1 , &value, +int ret =hp_wmi_perform_query (HPWMI_BIOS_QUERY ,HPWMI_WRITE , &value,sizeof (value),0 );if (ret)return ret <0 ? ret : -EINVAL ;@@ -334,7 +343,7 @@ static int hp_wmi_set_block(void *data, bool blocked)int query =BIT (r +8 ) | ((!blocked) << r);int ret; - ret =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,1 , + ret =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_WRITE , &query,sizeof (query),0 );if (ret)return ret <0 ? ret : -EINVAL ;@@ -350,7 +359,7 @@ static bool hp_wmi_get_sw_state(enum hp_wmi_radio r)int mask =0x200 << (r *8 );int wireless =0 ; -hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , +hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless,sizeof (wireless),sizeof (wireless));/* TBD: Pass error */ @@ -366,7 +375,7 @@ static bool hp_wmi_get_hw_state(enum hp_wmi_radio r)int mask =0x800 << (r *8 );int wireless =0 ; -hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , +hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless,sizeof (wireless),sizeof (wireless));/* TBD: Pass error */ @@ -382,7 +391,7 @@ static int hp_wmi_rfkill2_set_block(void *data, bool blocked)int rfkill_id = (int )(long )data;char buffer[4 ] = {0x01 ,0x00 , rfkill_id, !blocked }; -if (hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,1 , +if (hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_WRITE , buffer,sizeof (buffer),0 ))return -EINVAL ;return 0 ;@@ -397,7 +406,7 @@ static int hp_wmi_rfkill2_refresh(void)struct bios_rfkill2_state state;int err, i; - err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,0 , &state, + err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_READ , &state,0 ,sizeof (state));if (err)return err;@@ -424,7 +433,7 @@ static int hp_wmi_rfkill2_refresh(void)static int hp_wmi_post_code_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;@@ -490,7 +499,7 @@ static ssize_t set_als(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {u32 tmp =simple_strtoul (buf,NULL ,10 ); -int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,1 , &tmp, +int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,HPWMI_WRITE , &tmp,sizeof (tmp),sizeof (tmp));if (ret)return ret <0 ? ret : -EINVAL ;@@ -511,7 +520,7 @@ static ssize_t set_postcode(struct device *dev, struct device_attribute *attr,/* Clear the POST error code. It is kept until until cleared. */ tmp = (u32 ) tmp2; - ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,1 , &tmp, + ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,HPWMI_WRITE , &tmp,sizeof (tmp),sizeof (tmp));if (ret)return ret <0 ? ret : -EINVAL ;@@ -584,7 +593,7 @@ static void hp_wmi_notify(u32 value, void *context)case HPWMI_SMART_ADAPTER :break ;case HPWMI_BEZEL_BUTTON : - ret =hp_wmi_perform_query (HPWMI_HOTKEY_QUERY ,0 , + ret =hp_wmi_perform_query (HPWMI_HOTKEY_QUERY ,HPWMI_READ , &key_code,sizeof (key_code),sizeof (key_code));@@ -719,12 +728,12 @@ static int __init hp_wmi_rfkill_setup(struct platform_device *device) {int err, wireless =0 ; - err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , &wireless, + err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless,sizeof (wireless),sizeof (wireless));if (err)return err; - err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,1 , &wireless, + err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_WRITE , &wireless,sizeof (wireless),0 );if (err)return err;@@ -804,7 +813,7 @@ static int __init hp_wmi_rfkill2_setup(struct platform_device *device)struct bios_rfkill2_state state;int err, i; - err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,0 , &state, + err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_READ , &state,0 ,sizeof (state));if (err)return err; --2.9.3
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [PATCH 3/9] platform/x86: hp-wmi: Standardize enum usage for constants
In reply to Darren HartQuoted 17 lines · Darren Hart
From: "Darren Hart (VMware)" <[email protected]>
Use enums consistently throughout the hp-wmi driver for groups of related constants. Use hex and align the assignment within groups. Move the *QUERY constants into an enum, create a new enum defining the READ, WRITE, and ODM constants and use them instead of 0 and 1 at the call sites.
Signed-off-by Darren Hart (VMware) <[email protected]>--- drivers/platform/x86/hp-wmi.c | 119 +++++++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 55 deletions(-)drivers/platform/x86/hp-wmi.c +0
-0
...
Quoted 10 lines
drivers/platform/x86/hp-wmi.c +6
-0+enum hp_wmi_command { +HPWMI_READ =0x00 , +HPWMI_WRITE =0x01 , +HPWMI_ODM =0x03 , +}; +#define BIOS_ARGS_INIT (write, ctype, size) \ (struct bios_args) { .signature = 0x55434553, \ .command = (write) ? 0x2 : 0x1, \
drivers/platform/x86/hp-wmi.c static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES]; · line 190
Quoted 7 lines
drivers/platform/x86/hp-wmi.c +2
-2@@ -177,8 +186,8 @@ static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES];/* * hp_wmi_perform_query * -* query: The commandtype -> What should be queried -* write: The command -> 0 read, 1 write, 3 ODM specific +* query: The commandtype (enum hp_wmi_commandtype) +* write: The command (enum hp_wmi_command)
Eeek, I failed to use the enum directly and was still using the ternary operator in the BIOS_ARGS_INIT above. Luckily, with read as 0 and write as non-zero in the new ENUMs, and no usage of ODM, things happened to just work. Updated patch below.
I've now:
* dropped the BIOS_ARGS_INIT per Andy's recommendation.
* Renumbered the hp_wmi_command to match the ternary assignment:
HPWMI_READ = 0x01,
HPWMI_WRITE = 0x02,
* Assigned bios_args.command with one of the enums directly
* replaced the "int write" argument with "enum hp_wmi_command command"
As follows:
Queued to testing, please let me know if you have any concerns.
From d8193cff33906e24ac1830ecb2ca95833d058a3a Mon Sep 17 00:00:00 2001
Message-Id: <d8193cff33906e24ac1830ecb2ca95833d058a3a.1492719993.git.dvhart@infradead.org>
From: "Darren Hart (VMware)" <[email protected]>
Date: Wed, 19 Apr 2017 15:42:01 -0700
Subject: [PATCH] platform/x86: hp-wmi: Standardize enum usage for constants
Use enums consistently throughout the hp-wmi driver for groups of related constants. Use hex and align the assignment within groups. Move the *QUERY constants into an enum, create a new enum defining the READ, WRITE, and ODM constants and use them instead of 0 and 1 at the call sites. Set the command directly instead of using the ternary operator since both 1 and 3 as previously documented would result in the command being set to 0x2.
--- drivers/platform/x86/hp-wmi.c | 132 +++++++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 58 deletions(-)
drivers/platform/x86/hp-wmi.c +74 -58
@@ -48,41 +48,29 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");#define HPWMI_EVENT_GUID "95F24279-4D7B-4334-9387-ACCDC67EF61C"#define HPWMI_BIOS_GUID "5FB7F034-2C63-45e9-BE91-3D44E2C707E4" -#define HPWMI_DISPLAY_QUERY 0x1 -#define HPWMI_HDDTEMP_QUERY 0x2 -#define HPWMI_ALS_QUERY 0x3 -#define HPWMI_HARDWARE_QUERY 0x4 -#define HPWMI_WIRELESS_QUERY 0x5 -#define HPWMI_BIOS_QUERY 0x9 -#define HPWMI_FEATURE_QUERY 0xb -#define HPWMI_HOTKEY_QUERY 0xc -#define HPWMI_FEATURE2_QUERY 0xd -#define HPWMI_WIRELESS2_QUERY 0x1b -#define HPWMI_POSTCODEERROR_QUERY 0x2a -enum hp_wmi_radio { -HPWMI_WIFI =0 , -HPWMI_BLUETOOTH =1 , -HPWMI_WWAN =2 , -HPWMI_GPS =3 , +HPWMI_WIFI =0x0 , +HPWMI_BLUETOOTH =0x1 , +HPWMI_WWAN =0x2 , +HPWMI_GPS =0x3 , };enum hp_wmi_event_ids { -HPWMI_DOCK_EVENT =1 , -HPWMI_PARK_HDD =2 , -HPWMI_SMART_ADAPTER =3 , -HPWMI_BEZEL_BUTTON =4 , -HPWMI_WIRELESS =5 , -HPWMI_CPU_BATTERY_THROTTLE =6 , -HPWMI_LOCK_SWITCH =7 , -HPWMI_LID_SWITCH =8 , -HPWMI_SCREEN_ROTATION =9 , -HPWMI_COOLSENSE_SYSTEM_MOBILE =0x0A , -HPWMI_COOLSENSE_SYSTEM_HOT =0x0B , -HPWMI_PROXIMITY_SENSOR =0x0C , -HPWMI_BACKLIT_KB_BRIGHTNESS =0x0D , -HPWMI_PEAKSHIFT_PERIOD =0x0F , -HPWMI_BATTERY_CHARGE_PERIOD =0x10 , +HPWMI_DOCK_EVENT =0x01 , +HPWMI_PARK_HDD =0x02 , +HPWMI_SMART_ADAPTER =0x03 , +HPWMI_BEZEL_BUTTON =0x04 , +HPWMI_WIRELESS =0x05 , +HPWMI_CPU_BATTERY_THROTTLE =0x06 , +HPWMI_LOCK_SWITCH =0x07 , +HPWMI_LID_SWITCH =0x08 , +HPWMI_SCREEN_ROTATION =0x09 , +HPWMI_COOLSENSE_SYSTEM_MOBILE =0x0A , +HPWMI_COOLSENSE_SYSTEM_HOT =0x0B , +HPWMI_PROXIMITY_SENSOR =0x0C , +HPWMI_BACKLIT_KB_BRIGHTNESS =0x0D , +HPWMI_PEAKSHIFT_PERIOD =0x0F , +HPWMI_BATTERY_CHARGE_PERIOD =0x10 , };struct bios_args {
@@ -93,6 +81,34 @@ struct bios_args {u32 data; }; +enum hp_wmi_commandtype { +HPWMI_DISPLAY_QUERY =0x01 , +HPWMI_HDDTEMP_QUERY =0x02 , +HPWMI_ALS_QUERY =0x03 , +HPWMI_HARDWARE_QUERY =0x04 , +HPWMI_WIRELESS_QUERY =0x05 , +HPWMI_BATTERY_QUERY =0x07 , +HPWMI_BIOS_QUERY =0x09 , +HPWMI_FEATURE_QUERY =0x0b , +HPWMI_HOTKEY_QUERY =0x0c , +HPWMI_FEATURE2_QUERY =0x0d , +HPWMI_WIRELESS2_QUERY =0x1b , +HPWMI_POSTCODEERROR_QUERY =0x2a , +}; + +enum hp_wmi_command { +HPWMI_READ =0x01 , +HPWMI_WRITE =0x02 , +HPWMI_ODM =0x03 , +}; + +#define BIOS_ARGS_INIT (write, ctype, size) \ + (struct bios_args) { .signature = 0x55434553, \ + .command = (write) ? 0x2 : 0x1, \ + .commandtype = (ctype), \ + .datasize = (size), \ + .data = 0 } +struct bios_return {u32 sigpass;u32 return_code;
@@ -170,8 +186,8 @@ static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES];/* * hp_wmi_perform_query * -* query: The commandtype -> What should be queried -* write: The command -> 0 read, 1 write, 3 ODM specific +* query: The commandtype (enum hp_wmi_commandtype) +* write: The command (enum hp_wmi_command) * buffer: Buffer used as input and/or output * insize: Size of input buffer * outsize: Size of output buffer
@@ -182,20 +198,20 @@ static struct rfkill2_device rfkill2[HPWMI_MAX_RFKILL2_DEVICES];* -EINVAL if the output buffer size exceeds buffersize * * Note: The buffersize must at least be the maximum of the input and output -* size. E.g. Battery info query (0x7) is defined to have 1 byte input +* size. E.g. Battery info query is defined to have 1 byte input * and 128 byte output. The caller would do: * buffer = kzalloc(128, GFP_KERNEL); -* ret = hp_wmi_perform_query(0x7, 0, buffer, 1, 128) +* ret = hp_wmi_perform_query(HPWMI_BATTERY_QUERY, HPWMI_READ, buffer, 1, 128) */ -static int hp_wmi_perform_query (int query,int write,void *buffer, -int insize,int outsize) +static int hp_wmi_perform_query (int query,enum hp_wmi_command command, +void *buffer,int insize,int outsize) {struct bios_return *bios_return;int actual_outsize;union acpi_object *obj;struct bios_args args = { .signature =0x55434553 , - .command = write ?0x2 :0x1 , + .command = command, .commandtype = query, .datasize = insize, .data =0 ,
@@ -245,7 +261,7 @@ static int hp_wmi_perform_query(int query, int write, void *buffer,static int hp_wmi_display_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_DISPLAY_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_DISPLAY_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -255,7 +271,7 @@ static int hp_wmi_display_state(void)static int hp_wmi_hddtemp_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HDDTEMP_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_HDDTEMP_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -265,7 +281,7 @@ static int hp_wmi_hddtemp_state(void)static int hp_wmi_als_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -275,7 +291,7 @@ static int hp_wmi_als_state(void)static int hp_wmi_dock_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)
@@ -287,7 +303,7 @@ static int hp_wmi_dock_state(void)static int hp_wmi_tablet_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -298,7 +314,7 @@ static int hp_wmi_tablet_state(void)static int __init hp_wmi_bios_2008_later (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_FEATURE_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_FEATURE_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (!ret)return 1 ;
@@ -309,7 +325,7 @@ static int __init hp_wmi_bios_2008_later(void)static int __init hp_wmi_bios_2009_later (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_FEATURE2_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_FEATURE2_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (!ret)return 1 ;
@@ -320,7 +336,7 @@ static int __init hp_wmi_bios_2009_later(void)static int __init hp_wmi_enable_hotkeys (void ) {int value =0x6e ; -int ret =hp_wmi_perform_query (HPWMI_BIOS_QUERY ,1 , &value, +int ret =hp_wmi_perform_query (HPWMI_BIOS_QUERY ,HPWMI_WRITE , &value,sizeof (value),0 );if (ret)return ret <0 ? ret : -EINVAL ;
@@ -333,7 +349,7 @@ static int hp_wmi_set_block(void *data, bool blocked)int query =BIT (r +8 ) | ((!blocked) << r);int ret; - ret =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,1 , + ret =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_WRITE , &query,sizeof (query),0 );if (ret)return ret <0 ? ret : -EINVAL ;
@@ -349,7 +365,7 @@ static bool hp_wmi_get_sw_state(enum hp_wmi_radio r)int mask =0x200 << (r *8 );int wireless =0 ; -hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , +hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless,sizeof (wireless),sizeof (wireless));/* TBD: Pass error */
@@ -365,7 +381,7 @@ static bool hp_wmi_get_hw_state(enum hp_wmi_radio r)int mask =0x800 << (r *8 );int wireless =0 ; -hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , +hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless,sizeof (wireless),sizeof (wireless));/* TBD: Pass error */
@@ -381,7 +397,7 @@ static int hp_wmi_rfkill2_set_block(void *data, bool blocked)int rfkill_id = (int )(long )data;char buffer[4 ] = {0x01 ,0x00 , rfkill_id, !blocked }; -if (hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,1 , +if (hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_WRITE , buffer,sizeof (buffer),0 ))return -EINVAL ;return 0 ;
@@ -396,7 +412,7 @@ static int hp_wmi_rfkill2_refresh(void)struct bios_rfkill2_state state;int err, i; - err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,0 , &state, + err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_READ , &state,0 ,sizeof (state));if (err)return err;
@@ -423,7 +439,7 @@ static int hp_wmi_rfkill2_refresh(void)static int hp_wmi_post_code_state (void ) {int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,0 , &state, +int ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,HPWMI_READ , &state,sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -489,7 +505,7 @@ static ssize_t set_als(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {u32 tmp =simple_strtoul (buf,NULL ,10 ); -int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,1 , &tmp, +int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,HPWMI_WRITE , &tmp,sizeof (tmp),sizeof (tmp));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -510,7 +526,7 @@ static ssize_t set_postcode(struct device *dev, struct device_attribute *attr,/* Clear the POST error code. It is kept until until cleared. */ tmp = (u32 ) tmp2; - ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,1 , &tmp, + ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,HPWMI_WRITE , &tmp,sizeof (tmp),sizeof (tmp));if (ret)return ret <0 ? ret : -EINVAL ;
@@ -583,7 +599,7 @@ static void hp_wmi_notify(u32 value, void *context)case HPWMI_SMART_ADAPTER :break ;case HPWMI_BEZEL_BUTTON : - ret =hp_wmi_perform_query (HPWMI_HOTKEY_QUERY ,0 , + ret =hp_wmi_perform_query (HPWMI_HOTKEY_QUERY ,HPWMI_READ , &key_code,sizeof (key_code),sizeof (key_code));
@@ -718,12 +734,12 @@ static int __init hp_wmi_rfkill_setup(struct platform_device *device) {int err, wireless =0 ; - err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,0 , &wireless, + err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless,sizeof (wireless),sizeof (wireless));if (err)return err; - err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,1 , &wireless, + err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_WRITE , &wireless,sizeof (wireless),0 );if (err)return err;
@@ -803,7 +819,7 @@ static int __init hp_wmi_rfkill2_setup(struct platform_device *device)struct bios_rfkill2_state state;int err, i; - err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,0 , &state, + err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_READ , &state,0 ,sizeof (state));if (err)return err;
Signature · 6 lines
2.9.3 -- Darren Hart VMware Open Source Technology Center
PATCH 4/9 platform/x86: hp-wmi: Refactor redundant HPWMI_READ functions
In reply to Darren HartFrom: "Darren Hart (VMware)" <[email protected]>
Several functions perform the same WMI read int with different query arguments. Refactor this into a single hp_wmi_read_int function.
--- drivers/platform/x86/hp-wmi.c | 82 +++++++++++++------------------------------ 1 file changed, 24 insertions(+), 58 deletions(-)
drivers/platform/x86/hp-wmi.c +24 -58
@@ -252,55 +252,35 @@ static int hp_wmi_perform_query(int query, int write, void *buffer,return 0 ; } -static int hp_wmi_display_state (void ) +static int hp_wmi_read_int (int query) { -int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_DISPLAY_QUERY ,HPWMI_READ , &state, -sizeof (state),sizeof (state)); -if (ret) -return ret <0 ? ret : -EINVAL ; -return state; -} +int val =0 , ret; -static int hp_wmi_hddtemp_state (void ) -{ -int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HDDTEMP_QUERY ,HPWMI_READ , &state, -sizeof (state),sizeof (state)); -if (ret) -return ret <0 ? ret : -EINVAL ; -return state; -} + ret =hp_wmi_perform_query (query,HPWMI_READ , &val, +sizeof (val),sizeof (val)); -static int hp_wmi_als_state (void ) -{ -int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_ALS_QUERY ,HPWMI_READ , &state, -sizeof (state),sizeof (state));if (ret)return ret <0 ? ret : -EINVAL ; -return state; + +return val; }static int hp_wmi_dock_state (void ) { -int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,HPWMI_READ , &state, -sizeof (state),sizeof (state)); +int state =hp_wmi_read_int (HPWMI_HARDWARE_QUERY ); -if (ret) -return ret <0 ? ret : -EINVAL ; +if (state <0 ) +return state;return state &0x1 ; }static int hp_wmi_tablet_state (void ) { -int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_HARDWARE_QUERY ,HPWMI_READ , &state, -sizeof (state),sizeof (state)); -if (ret) -return ret <0 ? ret : -EINVAL ; +int state =hp_wmi_read_int (HPWMI_HARDWARE_QUERY ); + +if (state <0 ) +return state;return (state &0x4 ) ?1 :0 ; }
@@ -430,20 +410,10 @@ static int hp_wmi_rfkill2_refresh(void)return 0 ; } -static int hp_wmi_post_code_state (void ) -{ -int state =0 ; -int ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,HPWMI_READ , &state, -sizeof (state),sizeof (state)); -if (ret) -return ret <0 ? ret : -EINVAL ; -return state; -} -static ssize_t show_display (struct device *dev,struct device_attribute *attr,char *buf) { -int value =hp_wmi_display_state (); +int value =hp_wmi_read_int (HPWMI_DISPLAY_QUERY );if (value <0 )return -EINVAL ;return sprintf (buf,"%d\n" , value);
@@ -452,7 +422,7 @@ static ssize_t show_display(struct device *dev, struct device_attribute *attr,static ssize_t show_hddtemp (struct device *dev,struct device_attribute *attr,char *buf) { -int value =hp_wmi_hddtemp_state (); +int value =hp_wmi_read_int (HPWMI_HDDTEMP_QUERY );if (value <0 )return -EINVAL ;return sprintf (buf,"%d\n" , value);
@@ -461,7 +431,7 @@ static ssize_t show_hddtemp(struct device *dev, struct device_attribute *attr,static ssize_t show_als (struct device *dev,struct device_attribute *attr,char *buf) { -int value =hp_wmi_als_state (); +int value =hp_wmi_read_int (HPWMI_ALS_QUERY );if (value <0 )return -EINVAL ;return sprintf (buf,"%d\n" , value);
@@ -489,7 +459,7 @@ static ssize_t show_postcode(struct device *dev, struct device_attribute *attr, char *buf) {/* Get the POST error code of previous boot failure. */ -int value =hp_wmi_post_code_state (); +int value =hp_wmi_read_int (HPWMI_POSTCODEERROR_QUERY );if (value <0 )return -EINVAL ;return sprintf (buf,"0x%x\n" , value);
@@ -540,9 +510,9 @@ static void hp_wmi_notify(u32 value, void *context)struct acpi_buffer response = {ACPI_ALLOCATE_BUFFER ,NULL };u32 event_id, event_data;union acpi_object *obj; -int key_code =0 , ret;acpi_status status;u32 *location; +int key_code; status =wmi_get_event_data (value, &response);if (status !=AE_OK ) {
@@ -593,11 +563,8 @@ static void hp_wmi_notify(u32 value, void *context)case HPWMI_SMART_ADAPTER :break ;case HPWMI_BEZEL_BUTTON : - ret =hp_wmi_perform_query (HPWMI_HOTKEY_QUERY ,HPWMI_READ , - &key_code, -sizeof (key_code), -sizeof (key_code)); -if (ret) + key_code =hp_wmi_read_int (HPWMI_HOTKEY_QUERY ); +if (key_code <0 )break ; if (!sparse_keymap_report_event(hp_wmi_input_dev,
@@ -726,12 +693,11 @@ static void cleanup_sysfs(struct platform_device *device)static int __init hp_wmi_rfkill_setup (struct platform_device *device) { -int err, wireless =0 ; +int err, wireless; - err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , &wireless, -sizeof (wireless),sizeof (wireless)); -if (err) -return err; + wireless =hp_wmi_read_int (HPWMI_WIRELESS_QUERY ); +if (wireless) +return wireless; err =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_WRITE , &wireless,sizeof (wireless),0 );
Signature · 1 line
2.9.3
PATCH 5/9 platform/x86: hp-wmi: Cleanup wireless get_(hw|sw)state functions
In reply to Darren HartFrom: "Darren Hart (VMware)" <[email protected]>
Use the new hp_wmi_read_int() function and add a WARN_ONCE() to the TBD regarding passing the error through. These are used in a null return function unfortunately.
--- drivers/platform/x86/hp-wmi.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-)
drivers/platform/x86/hp-wmi.c +8 -16
@@ -337,33 +337,25 @@ static const struct rfkill_ops hp_wmi_rfkill_ops = {static bool hp_wmi_get_sw_state (enum hp_wmi_radio r) {int mask =0x200 << (r *8 ); -int wireless =0 ; -hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , - &wireless,sizeof (wireless), -sizeof (wireless)); +int wireless =hp_wmi_read_int (HPWMI_WIRELESS_QUERY ); +/* TBD: Pass error */ +WARN_ONCE (wireless <0 ,"error executing HPWMI_WIRELESS_QUERY" ); -if (wireless & mask) -return false; -else -return true; +return !(wireless & mask); }static bool hp_wmi_get_hw_state (enum hp_wmi_radio r) {int mask =0x800 << (r *8 ); -int wireless =0 ; -hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_READ , - &wireless,sizeof (wireless), -sizeof (wireless)); +int wireless =hp_wmi_read_int (HPWMI_WIRELESS_QUERY ); +/* TBD: Pass error */ +WARN_ONCE (wireless <0 ,"error executing HPWMI_WIRELESS_QUERY" ); -if (wireless & mask) -return false; -else -return true; +return !(wireless & mask); }static int hp_wmi_rfkill2_set_block (void *data,bool blocked)
Signature · 1 line
2.9.3
PATCH 6/9 platform/x86: hp-wmi: Refactor dock and tablet state fetchers
In reply to Darren HartFrom: "Darren Hart (VMware)" <[email protected]>
Both dock and tablet use the HPWMI_HARDWARE_QUERY, but require different masks. Rather than using two functions with magic masks, define the masks, and use a common accessor.
--- drivers/platform/x86/hp-wmi.c | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-)
drivers/platform/x86/hp-wmi.c +14 -19
@@ -102,6 +102,11 @@ enum hp_wmi_command { HPWMI_ODM = 0x03, }; +enum hp_wmi_hardware_mask { +HPWMI_DOCK_MASK =0x01 , +HPWMI_TABLET_MASK =0x04 , +}; +#define BIOS_ARGS_INIT (write, ctype, size) \ (struct bios_args) { .signature = 0x55434553, \ .command = (write) ? 0x2 : 0x1, \
@@ -265,7 +270,7 @@ static int hp_wmi_read_int(int query)return val; } -static int hp_wmi_dock_state (void ) +static int hp_wmi_hw_state (int mask) {int state =hp_wmi_read_int (HPWMI_HARDWARE_QUERY );
@@ -275,16 +280,6 @@ static int hp_wmi_dock_state(void)return state &0x1 ; } -static int hp_wmi_tablet_state (void ) -{ -int state =hp_wmi_read_int (HPWMI_HARDWARE_QUERY ); - -if (state <0 ) -return state; - -return (state &0x4 ) ?1 :0 ; -} -static int __init hp_wmi_bios_2008_later (void ) {int state =0 ;
@@ -432,7 +427,7 @@ static ssize_t show_als(struct device *dev, struct device_attribute *attr,static ssize_t show_dock (struct device *dev,struct device_attribute *attr,char *buf) { -int value =hp_wmi_dock_state (); +int value =hp_wmi_hw_state (HPWMI_DOCK_MASK );if (value <0 )return -EINVAL ;return sprintf (buf,"%d\n" , value);
@@ -441,7 +436,7 @@ static ssize_t show_dock(struct device *dev, struct device_attribute *attr,static ssize_t show_tablet (struct device *dev,struct device_attribute *attr,char *buf) { -int value =hp_wmi_tablet_state (); +int value =hp_wmi_hw_state (HPWMI_TABLET_MASK );if (value <0 )return -EINVAL ;return sprintf (buf,"%d\n" , value);
@@ -544,10 +539,10 @@ static void hp_wmi_notify(u32 value, void *context)case HPWMI_DOCK_EVENT :if (test_bit (SW_DOCK , hp_wmi_input_dev->swbit))input_report_switch (hp_wmi_input_dev,SW_DOCK , -hp_wmi_dock_state ()); +hp_wmi_hw_state (HPWMI_DOCK_MASK ));if (test_bit (SW_TABLET_MODE , hp_wmi_input_dev->swbit))input_report_switch (hp_wmi_input_dev,SW_TABLET_MODE , -hp_wmi_tablet_state ()); +hp_wmi_hw_state (HPWMI_TABLET_MASK ));input_sync (hp_wmi_input_dev);break ;case HPWMI_PARK_HDD :
@@ -625,14 +620,14 @@ static int __init hp_wmi_input_setup(void)__set_bit (EV_SW , hp_wmi_input_dev->evbit);/* Dock */ - val =hp_wmi_dock_state (); + val =hp_wmi_hw_state (HPWMI_DOCK_MASK );if (!(val <0 )) {__set_bit (SW_DOCK , hp_wmi_input_dev->swbit);input_report_switch (hp_wmi_input_dev,SW_DOCK , val); }/* Tablet mode */ - val =hp_wmi_tablet_state (); + val =hp_wmi_hw_state (HPWMI_TABLET_MASK );if (!(val <0 )) {__set_bit (SW_TABLET_MODE , hp_wmi_input_dev->swbit);input_report_switch (hp_wmi_input_dev,SW_TABLET_MODE , val);
@@ -926,10 +921,10 @@ static int hp_wmi_resume_handler(struct device *device)if (hp_wmi_input_dev) {if (test_bit (SW_DOCK , hp_wmi_input_dev->swbit))input_report_switch (hp_wmi_input_dev,SW_DOCK , -hp_wmi_dock_state ()); +hp_wmi_hw_state (HPWMI_DOCK_MASK ));if (test_bit (SW_TABLET_MODE , hp_wmi_input_dev->swbit))input_report_switch (hp_wmi_input_dev,SW_TABLET_MODE , -hp_wmi_tablet_state ()); +hp_wmi_hw_state (HPWMI_TABLET_MASK ));input_sync (hp_wmi_input_dev); }
Signature · 1 line
2.9.3
PATCH 7/9 platform/x86: hp-wmi: Use DEVICE_ATTR_(RO|RW) helper macros
In reply to Darren HartFrom: "Darren Hart (VMware)" <[email protected]>
Use the DEVICE_ATTR_(RO|RW) macros, ranaming the show and store functions accordingly.
--- drivers/platform/x86/hp-wmi.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-)
drivers/platform/x86/hp-wmi.c +18 -18
@@ -397,7 +397,7 @@ static int hp_wmi_rfkill2_refresh(void)return 0 ; } -static ssize_t show_display (struct device *dev,struct device_attribute *attr, +static ssize_t display_show (struct device *dev,struct device_attribute *attr,char *buf) {int value =hp_wmi_read_int (HPWMI_DISPLAY_QUERY );
@@ -406,7 +406,7 @@ static ssize_t show_display(struct device *dev, struct device_attribute *attr,return sprintf (buf,"%d\n" , value); } -static ssize_t show_hddtemp (struct device *dev,struct device_attribute *attr, +static ssize_t hddtemp_show (struct device *dev,struct device_attribute *attr,char *buf) {int value =hp_wmi_read_int (HPWMI_HDDTEMP_QUERY );
@@ -415,7 +415,7 @@ static ssize_t show_hddtemp(struct device *dev, struct device_attribute *attr,return sprintf (buf,"%d\n" , value); } -static ssize_t show_als (struct device *dev,struct device_attribute *attr, +static ssize_t als_show (struct device *dev,struct device_attribute *attr,char *buf) {int value =hp_wmi_read_int (HPWMI_ALS_QUERY );
@@ -424,7 +424,7 @@ static ssize_t show_als(struct device *dev, struct device_attribute *attr,return sprintf (buf,"%d\n" , value); } -static ssize_t show_dock (struct device *dev,struct device_attribute *attr, +static ssize_t dock_show (struct device *dev,struct device_attribute *attr,char *buf) {int value =hp_wmi_hw_state (HPWMI_DOCK_MASK );
@@ -433,8 +433,8 @@ static ssize_t show_dock(struct device *dev, struct device_attribute *attr,return sprintf (buf,"%d\n" , value); } -static ssize_t show_tablet (struct device *dev,struct device_attribute *attr, -char *buf) +static ssize_t tablet_show (struct device *dev,struct device_attribute *attr, +char *buf) {int value =hp_wmi_hw_state (HPWMI_TABLET_MASK );if (value <0 )
@@ -442,8 +442,8 @@ static ssize_t show_tablet(struct device *dev, struct device_attribute *attr,return sprintf (buf,"%d\n" , value); } -static ssize_t show_postcode (struct device *dev,struct device_attribute *attr, -char *buf) +static ssize_t postcode_show (struct device *dev,struct device_attribute *attr, +char *buf) {/* Get the POST error code of previous boot failure. */ int value =hp_wmi_read_int (HPWMI_POSTCODEERROR_QUERY );
@@ -452,8 +452,8 @@ static ssize_t show_postcode(struct device *dev, struct device_attribute *attr,return sprintf (buf,"0x%x\n" , value); } -static ssize_t set_als (struct device *dev,struct device_attribute *attr, -const char *buf,size_t count) +static ssize_t als_store (struct device *dev,struct device_attribute *attr, +const char *buf,size_t count) {u32 tmp =simple_strtoul (buf,NULL ,10 ); int ret = hp_wmi_perform_query(HPWMI_ALS_QUERY, HPWMI_WRITE, &tmp,
@@ -464,8 +464,8 @@ static ssize_t set_als(struct device *dev, struct device_attribute *attr,return count; } -static ssize_t set_postcode (struct device *dev,struct device_attribute *attr, -const char *buf,size_t count) +static ssize_t postcode_store (struct device *dev,struct device_attribute *attr, +const char *buf,size_t count) {long unsigned int tmp2;int ret;
@@ -485,12 +485,12 @@ static ssize_t set_postcode(struct device *dev, struct device_attribute *attr,return count; } -static DEVICE_ATTR(display, S_IRUGO, show_display, NULL); -static DEVICE_ATTR(hddtemp, S_IRUGO, show_hddtemp, NULL); -static DEVICE_ATTR(als, S_IRUGO | S_IWUSR, show_als, set_als); -static DEVICE_ATTR(dock, S_IRUGO, show_dock, NULL); -static DEVICE_ATTR(tablet, S_IRUGO, show_tablet, NULL); -static DEVICE_ATTR(postcode, S_IRUGO | S_IWUSR, show_postcode, set_postcode); +static DEVICE_ATTR_RO (display); +static DEVICE_ATTR_RO (hddtemp); +static DEVICE_ATTR_RW (als); +static DEVICE_ATTR_RO (dock); +static DEVICE_ATTR_RO (tablet); +static DEVICE_ATTR_RW (postcode);static void hp_wmi_notify (u32 value,void *context) {
Signature · 1 line
2.9.3
PATCH 8/9 platform/x86: hp-wmi: Do not shadow errors in sysfs show functions
In reply to Darren HartFrom: "Darren Hart (VMware)" <[email protected]>
The new hp_wmi_read_int function returns a negative value in case of error, pass this on directly rather than always replacing it with -EINVAL.
--- drivers/platform/x86/hp-wmi.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/platform/x86/hp-wmi.c +6 -6
@@ -402,7 +402,7 @@ static ssize_t display_show(struct device *dev, struct device_attribute *attr, {int value =hp_wmi_read_int (HPWMI_DISPLAY_QUERY );if (value <0 ) -return -EINVAL ; +return value;return sprintf (buf,"%d\n" , value); }
@@ -411,7 +411,7 @@ static ssize_t hddtemp_show(struct device *dev, struct device_attribute *attr, {int value =hp_wmi_read_int (HPWMI_HDDTEMP_QUERY );if (value <0 ) -return -EINVAL ; +return value;return sprintf (buf,"%d\n" , value); }
@@ -420,7 +420,7 @@ static ssize_t als_show(struct device *dev, struct device_attribute *attr, {int value =hp_wmi_read_int (HPWMI_ALS_QUERY );if (value <0 ) -return -EINVAL ; +return value;return sprintf (buf,"%d\n" , value); }
@@ -429,7 +429,7 @@ static ssize_t dock_show(struct device *dev, struct device_attribute *attr, {int value =hp_wmi_hw_state (HPWMI_DOCK_MASK );if (value <0 ) -return -EINVAL ; +return value;return sprintf (buf,"%d\n" , value); }
@@ -438,7 +438,7 @@ static ssize_t tablet_show(struct device *dev, struct device_attribute *attr, {int value =hp_wmi_hw_state (HPWMI_TABLET_MASK );if (value <0 ) -return -EINVAL ; +return value;return sprintf (buf,"%d\n" , value); }
@@ -448,7 +448,7 @@ static ssize_t postcode_show(struct device *dev, struct device_attribute *attr,/* Get the POST error code of previous boot failure. */ int value =hp_wmi_read_int (HPWMI_POSTCODEERROR_QUERY );if (value <0 ) -return -EINVAL ; +return value;return sprintf (buf,"0x%x\n" , value); }
Signature · 1 line
2.9.3
PATCH 9/9 platform/x86: hp-wmi: Cleanup exit paths
In reply to Darren HartFrom: "Darren Hart (VMware)" <[email protected]>
Several exit paths were more complex than they needed to be. Remove superfluous conditionals, use labels common cleanup, do not shadow negative error codes.
--- drivers/platform/x86/hp-wmi.c | 63 ++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 30 deletions(-)
drivers/platform/x86/hp-wmi.c +33 -30
@@ -217,7 +217,7 @@ static int hp_wmi_perform_query(int query, int write, void *buffer,struct bios_return *bios_return;union acpi_object *obj;int actual_outsize; -u32 rc; +int ret =0 ;if (WARN_ON (insize >sizeof (args.data)))return -EINVAL ;
@@ -229,32 +229,32 @@ static int hp_wmi_perform_query(int query, int write, void *buffer,if (!obj)return -EINVAL ; -else if (obj->type !=ACPI_TYPE_BUFFER ) { -kfree (obj); -return -EINVAL ; + +if (obj->type !=ACPI_TYPE_BUFFER ) { + ret = -EINVAL ; + goto out_free; } bios_return = (struct bios_return *)obj->buffer.pointer; - rc = bios_return->return_code; + ret = bios_return->return_code; -if (rc) { -if (rc !=HPWMI_RET_UNKNOWN_CMDTYPE ) -pr_warn ("query 0x%x returned error 0x%x\n" , query, rc); -kfree (obj); -return rc; +if (ret) { +if (ret !=HPWMI_RET_UNKNOWN_CMDTYPE ) +pr_warn ("query 0x%x returned error 0x%x\n" , query, ret); + goto out_free; } -if (!outsize) { -/* ignore output data */ -kfree (obj); -return 0 ; - } +/* Ignore output data of zero size */ +if (!outsize) + goto out_free; actual_outsize =min (outsize, (int )(obj->buffer.length -sizeof (*bios_return)));memcpy (buffer, obj->buffer.pointer +sizeof (*bios_return), actual_outsize);memset (buffer + actual_outsize,0 , outsize - actual_outsize); + +out_free:kfree (obj); -return 0 ; +return ret; }static int hp_wmi_read_int (int query)
@@ -307,9 +307,8 @@ static int __init hp_wmi_enable_hotkeys(void)int value =0x6e ;int ret =hp_wmi_perform_query (HPWMI_BIOS_QUERY ,HPWMI_WRITE , &value,sizeof (value),0 ); -if (ret) -return ret <0 ? ret : -EINVAL ; -return 0 ; + +return ret <=0 ? ret : -EINVAL ; }static int hp_wmi_set_block (void *data,bool blocked)
@@ -320,9 +319,8 @@ static int hp_wmi_set_block(void *data, bool blocked) ret =hp_wmi_perform_query (HPWMI_WIRELESS_QUERY ,HPWMI_WRITE , &query,sizeof (query),0 ); -if (ret) -return ret <0 ? ret : -EINVAL ; -return 0 ; + +return ret <=0 ? ret : -EINVAL ; }static const struct rfkill_ops hp_wmi_rfkill_ops = {
@@ -357,11 +355,12 @@ static int hp_wmi_rfkill2_set_block(void *data, bool blocked) {int rfkill_id = (int )(long )data;char buffer[4 ] = {0x01 ,0x00 , rfkill_id, !blocked }; +int ret; -if (hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_WRITE , - buffer,sizeof (buffer),0 )) -return -EINVAL ; -return 0 ; + ret =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_WRITE , + buffer,sizeof (buffer),0 ); + +return ret <=0 ? ret : -EINVAL ; }static const struct rfkill_ops hp_wmi_rfkill2_ops = {
@@ -472,13 +471,17 @@ static ssize_t postcode_store(struct device *dev, struct device_attribute *attr,u32 tmp; ret =kstrtoul (buf,10 , &tmp2); -if (ret || tmp2 !=1 ) -return -EINVAL ; +if (!ret && tmp2 !=1 ) + ret = -EINVAL ; +if (ret) + goto out;/* Clear the POST error code. It is kept until until cleared. */ tmp = (u32 ) tmp2; ret =hp_wmi_perform_query (HPWMI_POSTCODEERROR_QUERY ,HPWMI_WRITE , &tmp,sizeof (tmp),sizeof (tmp)); + +out:if (ret)return ret <0 ? ret : -EINVAL ;
@@ -683,7 +686,7 @@ static int __init hp_wmi_rfkill_setup(struct platform_device *device)int err, wireless; wireless =hp_wmi_read_int (HPWMI_WIRELESS_QUERY ); -if (wireless) +if (wireless <0 )return wireless; err = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, HPWMI_WRITE, &wireless,
@@ -769,7 +772,7 @@ static int __init hp_wmi_rfkill2_setup(struct platform_device *device) err =hp_wmi_perform_query (HPWMI_WIRELESS2_QUERY ,HPWMI_READ , &state,0 ,sizeof (state));if (err) -return err; +return err <0 ? err : -EINVAL ;if (state.count >HPWMI_MAX_RFKILL2_DEVICES ) {pr_warn ("unable to parse 0x1b query output\n" );
Signature · 1 line
2.9.3
Quoted 10 lines · Darren Hart
From: "Darren Hart (VMware)" <[email protected]>
This series factors out some redundant code, cleans up a number of style issues, modernizes the sysfs usage, and cleans up the return paths. All told, the driver is reduced in size by 37 lines (3.6%).
I do not have an HP laptop, so I'm hoping Carlo can help out with some testing. In particular we need to verify that hotkeys and sysfs continue to work as before.
Series looks good to me except patch 2. So,
with above exception.
Quoted 21 lines
This series is also available here for convenience:
git://git.infradead.org/users/dvhart/linux-platform-drivers-x86.githp-wmiDarren Hart (VMware) (9):
platform/x86: hp-wmi: Cleanup local variable declarations platform/x86: hp-wmi: Addbios_argsinitializer platform/x86: hp-wmi: Standardize enum usage for constants platform/x86: hp-wmi: Refactor redundantHPWMI_READfunctions platform/x86: hp-wmi: Cleanup wireless get_(hw|sw)state functions platform/x86: hp-wmi: Refactor dock and tablet state fetchers platform/x86: hp-wmi: UseDEVICE_ATTR_(RO|RW)helper macros platform/x86: hp-wmi: Do not shadow errors in sysfs show functions platform/x86: hp-wmi: Cleanup exit pathsdrivers/platform/x86/hp-wmi.c | 385 +++++++++++++++++++----------------------- 1 file changed, 174 insertions(+), 211 deletions(-)--
2.9.3
Signature · 2 lines
With Best Regards, Andy Shevchenko
Quoted 12 lines · Andy Shevchenko
Quoted 10 lines · Darren Hart
From: "Darren Hart (VMware)" <[email protected]>
This series factors out some redundant code, cleans up a number of style issues, modernizes the sysfs usage, and cleans up the return paths. All told, the driver is reduced in size by 37 lines (3.6%).
I do not have an HP laptop, so I'm hoping Carlo can help out with some testing. In particular we need to verify that hotkeys and sysfs continue to work as before.
Quoted 5 lines
Series looks good to me except patch 2. So,
Reviewed-by Andy Shevchenko <[email protected]>with above exception.
I was on the fence with this one, which is why I separated it out. I'll drop it. Thanks for the review.
Signature · 2 lines
Darren Hart VMware Open Source Technology Center
Quoted 10 lines · Darren Hart
From: "Darren Hart (VMware)" <[email protected]>
This series factors out some redundant code, cleans up a number of style issues, modernizes the sysfs usage, and cleans up the return paths. All told, the driver is reduced in size by 37 lines (3.6%).
I do not have an HP laptop, so I'm hoping Carlo can help out with some testing. In particular we need to verify that hotkeys and sysfs continue to work as before.
On my HP 240 G5:
Cheers,
Signature · 1 line
Carlo Caione