xref: /freebsd/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c (revision fdafd315ad0d0f28a11b9fb4476a9ab059c62b92)
18f3ad0f8SAndrew Turner /*
28f3ad0f8SAndrew Turner  * Copyright 2015 Andrew Turner.
38f3ad0f8SAndrew Turner  * All rights reserved.
48f3ad0f8SAndrew Turner  *
58f3ad0f8SAndrew Turner  * Redistribution and use in source and binary forms, with or without
68f3ad0f8SAndrew Turner  * modification, are permitted provided that the following conditions are
78f3ad0f8SAndrew Turner  * met:
88f3ad0f8SAndrew Turner  *
98f3ad0f8SAndrew Turner  *  1. Redistributions of source code must retain the above copyright
108f3ad0f8SAndrew Turner  *     notice, this list of conditions and the following disclaimer.
118f3ad0f8SAndrew Turner  *  2. Redistributions in binary form must reproduce the above copyright
128f3ad0f8SAndrew Turner  *     notice, this list of conditions and the following disclaimer in the
138f3ad0f8SAndrew Turner  *     documentation and/or other materials provided with the distribution.
148f3ad0f8SAndrew Turner  *
158f3ad0f8SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
168f3ad0f8SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
178f3ad0f8SAndrew Turner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
188f3ad0f8SAndrew Turner  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
198f3ad0f8SAndrew Turner  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
208f3ad0f8SAndrew Turner  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
218f3ad0f8SAndrew Turner  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
228f3ad0f8SAndrew Turner  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
238f3ad0f8SAndrew Turner  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
248f3ad0f8SAndrew Turner  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
258f3ad0f8SAndrew Turner  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
268f3ad0f8SAndrew Turner  */
278f3ad0f8SAndrew Turner 
288f3ad0f8SAndrew Turner #include <sys/param.h>
298f3ad0f8SAndrew Turner #include <sys/kernel.h>
308f3ad0f8SAndrew Turner #include <sys/bus.h>
318f3ad0f8SAndrew Turner #include <sys/callout.h>
328f3ad0f8SAndrew Turner #include <sys/condvar.h>
338f3ad0f8SAndrew Turner #include <sys/module.h>
348f3ad0f8SAndrew Turner 
358f3ad0f8SAndrew Turner #include <dev/ofw/ofw_bus_subr.h>
368f3ad0f8SAndrew Turner 
378f3ad0f8SAndrew Turner #include <dev/usb/usb.h>
388f3ad0f8SAndrew Turner #include <dev/usb/usbdi.h>
398f3ad0f8SAndrew Turner 
408f3ad0f8SAndrew Turner #include <dev/usb/usb_busdma.h>
418f3ad0f8SAndrew Turner #include <dev/usb/usb_process.h>
428f3ad0f8SAndrew Turner 
438f3ad0f8SAndrew Turner #include <dev/usb/usb_controller.h>
448f3ad0f8SAndrew Turner #include <dev/usb/usb_bus.h>
458f3ad0f8SAndrew Turner 
468f3ad0f8SAndrew Turner #include <dev/usb/controller/dwc_otg.h>
478f3ad0f8SAndrew Turner #include <dev/usb/controller/dwc_otg_fdt.h>
488f3ad0f8SAndrew Turner 
498f3ad0f8SAndrew Turner #include <arm/broadcom/bcm2835/bcm2835_mbox_prop.h>
508f3ad0f8SAndrew Turner 
5143be86e3SOleksandr Tymoshenko static struct ofw_compat_data compat_data[] = {
5243be86e3SOleksandr Tymoshenko 	{"broadcom,bcm2835-usb",	1},
5381cb170fSMichal Meloun 	{"brcm,bcm2835-usb",		1},
5443be86e3SOleksandr Tymoshenko 	{"brcm,bcm2708-usb",		1},
5543be86e3SOleksandr Tymoshenko 	{NULL,				0}
5643be86e3SOleksandr Tymoshenko };
5743be86e3SOleksandr Tymoshenko 
588f3ad0f8SAndrew Turner static device_probe_t bcm283x_dwc_otg_probe;
598f3ad0f8SAndrew Turner static device_attach_t bcm283x_dwc_otg_attach;
608f3ad0f8SAndrew Turner 
618f3ad0f8SAndrew Turner static int
bcm283x_dwc_otg_probe(device_t dev)628f3ad0f8SAndrew Turner bcm283x_dwc_otg_probe(device_t dev)
638f3ad0f8SAndrew Turner {
648f3ad0f8SAndrew Turner 
658f3ad0f8SAndrew Turner 	if (!ofw_bus_status_okay(dev))
668f3ad0f8SAndrew Turner 		return (ENXIO);
678f3ad0f8SAndrew Turner 
6843be86e3SOleksandr Tymoshenko 	if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
698f3ad0f8SAndrew Turner 		return (ENXIO);
708f3ad0f8SAndrew Turner 
718f3ad0f8SAndrew Turner 	device_set_desc(dev, "DWC OTG 2.0 integrated USB controller (bcm283x)");
728f3ad0f8SAndrew Turner 
738f3ad0f8SAndrew Turner 	return (BUS_PROBE_VENDOR);
748f3ad0f8SAndrew Turner }
758f3ad0f8SAndrew Turner 
768f3ad0f8SAndrew Turner static int
bcm283x_dwc_otg_attach(device_t dev)778f3ad0f8SAndrew Turner bcm283x_dwc_otg_attach(device_t dev)
788f3ad0f8SAndrew Turner {
798826550bSOleksandr Tymoshenko 	int err;
808f3ad0f8SAndrew Turner 
818826550bSOleksandr Tymoshenko 	err = bcm2835_mbox_set_power_state(BCM2835_MBOX_POWER_ID_USB_HCD, TRUE);
828826550bSOleksandr Tymoshenko 	if (err)
838826550bSOleksandr Tymoshenko 		device_printf(dev, "failed to set power state, err=%d\n", err);
848826550bSOleksandr Tymoshenko 
858f3ad0f8SAndrew Turner 	return (dwc_otg_attach(dev));
868f3ad0f8SAndrew Turner }
878f3ad0f8SAndrew Turner 
888f3ad0f8SAndrew Turner static device_method_t bcm283x_dwc_otg_methods[] = {
898f3ad0f8SAndrew Turner 	/* bus interface */
908f3ad0f8SAndrew Turner 	DEVMETHOD(device_probe, bcm283x_dwc_otg_probe),
918f3ad0f8SAndrew Turner 	DEVMETHOD(device_attach, bcm283x_dwc_otg_attach),
928f3ad0f8SAndrew Turner 
938f3ad0f8SAndrew Turner 	DEVMETHOD_END
948f3ad0f8SAndrew Turner };
958f3ad0f8SAndrew Turner 
968f3ad0f8SAndrew Turner DEFINE_CLASS_1(bcm283x_dwcotg, bcm283x_dwc_otg_driver, bcm283x_dwc_otg_methods,
978f3ad0f8SAndrew Turner     sizeof(struct dwc_otg_fdt_softc), dwc_otg_driver);
98*82d4dc06SJohn Baldwin DRIVER_MODULE(bcm283x_dwcotg, simplebus, bcm283x_dwc_otg_driver, 0, 0);
998f3ad0f8SAndrew Turner MODULE_DEPEND(bcm283x_dwcotg, usb, 1, 1, 1);
100