• Thomas Petazzoni's avatar
    usb: xhci-plat: properly handle probe deferral for devm_clk_get() · 56c989e6
    Thomas Petazzoni authored
    commit de95c40d upstream.
    
    On some platforms, the clocks might be registered by a platform
    driver. When this is the case, the clock platform driver may very well
    be probed after xhci-plat, in which case the first probe() invocation
    of xhci-plat will receive -EPROBE_DEFER as the return value of
    devm_clk_get().
    
    The current code handles that as a normal error, and simply assumes
    that this means that the system doesn't have a clock for the XHCI
    controller, and continues probing without calling
    clk_prepare_enable(). Unfortunately, this doesn't work on systems
    where the XHCI controller does have a clock, but that clock is
    provided by another platform driver. In order to fix this situation,
    we handle the -EPROBE_DEFER error condition specially, and abort the
    XHCI controller probe(). It will be retried later automatically, the
    clock will be available, devm_clk_get() will succeed, and the probe()
    will continue with the clock prepared and enabled as expected.
    
    In practice, such issue is seen on the ARM64 Marvell 7K/8K platform,
    where the clocks are registered by a platform driver.
    Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    [bwh: Backported to 3.16: correct error label here is unmap_registers]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    56c989e6
xhci-plat.c 7.38 KB