From: Stephen Boyd <swboyd@chromium.org>
To: chrome-platform@lists.linux.dev
Cc: linux-kernel@vger.kernel.org, patches@lists.linux.dev,
linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org,
linux-arm-msm@vger.kernel.org,
Douglas Anderson <dianders@chromium.org>,
Pin-yen Lin <treapking@chromium.org>,
Prashant Malani <pmalani@chromium.org>,
Benson Leung <bleung@chromium.org>,
Tzung-Bi Shih <tzungbi@kernel.org>
Subject: [PATCH 16/22] platform/chrome: cros_typec_switch: Support orientation-switch
Date: Fri, 9 Feb 2024 23:09:27 -0800 [thread overview]
Message-ID: <20240210070934.2549994-17-swboyd@chromium.org> (raw)
In-Reply-To: <20240210070934.2549994-1-swboyd@chromium.org>
Register an orientation switch with the typec subsystem when the
'orientation-switch' DT property is present. In these sorts of hardware
designs, the DP phy lanes are wired directly to the usb-c-connector. The
EC signals entry and exit of DP mode on the port, and the DP phy lanes
are assigned to the pins based on the port orientation (normal or
reverse).
Stash the orientation of the port and simply wait for the atomic_check
phase to request the desired DP lane assignment (normal or reverse).
Don't restrict this to the presence of the mode-switch property because
it's possible for this device to only be an orientation-switch, in which
case the DP mode entry is signaled externally (e.g. through an HPD pin
on the DP source).
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_typec_switch.c | 84 ++++++++++++++++++---
1 file changed, 72 insertions(+), 12 deletions(-)
diff --git a/drivers/platform/chrome/cros_typec_switch.c b/drivers/platform/chrome/cros_typec_switch.c
index adcbf8f44c98..c22c2531327a 100644
--- a/drivers/platform/chrome/cros_typec_switch.c
+++ b/drivers/platform/chrome/cros_typec_switch.c
@@ -38,9 +38,11 @@ struct cros_typec_dp_bridge {
struct cros_typec_port {
int port_num;
struct typec_mux_dev *mode_switch;
+ struct typec_switch_dev *orientation_switch;
struct typec_retimer *retimer;
size_t num_dp_lanes;
u32 lane_mapping[USBC_LANES_COUNT];
+ enum typec_orientation orientation;
struct cros_typec_switch_data *sdata;
};
@@ -245,6 +247,21 @@ static int cros_typec_mode_switch_set(struct typec_mux_dev *mode_switch,
return 0;
}
+static int cros_typec_dp_port_orientation_set(struct typec_switch_dev *sw,
+ enum typec_orientation orientation)
+{
+ struct cros_typec_port *port = typec_switch_get_drvdata(sw);
+
+ /*
+ * Lane remapping is in cros_typec_dp_bridge_atomic_check(). Whenever
+ * an orientation changes HPD will go low and then high again so the
+ * atomic check handles the orientation change.
+ */
+ port->orientation = orientation;
+
+ return 0;
+}
+
static int cros_typec_retimer_set(struct typec_retimer *retimer, struct typec_retimer_state *state)
{
struct cros_typec_port *port = typec_retimer_get_drvdata(retimer);
@@ -280,6 +297,21 @@ static int cros_typec_register_mode_switch(struct cros_typec_port *port,
return PTR_ERR_OR_ZERO(port->mode_switch);
}
+static int cros_typec_register_orientation_switch(struct cros_typec_port *port,
+ struct fwnode_handle *fwnode)
+{
+ struct typec_switch_desc orientation_switch_desc = {
+ .fwnode = fwnode,
+ .drvdata = port,
+ .name = fwnode_get_name(fwnode),
+ .set = cros_typec_dp_port_orientation_set,
+ };
+
+ port->orientation_switch = typec_switch_register(port->sdata->dev, &orientation_switch_desc);
+
+ return PTR_ERR_OR_ZERO(port->orientation_switch);
+}
+
static int cros_typec_register_retimer(struct cros_typec_port *port, struct fwnode_handle *fwnode)
{
struct typec_retimer_desc retimer_desc = {
@@ -328,17 +360,35 @@ static int dp_lane_to_typec_lane(unsigned int dp_lane)
return -EINVAL;
}
-static int typec_to_dp_lane(unsigned int typec_lane)
+static int typec_to_dp_lane(unsigned int typec_lane,
+ enum typec_orientation orientation)
{
- switch (typec_lane) {
- case 0:
- return 3;
- case 1:
- return 2;
- case 2:
- return 0;
- case 3:
- return 1;
+ switch (orientation) {
+ case TYPEC_ORIENTATION_NONE:
+ case TYPEC_ORIENTATION_NORMAL:
+ switch (typec_lane) {
+ case 0:
+ return 3;
+ case 1:
+ return 2;
+ case 2:
+ return 0;
+ case 3:
+ return 1;
+ }
+ break;
+ case TYPEC_ORIENTATION_REVERSE:
+ switch (typec_lane) {
+ case 0:
+ return 0;
+ case 1:
+ return 1;
+ case 2:
+ return 3;
+ case 3:
+ return 2;
+ }
+ break;
}
return -EINVAL;
@@ -381,7 +431,7 @@ static int cros_typec_dp_bridge_atomic_check(struct drm_bridge *bridge,
typec_lane = port->lane_mapping[typec_lane];
/* Map logical type-c lane to logical DP lane */
- in_lanes[i].logical = typec_to_dp_lane(typec_lane);
+ in_lanes[i].logical = typec_to_dp_lane(typec_lane, port->orientation);
}
return 0;
@@ -509,6 +559,15 @@ static int cros_typec_register_port(struct cros_typec_switch_data *sdata,
dev_dbg(dev, "Mode switch registered for index %u\n", index);
}
+ if (fwnode_property_present(fwnode, "orientation-switch")) {
+ ret = cros_typec_register_orientation_switch(port, port_node);
+ if (ret) {
+ dev_err(dev, "Orientation switch register failed\n");
+ goto out;
+ }
+
+ dev_dbg(dev, "Orientation switch registered for index %u\n", index);
+ }
out:
if (np)
@@ -556,7 +615,8 @@ static int cros_typec_register_switches(struct cros_typec_switch_data *sdata)
}
}
- if (fwnode_property_present(devnode, "mode-switch")) {
+ if (fwnode_property_present(devnode, "mode-switch") ||
+ fwnode_property_present(devnode, "orientation-switch")) {
fwnode = fwnode_graph_get_endpoint_by_id(devnode, 0, 0, 0);
if (fwnode) {
ret = cros_typec_register_dp_bridge(sdata, fwnode);
--
https://chromeos.dev
next prev parent reply other threads:[~2024-02-10 7:10 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-10 7:09 [PATCH 00/22] platform/chrome: Add DT USB/DP muxing/topology to Trogdor Stephen Boyd
2024-02-10 7:09 ` [PATCH 01/22] dt-bindings: gpio: Add binding for ChromeOS EC GPIO controller Stephen Boyd
2024-02-11 13:26 ` Krzysztof Kozlowski
2024-02-15 0:44 ` Stephen Boyd
2024-02-15 14:06 ` Rob Herring
2024-02-15 22:00 ` Stephen Boyd
2024-02-10 7:09 ` [PATCH 02/22] gpio: Add ChromeOS EC GPIO driver Stephen Boyd
2024-02-13 17:57 ` Linus Walleij
2024-02-10 7:09 ` [PATCH 03/22] dt-bindings: usb: Add downstream facing ports to realtek binding Stephen Boyd
2024-02-10 11:29 ` Rob Herring
2024-02-10 7:09 ` [PATCH 04/22] usb: core: Set connect_type of ports based on DT node Stephen Boyd
2024-02-14 0:03 ` Doug Anderson
2024-02-14 23:51 ` Stephen Boyd
2024-02-10 7:09 ` [PATCH 05/22] drm/atomic-helper: Introduce lane remapping support to bridges Stephen Boyd
2024-02-10 7:09 ` [PATCH 06/22] drm/bridge: Verify lane assignment is going to work during atomic_check Stephen Boyd
2024-02-10 7:09 ` [PATCH 07/22] device property: Add remote endpoint to devcon matcher Stephen Boyd
2024-02-10 7:09 ` [PATCH 08/22] platform/chrome: cros_ec_typec: Purge blocking switch devlinks Stephen Boyd
2024-02-10 7:09 ` [PATCH 09/22] platform/chrome: cros_typec_switch: Use read_poll_timeout helper Stephen Boyd
2024-02-10 7:09 ` [PATCH 10/22] platform/chrome: cros_typec_switch: Move port creation code to sub-function Stephen Boyd
2024-02-10 7:09 ` [PATCH 11/22] platform/chrome: cros_typec_switch: Use fwnode instead of ACPI APIs Stephen Boyd
2024-02-10 7:09 ` [PATCH 12/22] platform/chrome: cros_typec_switch: Use dev_err_probe() Stephen Boyd
2024-02-10 7:09 ` [PATCH 13/22] dt-bindings: chrome: Add google,cros-ec-typec-switch binding Stephen Boyd
2024-02-11 13:34 ` Krzysztof Kozlowski
2024-02-15 1:52 ` Stephen Boyd
2024-02-15 8:34 ` Krzysztof Kozlowski
2024-02-11 13:35 ` Krzysztof Kozlowski
2024-02-10 7:09 ` [PATCH 14/22] platform/chrome: cros_typec_switch: Add support for signaling HPD to drm_bridge Stephen Boyd
2024-02-10 14:10 ` Dmitry Baryshkov
2024-02-11 8:52 ` Stephen Boyd
2024-02-11 9:00 ` Dmitry Baryshkov
2024-02-10 7:09 ` [PATCH 15/22] platform/chrome: cros_typec_switch: Support DP muxing via DRM lane assignment Stephen Boyd
2024-02-10 7:09 ` Stephen Boyd [this message]
2024-02-10 7:09 ` [PATCH 17/22] platform/chrome: cros_typec_switch: Handle lack of HPD information Stephen Boyd
2024-02-10 7:09 ` [PATCH 18/22] dt-bindings: chrome: Add binding for ChromeOS Pogo pin connector Stephen Boyd
2024-02-11 13:39 ` Krzysztof Kozlowski
2024-02-15 0:07 ` Stephen Boyd
2024-02-15 8:39 ` Krzysztof Kozlowski
2024-02-14 1:17 ` Doug Anderson
2024-02-15 0:10 ` Stephen Boyd
2024-02-10 7:09 ` [PATCH 19/22] arm64: dts: qcom: sc7180: quackingstick: Disable instead of delete usb_c1 Stephen Boyd
2024-02-10 11:51 ` Dmitry Baryshkov
2024-02-13 23:24 ` Doug Anderson
2024-02-10 7:09 ` [PATCH 20/22] arm64: dts: qcom: sc7180: pazquel: Add missing comment header Stephen Boyd
2024-02-10 11:51 ` Dmitry Baryshkov
2024-02-13 23:24 ` Doug Anderson
2024-02-10 7:09 ` [PATCH 21/22] arm64: dts: qcom: sc7180-trogdor: Make clamshell/detachable fragments Stephen Boyd
2024-02-10 11:53 ` Dmitry Baryshkov
2024-02-13 23:34 ` Doug Anderson
2024-02-15 0:35 ` Stephen Boyd
2024-02-15 0:39 ` Doug Anderson
2024-02-10 7:09 ` [PATCH 22/22] arm64: dts: qcom: sc7180-trogdor: Wire up USB and DP to usb-c-connectors 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=20240210070934.2549994-17-swboyd@chromium.org \
--to=swboyd@chromium.org \
--cc=bleung@chromium.org \
--cc=chrome-platform@lists.linux.dev \
--cc=devicetree@vger.kernel.org \
--cc=dianders@chromium.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=patches@lists.linux.dev \
--cc=pmalani@chromium.org \
--cc=treapking@chromium.org \
--cc=tzungbi@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