• Douglas Anderson's avatar
    drm/msm/dsi: Stop unconditionally powering up DSI hosts at modeset · 9e15123e
    Douglas Anderson authored
    In commit 7d8e9a90 ("drm/msm/dsi: move DSI host powerup to modeset
    time"), we moved powering up DSI hosts to modeset time. This wasn't
    because it was an elegant design, but there were no better options.
    
    That commit actually ended up breaking ps8640, and thus was born
    commit ec7981e6 ("drm/msm/dsi: don't powerup at modeset time for
    parade-ps8640") as a temporary hack to un-break ps8640 by moving it to
    the old way of doing things. It turns out that ps8640 _really_ doesn't
    like its pre_enable() function to be called after
    dsi_mgr_bridge_power_on(). Specifically (from experimentation, not
    because I have any inside knowledge), it looks like the assertion of
    "RST#" in the ps8640 runtime resume handler seems like it's not
    allowed to happen after dsi_mgr_bridge_power_on()
    
    Recently, Dave Stevenson's series landed allowing bridges some control
    over pre_enable ordering. The meaty commit for our purposes is
    commit 4fb912e5 ("drm/bridge: Introduce pre_enable_prev_first to
    alter bridge init order"). As documented by that series, if a bridge
    doesn't set "pre_enable_prev_first" then we should use the old ordering.
    
    Now that we have the commit ("drm/bridge: tc358762: Set
    pre_enable_prev_first") we can go back to the old ordering, which also
    allows us to remove the ps8640 special case.
    
    One last note is that even without reverting commit 7d8e9a90
    ("drm/msm/dsi: move DSI host powerup to modeset time"), if you _just_
    revert the ps8640 special case and try it out then it doesn't seem to
    fail anymore. I spent time bisecting / debugging this and it turns out
    to be mostly luck, so we still want this patch to make sure it's
    solid. Specifically the reason it sorta works these days is because
    we implemented wait_hpd_asserted() in ps8640 now, plus the magic of
    "pm_runtime" autosuspend. The fact that we have wait_hpd_asserted()
    implemented means that we actually power the bridge chip up just a wee
    bit earlier and then the bridge happens to stay on because of
    autosuspend and thus ends up powered before dsi_mgr_bridge_power_on().
    
    Cc: Dave Stevenson <dave.stevenson@raspberrypi.com>
    Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Cc: Abhinav Kumar <quic_abhinavk@quicinc.com>
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Reviewed-by: default avatarAbhinav Kumar <quic_abhinavk@quicinc.com>
    Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Patchwork: https://patchwork.freedesktop.org/patch/521058/
    Link: https://lore.kernel.org/r/20230131141756.RFT.v2.2.I4cfeab9d0e07e98ead23dd0736ab4461e6c69002@changeidSigned-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
    9e15123e
dsi_manager.c 16.9 KB