mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
ACPI: battery: create alarm sysfs attribute atomically
[ Upstream commit a231eed10ed5a290129fda36ad7bcc263c53ff7d ] Let the power supply core register the attribute. This ensures that the attribute is created before the device is announced to userspace, avoid a race condition. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a99d8d04ce
commit
b33ff4e7ad
@@ -667,12 +667,18 @@ static ssize_t acpi_battery_alarm_store(struct device *dev,
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct device_attribute alarm_attr = {
|
static struct device_attribute alarm_attr = {
|
||||||
.attr = {.name = "alarm", .mode = 0644},
|
.attr = {.name = "alarm", .mode = 0644},
|
||||||
.show = acpi_battery_alarm_show,
|
.show = acpi_battery_alarm_show,
|
||||||
.store = acpi_battery_alarm_store,
|
.store = acpi_battery_alarm_store,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct attribute *acpi_battery_attrs[] = {
|
||||||
|
&alarm_attr.attr,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
ATTRIBUTE_GROUPS(acpi_battery);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The Battery Hooking API
|
* The Battery Hooking API
|
||||||
*
|
*
|
||||||
@@ -809,7 +815,10 @@ static void __exit battery_hook_exit(void)
|
|||||||
|
|
||||||
static int sysfs_add_battery(struct acpi_battery *battery)
|
static int sysfs_add_battery(struct acpi_battery *battery)
|
||||||
{
|
{
|
||||||
struct power_supply_config psy_cfg = { .drv_data = battery, };
|
struct power_supply_config psy_cfg = {
|
||||||
|
.drv_data = battery,
|
||||||
|
.attr_grp = acpi_battery_groups,
|
||||||
|
};
|
||||||
bool full_cap_broken = false;
|
bool full_cap_broken = false;
|
||||||
|
|
||||||
if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) &&
|
if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) &&
|
||||||
@@ -854,7 +863,7 @@ static int sysfs_add_battery(struct acpi_battery *battery)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
battery_hook_add_battery(battery);
|
battery_hook_add_battery(battery);
|
||||||
return device_create_file(&battery->bat->dev, &alarm_attr);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sysfs_remove_battery(struct acpi_battery *battery)
|
static void sysfs_remove_battery(struct acpi_battery *battery)
|
||||||
@@ -865,7 +874,6 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
battery_hook_remove_battery(battery);
|
battery_hook_remove_battery(battery);
|
||||||
device_remove_file(&battery->bat->dev, &alarm_attr);
|
|
||||||
power_supply_unregister(battery->bat);
|
power_supply_unregister(battery->bat);
|
||||||
battery->bat = NULL;
|
battery->bat = NULL;
|
||||||
mutex_unlock(&battery->sysfs_lock);
|
mutex_unlock(&battery->sysfs_lock);
|
||||||
|
|||||||
Reference in New Issue
Block a user