Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/samsung Add support for Samsung Exynos USB.



details:   https://anonhg.NetBSD.org/src/rev/9bd64917e23c
branches:  trunk
changeset: 323847:9bd64917e23c
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Tue Jul 03 16:09:04 2018 +0000

description:
Add support for Samsung Exynos USB.

diffstat:

 sys/arch/arm/samsung/exynos_ehci.c      |  132 ++++++++------
 sys/arch/arm/samsung/exynos_ohci.c      |  130 ++++++++------
 sys/arch/arm/samsung/exynos_usb3.c      |  180 --------------------
 sys/arch/arm/samsung/exynos_usbdrdphy.c |  288 ++++++++++++++++++++++++++++++++
 sys/arch/arm/samsung/exynos_usbphy.c    |  270 +++++++++++++++++++++++++----
 sys/arch/arm/samsung/files.exynos       |   21 +-
 6 files changed, 677 insertions(+), 344 deletions(-)

diffs (truncated from 1243 to 300 lines):

diff -r 6ee6bacabfc5 -r 9bd64917e23c sys/arch/arm/samsung/exynos_ehci.c
--- a/sys/arch/arm/samsung/exynos_ehci.c        Tue Jul 03 16:06:41 2018 +0000
+++ b/sys/arch/arm/samsung/exynos_ehci.c        Tue Jul 03 16:09:04 2018 +0000
@@ -1,12 +1,9 @@
-/*     $NetBSD: exynos_ehci.c,v 1.3 2018/04/09 16:21:09 jakllsch Exp $ */
+/* $NetBSD: exynos_ehci.c,v 1.4 2018/07/03 16:09:04 jmcneill Exp $ */
 
 /*-
- * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * Copyright (c) 2015-2018 Jared McNeill <jmcneill%invisible.ca@localhost>
  * All rights reserved.
  *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Reinoud Zandijk.
- *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -16,107 +13,132 @@
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
-#include "locators.h"
-#include "ohci.h"
-#include "ehci.h"
-
 #include <sys/cdefs.h>
-
-__KERNEL_RCSID(1, "$NetBSD: exynos_ehci.c,v 1.3 2018/04/09 16:21:09 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exynos_ehci.c,v 1.4 2018/07/03 16:09:04 jmcneill Exp $");
 
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/intr.h>
 #include <sys/bus.h>
 #include <sys/device.h>
-#include <sys/proc.h>
-#include <sys/queue.h>
-#include <sys/kmem.h>
-#include <sys/gpio.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
 
 #include <dev/usb/usb.h>
 #include <dev/usb/usbdi.h>
 #include <dev/usb/usbdivar.h>
 #include <dev/usb/usb_mem.h>
-
 #include <dev/usb/ehcireg.h>
 #include <dev/usb/ehcivar.h>
 
-#include <arm/samsung/exynos_reg.h>
-#include <arm/samsung/exynos_var.h>
-
 #include <dev/fdt/fdtvar.h>
 
 static int     exynos_ehci_match(device_t, cfdata_t, void *);
 static void    exynos_ehci_attach(device_t, device_t, void *);
 
-CFATTACH_DECL_NEW(exynos_ehci, sizeof(struct ehci_softc),
-    exynos_ehci_match, exynos_ehci_attach, NULL, NULL);
-
+CFATTACH_DECL2_NEW(exynos_ehci, sizeof(struct ehci_softc),
+       exynos_ehci_match, exynos_ehci_attach, NULL,
+       ehci_activate, NULL, ehci_childdet);
 
 static int
 exynos_ehci_match(device_t parent, cfdata_t cf, void *aux)
 {
-       const char * const compatible[] = { "samsung,exynos5-ehci",
-                                           NULL };
+       const char * const compatible[] = {
+               "samsung,exynos4210-ehci",
+               NULL
+       };
        struct fdt_attach_args * const faa = aux;
+
        return of_match_compatible(faa->faa_phandle, compatible);
 }
 
-
 static void
 exynos_ehci_attach(device_t parent, device_t self, void *aux)
 {
-       struct ehci_softc *sc = device_private(self);
+       struct ehci_softc * const sc = device_private(self);
        struct fdt_attach_args * const faa = aux;
+       const int phandle = faa->faa_phandle;
+       struct fdtbus_phy *phy;
+       struct clk *clk;
+       char intrstr[128];
        bus_addr_t addr;
        bus_size_t size;
-       int error;
+       int error, child;
+       void *ih;
 
-       if (fdtbus_get_reg(faa->faa_phandle, 0, &addr, &size) != 0) {
+       if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
                aprint_error(": couldn't get registers\n");
                return;
        }
 
+       /* Enable clocks */
+       clk = fdtbus_clock_get(phandle, "usbhost");
+       if (clk == NULL || clk_enable(clk) != 0) {
+               aprint_error(": couldn't enable clock\n");
+               return;
+       }
+
+       /* Enable phys for each port */
+       for (child = OF_child(phandle); child; child = OF_peer(child)) {
+               phy = fdtbus_phy_get_index(child, 0);
+               if (phy && fdtbus_phy_enable(phy, true) != 0)
+                       aprint_error(": couldn't enable phy for %s\n",
+                           fdtbus_get_string(child, "name"));
+       }
+
        sc->sc_dev = self;
-       sc->iot = faa->faa_bst;
-       sc->sc_size = size;
+       sc->sc_bus.ub_hcpriv = sc;
        sc->sc_bus.ub_dmatag = faa->faa_dmat;
-       sc->sc_bus.ub_hcpriv = sc;
        sc->sc_bus.ub_revision = USBREV_2_0;
-       sc->sc_ncomp = 0;
-
-       error = bus_space_map(sc->iot, addr, size, 0, &sc->ioh);
-       if (error) {
-               aprint_error(": couldn't map %#llx: %d",
-                            (uint64_t)addr, error);
+       if (of_hasprop(phandle, "has-transaction-translator"))
+               sc->sc_flags |= EHCIF_ETTF;
+       else
+               sc->sc_ncomp = 1;
+       sc->sc_size = size;
+       sc->iot = faa->faa_bst;
+       if (bus_space_map(sc->iot, addr, size, 0, &sc->ioh) != 0) {
+               aprint_error(": couldn't map registers\n");
                return;
        }
 
+       aprint_naive("\n");
+       aprint_normal(": Exynos EHCI\n");
 
-       aprint_naive(": EHCI USB controller\n");
-       aprint_normal(": EHCI NOT IMPLEMENTED\n");
+       /* Disable interrupts */
+       sc->sc_offs = EREAD1(sc, EHCI_CAPLENGTH);
+       EOWRITE4(sc, EHCI_USBINTR, 0);
+
+       if (!fdtbus_intr_str(phandle, 0, intrstr, sizeof(intrstr))) {
+               aprint_error_dev(self, "failed to decode interrupt\n");
+               return;
+       }
 
-       /* attach */
+       ih = fdtbus_intr_establish(phandle, 0, IPL_USB, FDT_INTR_MPSAFE,
+           ehci_intr, sc);
+       if (ih == NULL) {
+               aprint_error_dev(self, "couldn't establish interrupt on %s\n",
+                   intrstr);
+               return;
+       }
+       aprint_normal_dev(self, "interrupting on %s\n", intrstr);
+
        error = ehci_init(sc);
        if (error) {
                aprint_error_dev(self, "init failed, error = %d\n", error);
-               /* disable : TBD */
                return;
        }
+
        sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint);
 }
diff -r 6ee6bacabfc5 -r 9bd64917e23c sys/arch/arm/samsung/exynos_ohci.c
--- a/sys/arch/arm/samsung/exynos_ohci.c        Tue Jul 03 16:06:41 2018 +0000
+++ b/sys/arch/arm/samsung/exynos_ohci.c        Tue Jul 03 16:09:04 2018 +0000
@@ -1,12 +1,9 @@
-/*     $NetBSD: exynos_ohci.c,v 1.2 2016/04/23 10:15:28 skrll Exp $    */
+/* $NetBSD: exynos_ohci.c,v 1.3 2018/07/03 16:09:04 jmcneill Exp $ */
 
 /*-
- * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * Copyright (c) 2015-2018 Jared McNeill <jmcneill%invisible.ca@localhost>
  * All rights reserved.
  *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Reinoud Zandijk.
- *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -16,105 +13,128 @@
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
-#include "locators.h"
-#include "ohci.h"
-#include "ehci.h"
-
 #include <sys/cdefs.h>
-
-__KERNEL_RCSID(1, "$NetBSD: exynos_ohci.c,v 1.2 2016/04/23 10:15:28 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exynos_ohci.c,v 1.3 2018/07/03 16:09:04 jmcneill Exp $");
 
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/intr.h>
 #include <sys/bus.h>
 #include <sys/device.h>
-#include <sys/proc.h>
-#include <sys/queue.h>
-#include <sys/kmem.h>
-#include <sys/gpio.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
 
 #include <dev/usb/usb.h>
 #include <dev/usb/usbdi.h>
 #include <dev/usb/usbdivar.h>
 #include <dev/usb/usb_mem.h>
-
 #include <dev/usb/ohcireg.h>
 #include <dev/usb/ohcivar.h>
 
-#include <arm/samsung/exynos_reg.h>
-#include <arm/samsung/exynos_var.h>
-
 #include <dev/fdt/fdtvar.h>
 
 static int     exynos_ohci_match(device_t, cfdata_t, void *);
 static void    exynos_ohci_attach(device_t, device_t, void *);
 
-CFATTACH_DECL_NEW(exynos_ohci, sizeof(struct ohci_softc),
-    exynos_ohci_match, exynos_ohci_attach, NULL, NULL);
-
+CFATTACH_DECL2_NEW(exynos_ohci, sizeof(struct ohci_softc),
+       exynos_ohci_match, exynos_ohci_attach, NULL,
+       ohci_activate, NULL, ohci_childdet);
 
 static int
 exynos_ohci_match(device_t parent, cfdata_t cf, void *aux)
 {
-       const char * const compatible[] = { "samsung,exynos5-ohci",
-                                           NULL };
+       const char * const compatible[] = {
+               "samsung,exynos4210-ohci",



Home | Main Index | Thread Index | Old Index