battery: Add the battery hooking API
Subsystems (3)
PATCH v9 1/4 battery: Add the battery hooking API
This is a patch that implements a generic hooking API for the generic ACPI battery driver.
With this new generic API, drivers can expose platform specific behaviour via sysfs attributes in /sys/class/power_supply/BATn/ in a generic way.
A perfect example of the need for this API are Lenovo ThinkPads.
Lenovo ThinkPads have a ACPI extension that allows the setting of start and stop charge thresholds in the EC and battery firmware via ACPI. The thinkpad_acpi module can use this API to expose sysfs attributes that it controls inside the ACPI battery driver sysfs tree, under /sys/class/power_supply/BATN/.
The file drivers/acpi/battery.h has been moved to include/acpi/battery.h and the includes inside ac.c, sbs.c, and battery.c have been adjusted to reflect that.
When drivers hooks into the API, the API calls add_battery() for each battery in the system that passes it a acpi_battery struct. Then, the drivers can use device_create_file() to create new sysfs attributes with that struct and identify the batteries for per-battery attributes.
---
v7:
* Implemented mutual exclusion for hooking methods and battery callbacks
* Fixed a BUG where errors in other modules would occur when the modules that depend on battery get unloaded
v8:
* Use list_for_each_safe instead of list_for_each for the module exit function where deletion of nodes occurs
v9:
* No changes in this patch in v9
--- drivers/acpi/ac.c | 2 +- drivers/acpi/battery.c | 176 ++++++++++++++++++++++++++++++++++++++++++++++++- drivers/acpi/battery.h | 11 ---- drivers/acpi/sbs.c | 2 +- include/acpi/battery.h | 21 ++++++ 5 files changed, 197 insertions(+), 15 deletions(-) delete mode 100644 drivers/acpi/battery.h create mode 100644 include/acpi/battery.h
drivers/acpi/ac.c +1 -1
@@ -33,7 +33,7 @@#include <linux/platform_device.h> #include <linux/power_supply.h> #include <linux/acpi.h> -#include "battery.h" +#include <acpi/battery.h> #define PREFIX "ACPI: "
drivers/acpi/battery.c +174 -2
224 lines not on this page · raw message
drivers/acpi/battery.h deleted +0 -11
@@ -1,11 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __ACPI_BATTERY_H -#define __ACPI_BATTERY_H - -#define ACPI_BATTERY_CLASS "battery" - -#define ACPI_BATTERY_NOTIFY_STATUS 0x80 -#define ACPI_BATTERY_NOTIFY_INFO 0x81 -#define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82 - -#endif
drivers/acpi/sbs.c +1 -1
@@ -32,9 +32,9 @@#include <linux/delay.h> #include <linux/power_supply.h> #include <linux/platform_data/x86/apple.h> +#include <acpi/battery.h> #include "sbshc.h" -#include "battery.h" #define PREFIX "ACPI: "
include/acpi/battery.h new file +21 -0
@@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __ACPI_BATTERY_H +#define __ACPI_BATTERY_H + +#define ACPI_BATTERY_CLASS "battery" + +#define ACPI_BATTERY_NOTIFY_STATUS 0x80 +#define ACPI_BATTERY_NOTIFY_INFO 0x81 +#define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82 + +struct acpi_battery_hook { +const char *name; +int (*add_battery)(struct power_supply *battery); +int (*remove_battery)(struct power_supply *battery); +struct list_head list; +}; + +void battery_hook_register (struct acpi_battery_hook *hook); +void battery_hook_unregister (struct acpi_battery_hook *hook); + +#endif
Signature · 1 line
2.7.4