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