drm/rockchip: add loader protect for encoder

Change-Id: I9fa1e949a55d8778b44ff809630337d5d35ffa11
Signed-off-by: Huang Jiachai <hjc@rock-chips.com>
This commit is contained in:
Huang Jiachai 2017-07-27 15:23:31 +08:00 committed by Huang, Tao
parent bc85c7c3f1
commit b05ec6d240
5 changed files with 33 additions and 8 deletions

View File

@ -628,6 +628,11 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
*/
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 (connector->state->crtc && funcs->prepare)
funcs->prepare(encoder);

View File

@ -344,6 +344,7 @@ int setup_initial_state(struct drm_device *drm_dev,
struct drm_plane_state *primary_state;
struct drm_display_mode *mode = NULL;
const struct drm_connector_helper_funcs *funcs;
const struct drm_encoder_helper_funcs *encoder_funcs;
bool is_crtc_enabled = true;
int hdisplay, vdisplay;
int fb_width, fb_height;
@ -363,6 +364,10 @@ int setup_initial_state(struct drm_device *drm_dev,
if (funcs->loader_protect)
funcs->loader_protect(connector, true);
connector->loader_protect = true;
encoder_funcs = conn_state->best_encoder->helper_private;
if (encoder_funcs->loader_protect)
encoder_funcs->loader_protect(conn_state->best_encoder, true);
conn_state->best_encoder->loader_protect = true;
num_modes = connector->funcs->fill_modes(connector, 4096, 4096);
if (!num_modes) {
dev_err(drm_dev->dev, "connector[%s] can't found any modes\n",
@ -472,6 +477,9 @@ int setup_initial_state(struct drm_device *drm_dev,
if (funcs->loader_protect)
funcs->loader_protect(connector, false);
connector->loader_protect = false;
if (encoder_funcs->loader_protect)
encoder_funcs->loader_protect(conn_state->best_encoder, false);
conn_state->best_encoder->loader_protect = false;
return ret;
}

View File

@ -429,19 +429,15 @@ static enum drm_mode_status rockchip_lvds_connector_mode_valid(
return MODE_OK;
}
static int rockchip_lvds_loader_protect(struct drm_connector *connector,
bool on)
static
int rockchip_lvds_connector_loader_protect(struct drm_connector *connector,
bool on)
{
struct rockchip_lvds *lvds = connector_to_lvds(connector);
if (lvds->panel)
drm_panel_loader_protect(lvds->panel, on);
if (on)
pm_runtime_get_sync(lvds->dev);
else
pm_runtime_put(lvds->dev);
return 0;
}
@ -450,7 +446,7 @@ struct drm_connector_helper_funcs rockchip_lvds_connector_helper_funcs = {
.get_modes = rockchip_lvds_connector_get_modes,
.mode_valid = rockchip_lvds_connector_mode_valid,
.best_encoder = rockchip_lvds_connector_best_encoder,
.loader_protect = rockchip_lvds_loader_protect,
.loader_protect = rockchip_lvds_connector_loader_protect,
};
static void rockchip_lvds_encoder_dpms(struct drm_encoder *encoder, int mode)
@ -655,12 +651,26 @@ static void rockchip_lvds_encoder_disable(struct drm_encoder *encoder)
rockchip_lvds_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
}
static int rockchip_lvds_encoder_loader_protect(struct drm_encoder *encoder,
bool on)
{
struct rockchip_lvds *lvds = encoder_to_lvds(encoder);
if (on)
pm_runtime_get_sync(lvds->dev);
else
pm_runtime_put(lvds->dev);
return 0;
}
static struct drm_encoder_helper_funcs rockchip_lvds_encoder_helper_funcs = {
.mode_fixup = rockchip_lvds_encoder_mode_fixup,
.mode_set = rockchip_lvds_encoder_mode_set,
.enable = rockchip_lvds_encoder_enable,
.disable = rockchip_lvds_encoder_disable,
.atomic_check = rockchip_lvds_encoder_atomic_check,
.loader_protect = rockchip_lvds_encoder_loader_protect,
};
static void rockchip_lvds_encoder_destroy(struct drm_encoder *encoder)

View File

@ -745,6 +745,7 @@ struct drm_encoder {
int encoder_type;
uint32_t possible_crtcs;
uint32_t possible_clones;
bool loader_protect;
struct drm_crtc *crtc;
struct drm_bridge *bridge;

View File

@ -139,6 +139,7 @@ struct drm_crtc_helper_funcs {
* @mode_set (like shared PLLs).
*/
struct drm_encoder_helper_funcs {
int (*loader_protect)(struct drm_encoder *encoder, bool on);
void (*dpms)(struct drm_encoder *encoder, int mode);
void (*save)(struct drm_encoder *encoder);
void (*restore)(struct drm_encoder *encoder);