summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/mode.c
diff options
context:
space:
mode:
authorKevin Huang <kevinh@nvidia.com>2013-01-29 15:12:52 -0800
committerHarshada Kale <hkale@nvidia.com>2013-10-07 00:06:40 -0700
commitae306268afc1c478740096f4d89875db90b03b6d (patch)
tree1a8ee80a0dd34fde8ed4e42039863804ef65d7e3 /drivers/video/tegra/dc/mode.c
parent4da602d0f09949085b67a42341268dcb004f22e7 (diff)
video: tegra: dc: WAR of SHIFT_CLK_DIV update.
Bug 1225291 Bug 1161019 Bug 1363029 Change-Id: I699e64a1f6464eeddae5275a55cd2b285badc698 Signed-off-by: Kevin Huang <kevinh@nvidia.com> Reviewed-on: http://git-master/r/195272 Reviewed-on: http://git-master/r/281537 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Jon Mayo <jmayo@nvidia.com> Tested-by: Rakesh Iyer <riyer@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/dc/mode.c')
-rw-r--r--drivers/video/tegra/dc/mode.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/video/tegra/dc/mode.c b/drivers/video/tegra/dc/mode.c
index 4d3e06837ffd..139550d21b15 100644
--- a/drivers/video/tegra/dc/mode.c
+++ b/drivers/video/tegra/dc/mode.c
@@ -19,6 +19,7 @@
#include <linux/err.h>
#include <linux/types.h>
#include <linux/clk.h>
+#include <linux/delay.h>
#include <mach/clk.h>
#include <mach/dc.h>
@@ -252,8 +253,24 @@ int tegra_dc_program_mode(struct tegra_dc *dc, struct tegra_dc_mode *mode)
div = (rate * 2 / pclk) - 2;
+ /* SW WAR for bug 1045373. To make the shift clk dividor effect under
+ * all circumstances, write N+2 to SHIFT_CLK_DIVIDER and activate it.
+ * After 2us delay, write the target values to it. */
+#if defined(CONFIG_ARCH_TEGRA_11x_SOC)
+ tegra_dc_writel(dc, PIXEL_CLK_DIVIDER_PCD1 | SHIFT_CLK_DIVIDER(div + 2),
+ DC_DISP_DISP_CLOCK_CONTROL);
+ tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
+ tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
+
+ udelay(2);
+#endif
+
+#if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
+ /* Deprecated on t11x. */
tegra_dc_writel(dc, 0x00010001,
DC_DISP_SHIFT_CLOCK_OPTIONS);
+#endif
+
tegra_dc_writel(dc, PIXEL_CLK_DIVIDER_PCD1 | SHIFT_CLK_DIVIDER(div),
DC_DISP_DISP_CLOCK_CONTROL);