Unverified Commit f7e974a3 authored by Jernej Skrabec's avatar Jernej Skrabec Committed by Maxime Ripard
Browse files

sun4i/drm: engine: Add mode_set callback



This optional callback is useful for setting properties which depends
only on current mode. Such properties are width, height and interlaced
output.

These properties are currently set in update layer callback for primary
plane which is less than ideal. More about that in follow up patches,
which will migrate that code to this newly defined callback.

Signed-off-by: default avatarJernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: default avatarSamuel Holland <samuel@sholland.org>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20220424162633.12369-7-samuel@sholland.org
parent 7d57f7f7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -146,6 +146,7 @@ static void sun4i_crtc_mode_set_nofb(struct drm_crtc *crtc)
	struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);

	sun4i_tcon_mode_set(scrtc->tcon, encoder, mode);
	sunxi_engine_mode_set(scrtc->engine, mode);
}

static const struct drm_crtc_helper_funcs sun4i_crtc_helper_funcs = {
+27 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
struct drm_plane;
struct drm_device;
struct drm_crtc_state;
struct drm_display_mode;

struct sunxi_engine;

@@ -108,6 +109,17 @@ struct sunxi_engine_ops {
	 * This function is optional.
	 */
	void (*vblank_quirk)(struct sunxi_engine *engine);

	/**
	 * @mode_set
	 *
	 * This callback is used to set mode related parameters
	 * like interlacing, screen size, etc. once per mode set.
	 *
	 * This function is optional.
	 */
	void (*mode_set)(struct sunxi_engine *engine,
			 const struct drm_display_mode *mode);
};

/**
@@ -181,4 +193,19 @@ sunxi_engine_disable_color_correction(struct sunxi_engine *engine)
	if (engine->ops && engine->ops->disable_color_correction)
		engine->ops->disable_color_correction(engine);
}

/**
 * sunxi_engine_mode_set - Inform engine of a new mode
 * @engine:	pointer to the engine
 * @mode:	new mode
 *
 * Engine can use this functionality to set specifics once per mode change.
 */
static inline void
sunxi_engine_mode_set(struct sunxi_engine *engine,
		      const struct drm_display_mode *mode)
{
	if (engine->ops && engine->ops->mode_set)
		engine->ops->mode_set(engine, mode);
}
#endif /* _SUNXI_ENGINE_H_ */