[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 30/45] mfd: ene-kb3930: Use devm_register_power_handler()



Use devm_register_power_handler() that replaces global pm_power_off
variable and allows to register multiple power-off handlers. It also
provides restart-handler support, i.e. all in one API.

Signed-off-by: Dmitry Osipenko <digetx@xxxxxxxxx>
---
 drivers/mfd/ene-kb3930.c | 45 ++++++++++++++--------------------------
 1 file changed, 15 insertions(+), 30 deletions(-)

diff --git a/drivers/mfd/ene-kb3930.c b/drivers/mfd/ene-kb3930.c
index 1b73318d1f1f..6a3c5f48e5e1 100644
--- a/drivers/mfd/ene-kb3930.c
+++ b/drivers/mfd/ene-kb3930.c
@@ -31,10 +31,9 @@ struct kb3930 {
        struct i2c_client *client;
        struct regmap *ram_regmap;
        struct gpio_descs *off_gpios;
+       struct power_handler power_handler;
 };
 
-static struct kb3930 *kb3930_power_off;
-
 #define EC_GPIO_WAVE           0
 #define EC_GPIO_OFF_MODE       1
 
@@ -60,21 +59,19 @@ static void kb3930_off(struct kb3930 *ddata, int off_mode)
        }
 }
 
-static int kb3930_restart(struct notifier_block *this,
-                         unsigned long mode, void *cmd)
+static void kb3930_restart(struct restart_data *data)
 {
-       kb3930_off(kb3930_power_off, EC_OFF_MODE_REBOOT);
-       return NOTIFY_DONE;
+       struct kb3930 *ddata = data->cb_data;
+
+       kb3930_off(ddata, EC_OFF_MODE_REBOOT);
 }
 
-static void kb3930_pm_power_off(void)
+static void kb3930_power_off(struct power_off_data *data)
 {
-       kb3930_off(kb3930_power_off, EC_OFF_MODE_POWER);
-}
+       struct kb3930 *ddata = data->cb_data;
 
-static struct notifier_block kb3930_restart_nb = {
-       .notifier_call = kb3930_restart,
-};
+       kb3930_off(ddata, EC_OFF_MODE_POWER);
+}
 
 static const struct mfd_cell ariel_ec_cells[] = {
        { .name = "dell-wyse-ariel-led", },
@@ -131,7 +128,6 @@ static int kb3930_probe(struct i2c_client *client)
        if (!ddata)
                return -ENOMEM;
 
-       kb3930_power_off = ddata;
        ddata->client = client;
        i2c_set_clientdata(client, ddata);
 
@@ -169,24 +165,14 @@ static int kb3930_probe(struct i2c_client *client)
        }
 
        if (ddata->off_gpios) {
-               register_restart_handler(&kb3930_restart_nb);
-               if (!pm_power_off)
-                       pm_power_off = kb3930_pm_power_off;
-       }
+               ddata->power_handler.cb_data = ddata;
+               ddata->power_handler.restart_cb = kb3930_restart;
+               ddata->power_handler.power_off_cb = kb3930_power_off;
 
-       return 0;
-}
-
-static int kb3930_remove(struct i2c_client *client)
-{
-       struct kb3930 *ddata = i2c_get_clientdata(client);
-
-       if (ddata->off_gpios) {
-               if (pm_power_off == kb3930_pm_power_off)
-                       pm_power_off = NULL;
-               unregister_restart_handler(&kb3930_restart_nb);
+               ret = devm_register_power_handler(dev, &ddata->power_handler);
+               if (ret)
+                       return ret;
        }
-       kb3930_power_off = NULL;
 
        return 0;
 }
@@ -199,7 +185,6 @@ MODULE_DEVICE_TABLE(of, kb3930_dt_ids);
 
 static struct i2c_driver kb3930_driver = {
        .probe_new = kb3930_probe,
-       .remove = kb3930_remove,
        .driver = {
                .name = "ene-kb3930",
                .of_match_table = kb3930_dt_ids,
-- 
2.33.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.