Module Name:    src
Committed By:   bouyer
Date:           Thu May  4 17:09:45 UTC 2023

Modified Files:
        src/sys/arch/arm/imx: imx23_usb.c imxusb.c imxusbvar.h
        src/sys/arch/arm/nxp: imx6_usb.c

Log Message:
The i.mx6sx has 2 OTG and one host-only USB controller, while the 6q has
only one OTG.
Add a "uintptr_t data" argument to all sc_*_md_hook callbacks, which
gets the sc_md_hook_data value when called.
In imx6_usb.c use this to pass the number of OTG controllers to the callbacks.
imx6_usb_init() can then properly call init_otg() or init_h1() for unit 1.

In imx6_usb_attach(), test if there is a vbus-supply property in the fdt,
and enable the regulator if present.

Now the USB port of the UDOO Neo works.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/imx/imx23_usb.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/arm/imx/imxusb.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/imx/imxusbvar.h
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/nxp/imx6_usb.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/imx/imx23_usb.c
diff -u src/sys/arch/arm/imx/imx23_usb.c:1.5 src/sys/arch/arm/imx/imx23_usb.c:1.6
--- src/sys/arch/arm/imx/imx23_usb.c:1.5	Sat Aug  7 16:18:44 2021
+++ src/sys/arch/arm/imx/imx23_usb.c	Thu May  4 17:09:44 2023
@@ -1,4 +1,4 @@
-/* $Id: imx23_usb.c,v 1.5 2021/08/07 16:18:44 thorpej Exp $ */
+/* $Id: imx23_usb.c,v 1.6 2023/05/04 17:09:44 bouyer Exp $ */
 
 /*
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -152,7 +152,7 @@ imxusbc_search(device_t parent, cfdata_t
 }
 
 static
-void imx23_usb_init(struct imxehci_softc *sc)
+void imx23_usb_init(struct imxehci_softc *sc, uintptr_t data)
 {
 
 	sc->sc_iftype = IMXUSBC_IF_UTMI;

Index: src/sys/arch/arm/imx/imxusb.c
diff -u src/sys/arch/arm/imx/imxusb.c:1.18 src/sys/arch/arm/imx/imxusb.c:1.19
--- src/sys/arch/arm/imx/imxusb.c:1.18	Sat Aug  7 16:18:44 2021
+++ src/sys/arch/arm/imx/imxusb.c	Thu May  4 17:09:44 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: imxusb.c,v 1.18 2021/08/07 16:18:44 thorpej Exp $	*/
+/*	$NetBSD: imxusb.c,v 1.19 2023/05/04 17:09:44 bouyer Exp $	*/
 /*
  * Copyright (c) 2009, 2010  Genetec Corporation.  All rights reserved.
  * Written by Hashimoto Kenichi and Hiroyuki Bessho for Genetec Corporation.
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: imxusb.c,v 1.18 2021/08/07 16:18:44 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: imxusb.c,v 1.19 2023/05/04 17:09:44 bouyer Exp $");
 
 #include "locators.h"
 #include "opt_imx.h"
@@ -158,7 +158,7 @@ imxehci_attach(device_t parent, device_t
 
 	/* Platform dependent setup */
 	if (usbc->sc_init_md_hook)
-		usbc->sc_init_md_hook(sc);
+		usbc->sc_init_md_hook(sc, usbc->sc_md_hook_data);
 
 	imxehci_reset(sc);
 	imxehci_select_interface(sc, sc->sc_iftype);
@@ -178,7 +178,7 @@ imxehci_attach(device_t parent, device_t
 	}
 
 	if (usbc->sc_setup_md_hook)
