/* $NetBSD: ohci.c,v 1.5 2002/10/02 15:52:24 thorpej Exp $ */ /* * Copyright 2002 Wasabi Systems, Inc. * All rights reserved. * * Written by Simon Burge for Wasabi Systems, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed for the NetBSD Project by * Wasabi Systems, Inc. * 4. The name of Wasabi Systems, Inc. may not be used to endorse * or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include static int ohci_aubus_match(struct device *, struct cfdata *, void *); static void ohci_aubus_attach(struct device *, struct device *, void *); struct ohci_aubus_softc { struct device sc_dev; /* device information */ ohci_softc_t sc; bus_space_tag_t sc_st; /* bus space tag */ bus_space_handle_t sc_ohci_aubus_sh; /* USBH space handle */ void *sc_ih; /* interrupt vector */ }; CFATTACH_DECL(ohci_aubus, sizeof (struct device), ohci_aubus_match, ohci_aubus_attach, NULL, NULL); int ohci_aubus_match(struct device *parent, struct cfdata *match, void *aux) { struct aubus_attach_args *aa = aux; if (strcmp(aa->aa_name, match->cf_name) == 0) return (1); return (0); } /* * mips/alchemy/include/aureg.h: * USBH_BASE * USBH_ENABLE * UE_RD * UE_CE * UE_E * UE_C * UE_BE * USBH_SIZE */ void ohci_aubus_attach(struct device *parent, struct device *self, void *aux) { struct ohci_aubus_softc *sc = (struct ohci_aubus_softc *)self; struct aubus_attach_args *aa = aux; usbd_status r; uint32_t x; char *devname = sc->sc.sc_bus.bdev.dv_xname; sc->sc_st = aa->aa_st; r = 0; if (bus_space_map(sc->sc_st, aa->aa_addrs[0], USBH_SIZE, 0, &sc->sc_ohci_aubus_sh)) { printf("%s: Unable to map USBH registers\n", sc->sc_dev.dv_xname); return; } /* * Enable the USB Host controller here. * As per 7.2 in the Au1500 manual: * * (1) Set CE bit to enable clocks. * (2) Set E to enable OHCI, C for coherency. * (3) Clear HCFS in OHCI_CONTROL. * (4) Wait for RD bit to be set. */ x = bus_space_read_4(sc->sc_st, sc->sc_ohci_aubus_sh, 0); bus_space_write_4(sc->sc_st, sc->sc_ohci_aubus_sh, 0, (x|UE_CE)); x |= (UE_CE|UE_E|UE_C); bus_space_write_4(sc->sc_st, sc->sc_ohci_aubus_sh, 0, x); bus_space_write_4(sc->sc_st, sc->sc_ohci_aubus_sh, OHCI_CONTROL, 0); for (x = 10000; x; x--) { if (bus_space_read_4(sc->sc_st, sc->sc_ohci_aubus_sh, 0)&UE_RD) break; delay(100); } printf("%x\n", x); if (x) { printf("rd set. Calling ohci_init\n"); r = ohci_init(&sc->sc); printf("out of ohci_init. %x\n", r); } if (r != USBD_NORMAL_COMPLETION) { printf("%s: init failed, error=%d\n", devname, r); return; } printf(": Au1X00 OHCI\n"); }