On 25-11-16, 10:14, Lee Jones wrote:
On Thu, 27 Oct 2016, Viresh Kumar wrote:
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().
Is ...
mfd: wm8994-core: disable regulators before removing them
... required as well, or is that separate?
It would be better if we get that too. Anyway, the $subject patch has a dependency on it..