• Claudiu Beznea's avatar
    ARM: at91: pm: fix imbalanced reference counter for ethernet devices · ccd4923d
    Claudiu Beznea authored
    The of_find_device_by_node() function is returning a struct platform_device
    object with the embedded struct device member's reference counter
    incremented. This needs to be dropped when done with the platform device
    returned by of_find_device_by_node().
    
    at91_pm_eth_quirk_is_valid() calls of_find_device_by_node() on
    suspend and resume path. On suspend it calls of_find_device_by_node() and
    on resume and failure paths it drops the counter of
    struct platform_device::dev.
    
    In case ethernet device may not wakeup there is a put_device() on
    at91_pm_eth_quirk_is_valid() which is wrong as it colides with
    put_device() on resume path leading to the reference counter of struct
    device embedded in struct platform_device to be messed, stack trace to be
    displayed (after 5 consecutive suspend/resume cycles) and execution to
    hang.
    
    Along with this the error path of at91_pm_config_quirks() had been also
    adapted to decrement propertly the reference counter of struct device
    embedded in struct platform_device.
    
    Fixes: b7fc72c6 ("ARM: at91: pm: add quirks for pm")
    Signed-off-by: default avatarClaudiu Beznea <claudiu.beznea@microchip.com>
    Acked-by: default avatarNicolas Ferre <nicolas.ferre@microchip.com>
    Link: https://lore.kernel.org/r/20230518062511.2988500-1-claudiu.beznea@microchip.com
    ccd4923d
pm.c 42.4 KB