mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/2] add support for gpio-usb-b-connector
@ 2025-06-18 21:21 Tim Harvey
  2025-06-18 21:21 ` [PATCH 1/2] usb: common: allow dr_mode to come from gpio-id based usb-connector Tim Harvey
  2025-06-18 21:21 ` [PATCH 2/2] imx8mp-venice: enable USB device mode Tim Harvey
  0 siblings, 2 replies; 3+ messages in thread
From: Tim Harvey @ 2025-06-18 21:21 UTC (permalink / raw)
  To: Stefano Babic, Fabio Estevam, NXP i.MX U-Boot Team, Tim Harvey,
	Tom Rini, Marek Vasut, u-boot
  Cc: linux-kernel

Linux has a driver for gpio-usb-b-connector that uses a GPIO to
determine host vs peripheral role. This can be useful for USB Type-B
OTG connectors which have an ID pin that is grounded on OTG-to-host
cables and floating on OTG-to-device cables as well as USB power switch
controllers such as the TPS25821 which manages cc pins and has a SINK#
output.

Both scenarios are used for various imx8mp-venice boards.

This series addes support for usb controllers in otg mode
(dr_mode="otg") which have a remote endpoint connector with compatible
'gpio-usb-b-connector' with an id-gpios property.

The first patch adds this capability to the usb_get_dr_mode() function
and the second disables the workarounds used for various imx8mp-venice
boards to default the usb dual-role controllers to host mode. 

Tim Harvey (2):
  usb: common: allow dr_mode to come from gpio-id based usb-connector
  imx8mp-venice: enable USB device mode

 .../dts/imx8mp-venice-gw71xx-2x-u-boot.dtsi   |  5 -
 .../dts/imx8mp-venice-gw72xx-2x-u-boot.dtsi   |  5 -
 .../dts/imx8mp-venice-gw73xx-2x-u-boot.dtsi   |  5 -
 arch/arm/dts/imx8mp-venice-gw74xx-u-boot.dtsi |  5 -
 configs/imx8mp_venice_defconfig               |  7 ++
 drivers/usb/common/common.c                   | 96 ++++++++++++++++++-
 6 files changed, 102 insertions(+), 21 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] usb: common: allow dr_mode to come from gpio-id based usb-connector
  2025-06-18 21:21 [PATCH 0/2] add support for gpio-usb-b-connector Tim Harvey
@ 2025-06-18 21:21 ` Tim Harvey
  2025-06-18 21:21 ` [PATCH 2/2] imx8mp-venice: enable USB device mode Tim Harvey
  1 sibling, 0 replies; 3+ messages in thread
From: Tim Harvey @ 2025-06-18 21:21 UTC (permalink / raw)
  To: Stefano Babic, Fabio Estevam, NXP i.MX U-Boot Team, Tim Harvey,
	Tom Rini, Marek Vasut, u-boot
  Cc: linux-kernel

If a usb host with dr_mode of "otg" has a usb-connector using a GPIO ID
pin use this to determine host vs peripheral.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
---
 drivers/usb/common/common.c | 96 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 95 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c
index 13e9a61072a9..1e5f9620e6b1 100644
--- a/drivers/usb/common/common.c
+++ b/drivers/usb/common/common.c
@@ -8,6 +8,7 @@
 
 #include <dm.h>
 #include <asm/global_data.h>
+#include <asm/gpio.h>
 #include <linux/printk.h>
 #include <linux/usb/otg.h>
 #include <linux/usb/ch9.h>
@@ -22,6 +23,99 @@ static const char *const usb_dr_modes[] = {
 	[USB_DR_MODE_OTG]		= "otg",
 };
 
