diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2013-09-17 13:53:23 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-09-25 19:53:40 -0400 |
commit | 099326d8cde12b4aa056fbb3ee05d78e5629df02 (patch) | |
tree | 7e5f9e51a14196478e5aaac12212619b5f1a7bd4 | |
parent | 5e8c3d3e41b0bf241e830a1ee0752405adecc050 (diff) |
staging: imx-drm: Fix probe failure
Since commit b5dc0d10 (drm/imx: kill firstopen callback) the following probe
failure is seen:
[drm] Supports vblank timestamp caching Rev 1 (10.10.2010).
[drm] No driver support for vblank timestamp query.
[drm] Initialized imx-drm 1.0.0 20120507 on minor 0
imx-ldb ldb.10: adding encoder failed with -16
imx-ldb: probe of ldb.10 failed with error -16
imx-ipuv3 2400000.ipu: IPUv3H probed
imx-ipuv3 2800000.ipu: IPUv3H probed
imx-ipuv3-crtc imx-ipuv3-crtc.0: adding crtc failed with -16.
imx-ipuv3-crtc: probe of imx-ipuv3-crtc.0 failed with error -16
imx-ipuv3-crtc imx-ipuv3-crtc.1: adding crtc failed with -16.
imx-ipuv3-crtc: probe of imx-ipuv3-crtc.1 failed with error -16
imx-ipuv3-crtc imx-ipuv3-crtc.2: adding crtc failed with -16.
imx-ipuv3-crtc: probe of imx-ipuv3-crtc.2 failed with error -16
imx-ipuv3-crtc imx-ipuv3-crtc.3: adding crtc failed with -16.
imx-ipuv3-crtc: probe of imx-ipuv3-crtc.3 failed with error -16
The reason for the probe failure is that now 'imxdrm->references' is incremented
early in imx_drm_driver_load(), so the following checks in imx_drm_add_crtc()
and imx_drm_add_encoder():
if (imxdrm->references) {
ret = -EBUSY;
goto err_busy;
}
,will always fail.
Instead of manually keeping the references in the imx-drm driver, let's use
drm->open_count.
After this patch, lvds panel is functional on a mx6qsabrelite board.
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/imx-drm/imx-drm-core.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c index 47c5888461ff..a2e52a0c53c9 100644 --- a/drivers/staging/imx-drm/imx-drm-core.c +++ b/drivers/staging/imx-drm/imx-drm-core.c | |||
@@ -41,7 +41,6 @@ struct imx_drm_device { | |||
41 | struct list_head encoder_list; | 41 | struct list_head encoder_list; |
42 | struct list_head connector_list; | 42 | struct list_head connector_list; |
43 | struct mutex mutex; | 43 | struct mutex mutex; |
44 | int references; | ||
45 | int pipes; | 44 | int pipes; |
46 | struct drm_fbdev_cma *fbhelper; | 45 | struct drm_fbdev_cma *fbhelper; |
47 | }; | 46 | }; |
@@ -241,8 +240,6 @@ struct drm_device *imx_drm_device_get(void) | |||
241 | } | 240 | } |
242 | } | 241 | } |
243 | 242 | ||
244 | imxdrm->references++; | ||
245 | |||
246 | return imxdrm->drm; | 243 | return imxdrm->drm; |
247 | 244 | ||
248 | unwind_crtc: | 245 | unwind_crtc: |
@@ -280,8 +277,6 @@ void imx_drm_device_put(void) | |||
280 | list_for_each_entry(enc, &imxdrm->encoder_list, list) | 277 | list_for_each_entry(enc, &imxdrm->encoder_list, list) |
281 | module_put(enc->owner); | 278 | module_put(enc->owner); |
282 | 279 | ||
283 | imxdrm->references--; | ||
284 | |||
285 | mutex_unlock(&imxdrm->mutex); | 280 | mutex_unlock(&imxdrm->mutex); |
286 | } | 281 | } |
287 | EXPORT_SYMBOL_GPL(imx_drm_device_put); | 282 | EXPORT_SYMBOL_GPL(imx_drm_device_put); |
@@ -485,7 +480,7 @@ int imx_drm_add_crtc(struct drm_crtc *crtc, | |||
485 | 480 | ||
486 | mutex_lock(&imxdrm->mutex); | 481 | mutex_lock(&imxdrm->mutex); |
487 | 482 | ||
488 | if (imxdrm->references) { | 483 | if (imxdrm->drm->open_count) { |
489 | ret = -EBUSY; | 484 | ret = -EBUSY; |
490 | goto err_busy; | 485 | goto err_busy; |
491 | } | 486 | } |
@@ -564,7 +559,7 @@ int imx_drm_add_encoder(struct drm_encoder *encoder, | |||
564 | 559 | ||
565 | mutex_lock(&imxdrm->mutex); | 560 | mutex_lock(&imxdrm->mutex); |
566 | 561 | ||
567 | if (imxdrm->references) { | 562 | if (imxdrm->drm->open_count) { |
568 | ret = -EBUSY; | 563 | ret = -EBUSY; |
569 | goto err_busy; | 564 | goto err_busy; |
570 | } | 565 | } |
@@ -709,7 +704,7 @@ int imx_drm_add_connector(struct drm_connector *connector, | |||
709 | 704 | ||
710 | mutex_lock(&imxdrm->mutex); | 705 | mutex_lock(&imxdrm->mutex); |
711 | 706 | ||
712 | if (imxdrm->references) { | 707 | if (imxdrm->drm->open_count) { |
713 | ret = -EBUSY; | 708 | ret = -EBUSY; |
714 | goto err_busy; | 709 | goto err_busy; |
715 | } | 710 | } |