All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Andersson <quic_bjorande@quicinc.com>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: Kalyan Thota <quic_kalyant@quicinc.com>,
	freedreno@lists.freedesktop.org,
	Sankeerth Billakanti <quic_sbillaka@quicinc.com>,
	linux-kernel@vger.kernel.org,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	devicetree@vger.kernel.org, Sean Paul <sean@poorly.run>,
	Bjorn Andersson <andersson@kernel.org>,
	Abhinav Kumar <quic_abhinavk@quicinc.com>,
	dri-devel@lists.freedesktop.org,
	Kuogee Hsieh <quic_khsieh@quicinc.com>,
	Konrad Dybcio <konrad.dybcio@linaro.org>,
	Rob Herring <robh+dt@kernel.org>,
	linux-arm-msm@vger.kernel.org,
	Jessica Zhang <quic_jesszhan@quicinc.com>,
	Johan Hovold <johan+linaro@kernel.org>
Subject: [PATCH v4 08/13] drm/msm/dp: Implement hpd_notify()
Date: Mon, 5 Dec 2022 09:44:28 -0800	[thread overview]
Message-ID: <20221205174433.16847-9-quic_bjorande@quicinc.com> (raw)
In-Reply-To: <20221205174433.16847-1-quic_bjorande@quicinc.com>

From: Bjorn Andersson <bjorn.andersson@linaro.org>

The DisplayPort controller's hot-plug mechanism is based on pinmuxing a
physical signal on a GPIO pin into the controller. This is not always
possible, either because there aren't dedicated GPIOs available or
because the hot-plug signal is a virtual notification, in cases such as
USB Type-C.

For these cases, by implementing the hpd_notify() callback for the
DisplayPort controller's drm_bridge, a downstream drm_bridge
(next_bridge) can be used to track and signal the connection status
changes.

This makes it possible to use downstream drm_bridges such as
display-connector or any virtual mechanism, as long as they are
implemented as a drm_bridge.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
[bjorn: Drop connector->fwnode assignment and dev from struct msm_dp]
Signed-off-by: Bjorn Andersson <quic_bjorande@quicinc.com>
---

Changes since v3:
- None

 drivers/gpu/drm/msm/dp/dp_display.c | 22 ++++++++++++++++++++++
 drivers/gpu/drm/msm/dp/dp_drm.c     |  1 +
 drivers/gpu/drm/msm/dp/dp_drm.h     |  2 ++
 3 files changed, 25 insertions(+)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index 666b45c8ab80..17fcf8cd84cd 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -1772,3 +1772,25 @@ void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
 	dp_display->dp_mode.h_active_low =
 		!!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC);
 }
+
+void dp_bridge_hpd_notify(struct drm_bridge *bridge,
+			  enum drm_connector_status status)
+{
+	struct msm_dp_bridge *dp_bridge = to_dp_bridge(bridge);
+	struct msm_dp *dp_display = dp_bridge->dp_display;
+	struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display);
+
+	/* Without next_bridge interrupts are handled by the DP core directly */
+	if (!dp_display->next_bridge)
+		return;
+
+	if (!dp->core_initialized) {
+		drm_dbg_dp(dp->drm_dev, "not initialized\n");
+		return;
+	}
+
+	if (!dp_display->is_connected && status == connector_status_connected)
+		dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0);
+	else if (dp_display->is_connected && status == connector_status_disconnected)
+		dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0);
+}
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c
index 6db82f9b03af..3898366ebd5e 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.c
+++ b/drivers/gpu/drm/msm/dp/dp_drm.c
@@ -102,6 +102,7 @@ static const struct drm_bridge_funcs dp_bridge_ops = {
 	.get_modes    = dp_bridge_get_modes,
 	.detect       = dp_bridge_detect,
 	.atomic_check = dp_bridge_atomic_check,
+	.hpd_notify   = dp_bridge_hpd_notify,
 };
 
 struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.h b/drivers/gpu/drm/msm/dp/dp_drm.h
index 82035dbb0578..79e6b2cf2d25 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.h
+++ b/drivers/gpu/drm/msm/dp/dp_drm.h
@@ -32,5 +32,7 @@ enum drm_mode_status dp_bridge_mode_valid(struct drm_bridge *bridge,
 void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
 			const struct drm_display_mode *mode,
 			const struct drm_display_mode *adjusted_mode);
+void dp_bridge_hpd_notify(struct drm_bridge *bridge,
+			  enum drm_connector_status status);
 
 #endif /* _DP_DRM_H_ */
-- 
2.37.3


WARNING: multiple messages have this Message-ID (diff)
From: Bjorn Andersson <quic_bjorande@quicinc.com>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: Rob Clark <robdclark@gmail.com>,
	Abhinav Kumar <quic_abhinavk@quicinc.com>,
	Sean Paul <sean@poorly.run>, David Airlie <airlied@gmail.com>,
	Daniel Vetter <daniel@ffwll.ch>, Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Bjorn Andersson <andersson@kernel.org>,
	Konrad Dybcio <konrad.dybcio@linaro.org>,
	Kalyan Thota <quic_kalyant@quicinc.com>,
	Jessica Zhang <quic_jesszhan@quicinc.com>,
	"Kuogee Hsieh" <quic_khsieh@quicinc.com>,
	Johan Hovold <johan+linaro@kernel.org>,
	Sankeerth Billakanti <quic_sbillaka@quicinc.com>,
	<linux-arm-msm@vger.kernel.org>,
	<dri-devel@lists.freedesktop.org>,
	<freedreno@lists.freedesktop.org>, <devicetree@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: [PATCH v4 08/13] drm/msm/dp: Implement hpd_notify()
Date: Mon, 5 Dec 2022 09:44:28 -0800	[thread overview]
Message-ID: <20221205174433.16847-9-quic_bjorande@quicinc.com> (raw)
In-Reply-To: <20221205174433.16847-1-quic_bjorande@quicinc.com>

From: Bjorn Andersson <bjorn.andersson@linaro.org>

The DisplayPort controller's hot-plug mechanism is based on pinmuxing a
physical signal on a GPIO pin into the controller. This is not always
possible, either because there aren't dedicated GPIOs available or
because the hot-plug signal is a virtual notification, in cases such as
USB Type-C.

For these cases, by implementing the hpd_notify() callback for the
DisplayPort controller's drm_bridge, a downstream drm_bridge
(next_bridge) can be used to track and signal the connection status
changes.

This makes it possible to use downstream drm_bridges such as
display-connector or any virtual mechanism, as long as they are
implemented as a drm_bridge.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
[bjorn: Drop connector->fwnode assignment and dev from struct msm_dp]
Signed-off-by: Bjorn Andersson <quic_bjorande@quicinc.com>
---

Changes since v3:
- None

 drivers/gpu/drm/msm/dp/dp_display.c | 22 ++++++++++++++++++++++
 drivers/gpu/drm/msm/dp/dp_drm.c     |  1 +
 drivers/gpu/drm/msm/dp/dp_drm.h     |  2 ++
 3 files changed, 25 insertions(+)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index 666b45c8ab80..17fcf8cd84cd 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -1772,3 +1772,25 @@ void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
 	dp_display->dp_mode.h_active_low =
 		!!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC);
 }
+
+void dp_bridge_hpd_notify(struct drm_bridge *bridge,
+			  enum drm_connector_status status)
+{
+	struct msm_dp_bridge *dp_bridge = to_dp_bridge(bridge);
+	struct msm_dp *dp_display = dp_bridge->dp_display;
+	struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display);
+
+	/* Without next_bridge interrupts are handled by the DP core directly */
+	if (!dp_display->next_bridge)
+		return;
+
+	if (!dp->core_initialized) {
+		drm_dbg_dp(dp->drm_dev, "not initialized\n");
+		return;
+	}
+
+	if (!dp_display->is_connected && status == connector_status_connected)
+		dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0);
+	else if (dp_display->is_connected && status == connector_status_disconnected)
+		dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0);
+}
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c
index 6db82f9b03af..3898366ebd5e 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.c
+++ b/drivers/gpu/drm/msm/dp/dp_drm.c
@@ -102,6 +102,7 @@ static const struct drm_bridge_funcs dp_bridge_ops = {
 	.get_modes    = dp_bridge_get_modes,
 	.detect       = dp_bridge_detect,
 	.atomic_check = dp_bridge_atomic_check,
+	.hpd_notify   = dp_bridge_hpd_notify,
 };
 
 struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.h b/drivers/gpu/drm/msm/dp/dp_drm.h
index 82035dbb0578..79e6b2cf2d25 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.h
+++ b/drivers/gpu/drm/msm/dp/dp_drm.h
@@ -32,5 +32,7 @@ enum drm_mode_status dp_bridge_mode_valid(struct drm_bridge *bridge,
 void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
 			const struct drm_display_mode *mode,
 			const struct drm_display_mode *adjusted_mode);
