summaryrefslogtreecommitdiffstats
path: root/drivers/video/tegra/dc/dc.c
diff options
context:
space:
mode:
authorErik Gilling <konkers@android.com>2010-09-26 20:55:52 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:00:41 -0400
commit8f18dae9366e956415737bf3c239102ce3bb4e41 (patch)
tree469de605c0214d965e414b23948a5130f9642e5e /drivers/video/tegra/dc/dc.c
parent8420d4e36e8e938681aedd8f67de39cf3f3cfe01 (diff)
video: tegra: add a no_vsync module param to disable vsync
Change-Id: Icc950e1a94a7441dd820b774f8656b3db1be0e20 Signed-off-by: Erik Gilling <konkers@android.com> Rebase-Id: R68af9a9c4a7350f559c00032a39bc5a6b01dd684
Diffstat (limited to 'drivers/video/tegra/dc/dc.c')
-rw-r--r--drivers/video/tegra/dc/dc.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c
index b6a0b4753..ef333f647 100644
--- a/drivers/video/tegra/dc/dc.c
+++ b/drivers/video/tegra/dc/dc.c
@@ -39,6 +39,10 @@
39#include "dc_reg.h" 39#include "dc_reg.h"
40#include "dc_priv.h" 40#include "dc_priv.h"
41 41
42static int no_vsync;
43
44module_param_named(no_vsync, no_vsync, int, S_IRUGO | S_IWUSR);
45
42struct tegra_dc *tegra_dcs[TEGRA_MAX_DC]; 46struct tegra_dc *tegra_dcs[TEGRA_MAX_DC];
43 47
44DEFINE_MUTEX(tegra_dc_lock); 48DEFINE_MUTEX(tegra_dc_lock);
@@ -423,6 +427,11 @@ int tegra_dc_update_windows(struct tegra_dc_win *windows[], int n)
423 return -EFAULT; 427 return -EFAULT;
424 } 428 }
425 429
430 if (no_vsync)
431 tegra_dc_writel(dc, WRITE_MUX_ACTIVE | READ_MUX_ACTIVE, DC_CMD_STATE_ACCESS);
432 else
433 tegra_dc_writel(dc, WRITE_MUX_ASSEMBLY | WRITE_MUX_ASSEMBLY, DC_CMD_STATE_ACCESS);
434
426 for (i = 0; i < n; i++) { 435 for (i = 0; i < n; i++) {
427 struct tegra_dc_win *win = windows[i]; 436 struct tegra_dc_win *win = windows[i];
428 unsigned h_dda; 437 unsigned h_dda;
@@ -442,7 +451,8 @@ int tegra_dc_update_windows(struct tegra_dc_win *windows[], int n)
442 tegra_dc_writel(dc, WINDOW_A_SELECT << win->idx, 451 tegra_dc_writel(dc, WINDOW_A_SELECT << win->idx,
443 DC_CMD_DISPLAY_WINDOW_HEADER); 452 DC_CMD_DISPLAY_WINDOW_HEADER);
444 453
445 update_mask |= WIN_A_ACT_REQ << win->idx; 454 if (!no_vsync)
455 update_mask |= WIN_A_ACT_REQ << win->idx;
446 456
447 if (!(win->flags & TEGRA_WIN_FLAG_ENABLED)) { 457 if (!(win->flags & TEGRA_WIN_FLAG_ENABLED)) {
448 tegra_dc_writel(dc, 0, DC_WIN_WIN_OPTIONS); 458 tegra_dc_writel(dc, 0, DC_WIN_WIN_OPTIONS);
@@ -473,36 +483,40 @@ int tegra_dc_update_windows(struct tegra_dc_win *windows[], int n)
473 tegra_dc_writel(dc, win->stride, DC_WIN_LINE_STRIDE); 483 tegra_dc_writel(dc, win->stride, DC_WIN_LINE_STRIDE);
474 tegra_dc_writel(dc, 0, DC_WIN_BUF_STRIDE); 484 tegra_dc_writel(dc, 0, DC_WIN_BUF_STRIDE);
475 485
476 val = WIN_ENABLE;
477 if (tegra_dc_fmt_bpp(win->fmt) < 24)
478 val |= COLOR_EXPAND;
479 tegra_dc_writel(dc, val, DC_WIN_WIN_OPTIONS);
480 486
481 tegra_dc_writel(dc, (unsigned long)win->phys_addr, 487 tegra_dc_writel(dc, (unsigned long)win->phys_addr,
482 DC_WINBUF_START_ADDR); 488 DC_WINBUF_START_ADDR);
483 tegra_dc_writel(dc, win->x, DC_WINBUF_ADDR_H_OFFSET); 489 tegra_dc_writel(dc, win->x, DC_WINBUF_ADDR_H_OFFSET);
484 tegra_dc_writel(dc, win->y, DC_WINBUF_ADDR_V_OFFSET); 490 tegra_dc_writel(dc, win->y, DC_WINBUF_ADDR_V_OFFSET);
485 491
486 win->dirty = 1; 492 val = WIN_ENABLE;
493 if (tegra_dc_fmt_bpp(win->fmt) < 24)
494 val |= COLOR_EXPAND;
495 tegra_dc_writel(dc, val, DC_WIN_WIN_OPTIONS);
496
497 win->dirty = no_vsync ? 0 : 1;
487 } 498 }
488 499
489 if (update_blend) { 500 if (update_blend) {
490 tegra_dc_set_blending(dc, &dc->blend); 501 tegra_dc_set_blending(dc, &dc->blend);
491 for (i = 0; i < DC_N_WINDOWS; i++) { 502 for (i = 0; i < DC_N_WINDOWS; i++) {
492 dc->windows[i].dirty = 1; 503 if (!no_vsync)
504 dc->windows[i].dirty = 1;
493 update_mask |= WIN_A_ACT_REQ << i; 505 update_mask |= WIN_A_ACT_REQ << i;
494 } 506 }
495 } 507 }
496 508
497 tegra_dc_writel(dc, update_mask << 8, DC_CMD_STATE_CONTROL); 509 tegra_dc_writel(dc, update_mask << 8, DC_CMD_STATE_CONTROL);
498 510
499 val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE); 511 if (!no_vsync) {
500 val |= FRAME_END_INT; 512 val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE);
501 tegra_dc_writel(dc, val, DC_CMD_INT_ENABLE); 513 val |= FRAME_END_INT;
514 tegra_dc_writel(dc, val, DC_CMD_INT_ENABLE);
502 515
503 val = tegra_dc_readl(dc, DC_CMD_INT_MASK); 516 val = tegra_dc_readl(dc, DC_CMD_INT_MASK);
504 val |= FRAME_END_INT; 517 val |= FRAME_END_INT;
505 tegra_dc_writel(dc, val, DC_CMD_INT_MASK); 518 tegra_dc_writel(dc, val, DC_CMD_INT_MASK);
519 }
506 520
507 tegra_dc_writel(dc, update_mask, DC_CMD_STATE_CONTROL); 521 tegra_dc_writel(dc, update_mask, DC_CMD_STATE_CONTROL);
508 522
@@ -751,8 +765,8 @@ static void tegra_dc_init(struct tegra_dc *dc)
751 tegra_dc_writel(dc, 0x00000020, DC_DISP_MEM_HIGH_PRIORITY); 765 tegra_dc_writel(dc, 0x00000020, DC_DISP_MEM_HIGH_PRIORITY);
752 tegra_dc_writel(dc, 0x00000001, DC_DISP_MEM_HIGH_PRIORITY_TIMER); 766 tegra_dc_writel(dc, 0x00000001, DC_DISP_MEM_HIGH_PRIORITY_TIMER);
753 767
754 tegra_dc_writel(dc, 0x0001c702, DC_CMD_INT_MASK); 768 tegra_dc_writel(dc, 0x00000002, DC_CMD_INT_MASK);
755 tegra_dc_writel(dc, 0x0001c700, DC_CMD_INT_ENABLE); 769 tegra_dc_writel(dc, 0x00000000, DC_CMD_INT_ENABLE);
756 770
757 tegra_dc_writel(dc, 0x00000000, DC_DISP_BORDER_COLOR); 771 tegra_dc_writel(dc, 0x00000000, DC_DISP_BORDER_COLOR);
758 772