From fe1f889383bb4ecd8eb18a830b63e613dd2acdb8 Mon Sep 17 00:00:00 2001 From: Xin Xie Date: Tue, 28 Jun 2011 13:12:48 -0700 Subject: video: tegra: dc: fix DSI pclk calculation BUG 844499 Original-Change-Id: Ib99a921456f4a6e8e3e2d40907a91d492daf4bc0 Reviewed-on: http://git-master/r/38773 Reviewed-by: Varun Colbert Tested-by: Varun Colbert Rebase-Id: R6dccc88053c055d9e4828d6f4d4e18932f0502f2 --- drivers/video/tegra/dc/dc.c | 8 +++++--- drivers/video/tegra/dc/dc_priv.h | 1 + drivers/video/tegra/dc/dsi.c | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) (limited to 'drivers/video') diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c index 341e52b64e6c..d5d525a5758d 100644 --- a/drivers/video/tegra/dc/dc.c +++ b/drivers/video/tegra/dc/dc.c @@ -681,7 +681,7 @@ static unsigned long tegra_dc_get_emc_rate(struct tegra_dc_win *wins[], int n) for (i = 0; w = wins[i], bw[i] = 0, i < n; i++) { if (!WIN_IS_ENABLED(w)) continue; - bw[i] = dc->mode.pclk * + bw[i] = dc->pixel_clk * (tegra_dc_fmt_bpp(w->fmt) >> BIT_TO_BYTE_SHIFT) * (WIN_USE_V_FILTER(w) ? 2 : 1) / w->out_w * w->w * @@ -1194,14 +1194,14 @@ static int calc_ref_to_sync(struct tegra_dc_mode *mode) #ifdef DEBUG /* return in 1000ths of a Hertz */ -static int calc_refresh(const struct tegra_dc_mode *m) +static int calc_refresh(struct tegra_dc *dc, const struct tegra_dc_mode *m) { long h_total, v_total, refresh; h_total = m->h_active + m->h_front_porch + m->h_back_porch + m->h_sync_width; v_total = m->v_active + m->v_front_porch + m->v_back_porch + m->v_sync_width; - refresh = m->pclk / h_total; + refresh = dc->pixel_clk / h_total; refresh *= 1000; refresh /= v_total; return refresh; @@ -1311,6 +1311,8 @@ static int tegra_dc_program_mode(struct tegra_dc *dc, struct tegra_dc_mode *mode tegra_dc_writel(dc, PIXEL_CLK_DIVIDER_PCD1 | SHIFT_CLK_DIVIDER(div), DC_DISP_DISP_CLOCK_CONTROL); + dc->pixel_clk = dc->mode.pclk; + return 0; } diff --git a/drivers/video/tegra/dc/dc_priv.h b/drivers/video/tegra/dc/dc_priv.h index 77ed9afe2661..31706dee5c47 100644 --- a/drivers/video/tegra/dc/dc_priv.h +++ b/drivers/video/tegra/dc/dc_priv.h @@ -87,6 +87,7 @@ struct tegra_dc { void __iomem *base; int irq; + int pixel_clk; struct clk *clk; struct clk *emc_clk; int emc_clk_rate; diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c index 96769f14894c..62aa1ab8213d 100644 --- a/drivers/video/tegra/dc/dsi.c +++ b/drivers/video/tegra/dc/dsi.c @@ -434,6 +434,8 @@ static void tegra_dsi_init_sw(struct tegra_dc *dc, /* Calculate minimum required pixel rate. */ pixel_clk_hz = h_width_pixels * v_width_lines * dsi->info.refresh_rate; + dc->pixel_clk = pixel_clk_hz; + /* Calculate minimum byte rate on DSI interface. */ byte_clk_hz = (pixel_clk_hz * dsi->pixel_scaler_mul) / (dsi->pixel_scaler_div * dsi->info.n_data_lanes); -- cgit v1.2.3