pm: add to_power_supply macro to the API
PATCH v12 2/4 pm: add to_power_supply macro to the API
This patch adds the to_power_supply macro to upcast a device to a power_supply struct.
This is needed because the same piece of code using container_of is used in various other places, so we abstract away such low-level operations via a macro.
---
Notes:
v9:
* Split the pm changes from the thinkpad_acpi patch into its own patch
v10:
* No changes in this patch in v10
v11:
* Fix changelog formatting
v12:
* Fix build issues in ds2781 and ds2780 battery drivers
drivers/power/supply/ds2780_battery.c | 5 ----- drivers/power/supply/ds2781_battery.c | 5 ----- drivers/power/supply/power_supply_core.c | 2 +- include/linux/power_supply.h | 2 ++ 4 files changed, 3 insertions(+), 11 deletions(-)
drivers/power/supply/ds2780_battery.c +0 -5
@@ -56,11 +56,6 @@ to_ds2780_device_info(struct power_supply *psy)return power_supply_get_drvdata (psy); } -static inline struct power_supply *to_power_supply (struct device *dev) -{ -return dev_get_drvdata (dev); -} -static inline int ds2780_battery_io (struct ds2780_device_info *dev_info,char *buf,int addr,size_t count,int io) {
drivers/power/supply/ds2781_battery.c +0 -5
@@ -54,11 +54,6 @@ to_ds2781_device_info(struct power_supply *psy)return power_supply_get_drvdata (psy); } -static inline struct power_supply *to_power_supply (struct device *dev) -{ -return dev_get_drvdata (dev); -} -static inline int ds2781_battery_io (struct ds2781_device_info *dev_info,char *buf,int addr,size_t count,int io) {
drivers/power/supply/power_supply_core.c +1 -1
@@ -668,7 +668,7 @@ EXPORT_SYMBOL_GPL(power_supply_powers);static void power_supply_dev_release (struct device *dev) { - struct power_supply *psy = container_of(dev, struct power_supply, dev); +struct power_supply *psy =to_power_supply (dev);dev_dbg (dev,"%s\n" , __func__);kfree (psy); }
include/linux/power_supply.h +2 -0
@@ -371,6 +371,8 @@ devm_power_supply_register_no_ws(struct device *parent,extern void power_supply_unregister (struct power_supply *psy);extern int power_supply_powers (struct power_supply *psy,struct device *dev); +#define to_power_supply (device) container_of(device, struct power_supply, dev) +extern void *power_supply_get_drvdata (struct power_supply *psy);/* For APM emulation, think legacy userspace. */ extern struct class *power_supply_class;
Signature · 1 line
2.7.4
Andy Shevchenko
Reviewed-by on v12 2/4Quoted 9 lines · Ognjen Galic
This patch adds the
to_power_supplymacro to upcast a device to apower_supplystruct.This is needed because the same piece of code using
container_ofis used in various other places, so we abstract away such low-level operations via a macro.Suggested-by Andy Shevchenko <andriy.shevchenko(a)linux.intel.com>Signed-off-by Ognjen Galic <smclt30p(a)gmail.com>
It took me a while to understand if those private implementations are equivalent to what you introduced.
Looks so sysfs_create_group() adds the attributes to power supply device kobject, thus the struct device pointer in the callback will be power supply child, not the actual hardware which seems correct.
Quoted 83 lines
---
Notes:
v9:
* Split the pm changes from thethinkpad_acpipatch into its own patchv10:
* No changes in this patch in v10v11:
* Fix changelog formattingv12:
* Fix build issues in ds2781 and ds2780 battery driversdrivers/power/supply/ds2780_battery.c | 5 ----- drivers/power/supply/ds2781_battery.c | 5 ----- drivers/power/supply/power_supply_core.c | 2 +- include/linux/power_supply.h | 2 ++ 4 files changed, 3 insertions(+), 11 deletions(-)drivers/power/supply/ds2780_battery.c +0
-5@@ -56,11 +56,6 @@ to_ds2780_device_info(struct power_supply *psy)return power_supply_get_drvdata (psy); } -static inline struct power_supply *to_power_supply (struct device *dev) -{ -return dev_get_drvdata (dev); -} -static inline int ds2780_battery_io (struct ds2780_device_info *dev_info,char *buf,int addr,size_t count,int io) {drivers/power/supply/ds2781_battery.c +0
-5@@ -54,11 +54,6 @@ to_ds2781_device_info(struct power_supply *psy)return power_supply_get_drvdata (psy); } -static inline struct power_supply *to_power_supply (struct device *dev) -{ -return dev_get_drvdata (dev); -} -static inline int ds2781_battery_io (struct ds2781_device_info *dev_info,char *buf,int addr,size_t count,int io) {drivers/power/supply/power_supply_core.c +1
-1@@ -668,7 +668,7 @@ EXPORT_SYMBOL_GPL(power_supply_powers);static void power_supply_dev_release (struct device *dev) { - struct power_supply *psy = container_of(dev, struct power_supply, dev); +struct power_supply *psy =to_power_supply (dev);dev_dbg (dev,"%s\n" , __func__);kfree (psy); }include/linux/power_supply.h +2
-1@@ -371,6 +371,8 @@ devm_power_supply_register_no_ws(struct device *parent,extern void power_supply_unregister (struct power_supply *psy);extern int power_supply_powers (struct power_supply *psy,struct device *dev); +#define to_power_supply (device) container_of(device, struct power_supply, dev) +extern void *power_supply_get_drvdata (struct power_supply *psy);/* For APM emulation, think legacy userspace. */ extern struct class *power_supply_class; --2.7.4
Signature · 2 lines
With Best Regards, Andy Shevchenko