Skip to content

Commit

Permalink
drm/tegra: dc: Use base atomic state helpers
Browse files Browse the repository at this point in the history
Instead of duplicating the code, make use of the newly introduced atomic
state duplicate and destroy helpers. This allows changes to the base
atomic state handling to automatically propagate to the Tegra driver and
thereby prevent breakage resulting from both copies going out of sync.

Signed-off-by: Thierry Reding <treding@nvidia.com>
  • Loading branch information
Thierry Reding committed Apr 2, 2015
1 parent f5e7840 commit 3b59b7a
Showing 1 changed file with 18 additions and 13 deletions.
31 changes: 18 additions & 13 deletions drivers/gpu/drm/tegra/dc.c
Original file line number Diff line number Diff line change
Expand Up @@ -425,8 +425,8 @@ static void tegra_plane_reset(struct drm_plane *plane)
{
struct tegra_plane_state *state;

if (plane->state && plane->state->fb)
drm_framebuffer_unreference(plane->state->fb);
if (plane->state)
__drm_atomic_helper_plane_destroy_state(plane, plane->state);

kfree(plane->state);
plane->state = NULL;
Expand All @@ -443,22 +443,22 @@ static struct drm_plane_state *tegra_plane_atomic_duplicate_state(struct drm_pla
struct tegra_plane_state *state = to_tegra_plane_state(plane->state);
struct tegra_plane_state *copy;

copy = kmemdup(state, sizeof(*state), GFP_KERNEL);
copy = kmalloc(sizeof(*copy), GFP_KERNEL);
if (!copy)
return NULL;

if (copy->base.fb)
drm_framebuffer_reference(copy->base.fb);
__drm_atomic_helper_plane_duplicate_state(plane, &copy->base);
copy->tiling = state->tiling;
copy->format = state->format;
copy->swap = state->swap;

return &copy->base;
}

static void tegra_plane_atomic_destroy_state(struct drm_plane *plane,
struct drm_plane_state *state)
{
if (state->fb)
drm_framebuffer_unreference(state->fb);

__drm_atomic_helper_plane_destroy_state(plane, state);
kfree(state);
}

Expand Down Expand Up @@ -1002,6 +1002,9 @@ static void tegra_crtc_reset(struct drm_crtc *crtc)
{
struct tegra_dc_state *state;

if (crtc->state)
__drm_atomic_helper_crtc_destroy_state(crtc, crtc->state);

kfree(crtc->state);
crtc->state = NULL;

Expand All @@ -1018,21 +1021,23 @@ tegra_crtc_atomic_duplicate_state(struct drm_crtc *crtc)
struct tegra_dc_state *state = to_dc_state(crtc->state);
struct tegra_dc_state *copy;

copy = kmemdup(state, sizeof(*state), GFP_KERNEL);
copy = kmalloc(sizeof(*copy), GFP_KERNEL);
if (!copy)
return NULL;

copy->base.mode_changed = false;
copy->base.active_changed = false;
copy->base.planes_changed = false;
copy->base.event = NULL;
__drm_atomic_helper_crtc_duplicate_state(crtc, &copy->base);
copy->clk = state->clk;
copy->pclk = state->pclk;
copy->div = state->div;
copy->planes = state->planes;

return &copy->base;
}

static void tegra_crtc_atomic_destroy_state(struct drm_crtc *crtc,
struct drm_crtc_state *state)
{
__drm_atomic_helper_crtc_destroy_state(crtc, state);
kfree(state);
}

Expand Down

0 comments on commit 3b59b7a

Please sign in to comment.