]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mfd: adp5585: Only add devices given in FW
authorNuno Sá <nuno.sa@analog.com>
Tue, 1 Jul 2025 14:31:57 +0000 (15:31 +0100)
committerLee Jones <lee@kernel.org>
Tue, 1 Jul 2025 20:50:50 +0000 (21:50 +0100)
Not all devices (features) of the adp5585 device are mandatory to be
used in all platforms. Hence, check what's given in FW and dynamically
create the mfd_cell array to be given to devm_mfd_add_devices().

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20250701-dev-adp5589-fw-v7-2-b1fcfe9e9826@analog.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/mfd/adp5585.c

index 160e0b38106a6d78f7d4b7c866cb603d96ea673e..53a46734f2d022ec54b3efc2ebbf389357f8d85a 100644 (file)
 #include <linux/regmap.h>
 #include <linux/types.h>
 
-static const struct mfd_cell adp5585_devs[] = {
+enum {
+       ADP5585_DEV_GPIO,
+       ADP5585_DEV_PWM,
+       ADP5585_DEV_MAX
+};
+
+static const struct mfd_cell adp5585_devs[ADP5585_DEV_MAX] = {
        { .name = "adp5585-gpio", },
        { .name = "adp5585-pwm", },
 };
@@ -110,6 +116,27 @@ static const struct regmap_config adp5585_regmap_configs[] = {
        },
 };
 
+static int adp5585_add_devices(struct device *dev)
+{
+       int ret;
+
+       if (device_property_present(dev, "#pwm-cells")) {
+               ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO,
+                                          &adp5585_devs[ADP5585_DEV_PWM], 1, NULL, 0, NULL);
+               if (ret)
+                       return dev_err_probe(dev, ret, "Failed to add PWM device\n");
+       }
+
+       if (device_property_present(dev, "#gpio-cells")) {
+               ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO,
+                                          &adp5585_devs[ADP5585_DEV_GPIO], 1, NULL, 0, NULL);
+               if (ret)
+                       return dev_err_probe(dev, ret, "Failed to add GPIO device\n");
+       }
+
+       return 0;
+}
+
 static int adp5585_i2c_probe(struct i2c_client *i2c)
 {
        const struct regmap_config *regmap_config;
@@ -138,14 +165,7 @@ static int adp5585_i2c_probe(struct i2c_client *i2c)
                return dev_err_probe(&i2c->dev, -ENODEV,
                                     "Invalid device ID 0x%02x\n", id);
 
-       ret = devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_AUTO,
-                                  adp5585_devs, ARRAY_SIZE(adp5585_devs),
-                                  NULL, 0, NULL);
-       if (ret)
-               return dev_err_probe(&i2c->dev, ret,
-                                    "Failed to add child devices\n");
-
-       return 0;
+       return adp5585_add_devices(&i2c->dev);
 }
 
 static int adp5585_suspend(struct device *dev)