diff options
author | Archit Taneja <architt@codeaurora.org> | 2015-11-18 07:28:28 -0500 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2015-12-14 10:39:53 -0500 |
commit | af6d0423dfe33ca3bb9a0d1f50eb165b087fd88e (patch) | |
tree | 5b9fa3b0d4d4bcb6d0ab81f04ca30fe3df26cbb6 /drivers | |
parent | 9696acbcbf4048cc2462834bb692200f44e50f29 (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.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, | |||
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 | ||