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 v3 10/17] device property: Add remote endpoint to devcon matcher
Date: Mon, 19 Aug 2024 15:38:24 -0700 [thread overview]
Message-ID: <20240819223834.2049862-11-swboyd@chromium.org> (raw)
In-Reply-To: <20240819223834.2049862-1-swboyd@chromium.org>
When a single DT node has a graph connected to more than one
usb-c-connector node we can't differentiate which typec switch
registered for the device is associated with the USB connector because
the devcon matcher code assumes a 1:1 relationship between remote node
and typec switch. Furthermore, we don't have a #typec-switch-cells
property so there can only be one node per typec switch.
Support multiple USB typec switches exposed by one node by passing the
remote endpoint node in addition to the remote node to the devcon
matcher function (devcon_match_fn_t). With this change, typec switch
drivers can register switches with the device node pointer for a graph
endpoint so that they can support more than one typec switch if
necessary. Either way, a DT property like 'mode-switch' is always in the
graph's parent node and not in the endpoint node.
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Daniel Scally <djrscally@gmail.com>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Cc: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
Cc: Ivan Orlov <ivan.orlov0322@gmail.com>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>
Cc: Conor Dooley <conor+dt@kernel.org>
Cc: <devicetree@vger.kernel.org>
Cc: <linux-usb@vger.kernel.org>
Cc: <linux-acpi@vger.kernel.org>
Cc: Pin-yen Lin <treapking@chromium.org>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
drivers/base/property.c | 7 +++++--
drivers/usb/roles/class.c | 4 ++--
drivers/usb/typec/mux.c | 8 ++++++++
drivers/usb/typec/retimer.c | 7 ++++++-
include/linux/property.h | 5 +++--
5 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/drivers/base/property.c b/drivers/base/property.c
index 837d77e3af2b..621de33f2956 100644
--- a/drivers/base/property.c
+++ b/drivers/base/property.c
@@ -1284,6 +1284,7 @@ static unsigned int fwnode_graph_devcon_matches(const struct fwnode_handle *fwno
{
struct fwnode_handle *node;
struct fwnode_handle *ep;
+ struct fwnode_handle *remote_ep;
unsigned int count = 0;
void *ret;
@@ -1299,7 +1300,9 @@ static unsigned int fwnode_graph_devcon_matches(const struct fwnode_handle *fwno
continue;
}
- ret = match(node, con_id, data);
+ remote_ep = fwnode_graph_get_remote_endpoint(ep);
+ ret = match(node, remote_ep, con_id, data);
+ fwnode_handle_put(remote_ep);
fwnode_handle_put(node);
if (ret) {
if (matches)
@@ -1329,7 +1332,7 @@ static unsigned int fwnode_devcon_matches(const struct fwnode_handle *fwnode,
if (IS_ERR(node))
break;
- ret = match(node, NULL, data);
+ ret = match(node, NULL, NULL, data);
fwnode_handle_put(node);
if (ret) {
if (matches)
diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c
index d7aa913ceb8a..d8bd5071d9d8 100644
--- a/drivers/usb/roles/class.c
+++ b/drivers/usb/roles/class.c
@@ -121,8 +121,8 @@ enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw)
}
EXPORT_SYMBOL_GPL(usb_role_switch_get_role);
-static void *usb_role_switch_match(const struct fwnode_handle *fwnode, const char *id,
- void *data)
+static void *usb_role_switch_match(const struct fwnode_handle *fwnode, const struct fwnode_handle *endpoint,
+ const char *id, void *data)
{
struct device *dev;
diff --git a/drivers/usb/typec/mux.c b/drivers/usb/typec/mux.c
index 3531ab03bac4..ab53532282ff 100644
--- a/drivers/usb/typec/mux.c
+++ b/drivers/usb/typec/mux.c
@@ -33,6 +33,7 @@ static int switch_fwnode_match(struct device *dev, const void *fwnode)
}
static void *typec_switch_match(const struct fwnode_handle *fwnode,
+ const struct fwnode_handle *endpoint,
const char *id, void *data)
{
struct device *dev;
@@ -55,6 +56,9 @@ static void *typec_switch_match(const struct fwnode_handle *fwnode,
*/
dev = class_find_device(&typec_mux_class, NULL, fwnode,
switch_fwnode_match);
+ if (!dev)
+ dev = class_find_device(&typec_mux_class, NULL, endpoint,
+ switch_fwnode_match);
return dev ? to_typec_switch_dev(dev) : ERR_PTR(-EPROBE_DEFER);
}
@@ -290,6 +294,7 @@ static int mux_fwnode_match(struct device *dev, const void *fwnode)
}
static void *typec_mux_match(const struct fwnode_handle *fwnode,
+ const struct fwnode_handle *endpoint,
const char *id, void *data)
{
struct device *dev;
@@ -307,6 +312,9 @@ static void *typec_mux_match(const struct fwnode_handle *fwnode,
dev = class_find_device(&typec_mux_class, NULL, fwnode,
mux_fwnode_match);
+ if (!dev)
+ dev = class_find_device(&typec_mux_class, NULL, endpoint,
+ mux_fwnode_match);
return dev ? to_typec_mux_dev(dev) : ERR_PTR(-EPROBE_DEFER);
}
diff --git a/drivers/usb/typec/retimer.c b/drivers/usb/typec/retimer.c
index b519fcf358ca..ee4e6312c2d9 100644
--- a/drivers/usb/typec/retimer.c
+++ b/drivers/usb/typec/retimer.c
@@ -22,7 +22,9 @@ static int retimer_fwnode_match(struct device *dev, const void *fwnode)
return is_typec_retimer(dev) && device_match_fwnode(dev, fwnode);
}
-static void *typec_retimer_match(const struct fwnode_handle *fwnode, const char *id, void *data)
+static void *typec_retimer_match(const struct fwnode_handle *fwnode,
+ const struct fwnode_handle *endpoint,
+ const char *id, void *data)
{
struct device *dev;
@@ -31,6 +33,9 @@ static void *typec_retimer_match(const struct fwnode_handle *fwnode, const char
dev = class_find_device(&retimer_class, NULL, fwnode,
retimer_fwnode_match);
+ if (!dev)
+ dev = class_find_device(&retimer_class, NULL, endpoint,
+ retimer_fwnode_match);
return dev ? to_typec_retimer(dev) : ERR_PTR(-EPROBE_DEFER);
}
diff --git a/include/linux/property.h b/include/linux/property.h
index 61fc20e5f81f..3e27d7b76db9 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -507,8 +507,9 @@ unsigned int fwnode_graph_get_endpoint_count(const struct fwnode_handle *fwnode,
int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
struct fwnode_endpoint *endpoint);
-typedef void *(*devcon_match_fn_t)(const struct fwnode_handle *fwnode, const char *id,
- void *data);
+typedef void *(*devcon_match_fn_t)(const struct fwnode_handle *fwnode,
+ const struct fwnode_handle *endpoint,
+ const char *id, void *data);
void *fwnode_connection_find_match(const struct fwnode_handle *fwnode,
const char *con_id, void *data,
--
https://chromeos.dev
next prev parent reply other threads:[~2024-08-19 22:38 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-19 22:38 [PATCH v3 00/17] platform/chrome: Add DT USB/DP muxing/topology support Stephen Boyd
2024-08-19 22:38 ` [PATCH v3 01/17] drm/atomic-helper: Introduce lane remapping support to bridges Stephen Boyd
2024-08-19 22:38 ` [PATCH v3 02/17] drm/bridge: Verify lane assignment is going to work during atomic_check Stephen Boyd
2024-08-20 10:09 ` Andy Shevchenko
2024-08-20 17:12 ` Stephen Boyd
2024-08-20 17:17 ` Andy Shevchenko
2024-08-20 17:24 ` Stephen Boyd
2024-08-20 17:29 ` Andy Shevchenko
2024-08-20 17:33 ` Stephen Boyd
2024-08-19 22:38 ` [PATCH v3 03/17] usb: typec: Stub out typec_switch APIs when CONFIG_TYPEC=n Stephen Boyd
2024-08-20 10:12 ` Andy Shevchenko
2024-08-19 22:38 ` [PATCH v3 04/17] usb: typec: Add device managed typec_mux_register() Stephen Boyd
2024-08-20 10:14 ` Andy Shevchenko
2024-08-19 22:38 ` [PATCH v3 05/17] usb: typec: Add device managed typec_switch_register() Stephen Boyd
2024-08-20 10:16 ` Andy Shevchenko
2024-08-20 17:01 ` Stephen Boyd
2024-08-20 17:16 ` Andy Shevchenko
2024-08-20 17:19 ` Stephen Boyd
2024-08-20 17:23 ` Stephen Boyd
2024-08-20 17:27 ` Andy Shevchenko
2024-08-19 22:38 ` [PATCH v3 06/17] drm/bridge: aux-hpd: Support USB Type-C DP altmodes via DRM lane assignment Stephen Boyd
2024-08-19 22:38 ` [PATCH v3 07/17] drm/bridge: dp_typec: Support USB Type-C orientation Stephen Boyd
2024-08-20 8:02 ` kernel test robot
2024-08-19 22:38 ` [PATCH v3 08/17] drm/bridge: dp_typec: Add "no-hpd" support Stephen Boyd
2024-08-19 22:38 ` [PATCH v3 09/17] drm/bridge: dp_typec: Allow users to hook hpd notify path Stephen Boyd
2024-08-20 10:06 ` kernel test robot
2024-08-19 22:38 ` Stephen Boyd [this message]
2024-08-20 10:20 ` [PATCH v3 10/17] device property: Add remote endpoint to devcon matcher Andy Shevchenko
2024-08-20 17:34 ` Stephen Boyd
2024-08-19 22:38 ` [PATCH v3 11/17] dt-bindings: usb-switch: Extract endpoints to defs Stephen Boyd
2024-08-21 0:33 ` Rob Herring
2024-08-19 22:38 ` [PATCH v3 12/17] dt-bindings: usb-switch: Extend for DisplayPort altmode Stephen Boyd
2024-08-21 0:33 ` Rob Herring (Arm)
2024-08-19 22:38 ` [PATCH v3 13/17] dt-bindings: Move google,cros-ec-typec binding to usb Stephen Boyd
2024-08-21 0:33 ` Rob Herring (Arm)
2024-08-22 13:39 ` Lee Jones
2024-08-22 14:34 ` Tzung-Bi Shih
2024-08-23 20:47 ` Stephen Boyd
2024-08-19 22:38 ` [PATCH v3 14/17] dt-bindings: usb: Add ports to google,cros-ec-typec for DP altmode Stephen Boyd
2024-08-21 0:34 ` Rob Herring (Arm)
2024-08-19 22:38 ` [PATCH v3 15/17] platform/chrome: cros_ec_typec: Add support for signaling DP HPD via drm_bridge Stephen Boyd
2024-08-22 14:35 ` Tzung-Bi Shih
2024-08-23 20:47 ` Stephen Boyd
2024-08-27 3:25 ` Tzung-Bi Shih
2024-08-19 22:38 ` [PATCH v3 16/17] platform/chrome: cros_ec_typec: Support DP muxing Stephen Boyd
2024-08-22 14:37 ` Tzung-Bi Shih
2024-08-23 20:44 ` Stephen Boyd
2024-08-26 9:58 ` Andy Shevchenko
2024-08-19 22:38 ` [PATCH v3 17/17] platform/chrome: cros_ec_typec: Handle lack of HPD information 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=20240819223834.2049862-11-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;
as well as URLs for NNTP newsgroup(s).