Changes in v10:

- Use long for sensor values.
- Remove unrequired linux/hwmon-sysfs.h
- Change code style in error status return.
- Remove unuses wmi.buffer and fix type of source.
This commit is contained in:
ed 2021-10-31 22:21:00 +00:00 committed by Ed Brindley
parent 81e0f57f3c
commit 0f048ae281
1 changed files with 41 additions and 34 deletions

View File

@ -42,6 +42,7 @@
#include <linux/acpi.h>
#include <linux/dmi.h>
#include <linux/hwmon.h>
#include <linux/init.h>
#include <linux/jiffies.h>
#include <linux/kernel.h>
@ -50,9 +51,6 @@
#include <linux/units.h>
#include <linux/wmi.h>
#include <linux/hwmon.h>
#include <linux/hwmon-sysfs.h>
#define ASUSWMI_MONITORING_GUID "466747A0-70EC-11DE-8A39-0800200C9A66"
#define ASUSWMI_METHODID_GET_VALUE 0x52574543 /* RWEC */
#define ASUSWMI_METHODID_UPDATE_BUFFER 0x51574543 /* QWEC */
@ -152,11 +150,10 @@ struct asus_wmi_sensor_info {
char name[ASUS_WMI_MAX_STR_SIZE];
int source;
int type;
u32 cached_value;
long cached_value;
};
struct asus_wmi_wmi_info {
u8 buffer;
unsigned long source_last_updated[3]; /* in jiffies */
int sensor_count;
@ -204,9 +201,10 @@ static int asus_wmi_get_version(u32 *version)
if (!obj)
return -EIO;
err = -EIO;
if (obj->type != ACPI_TYPE_INTEGER)
if (obj->type != ACPI_TYPE_INTEGER) {
err = -EIO;
goto out_free_obj;
}
err = 0;
*version = obj->integer.value;
@ -234,9 +232,10 @@ static int asus_wmi_get_item_count(u32 *count)
if (!obj)
return -EIO;
err = -EIO;
if (obj->type != ACPI_TYPE_INTEGER)
if (obj->type != ACPI_TYPE_INTEGER) {
err = -EIO;
goto out_free_obj;
}
err = 0;
*count = obj->integer.value;
@ -284,45 +283,53 @@ static int asus_wmi_sensor_info(int index, struct asus_wmi_sensor_info *s)
if (!obj)
return -EIO;
err = -EIO;
if (obj->type != ACPI_TYPE_PACKAGE)
if (obj->type != ACPI_TYPE_PACKAGE) {
err = -EIO;
goto out_free_obj;
}
if (obj->package.count != 5)
if (obj->package.count != 5) {
err = -EIO;
goto out_free_obj;
}
name_obj = obj->package.elements[0];
if (name_obj.type != ACPI_TYPE_STRING)
if (name_obj.type != ACPI_TYPE_STRING) {
err = -EIO;
goto out_free_obj;
}
strncpy(s->name, name_obj.string.pointer, sizeof(s->name) - 1);
data_type_obj = obj->package.elements[1];
if (data_type_obj.type != ACPI_TYPE_INTEGER)
if (data_type_obj.type != ACPI_TYPE_INTEGER) {
err = -EIO;
goto out_free_obj;
}
s->data_type = data_type_obj.integer.value;
location_obj = obj->package.elements[2];
if (location_obj.type != ACPI_TYPE_INTEGER)
if (location_obj.type != ACPI_TYPE_INTEGER) {
err = -EIO;
goto out_free_obj;
}
s->location = location_obj.integer.value;
source_obj = obj->package.elements[3];
if (source_obj.type != ACPI_TYPE_INTEGER)
if (source_obj.type != ACPI_TYPE_INTEGER) {
err = -EIO;
goto out_free_obj;
}
s->source = source_obj.integer.value;
type_obj = obj->package.elements[4];
if (type_obj.type != ACPI_TYPE_INTEGER)
if (type_obj.type != ACPI_TYPE_INTEGER) {
err = -EIO;
goto out_free_obj;
}
err = 0;
s->type = type_obj.integer.value;
@ -332,7 +339,7 @@ out_free_obj:
return err;
}
static int asus_wmi_update_buffer(u8 source)
static int asus_wmi_update_buffer(int source)
{
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
u32 args[] = {source, 0};
@ -340,7 +347,7 @@ static int asus_wmi_update_buffer(u8 source)
return asus_wmi_call_method(ASUSWMI_METHODID_UPDATE_BUFFER, args, &output);
}
static int asus_wmi_get_sensor_value(u8 index, u32 *value)
static int asus_wmi_get_sensor_value(u8 index, long *value)
{
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
u32 args[] = {index, 0};
@ -355,9 +362,10 @@ static int asus_wmi_get_sensor_value(u8 index, u32 *value)
if (!obj)
return -EIO;
err = -EIO;
if (obj->type != ACPI_TYPE_INTEGER)
if (obj->type != ACPI_TYPE_INTEGER) {
err = -EIO;
goto out_free_obj;
}
err = 0;
*value = obj->integer.value;
@ -370,8 +378,8 @@ out_free_obj:
static int asus_wmi_update_values_for_source(u8 source, struct asus_wmi_sensors *sensor_data)
{
struct asus_wmi_sensor_info *sensor;
int value = 0;
int ret = 0;
long value = 0;
int ret;
int i;
for (i = 0; i < sensor_data->wmi.sensor_count; i++) {
@ -409,7 +417,7 @@ static int asus_wmi_get_cached_value_or_update(const struct asus_wmi_sensor_info
struct asus_wmi_sensors *sensor_data,
u32 *value)
{
int ret;
int ret = 0;
mutex_lock(&sensor_data->lock);
@ -418,8 +426,6 @@ static int asus_wmi_get_cached_value_or_update(const struct asus_wmi_sensor_info
if (ret)
goto unlock;
sensor_data->wmi.buffer = sensor->source;
ret = asus_wmi_update_values_for_source(sensor->source, sensor_data);
if (ret)
goto unlock;
@ -448,8 +454,10 @@ static int asus_wmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
sensor = *(sensor_data->wmi.info[type] + channel);
ret = asus_wmi_get_cached_value_or_update(sensor, sensor_data, &value);
if (!ret)
*val = asus_wmi_scale_sensor_value(value, sensor->data_type);
if (ret)
return ret;
*val = asus_wmi_scale_sensor_value(value, sensor->data_type);
return ret;
}
@ -505,7 +513,6 @@ static int asus_wmi_configure_sensor_setup(struct device *dev,
int i, idx;
int err;
sensor_data->wmi.buffer = -1;
temp_sensor = devm_kcalloc(dev, 1, sizeof(*temp_sensor), GFP_KERNEL);
if (!temp_sensor)
return -ENOMEM;