Skip to content

Commit 024b32d

Browse files
committed
drm/bridge: parade-ps8640: Wait for HPD when doing an AUX transfer
Unlike what is claimed in commit f5aa7d4 ("drm/bridge: parade-ps8640: Provide wait_hpd_asserted() in struct drm_dp_aux"), if someone manually tries to do an AUX transfer (like via `i2cdump ${bus} 0x50 i`) while the panel is off we don't just get a simple transfer error. Instead, the whole ps8640 gets thrown for a loop and goes into a bad state. Let's put the function to wait for the HPD (and the magical 50 ms after first reset) back in when we're doing an AUX transfer. This shouldn't actually make things much slower (assuming the panel is on) because we should immediately poll and see the HPD high. Mostly this is just an extra i2c transfer to the bridge. Fixes: f5aa7d4 ("drm/bridge: parade-ps8640: Provide wait_hpd_asserted() in struct drm_dp_aux") Tested-by: Pin-yen Lin <[email protected]> Reviewed-by: Pin-yen Lin <[email protected]> Signed-off-by: Douglas Anderson <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/20231221135548.1.I10f326a9305d57ad32cee7f8d9c60518c8be20fb@changeid
1 parent 11f9eb8 commit 024b32d

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

drivers/gpu/drm/bridge/parade-ps8640.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,11 @@ static ssize_t ps8640_aux_transfer(struct drm_dp_aux *aux,
346346
int ret;
347347

348348
pm_runtime_get_sync(dev);
349+
ret = _ps8640_wait_hpd_asserted(ps_bridge, 200 * 1000);
350+
if (ret) {
351+
pm_runtime_put_sync_suspend(dev);
352+
return ret;
353+
}
349354
ret = ps8640_aux_transfer_msg(aux, msg);
350355
pm_runtime_mark_last_busy(dev);
351356
pm_runtime_put_autosuspend(dev);

0 commit comments

Comments
 (0)