aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorArchit Taneja <architt@codeaurora.org>2015-11-18 07:28:28 -0500
committerRob Clark <robdclark@gmail.com>2015-12-14 10:39:53 -0500
commitaf6d0423dfe33ca3bb9a0d1f50eb165b087fd88e (patch)
tree5b9fa3b0d4d4bcb6d0ab81f04ca30fe3df26cbb6 /drivers
parent9696acbcbf4048cc2462834bb692200f44e50f29 (diff)
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c37
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,
279 struct drm_encoder *encoder; 279 struct drm_encoder *encoder;
280 struct drm_connector *connector; 280 struct drm_connector *connector;
281 struct device_node *panel_node; 281 struct device_node *panel_node;
282 struct drm_encoder *dsi_encs[MSM_DSI_ENCODER_NUM];
283 int i, dsi_id;
282 int ret; 284 int ret;
283 285
284 switch (intf_type) { 286 switch (intf_type) {
@@ -334,12 +336,41 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
334 priv->encoders[priv->num_encoders++] = encoder; 336 priv->encoders[priv->num_encoders++] = encoder;
335 337
336 break; 338 break;
339 case DRM_MODE_ENCODER_DSI:
340 /* only DSI1 supported for now */
341 dsi_id = 0;
342
343 if (!priv->dsi[dsi_id])
344 break;
345
346 for (i = 0; i < MSM_DSI_ENCODER_NUM; i++) {
347 dsi_encs[i] = mdp4_dsi_encoder_init(dev);
348 if (IS_ERR(dsi_encs[i])) {
349 ret = PTR_ERR(dsi_encs[i]);
350 dev_err(dev->dev,
351 "failed to construct DSI encoder: %d\n",
352 ret);
353 return ret;
354 }
355
356 /* TODO: Add DMA_S later? */
357 dsi_encs[i]->possible_crtcs = 1 << DMA_P;
358 priv->encoders[priv->num_encoders++] = dsi_encs[i];
359 }
360
361 ret = msm_dsi_modeset_init(priv->dsi[dsi_id], dev, dsi_encs);
362 if (ret) {
363 dev_err(dev->dev, "failed to initialize DSI: %d\n",
364 ret);
365 return ret;
366 }
367
368 break;
337 default: 369 default:
338 dev_err(dev->dev, "Invalid or unsupported interface\n"); 370 dev_err(dev->dev, "Invalid or unsupported interface\n");
339 return -EINVAL; 371 return -EINVAL;
340 } 372 }
341 373
342
343 return 0; 374 return 0;
344} 375}
345 376
@@ -364,6 +395,7 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
364 }; 395 };
365 static const int mdp4_intfs[] = { 396 static const int mdp4_intfs[] = {
366 DRM_MODE_ENCODER_LVDS, 397 DRM_MODE_ENCODER_LVDS,
398 DRM_MODE_ENCODER_DSI,
367 DRM_MODE_ENCODER_TMDS, 399 DRM_MODE_ENCODER_TMDS,
368 }; 400 };
369 401
@@ -404,6 +436,9 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
404 * we currently set up two relatively fixed paths: 436 * we currently set up two relatively fixed paths:
405 * 437 *
406 * LCDC/LVDS path: RGB1 -> DMA_P -> LCDC -> LVDS 438 * LCDC/LVDS path: RGB1 -> DMA_P -> LCDC -> LVDS
439 * or
440 * DSI path: RGB1 -> DMA_P -> DSI1 -> DSI Panel
441 *
407 * DTV/HDMI path: RGB2 -> DMA_E -> DTV -> HDMI 442 * DTV/HDMI path: RGB2 -> DMA_E -> DTV -> HDMI
408 */ 443 */
409 444