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)
         * 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,
         * 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.
         * 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);
 
 
 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.
        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);
 
 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;
 
        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);
 
 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))
        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);
 
 
 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)
        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;
 
 
 /* ACPI battery hooking */
 
-static int tpacpi_battery_add(struct power_supply *battery)
+static int tpacpi_battery_add(struct power_supply *battery, struct acpi_battery_hook *hook)
 {
        int batteryid = tpacpi_battery_get_id(battery->desc->name);
 
        return 0;
 }
 
-static int tpacpi_battery_remove(struct power_supply *battery)
+static int tpacpi_battery_remove(struct power_supply *battery, struct acpi_battery_hook *hook)
 {
        device_remove_groups(&battery->dev, tpacpi_battery_groups);
        return 0;
 
 
 ATTRIBUTE_GROUPS(toshiba_acpi_battery);
 
-static int toshiba_acpi_battery_add(struct power_supply *battery)
+static int toshiba_acpi_battery_add(struct power_supply *battery, struct acpi_battery_hook *hook)
 {
        if (toshiba_acpi == NULL) {
                pr_err("Init order issue\n");
        return 0;
 }
 
-static int toshiba_acpi_battery_remove(struct power_supply *battery)
+static int toshiba_acpi_battery_remove(struct power_supply *battery, struct acpi_battery_hook *hook)
 {
        device_remove_groups(&battery->dev, toshiba_acpi_battery_groups);
        return 0;
 
 
 struct acpi_battery_hook {
        const char *name;
-       int (*add_battery)(struct power_supply *battery);
-       int (*remove_battery)(struct power_supply *battery);
+       int (*add_battery)(struct power_supply *battery, struct acpi_battery_hook *hook);
+       int (*remove_battery)(struct power_supply *battery, struct acpi_battery_hook *hook);
        struct list_head list;
 };