Commit 175f1990 authored by Nuno Sá's avatar Nuno Sá Committed by Lee Jones
Browse files

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: default avatarNuno Sá <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20250701-dev-adp5589-fw-v7-2-b1fcfe9e9826@analog.com


Signed-off-by: default avatarLee Jones <lee@kernel.org>
parent 09d55a54
Loading
Loading
Loading
Loading
+29 −9
Original line number Diff line number Diff line
@@ -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)