static int modeset_init_intf(struct mdp5_kms *mdp5_kms, struct mdp5_interface *intf) { struct drm_device *dev = mdp5_kms->dev; struct msm_drm_private *priv = dev->dev_private; struct mdp5_ctl_manager *ctlm = mdp5_kms->ctlm; struct mdp5_ctl *ctl; struct drm_encoder *encoder; int ret = 0; switch (intf->type) { case INTF_eDP: if (!priv->edp) break; ctl = mdp5_ctlm_request(ctlm, intf->num); if (!ctl) { ret = -EINVAL; break; } encoder = construct_encoder(mdp5_kms, intf, ctl); if (IS_ERR(encoder)) { ret = PTR_ERR(encoder); break; } ret = msm_edp_modeset_init(priv->edp, dev, encoder); break; case INTF_HDMI: if (!priv->hdmi) break; ctl = mdp5_ctlm_request(ctlm, intf->num); if (!ctl) { ret = -EINVAL; break; } encoder = construct_encoder(mdp5_kms, intf, ctl); if (IS_ERR(encoder)) { ret = PTR_ERR(encoder); break; } ret = msm_hdmi_modeset_init(priv->hdmi, dev, encoder); break; case INTF_DSI: { const struct mdp5_cfg_hw *hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg); int dsi_id = get_dsi_id_from_intf(hw_cfg, intf->num); if ((dsi_id >= ARRAY_SIZE(priv->dsi)) || (dsi_id < 0)) { dev_err(dev->dev, "failed to find dsi from intf %d\n", intf->num); ret = -EINVAL; break; } if (!priv->dsi[dsi_id]) break; ctl = mdp5_ctlm_request(ctlm, intf->num); if (!ctl) { ret = -EINVAL; break; } encoder = construct_encoder(mdp5_kms, intf, ctl); if (IS_ERR(encoder)) { ret = PTR_ERR(encoder); break; } ret = msm_dsi_modeset_init(priv->dsi[dsi_id], dev, encoder); break; } default: dev_err(dev->dev, "unknown intf: %d\n", intf->type); ret = -EINVAL; break; } return ret; }
static int modeset_init_intf(struct mdp5_kms *mdp5_kms, int intf_num) { struct drm_device *dev = mdp5_kms->dev; struct msm_drm_private *priv = dev->dev_private; const struct mdp5_cfg_hw *hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg); enum mdp5_intf_type intf_type = hw_cfg->intf.connect[intf_num]; struct mdp5_ctl_manager *ctlm = mdp5_kms->ctlm; struct mdp5_ctl *ctl; struct drm_encoder *encoder; int ret = 0; switch (intf_type) { case INTF_DISABLED: break; case INTF_eDP: if (!priv->edp) break; ctl = mdp5_ctlm_request(ctlm, intf_num); if (!ctl) { ret = -EINVAL; break; } encoder = construct_encoder(mdp5_kms, INTF_eDP, intf_num, MDP5_INTF_MODE_NONE, ctl); if (IS_ERR(encoder)) { ret = PTR_ERR(encoder); break; } ret = msm_edp_modeset_init(priv->edp, dev, encoder); break; case INTF_HDMI: if (!priv->hdmi) break; ctl = mdp5_ctlm_request(ctlm, intf_num); if (!ctl) { ret = -EINVAL; break; } encoder = construct_encoder(mdp5_kms, INTF_HDMI, intf_num, MDP5_INTF_MODE_NONE, ctl); if (IS_ERR(encoder)) { ret = PTR_ERR(encoder); break; } ret = msm_hdmi_modeset_init(priv->hdmi, dev, encoder); break; case INTF_DSI: { int dsi_id = get_dsi_id_from_intf(hw_cfg, intf_num); struct drm_encoder *dsi_encs[MSM_DSI_ENCODER_NUM]; enum mdp5_intf_mode mode; int i; if ((dsi_id >= ARRAY_SIZE(priv->dsi)) || (dsi_id < 0)) { dev_err(dev->dev, "failed to find dsi from intf %d\n", intf_num); ret = -EINVAL; break; } if (!priv->dsi[dsi_id]) break; ctl = mdp5_ctlm_request(ctlm, intf_num); if (!ctl) { ret = -EINVAL; break; } for (i = 0; i < MSM_DSI_ENCODER_NUM; i++) { mode = (i == MSM_DSI_CMD_ENCODER_ID) ? MDP5_INTF_DSI_MODE_COMMAND : MDP5_INTF_DSI_MODE_VIDEO; dsi_encs[i] = construct_encoder(mdp5_kms, INTF_DSI, intf_num, mode, ctl); if (IS_ERR(dsi_encs[i])) { ret = PTR_ERR(dsi_encs[i]); break; } } ret = msm_dsi_modeset_init(priv->dsi[dsi_id], dev, dsi_encs); break; } default: dev_err(dev->dev, "unknown intf: %d\n", intf_type); ret = -EINVAL; break; } return ret; }