The 'power1_alarm' attribute uses the 'power' and 'cap' in the acpi_power_meter_resource structure. However, these two fields are just updated when user query 'power' and 'cap' attribute, or hardware enforced limit. If user directly query the 'power1_alarm' attribute without queryng above two attributes, driver will use the uninitialized variables to judge. In addition, the 'power1_alarm' attribute needs to update power and cap to show the real state. Signed-off-by: Huisong Li <lihuisong@xxxxxxxxxx> --- drivers/hwmon/acpi_power_meter.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_meter.c index 2f1c9d97ad21..4c3314e35d30 100644 --- a/drivers/hwmon/acpi_power_meter.c +++ b/drivers/hwmon/acpi_power_meter.c @@ -396,6 +396,9 @@ static ssize_t show_val(struct device *dev, struct acpi_device *acpi_dev = to_acpi_device(dev); struct acpi_power_meter_resource *resource = acpi_dev->driver_data; u64 val = 0; + int ret; + + guard(mutex)(&resource->lock); switch (attr->index) { case 0: @@ -423,6 +426,13 @@ static ssize_t show_val(struct device *dev, val = 0; break; case 6: + ret = update_meter(resource); + if (ret) + return ret; + ret = update_cap(resource); + if (ret) + return ret; + if (resource->power > resource->cap) val = 1; else -- 2.22.0