Module Name: src Committed By: reinoud Date: Wed May 21 13:02:46 UTC 2014
Modified Files: src/sys/arch/arm/samsung: exynos4_loc.c exynos5_loc.c exynos5_reg.h exynos_io.h exynos_usb.c exynos_var.h Log Message: Rework USB2 attachment using a dedicated usb devices locator. This allows for the more tightly coupled Exynos{4,5} usb2/usb2otg/usb3 controllers to share memory spaces and IRQs Note, currently only USB2 host is implemented. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/samsung/exynos4_loc.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/samsung/exynos5_loc.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/samsung/exynos5_reg.h \ src/sys/arch/arm/samsung/exynos_io.h \ src/sys/arch/arm/samsung/exynos_usb.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/samsung/exynos_var.h 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/samsung/exynos4_loc.c diff -u src/sys/arch/arm/samsung/exynos4_loc.c:1.6 src/sys/arch/arm/samsung/exynos4_loc.c:1.7 --- src/sys/arch/arm/samsung/exynos4_loc.c:1.6 Fri May 16 10:04:58 2014 +++ src/sys/arch/arm/samsung/exynos4_loc.c Wed May 21 13:02:46 2014 @@ -272,7 +272,7 @@ static const struct exyo_locators exynos { "sscom", OFFANDSIZE(,UART1), 1, IRQ_UART1, 0 }, { "sscom", OFFANDSIZE(,UART2), 2, IRQ_UART2, 0 }, { "sscom", OFFANDSIZE(,UART3), 3, IRQ_UART3, 0 }, - { "exyousb", OFFANDSIZE(,USBHOST0), 0, IRQ_UHOST, 0}, /* ehci+ohci */ + { "exyousb", 0, 0, NOPORT, NOINTR, 0}, /* uses usb locators */ }; const struct exyo_locinfo exynos4_locinfo = { @@ -301,3 +301,17 @@ const struct exyo_locinfo exynos4_i2c_lo .nlocators = __arraycount(exynos4_i2c_locators) }; + +/* usb locators */ +const struct exyo_usb_locinfo exynos4_usb_locinfo = { + .uloc_ehci_offset = EXYNOS4_USBHOST0_OFFSET, + .uloc_ohci_offset = EXYNOS4_USBHOST1_OFFSET, + .uloc_usbhost_irq = IRQ_UHOST, + .uloc_usbotg_offset = EXYNOS4_USBOTG1_OFFSET, + .uloc_usbotg_irq = IRQ_HSOTG, + .uloc_usb3_ctrl = 0, /* no usbctl */ + .uloc_usb3_linkoffset = 0, /* no usb3 */ + .uloc_usb3_slots = 0, /* no usb3 */ + .uloc_usb3_irq = 0, /* no usb3 */ +}; + Index: src/sys/arch/arm/samsung/exynos5_loc.c diff -u src/sys/arch/arm/samsung/exynos5_loc.c:1.4 src/sys/arch/arm/samsung/exynos5_loc.c:1.5 --- src/sys/arch/arm/samsung/exynos5_loc.c:1.4 Fri May 16 10:04:58 2014 +++ src/sys/arch/arm/samsung/exynos5_loc.c Wed May 21 13:02:46 2014 @@ -236,3 +236,17 @@ const struct exyo_locinfo exynos5_i2c_lo .nlocators = __arraycount(exynos5_i2c_locators) }; + +/* usb locators */ +const struct exyo_usb_locinfo exynos5_usb_locinfo = { + .uloc_ehci_offset = EXYNOS5_USB2_HOST_EHCI_OFFSET, + .uloc_ohci_offset = EXYNOS5_USB2_HOST_OHCI_OFFSET, + .uloc_usbhost_irq = IRQ_USB_HOST20, + .uloc_usbotg_offset = EXYNOS5_USB2_DEVICE_LINK_OFFSET, + .uloc_usbotg_irq = IRQ_USBOTG, + .uloc_usb3_ctrl = EXYNOS5_USB3_DEVICE_CTRL_OFFSET, + .uloc_usb3_linkoffset = EXYNOS5_USB3_DEVICE_LINK_OFFSET00, + .uloc_usb3_slots = 16, + .uloc_usb3_irq = IRQ_USB_DRD30, +}; + Index: src/sys/arch/arm/samsung/exynos5_reg.h diff -u src/sys/arch/arm/samsung/exynos5_reg.h:1.3 src/sys/arch/arm/samsung/exynos5_reg.h:1.4 --- src/sys/arch/arm/samsung/exynos5_reg.h:1.3 Wed May 14 09:03:09 2014 +++ src/sys/arch/arm/samsung/exynos5_reg.h Wed May 21 13:02:46 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: exynos5_reg.h,v 1.3 2014/05/14 09:03:09 reinoud Exp $ */ +/* $NetBSD: exynos5_reg.h,v 1.4 2014/05/21 13:02:46 reinoud Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -121,24 +121,22 @@ #define EXYNOS5_AS_A_JPEG_OFFSET 0x01DC0000 #define EXYNOS5_JPEG_OFFSET 0x01E00000 #define EXYNOS5_SYSMMU_JPEG_OFFSET 0x01F20000 -#if 0 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02000000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02010000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02020000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02030000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02040000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02050000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02060000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02070000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02080000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x02090000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x020A0000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x020B0000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x020C0000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x020D0000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x020E0000 -#define EXYNOS5_USB3_DEVICE_LINK_OFFSET 0x020F0000 -#endif +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET00 0x02000000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET01 0x02010000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET02 0x02020000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET03 0x02030000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET04 0x02040000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET05 0x02050000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET06 0x02060000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET07 0x02070000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET08 0x02080000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET09 0x02090000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET10 0x020A0000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET11 0x020B0000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET12 0x020C0000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET13 0x020D0000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET14 0x020E0000 +#define EXYNOS5_USB3_DEVICE_LINK_OFFSET15 0x020F0000 #define EXYNOS5_USB3_DEVICE_CTRL_OFFSET 0x02100000 #define EXYNOS5_USB2_HOST_EHCI_OFFSET 0x02110000 #define EXYNOS5_USB2_HOST_OHCI_OFFSET 0x02120000 Index: src/sys/arch/arm/samsung/exynos_io.h diff -u src/sys/arch/arm/samsung/exynos_io.h:1.3 src/sys/arch/arm/samsung/exynos_io.h:1.4 --- src/sys/arch/arm/samsung/exynos_io.h:1.3 Fri May 16 10:04:58 2014 +++ src/sys/arch/arm/samsung/exynos_io.h Wed May 21 13:02:46 2014 @@ -45,6 +45,8 @@ extern const struct exyo_locinfo exynos4 extern const struct exyo_locinfo exynos4_i2c_locinfo; extern const struct exyo_locinfo exynos5_locinfo; extern const struct exyo_locinfo exynos5_i2c_locinfo; +extern const struct exyo_usb_locinfo exynos4_usb_locinfo; +extern const struct exyo_usb_locinfo exynos5_usb_locinfo; /* XXXNH needed? */ #define NOPORT EXYOCF_PORT_DEFAULT Index: src/sys/arch/arm/samsung/exynos_usb.c diff -u src/sys/arch/arm/samsung/exynos_usb.c:1.3 src/sys/arch/arm/samsung/exynos_usb.c:1.4 --- src/sys/arch/arm/samsung/exynos_usb.c:1.3 Sat May 10 21:10:27 2014 +++ src/sys/arch/arm/samsung/exynos_usb.c Wed May 21 13:02:46 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: exynos_usb.c,v 1.3 2014/05/10 21:10:27 reinoud Exp $ */ +/* $NetBSD: exynos_usb.c,v 1.4 2014/05/21 13:02:46 reinoud Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: exynos_usb.c,v 1.3 2014/05/10 21:10:27 reinoud Exp $"); +__KERNEL_RCSID(1, "$NetBSD: exynos_usb.c,v 1.4 2014/05/21 13:02:46 reinoud Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -64,14 +64,12 @@ __KERNEL_RCSID(1, "$NetBSD: exynos_usb.c #include <arm/samsung/exynos_reg.h> #include <arm/samsung/exynos_var.h> +#include <arm/samsung/exynos_io.h> -static int exynos_usb_ports = 0; - struct exynos_usb_softc { device_t sc_self; - int sc_port; - int sc_irq; + const struct exyo_usb_locinfo *sc_locinfo; /* keep our tags here */ bus_dma_tag_t sc_dmat; @@ -84,49 +82,57 @@ struct exynos_usb_softc { device_t sc_ehci_dev; void *sc_intrh; -}; +} exynos_usb_sc; struct exynos_usb_attach_args { const char *name; }; static int exynos_usb_intr(void *arg); +static void exynos_usb_init(struct exynos_usb_softc *sc); static int exynos_usb_match(device_t, cfdata_t, void *); static void exynos_usb_attach(device_t, device_t, void *); -CFATTACH_DECL_NEW(exyo_usb, sizeof(struct exynos_usb_softc), +CFATTACH_DECL_NEW(exyo_usb, 0, exynos_usb_match, exynos_usb_attach, NULL, NULL); static int exynos_usb_match(device_t parent, cfdata_t cf, void *aux) { - struct exyo_attach_args *exyoaa = (struct exyo_attach_args *) aux; - - /* no multiple attachments on same port nr */ - if (exynos_usb_ports & __BIT(exyoaa->exyo_loc.loc_port)) + /* there can only be one */ + if (exynos_usb_sc.sc_self) return 0; return 1; } -#define OHCI_OFFSET 0x10000 static void exynos_usb_attach(device_t parent, device_t self, void *aux) { - struct exynos_usb_softc * const sc = device_private(self); + struct exynos_usb_softc * const sc = &exynos_usb_sc; struct exyo_attach_args *exyoaa = (struct exyo_attach_args *) aux; + struct exyo_locators *loc = &exyoaa->exyo_loc; - /* mark we're here */ - exynos_usb_ports |= __BIT(exyoaa->exyo_loc.loc_port); + /* no locators expected */ + KASSERT(loc->loc_offset == 0); + KASSERT(loc->loc_size == 0); + KASSERT(loc->loc_port == EXYOCF_PORT_DEFAULT); - /* copy our attachment info */ + /* copy our device handle */ sc->sc_self = self; - sc->sc_port = exyoaa->exyo_loc.loc_port; - sc->sc_irq = exyoaa->exyo_loc.loc_intr; +#ifdef EXYNOS4 + if (IS_EXYNOS4_P()) + sc->sc_locinfo = &exynos4_usb_locinfo; +#endif +#ifdef EXYNOS5 + if (IS_EXYNOS5_P()) + sc->sc_locinfo = &exynos5_usb_locinfo; +#endif + KASSERT(sc->sc_locinfo); /* get our bushandles */ sc->sc_bst = exyoaa->exyo_core_bst; @@ -134,11 +140,10 @@ exynos_usb_attach(device_t parent, devic // sc->sc_dmat = exyoaa->exyo_coherent_dmat; bus_space_subregion(sc->sc_bst, exyoaa->exyo_core_bsh, - exyoaa->exyo_loc.loc_offset, exyoaa->exyo_loc.loc_size, + sc->sc_locinfo->uloc_ehci_offset, EXYNOS_BLOCK_SIZE, &sc->sc_ehci_bsh); bus_space_subregion(sc->sc_bst, exyoaa->exyo_core_bsh, - exyoaa->exyo_loc.loc_offset + OHCI_OFFSET, - exyoaa->exyo_loc.loc_size, + sc->sc_locinfo->uloc_ohci_offset, EXYNOS_BLOCK_SIZE, &sc->sc_ohci_bsh); aprint_naive("\n"); @@ -158,18 +163,22 @@ exynos_usb_attach(device_t parent, devic caplength + EHCI_USBINTR, 0); #endif - /* TBD Init USB subsystem */ + /* + * Init USB subsystem + */ + exynos_usb_init(sc); /* claim shared interrupt for OHCI/EHCI */ - sc->sc_intrh = intr_establish(sc->sc_irq, IPL_USB, IST_LEVEL, - exynos_usb_intr, sc); + sc->sc_intrh = intr_establish(sc->sc_locinfo->uloc_usbhost_irq, + IPL_USB, IST_LEVEL, exynos_usb_intr, sc); if (!sc->sc_intrh) { aprint_error(": unable to establish interrupt at irq %d\n", - sc->sc_irq); + sc->sc_locinfo->uloc_usbhost_irq); /* disable? TBD */ return; } - aprint_normal_dev(sc->sc_self, "interrupting on irq %d\n", sc->sc_irq); + aprint_normal_dev(sc->sc_self, "USB2 host interrupting on irq %d\n", + sc->sc_locinfo->uloc_usbhost_irq); #if NOHCI > 0 /* attach OHCI */ @@ -237,7 +246,7 @@ exynos_ohci_match(device_t parent, cfdat static void exynos_ohci_attach(device_t parent, device_t self, void *aux) { - struct exynos_usb_softc *usbsc = device_private(parent); + struct exynos_usb_softc *usbsc = &exynos_usb_sc; struct ohci_softc *sc = device_private(self); int r; @@ -265,7 +274,8 @@ exynos_ohci_attach(device_t parent, devi return; } sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint); - aprint_normal_dev(sc->sc_dev, "interrupting on irq %d\n", usbsc->sc_irq); + aprint_normal_dev(sc->sc_dev, "interrupting on irq %d\n", + usbsc->sc_locinfo->uloc_usbhost_irq); } #endif @@ -293,7 +303,7 @@ exynos_ehci_match(device_t parent, cfdat static void exynos_ehci_attach(device_t parent, device_t self, void *aux) { - struct exynos_usb_softc *usbsc = device_private(parent); + struct exynos_usb_softc *usbsc = &exynos_usb_sc; struct ehci_softc *sc = device_private(self); int r; @@ -325,7 +335,15 @@ exynos_ehci_attach(device_t parent, devi return; } sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint); - aprint_normal_dev(sc->sc_dev, "interrupting on irq %d\n", usbsc->sc_irq); + aprint_normal_dev(sc->sc_dev, "interrupting on irq %d\n", + usbsc->sc_locinfo->uloc_usbhost_irq); } #endif + +static void +exynos_usb_init(struct exynos_usb_softc *sc) +{ + /* TBD */ +} + Index: src/sys/arch/arm/samsung/exynos_var.h diff -u src/sys/arch/arm/samsung/exynos_var.h:1.9 src/sys/arch/arm/samsung/exynos_var.h:1.10 --- src/sys/arch/arm/samsung/exynos_var.h:1.9 Fri May 16 10:04:58 2014 +++ src/sys/arch/arm/samsung/exynos_var.h Wed May 21 13:02:46 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: exynos_var.h,v 1.9 2014/05/16 10:04:58 reinoud Exp $ */ +/* $NetBSD: exynos_var.h,v 1.10 2014/05/21 13:02:46 reinoud Exp $ */ /*- * Copyright (c) 2013, 2014 The NetBSD Foundation, Inc. * All rights reserved. @@ -78,16 +78,19 @@ struct exyo_locators { uint8_t loc_sda, loc_slc, loc_func; }; -#if 0 -#define EXYO_E4410 __BIT(0) -#define EXYO_E4412 __BIT(1) -#define EXYO_E5440 __BIT(2) -#define EXYO_E5XXX __BIT(3) - -#define EXYO_ONLY __BITS(7,0) -#define EXYO_ALL __BITS(7,0) -#define EXYO_REQUIRED __BIT(8) -#endif + +struct exyo_usb_locinfo { + bus_size_t uloc_ehci_offset; + bus_size_t uloc_ohci_offset; + int uloc_usbhost_irq; + bus_size_t uloc_usbotg_offset; + int uloc_usbotg_irq; + bus_size_t uloc_usb3_ctrl; + bus_size_t uloc_usb3_linkoffset; + int uloc_usb3_slots; + int uloc_usb3_irq; +}; + struct exyo_attach_args { struct exyo_locators exyo_loc;