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); }
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); }
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); }
static int rcar_du_hdmi_connector_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) { struct rcar_du_connector *rcon = to_rcar_connector(connector); unsigned int max_width, max_height; bool laced; max_width = rcon->encoder->dev->info->max_xres; max_height = rcon->encoder->dev->info->max_yres; laced = rcon->encoder->dev->info->interlace; if (mode->clock > 165000) return MODE_CLOCK_HIGH; if ((mode->hdisplay * mode->vdisplay) > (max_width * max_height)) return MODE_BAD_WIDTH; if (((mode->hdisplay * mode->vdisplay) == (max_width * max_height)) && (laced) && (!(mode->flags & DRM_MODE_FLAG_INTERLACE))) return MODE_BAD; return MODE_OK; }