diff mbox series

[1/2] drm/rockchip: dsi: Clean up 'usage_mode' when failing to attach

Message ID 20221019170255.1.Ia68dfb27b835d31d22bfe23812baf366ee1c6eac@changeid (mailing list archive)
State New, archived
Headers show
Series [1/2] drm/rockchip: dsi: Clean up 'usage_mode' when failing to attach | expand

Commit Message

Brian Norris Oct. 20, 2022, 12:03 a.m. UTC
If we fail to attach the first time (especially: EPROBE_DEFER), we fail
to clean up 'usage_mode', and thus will fail to attach on any subsequent
attempts, with "dsi controller already in use".

Re-set to DW_DSI_USAGE_IDLE on attach failure.

This is especially common to hit when enabling asynchronous probe on a
duel-DSI system (such as RK3399 Gru/Scarlet), such that we're more
likely to fail dw_mipi_dsi_rockchip_find_second() the first time.

Fixes: 71f68fe7f121 ("drm/rockchip: dsi: add ability to work as a phy instead of full dsi")
Cc: <stable@vger.kernel.org>
Signed-off-by: Brian Norris <briannorris@chromium.org>
---

 drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

Comments

Heiko Stübner Oct. 29, 2022, 1 p.m. UTC | #1
On Wed, 19 Oct 2022 17:03:48 -0700, Brian Norris wrote:
> If we fail to attach the first time (especially: EPROBE_DEFER), we fail
> to clean up 'usage_mode', and thus will fail to attach on any subsequent
> attempts, with "dsi controller already in use".
> 
> Re-set to DW_DSI_USAGE_IDLE on attach failure.
> 
> This is especially common to hit when enabling asynchronous probe on a
> duel-DSI system (such as RK3399 Gru/Scarlet), such that we're more
> likely to fail dw_mipi_dsi_rockchip_find_second() the first time.
> 
> [...]

Applied, thanks!

[1/2] drm/rockchip: dsi: Clean up 'usage_mode' when failing to attach
      commit: 0be67e0556e469c57100ffe3c90df90abc796f3b
[2/2] drm/rockchip: dsi: Force synchronous probe
      commit: 81e592f86f7afdb76d655e7fbd7803d7b8f985d8

Best regards,
diff mbox series

Patch

diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
index bf6948125b84..d222c6811207 100644
--- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
@@ -1051,23 +1051,31 @@  static int dw_mipi_dsi_rockchip_host_attach(void *priv_data,
 	if (ret) {
 		DRM_DEV_ERROR(dsi->dev, "Failed to register component: %d\n",
 					ret);
-		return ret;
+		goto out;
 	}
 
 	second = dw_mipi_dsi_rockchip_find_second(dsi);
-	if (IS_ERR(second))
-		return PTR_ERR(second);
+	if (IS_ERR(second)) {
+		ret = PTR_ERR(second);
+		goto out;
+	}
 	if (second) {
 		ret = component_add(second, &dw_mipi_dsi_rockchip_ops);
 		if (ret) {
 			DRM_DEV_ERROR(second,
 				      "Failed to register component: %d\n",
 				      ret);
-			return ret;
+			goto out;
 		}
 	}
 
 	return 0;
+
+out:
+	mutex_lock(&dsi->usage_mutex);
+	dsi->usage_mode = DW_DSI_USAGE_IDLE;
+	mutex_unlock(&dsi->usage_mutex);
+	return ret;
 }
 
 static int dw_mipi_dsi_rockchip_host_detach(void *priv_data,