1287373Sandrew/* 2287373Sandrew * Copyright 2015 Andrew Turner. 3287373Sandrew * All rights reserved. 4287373Sandrew * 5287373Sandrew * Redistribution and use in source and binary forms, with or without 6287373Sandrew * modification, are permitted provided that the following conditions are 7287373Sandrew * met: 8287373Sandrew * 9287373Sandrew * 1. Redistributions of source code must retain the above copyright 10287373Sandrew * notice, this list of conditions and the following disclaimer. 11287373Sandrew * 2. Redistributions in binary form must reproduce the above copyright 12287373Sandrew * notice, this list of conditions and the following disclaimer in the 13287373Sandrew * documentation and/or other materials provided with the distribution. 14287373Sandrew * 15287373Sandrew * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16287373Sandrew * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17287373Sandrew * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18287373Sandrew * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE 19287373Sandrew * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20287373Sandrew * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21287373Sandrew * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 22287373Sandrew * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23287373Sandrew * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24287373Sandrew * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25287373Sandrew * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26287373Sandrew */ 27287373Sandrew 28287373Sandrew#include <sys/cdefs.h> 29287373Sandrew__FBSDID("$FreeBSD$"); 30287373Sandrew 31287373Sandrew#include <sys/param.h> 32287373Sandrew#include <sys/kernel.h> 33287373Sandrew#include <sys/bus.h> 34287373Sandrew#include <sys/callout.h> 35287373Sandrew#include <sys/condvar.h> 36287373Sandrew#include <sys/module.h> 37287373Sandrew 38287373Sandrew#include <dev/ofw/ofw_bus_subr.h> 39287373Sandrew 40287373Sandrew#include <dev/usb/usb.h> 41287373Sandrew#include <dev/usb/usbdi.h> 42287373Sandrew 43287373Sandrew#include <dev/usb/usb_busdma.h> 44287373Sandrew#include <dev/usb/usb_process.h> 45287373Sandrew 46287373Sandrew#include <dev/usb/usb_controller.h> 47287373Sandrew#include <dev/usb/usb_bus.h> 48287373Sandrew 49287373Sandrew#include <dev/usb/controller/dwc_otg.h> 50287373Sandrew#include <dev/usb/controller/dwc_otg_fdt.h> 51287373Sandrew 52287373Sandrewstatic device_probe_t hisi_dwc_otg_probe; 53287373Sandrewstatic device_attach_t hisi_dwc_otg_attach; 54287373Sandrew 55287373Sandrewstatic int 56287373Sandrewhisi_dwc_otg_probe(device_t dev) 57287373Sandrew{ 58287373Sandrew 59287373Sandrew if (!ofw_bus_status_okay(dev)) 60287373Sandrew return (ENXIO); 61287373Sandrew 62287373Sandrew if (!ofw_bus_is_compatible(dev, "huawei,hisi-usb")) 63287373Sandrew return (ENXIO); 64287373Sandrew 65287373Sandrew device_set_desc(dev, "DWC OTG 2.0 integrated USB controller (hisilicon)"); 66287373Sandrew 67287373Sandrew return (BUS_PROBE_VENDOR); 68287373Sandrew} 69287373Sandrew 70287373Sandrewstatic int 71287373Sandrewhisi_dwc_otg_attach(device_t dev) 72287373Sandrew{ 73287373Sandrew struct dwc_otg_fdt_softc *sc; 74287373Sandrew 75287373Sandrew /* Set the default to host mode. */ 76287373Sandrew /* TODO: Use vbus to detect this. */ 77287373Sandrew sc = device_get_softc(dev); 78287373Sandrew sc->sc_otg.sc_mode = DWC_MODE_HOST; 79287373Sandrew 80287373Sandrew return (dwc_otg_attach(dev)); 81287373Sandrew} 82287373Sandrew 83287373Sandrewstatic device_method_t hisi_dwc_otg_methods[] = { 84287373Sandrew /* bus interface */ 85287373Sandrew DEVMETHOD(device_probe, hisi_dwc_otg_probe), 86287373Sandrew DEVMETHOD(device_attach, hisi_dwc_otg_attach), 87287373Sandrew 88287373Sandrew DEVMETHOD_END 89287373Sandrew}; 90287373Sandrew 91287373Sandrewstatic devclass_t hisi_dwc_otg_devclass; 92287373Sandrew 93287373SandrewDEFINE_CLASS_1(hisi_dwcotg, hisi_dwc_otg_driver, hisi_dwc_otg_methods, 94287373Sandrew sizeof(struct dwc_otg_fdt_softc), dwc_otg_driver); 95287373SandrewDRIVER_MODULE(hisi_dwcotg, simplebus, hisi_dwc_otg_driver, 96287373Sandrew hisi_dwc_otg_devclass, 0, 0); 97287373SandrewMODULE_DEPEND(hisi_dwcotg, usb, 1, 1, 1); 98