diff options
Diffstat (limited to 'drivers/gpu/drm/msm/dsi/dsi_manager.c')
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi_manager.c | 65 | 
1 files changed, 31 insertions, 34 deletions
| diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c index f19bae475c96..0c1b7dde377c 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c @@ -305,27 +305,6 @@ static int dsi_mgr_connector_get_modes(struct drm_connector *connector)  	return num;  } -static enum drm_mode_status dsi_mgr_connector_mode_valid(struct drm_connector *connector, -				struct drm_display_mode *mode) -{ -	int id = dsi_mgr_connector_get_id(connector); -	struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); -	struct drm_encoder *encoder = msm_dsi_get_encoder(msm_dsi); -	struct msm_drm_private *priv = connector->dev->dev_private; -	struct msm_kms *kms = priv->kms; -	long actual, requested; - -	DBG(""); -	requested = 1000 * mode->clock; -	actual = kms->funcs->round_pixclk(kms, requested, encoder); - -	DBG("requested=%ld, actual=%ld", requested, actual); -	if (actual != requested) -		return MODE_CLOCK_RANGE; - -	return MODE_OK; -} -  static struct drm_encoder *  dsi_mgr_connector_best_encoder(struct drm_connector *connector)  { @@ -336,13 +315,12 @@ dsi_mgr_connector_best_encoder(struct drm_connector *connector)  	return msm_dsi_get_encoder(msm_dsi);  } -static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge) +static void 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);  	struct msm_dsi *msm_dsi1 = dsi_mgr_get_dsi(DSI_1);  	struct mipi_dsi_host *host = msm_dsi->host; -	struct drm_panel *panel = msm_dsi->panel;  	struct msm_dsi_phy_shared_timings phy_shared_timings[DSI_MAX];  	bool is_bonded_dsi = IS_BONDED_DSI();  	int ret; @@ -383,6 +361,34 @@ static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge)  	if (is_bonded_dsi && msm_dsi1)  		msm_dsi_host_enable_irq(msm_dsi1->host); +	return; + +host1_on_fail: +	msm_dsi_host_power_off(host); +host_on_fail: +	dsi_mgr_phy_disable(id); +phy_en_fail: +	return; +} + +static void dsi_mgr_bridge_pre_enable(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; +	struct drm_panel *panel = msm_dsi->panel; +	bool is_bonded_dsi = IS_BONDED_DSI(); +	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; +  	/* Always call panel functions once, because even for dual panels,  	 * there is only one drm_panel instance.  	 */ @@ -417,17 +423,7 @@ host_en_fail:  	if (panel)  		drm_panel_unprepare(panel);  panel_prep_fail: -	msm_dsi_host_disable_irq(host); -	if (is_bonded_dsi && msm_dsi1) -		msm_dsi_host_disable_irq(msm_dsi1->host); -	if (is_bonded_dsi && msm_dsi1) -		msm_dsi_host_power_off(msm_dsi1->host); -host1_on_fail: -	msm_dsi_host_power_off(host); -host_on_fail: -	dsi_mgr_phy_disable(id); -phy_en_fail:  	return;  } @@ -573,6 +569,8 @@ 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); + +	dsi_mgr_bridge_power_on(bridge);  }  static const struct drm_connector_funcs dsi_mgr_connector_funcs = { @@ -586,7 +584,6 @@ static const struct drm_connector_funcs dsi_mgr_connector_funcs = {  static const struct drm_connector_helper_funcs dsi_mgr_conn_helper_funcs = {  	.get_modes = dsi_mgr_connector_get_modes, -	.mode_valid = dsi_mgr_connector_mode_valid,  	.best_encoder = dsi_mgr_connector_best_encoder,  }; | 
