Commit 71c2cc5c authored by Ricardo B. Marliere's avatar Ricardo B. Marliere Committed by Sebastian Reichel

power: supply: core: make power_supply_class constant

Since commit 43a7206b ("driver core: class: make class_register() take
a const *"), the driver core allows for struct class to be in read-only
memory, so move the power_supply_class structure to be declared at build
time placing it into read-only memory, instead of having to be dynamically
allocated at boot time.

Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Suggested-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarRicardo B. Marliere <ricardo@marliere.net>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20240301-class_cleanup-power-v1-1-97e0b7bf9c94@marliere.netSigned-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent 9a451f1b
......@@ -617,7 +617,7 @@ static int ab8500_btemp_get_ext_psy_data(struct device *dev, void *data)
*/
static void ab8500_btemp_external_power_changed(struct power_supply *psy)
{
class_for_each_device(power_supply_class, NULL, psy,
class_for_each_device(&power_supply_class, NULL, psy,
ab8500_btemp_get_ext_psy_data);
}
......
......@@ -1231,7 +1231,7 @@ static void ab8500_chargalg_algorithm(struct ab8500_chargalg *di)
int ret;
/* Collect data from all power_supply class devices */
class_for_each_device(power_supply_class, NULL,
class_for_each_device(&power_supply_class, NULL,
di->chargalg_psy, ab8500_chargalg_get_ext_psy_data);
ab8500_chargalg_end_of_charge(di);
......
......@@ -1949,7 +1949,7 @@ static void ab8500_charger_check_vbat_work(struct work_struct *work)
struct ab8500_charger *di = container_of(work,
struct ab8500_charger, check_vbat_work.work);
class_for_each_device(power_supply_class, NULL,
class_for_each_device(&power_supply_class, NULL,
&di->usb_chg, ab8500_charger_get_ext_psy_data);
/* First run old_vbat is 0. */
......
......@@ -2407,7 +2407,7 @@ static int ab8500_fg_init_hw_registers(struct ab8500_fg *di)
*/
static void ab8500_fg_external_power_changed(struct power_supply *psy)
{
class_for_each_device(power_supply_class, NULL, psy,
class_for_each_device(&power_supply_class, NULL, psy,
ab8500_fg_get_ext_psy_data);
}
......
......@@ -79,7 +79,7 @@ static void find_main_battery(void)
main_battery = NULL;
bp.main = main_battery;
error = class_for_each_device(power_supply_class, NULL, &bp,
error = class_for_each_device(&power_supply_class, NULL, &bp,
__find_main_battery);
if (error) {
main_battery = bp.main;
......
......@@ -26,7 +26,10 @@
#include "samsung-sdi-battery.h"
/* exported for the APM Power driver, APM emulation */
struct class *power_supply_class;
const struct class power_supply_class = {
.name = "power_supply",
.dev_uevent = power_supply_uevent,
};
EXPORT_SYMBOL_GPL(power_supply_class);
static BLOCKING_NOTIFIER_HEAD(power_supply_notifier);
......@@ -97,7 +100,7 @@ static void power_supply_changed_work(struct work_struct *work)
if (likely(psy->changed)) {
psy->changed = false;
spin_unlock_irqrestore(&psy->changed_lock, flags);
class_for_each_device(power_supply_class, NULL, psy,
class_for_each_device(&power_supply_class, NULL, psy,
__power_supply_changed_work);
power_supply_update_leds(psy);
blocking_notifier_call_chain(&power_supply_notifier,
......@@ -191,7 +194,7 @@ static int power_supply_populate_supplied_from(struct power_supply *psy)
{
int error;
error = class_for_each_device(power_supply_class, NULL, psy,
error = class_for_each_device(&power_supply_class, NULL, psy,
__power_supply_populate_supplied_from);
dev_dbg(&psy->dev, "%s %d\n", __func__, error);
......@@ -226,8 +229,8 @@ static int power_supply_find_supply_from_node(struct device_node *supply_node)
* We return 0 if class_for_each_device() returned 1, -EPROBE_DEFER if
* it returned 0, or error as returned by it.
*/
error = class_for_each_device(power_supply_class, NULL, supply_node,
__power_supply_find_supply_from_node);
error = class_for_each_device(&power_supply_class, NULL, supply_node,
__power_supply_find_supply_from_node);
return error ? (error == 1 ? 0 : error) : -EPROBE_DEFER;
}
......@@ -333,7 +336,7 @@ int power_supply_am_i_supplied(struct power_supply *psy)
struct psy_am_i_supplied_data data = { psy, 0 };
int error;
error = class_for_each_device(power_supply_class, NULL, &data,
error = class_for_each_device(&power_supply_class, NULL, &data,
__power_supply_am_i_supplied);
dev_dbg(&psy->dev, "%s count %u err %d\n", __func__, data.count, error);
......@@ -369,7 +372,7 @@ int power_supply_is_system_supplied(void)
int error;
unsigned int count = 0;
error = class_for_each_device(power_supply_class, NULL, &count,
error = class_for_each_device(&power_supply_class, NULL, &count,
__power_supply_is_system_supplied);
/*
......@@ -416,7 +419,7 @@ int power_supply_get_property_from_supplier(struct power_supply *psy,
* This function is not intended for use with a supply with multiple
* suppliers, we simply pick the first supply to report the psp.
*/
ret = class_for_each_device(power_supply_class, NULL, &data,
ret = class_for_each_device(&power_supply_class, NULL, &data,
__power_supply_get_supplier_property);
if (ret < 0)
return ret;
......@@ -462,8 +465,8 @@ static int power_supply_match_device_by_name(struct device *dev, const void *dat
struct power_supply *power_supply_get_by_name(const char *name)
{
struct power_supply *psy = NULL;
struct device *dev = class_find_device(power_supply_class, NULL, name,
power_supply_match_device_by_name);
struct device *dev = class_find_device(&power_supply_class, NULL, name,
power_supply_match_device_by_name);
if (dev) {
psy = dev_get_drvdata(dev);
......@@ -519,8 +522,8 @@ struct power_supply *power_supply_get_by_phandle(struct device_node *np,
if (!power_supply_np)
return ERR_PTR(-ENODEV);
dev = class_find_device(power_supply_class, NULL, power_supply_np,
power_supply_match_device_node);
dev = class_find_device(&power_supply_class, NULL, power_supply_np,
power_supply_match_device_node);
of_node_put(power_supply_np);
......@@ -1373,7 +1376,7 @@ __power_supply_register(struct device *parent,
device_initialize(dev);
dev->class = power_supply_class;
dev->class = &power_supply_class;
dev->type = &power_supply_dev_type;
dev->parent = parent;
dev->release = power_supply_dev_release;
......@@ -1621,12 +1624,12 @@ EXPORT_SYMBOL_GPL(power_supply_get_drvdata);
static int __init power_supply_class_init(void)
{
power_supply_class = class_create("power_supply");
int err;
if (IS_ERR(power_supply_class))
return PTR_ERR(power_supply_class);
err = class_register(&power_supply_class);
if (err)
return err;
power_supply_class->dev_uevent = power_supply_uevent;
power_supply_init_attrs();
return 0;
......@@ -1634,7 +1637,7 @@ static int __init power_supply_class_init(void)
static void __exit power_supply_class_exit(void)
{
class_destroy(power_supply_class);
class_unregister(&power_supply_class);
}
subsys_initcall(power_supply_class_init);
......
......@@ -895,7 +895,7 @@ extern int power_supply_powers(struct power_supply *psy, struct device *dev);
extern void *power_supply_get_drvdata(struct power_supply *psy);
/* For APM emulation, think legacy userspace. */
extern struct class *power_supply_class;
extern const struct class power_supply_class;
static inline bool power_supply_is_amp_property(enum power_supply_property psp)
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment