• Johan Hovold's avatar
    mfd: qcom-spmi-pmic: Fix revid implementation · 7b439aaa
    Johan Hovold authored
    The Qualcomm SPMI PMIC revid implementation is broken in multiple ways.
    
    First, it assumes that just because the sibling base device has been
    registered that means that it is also bound to a driver, which may not
    be the case (e.g. due to probe deferral or asynchronous probe). This
    could trigger a NULL-pointer dereference when attempting to access the
    driver data of the unbound device.
    
    Second, it accesses driver data of a sibling device directly and without
    any locking, which means that the driver data may be freed while it is
    being accessed (e.g. on driver unbind).
    
    Third, it leaks a struct device reference to the sibling device which is
    looked up using the spmi_device_from_of() every time a function (child)
    device is calling the revid function (e.g. on probe).
    
    Fix this mess by reimplementing the revid lookup so that it is done only
    at probe of the PMIC device; the base device fetches the revid info from
    the hardware, while any secondary SPMI device fetches the information
    from the base device and caches it so that it can be accessed safely
    from its children. If the base device has not been probed yet then probe
    of a secondary device is deferred.
    
    Fixes: e9c11c6e ("mfd: qcom-spmi-pmic: expose the PMIC revid information to clients")
    Cc: stable@vger.kernel.org      # 6.0
    Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
    Acked-by: default avatarCaleb Connolly <caleb.connolly@linaro.org>
    Link: https://lore.kernel.org/r/20231003152927.15000-3-johan+linaro@kernel.orgSigned-off-by: default avatarLee Jones <lee@kernel.org>
    7b439aaa
qcom-spmi-pmic.c 8.28 KB