-		usbc->sc_setup_md_hook(sc, IMXUSB_HOST);
+		usbc->sc_setup_md_hook(sc, IMXUSB_HOST, usbc->sc_md_hook_data);
 
 	if (sc->sc_iftype == IMXUSBC_IF_ULPI) {
 #if 0
@@ -202,7 +202,8 @@ imxehci_attach(device_t parent, device_t
 	EOWRITE4(hsc, EHCI_USBINTR, 0);
 
 	if (usbc->sc_intr_establish_md_hook)
-		sc->sc_ih = usbc->sc_intr_establish_md_hook(sc);
+		sc->sc_ih = usbc->sc_intr_establish_md_hook(sc,
+		    usbc->sc_md_hook_data);
 	else if (aa->aa_irq > 0)
 		sc->sc_ih = intr_establish(aa->aa_irq, IPL_USB, IST_LEVEL, ehci_intr, hsc);
 	KASSERT(sc->sc_ih != NULL);

Index: src/sys/arch/arm/imx/imxusbvar.h
diff -u src/sys/arch/arm/imx/imxusbvar.h:1.6 src/sys/arch/arm/imx/imxusbvar.h:1.7
--- src/sys/arch/arm/imx/imxusbvar.h:1.6	Wed Jul 24 11:20:55 2019
+++ src/sys/arch/arm/imx/imxusbvar.h	Thu May  4 17:09:44 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: imxusbvar.h,v 1.6 2019/07/24 11:20:55 hkenken Exp $	*/
+/*	$NetBSD: imxusbvar.h,v 1.7 2023/05/04 17:09:44 bouyer Exp $	*/
 /*
  * Copyright (c) 2019  Genetec Corporation.  All rights reserved.
  * Written by Hashimoto Kenichi for Genetec Corporation.
@@ -48,9 +48,11 @@ struct imxusbc_softc {
 	bus_addr_t sc_ehci_offset;
 	bus_size_t sc_ehci_size;
 
-	void (* sc_init_md_hook)(struct imxehci_softc *);
-	void *(* sc_intr_establish_md_hook)(struct imxehci_softc *);
-	void (* sc_setup_md_hook)(struct imxehci_softc *, enum imx_usb_role);
+	void (* sc_init_md_hook)(struct imxehci_softc *, uintptr_t);
+	void *(* sc_intr_establish_md_hook)(struct imxehci_softc *, uintptr_t);
+	void (* sc_setup_md_hook)(struct imxehci_softc *, enum imx_usb_role,
+				  uintptr_t);
+	uintptr_t sc_md_hook_data;
 };
 
 struct imxusbc_attach_args {

Index: src/sys/arch/arm/nxp/imx6_usb.c
diff -u src/sys/arch/arm/nxp/imx6_usb.c:1.7 src/sys/arch/arm/nxp/imx6_usb.c:1.8
--- src/sys/arch/arm/nxp/imx6_usb.c:1.7	Thu May  4 13:29:33 2023
+++ src/sys/arch/arm/nxp/imx6_usb.c	Thu May  4 17:09:45 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: imx6_usb.c,v 1.7 2023/05/04 13:29:33 bouyer Exp $	*/
+/*	$NetBSD: imx6_usb.c,v 1.8 2023/05/04 17:09:45 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 2019 Genetec Corporation.  All rights reserved.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: imx6_usb.c,v 1.7 2023/05/04 13:29:33 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: imx6_usb.c,v 1.8 2023/05/04 17:09:45 bouyer Exp $");
 
 #include "opt_fdt.h"
 
@@ -63,20 +63,20 @@ struct imxusbc_fdt_softc {
 static int imx6_usb_match(device_t, struct cfdata *, void *);
 static void imx6_usb_attach(device_t, device_t, void *);
 static int imx6_usb_init_clocks(struct imxusbc_softc *);
-static void imx6_usb_init(struct imxehci_softc *);
+static void imx6_usb_init(struct imxehci_softc *, uintptr_t);
 static void init_otg(struct imxehci_softc *);
 static void init_h1(struct imxehci_softc *);
 static int imxusbc_print(void *, const char *);
-static void *imx6_usb_intr_establish(struct imxehci_softc *);
+static void *imx6_usb_intr_establish(struct imxehci_softc *, uintptr_t);
 
 /* attach structures */
 CFATTACH_DECL_NEW(imxusbc_fdt, sizeof(struct imxusbc_fdt_softc),
     imx6_usb_match, imx6_usb_attach, NULL, NULL);
 
 static const struct device_compatible_entry compat_data[] = {
-	{ .compat = "fsl,imx6q-usb" },
-	{ .compat = "fsl,imx6sx-usb" },
-	{ .compat = "fsl,imx7d-usb" },
+	{ .compat = "fsl,imx6q-usb", .value = 1 },
+	{ .compat = "fsl,imx6sx-usb", .value = 2 },
+	{ .compat = "fsl,imx7d-usb", .value = 1 },
 	DEVICE_COMPAT_EOL
 };
 
@@ -100,6 +100,7 @@ imx6_usb_attach(device_t parent, device_
 	bus_addr_t addr;
 	bus_size_t size;
 	int error;
+	struct fdtbus_regulator *reg;
 
 	aprint_naive("\n");
 	aprint_normal("\n");
@@ -126,6 +127,7 @@ imx6_usb_attach(device_t parent, device_
 	sc->sc_init_md_hook = imx6_usb_init;
 	sc->sc_intr_establish_md_hook = imx6_usb_intr_establish;
 	sc->sc_setup_md_hook = NULL;
+	sc->sc_md_hook_data = of_compatible_lookup(phandle, compat_data)->value;
 
 	sc->sc_dev = self;
 	sc->sc_iot = bst;
@@ -168,6 +170,21 @@ imx6_usb_attach(device_t parent, device_
 	config_found(self, &iaa, imxusbc_print,
 	    CFARGS_NONE);
 
+	if (of_hasprop(phandle, "vbus-supply")) {
+		reg = fdtbus_regulator_acquire(phandle, "vbus-supply");
+		if (reg == NULL) {
+			aprint_error_dev(self,
+			    "couldn't acquire vbus-supply\n");
+		} else {
+			error = fdtbus_regulator_enable(reg);
+			if (error != 0) {
+				aprint_error_dev(self,
+				    "couldn't enable vbus-supply\n");
+			}
+		}
+	} else {
+		aprint_verbose_dev(self, "no regulator\n");
+	}
 	return;
 }
 
@@ -198,14 +215,19 @@ imx6_usb_init_clocks(struct imxusbc_soft
 }
 
 static void
-imx6_usb_init(struct imxehci_softc *sc)
+imx6_usb_init(struct imxehci_softc *sc, uintptr_t data)
 {
+	int notg = data;
+
 	switch (sc->sc_unit) {
 	case 0:	/* OTG controller */
 		init_otg(sc);
 		break;
 	case 1:	/* EHCI Host 1 */
-		init_h1(sc);
+		if (notg >= 2)
+			init_otg(sc);
+		else
+			init_h1(sc);
 		break;
 	case 2:	/* EHCI Host 2 */
 	case 3:	/* EHCI Host 3 */
@@ -257,7 +279,7 @@ init_h1(struct imxehci_softc *sc)
 }
 
 static void *
-imx6_usb_intr_establish(struct imxehci_softc *sc)
+imx6_usb_intr_establish(struct imxehci_softc *sc, uintptr_t data)
 {
 	struct imxusbc_fdt_softc *ifsc = (struct imxusbc_fdt_softc *)sc->sc_usbc;
 	ehci_softc_t *hsc = &sc->sc_hsc;

Reply via email to