ARM64: DTS: Fix Firefly board audio driver
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / rockchip / dw-mipi-dsi.c
index 9e2585372432d3a9359554b9188a946490aabad3..0e948d6110419990b78146c40f112ce90954514d 100644 (file)
@@ -832,10 +832,14 @@ static void dw_mipi_dsi_video_mode_config(struct dw_mipi_dsi *dsi)
 static void dw_mipi_dsi_set_mode(struct dw_mipi_dsi *dsi,
                                 enum dw_mipi_dsi_mode mode)
 {
-       if (mode == DSI_COMMAND_MODE)
+       if (mode == DSI_COMMAND_MODE) {
                dsi_write(dsi, DSI_MODE_CFG, ENABLE_CMD_MODE);
-       else
+       } else {
+               dsi_write(dsi, DSI_PWR_UP, RESET);
+               dsi_write(dsi, DSI_LPCLK_CTRL, PHY_TXREQUESTCLKHS);
                dsi_write(dsi, DSI_MODE_CFG, ENABLE_VIDEO_MODE);
+               dsi_write(dsi, DSI_PWR_UP, POWERUP);
+       }
 }
 
 static void dw_mipi_dsi_init(struct dw_mipi_dsi *dsi)
@@ -1091,10 +1095,6 @@ static void rockchip_dsi_grf_config(struct dw_mipi_dsi *dsi, int vop_id)
 
                regmap_write(dsi->grf_regmap, pdata->grf_switch_reg, val);
 
-               if (pdata->grf_dsi0_mode_reg)
-                       regmap_write(dsi->grf_regmap, pdata->grf_dsi0_mode_reg,
-                                    pdata->grf_dsi0_mode);
-
        }
 
        dev_info(dsi->dev, "vop %s output to dsi0\n", (vop_id) ? "LIT" : "BIG");
@@ -1112,6 +1112,13 @@ static void rockchip_dsi_pre_init(struct dw_mipi_dsi *dsi)
                return;
        }
 
+       if (dsi->dphy.phy) {
+               rockchip_dsi_set_hs_clk(dsi);
+               phy_power_on(dsi->dphy.phy);
+       } else {
+               dw_mipi_dsi_get_lane_bps(dsi);
+       }
+
        pm_runtime_get_sync(dsi->dev);
 
        if (dsi->rst) {
@@ -1122,19 +1129,14 @@ static void rockchip_dsi_pre_init(struct dw_mipi_dsi *dsi)
                udelay(10);
        }
 
-       if (dsi->dphy.phy) {
-               rockchip_dsi_set_hs_clk(dsi);
-               phy_power_on(dsi->dphy.phy);
-       } else {
-               dw_mipi_dsi_get_lane_bps(dsi);
-       }
-
        dev_info(dsi->dev, "final DSI-Link bandwidth: %u x %d Mbps\n",
                 dsi->lane_mbps, dsi->lanes);
 }
 
 static void rockchip_dsi_host_init(struct dw_mipi_dsi *dsi)
 {
+       const struct dw_mipi_dsi_plat_data *pdata = dsi->pdata;
+
        dw_mipi_dsi_init(dsi);
        dw_mipi_dsi_dpi_config(dsi, &dsi->mode);
        dw_mipi_dsi_packet_handler_config(dsi);
@@ -1147,6 +1149,12 @@ static void rockchip_dsi_host_init(struct dw_mipi_dsi *dsi)
        dw_mipi_dsi_dphy_timing_config(dsi);
        dw_mipi_dsi_dphy_interface_config(dsi);
        dw_mipi_dsi_clear_err(dsi);
+
+               if (pdata->grf_dsi0_mode_reg)
+                       regmap_write(dsi->grf_regmap, pdata->grf_dsi0_mode_reg,
+                                    pdata->grf_dsi0_mode);
+
+
 }
 
 static void rockchip_dsi_init(struct dw_mipi_dsi *dsi)
@@ -1161,7 +1169,6 @@ static void rockchip_dsi_init(struct dw_mipi_dsi *dsi)
 
 static void rockchip_dsi_enable(struct dw_mipi_dsi *dsi)
 {
-       dsi_write(dsi, DSI_LPCLK_CTRL, PHY_TXREQUESTCLKHS);
        dw_mipi_dsi_set_mode(dsi, DSI_VIDEO_MODE);
        clk_disable_unprepare(dsi->dphy.ref_clk);
        clk_disable_unprepare(dsi->pclk);
@@ -1177,7 +1184,6 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
 
        vop_id = drm_of_encoder_active_endpoint_id(dsi->dev->of_node, encoder);
 
-       rockchip_dsi_grf_config(dsi, vop_id);
        rockchip_dsi_init(dsi);
 
        if (dsi->panel)
@@ -1187,6 +1193,8 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
 
        if (dsi->panel)
                drm_panel_enable(dsi->panel);
+
+       rockchip_dsi_grf_config(dsi, vop_id);
 }
 
 static int