On Mon, Dec 17, 2018 at 02:35:04PM -0800, Jeykumar Sankaran wrote: > 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@xxxxxxxxxxxxxx> Pushed this one too, so just the 3/3 patch should go with Chandan's series Sean > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 31 ++++++++++++++++++------------- > 1 file changed, 18 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index d39b745..885bf88 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -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); > > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project > -- Sean Paul, Software Engineer, Google / Chromium OS