Commit 878a82c2 authored by Armin Wolf's avatar Armin Wolf Committed by Hans de Goede
Browse files

ACPI: battery: Pass battery hook pointer to hook callbacks



Right now, is impossible for battery hook callbacks
to access instance-specific data, forcing most drivers
to provide some sort of global state. This however is
difficult for drivers which can be instantiated multiple
times and/or are hotplug-capable.

Pass a pointer to the battery hook to those callbacks
for usage with container_of().

Signed-off-by: default avatarArmin Wolf <W_Armin@gmx.de>
Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20220927204521.601887-2-W_Armin@gmx.de


Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 19c8b524
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -696,7 +696,7 @@ static void __battery_hook_unregister(struct acpi_battery_hook *hook, int lock)
	if (lock)
		mutex_lock(&hook_mutex);
	list_for_each_entry(battery, &acpi_battery_list, list) {
		hook->remove_battery(battery->bat);
		hook->remove_battery(battery->bat, hook);
	}
	list_del(&hook->list);
	if (lock)
@@ -724,7 +724,7 @@ void battery_hook_register(struct acpi_battery_hook *hook)
	 * its attributes.
	 */
	list_for_each_entry(battery, &acpi_battery_list, list) {
		if (hook->add_battery(battery->bat)) {
		if (hook->add_battery(battery->bat, hook)) {
			/*
			 * If a add-battery returns non-zero,
			 * the registration of the extension has failed,
@@ -762,7 +762,7 @@ static void battery_hook_add_battery(struct acpi_battery *battery)
	 * during the battery module initialization.
	 */
	list_for_each_entry_safe(hook_node, tmp, &battery_hook_list, list) {
		if (hook_node->add_battery(battery->bat)) {
		if (hook_node->add_battery(battery->bat, hook_node)) {
			/*
			 * The notification of the extensions has failed, to
			 * prevent further errors we will unload the extension.
@@ -785,7 +785,7 @@ static void battery_hook_remove_battery(struct acpi_battery *battery)
	 * custom attributes from the battery.
	 */
	list_for_each_entry(hook, &battery_hook_list, list) {
		hook->remove_battery(battery->bat);
		hook->remove_battery(battery->bat, hook);
	}
	/* Then, just remove the battery from the list */
	list_del(&battery->list);
+2 −2
Original line number Diff line number Diff line
@@ -883,7 +883,7 @@ static ssize_t charge_control_end_threshold_show(struct device *device,

static DEVICE_ATTR_RW(charge_control_end_threshold);

static int asus_wmi_battery_add(struct power_supply *battery)
static int asus_wmi_battery_add(struct power_supply *battery, struct acpi_battery_hook *hook)
{
	/* The WMI method does not provide a way to specific a battery, so we
	 * just assume it is the first battery.
@@ -910,7 +910,7 @@ static int asus_wmi_battery_add(struct power_supply *battery)
	return 0;
}

static int asus_wmi_battery_remove(struct power_supply *battery)
static int asus_wmi_battery_remove(struct power_supply *battery, struct acpi_battery_hook *hook)
{
	device_remove_file(&battery->dev,
			   &dev_attr_charge_control_end_threshold);
+2 −2
Original line number Diff line number Diff line
@@ -468,7 +468,7 @@ static DEVICE_ATTR_RW(charge_control_start_threshold);
static DEVICE_ATTR_RW(charge_control_end_threshold);
static DEVICE_ATTR_RW(charge_control_thresholds);

static int huawei_wmi_battery_add(struct power_supply *battery)
static int huawei_wmi_battery_add(struct power_supply *battery, struct acpi_battery_hook *hook)
{
	int err = 0;

@@ -483,7 +483,7 @@ static int huawei_wmi_battery_add(struct power_supply *battery)
	return err;
}

static int huawei_wmi_battery_remove(struct power_supply *battery)
static int huawei_wmi_battery_remove(struct power_supply *battery, struct acpi_battery_hook *hook)
{
	device_remove_file(&battery->dev, &dev_attr_charge_control_start_threshold);
	device_remove_file(&battery->dev, &dev_attr_charge_control_end_threshold);
+2 −2
Original line number Diff line number Diff line
@@ -546,7 +546,7 @@ static DEVICE_ATTR_RW(fn_lock);
static DEVICE_ATTR_RW(charge_control_end_threshold);
static DEVICE_ATTR_RW(battery_care_limit);

static int lg_battery_add(struct power_supply *battery)
static int lg_battery_add(struct power_supply *battery, struct acpi_battery_hook *hook)
{
	if (device_create_file(&battery->dev,
			       &dev_attr_charge_control_end_threshold))
@@ -555,7 +555,7 @@ static int lg_battery_add(struct power_supply *battery)
	return 0;
}

static int lg_battery_remove(struct power_supply *battery)
static int lg_battery_remove(struct power_supply *battery, struct acpi_battery_hook *hook)
{
	device_remove_file(&battery->dev,
			   &dev_attr_charge_control_end_threshold);
+2 −2
Original line number Diff line number Diff line
@@ -254,7 +254,7 @@ static struct attribute *system76_battery_attrs[] = {

ATTRIBUTE_GROUPS(system76_battery);

static int system76_battery_add(struct power_supply *battery)
static int system76_battery_add(struct power_supply *battery, struct acpi_battery_hook *hook)
{
	// System76 EC only supports 1 battery
	if (strcmp(battery->desc->name, "BAT0") != 0)
@@ -266,7 +266,7 @@ static int system76_battery_add(struct power_supply *battery)
	return 0;
}

static int system76_battery_remove(struct power_supply *battery)
static int system76_battery_remove(struct power_supply *battery, struct acpi_battery_hook *hook)
{
	device_remove_groups(&battery->dev, system76_battery_groups);
	return 0;
Loading