+/**
+ * get_remote_node_from_graph - Resolve the remote node from a graph binding
+ * @node: Starting ofnode (e.g., connector)
+ * @port_id: Port unit address (e.g., 0 for port@0, or -1 for first port)
+ * @endpoint_id: Endpoint unit address (e.g., 0 for endpoint@0, or -1 for first endpoint)
+ * Return: ofnode of the remote node, or ofnode_null() on failure
+ */
+static ofnode get_remote_node_from_graph(ofnode node, int port_id, int endpoint_id)
+{
+	ofnode port_node, endpoint_node, remote_node;
+	u32 phandle_value;
+	char port_name[16];
+	char endpoint_name[16];
+
+	/* Validate the starting node */
+	if (!ofnode_valid(node)) {
+		printf("Invalid starting node\n");
+		return ofnode_null();
+	}
+
+	/* Construct port name (e.g., "port" or "port@0") */
+	if (port_id == -1)
+		strcpy(port_name, "port");
+	else
+		snprintf(port_name, sizeof(port_name), "port@%d", port_id);
+
+	/* Find the port node */
+	port_node = ofnode_find_subnode(node, port_name);
+	if (!ofnode_valid(port_node)) {
+		printf("No '%s' node found\n", port_name);
+		return ofnode_null();
+	}
+
+	/* Construct endpoint name (e.g., "endpoint" or "endpoint@0") */
+	if (endpoint_id == -1)
+		strcpy(endpoint_name, "endpoint");
+	else
+		snprintf(endpoint_name, sizeof(endpoint_name), "endpoint@%d", endpoint_id);
+
+	/* Find the endpoint node */
+	endpoint_node = ofnode_find_subnode(port_node, endpoint_name);
+	if (!ofnode_valid(endpoint_node)) {
+		printf("No '%s' node found under '%s'\n", endpoint_name, port_name);
+		return ofnode_null();
+	}
+
+	/* Read the remote-endpoint phandle */
+	phandle_value = ofnode_read_u32_default(endpoint_node, "remote-endpoint", 0);
+	if (phandle_value == 0) {
+		printf("No valid 'remote-endpoint' phandle in '%s'\n", endpoint_name);
+		return ofnode_null();
+	}
+
+	/* Resolve the phandle to the remote node */
+	remote_node = ofnode_get_by_phandle(phandle_value);
+	if (!ofnode_valid(remote_node)) {
+		printf("Failed to resolve phandle %u\n", phandle_value);
+		return ofnode_null();
+	}
+
+	return remote_node;
+}
+
+static enum usb_dr_mode get_connector_drmode(ofnode node)
+{
+	struct gpio_desc id;
+	enum usb_dr_mode dr_mode = USB_DR_MODE_OTG;
+	ofnode conn;
+
+	/* get remote endpoint */
+	conn = get_remote_node_from_graph(node, -1, -1);
+	/* get port endpoint */
+	if (ofnode_valid(conn))
+		conn = ofnode_get_parent(conn);
+	/* get connector */
+	if (ofnode_valid(conn))
+		conn = ofnode_get_parent(conn);
+	if (ofnode_valid(conn) &&
+	    ofnode_device_is_compatible(conn, "gpio-usb-b-connector") &&
+	    !gpio_request_by_name_nodev(conn, "id-gpios", 0, &id, GPIOD_IS_IN)) {
+		if (dm_gpio_get_value(&id))
+			dr_mode = USB_DR_MODE_PERIPHERAL;
+		else
+			dr_mode = USB_DR_MODE_HOST;
+		gpio_free_list_nodev(&id, 1);
+		pr_debug("%s got dr_mode from connector %s dr_mode=%s\n", __func__,
+			 ofnode_get_name(node),
+			 dr_mode == USB_DR_MODE_HOST ? "host" : "peripheral");
+	}
+
+	return dr_mode;
+}
+
 enum usb_dr_mode usb_get_dr_mode(ofnode node)
 {
 	const char *dr_mode;
@@ -35,7 +129,7 @@ enum usb_dr_mode usb_get_dr_mode(ofnode node)
 
 	for (i = 0; i < ARRAY_SIZE(usb_dr_modes); i++)
 		if (!strcmp(dr_mode, usb_dr_modes[i]))
-			return i;
+			return (i == USB_DR_MODE_OTG) ?  get_connector_drmode(node) : i;
 
 	return USB_DR_MODE_UNKNOWN;
 }
-- 
2.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 2/2] imx8mp-venice: enable USB device mode
  2025-06-18 21:21 [PATCH 0/2] add support for gpio-usb-b-connector Tim Harvey
  2025-06-18 21:21 ` [PATCH 1/2] usb: common: allow dr_mode to come from gpio-id based usb-connector Tim Harvey
@ 2025-06-18 21:21 ` Tim Harvey
  1 sibling, 0 replies; 3+ messages in thread
From: Tim Harvey @ 2025-06-18 21:21 UTC (permalink / raw)
  To: Stefano Babic, Fabio Estevam, NXP i.MX U-Boot Team, Tim Harvey,
	Tom Rini, Marek Vasut, u-boot
  Cc: linux-kernel

Now that we can determine device role via a usb-connector ID pin,
remove the host-only mode dt override and enable additional USB
device mode support.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
---
 arch/arm/dts/imx8mp-venice-gw71xx-2x-u-boot.dtsi | 5 -----
 arch/arm/dts/imx8mp-venice-gw72xx-2x-u-boot.dtsi | 5 -----
 arch/arm/dts/imx8mp-venice-gw73xx-2x-u-boot.dtsi | 5 -----
 arch/arm/dts/imx8mp-venice-gw74xx-u-boot.dtsi    | 5 -----
 configs/imx8mp_venice_defconfig                  | 7 +++++++
 5 files changed, 7 insertions(+), 20 deletions(-)

