Patrik Jakobsson 610600
From 2b57f726611e294dc4297dd48eb8c98ef1938e82 Mon Sep 17 00:00:00 2001
Patrik Jakobsson 610600
From: Johan Hovold <johan+linaro@kernel.org>
Patrik Jakobsson 610600
Date: Tue, 13 Sep 2022 10:53:16 +0200
Patrik Jakobsson 610600
Subject: drm/msm/dp: fix aux-bus EP lifetime
Patrik Jakobsson 610600
Git-commit: 2b57f726611e294dc4297dd48eb8c98ef1938e82
Patrik Jakobsson 610600
Patch-mainline: v6.1-rc3
Patrik Jakobsson 610600
References: git-fixes
Patrik Jakobsson 610600
Patrik Jakobsson 610600
Device-managed resources allocated post component bind must be tied to
Patrik Jakobsson 610600
the lifetime of the aggregate DRM device or they will not necessarily be
Patrik Jakobsson 610600
released when binding of the aggregate device is deferred.
Patrik Jakobsson 610600
Patrik Jakobsson 610600
This can lead resource leaks or failure to bind the aggregate device
Patrik Jakobsson 610600
when binding is later retried and a second attempt to allocate the
Patrik Jakobsson 610600
resources is made.
Patrik Jakobsson 610600
Patrik Jakobsson 610600
For the DP aux-bus, an attempt to populate the bus a second time will
Patrik Jakobsson 610600
simply fail ("DP AUX EP device already populated").
Patrik Jakobsson 610600
Patrik Jakobsson 610600
Fix this by tying the lifetime of the EP device to the DRM device rather
Patrik Jakobsson 610600
than DP controller platform device.
Patrik Jakobsson 610600
Patrik Jakobsson 610600
Fixes: c3bf8e21b38a ("drm/msm/dp: Add eDP support via aux_bus")
Patrik Jakobsson 610600
Cc: stable@vger.kernel.org      # 5.19
Patrik Jakobsson 610600
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Patrik Jakobsson 610600
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Patrik Jakobsson 610600
Tested-by: Kuogee Hsieh <quic_khsieh@quicinc.com>
Patrik Jakobsson 610600
Reviewed-by: Kuogee Hsieh <quic_khsieh@quicinc.com>
Patrik Jakobsson 610600
Patchwork: https://patchwork.freedesktop.org/patch/502672/
Patrik Jakobsson 610600
Link: https://lore.kernel.org/r/20220913085320.8577-7-johan+linaro@kernel.org
Patrik Jakobsson 610600
Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Patrik Jakobsson 610600
Acked-by: Patrik Jakobsson <pjakobsson@suse.de>
Patrik Jakobsson 610600
---
Patrik Jakobsson 610600
 drivers/gpu/drm/msm/dp/dp_display.c | 13 ++++++++++++-
Patrik Jakobsson 610600
 1 file changed, 12 insertions(+), 1 deletion(-)
Patrik Jakobsson 610600
Patrik Jakobsson 610600
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
Patrik Jakobsson 610600
index 352cc09f2069..42de690132cf 100644
Patrik Jakobsson 610600
--- a/drivers/gpu/drm/msm/dp/dp_display.c
Patrik Jakobsson 610600
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
Patrik Jakobsson 610600
@@ -1528,6 +1528,11 @@ void msm_dp_debugfs_init(struct msm_dp *dp_display, struct drm_minor *minor)
Patrik Jakobsson 610600
 	}
Patrik Jakobsson 610600
 }
Patrik Jakobsson 610600
 
Patrik Jakobsson 610600
+static void of_dp_aux_depopulate_bus_void(void *data)
Patrik Jakobsson 610600
+{
Patrik Jakobsson 610600
+	of_dp_aux_depopulate_bus(data);
Patrik Jakobsson 610600
+}
Patrik Jakobsson 610600
+
Patrik Jakobsson 610600
 static int dp_display_get_next_bridge(struct msm_dp *dp)
Patrik Jakobsson 610600
 {
Patrik Jakobsson 610600
 	int rc;
Patrik Jakobsson 610600
@@ -1552,10 +1557,16 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)
Patrik Jakobsson 610600
 		 * panel driver is probed asynchronously but is the best we
Patrik Jakobsson 610600
 		 * can do without a bigger driver reorganization.
Patrik Jakobsson 610600
 		 */
Patrik Jakobsson 610600
-		rc = devm_of_dp_aux_populate_ep_devices(dp_priv->aux);
Patrik Jakobsson 610600
+		rc = of_dp_aux_populate_bus(dp_priv->aux, NULL);
Patrik Jakobsson 610600
 		of_node_put(aux_bus);
Patrik Jakobsson 610600
 		if (rc)
Patrik Jakobsson 610600
 			goto error;
Patrik Jakobsson 610600
+
Patrik Jakobsson 610600
+		rc = devm_add_action_or_reset(dp->drm_dev->dev,
Patrik Jakobsson 610600
+						of_dp_aux_depopulate_bus_void,
Patrik Jakobsson 610600
+						dp_priv->aux);
Patrik Jakobsson 610600
+		if (rc)
Patrik Jakobsson 610600
+			goto error;
Patrik Jakobsson 610600
 	} else if (dp->is_edp) {
Patrik Jakobsson 610600
 		DRM_ERROR("eDP aux_bus not found\n");
Patrik Jakobsson 610600
 		return -ENODEV;
Patrik Jakobsson 610600
-- 
Patrik Jakobsson 610600
2.39.0
Patrik Jakobsson 610600