Commit 7c9e4a55 authored by Jessica Zhang's avatar Jessica Zhang Committed by Dmitry Baryshkov
Browse files

drm/msm/dsi: Reduce pclk rate for compression

parent 21bf6171
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -561,12 +561,27 @@ void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host)
	clk_disable_unprepare(msm_host->byte_clk);
}

static unsigned long dsi_get_pclk_rate(const struct drm_display_mode *mode, bool is_bonded_dsi)
static unsigned long dsi_adjust_pclk_for_compression(const struct drm_display_mode *mode,
		const struct drm_dsc_config *dsc)
{
	int new_hdisplay = DIV_ROUND_UP(mode->hdisplay * drm_dsc_get_bpp_int(dsc),
			dsc->bits_per_component * 3);

	int new_htotal = mode->htotal - mode->hdisplay + new_hdisplay;

	return new_htotal * mode->vtotal * drm_mode_vrefresh(mode);
}

static unsigned long dsi_get_pclk_rate(const struct drm_display_mode *mode,
		const struct drm_dsc_config *dsc, bool is_bonded_dsi)
{
	unsigned long pclk_rate;

	pclk_rate = mode->clock * 1000;

	if (dsc)
		pclk_rate = dsi_adjust_pclk_for_compression(mode, dsc);

	/*
	 * For bonded DSI mode, the current DRM mode has the complete width of the
	 * panel. Since, the complete panel is driven by two DSI controllers,
@@ -585,7 +600,7 @@ unsigned long dsi_byte_clk_get_rate(struct mipi_dsi_host *host, bool is_bonded_d
	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
	u8 lanes = msm_host->lanes;
	u32 bpp = dsi_get_bpp(msm_host->format);
	unsigned long pclk_rate = dsi_get_pclk_rate(mode, is_bonded_dsi);
	unsigned long pclk_rate = dsi_get_pclk_rate(mode, msm_host->dsc, is_bonded_dsi);
	unsigned long pclk_bpp;

	if (lanes == 0) {
@@ -604,7 +619,7 @@ unsigned long dsi_byte_clk_get_rate(struct mipi_dsi_host *host, bool is_bonded_d

static void dsi_calc_pclk(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
{
	msm_host->pixel_clk_rate = dsi_get_pclk_rate(msm_host->mode, is_bonded_dsi);
	msm_host->pixel_clk_rate = dsi_get_pclk_rate(msm_host->mode, msm_host->dsc, is_bonded_dsi);
	msm_host->byte_clk_rate = dsi_byte_clk_get_rate(&msm_host->base, is_bonded_dsi,
							msm_host->mode);