diff options
Diffstat (limited to 'drivers/gpu/drm/msm/dp/dp_ctrl.c')
| -rw-r--r-- | drivers/gpu/drm/msm/dp/dp_ctrl.c | 148 | 
1 files changed, 59 insertions, 89 deletions
diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c index 013ca02e17cb..3854c9f1f7e9 100644 --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c @@ -1238,8 +1238,6 @@ static int dp_ctrl_link_train_2(struct dp_ctrl_private *ctrl,  	return -ETIMEDOUT;  } -static int dp_ctrl_reinitialize_mainlink(struct dp_ctrl_private *ctrl); -  static int dp_ctrl_link_train(struct dp_ctrl_private *ctrl,  			int *training_step)  { @@ -1358,25 +1356,7 @@ static int dp_ctrl_enable_mainlink_clocks(struct dp_ctrl_private *ctrl)  	if (ret)  		DRM_ERROR("Unable to start link clocks. ret=%d\n", ret); -	drm_dbg_dp(ctrl->drm_dev, "link rate=%d pixel_clk=%d\n", -		ctrl->link->link_params.rate, ctrl->dp_ctrl.pixel_rate); - -	return ret; -} - -static int dp_ctrl_enable_stream_clocks(struct dp_ctrl_private *ctrl) -{ -	int ret = 0; - -	dp_ctrl_set_clock_rate(ctrl, DP_STREAM_PM, "stream_pixel", -					ctrl->dp_ctrl.pixel_rate * 1000); - -	ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, true); -	if (ret) -		DRM_ERROR("Unabled to start pixel clocks. ret=%d\n", ret); - -	drm_dbg_dp(ctrl->drm_dev, "link rate=%d pixel_clk=%d\n", -			ctrl->link->link_params.rate, ctrl->dp_ctrl.pixel_rate); +	drm_dbg_dp(ctrl->drm_dev, "link rate=%d\n", ctrl->link->link_params.rate);  	return ret;  } @@ -1520,8 +1500,6 @@ static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl)  	ctrl->link->phy_params.p_level = 0;  	ctrl->link->phy_params.v_level = 0; -	ctrl->dp_ctrl.pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; -  	ret = dp_ctrl_setup_main_link(ctrl, &training_step);  	if (ret)  		goto end; @@ -1535,38 +1513,6 @@ end:  	return ret;  } -static int dp_ctrl_on_stream_phy_test_report(struct dp_ctrl *dp_ctrl); - -static int dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl) -{ -	int ret = 0; - -	if (!ctrl->link->phy_params.phy_test_pattern_sel) { -		drm_dbg_dp(ctrl->drm_dev, -			"no test pattern selected by sink\n"); -		return ret; -	} - -	/* -	 * The global reset will need DP link related clocks to be -	 * running. Add the global reset just before disabling the -	 * link clocks and core clocks. -	 */ -	ret = dp_ctrl_off(&ctrl->dp_ctrl); -	if (ret) { -		DRM_ERROR("failed to disable DP controller\n"); -		return ret; -	} - -	ret = dp_ctrl_on_link(&ctrl->dp_ctrl); -	if (!ret) -		ret = dp_ctrl_on_stream_phy_test_report(&ctrl->dp_ctrl); -	else -		DRM_ERROR("failed to enable DP link controller\n"); - -	return ret; -} -  static bool dp_ctrl_send_phy_test_pattern(struct dp_ctrl_private *ctrl)  {  	bool success = false; @@ -1619,6 +1565,48 @@ static bool dp_ctrl_send_phy_test_pattern(struct dp_ctrl_private *ctrl)  	return success;  } +static int dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl) +{ +	int ret; +	unsigned long pixel_rate; + +	if (!ctrl->link->phy_params.phy_test_pattern_sel) { +		drm_dbg_dp(ctrl->drm_dev, +			"no test pattern selected by sink\n"); +		return 0; +	} + +	/* +	 * The global reset will need DP link related clocks to be +	 * running. Add the global reset just before disabling the +	 * link clocks and core clocks. +	 */ +	ret = dp_ctrl_off(&ctrl->dp_ctrl); +	if (ret) { +		DRM_ERROR("failed to disable DP controller\n"); +		return ret; +	} + +	ret = dp_ctrl_on_link(&ctrl->dp_ctrl); +	if (ret) { +		DRM_ERROR("failed to enable DP link controller\n"); +		return ret; +	} + +	pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; +	dp_ctrl_set_clock_rate(ctrl, DP_STREAM_PM, "stream_pixel", pixel_rate * 1000); + +	ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, true); +	if (ret) { +		DRM_ERROR("Failed to start pixel clocks. ret=%d\n", ret); +		return ret; +	} + +	dp_ctrl_send_phy_test_pattern(ctrl); + +	return 0; +} +  void dp_ctrl_handle_sink_request(struct dp_ctrl *dp_ctrl)  {  	struct dp_ctrl_private *ctrl; @@ -1689,11 +1677,12 @@ int dp_ctrl_on_link(struct dp_ctrl *dp_ctrl)  {  	int rc = 0;  	struct dp_ctrl_private *ctrl; -	u32 rate = 0; +	u32 rate;  	int link_train_max_retries = 5;  	u32 const phy_cts_pixel_clk_khz = 148500;  	u8 link_status[DP_LINK_STATUS_SIZE];  	unsigned int training_step; +	unsigned long pixel_rate;  	if (!dp_ctrl)  		return -EINVAL; @@ -1701,25 +1690,24 @@ int dp_ctrl_on_link(struct dp_ctrl *dp_ctrl)  	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);  	rate = ctrl->panel->link_info.rate; +	pixel_rate = ctrl->panel->dp_mode.drm_mode.clock;  	dp_power_clk_enable(ctrl->power, DP_CORE_PM, true);  	if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) {  		drm_dbg_dp(ctrl->drm_dev,  				"using phy test link parameters\n"); -		if (!ctrl->panel->dp_mode.drm_mode.clock) -			ctrl->dp_ctrl.pixel_rate = phy_cts_pixel_clk_khz; +		if (!pixel_rate) +			pixel_rate = phy_cts_pixel_clk_khz;  	} else {  		ctrl->link->link_params.rate = rate;  		ctrl->link->link_params.num_lanes =  			ctrl->panel->link_info.num_lanes; -		ctrl->dp_ctrl.pixel_rate = ctrl->panel->dp_mode.drm_mode.clock;  	} -	drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%d\n", +	drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n",  		ctrl->link->link_params.rate, ctrl->link->link_params.num_lanes, -		ctrl->dp_ctrl.pixel_rate); - +		pixel_rate);  	rc = dp_ctrl_enable_mainlink_clocks(ctrl);  	if (rc) @@ -1816,31 +1804,12 @@ static int dp_ctrl_link_retrain(struct dp_ctrl_private *ctrl)  	return dp_ctrl_setup_main_link(ctrl, &training_step);  } -static int dp_ctrl_on_stream_phy_test_report(struct dp_ctrl *dp_ctrl) -{ -	int ret; -	struct dp_ctrl_private *ctrl; - -	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); - -	ctrl->dp_ctrl.pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; - -	ret = dp_ctrl_enable_stream_clocks(ctrl); -	if (ret) { -		DRM_ERROR("Failed to start pixel clocks. ret=%d\n", ret); -		return ret; -	} - -	dp_ctrl_send_phy_test_pattern(ctrl); - -	return 0; -} -  int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl, bool force_link_train)  {  	int ret = 0;  	bool mainlink_ready = false;  	struct dp_ctrl_private *ctrl; +	unsigned long pixel_rate;  	unsigned long pixel_rate_orig;  	if (!dp_ctrl) @@ -1848,15 +1817,14 @@ int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl, bool force_link_train)  	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); -	ctrl->dp_ctrl.pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; +	pixel_rate = pixel_rate_orig = ctrl->panel->dp_mode.drm_mode.clock; -	pixel_rate_orig = ctrl->dp_ctrl.pixel_rate;  	if (dp_ctrl->wide_bus_en) -		ctrl->dp_ctrl.pixel_rate >>= 1; +		pixel_rate >>= 1; -	drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%d\n", +	drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n",  		ctrl->link->link_params.rate, -		ctrl->link->link_params.num_lanes, ctrl->dp_ctrl.pixel_rate); +		ctrl->link->link_params.num_lanes, pixel_rate);  	if (!dp_power_clk_status(ctrl->power, DP_CTRL_PM)) { /* link clk is off */  		ret = dp_ctrl_enable_mainlink_clocks(ctrl); @@ -1866,9 +1834,11 @@ int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl, bool force_link_train)  		}  	} -	ret = dp_ctrl_enable_stream_clocks(ctrl); +	dp_ctrl_set_clock_rate(ctrl, DP_STREAM_PM, "stream_pixel", pixel_rate * 1000); + +	ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, true);  	if (ret) { -		DRM_ERROR("Failed to start pixel clocks. ret=%d\n", ret); +		DRM_ERROR("Unable to start pixel clocks. ret=%d\n", ret);  		goto end;  	}  |