|
@@ -7,6 +7,8 @@
|
|
|
#include <linux/moduleparam.h>
|
|
|
#include <acpi/acpi_drivers.h>
|
|
|
|
|
|
+#include "internal.h"
|
|
|
+
|
|
|
#define _COMPONENT ACPI_SYSTEM_COMPONENT
|
|
|
ACPI_MODULE_NAME("sysfs");
|
|
|
|
|
@@ -249,6 +251,7 @@ module_param_call(acpica_version, NULL, param_get_acpica_version, NULL, 0444);
|
|
|
static LIST_HEAD(acpi_table_attr_list);
|
|
|
static struct kobject *tables_kobj;
|
|
|
static struct kobject *dynamic_tables_kobj;
|
|
|
+static struct kobject *hotplug_kobj;
|
|
|
|
|
|
struct acpi_table_attr {
|
|
|
struct bin_attribute attr;
|
|
@@ -716,6 +719,67 @@ acpi_show_profile(struct device *dev, struct device_attribute *attr,
|
|
|
static const struct device_attribute pm_profile_attr =
|
|
|
__ATTR(pm_profile, S_IRUGO, acpi_show_profile, NULL);
|
|
|
|
|
|
+static ssize_t hotplug_enabled_show(struct kobject *kobj,
|
|
|
+ struct kobj_attribute *attr, char *buf)
|
|
|
+{
|
|
|
+ struct acpi_hotplug_profile *hotplug = to_acpi_hotplug_profile(kobj);
|
|
|
+
|
|
|
+ return sprintf(buf, "%d\n", hotplug->enabled);
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t hotplug_enabled_store(struct kobject *kobj,
|
|
|
+ struct kobj_attribute *attr,
|
|
|
+ const char *buf, size_t size)
|
|
|
+{
|
|
|
+ struct acpi_hotplug_profile *hotplug = to_acpi_hotplug_profile(kobj);
|
|
|
+ unsigned int val;
|
|
|
+
|
|
|
+ if (kstrtouint(buf, 10, &val) || val > 1)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ acpi_scan_hotplug_enabled(hotplug, val);
|
|
|
+ return size;
|
|
|
+}
|
|
|
+
|
|
|
+static struct kobj_attribute hotplug_enabled_attr =
|
|
|
+ __ATTR(enabled, S_IRUGO | S_IWUSR, hotplug_enabled_show,
|
|
|
+ hotplug_enabled_store);
|
|
|
+
|
|
|
+static struct attribute *hotplug_profile_attrs[] = {
|
|
|
+ &hotplug_enabled_attr.attr,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+struct kobj_type acpi_hotplug_profile_ktype = {
|
|
|
+ .sysfs_ops = &kobj_sysfs_ops,
|
|
|
+ .default_attrs = hotplug_profile_attrs,
|
|
|
+};
|
|
|
+
|
|
|
+void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
|
|
|
+ const char *name)
|
|
|
+{
|
|
|
+ int error;
|
|
|
+
|
|
|
+ if (!hotplug_kobj)
|
|
|
+ goto err_out;
|
|
|
+
|
|
|
+ kobject_init(&hotplug->kobj, &acpi_hotplug_profile_ktype);
|
|
|
+ error = kobject_set_name(&hotplug->kobj, "%s", name);
|
|
|
+ if (error)
|
|
|
+ goto err_out;
|
|
|
+
|
|
|
+ hotplug->kobj.parent = hotplug_kobj;
|
|
|
+ error = kobject_add(&hotplug->kobj, hotplug_kobj, NULL);
|
|
|
+ if (error)
|
|
|
+ goto err_out;
|
|
|
+
|
|
|
+ kobject_uevent(&hotplug->kobj, KOBJ_ADD);
|
|
|
+ return;
|
|
|
+
|
|
|
+ err_out:
|
|
|
+ pr_err(PREFIX "Unable to add hotplug profile '%s'\n", name);
|
|
|
+}
|
|
|
+
|
|
|
int __init acpi_sysfs_init(void)
|
|
|
{
|
|
|
int result;
|
|
@@ -723,6 +787,8 @@ int __init acpi_sysfs_init(void)
|
|
|
result = acpi_tables_sysfs_init();
|
|
|
if (result)
|
|
|
return result;
|
|
|
+
|
|
|
+ hotplug_kobj = kobject_create_and_add("hotplug", acpi_kobj);
|
|
|
result = sysfs_create_file(acpi_kobj, &pm_profile_attr.attr);
|
|
|
return result;
|
|
|
}
|