cip-dev.lists.cip-project.org archive mirror
 help / color / mirror / Atom feed
From: marian-cristian.rotariu.rb@bp.renesas.com (Marian-Cristian Rotariu)
To: cip-dev@lists.cip-project.org
Subject: [cip-dev] [PATCH 4.19.y-cip 02/23] usb: typec: mux: Find the muxes by also matching against the device node
Date: Tue, 18 Feb 2020 14:04:59 +0000	[thread overview]
Message-ID: <1582034720-5249-3-git-send-email-marian-cristian.rotariu.rb@bp.renesas.com> (raw)
In-Reply-To: <1582034720-5249-1-git-send-email-marian-cristian.rotariu.rb@bp.renesas.com>

From: Heikki Krogerus <heikki.krogerus@linux.intel.com>

commit 96a6d031ca9930938bd66d0052fc7ed2b56e3583 upstream.

When the connections are defined in firmware, struct
device_connection will have the fwnode member pointing to
the device node (struct fwnode_handle) of the requested
device, and the endpoint will not be used at all in that
case.

Acked-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Jun Li <jun.li@nxp.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Marian-Cristian Rotariu <marian-cristian.rotariu.rb@bp.renesas.com>
---
 drivers/usb/typec/mux.c | 86 ++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 74 insertions(+), 12 deletions(-)

diff --git a/drivers/usb/typec/mux.c b/drivers/usb/typec/mux.c
index d990aa5..0c4e0b5 100644
--- a/drivers/usb/typec/mux.c
+++ b/drivers/usb/typec/mux.c
@@ -11,6 +11,8 @@
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
+#include <linux/property.h>
+#include <linux/slab.h>
 #include <linux/usb/typec_mux.h>
 
 static DEFINE_MUTEX(switch_lock);
