Commit 5b442b1a authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'hwmon-for-v5.6-rc3' of...

Merge tag 'hwmon-for-v5.6-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging

Pull hwmon fixes from Guenter Roeck:

 - Fix crash in w83627ehf driver seen with W83627DHG-P

 - Fix lockdep splat in acpi_power_meter driver

 - Fix xdpe12284 documentation Sphinx warnings

* tag 'hwmon-for-v5.6-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
  hwmon: (w83627ehf) Fix crash seen with W83627DHG-P
  hwmon: (acpi_power_meter) Fix lockdep splat
  Documentation/hwmon: fix xdpe12284 Sphinx warnings
parents fea63021 e61d2392
...@@ -24,6 +24,7 @@ This driver implements support for Infineon Multi-phase XDPE122 family ...@@ -24,6 +24,7 @@ This driver implements support for Infineon Multi-phase XDPE122 family
dual loop voltage regulators. dual loop voltage regulators.
The family includes XDPE12284 and XDPE12254 devices. The family includes XDPE12284 and XDPE12254 devices.
The devices from this family complaint with: The devices from this family complaint with:
- Intel VR13 and VR13HC rev 1.3, IMVP8 rev 1.2 and IMPVP9 rev 1.3 DC-DC - Intel VR13 and VR13HC rev 1.3, IMVP8 rev 1.2 and IMPVP9 rev 1.3 DC-DC
converter specification. converter specification.
- Intel SVID rev 1.9. protocol. - Intel SVID rev 1.9. protocol.
......
...@@ -355,7 +355,9 @@ static ssize_t show_str(struct device *dev, ...@@ -355,7 +355,9 @@ static ssize_t show_str(struct device *dev,
struct acpi_device *acpi_dev = to_acpi_device(dev); struct acpi_device *acpi_dev = to_acpi_device(dev);
struct acpi_power_meter_resource *resource = acpi_dev->driver_data; struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
acpi_string val; acpi_string val;
int ret;
mutex_lock(&resource->lock);
switch (attr->index) { switch (attr->index) {
case 0: case 0:
val = resource->model_number; val = resource->model_number;
...@@ -372,8 +374,9 @@ static ssize_t show_str(struct device *dev, ...@@ -372,8 +374,9 @@ static ssize_t show_str(struct device *dev,
val = ""; val = "";
break; break;
} }
ret = sprintf(buf, "%s\n", val);
return sprintf(buf, "%s\n", val); mutex_unlock(&resource->lock);
return ret;
} }
static ssize_t show_val(struct device *dev, static ssize_t show_val(struct device *dev,
...@@ -817,11 +820,12 @@ static void acpi_power_meter_notify(struct acpi_device *device, u32 event) ...@@ -817,11 +820,12 @@ static void acpi_power_meter_notify(struct acpi_device *device, u32 event)
resource = acpi_driver_data(device); resource = acpi_driver_data(device);
mutex_lock(&resource->lock);
switch (event) { switch (event) {
case METER_NOTIFY_CONFIG: case METER_NOTIFY_CONFIG:
mutex_lock(&resource->lock);
free_capabilities(resource); free_capabilities(resource);
res = read_capabilities(resource); res = read_capabilities(resource);
mutex_unlock(&resource->lock);
if (res) if (res)
break; break;
...@@ -830,15 +834,12 @@ static void acpi_power_meter_notify(struct acpi_device *device, u32 event) ...@@ -830,15 +834,12 @@ static void acpi_power_meter_notify(struct acpi_device *device, u32 event)
break; break;
case METER_NOTIFY_TRIP: case METER_NOTIFY_TRIP:
sysfs_notify(&device->dev.kobj, NULL, POWER_AVERAGE_NAME); sysfs_notify(&device->dev.kobj, NULL, POWER_AVERAGE_NAME);
update_meter(resource);
break; break;
case METER_NOTIFY_CAP: case METER_NOTIFY_CAP:
sysfs_notify(&device->dev.kobj, NULL, POWER_CAP_NAME); sysfs_notify(&device->dev.kobj, NULL, POWER_CAP_NAME);
update_cap(resource);
break; break;
case METER_NOTIFY_INTERVAL: case METER_NOTIFY_INTERVAL:
sysfs_notify(&device->dev.kobj, NULL, POWER_AVG_INTERVAL_NAME); sysfs_notify(&device->dev.kobj, NULL, POWER_AVG_INTERVAL_NAME);
update_avg_interval(resource);
break; break;
case METER_NOTIFY_CAPPING: case METER_NOTIFY_CAPPING:
sysfs_notify(&device->dev.kobj, NULL, POWER_ALARM_NAME); sysfs_notify(&device->dev.kobj, NULL, POWER_ALARM_NAME);
...@@ -848,7 +849,6 @@ static void acpi_power_meter_notify(struct acpi_device *device, u32 event) ...@@ -848,7 +849,6 @@ static void acpi_power_meter_notify(struct acpi_device *device, u32 event)
WARN(1, "Unexpected event %d\n", event); WARN(1, "Unexpected event %d\n", event);
break; break;
} }
mutex_unlock(&resource->lock);
acpi_bus_generate_netlink_event(ACPI_POWER_METER_CLASS, acpi_bus_generate_netlink_event(ACPI_POWER_METER_CLASS,
dev_name(&device->dev), event, 0); dev_name(&device->dev), event, 0);
...@@ -912,8 +912,8 @@ static int acpi_power_meter_remove(struct acpi_device *device) ...@@ -912,8 +912,8 @@ static int acpi_power_meter_remove(struct acpi_device *device)
resource = acpi_driver_data(device); resource = acpi_driver_data(device);
hwmon_device_unregister(resource->hwmon_dev); hwmon_device_unregister(resource->hwmon_dev);
free_capabilities(resource);
remove_attrs(resource); remove_attrs(resource);
free_capabilities(resource);
kfree(resource); kfree(resource);
return 0; return 0;
......
...@@ -1346,8 +1346,13 @@ w83627ehf_is_visible(const void *drvdata, enum hwmon_sensor_types type, ...@@ -1346,8 +1346,13 @@ w83627ehf_is_visible(const void *drvdata, enum hwmon_sensor_types type,
/* channel 0.., name 1.. */ /* channel 0.., name 1.. */
if (!(data->have_temp & (1 << channel))) if (!(data->have_temp & (1 << channel)))
return 0; return 0;
if (attr == hwmon_temp_input || attr == hwmon_temp_label) if (attr == hwmon_temp_input)
return 0444; return 0444;
if (attr == hwmon_temp_label) {
if (data->temp_label)
return 0444;
return 0;
}
if (channel == 2 && data->temp3_val_only) if (channel == 2 && data->temp3_val_only)
return 0; return 0;
if (attr == hwmon_temp_max) { if (attr == hwmon_temp_max) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment