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;