]> rtime.felk.cvut.cz Git - linux-imx.git/blobdiff - drivers/acpi/sysfs.c
ACPI / hotplug: Use device offline/online for graceful hot-removal
[linux-imx.git] / drivers / acpi / sysfs.c
index fcae5fa2e1b322481ec2b331c4df0430bff66d53..5c5d1624fa2c261c8b6dca89a34156268a91d799 100644 (file)
@@ -780,6 +780,33 @@ void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
        pr_err(PREFIX "Unable to add hotplug profile '%s'\n", name);
 }
 
+static ssize_t force_remove_show(struct kobject *kobj,
+                                struct kobj_attribute *attr, char *buf)
+{
+       return sprintf(buf, "%d\n", !!acpi_force_hot_remove);
+}
+
+static ssize_t force_remove_store(struct kobject *kobj,
+                                 struct kobj_attribute *attr,
+                                 const char *buf, size_t size)
+{
+       bool val;
+       int ret;
+
+       ret = strtobool(buf, &val);
+       if (ret < 0)
+               return ret;
+
+       lock_device_hotplug();
+       acpi_force_hot_remove = val;
+       unlock_device_hotplug();
+       return size;
+}
+
+static const struct kobj_attribute force_remove_attr =
+       __ATTR(force_remove, S_IRUGO | S_IWUSR, force_remove_show,
+              force_remove_store);
+
 int __init acpi_sysfs_init(void)
 {
        int result;
@@ -789,6 +816,10 @@ int __init acpi_sysfs_init(void)
                return result;
 
        hotplug_kobj = kobject_create_and_add("hotplug", acpi_kobj);
+       result = sysfs_create_file(hotplug_kobj, &force_remove_attr.attr);
+       if (result)
+               return result;
+
        result = sysfs_create_file(acpi_kobj, &pm_profile_attr.attr);
        return result;
 }