| From 13f1a5bf4e8a7f29e3cb46f88362bf62ef77aaab Mon Sep 17 00:00:00 2001 |
| From: Romain Perier <romain.perier@collabora.com> |
| Date: Mon, 27 Mar 2017 11:45:07 +0530 |
| Subject: [PATCH 237/286] drm: dw_hdmi: Don't rely on the status of the bridge |
| for updating HPD |
| |
| Currently, the irq handler that monitors changes for HPD and RX_SENSE |
| relies on the status of the bridge for updating the status of the HPD. |
| The update is done only when the bridge is enabled. |
| |
| However, on Rockchip platforms we have found use cases where it could be |
| a problem. When HDMI is being used, turning off/on the screen or |
| unplugging/re-plugging the cable, the following simplified code path |
| will happen: |
| |
| - dw_hdmi_irq() will be triggered by an HPD event, as the bridge is on |
| hdmi->disabled is false, then the handler will update the rxsense flag |
| accordingly. |
| - dw_hdmi_update_power() will be invoked with the mode |
| DRM_FORCE_UNSPECIFIED and rxsense == 1, so dw_hdmi_poweroff() will be |
| called and the PHY will be desactivated (its pixel clocks and TMDS) |
| |
| [...] |
| |
| - dw_hdmi_bridge_disable() will be invoked, the bridge will be marked as |
| disabled. |
| |
| - dw_hdmi_irq() will be triggered by an HPD event, as the bridge is |
| currently disabled the HPD status won't be updated, so hdmi->rxsense |
| won't be changed. Even if the data part of the PHY is disabled, this |
| information coming from the HDMI Transmitter is correct and should be |
| saved. |
| |
| [...] |
| |
| - dw_hdmi_bridge_enable() will be invoked, the bridge will be marked as |
| enabled. |
| - dw_hdmi_update_power() will be called. When hdmi->force is equal to |
| DRM_FORCE_UNSPECIFIED the function will rely on hdmi->rxsense. If this |
| field has not been updated by the irq handler, it will be false and |
| DRM_FORCE_ON won't be put to hdmi->force. |
| |
| Consequently, most of the time dw_hdmi_poweron() won't be called in this |
| use case, TMDS won't be re-enabled the PHY won't be re-initialized, |
| resulting in a "Signal not found". |
| |
| This commit fixes the issue by removing the check for "!hdmi->disabled". |
| As already explained, even if the PHY is partially disabled, information |
| coming from HDMI Transmitter about HPD should be saved for a later use. |
| |
| Signed-off-by: Romain Perier <romain.perier@collabora.com> |
| Signed-off-by: Archit Taneja <architt@codeaurora.org> |
| Link: https://patchwork.freedesktop.org/patch/143602/ |
| (cherry picked from commit 187697a4544c20d4b77193275a7e10f85506d14d) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |
| +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |
| @@ -1916,7 +1916,7 @@ static irqreturn_t dw_hdmi_irq(int irq, |
| if (intr_stat & |
| (HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) { |
| mutex_lock(&hdmi->mutex); |
| - if (!hdmi->disabled && !hdmi->force) { |
| + if (!hdmi->force) { |
| /* |
| * If the RX sense status indicates we're disconnected, |
| * clear the software rxsense status. |