mfd: wm8994-core: Don't use managed regulator bulk get API
authorViresh Kumar <viresh.kumar@linaro.org>
Thu, 27 Oct 2016 10:20:18 +0000 (15:50 +0530)
committerLee Jones <lee.jones@linaro.org>
Tue, 29 Nov 2016 08:21:27 +0000 (08:21 +0000)
commit202b56890aead063f90b6995554d4602dbd7752e
tree84a0ffb4694f3d3a11706d3afdfccb88e72c82ca
parent8ca9edc837932469b81b8b47ea43a074b6add970
mfd: wm8994-core: Don't use managed regulator bulk get API

The kernel WARNs and then crashes today if wm8994_device_init() fails
after calling devm_regulator_bulk_get().

That happens because there are multiple devices involved here and the
order in which managed resources are freed isn't correct.

The regulators are added as children of wm8994->dev.  Whereas,
devm_regulator_bulk_get() receives wm8994->dev as the device, though it
gets the same regulators which were added as children of wm8994->dev
earlier.

During failures, the children are removed first and the core eventually
calls regulator_unregister() for them. As regulator_put() was never done
for them (opposite of devm_regulator_bulk_get()), the kernel WARNs at

WARN_ON(rdev->open_count);

And eventually it crashes from debugfs_remove_recursive().

Fix the kernel warnings and crashes by using regulator_bulk_get()
instead of devm_regulator_bulk_get() and explicitly freeing the supplies
in exit paths.

Tested on Exynos 5250, dual core ARM A15 machine.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/mfd/wm8994-core.c