]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
regulator: pca9450: Use devm_register_sys_off_handler
authorPeng Fan <peng.fan@nxp.com>
Fri, 15 Aug 2025 04:52:09 +0000 (12:52 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 18 Aug 2025 12:09:51 +0000 (13:09 +0100)
With module test, there is error dump:
------------[ cut here ]------------
  notifier callback pca9450_i2c_restart_handler already registered
  WARNING: kernel/notifier.c:23 at notifier_chain_register+0x5c/0x88,
  CPU#0: kworker/u16:3/50
  Call trace:
  notifier_chain_register+0x5c/0x88 (P)
  atomic_notifier_chain_register+0x30/0x58
  register_restart_handler+0x1c/0x28
  pca9450_i2c_probe+0x418/0x538
  i2c_device_probe+0x220/0x3d0
  really_probe+0x114/0x410
  __driver_probe_device+0xa0/0x150
  driver_probe_device+0x40/0x114
  __device_attach_driver+0xd4/0x12c

So use devm_register_sys_off_handler to let kernel handle the resource
free to avoid kernel dump.

Fixes: 6157e62b07d9 ("regulator: pca9450: Add restart handler")
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Link: https://patch.msgid.link/20250815-pca9450-v1-1-7748e362dc97@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/pca9450-regulator.c

index feadb21a8f30712b514aa45824e61dde72abb7f7..4be270f4d6c35a37bb26ccf16918ff897146e80f 100644 (file)
@@ -40,7 +40,6 @@ struct pca9450 {
        struct device *dev;
        struct regmap *regmap;
        struct gpio_desc *sd_vsel_gpio;
-       struct notifier_block restart_nb;
        enum pca9450_chip_type type;
        unsigned int rcnt;
        int irq;
@@ -1100,10 +1099,9 @@ static irqreturn_t pca9450_irq_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int pca9450_i2c_restart_handler(struct notifier_block *nb,
-                               unsigned long action, void *data)
+static int pca9450_i2c_restart_handler(struct sys_off_data *data)
 {
-       struct pca9450 *pca9450 = container_of(nb, struct pca9450, restart_nb);
+       struct pca9450 *pca9450 = data->cb_data;
        struct i2c_client *i2c = container_of(pca9450->dev, struct i2c_client, dev);
 
        dev_dbg(&i2c->dev, "Restarting device..\n");
@@ -1261,10 +1259,9 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
        pca9450->sd_vsel_fixed_low =
                of_property_read_bool(ldo5->dev.of_node, "nxp,sd-vsel-fixed-low");
 
-       pca9450->restart_nb.notifier_call = pca9450_i2c_restart_handler;
-       pca9450->restart_nb.priority = PCA9450_RESTART_HANDLER_PRIORITY;
-
-       if (register_restart_handler(&pca9450->restart_nb))
+       if (devm_register_sys_off_handler(&i2c->dev, SYS_OFF_MODE_RESTART,
+                                         PCA9450_RESTART_HANDLER_PRIORITY,
+                                         pca9450_i2c_restart_handler, pca9450))
                dev_warn(&i2c->dev, "Failed to register restart handler\n");
 
        dev_info(&i2c->dev, "%s probed.\n",