Archive-only list for patches
 help / color / mirror / Atom feed
From: Stephen Boyd <swboyd@chromium.org>
To: chrome-platform@lists.linux.dev
Cc: linux-kernel@vger.kernel.org, patches@lists.linux.dev,
	devicetree@vger.kernel.org,
	Douglas Anderson <dianders@chromium.org>,
	Pin-yen Lin <treapking@chromium.org>,
	Andrzej Hajda <andrzej.hajda@intel.com>,
	Benson Leung <bleung@chromium.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Daniel Vetter <daniel@ffwll.ch>, David Airlie <airlied@gmail.com>,
	Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
	dri-devel@lists.freedesktop.org,
	Guenter Roeck <groeck@chromium.org>,
	Jernej Skrabec <jernej.skrabec@gmail.com>,
	Jonas Karlman <jonas@kwiboo.se>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
	Lee Jones <lee@kernel.org>,
	Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Maxime Ripard <mripard@kernel.org>,
	Neil Armstrong <neil.armstrong@linaro.org>,
	Prashant Malani <pmalani@chromium.org>,
	Robert Foss <rfoss@kernel.org>, Rob Herring <robh+dt@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	Tzung-Bi Shih <tzungbi@kernel.org>,
	Alexandre Belloni <alexandre.belloni@bootlin.com>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Daniel Scally <djrscally@gmail.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Heikki Krogerus <heikki.krogerus@linux.intel.com>,
	Ivan Orlov <ivan.orlov0322@gmail.com>,
	linux-acpi@vger.kernel.org, linux-usb@vger.kernel.org,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	"Rafael J . Wysocki" <rafael.j.wysocki@intel.com>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	Vinod Koul <vkoul@kernel.org>
Subject: [PATCH v4 17/18] platform/chrome: cros_ec_typec: Support DP muxing
Date: Sat, 31 Aug 2024 21:06:55 -0700	[thread overview]
Message-ID: <20240901040658.157425-18-swboyd@chromium.org> (raw)
In-Reply-To: <20240901040658.157425-1-swboyd@chromium.org>

Most ARM based chromebooks with two usb-c-connector nodes and one DP
controller are muxing the DP lanes between the two USB ports. This is
done so that the type-c ports are at least equal in capability if not
functionality. Either an analog mux is used to steer the DP signal to
one or the other port, or a DP bridge chip has two lanes (e.g. DP
ML0/ML1) wired to one type-c port while the other two (e.g. DP ML2/ML3)
are wired to another type-c port.

Implement the same algorithm that the EC has to figure out which type-c
port has actually been muxed for DP altmode. Wait for the first type-c
port to assert HPD, and treat that as the actively muxed port until the
port exits DP altmode entirely. Allow HPD to be asserted or deasserted
during this time. If the port isn't active, simply ignore those events
and skip calling cros_typec_enable_dp(). Otherwise, pass the DP
information to the typec subsystem so that the DP controller can respond
to HPD events and pin configurations.

The EC can mux the DP signal to any number of USB type-c ports. We only
need to make sure that the active USB type-c port is tracked so that DP
information about the other ports is ignored. Unfortunately, the EC
doesn't hide these details from the AP so we have to reimplement the
logic in the kernel.

