aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/rcar-du
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2014-12-10 18:26:04 -0500
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2014-12-23 05:01:48 -0500
commit347d761c74f75d55a36350ae7505498bd56b33ec (patch)
tree6f608cba5fd2960c2dd35dafdc6b505f470f0339 /drivers/gpu/drm/rcar-du
parent3b2b36e5f0ba60f5a7a770ab1bae3264b8d090b8 (diff)
drm: rcar-du: Don't fail probe in case of partial encoder init error
If an encoder fails to initialize the device can still be used without the failed encoder. Don't propagate the error out of the probe function but just skip the failed encoder. As a special case a deferred probe request from the encoder is still propagated out of the probe function in order not to break the deferred probing mechanism. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Diffstat (limited to 'drivers/gpu/drm/rcar-du')
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_encoder.c28
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_kms.c15
2 files changed, 34 insertions, 9 deletions
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
index 34a122a39664..7c74ecf2ca67 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
@@ -193,32 +193,46 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu,
193 if (renc->lvds) { 193 if (renc->lvds) {
194 dev_err(rcdu->dev, 194 dev_err(rcdu->dev,
195 "Chaining LVDS and HDMI encoders not supported\n"); 195 "Chaining LVDS and HDMI encoders not supported\n");
196 return -EINVAL; 196 ret = -EINVAL;
197 goto done;
197 } 198 }
198 199
199 ret = rcar_du_hdmienc_init(rcdu, renc, enc_node); 200 ret = rcar_du_hdmienc_init(rcdu, renc, enc_node);
200 if (ret < 0) 201 if (ret < 0)
201 return ret; 202 goto done;
202 } else { 203 } else {
203 ret = drm_encoder_init(rcdu->ddev, encoder, &encoder_funcs, 204 ret = drm_encoder_init(rcdu->ddev, encoder, &encoder_funcs,
204 encoder_type); 205 encoder_type);
205 if (ret < 0) 206 if (ret < 0)
206 return ret; 207 goto done;
207 208
208 drm_encoder_helper_add(encoder, &encoder_helper_funcs); 209 drm_encoder_helper_add(encoder, &encoder_helper_funcs);
209 } 210 }
210 211
211 switch (encoder_type) { 212 switch (encoder_type) {
212 case DRM_MODE_ENCODER_LVDS: 213 case DRM_MODE_ENCODER_LVDS:
213 return rcar_du_lvds_connector_init(rcdu, renc, con_node); 214 ret = rcar_du_lvds_connector_init(rcdu, renc, con_node);
215 break;
214 216
215 case DRM_MODE_ENCODER_DAC: 217 case DRM_MODE_ENCODER_DAC:
216 return rcar_du_vga_connector_init(rcdu, renc); 218 ret = rcar_du_vga_connector_init(rcdu, renc);
219 break;
217 220
218 case DRM_MODE_ENCODER_TMDS: 221 case DRM_MODE_ENCODER_TMDS:
219 return rcar_du_hdmi_connector_init(rcdu, renc); 222 ret = rcar_du_hdmi_connector_init(rcdu, renc);
223 break;
220 224
221 default: 225 default:
222 return -EINVAL; 226 ret = -EINVAL;
227 break;
223 } 228 }
229
230done:
231 if (ret < 0) {
232 if (encoder->name)
233 encoder->funcs->destroy(encoder);
234 devm_kfree(rcdu->dev, renc);
235 }
236
237 return ret;
224} 238}
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
index 0c5ee616b5a3..cc9136e8ee9c 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
@@ -346,8 +346,14 @@ static int rcar_du_encoders_init(struct rcar_du_device *rcdu)
346 /* Process the output pipeline. */ 346 /* Process the output pipeline. */
347 ret = rcar_du_encoders_init_one(rcdu, output, &ep); 347 ret = rcar_du_encoders_init_one(rcdu, output, &ep);
348 if (ret < 0) { 348 if (ret < 0) {
349 of_node_put(ep_node); 349 if (ret == -EPROBE_DEFER) {
350 return ret; 350 of_node_put(ep_node);
351 return ret;
352 }
353
354 dev_info(rcdu->dev,
355 "encoder initialization failed, skipping\n");
356 continue;
351 } 357 }
352 358
353 num_encoders += ret; 359 num_encoders += ret;
@@ -413,6 +419,11 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
413 if (ret < 0) 419 if (ret < 0)
414 return ret; 420 return ret;
415 421
422 if (ret == 0) {
423 dev_err(rcdu->dev, "error: no encoder could be initialized\n");
424 return -EINVAL;
425 }
426
416 num_encoders = ret; 427 num_encoders = ret;
417 428
418 /* Set the possible CRTCs and possible clones. There's always at least 429 /* Set the possible CRTCs and possible clones. There's always at least