Module Name: src Committed By: kiyohara Date: Sat Oct 16 05:29:29 UTC 2010
Modified Files: src/sys/dev/marvell: ehci_mv.c Log Message: Support vendor dependent functions. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/dev/marvell/ehci_mv.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/dev/marvell/ehci_mv.c diff -u src/sys/dev/marvell/ehci_mv.c:1.1 src/sys/dev/marvell/ehci_mv.c:1.2 --- src/sys/dev/marvell/ehci_mv.c:1.1 Sat Oct 2 05:53:37 2010 +++ src/sys/dev/marvell/ehci_mv.c Sat Oct 16 05:29:29 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: ehci_mv.c,v 1.1 2010/10/02 05:53:37 kiyohara Exp $ */ +/* $NetBSD: ehci_mv.c,v 1.2 2010/10/16 05:29:29 kiyohara Exp $ */ /* * Copyright (c) 2008 KIYOHARA Takashi * All rights reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ehci_mv.c,v 1.1 2010/10/02 05:53:37 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ehci_mv.c,v 1.2 2010/10/16 05:29:29 kiyohara Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -72,6 +72,19 @@ #define MARVELL_USB_EHCI_BASE 0x100 #define MARVELL_USB_EHCI_SIZE 0x1000 +/* ehci vendor extension registers */ +#define MARVELL_USB_EHCI_PS_PSPD 0x0c000000 /* Port speed */ +#define MARVELL_USB_EHCI_PS_PSPD_FS 0x00000000 /* Full speed */ +#define MARVELL_USB_EHCI_PS_PSPD_LS 0x04000000 /* Low speed */ +#define MARVELL_USB_EHCI_PS_PSPD_HS 0x08000000 /* High speed */ + +#define MARVELL_USB_EHCI_USBMODE 0x68 +#define MARVELL_USB_EHCI_MODE_STRMDIS 0x00000008 /* RW straming disable */ +#define MARVELL_USB_EHCI_MODE_BE 0x00000004 /* RW B/L endianness select*/ +#define MARVELL_USB_EHCI_MODE_HDMASK 0x00000003 /* RW host/device Mask */ +#define MARVELL_USB_EHCI_MODE_HOST 0x00000003 /* RW mode host */ +#define MARVELL_USB_EHCI_MODE_DEVICE 0x00000002 /* RW mode device */ + #define MARVELL_USB_DCIVERSION 0x120 #define MARVELL_USB_DCCPARAMS 0x124 #define MARVELL_USB_TTCTRL 0x15c @@ -154,6 +167,9 @@ static void mvusb_init(struct mvusb_softc *); static void mvusb_wininit(struct mvusb_softc *); +static void mvusb_vendor_init(struct ehci_softc *); +static int mvusb_vendor_port_status(struct ehci_softc *, uint32_t, int); + CFATTACH_DECL2_NEW(mvusb_gt, sizeof(struct mvusb_softc), mvusb_match, mvusb_attach, NULL, ehci_activate, NULL, ehci_childdet); CFATTACH_DECL2_NEW(mvusb_mbus, sizeof(struct mvusb_softc), @@ -224,6 +240,9 @@ sc->sc.sc_id_vendor = 0x0000; /* XXXXX */ strcpy(sc->sc.sc_vendor, "Marvell"); + sc->sc.sc_vendor_init = mvusb_vendor_init; + sc->sc.sc_vendor_port_status = mvusb_vendor_port_status; + r = ehci_init(&sc->sc); if (r != USBD_NORMAL_COMPLETION) { aprint_error_dev(self, "init failed, error=%d\n", r); @@ -372,3 +391,37 @@ bus_space_write_4(sc->sc_iot, sc->sc_ioh, MARVELL_USB_WCR(window), 0); } + +static void +mvusb_vendor_init(struct ehci_softc *sc) +{ + uint32_t mode; + + /* put TDI/ARC silicon into EHCI mode */ + mode = EOREAD4(sc, MARVELL_USB_EHCI_USBMODE); + mode &= ~MARVELL_USB_EHCI_MODE_HDMASK; /* Host/Device Mask */ + mode |= MARVELL_USB_EHCI_MODE_HOST; + mode |= MARVELL_USB_EHCI_MODE_STRMDIS; + EOWRITE4(sc, MARVELL_USB_EHCI_USBMODE, mode); +} + +static int +mvusb_vendor_port_status(struct ehci_softc *sc, uint32_t v, int i) +{ + + i &= ~UPS_HIGH_SPEED; + if (v & EHCI_PS_CS) { + switch (v & MARVELL_USB_EHCI_PS_PSPD) { + case MARVELL_USB_EHCI_PS_PSPD_FS: + break; + case MARVELL_USB_EHCI_PS_PSPD_LS: + i |= UPS_LOW_SPEED; + break; + case MARVELL_USB_EHCI_PS_PSPD_HS: + default: + i |= UPS_HIGH_SPEED; + } + } + + return i; +}