Use devm_register_simple_power_off_handler() that replaces global pm_power_off variable and allows to register multiple power-off handlers. Signed-off-by: Dmitry Osipenko <digetx@xxxxxxxxx> --- drivers/mfd/palmas.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c index f5b3fa973b13..c7d4d48d2fda 100644 --- a/drivers/mfd/palmas.c +++ b/drivers/mfd/palmas.c @@ -14,6 +14,7 @@ #include <linux/i2c.h> #include <linux/interrupt.h> #include <linux/irq.h> +#include <linux/reboot.h> #include <linux/regmap.h> #include <linux/err.h> #include <linux/mfd/core.h> @@ -420,12 +421,12 @@ static void palmas_dt_to_pdata(struct i2c_client *i2c, "ti,system-power-controller"); } -static struct palmas *palmas_dev; -static void palmas_power_off(void) +static void palmas_power_off(void *data) { unsigned int addr; int ret, slave; u8 powerhold_mask; + struct palmas *palmas_dev = data; struct device_node *np = palmas_dev->dev->of_node; if (of_property_read_bool(np, "ti,palmas-override-powerhold")) { @@ -680,12 +681,16 @@ static int palmas_i2c_probe(struct i2c_client *i2c, */ if (node) { ret = devm_of_platform_populate(&i2c->dev); - if (ret < 0) { + if (ret < 0) + goto err_irq; + } + + if (pdata->pm_off) { + ret = devm_register_simple_power_off_handler(&i2c->dev, + palmas_power_off, + palmas); + if (ret) goto err_irq; - } else if (pdata->pm_off && !pm_power_off) { - palmas_dev = palmas; - pm_power_off = palmas_power_off; - } } return ret; @@ -712,11 +717,6 @@ static int palmas_i2c_remove(struct i2c_client *i2c) i2c_unregister_device(palmas->i2c_clients[i]); } - if (palmas == palmas_dev) { - pm_power_off = NULL; - palmas_dev = NULL; - } - return 0; } -- 2.33.1