• Quentin Schulz's avatar
    iio: adc: sun4i-gpadc-iio: fix parent device being used in devm function · 82237f26
    Quentin Schulz authored
    For the sake of DT binding stability, this IIO driver is a child of an
    MFD driver for Allwinner A10, A13 and A31 because there already exists a
    DT binding for this IP. The MFD driver has a DT node but the IIO driver
    does not.
    
    The IIO device registers the temperature sensor in the thermal framework
    using the DT node of the parent, the MFD device, so the thermal
    framework could match the phandle to the MFD device in the DT and the
    struct device used to register in the thermal framework.
    
    devm_thermal_zone_of_sensor_register was previously used to register the
    thermal sensor with the parent struct device of the IIO device,
    representing the MFD device. By doing so, we registered actually the
    parent in the devm routine and not the actual IIO device.
    
    This lead to the devm unregister function not being called when the IIO
    module driver is removed. It resulted in the thermal framework still
    polling the get_temp function of the IIO module while the device doesn't
    exist anymore, thus generated a kernel panic.
    
    Use the non-devm function instead and do the unregister manually in the
    remove function.
    
    Fixes: d1caa990 ("iio: adc: add support for Allwinner SoCs ADC")
    Signed-off-by: default avatarQuentin Schulz <quentin.schulz@free-electrons.com>
    Reported-by: default avatarCorentin Labbe <clabbe.montjoie@gmail.com>
    Reviewed-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
    Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
    82237f26
sun4i-gpadc-iio.c 19.6 KB