diff --git a/arch/arm/dts/imx8mp-venice-gw71xx-2x-u-boot.dtsi b/arch/arm/dts/imx8mp-venice-gw71xx-2x-u-boot.dtsi
index a291b7abab62..c1d21e51c4e6 100644
--- a/arch/arm/dts/imx8mp-venice-gw71xx-2x-u-boot.dtsi
+++ b/arch/arm/dts/imx8mp-venice-gw71xx-2x-u-boot.dtsi
@@ -54,8 +54,3 @@
 		line-name = "pci_wdis#";
 	};
 };
-
-/* gpio-usb-con not supported yet in U-Boot so make this a host for now */
-&usb_dwc3_0 {
-	dr_mode = "host";
-};
diff --git a/arch/arm/dts/imx8mp-venice-gw72xx-2x-u-boot.dtsi b/arch/arm/dts/imx8mp-venice-gw72xx-2x-u-boot.dtsi
index bdf5370fcdf6..9f6d05fdae0c 100644
--- a/arch/arm/dts/imx8mp-venice-gw72xx-2x-u-boot.dtsi
+++ b/arch/arm/dts/imx8mp-venice-gw72xx-2x-u-boot.dtsi
@@ -89,8 +89,3 @@
 		line-name = "pci_wdis#";
 	};
 };
-
-/* gpio-usb-con not supported yet in U-Boot so make this a host for now */
-&usb_dwc3_0 {
-	dr_mode = "host";
-};
diff --git a/arch/arm/dts/imx8mp-venice-gw73xx-2x-u-boot.dtsi b/arch/arm/dts/imx8mp-venice-gw73xx-2x-u-boot.dtsi
index 7e6f66bd9dd9..3b23802e9a7d 100644
--- a/arch/arm/dts/imx8mp-venice-gw73xx-2x-u-boot.dtsi
+++ b/arch/arm/dts/imx8mp-venice-gw73xx-2x-u-boot.dtsi
@@ -95,8 +95,3 @@
 		line-name = "pci_wdis#";
 	};
 };
-
-/* gpio-usb-con not supported yet in U-Boot so make this a host for now */
-&usb_dwc3_0 {
-	dr_mode = "host";
-};
diff --git a/arch/arm/dts/imx8mp-venice-gw74xx-u-boot.dtsi b/arch/arm/dts/imx8mp-venice-gw74xx-u-boot.dtsi
index 95f5f15e742a..a82ce5a19788 100644
--- a/arch/arm/dts/imx8mp-venice-gw74xx-u-boot.dtsi
+++ b/arch/arm/dts/imx8mp-venice-gw74xx-u-boot.dtsi
@@ -250,8 +250,3 @@
 &wdog1 {
 	bootph-pre-ram;
 };
-
-/* gpio-usb-con not supported yet in U-Boot so make this a host for now */
-&usb_dwc3_0 {
-	dr_mode = "host";
-};
diff --git a/configs/imx8mp_venice_defconfig b/configs/imx8mp_venice_defconfig
index 158ce4327488..2c9c6e5564fc 100644
--- a/configs/imx8mp_venice_defconfig
+++ b/configs/imx8mp_venice_defconfig
@@ -70,6 +70,7 @@ CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_PCI=y
 CONFIG_CMD_USB=y
+CONFIG_CMD_USB_MASS_STORAGE=y
 CONFIG_CMD_CAT=y
 CONFIG_CMD_SETEXPR_FMT=y
 CONFIG_CMD_XXD=y
@@ -163,6 +164,7 @@ CONFIG_IMX_TMU=y
 # CONFIG_TPM_V1 is not set
 CONFIG_TPM2_TIS_SPI=y
 CONFIG_USB=y
+CONFIG_DM_USB_GADGET=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_DWC3_OF_SIMPLE=y
@@ -178,6 +180,11 @@ CONFIG_USB_ETHER_LAN78XX=y
 CONFIG_USB_ETHER_MCS7830=y
 CONFIG_USB_ETHER_RTL8152=y
 CONFIG_USB_ETHER_SMSC95XX=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="Gateworks"
+CONFIG_USB_GADGET_VENDOR_NUM=0x0525
+CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
+CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_IMX_WATCHDOG=y
 CONFIG_TPM=y
 # CONFIG_SPL_SHA512 is not set
-- 
2.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-06-18 21:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-06-18 21:21 [PATCH 0/2] add support for gpio-usb-b-connector Tim Harvey
2025-06-18 21:21 ` [PATCH 1/2] usb: common: allow dr_mode to come from gpio-id based usb-connector Tim Harvey
2025-06-18 21:21 ` [PATCH 2/2] imx8mp-venice: enable USB device mode Tim Harvey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®