diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 9ac1c74c7efc..5ed021b432c5 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -261,6 +261,8 @@ struct dw_hdmi { void (*write)(struct dw_hdmi *hdmi, u8 val, int offset); u8 (*read)(struct dw_hdmi *hdmi, int offset); + + bool initialized; /* hdmi is enabled before bind */ }; #define HDMI_IH_PHY_STAT0_RX_SENSE \ @@ -2396,6 +2398,10 @@ static void dw_hdmi_update_power(struct dw_hdmi *hdmi) } if (force == DRM_FORCE_OFF) { + if (hdmi->initialized) { + hdmi->initialized = false; + hdmi->disabled = true; + } if (hdmi->bridge_is_on) dw_hdmi_poweroff(hdmi); } else { @@ -3613,6 +3619,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master, prod_id1 & HDMI_PRODUCT_ID1_HDCP ? "with" : "without", hdmi->phy.name); + hdmi->initialized = false; ret = hdmi_readb(hdmi, HDMI_PHY_STAT0); if ((ret & HDMI_PHY_TX_PHY_LOCK) && (ret & HDMI_PHY_HPD) && hdmi_readb(hdmi, HDMI_FC_EXCTRLDUR)) { @@ -3620,6 +3627,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master, hdmi->disabled = false; hdmi->bridge_is_on = true; hdmi->phy.enabled = true; + hdmi->initialized = true; } else if (ret & HDMI_PHY_TX_PHY_LOCK) { hdmi->phy.ops->disable(hdmi, hdmi->phy.data); }