ACPI: SBS: manage alarm sysfs attribute through psy core
[ Upstream commit 6bad28cfc30988a845fb3f59a99f4b8a4ce8fe95 ] Let the power supply core register the attribute. This ensures that the attribute is created before the device is announced to userspace, avoiding 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:
parent
e1f6d71b42
commit
9747b72212
|
@ -77,7 +77,6 @@ struct acpi_battery {
|
||||||
u16 spec;
|
u16 spec;
|
||||||
u8 id;
|
u8 id;
|
||||||
u8 present:1;
|
u8 present:1;
|
||||||
u8 have_sysfs_alarm:1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define to_acpi_battery(x) power_supply_get_drvdata(x)
|
#define to_acpi_battery(x) power_supply_get_drvdata(x)
|
||||||
|
@ -462,12 +461,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);
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
Driver Interface
|
Driver Interface
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
|
@ -518,7 +523,10 @@ static int acpi_battery_read(struct acpi_battery *battery)
|
||||||
static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
||||||
{
|
{
|
||||||
struct acpi_battery *battery = &sbs->battery[id];
|
struct acpi_battery *battery = &sbs->battery[id];
|
||||||
struct power_supply_config psy_cfg = { .drv_data = battery, };
|
struct power_supply_config psy_cfg = {
|
||||||
|
.drv_data = battery,
|
||||||
|
.attr_grp = acpi_battery_groups,
|
||||||
|
};
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
battery->id = id;
|
battery->id = id;
|
||||||
|
@ -548,10 +556,6 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = device_create_file(&battery->bat->dev, &alarm_attr);
|
|
||||||
if (result)
|
|
||||||
goto end;
|
|
||||||
battery->have_sysfs_alarm = 1;
|
|
||||||
end:
|
end:
|
||||||
pr_info("%s [%s]: Battery Slot [%s] (battery %s)\n",
|
pr_info("%s [%s]: Battery Slot [%s] (battery %s)\n",
|
||||||
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
|
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
|
||||||
|
@ -563,11 +567,8 @@ static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
|
||||||
{
|
{
|
||||||
struct acpi_battery *battery = &sbs->battery[id];
|
struct acpi_battery *battery = &sbs->battery[id];
|
||||||
|
|
||||||
if (battery->bat) {
|
if (battery->bat)
|
||||||
if (battery->have_sysfs_alarm)
|
|
||||||
device_remove_file(&battery->bat->dev, &alarm_attr);
|
|
||||||
power_supply_unregister(battery->bat);
|
power_supply_unregister(battery->bat);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acpi_charger_add(struct acpi_sbs *sbs)
|
static int acpi_charger_add(struct acpi_sbs *sbs)
|
||||||
|
|
Loading…
Reference in New Issue