• Thomas Petazzoni's avatar
    usb: xhci-plat: properly handle probe deferral for devm_clk_get() · de95c40d
    Thomas Petazzoni authored
    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.
    
    Cc: <stable@vger.kernel.org>
    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>
    de95c40d
xhci-plat.c 8.61 KB