Cc: Prashant Malani <pmalani@chromium.org>
Cc: Benson Leung <bleung@chromium.org>
Cc: Tzung-Bi Shih <tzungbi@kernel.org>
Cc: <chrome-platform@lists.linux.dev>
Cc: Pin-yen Lin <treapking@chromium.org>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
 drivers/platform/chrome/cros_ec_typec.c | 31 +++++++++++++++++++++++--
 drivers/platform/chrome/cros_ec_typec.h |  1 +
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/drivers/platform/chrome/cros_ec_typec.c b/drivers/platform/chrome/cros_ec_typec.c
index a57053bdec18..57d1484ce1ef 100644
--- a/drivers/platform/chrome/cros_ec_typec.c
+++ b/drivers/platform/chrome/cros_ec_typec.c
@@ -639,6 +639,7 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num,
 				struct ec_response_usb_pd_control_v2 *pd_ctrl)
 {
 	struct cros_typec_port *port = typec->ports[port_num];
+	bool has_dp_bridge = !!typec->dp_bridge;
 	struct ec_response_usb_pd_mux_info resp;
 	struct ec_params_usb_pd_mux_info req = {
 		.port = port_num,
@@ -646,6 +647,7 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num,
 	struct ec_params_usb_pd_mux_ack mux_ack;
 	enum typec_orientation orientation;
 	int ret;
+	bool dp_enabled, hpd_asserted, is_active_port;
 
 	ret = cros_ec_cmd(typec->ec, 0, EC_CMD_USB_PD_MUX_INFO,
 			  &req, sizeof(req), &resp, sizeof(resp));
@@ -659,6 +661,25 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num,
 	if (port->mux_flags == resp.flags && port->role == pd_ctrl->role)
 		return 0;
 
+	dp_enabled = resp.flags & USB_PD_MUX_DP_ENABLED;
+	hpd_asserted = resp.flags & USB_PD_MUX_HPD_LVL;
+	/*
+	 * Assume the first port to have HPD asserted is the one muxed to DP
+	 * (i.e. active_port). When there's only one port this delays setting
+	 * the active_port until HPD is asserted, but before that the
+	 * drm_connector looks disconnected so active_port doesn't need to be
+	 * set.
+	 */
+	if (has_dp_bridge && hpd_asserted && !typec->active_dp_port)
+		typec->active_dp_port = port;
+
+	/*
+	 * Skip calling cros_typec_enable_dp() for the non-active type-c port
+	 * when muxing one DP to multiple type-c ports. This is only the case
+	 * on platforms using a drm_bridge.
+	 */
+	is_active_port = !has_dp_bridge || typec->active_dp_port == port;
+
 	port->mux_flags = resp.flags;
 	port->role = pd_ctrl->role;
 
@@ -686,8 +707,11 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num,
 		ret = cros_typec_enable_usb4(typec, port_num, pd_ctrl);
 	} else if (port->mux_flags & USB_PD_MUX_TBT_COMPAT_ENABLED) {
 		ret = cros_typec_enable_tbt(typec, port_num, pd_ctrl);
-	} else if (port->mux_flags & USB_PD_MUX_DP_ENABLED) {
-		ret = cros_typec_enable_dp(typec, port_num, pd_ctrl);
+	} else if (dp_enabled) {
+		ret = 0;
+		/* Ignore DP events for the non-active port */
+		if (is_active_port)
+			ret = cros_typec_enable_dp(typec, port_num, pd_ctrl);
 	} else if (port->mux_flags & USB_PD_MUX_SAFE_MODE) {
 		ret = cros_typec_usb_safe_state(port);
 	} else if (port->mux_flags & USB_PD_MUX_USB_ENABLED) {
@@ -704,6 +728,9 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num,
 	}
 
 mux_ack:
+	if (has_dp_bridge && !dp_enabled && is_active_port)
+		typec->active_dp_port = NULL;
+
 	if (!typec->needs_mux_ack)
 		return ret;
 
diff --git a/drivers/platform/chrome/cros_ec_typec.h b/drivers/platform/chrome/cros_ec_typec.h
index eb816d30d880..f3a2b67df07c 100644
--- a/drivers/platform/chrome/cros_ec_typec.h
+++ b/drivers/platform/chrome/cros_ec_typec.h
@@ -36,6 +36,7 @@ struct cros_typec_data {
 	/* Array of ports, indexed by port number. */
 	struct cros_typec_port *ports[EC_USB_PD_MAX_PORTS];
 	struct drm_dp_typec_bridge_dev *dp_bridge;
+	struct cros_typec_port *active_dp_port;
 	struct notifier_block nb;
 	struct work_struct port_work;
 	bool typec_cmd_supported;
-- 
https://chromeos.dev


  parent reply	other threads:[~2024-09-01  4:07 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-01  4:06 [PATCH v4 00/18] platform/chrome: Add DT USB/DP muxing/topology support Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 01/18] drm/atomic-helper: Introduce lane remapping support to bridges Stephen Boyd
2024-09-20 13:41   ` Dmitry Baryshkov
2024-09-01  4:06 ` [PATCH v4 02/18] drm/bridge: Verify lane assignment is going to work during atomic_check Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 03/18] usb: typec: Stub out typec_switch APIs when CONFIG_TYPEC=n Stephen Boyd
2024-09-03 11:40   ` Heikki Krogerus
2024-09-19 10:12   ` Dmitry Baryshkov
2024-09-01  4:06 ` [PATCH v4 04/18] usb: typec: Add device managed typec_mux_register() Stephen Boyd
2024-09-03 11:57   ` Heikki Krogerus
2024-09-01  4:06 ` [PATCH v4 05/18] usb: typec: Add device managed typec_switch_register() Stephen Boyd
2024-09-02 11:22   ` Andy Shevchenko
2024-09-01  4:06 ` [PATCH v4 06/18] drm/bridge: aux-hpd: Support USB Type-C DP altmodes via DRM lane assignment Stephen Boyd
2024-09-02 11:35   ` Andy Shevchenko
2024-09-03 22:20     ` Stephen Boyd
2024-09-04 13:00       ` Andy Shevchenko
2024-09-04 17:17         ` Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 07/18] drm/bridge: dp_typec: Support USB Type-C orientation Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 08/18] drm/bridge: dp_typec: Add "no-hpd" support Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 09/18] drm/bridge: dp_typec: Allow users to hook hpd notify path Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 10/18] devcon property: Document devcon_match_fn_t Stephen Boyd
2024-09-02 11:17   ` Andy Shevchenko
2024-09-03 22:35     ` Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 11/18] device property: Add remote endpoint to devcon matcher Stephen Boyd
2024-09-02 11:12   ` Andy Shevchenko
2024-09-03 22:49     ` Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 12/18] dt-bindings: usb-switch: Extract endpoints to defs Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 13/18] dt-bindings: usb-switch: Extend for DisplayPort altmode Stephen Boyd
2024-09-19 10:40   ` Dmitry Baryshkov
2024-10-10 22:43     ` Stephen Boyd
2024-10-25  6:36       ` Dmitry Baryshkov
2024-09-01  4:06 ` [PATCH v4 14/18] dt-bindings: Move google,cros-ec-typec binding to usb Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 15/18] dt-bindings: usb: Add ports to google,cros-ec-typec for DP altmode Stephen Boyd
2024-09-03 15:35   ` Lee Jones
2024-09-20  9:38   ` Dmitry Baryshkov
2024-10-23  1:15     ` Stephen Boyd
2024-10-25 10:49       ` Dmitry Baryshkov
2024-10-29 20:15         ` Stephen Boyd
2024-10-31 18:42           ` Dmitry Baryshkov
2024-10-31 21:45             ` Stephen Boyd
2024-10-31 22:54               ` Dmitry Baryshkov
2024-11-08  0:28                 ` Stephen Boyd
2024-11-09  7:05                   ` Dmitry Baryshkov
2024-11-12  2:16                     ` Stephen Boyd
2024-11-15 17:17                       ` Dmitry Baryshkov
2024-11-20  1:09                         ` Stephen Boyd
2024-11-21 22:59                           ` Dmitry Baryshkov
2024-12-03 23:50                             ` Stephen Boyd
2024-12-05 18:47                               ` Dmitry Baryshkov
2024-12-11 21:11                                 ` Stephen Boyd
2024-12-11 21:16                                   ` Dmitry Baryshkov
2024-12-11 21:21                                     ` Stephen Boyd
2024-09-01  4:06 ` [PATCH v4 16/18] platform/chrome: cros_ec_typec: Add support for signaling DP HPD via drm_bridge Stephen Boyd
2024-09-04  9:35   ` Tzung-Bi Shih
2024-09-01  4:06 ` Stephen Boyd [this message]
2024-09-04  9:36   ` [PATCH v4 17/18] platform/chrome: cros_ec_typec: Support DP muxing Tzung-Bi Shih
2024-09-01  4:06 ` [PATCH v4 18/18] platform/chrome: cros_ec_typec: Handle lack of HPD information Stephen Boyd
2024-09-04  9:36   ` Tzung-Bi Shih
2024-09-04 21:45     ` Stephen Boyd
2024-09-06  8:18       ` Tzung-Bi Shih
2024-09-06 23:22         ` Stephen Boyd

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=20240901040658.157425-18-swboyd@chromium.org \
    --to=swboyd@chromium.org \
    --cc=Laurent.pinchart@ideasonboard.com \
    --cc=airlied@gmail.com \
    --cc=alexandre.belloni@bootlin.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=andrzej.hajda@intel.com \
    --cc=bleung@chromium.org \
    --cc=chrome-platform@lists.linux.dev \
    --cc=conor+dt@kernel.org \
    --cc=daniel@ffwll.ch \
    --cc=devicetree@vger.kernel.org \
    --cc=dianders@chromium.org \
    --cc=djrscally@gmail.com \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=groeck@chromium.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=ivan.orlov0322@gmail.com \
    --cc=jernej.skrabec@gmail.com \
    --cc=jonas@kwiboo.se \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=lee@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mika.westerberg@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=neil.armstrong@linaro.org \
    --cc=patches@lists.linux.dev \
    --cc=pmalani@chromium.org \
    --cc=rafael.j.wysocki@intel.com \
    --cc=rfoss@kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=sakari.ailus@linux.intel.com \
    --cc=treapking@chromium.org \
    --cc=tzimmermann@suse.de \
    --cc=tzungbi@kernel.org \
    --cc=vkoul@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox