summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNuno Sá <nuno.sa@analog.com>2025-07-01 15:31:57 +0100
committerLee Jones <lee@kernel.org>2025-07-01 21:50:50 +0100
commit175f199085c1253d2683f583ce32b2e02cd70de1 (patch)
tree877037e54e965f05f33010548d5f68102ccede08
parent09d55a54b466d60a71573c78a99a901410ef73e0 (diff)
mfd: adp5585: Only add devices given in FW
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>
-rw-r--r--drivers/mfd/adp5585.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/drivers/mfd/adp5585.c b/drivers/mfd/adp5585.c
index 160e0b38106a..53a46734f2d0 100644
--- a/drivers/mfd/adp5585.c
+++ b/drivers/mfd/adp5585.c
@@ -17,7 +17,13 @@
#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)