static void dw_hdmi_i2c_init(struct dw_hdmi *hdmi)
 {
+       hdmi_writeb(hdmi, HDMI_PHY_I2CM_INT_ADDR_DONE_POL,
+                   HDMI_PHY_I2CM_INT_ADDR);
+
+       hdmi_writeb(hdmi, HDMI_PHY_I2CM_CTLINT_ADDR_NAC_POL |
+                   HDMI_PHY_I2CM_CTLINT_ADDR_ARBITRATION_POL,
+                   HDMI_PHY_I2CM_CTLINT_ADDR);
+
        /* Software reset */
        hdmi_writeb(hdmi, 0x00, HDMI_I2CM_SOFTRSTZ);
 
        return 0;
 }
 
-static void dw_hdmi_setup_i2c(struct dw_hdmi *hdmi)
-{
-       hdmi_writeb(hdmi, HDMI_PHY_I2CM_INT_ADDR_DONE_POL,
-                   HDMI_PHY_I2CM_INT_ADDR);
-
-       hdmi_writeb(hdmi, HDMI_PHY_I2CM_CTLINT_ADDR_NAC_POL |
-                   HDMI_PHY_I2CM_CTLINT_ADDR_ARBITRATION_POL,
-                   HDMI_PHY_I2CM_CTLINT_ADDR);
-}
-
 static void initialize_hdmi_ih_mutes(struct dw_hdmi *hdmi)
 {
        u8 ih_mute;
        .max_register   = HDMI_I2CM_FS_SCL_LCNT_0_ADDR << 2,
 };
 
+static void dw_hdmi_init_hw(struct dw_hdmi *hdmi)
+{
+       initialize_hdmi_ih_mutes(hdmi);
+
+       /*
+        * Reset HDMI DDC I2C master controller and mute I2CM interrupts.
+        * Even if we are using a separate i2c adapter doing this doesn't
+        * hurt.
+        */
+       dw_hdmi_i2c_init(hdmi);
+
+       if (hdmi->phy.ops->setup_hpd)
+               hdmi->phy.ops->setup_hpd(hdmi, hdmi->phy.data);
+}
+
 static struct dw_hdmi *
 __dw_hdmi_probe(struct platform_device *pdev,
                const struct dw_hdmi_plat_data *plat_data)
                 prod_id1 & HDMI_PRODUCT_ID1_HDCP ? "with" : "without",
                 hdmi->phy.name);
 
-       initialize_hdmi_ih_mutes(hdmi);
+       dw_hdmi_init_hw(hdmi);
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
        hdmi->bridge.of_node = pdev->dev.of_node;
 #endif
 
-       dw_hdmi_setup_i2c(hdmi);
-       if (hdmi->phy.ops->setup_hpd)
-               hdmi->phy.ops->setup_hpd(hdmi, hdmi->phy.data);
-
        memset(&pdevinfo, 0, sizeof(pdevinfo));
        pdevinfo.parent = dev;
        pdevinfo.id = PLATFORM_DEVID_AUTO;
                hdmi->cec = platform_device_register_full(&pdevinfo);
        }
 
-       /* Reset HDMI DDC I2C master controller and mute I2CM interrupts */
-       if (hdmi->i2c)
-               dw_hdmi_i2c_init(hdmi);
-
        return hdmi;
 
 err_iahb:
 }
 EXPORT_SYMBOL_GPL(dw_hdmi_unbind);
 
+void dw_hdmi_resume(struct dw_hdmi *hdmi)
+{
+       dw_hdmi_init_hw(hdmi);
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_resume);
+
 MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
 MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com>");
 MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");