*/
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);
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;
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",
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;
}
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;
}
.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)
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)
int encoder_type;
uint32_t possible_crtcs;
uint32_t possible_clones;
+ bool loader_protect;
struct drm_crtc *crtc;
struct drm_bridge *bridge;
* @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);