1504a0067SAndrew Turner /*
2504a0067SAndrew Turner * Copyright 2015 Andrew Turner.
3504a0067SAndrew Turner * All rights reserved.
4504a0067SAndrew Turner *
5504a0067SAndrew Turner * Redistribution and use in source and binary forms, with or without
6504a0067SAndrew Turner * modification, are permitted provided that the following conditions are
7504a0067SAndrew Turner * met:
8504a0067SAndrew Turner *
9504a0067SAndrew Turner * 1. Redistributions of source code must retain the above copyright
10504a0067SAndrew Turner * notice, this list of conditions and the following disclaimer.
11504a0067SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright
12504a0067SAndrew Turner * notice, this list of conditions and the following disclaimer in the
13504a0067SAndrew Turner * documentation and/or other materials provided with the distribution.
14504a0067SAndrew Turner *
15504a0067SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16504a0067SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17504a0067SAndrew Turner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18504a0067SAndrew Turner * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
19504a0067SAndrew Turner * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20504a0067SAndrew Turner * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21504a0067SAndrew Turner * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22504a0067SAndrew Turner * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23504a0067SAndrew Turner * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24504a0067SAndrew Turner * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25504a0067SAndrew Turner * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26504a0067SAndrew Turner */
27504a0067SAndrew Turner
28504a0067SAndrew Turner #include <sys/param.h>
29504a0067SAndrew Turner #include <sys/kernel.h>
30504a0067SAndrew Turner #include <sys/bus.h>
31504a0067SAndrew Turner #include <sys/callout.h>
32504a0067SAndrew Turner #include <sys/condvar.h>
33504a0067SAndrew Turner #include <sys/module.h>
34504a0067SAndrew Turner
35504a0067SAndrew Turner #include <dev/ofw/ofw_bus_subr.h>
36504a0067SAndrew Turner
37504a0067SAndrew Turner #include <dev/usb/usb.h>
38504a0067SAndrew Turner #include <dev/usb/usbdi.h>
39504a0067SAndrew Turner
40504a0067SAndrew Turner #include <dev/usb/usb_busdma.h>
41504a0067SAndrew Turner #include <dev/usb/usb_process.h>
42504a0067SAndrew Turner
43504a0067SAndrew Turner #include <dev/usb/usb_controller.h>
44504a0067SAndrew Turner #include <dev/usb/usb_bus.h>
45504a0067SAndrew Turner
46504a0067SAndrew Turner #include <dev/usb/controller/dwc_otg.h>
47504a0067SAndrew Turner #include <dev/usb/controller/dwc_otg_fdt.h>
48504a0067SAndrew Turner
49504a0067SAndrew Turner static device_probe_t hisi_dwc_otg_probe;
50504a0067SAndrew Turner static device_attach_t hisi_dwc_otg_attach;
51504a0067SAndrew Turner
52504a0067SAndrew Turner static int
hisi_dwc_otg_probe(device_t dev)53504a0067SAndrew Turner hisi_dwc_otg_probe(device_t dev)
54504a0067SAndrew Turner {
55504a0067SAndrew Turner
56504a0067SAndrew Turner if (!ofw_bus_status_okay(dev))
57504a0067SAndrew Turner return (ENXIO);
58504a0067SAndrew Turner
59504a0067SAndrew Turner if (!ofw_bus_is_compatible(dev, "huawei,hisi-usb"))
60504a0067SAndrew Turner return (ENXIO);
61504a0067SAndrew Turner
62504a0067SAndrew Turner device_set_desc(dev, "DWC OTG 2.0 integrated USB controller (hisilicon)");
63504a0067SAndrew Turner
64504a0067SAndrew Turner return (BUS_PROBE_VENDOR);
65504a0067SAndrew Turner }
66504a0067SAndrew Turner
67504a0067SAndrew Turner static int
hisi_dwc_otg_attach(device_t dev)68504a0067SAndrew Turner hisi_dwc_otg_attach(device_t dev)
69504a0067SAndrew Turner {
70504a0067SAndrew Turner struct dwc_otg_fdt_softc *sc;
71504a0067SAndrew Turner
72504a0067SAndrew Turner /* Set the default to host mode. */
73504a0067SAndrew Turner /* TODO: Use vbus to detect this. */
74504a0067SAndrew Turner sc = device_get_softc(dev);
75504a0067SAndrew Turner sc->sc_otg.sc_mode = DWC_MODE_HOST;
76504a0067SAndrew Turner
77504a0067SAndrew Turner return (dwc_otg_attach(dev));
78504a0067SAndrew Turner }
79504a0067SAndrew Turner
80504a0067SAndrew Turner static device_method_t hisi_dwc_otg_methods[] = {
81504a0067SAndrew Turner /* bus interface */
82504a0067SAndrew Turner DEVMETHOD(device_probe, hisi_dwc_otg_probe),
83504a0067SAndrew Turner DEVMETHOD(device_attach, hisi_dwc_otg_attach),
84504a0067SAndrew Turner
85504a0067SAndrew Turner DEVMETHOD_END
86504a0067SAndrew Turner };
87504a0067SAndrew Turner
88504a0067SAndrew Turner DEFINE_CLASS_1(hisi_dwcotg, hisi_dwc_otg_driver, hisi_dwc_otg_methods,
89504a0067SAndrew Turner sizeof(struct dwc_otg_fdt_softc), dwc_otg_driver);
90*bc9372d7SJohn Baldwin DRIVER_MODULE(hisi_dwcotg, simplebus, hisi_dwc_otg_driver, 0, 0);
91504a0067SAndrew Turner MODULE_DEPEND(hisi_dwcotg, usb, 1, 1, 1);
92