• Viresh Kumar's avatar
    mfd: wm8994-core: Don't use managed regulator bulk get API · 202b5689
    Viresh Kumar authored
    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: default avatarViresh Kumar <viresh.kumar@linaro.org>
    Acked-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
    Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
    202b5689
wm8994-core.c 16.4 KB