diff options
Diffstat (limited to 'drivers/gpu/drm/msm/dsi/dsi_manager.c')
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi_manager.c | 68 | 
1 files changed, 26 insertions, 42 deletions
diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c index 1bbac72dad35..28b8012a21f2 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c @@ -34,32 +34,6 @@ static struct msm_dsi_manager msm_dsim_glb;  #define IS_SYNC_NEEDED()	(msm_dsim_glb.is_sync_needed)  #define IS_MASTER_DSI_LINK(id)	(msm_dsim_glb.master_dsi_link_id == id) -#ifdef CONFIG_OF -static bool dsi_mgr_power_on_early(struct drm_bridge *bridge) -{ -	struct drm_bridge *next_bridge = drm_bridge_get_next_bridge(bridge); - -	/* -	 * If the next bridge in the chain is the Parade ps8640 bridge chip -	 * then don't power on early since it seems to violate the expectations -	 * of the firmware that the bridge chip is running. -	 * -	 * NOTE: this is expected to be a temporary special case. It's expected -	 * that we'll eventually have a framework that allows the next level -	 * bridge to indicate whether it needs us to power on before it or -	 * after it. When that framework is in place then we'll use it and -	 * remove this special case. -	 */ -	return !(next_bridge && next_bridge->of_node && -		 of_device_is_compatible(next_bridge->of_node, "parade,ps8640")); -} -#else -static inline bool dsi_mgr_power_on_early(struct drm_bridge *bridge) -{ -	return true; -} -#endif -  static inline struct msm_dsi *dsi_mgr_get_dsi(int id)  {  	return msm_dsim_glb.dsi[id]; @@ -254,7 +228,7 @@ static void msm_dsi_manager_set_split_display(u8 id)  	}  } -static void dsi_mgr_bridge_power_on(struct drm_bridge *bridge) +static int dsi_mgr_bridge_power_on(struct drm_bridge *bridge)  {  	int id = dsi_mgr_bridge_get_id(bridge);  	struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); @@ -265,12 +239,6 @@ static void dsi_mgr_bridge_power_on(struct drm_bridge *bridge)  	int ret;  	DBG("id=%d", id); -	if (!msm_dsi_device_connected(msm_dsi)) -		return; - -	/* Do nothing with the host if it is slave-DSI in case of bonded DSI */ -	if (is_bonded_dsi && !IS_MASTER_DSI_LINK(id)) -		return;  	ret = dsi_mgr_phy_enable(id, phy_shared_timings);  	if (ret) @@ -300,14 +268,31 @@ static void dsi_mgr_bridge_power_on(struct drm_bridge *bridge)  	if (is_bonded_dsi && msm_dsi1)  		msm_dsi_host_enable_irq(msm_dsi1->host); -	return; +	return 0;  host1_on_fail:  	msm_dsi_host_power_off(host);  host_on_fail:  	dsi_mgr_phy_disable(id);  phy_en_fail: -	return; +	return ret; +} + +static void dsi_mgr_bridge_power_off(struct drm_bridge *bridge) +{ +	int id = dsi_mgr_bridge_get_id(bridge); +	struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); +	struct msm_dsi *msm_dsi1 = dsi_mgr_get_dsi(DSI_1); +	struct mipi_dsi_host *host = msm_dsi->host; +	bool is_bonded_dsi = IS_BONDED_DSI(); + +	msm_dsi_host_disable_irq(host); +	if (is_bonded_dsi && msm_dsi1) { +		msm_dsi_host_disable_irq(msm_dsi1->host); +		msm_dsi_host_power_off(msm_dsi1->host); +	} +	msm_dsi_host_power_off(host); +	dsi_mgr_phy_disable(id);  }  static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge) @@ -327,8 +312,11 @@ static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge)  	if (is_bonded_dsi && !IS_MASTER_DSI_LINK(id))  		return; -	if (!dsi_mgr_power_on_early(bridge)) -		dsi_mgr_bridge_power_on(bridge); +	ret = dsi_mgr_bridge_power_on(bridge); +	if (ret) { +		dev_err(&msm_dsi->pdev->dev, "Power on failed: %d\n", ret); +		return; +	}  	ret = msm_dsi_host_enable(host);  	if (ret) { @@ -349,8 +337,7 @@ static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge)  host1_en_fail:  	msm_dsi_host_disable(host);  host_en_fail: - -	return; +	dsi_mgr_bridge_power_off(bridge);  }  void msm_dsi_manager_tpg_enable(void) @@ -438,9 +425,6 @@ static void dsi_mgr_bridge_mode_set(struct drm_bridge *bridge,  	msm_dsi_host_set_display_mode(host, adjusted_mode);  	if (is_bonded_dsi && other_dsi)  		msm_dsi_host_set_display_mode(other_dsi->host, adjusted_mode); - -	if (dsi_mgr_power_on_early(bridge)) -		dsi_mgr_bridge_power_on(bridge);  }  static enum drm_mode_status dsi_mgr_bridge_mode_valid(struct drm_bridge *bridge,  |