diff options
Diffstat (limited to 'drivers/gpu/drm/drm_simple_kms_helper.c')
| -rw-r--r-- | drivers/gpu/drm/drm_simple_kms_helper.c | 50 | 
1 files changed, 44 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c index 6ce8f5cd1eb5..0b095a313c44 100644 --- a/drivers/gpu/drm/drm_simple_kms_helper.c +++ b/drivers/gpu/drm/drm_simple_kms_helper.c @@ -177,14 +177,16 @@ static const struct drm_crtc_funcs drm_simple_kms_crtc_funcs = {  };  static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane, -					struct drm_plane_state *plane_state) +					struct drm_atomic_state *state)  { +	struct drm_plane_state *plane_state = drm_atomic_get_new_plane_state(state, +									     plane);  	struct drm_simple_display_pipe *pipe;  	struct drm_crtc_state *crtc_state;  	int ret;  	pipe = container_of(plane, struct drm_simple_display_pipe, plane); -	crtc_state = drm_atomic_get_new_crtc_state(plane_state->state, +	crtc_state = drm_atomic_get_new_crtc_state(state,  						   &pipe->crtc);  	ret = drm_atomic_helper_check_plane_state(plane_state, crtc_state, @@ -204,8 +206,10 @@ static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane,  }  static void drm_simple_kms_plane_atomic_update(struct drm_plane *plane, -					struct drm_plane_state *old_pstate) +					struct drm_atomic_state *state)  { +	struct drm_plane_state *old_pstate = drm_atomic_get_old_plane_state(state, +									    plane);  	struct drm_simple_display_pipe *pipe;  	pipe = container_of(plane, struct drm_simple_display_pipe, plane); @@ -253,13 +257,47 @@ static const struct drm_plane_helper_funcs drm_simple_kms_plane_helper_funcs = {  	.atomic_update = drm_simple_kms_plane_atomic_update,  }; +static void drm_simple_kms_plane_reset(struct drm_plane *plane) +{ +	struct drm_simple_display_pipe *pipe; + +	pipe = container_of(plane, struct drm_simple_display_pipe, plane); +	if (!pipe->funcs || !pipe->funcs->reset_plane) +		return drm_atomic_helper_plane_reset(plane); + +	return pipe->funcs->reset_plane(pipe); +} + +static struct drm_plane_state *drm_simple_kms_plane_duplicate_state(struct drm_plane *plane) +{ +	struct drm_simple_display_pipe *pipe; + +	pipe = container_of(plane, struct drm_simple_display_pipe, plane); +	if (!pipe->funcs || !pipe->funcs->duplicate_plane_state) +		return drm_atomic_helper_plane_duplicate_state(plane); + +	return pipe->funcs->duplicate_plane_state(pipe); +} + +static void drm_simple_kms_plane_destroy_state(struct drm_plane *plane, +					       struct drm_plane_state *state) +{ +	struct drm_simple_display_pipe *pipe; + +	pipe = container_of(plane, struct drm_simple_display_pipe, plane); +	if (!pipe->funcs || !pipe->funcs->destroy_plane_state) +		drm_atomic_helper_plane_destroy_state(plane, state); +	else +		pipe->funcs->destroy_plane_state(pipe, state); +} +  static const struct drm_plane_funcs drm_simple_kms_plane_funcs = {  	.update_plane		= drm_atomic_helper_update_plane,  	.disable_plane		= drm_atomic_helper_disable_plane,  	.destroy		= drm_plane_cleanup, -	.reset			= drm_atomic_helper_plane_reset, -	.atomic_duplicate_state	= drm_atomic_helper_plane_duplicate_state, -	.atomic_destroy_state	= drm_atomic_helper_plane_destroy_state, +	.reset			= drm_simple_kms_plane_reset, +	.atomic_duplicate_state	= drm_simple_kms_plane_duplicate_state, +	.atomic_destroy_state	= drm_simple_kms_plane_destroy_state,  	.format_mod_supported   = drm_simple_kms_format_mod_supported,  }; | 
