@@ -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,37 @@ static const struct regmap_config adp5585_regmap_configs[] = {
},
};
+static void adp5585_remove_devices(void *dev)
+{
+ mfd_remove_devices(dev);
+}
+
+static int adp5585_add_devices(struct device *dev)
+{
+ int ret;
+
+ if (device_property_present(dev, "#pwm-cells")) {
+ ret = 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 = mfd_add_devices(dev, PLATFORM_DEVID_AUTO,
+ &adp5585_devs[ADP5585_DEV_GPIO], 1, NULL, 0, NULL);
+ if (ret) {
+ ret = dev_err_probe(dev, ret, "Failed to add gpio device\n");
+ goto out_error;
+ }
+ }
+
+ return devm_add_action_or_reset(dev, adp5585_remove_devices, dev);
+out_error:
+ mfd_remove_devices(dev);
+ return ret;
+}
+
static int adp5585_i2c_probe(struct i2c_client *i2c)
{
const struct regmap_config *regmap_config;
@@ -138,14 +175,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)