@@ -23,15 +25,25 @@ static void *typec_switch_match(struct device_connection *con, int ep,
 {
 	struct typec_switch *sw;
 
-	list_for_each_entry(sw, &switch_list, entry)
-		if (!strcmp(con->endpoint[ep], dev_name(sw->dev)))
-			return sw;
+	if (!con->fwnode) {
+		list_for_each_entry(sw, &switch_list, entry)
+			if (!strcmp(con->endpoint[ep], dev_name(sw->dev)))
+				return sw;
+		return ERR_PTR(-EPROBE_DEFER);
+	}
 
 	/*
-	 * We only get called if a connection was found, tell the caller to
-	 * wait for the switch to show up.
+	 * With OF graph the mux node must have a boolean device property named
+	 * "orientation-switch".
 	 */
-	return ERR_PTR(-EPROBE_DEFER);
+	if (con->id && !fwnode_property_present(con->fwnode, con->id))
+		return NULL;
+
+	list_for_each_entry(sw, &switch_list, entry)
+		if (dev_fwnode(sw->dev) == con->fwnode)
+			return sw;
+
+	return con->id ? ERR_PTR(-EPROBE_DEFER) : NULL;
 }
 
 /**
@@ -112,17 +124,67 @@ EXPORT_SYMBOL_GPL(typec_switch_unregister);
 
 static void *typec_mux_match(struct device_connection *con, int ep, void *data)
 {
+	const struct typec_altmode_desc *desc = data;
 	struct typec_mux *mux;
+	size_t nval;
+	bool match;
+	u16 *val;
+	int i;
 
-	list_for_each_entry(mux, &mux_list, entry)
-		if (!strcmp(con->endpoint[ep], dev_name(mux->dev)))
-			return mux;
+	if (!con->fwnode) {
+		list_for_each_entry(mux, &mux_list, entry)
+			if (!strcmp(con->endpoint[ep], dev_name(mux->dev)))
+				return mux;
+		return ERR_PTR(-EPROBE_DEFER);
+	}
 
 	/*
-	 * We only get called if a connection was found, tell the caller to
-	 * wait for the switch to show up.
+	 * Check has the identifier already been "consumed". If it
+	 * has, no need to do any extra connection identification.
 	 */
-	return ERR_PTR(-EPROBE_DEFER);
+	match = !con->id;
+	if (match)
+		goto find_mux;
+
+	/* Accessory Mode muxes */
+	if (!desc) {
+		match = fwnode_property_present(con->fwnode, "accessory");
+		if (match)
+			goto find_mux;
+		return NULL;
+	}
+
+	/* Alternate Mode muxes */
+	nval = fwnode_property_read_u16_array(con->fwnode, "svid", NULL, 0);
+	if (nval <= 0)
+		return NULL;
+
+	val = kcalloc(nval, sizeof(*val), GFP_KERNEL);
+	if (!val)
+		return ERR_PTR(-ENOMEM);
+
+	nval = fwnode_property_read_u16_array(con->fwnode, "svid", val, nval);
+	if (nval < 0) {
+		kfree(val);
+		return ERR_PTR(nval);
+	}
+
+	for (i = 0; i < nval; i++) {
+		match = val[i] == desc->svid;
+		if (match) {
+			kfree(val);
+			goto find_mux;
+		}
+	}
+	kfree(val);
+	return NULL;
+
+find_mux:
+	list_for_each_entry(mux, &mux_list, entry)
+		if (dev_fwnode(mux->dev) == con->fwnode)
+			return mux;
+
+	return match ? ERR_PTR(-EPROBE_DEFER) : NULL;
 }
 
 /**
-- 
2.7.4

  parent reply	other threads:[~2020-02-18 14:04 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-18 14:04 [cip-dev] [PATCH 4.19.y-cip 00/23] Renesas RZ/G2E USB Type-C Backport Marian-Cristian Rotariu
2020-02-18 14:04 ` [cip-dev] [PATCH 4.19.y-cip 01/23] device connection: Add fwnode member to struct device_connection Marian-Cristian Rotariu
2020-02-19  7:42   ` Pavel Machek
2020-02-19 19:11     ` Marian-Cristian Rotariu
2020-02-18 14:04 ` Marian-Cristian Rotariu [this message]
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 03/23] usb: typec: mux: Fix unsigned comparison with less than zero Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 04/23] usb: roles: Find the muxes by also matching against the device node Marian-Cristian Rotariu
2020-02-19  7:51   ` Pavel Machek
2020-02-19 19:04     ` Marian-Cristian Rotariu
2020-02-19 21:38       ` Pavel Machek
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 05/23] usb: typec: Find the ports " Marian-Cristian Rotariu
2020-02-19  7:56   ` Pavel Machek
2020-02-20 10:44     ` [cip-dev] " Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 06/23] device connection: Prepare support for firmware described connections Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 07/23] device connection: Find device connections also from device graphs Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 08/23] device property: Introduce fwnode_find_reference() Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 09/23] device connection: Find connections also by checking the references Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 10/23] usb: roles: Introduce stubs for the exiting functions in role.h Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 11/23] device connection: Add fwnode_connection_find_match() Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 12/23] usb: roles: Add fwnode_usb_role_switch_get() function Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 13/23] dt-bindings: usb: hd3ss3220 device tree binding document Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 14/23] dt-bindings: usb: renesas_usb3: Document usb role switch support Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 15/23] usb: typec: driver for TI HD3SS3220 USB Type-C DRP port controller Marian-Cristian Rotariu
2020-02-19  8:12   ` Pavel Machek
2020-02-20 11:20     ` [cip-dev] " Marian-Cristian Rotariu
2020-02-20 15:46       ` Pavel Machek
2020-02-20 16:28         ` Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 16/23] usb: typec: hd3ss3220_irq() can be static Marian-Cristian Rotariu
2020-02-19  8:20   ` Pavel Machek
2020-02-19 19:15     ` Marian-Cristian Rotariu
2020-02-19 21:40       ` Pavel Machek
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 17/23] usb: typec: add dependency for TYPEC_HD3SS3220 Marian-Cristian Rotariu
2020-02-19  8:16   ` Pavel Machek
2020-02-20 11:40     ` [cip-dev] " Marian-Cristian Rotariu
2020-02-20 15:50       ` Pavel Machek
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 18/23] usb: typec: hd3ss3220: hd3ss3220_probe() warn: passing zero to 'PTR_ERR' Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 19/23] usb: typec: fix an IS_ERR() vs NULL bug in hd3ss3220_probe() Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 20/23] usb: gadget: udc: renesas_usb3: Enhance role switch support Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 21/23] arm64: defconfig: enable TYPEC_HD3SS3220 config option Marian-Cristian Rotariu
2020-02-19  8:19   ` Pavel Machek
2020-02-19 19:18     ` Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 22/23] arm64: dts: renesas: cat874: Enable USB3.0 host/peripheral device node Marian-Cristian Rotariu
2020-02-18 14:05 ` [cip-dev] [PATCH 4.19.y-cip 23/23] arm64: dts: renesas: cat874: Enable usb role switch support Marian-Cristian Rotariu
2020-02-19  7:41 ` [PATCH 4.19.y-cip 00/23] Renesas RZ/G2E USB Type-C Backport Pavel Machek
2020-02-19 18:43   ` Marian-Cristian Rotariu
2020-02-19 21:35     ` Pavel Machek

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=1582034720-5249-3-git-send-email-marian-cristian.rotariu.rb@bp.renesas.com \
    --to=marian-cristian.rotariu.rb@bp.renesas.com \
    --cc=cip-dev@lists.cip-project.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).