|
@@ -393,8 +393,13 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
|
|
|
BUG();
|
|
|
goto err;
|
|
|
}
|
|
|
-
|
|
|
- ret = devm_regulator_bulk_get(wm8994->dev, wm8994->num_supplies,
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Can't use devres helper here as some of the supplies are provided by
|
|
|
+ * wm8994->dev's children (regulators) and those regulators are
|
|
|
+ * unregistered by the devres core before the supplies are freed.
|
|
|
+ */
|
|
|
+ ret = regulator_bulk_get(wm8994->dev, wm8994->num_supplies,
|
|
|
wm8994->supplies);
|
|
|
if (ret != 0) {
|
|
|
dev_err(wm8994->dev, "Failed to get supplies: %d\n", ret);
|
|
@@ -405,7 +410,7 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
|
|
|
wm8994->supplies);
|
|
|
if (ret != 0) {
|
|
|
dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret);
|
|
|
- goto err;
|
|
|
+ goto err_regulator_free;
|
|
|
}
|
|
|
|
|
|
ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET);
|
|
@@ -596,6 +601,8 @@ err_irq:
|
|
|
err_enable:
|
|
|
regulator_bulk_disable(wm8994->num_supplies,
|
|
|
wm8994->supplies);
|
|
|
+err_regulator_free:
|
|
|
+ regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
|
|
|
err:
|
|
|
mfd_remove_devices(wm8994->dev);
|
|
|
return ret;
|
|
@@ -604,10 +611,11 @@ err:
|
|
|
static void wm8994_device_exit(struct wm8994 *wm8994)
|
|
|
{
|
|
|
pm_runtime_disable(wm8994->dev);
|
|
|
- mfd_remove_devices(wm8994->dev);
|
|
|
wm8994_irq_exit(wm8994);
|
|
|
regulator_bulk_disable(wm8994->num_supplies,
|
|
|
wm8994->supplies);
|
|
|
+ regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
|
|
|
+ mfd_remove_devices(wm8994->dev);
|
|
|
}
|
|
|
|
|
|
static const struct of_device_id wm8994_of_match[] = {
|