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>
This commit is contained in:
Nuno Sá
2025-07-01 15:31:57 +01:00
committed by Lee Jones
parent 09d55a54b4
commit 175f199085

View File

@@ -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)