|
@@ -559,6 +559,23 @@ static int tegra_plane_atomic_check(struct drm_plane *plane,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void tegra_dc_disable_window(struct tegra_dc *dc, int index)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+ u32 value;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&dc->lock, flags);
|
|
|
+
|
|
|
+ value = WINDOW_A_SELECT << index;
|
|
|
+ tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER);
|
|
|
+
|
|
|
+ value = tegra_dc_readl(dc, DC_WIN_WIN_OPTIONS);
|
|
|
+ value &= ~WIN_ENABLE;
|
|
|
+ tegra_dc_writel(dc, value, DC_WIN_WIN_OPTIONS);
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(&dc->lock, flags);
|
|
|
+}
|
|
|
+
|
|
|
static void tegra_plane_atomic_update(struct drm_plane *plane,
|
|
|
struct drm_plane_state *old_state)
|
|
|
{
|
|
@@ -573,6 +590,9 @@ static void tegra_plane_atomic_update(struct drm_plane *plane,
|
|
|
if (!plane->state->crtc || !plane->state->fb)
|
|
|
return;
|
|
|
|
|
|
+ if (!plane->state->visible)
|
|
|
+ return tegra_dc_disable_window(dc, p->index);
|
|
|
+
|
|
|
memset(&window, 0, sizeof(window));
|
|
|
window.src.x = plane->state->src.x1 >> 16;
|
|
|
window.src.y = plane->state->src.y1 >> 16;
|
|
@@ -612,8 +632,6 @@ static void tegra_plane_atomic_disable(struct drm_plane *plane,
|
|
|
{
|
|
|
struct tegra_plane *p = to_tegra_plane(plane);
|
|
|
struct tegra_dc *dc;
|
|
|
- unsigned long flags;
|
|
|
- u32 value;
|
|
|
|
|
|
/* rien ne va plus */
|
|
|
if (!old_state || !old_state->crtc)
|
|
@@ -621,16 +639,7 @@ static void tegra_plane_atomic_disable(struct drm_plane *plane,
|
|
|
|
|
|
dc = to_tegra_dc(old_state->crtc);
|
|
|
|
|
|
- spin_lock_irqsave(&dc->lock, flags);
|
|
|
-
|
|
|
- value = WINDOW_A_SELECT << p->index;
|
|
|
- tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER);
|
|
|
-
|
|
|
- value = tegra_dc_readl(dc, DC_WIN_WIN_OPTIONS);
|
|
|
- value &= ~WIN_ENABLE;
|
|
|
- tegra_dc_writel(dc, value, DC_WIN_WIN_OPTIONS);
|
|
|
-
|
|
|
- spin_unlock_irqrestore(&dc->lock, flags);
|
|
|
+ tegra_dc_disable_window(dc, p->index);
|
|
|
}
|
|
|
|
|
|
static const struct drm_plane_helper_funcs tegra_primary_plane_helper_funcs = {
|