int tilcdc_add_component_encoder(struct drm_device *ddev) { struct tilcdc_drm_private *priv = ddev->dev_private; struct drm_connector *connector; struct drm_encoder *encoder; list_for_each_entry(encoder, &ddev->mode_config.encoder_list, head) if (encoder->possible_crtcs & (1 << priv->crtc->index)) break; if (!encoder) { dev_err(ddev->dev, "%s: No suitable encoder found\n", __func__); return -ENODEV; } connector = tilcdc_encoder_find_connector(ddev, encoder); if (!connector) return -ENODEV; /* Only tda998x is supported at the moment. */ tilcdc_crtc_set_simulate_vesa_sync(priv->crtc, true); tilcdc_crtc_set_panel_info(priv->crtc, &panel_info_tda998x); return tilcdc_add_external_connector(ddev, connector); }
static int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge) { struct tilcdc_drm_private *priv = ddev->dev_private; struct drm_connector *connector; int ret; priv->external_encoder->possible_crtcs = BIT(0); priv->external_encoder->bridge = bridge; bridge->encoder = priv->external_encoder; ret = drm_bridge_attach(ddev, bridge); if (ret) { dev_err(ddev->dev, "drm_bridge_attach() failed %d\n", ret); return ret; } tilcdc_crtc_set_panel_info(priv->crtc, &panel_info_default); connector = tilcdc_encoder_find_connector(ddev, priv->external_encoder); if (!connector) return -ENODEV; ret = tilcdc_add_external_connector(ddev, connector); return ret; }
static int panel_modeset_init(struct tilcdc_module *mod, struct drm_device *dev) { struct panel_module *panel_mod = to_panel_module(mod); struct tilcdc_drm_private *priv = dev->dev_private; struct drm_encoder *encoder; struct drm_connector *connector; encoder = panel_encoder_create(dev, panel_mod); if (!encoder) return -ENOMEM; connector = panel_connector_create(dev, panel_mod, encoder); if (!connector) return -ENOMEM; priv->encoders[priv->num_encoders++] = encoder; priv->connectors[priv->num_connectors++] = connector; tilcdc_crtc_set_panel_info(priv->crtc, to_panel_encoder(encoder)->mod->info); return 0; }
static void panel_encoder_prepare(struct drm_encoder *encoder) { struct panel_encoder *panel_encoder = to_panel_encoder(encoder); panel_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); tilcdc_crtc_set_panel_info(encoder->crtc, panel_encoder->mod->info); }