ohci_s3c24x0.c revision 1.5
1/* $NetBSD: ohci_s3c24x0.c,v 1.5 2008/04/26 14:57:44 drochner Exp $ */ 2 3/* derived from ohci_pci.c */ 4 5/* 6 * Copyright (c) 1998 The NetBSD Foundation, Inc. 7 * All rights reserved. 8 * 9 * This code is derived from software contributed to The NetBSD Foundation 10 * by Lennart Augustsson (lennart@augustsson.net) at 11 * Carlstedt Research & Technology. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. All advertising materials mentioning features or use of this software 22 * must display the following acknowledgement: 23 * This product includes software developed by the NetBSD 24 * Foundation, Inc. and its contributors. 25 * 4. Neither the name of The NetBSD Foundation nor the names of its 26 * contributors may be used to endorse or promote products derived 27 * from this software without specific prior written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 30 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 31 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 32 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 33 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 34 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 35 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 36 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 37 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 39 * POSSIBILITY OF SUCH DAMAGE. 40 */ 41 42#include <sys/cdefs.h> 43__KERNEL_RCSID(0, "$NetBSD: ohci_s3c24x0.c,v 1.5 2008/04/26 14:57:44 drochner Exp $"); 44 45#include <sys/param.h> 46#include <sys/systm.h> 47#include <sys/kernel.h> 48#include <sys/device.h> 49#include <sys/proc.h> 50#include <sys/queue.h> 51 52#include <machine/bus.h> 53 54#include <arm/s3c2xx0/s3c24x0var.h> 55 56#include <dev/usb/usb.h> 57#include <dev/usb/usbdi.h> 58#include <dev/usb/usbdivar.h> 59#include <dev/usb/usb_mem.h> 60 61#include <dev/usb/ohcireg.h> 62#include <dev/usb/ohcivar.h> 63 64int ohci_ssio_match(struct device *, struct cfdata *, void *); 65void ohci_ssio_attach(struct device *, struct device *, void *); 66int ohci_ssio_detach(device_ptr_t, int); 67 68extern int ohcidebug; 69 70struct ohci_ssio_softc { 71 ohci_softc_t sc; 72 73 void *sc_ih; /* interrupt vectoring */ 74}; 75 76CFATTACH_DECL_NEW(ohci_ssio, sizeof(struct ohci_ssio_softc), 77 ohci_ssio_match, ohci_ssio_attach, ohci_ssio_detach, ohci_activate); 78 79int 80ohci_ssio_match(struct device *parent, struct cfdata *match, void *aux) 81{ 82 struct s3c2xx0_attach_args *sa = (struct s3c2xx0_attach_args *)aux; 83 /* XXX: check some registers */ 84 85 if (sa->sa_dmat == NULL) { 86 /* busdma tag is not initialized. */ 87 return 0; 88 } 89 90 return 1; 91} 92 93void 94ohci_ssio_attach(struct device *parent, struct device *self, void *aux) 95{ 96 struct ohci_ssio_softc *sc = device_private(self); 97 struct s3c2xx0_attach_args *sa = (struct s3c2xx0_attach_args *)aux; 98 99 usbd_status r; 100 101 aprint_normal("\n"); 102 103 sc->sc.sc_dev = self; 104 sc->sc.sc_bus.hci_private = sc; 105 106 sc->sc.iot = sa->sa_iot; 107 /*ohcidebug=15;*/ 108 109 /* Map I/O registers */ 110 if (bus_space_map(sc->sc.iot, sa->sa_addr, 0x5c, 0, &sc->sc.ioh)) { 111 aprint_error_dev(self, "can't map mem space\n"); 112 return; 113 } 114 115 /* Disable interrupts, so we don't get any spurious ones. */ 116 bus_space_write_4(sc->sc.iot, sc->sc.ioh, OHCI_INTERRUPT_DISABLE, 117 OHCI_ALL_INTRS); 118 119 sc->sc.sc_bus.dmatag = sa->sa_dmat; 120 121 /* Enable the device. */ 122 /* XXX: provide clock to USB block */ 123 124 /* establish the interrupt. */ 125 sc->sc_ih = s3c24x0_intr_establish(sa->sa_intr, IPL_USB, IST_NONE, ohci_intr, sc); 126 if (sc->sc_ih == NULL) { 127 aprint_error_dev(self, "couldn't establish interrupt\n"); 128 return; 129 } 130 131 strlcpy(sc->sc.sc_vendor, "Samsung", sizeof sc->sc.sc_vendor); 132 133 r = ohci_init(&sc->sc); 134 if (r != USBD_NORMAL_COMPLETION) { 135 aprint_error_dev(self, "init failed, error=%d\n", r); 136 return; 137 } 138 139 /* Attach usb device. */ 140 sc->sc.sc_child = config_found(self, &sc->sc.sc_bus, usbctlprint); 141} 142 143int 144ohci_ssio_detach(device_ptr_t self, int flags) 145{ 146 return (0); 147} 148