19ba8a927SNathan Whitehorn /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 371e3c308SPedro F. Giffuni * 49ba8a927SNathan Whitehorn * Copyright (C) 2010 Nathan Whitehorn 59ba8a927SNathan Whitehorn * All rights reserved. 69ba8a927SNathan Whitehorn * 79ba8a927SNathan Whitehorn * Redistribution and use in source and binary forms, with or without 89ba8a927SNathan Whitehorn * modification, are permitted provided that the following conditions 99ba8a927SNathan Whitehorn * are met: 109ba8a927SNathan Whitehorn * 1. Redistributions of source code must retain the above copyright 119ba8a927SNathan Whitehorn * notice, this list of conditions and the following disclaimer. 129ba8a927SNathan Whitehorn * 2. Redistributions in binary form must reproduce the above copyright 139ba8a927SNathan Whitehorn * notice, this list of conditions and the following disclaimer in the 149ba8a927SNathan Whitehorn * documentation and/or other materials provided with the distribution. 159ba8a927SNathan Whitehorn * 169ba8a927SNathan Whitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 179ba8a927SNathan Whitehorn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 189ba8a927SNathan Whitehorn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 199ba8a927SNathan Whitehorn * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 209ba8a927SNathan Whitehorn * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 219ba8a927SNathan Whitehorn * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 229ba8a927SNathan Whitehorn * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 239ba8a927SNathan Whitehorn * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 249ba8a927SNathan Whitehorn * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 259ba8a927SNathan Whitehorn * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 269ba8a927SNathan Whitehorn */ 279ba8a927SNathan Whitehorn 289ba8a927SNathan Whitehorn #include <sys/cdefs.h> 299ba8a927SNathan Whitehorn #include <sys/stdint.h> 309ba8a927SNathan Whitehorn #include <sys/stddef.h> 319ba8a927SNathan Whitehorn #include <sys/param.h> 329ba8a927SNathan Whitehorn #include <sys/queue.h> 339ba8a927SNathan Whitehorn #include <sys/types.h> 349ba8a927SNathan Whitehorn #include <sys/systm.h> 359ba8a927SNathan Whitehorn #include <sys/kernel.h> 369ba8a927SNathan Whitehorn #include <sys/bus.h> 379ba8a927SNathan Whitehorn #include <sys/linker_set.h> 389ba8a927SNathan Whitehorn #include <sys/module.h> 399ba8a927SNathan Whitehorn #include <sys/lock.h> 409ba8a927SNathan Whitehorn #include <sys/mutex.h> 419ba8a927SNathan Whitehorn #include <sys/condvar.h> 429ba8a927SNathan Whitehorn #include <sys/sysctl.h> 439ba8a927SNathan Whitehorn #include <sys/sx.h> 449ba8a927SNathan Whitehorn #include <sys/unistd.h> 459ba8a927SNathan Whitehorn #include <sys/callout.h> 469ba8a927SNathan Whitehorn #include <sys/malloc.h> 479ba8a927SNathan Whitehorn #include <sys/priv.h> 489ba8a927SNathan Whitehorn 499ba8a927SNathan Whitehorn #include <sys/rman.h> 509ba8a927SNathan Whitehorn 519ba8a927SNathan Whitehorn #include <dev/usb/usb.h> 529ba8a927SNathan Whitehorn #include <dev/usb/usbdi.h> 539ba8a927SNathan Whitehorn 549ba8a927SNathan Whitehorn #include <dev/usb/usb_core.h> 559ba8a927SNathan Whitehorn #include <dev/usb/usb_busdma.h> 569ba8a927SNathan Whitehorn #include <dev/usb/usb_process.h> 579ba8a927SNathan Whitehorn #include <dev/usb/usb_util.h> 589ba8a927SNathan Whitehorn 599ba8a927SNathan Whitehorn #include <dev/usb/usb_controller.h> 609ba8a927SNathan Whitehorn #include <dev/usb/usb_bus.h> 619ba8a927SNathan Whitehorn #include <dev/usb/controller/ohci.h> 629ba8a927SNathan Whitehorn #include <dev/usb/controller/ohcireg.h> 639ba8a927SNathan Whitehorn 649ba8a927SNathan Whitehorn #include "ps3bus.h" 659ba8a927SNathan Whitehorn 669ba8a927SNathan Whitehorn static int 679ba8a927SNathan Whitehorn ohci_ps3_probe(device_t dev) 689ba8a927SNathan Whitehorn { 699ba8a927SNathan Whitehorn if (ps3bus_get_bustype(dev) != PS3_BUSTYPE_SYSBUS || 709ba8a927SNathan Whitehorn ps3bus_get_devtype(dev) != PS3_DEVTYPE_USB) 719ba8a927SNathan Whitehorn return (ENXIO); 729ba8a927SNathan Whitehorn 739ba8a927SNathan Whitehorn device_set_desc(dev, "Playstation 3 USB 2.0 controller"); 749ba8a927SNathan Whitehorn return (BUS_PROBE_SPECIFIC); 759ba8a927SNathan Whitehorn } 769ba8a927SNathan Whitehorn 779ba8a927SNathan Whitehorn static int 789ba8a927SNathan Whitehorn ohci_ps3_attach(device_t dev) 799ba8a927SNathan Whitehorn { 809ba8a927SNathan Whitehorn ohci_softc_t *sc = device_get_softc(dev); 819ba8a927SNathan Whitehorn int rid, err; 829ba8a927SNathan Whitehorn 839ba8a927SNathan Whitehorn sc->sc_bus.parent = dev; 849ba8a927SNathan Whitehorn sc->sc_bus.devices = sc->sc_devices; 859ba8a927SNathan Whitehorn sc->sc_bus.devices_max = OHCI_MAX_DEVICES; 86b217d184SHans Petter Selasky sc->sc_bus.dma_bits = 32; 879ba8a927SNathan Whitehorn 88b217d184SHans Petter Selasky /* get all DMA memory */ 899ba8a927SNathan Whitehorn if (usb_bus_mem_alloc_all(&sc->sc_bus, 909ba8a927SNathan Whitehorn USB_GET_DMA_TAG(dev), &ohci_iterate_hw_softc)) 919ba8a927SNathan Whitehorn return (ENOMEM); 929ba8a927SNathan Whitehorn 939ba8a927SNathan Whitehorn rid = 0; 949ba8a927SNathan Whitehorn sc->sc_io_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, 959ba8a927SNathan Whitehorn &rid, RF_ACTIVE); 969ba8a927SNathan Whitehorn 979ba8a927SNathan Whitehorn if (!sc->sc_io_res) { 989ba8a927SNathan Whitehorn device_printf(dev, "Could not map memory\n"); 999ba8a927SNathan Whitehorn goto error; 1009ba8a927SNathan Whitehorn } 1019ba8a927SNathan Whitehorn 1029ba8a927SNathan Whitehorn sc->sc_io_tag = rman_get_bustag(sc->sc_io_res); 1039ba8a927SNathan Whitehorn sc->sc_io_hdl = rman_get_bushandle(sc->sc_io_res); 1049ba8a927SNathan Whitehorn sc->sc_io_size = rman_get_size(sc->sc_io_res); 1059ba8a927SNathan Whitehorn 1069ba8a927SNathan Whitehorn rid = 0; 1079ba8a927SNathan Whitehorn sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, 1089ba8a927SNathan Whitehorn RF_SHAREABLE | RF_ACTIVE); 1099ba8a927SNathan Whitehorn 1109ba8a927SNathan Whitehorn if (sc->sc_irq_res == NULL) { 1119ba8a927SNathan Whitehorn device_printf(dev, "Could not allocate irq\n"); 1129ba8a927SNathan Whitehorn return (ENXIO); 1139ba8a927SNathan Whitehorn } 1149ba8a927SNathan Whitehorn 115*5b56413dSWarner Losh sc->sc_bus.bdev = device_add_child(dev, "usbus", DEVICE_UNIT_ANY); 1169ba8a927SNathan Whitehorn if (!sc->sc_bus.bdev) { 1179ba8a927SNathan Whitehorn device_printf(dev, "Could not add USB device\n"); 1189ba8a927SNathan Whitehorn return (ENXIO); 1199ba8a927SNathan Whitehorn } 1209ba8a927SNathan Whitehorn 1219ba8a927SNathan Whitehorn device_set_ivars(sc->sc_bus.bdev, &sc->sc_bus); 1229ba8a927SNathan Whitehorn 1239ba8a927SNathan Whitehorn sprintf(sc->sc_vendor, "Sony"); 1249ba8a927SNathan Whitehorn 1259ba8a927SNathan Whitehorn err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE, 1269ba8a927SNathan Whitehorn NULL, (driver_intr_t *)ohci_interrupt, sc, &sc->sc_intr_hdl); 1279ba8a927SNathan Whitehorn if (err) { 1289ba8a927SNathan Whitehorn device_printf(dev, "Could not setup error irq, %d\n", err); 1299ba8a927SNathan Whitehorn goto error; 1309ba8a927SNathan Whitehorn } 1319ba8a927SNathan Whitehorn 1329ba8a927SNathan Whitehorn //sc->sc_flags |= EHCI_SCFLG_BIGEMMIO; 1339ba8a927SNathan Whitehorn bus_space_write_4(sc->sc_io_tag, sc->sc_io_hdl, 1349ba8a927SNathan Whitehorn OHCI_CONTROL, 0); 1359ba8a927SNathan Whitehorn err = ohci_init(sc); 1369ba8a927SNathan Whitehorn if (err) { 1379ba8a927SNathan Whitehorn device_printf(dev, "USB init failed err=%d\n", err); 1389ba8a927SNathan Whitehorn goto error; 1399ba8a927SNathan Whitehorn } 1409ba8a927SNathan Whitehorn 1419ba8a927SNathan Whitehorn err = device_probe_and_attach(sc->sc_bus.bdev); 1429ba8a927SNathan Whitehorn if (err == 0) 1439ba8a927SNathan Whitehorn return (0); 1449ba8a927SNathan Whitehorn 1459ba8a927SNathan Whitehorn error: 1469ba8a927SNathan Whitehorn return (ENXIO); 1479ba8a927SNathan Whitehorn } 1489ba8a927SNathan Whitehorn 1499ba8a927SNathan Whitehorn static device_method_t ohci_ps3_methods[] = { 1509ba8a927SNathan Whitehorn /* Device interface */ 1519ba8a927SNathan Whitehorn DEVMETHOD(device_probe, ohci_ps3_probe), 1529ba8a927SNathan Whitehorn DEVMETHOD(device_attach, ohci_ps3_attach), 1532e141748SHans Petter Selasky DEVMETHOD(device_resume, bus_generic_resume), 1542e141748SHans Petter Selasky DEVMETHOD(device_suspend, bus_generic_suspend), 1552e141748SHans Petter Selasky DEVMETHOD(device_shutdown, bus_generic_shutdown), 1569ba8a927SNathan Whitehorn 1574b7ec270SMarius Strobl DEVMETHOD_END 1589ba8a927SNathan Whitehorn }; 1599ba8a927SNathan Whitehorn 1609ba8a927SNathan Whitehorn static driver_t ohci_ps3_driver = { 1612e141748SHans Petter Selasky .name = "ohci", 1622e141748SHans Petter Selasky .methods = ohci_ps3_methods, 1632e141748SHans Petter Selasky .size = sizeof(ohci_softc_t), 1649ba8a927SNathan Whitehorn }; 1659ba8a927SNathan Whitehorn 166c331b0e4SJohn Baldwin DRIVER_MODULE(ohci_ps3, ps3bus, ohci_ps3_driver, 0, 0); 1679ba8a927SNathan Whitehorn MODULE_DEPEND(ohci_ps3, usb, 1, 1, 1); 168