+void dp_bridge_hpd_notify(struct drm_bridge *bridge,
+			  enum drm_connector_status status);
 
 #endif /* _DP_DRM_H_ */
-- 
2.37.3


  parent reply	other threads:[~2022-12-05 17:45 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-05 17:44 [PATCH v4 00/13] drm/msm: Add SC8280XP support Bjorn Andersson
2022-12-05 17:44 ` Bjorn Andersson
2022-12-05 17:44 ` [PATCH v4 01/13] dt-bindings: display/msm: Add binding for SC8280XP MDSS Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 21:08   ` Rob Herring
2022-12-05 21:08     ` Rob Herring
2022-12-05 17:44 ` [PATCH v4 02/13] drm/msm/dpu: Introduce SC8280XP Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-07 14:49   ` Dmitry Baryshkov
2022-12-07 14:49     ` Dmitry Baryshkov
2022-12-07 16:28     ` Bjorn Andersson
2022-12-07 16:28       ` Bjorn Andersson
2022-12-07 20:04       ` Dmitry Baryshkov
2022-12-07 20:04         ` Dmitry Baryshkov
2022-12-05 17:44 ` [PATCH v4 03/13] drm/msm: Introduce SC8280XP MDSS Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 20:59   ` Dmitry Baryshkov
2022-12-05 20:59     ` Dmitry Baryshkov
2022-12-05 17:44 ` [PATCH v4 04/13] dt-bindings: msm/dp: Add SDM845 and SC8280XP compatibles Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 17:44 ` [PATCH v4 05/13] drm/msm/dp: Stop using DP id as index in desc Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 17:44 ` [PATCH v4 06/13] drm/msm/dp: Add DP and EDP compatibles for SC8280XP Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 17:44 ` [PATCH v4 07/13] drm/msm/dp: Add SDM845 DisplayPort instance Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 17:44 ` Bjorn Andersson [this message]
2022-12-05 17:44   ` [PATCH v4 08/13] drm/msm/dp: Implement hpd_notify() Bjorn Andersson
2022-12-05 21:02   ` Dmitry Baryshkov
2022-12-05 21:02     ` Dmitry Baryshkov
2022-12-05 21:29   ` Dmitry Baryshkov
2022-12-05 21:29     ` Dmitry Baryshkov
2022-12-05 22:23     ` Bjorn Andersson
2022-12-05 22:23       ` Bjorn Andersson
2022-12-05 17:44 ` [PATCH v4 09/13] drm/msm/dp: Don't enable HPD interrupts for edp Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 21:07   ` Dmitry Baryshkov
2022-12-05 21:07     ` Dmitry Baryshkov
2022-12-05 21:11     ` Dmitry Baryshkov
2022-12-05 21:11       ` Dmitry Baryshkov
2022-12-05 17:44 ` [PATCH v4 10/13] drm/msm/dp: Rely on hpd_enable/disable callbacks Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 21:11   ` Dmitry Baryshkov
2022-12-05 21:11     ` Dmitry Baryshkov
2022-12-05 17:44 ` [PATCH v4 11/13] arm64: dts: qcom: sc8280xp: Define some of the display blocks Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 17:44 ` [PATCH v4 12/13] arm64: dts: qcom: sc8280xp-crd: Enable EDP Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 21:23   ` Dmitry Baryshkov
2022-12-05 21:23     ` Dmitry Baryshkov
2022-12-05 17:44 ` [PATCH v4 13/13] arm64: dts: qcom: sa8295-adp: Enable DP instances Bjorn Andersson
2022-12-05 17:44   ` Bjorn Andersson
2022-12-05 18:09   ` Konrad Dybcio
2022-12-05 18:09     ` Konrad Dybcio
2022-12-05 20:02     ` Bjorn Andersson
2022-12-05 20:02       ` Bjorn Andersson
2022-12-05 20:09       ` Konrad Dybcio
2022-12-05 20:09         ` Konrad Dybcio

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221205174433.16847-9-quic_bjorande@quicinc.com \
    --to=quic_bjorande@quicinc.com \
    --cc=andersson@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=freedreno@lists.freedesktop.org \
    --cc=johan+linaro@kernel.org \
    --cc=konrad.dybcio@linaro.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=quic_abhinavk@quicinc.com \
    --cc=quic_jesszhan@quicinc.com \
    --cc=quic_kalyant@quicinc.com \
    --cc=quic_khsieh@quicinc.com \
    --cc=quic_sbillaka@quicinc.com \
    --cc=robh+dt@kernel.org \
    --cc=sean@poorly.run \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.