Exemple #1
0
static int rcar_du_hdmi_connector_get_modes(struct drm_connector *connector)
{
	struct rcar_du_connector *con = to_rcar_connector(connector);
	struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(con->encoder);
	struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

	if (sfuncs->get_modes == NULL)
		return 0;

	return sfuncs->get_modes(encoder, connector);
}
Exemple #2
0
static bool rcar_du_hdmienc_mode_fixup(struct drm_encoder *encoder,
				       const struct drm_display_mode *mode,
				       struct drm_display_mode *adjusted_mode)
{
	struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

	if (sfuncs->mode_fixup == NULL)
		return true;

	return sfuncs->mode_fixup(encoder, mode, adjusted_mode);
}
Exemple #3
0
static enum drm_connector_status
rcar_du_hdmi_connector_detect(struct drm_connector *connector, bool force)
{
	struct rcar_du_connector *con = to_rcar_connector(connector);
	struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(con->encoder);
	struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

	if (sfuncs->detect == NULL)
		return connector_status_unknown;

	return sfuncs->detect(encoder, connector);
}
Exemple #4
0
static int rcar_du_hdmi_connector_mode_valid(struct drm_connector *connector,
					     struct drm_display_mode *mode)
{
	struct rcar_du_connector *con = to_rcar_connector(connector);
	struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(con->encoder);
	struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

	if (sfuncs->mode_valid == NULL)
		return MODE_OK;

	return sfuncs->mode_valid(encoder, mode);
}
Exemple #5
0
static void rcar_du_hdmienc_mode_set(struct drm_encoder *encoder,
				     struct drm_display_mode *mode,
				     struct drm_display_mode *adjusted_mode)
{
	struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
	struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

	if (sfuncs->mode_set)
		sfuncs->mode_set(encoder, mode, adjusted_mode);

	rcar_du_crtc_route_output(encoder->crtc, hdmienc->renc->output);
}
Exemple #6
0
static void rcar_du_hdmienc_dpms(struct drm_encoder *encoder, int mode)
{
	struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
	struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

	if (hdmienc->dpms == mode)
		return;

	if (sfuncs->dpms)
		sfuncs->dpms(encoder, mode);

	hdmienc->dpms = mode;
}
Exemple #7
0
static void rcar_du_hdmienc_enable(struct drm_encoder *encoder)
{
	struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
	struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

	if (hdmienc->renc->lvds)
		rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc,
				       true);

	if (sfuncs->dpms)
		sfuncs->dpms(encoder, DRM_MODE_DPMS_ON);

	hdmienc->enabled = true;
}
Exemple #8
0
static int rcar_du_hdmienc_atomic_check(struct drm_encoder *encoder,
					struct drm_crtc_state *crtc_state,
					struct drm_connector_state *conn_state)
{
	struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
	struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);
	struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
	const struct drm_display_mode *mode = &crtc_state->mode;

	/* The internal LVDS encoder has a clock frequency operating range of
	 * 30MHz to 150MHz. Clamp the clock accordingly.
	 */
	if (hdmienc->renc->lvds)
		adjusted_mode->clock = clamp(adjusted_mode->clock,
					     30000, 150000);

	if (sfuncs->mode_fixup == NULL)
		return 0;

	return sfuncs->mode_fixup(encoder, mode, adjusted_mode) ? 0 : -EINVAL;
}