Path: blob/main/sys/arm/broadcom/bcm2835/bcm283x_dwc_fdt.c
39566 views
/*1* Copyright 2015 Andrew Turner.2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions are6* met:7*8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND15* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR17* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE18* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR19* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF20* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR21* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,22* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR23* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF24* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.25*/2627#include <sys/param.h>28#include <sys/kernel.h>29#include <sys/bus.h>30#include <sys/callout.h>31#include <sys/condvar.h>32#include <sys/module.h>3334#include <dev/ofw/ofw_bus_subr.h>3536#include <dev/usb/usb.h>37#include <dev/usb/usbdi.h>3839#include <dev/usb/usb_busdma.h>40#include <dev/usb/usb_process.h>4142#include <dev/usb/usb_controller.h>43#include <dev/usb/usb_bus.h>4445#include <dev/usb/controller/dwc_otg.h>46#include <dev/usb/controller/dwc_otg_fdt.h>4748#include <arm/broadcom/bcm2835/bcm2835_mbox_prop.h>4950static struct ofw_compat_data compat_data[] = {51{"broadcom,bcm2835-usb", 1},52{"brcm,bcm2835-usb", 1},53{"brcm,bcm2708-usb", 1},54{NULL, 0}55};5657static device_probe_t bcm283x_dwc_otg_probe;58static device_attach_t bcm283x_dwc_otg_attach;5960static int61bcm283x_dwc_otg_probe(device_t dev)62{6364if (!ofw_bus_status_okay(dev))65return (ENXIO);6667if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)68return (ENXIO);6970device_set_desc(dev, "DWC OTG 2.0 integrated USB controller (bcm283x)");7172return (BUS_PROBE_VENDOR);73}7475static int76bcm283x_dwc_otg_attach(device_t dev)77{78int err;7980err = bcm2835_mbox_set_power_state(BCM2835_MBOX_POWER_ID_USB_HCD, TRUE);81if (err)82device_printf(dev, "failed to set power state, err=%d\n", err);8384return (dwc_otg_attach(dev));85}8687static device_method_t bcm283x_dwc_otg_methods[] = {88/* bus interface */89DEVMETHOD(device_probe, bcm283x_dwc_otg_probe),90DEVMETHOD(device_attach, bcm283x_dwc_otg_attach),9192DEVMETHOD_END93};9495DEFINE_CLASS_1(bcm283x_dwcotg, bcm283x_dwc_otg_driver, bcm283x_dwc_otg_methods,96sizeof(struct dwc_otg_fdt_softc), dwc_otg_driver);97DRIVER_MODULE(bcm283x_dwcotg, simplebus, bcm283x_dwc_otg_driver, 0, 0);98MODULE_DEPEND(bcm283x_dwcotg, usb, 1, 1, 1);99100101