lkml.org 
[lkml]   [2021]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 31/45] mfd: axp20x: Use register_simple_power_off_handler()
    Date
    Use 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@gmail.com>
    ---
    drivers/mfd/axp20x.c | 22 +++++++++++-----------
    include/linux/mfd/axp20x.h | 1 +
    2 files changed, 12 insertions(+), 11 deletions(-)

    diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
    index 8161a5dc68e8..db31fdb169e4 100644
    --- a/drivers/mfd/axp20x.c
    +++ b/drivers/mfd/axp20x.c
    @@ -24,6 +24,7 @@
    #include <linux/module.h>
    #include <linux/of_device.h>
    #include <linux/pm_runtime.h>
    +#include <linux/reboot.h>
    #include <linux/regmap.h>
    #include <linux/regulator/consumer.h>

    @@ -823,9 +824,10 @@ static const struct mfd_cell axp813_cells[] = {
    },
    };

    -static struct axp20x_dev *axp20x_pm_power_off;
    -static void axp20x_power_off(void)
    +static void axp20x_power_off(void *data)
    {
    + struct axp20x_dev *axp20x_pm_power_off = data;
    +
    if (axp20x_pm_power_off->variant == AXP288_ID)
    return;

    @@ -1000,10 +1002,12 @@ int axp20x_device_probe(struct axp20x_dev *axp20x)
    return ret;
    }

    - if (!pm_power_off) {
    - axp20x_pm_power_off = axp20x;
    - pm_power_off = axp20x_power_off;
    - }
    + axp20x->power_handler =
    + register_simple_power_off_handler(axp20x_power_off, axp20x);
    +
    + if (IS_ERR(axp20x->power_handler))
    + dev_err(axp20x->dev, "failed to register power-off handler: %pe",
    + axp20x->power_handler);

    dev_info(axp20x->dev, "AXP20X driver loaded\n");

    @@ -1013,11 +1017,7 @@ EXPORT_SYMBOL(axp20x_device_probe);

    void axp20x_device_remove(struct axp20x_dev *axp20x)
    {
    - if (axp20x == axp20x_pm_power_off) {
    - axp20x_pm_power_off = NULL;
    - pm_power_off = NULL;
    - }
    -
    + unregister_simple_power_off_handler(axp20x->power_handler);
    mfd_remove_devices(axp20x->dev);
    regmap_del_irq_chip(axp20x->irq, axp20x->regmap_irqc);
    }
    diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
    index 9ab0e2fca7ea..49319a0ac369 100644
    --- a/include/linux/mfd/axp20x.h
    +++ b/include/linux/mfd/axp20x.h
    @@ -643,6 +643,7 @@ struct axp20x_dev {
    const struct mfd_cell *cells;
    const struct regmap_config *regmap_cfg;
    const struct regmap_irq_chip *regmap_irq_chip;
    + struct power_handler *power_handler;
    };

    /* generic helper function for reading 9-16 bit wide regs */
    --
    2.33.1
    \
     
     \ /
      Last update: 2021-10-27 23:24    [W:3.263 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site