===================================================================
@@ -280,6 +280,7 @@ struct acpi_device {
struct mutex physical_node_lock;
DECLARE_BITMAP(physical_node_id_bitmap, ACPI_MAX_PHYSICAL_NODE);
struct list_head power_dependent;
+ void (*remove)(struct acpi_device *);
};
static inline void *acpi_driver_data(struct acpi_device *d)
===================================================================
@@ -767,6 +767,9 @@ static void acpi_device_unregister(struc
acpi_power_add_remove_device(device, false);
acpi_device_remove_files(device);
+ if (device->remove)
+ device->remove(device);
+
device_unregister(&device->dev);
/*
* Drop the reference counts of all power resources the device depends
===================================================================
@@ -87,6 +87,12 @@ static DEFINE_MUTEX(power_resource_list_
Power Resource Management
-------------------------------------------------------------------------- */
+static inline
+struct acpi_power_resource *to_power_resource(struct acpi_device *device)
+{
+ return container_of(device, struct acpi_power_resource, device);
+}
+
static struct acpi_power_resource *acpi_power_get_context(acpi_handle handle)
{
struct acpi_device *device;
@@ -94,7 +100,7 @@ static struct acpi_power_resource *acpi_
if (acpi_bus_get_device(handle, &device))
return NULL;
- return container_of(device, struct acpi_power_resource, device);
+ return to_power_resource(device);
}
static int acpi_power_resources_list_add(acpi_handle handle,
@@ -679,6 +685,21 @@ static void acpi_release_power_resource(
kfree(resource);
}
+static ssize_t acpi_power_refcount_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf) {
+ struct acpi_power_resource *resource;
+
+ resource = to_power_resource(to_acpi_device(dev));
+ return sprintf(buf, "%u\n", resource->ref_count);
+}
+static DEVICE_ATTR(reference_count, 0444, acpi_power_refcount_show, NULL);
+
+static void acpi_power_sysfs_remove(struct acpi_device *device)
+{
+ device_remove_file(&device->dev, &dev_attr_reference_count);
+}
+
int acpi_add_power_resource(acpi_handle handle)
{
struct acpi_power_resource *resource;
@@ -726,6 +747,9 @@ int acpi_add_power_resource(acpi_handle
if (result)
goto err;
+ if (!device_create_file(&device->dev, &dev_attr_reference_count))
+ device->remove = acpi_power_sysfs_remove;
+
mutex_lock(&power_resource_list_lock);
list_add(&resource->list_node, &acpi_power_resource_list);
mutex_unlock(&power_resource_list_lock);
===================================================================
@@ -0,0 +1,13 @@
+What: /sys/devices/.../reference_count
+Date: January 2012
+Contact: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Description:
+ The /sys/devices/.../reference_count attribute allows user
+ space to retrieve the current number of devices using the ACPI
+ power resource represented by the given device object (whose
+ directory contains that attribute). If the read value is 0,
+ the power resource is currently not in use and therefore it
+ has been turned off.
+
+ This attribute is read-only. It only is present for device
+ objects representing ACPI power resources.