diff options
author | Erik Gilling <konkers@android.com> | 2010-09-26 20:55:52 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:00:41 -0400 |
commit | 8f18dae9366e956415737bf3c239102ce3bb4e41 (patch) | |
tree | 469de605c0214d965e414b23948a5130f9642e5e /drivers/video/tegra/dc/dc.c | |
parent | 8420d4e36e8e938681aedd8f67de39cf3f3cfe01 (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.c | 44 |
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 | ||
42 | static int no_vsync; | ||
43 | |||
44 | module_param_named(no_vsync, no_vsync, int, S_IRUGO | S_IWUSR); | ||
45 | |||
42 | struct tegra_dc *tegra_dcs[TEGRA_MAX_DC]; | 46 | struct tegra_dc *tegra_dcs[TEGRA_MAX_DC]; |
43 | 47 | ||
44 | DEFINE_MUTEX(tegra_dc_lock); | 48 | DEFINE_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 | ||