drm/rockchip: add loader_protect for logo display

Change-Id: I01583e402aafcfb6f676f3fcb27e7d6b5107f3dd
Signed-off-by: Sandy Huang <hjc@rock-chips.com>
This commit is contained in:
Sandy Huang 2019-07-01 17:01:53 +08:00
parent 40e53d1083
commit 513746512a
4 changed files with 42 additions and 0 deletions

View File

@ -921,6 +921,7 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
for_each_oldnew_connector_in_state(old_state, connector, old_conn_state, new_conn_state, i) {
const struct drm_encoder_helper_funcs *funcs;
const struct drm_connector_helper_funcs *conn_funcs;
struct drm_encoder *encoder;
/* Shut down everything that's in the changeset and currently
@ -947,12 +948,32 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
encoder->base.id, encoder->name);
conn_funcs = connector->helper_private;
if (connector->loader_protect) {
drm_bridge_pre_enable(encoder->bridge);
if (funcs->enable)
funcs->enable(encoder);
else
funcs->commit(encoder);
drm_bridge_enable(encoder->bridge);
if (conn_funcs->loader_protect)
conn_funcs->loader_protect(connector, false);
connector->loader_protect = false;
}
/*
* Each encoder has at most one connector (since we always steal
* it away), so we won't call disable hooks twice.
*/
drm_bridge_disable(encoder->bridge);
if (encoder->loader_protect) {
if (funcs->loader_protect)
funcs->loader_protect(encoder, false);
encoder->loader_protect = false;
}
/* Right function depends upon target state. */
if (funcs) {
if (new_conn_state->crtc && funcs->prepare)

View File

@ -984,6 +984,11 @@ struct drm_connector {
* need the CRTC driving this output, &drm_connector_state.crtc.
*/
struct drm_encoder *encoder;
/**
* @loader_protect:
* connector loader logo protect state.
*/
bool loader_protect;
#define MAX_ELD_BYTES 128
/** @eld: EDID-like data, if present */

View File

@ -166,6 +166,11 @@ struct drm_encoder {
*/
uint32_t possible_clones;
/**
* @loader_protect:
* encoder loader logo protect state.
*/
bool loader_protect;
/**
* @crtc: Currently bound CRTC, only really meaningful for non-atomic
* drivers. Atomic drivers should instead check

View File

@ -464,6 +464,11 @@ static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
* helpers and the new atomic modesetting helpers.
*/
struct drm_encoder_helper_funcs {
/**
* @loader_protect:
* protect loader logo encoder's power.
*/
int (*loader_protect)(struct drm_encoder *encoder, bool on);
/**
* @dpms:
*
@ -780,6 +785,12 @@ static inline void drm_encoder_helper_add(struct drm_encoder *encoder,
* probe helpers.
*/
struct drm_connector_helper_funcs {
/**
* @loader_protect:
*
* protect loader logo connector's power
*/
int (*loader_protect)(struct drm_connector *connector, bool on);
/**
* @get_modes:
*