diff options
author | Archit Taneja <architt@codeaurora.org> | 2015-11-18 17:58:28 +0530 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2015-12-14 10:39:53 -0500 |
commit | af6d0423dfe33ca3bb9a0d1f50eb165b087fd88e (patch) | |
tree | 5b9fa3b0d4d4bcb6d0ab81f04ca30fe3df26cbb6 | |
parent | 9696acbcbf4048cc2462834bb692200f44e50f29 (diff) | |
download | linux-af6d0423dfe33ca3bb9a0d1f50eb165b087fd88e.tar.bz2 |
drm/msm/mdp4: Initialize DSI encoders
Create DSI encoders during modeset_init. The 2 encoders should ideally be
one command mode and one video mode DSI encoder respectively, but we don't
support command mode yet. We just create 2 of the same because the dsi
driver expects it, we end up using only the first one.
Signed-off-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c index ddfcc516af77..5a8e3d6bcbff 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c @@ -279,6 +279,8 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms, struct drm_encoder *encoder; struct drm_connector *connector; struct device_node *panel_node; + struct drm_encoder *dsi_encs[MSM_DSI_ENCODER_NUM]; + int i, dsi_id; int ret; switch (intf_type) { @@ -334,12 +336,41 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms, priv->encoders[priv->num_encoders++] = encoder; break; + case DRM_MODE_ENCODER_DSI: + /* only DSI1 supported for now */ + dsi_id = 0; + + if (!priv->dsi[dsi_id]) + break; + + for (i = 0; i < MSM_DSI_ENCODER_NUM; i++) { + dsi_encs[i] = mdp4_dsi_encoder_init(dev); + if (IS_ERR(dsi_encs[i])) { + ret = PTR_ERR(dsi_encs[i]); + dev_err(dev->dev, + "failed to construct DSI encoder: %d\n", + ret); + return ret; + } + + /* TODO: Add DMA_S later? */ + dsi_encs[i]->possible_crtcs = 1 << DMA_P; + priv->encoders[priv->num_encoders++] = dsi_encs[i]; + } + + ret = msm_dsi_modeset_init(priv->dsi[dsi_id], dev, dsi_encs); + if (ret) { + dev_err(dev->dev, "failed to initialize DSI: %d\n", + ret); + return ret; + } + + break; default: dev_err(dev->dev, "Invalid or unsupported interface\n"); return -EINVAL; } - return 0; } @@ -364,6 +395,7 @@ static int modeset_init(struct mdp4_kms *mdp4_kms) }; static const int mdp4_intfs[] = { DRM_MODE_ENCODER_LVDS, + DRM_MODE_ENCODER_DSI, DRM_MODE_ENCODER_TMDS, }; @@ -404,6 +436,9 @@ static int modeset_init(struct mdp4_kms *mdp4_kms) * we currently set up two relatively fixed paths: * * LCDC/LVDS path: RGB1 -> DMA_P -> LCDC -> LVDS + * or + * DSI path: RGB1 -> DMA_P -> DSI1 -> DSI Panel + * * DTV/HDMI path: RGB2 -> DMA_E -> DTV -> HDMI */ |