drm/msm/dpu: handle failures while initializing displays
Bail out KMS hw init on display initialization failures with proper error logging. changes in v3: - introduced in the series changes in v4: - avoid duplicate return on errors (Sean Paul) - avoid spamming errors on failures (Jordon Crouse) Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org> Signed-off-by: Sean Paul <seanpaul@chromium.org>
This commit is contained in:
parent
9b9c8e7e82
commit
a802ee99c4
@ -405,35 +405,38 @@ static void dpu_kms_wait_for_commit_done(struct msm_kms *kms,
|
||||
}
|
||||
}
|
||||
|
||||
static void _dpu_kms_initialize_dsi(struct drm_device *dev,
|
||||
static int _dpu_kms_initialize_dsi(struct drm_device *dev,
|
||||
struct msm_drm_private *priv,
|
||||
struct dpu_kms *dpu_kms)
|
||||
{
|
||||
struct drm_encoder *encoder = NULL;
|
||||
int i, rc;
|
||||
int i, rc = 0;
|
||||
|
||||
if (!(priv->dsi[0] || priv->dsi[1]))
|
||||
return rc;
|
||||
|
||||
/*TODO: Support two independent DSI connectors */
|
||||
encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI);
|
||||
if (IS_ERR_OR_NULL(encoder)) {
|
||||
if (IS_ERR(encoder)) {
|
||||
DPU_ERROR("encoder init failed for dsi display\n");
|
||||
return;
|
||||
return PTR_ERR(encoder);
|
||||
}
|
||||
|
||||
priv->encoders[priv->num_encoders++] = encoder;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(priv->dsi); i++) {
|
||||
if (!priv->dsi[i]) {
|
||||
DPU_DEBUG("invalid msm_dsi for ctrl %d\n", i);
|
||||
return;
|
||||
}
|
||||
if (!priv->dsi[i])
|
||||
continue;
|
||||
|
||||
rc = msm_dsi_modeset_init(priv->dsi[i], dev, encoder);
|
||||
if (rc) {
|
||||
DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n",
|
||||
i, rc);
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -444,16 +447,16 @@ static void _dpu_kms_initialize_dsi(struct drm_device *dev,
|
||||
* @dpu_kms: Pointer to dpu kms structure
|
||||
* Returns: Zero on success
|
||||
*/
|
||||
static void _dpu_kms_setup_displays(struct drm_device *dev,
|
||||
static int _dpu_kms_setup_displays(struct drm_device *dev,
|
||||
struct msm_drm_private *priv,
|
||||
struct dpu_kms *dpu_kms)
|
||||
{
|
||||
_dpu_kms_initialize_dsi(dev, priv, dpu_kms);
|
||||
|
||||
/**
|
||||
* Extend this function to initialize other
|
||||
* types of displays
|
||||
*/
|
||||
|
||||
return _dpu_kms_initialize_dsi(dev, priv, dpu_kms);
|
||||
}
|
||||
|
||||
static void _dpu_kms_drm_obj_destroy(struct dpu_kms *dpu_kms)
|
||||
@ -516,7 +519,9 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
|
||||
* Create encoder and query display drivers to create
|
||||
* bridges and connectors
|
||||
*/
|
||||
_dpu_kms_setup_displays(dev, priv, dpu_kms);
|
||||
ret = _dpu_kms_setup_displays(dev, priv, dpu_kms);
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
max_crtc_count = min(catalog->mixer_count, priv->num_encoders);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user