Skip to contentSkip to conversation

pm: add to_power_supply macro to the API

PATCH Superseded Ognjen Galic 2 participants 2 messages Jan 3, 2018

Subsystems (4)

v12 of 13 Superseded Latest is v13 →

lore
Share & tools
lore
#0 lore raw

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
index e5d81b4..370e910 100644
@@ -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
index efe83ef..d1b5a19 100644
@@ -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
index 82f998a..feac7b0 100644
@@ -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
index 79e90b3..f0139b4 100644
@@ -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
Reviewed-by on v12 2/4
#1 lore raw
Quoted 9 lines · Ognjen Galic

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.

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.

Reviewed-by Andy Shevchenko <andy.shevchenko(a)gmail.com>
Quoted 83 lines

---

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
index e5d81b4..370e910 100644
@@ -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
index efe83ef..d1b5a19 100644
@@ -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
index 82f998a..feac7b0 100644
@@ -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
index 79e90b3..f0139b4 100644
@@ -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