regulator: core: fix debugfs creation regression
authorJohan Hovold <johan+linaro@kernel.org>
Thu, 9 May 2024 13:33:04 +0000 (15:33 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 9 May 2024 15:43:57 +0000 (17:43 +0200)
regulator_get() may sometimes be called more than once for the same
consumer device, something which before commit dbe954d8f163 ("regulator:
core: Avoid debugfs: Directory ...  already present! error") resulted in
errors being logged.

A couple of recent commits broke the handling of such cases so that
attributes are now erroneously created in the debugfs root directory the
second time a regulator is requested and the log is filled with errors
like:

debugfs: File 'uA_load' in directory '/' already present!
debugfs: File 'min_uV' in directory '/' already present!
debugfs: File 'max_uV' in directory '/' already present!
debugfs: File 'constraint_flags' in directory '/' already present!

on any further calls.

Fixes: 2715bb11cfff ("regulator: core: Fix more error checking for debugfs_create_dir()")
Fixes: 08880713ceec ("regulator: core: Streamline debugfs operations")
Cc: stable@vger.kernel.org
Cc: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Link: https://lore.kernel.org/r/20240509133304.8883-1-johan+linaro@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/core.c

index dabac9772741fa64c241ee7f2c6d2d173fc18c7b..2c33653ffdea3e9fe74e7454727bf70c799b09b5 100644 (file)
@@ -1911,19 +1911,24 @@ static struct regulator *create_regulator(struct regulator_dev *rdev,
                }
        }
 
-       if (err != -EEXIST)
+       if (err != -EEXIST) {
                regulator->debugfs = debugfs_create_dir(supply_name, rdev->debugfs);
-       if (IS_ERR(regulator->debugfs))
-               rdev_dbg(rdev, "Failed to create debugfs directory\n");
+               if (IS_ERR(regulator->debugfs)) {
+                       rdev_dbg(rdev, "Failed to create debugfs directory\n");
+                       regulator->debugfs = NULL;
+               }
+       }
 
-       debugfs_create_u32("uA_load", 0444, regulator->debugfs,
-                          &regulator->uA_load);
-       debugfs_create_u32("min_uV", 0444, regulator->debugfs,
-                          &regulator->voltage[PM_SUSPEND_ON].min_uV);
-       debugfs_create_u32("max_uV", 0444, regulator->debugfs,
-                          &regulator->voltage[PM_SUSPEND_ON].max_uV);
-       debugfs_create_file("constraint_flags", 0444, regulator->debugfs,
-                           regulator, &constraint_flags_fops);
+       if (regulator->debugfs) {
+               debugfs_create_u32("uA_load", 0444, regulator->debugfs,
+                                  &regulator->uA_load);
+               debugfs_create_u32("min_uV", 0444, regulator->debugfs,
+                                  &regulator->voltage[PM_SUSPEND_ON].min_uV);
+               debugfs_create_u32("max_uV", 0444, regulator->debugfs,
+                                  &regulator->voltage[PM_SUSPEND_ON].max_uV);
+               debugfs_create_file("constraint_flags", 0444, regulator->debugfs,
+                                   regulator, &constraint_flags_fops);
+       }
 
        /*
         * Check now if the regulator is an always on regulator - if