43#include <sys/kernel.h>
44#include <sys/module.h>
46#include <sys/condvar.h>
49#include <dev/ofw/ofw_bus.h>
50#include <dev/ofw/ofw_bus_subr.h>
62#include <machine/bus.h>
63#include <machine/resource.h>
65#include <arm/freescale/imx/imx_ccmvar.h>
67#include "opt_platform.h"
141#define USBNC_OVER_CUR_POL (1u << 8)
142#define USBNC_OVER_CUR_DIS (1u << 7)
150 {
"fsl,imx6q-usbmisc",
true},
151 {
"fsl,imx51-usbmisc",
true},
152 {
"fsl,imx25-usbmisc",
true},
162 sc = device_get_softc(
dev);
164 bus_write_4(sc->
mmio,
index *
sizeof(uint32_t),
reg | bits);
169imx_usbmisc_clr_ctrl(device_t
dev, u_int index, uint32_t bits)
174 sc = device_get_softc(
dev);
175 reg = bus_read_4(sc->
mmio, index *
sizeof(uint32_t));
176 bus_write_4(sc->
mmio, index *
sizeof(uint32_t),
reg & ~bits);
184 if (!ofw_bus_status_okay(
dev))
188 device_set_desc(
dev,
"i.MX USB Misc Control");
189 return (BUS_PROBE_DEFAULT);
199 sc = device_get_softc(
dev);
201 if (sc->
mmio != NULL)
202 bus_release_resource(
dev, SYS_RES_MEMORY, 0, sc->
mmio);
213 sc = device_get_softc(
dev);
218 sc->
mmio = bus_alloc_resource_any(
dev, SYS_RES_MEMORY, &
rid,
220 if (sc->
mmio == NULL) {
221 device_printf(
dev,
"Cannot allocate memory resources\n");
225 OF_device_register_xref(OF_xref_from_node(ofw_bus_get_node(
dev)),
dev);
263#define IMX_EHCI_REG_OFF 0x100
264#define IMX_EHCI_REG_SIZE 0x100
274 {
"fsl,imx6q-usb", 1},
275 {
"fsl,imx53-usb", 1},
276 {
"fsl,imx51-usb", 1},
277 {
"fsl,imx28-usb", 1},
278 {
"fsl,imx27-usb", 1},
279 {
"fsl,imx25-usb", 1},
280 {
"fsl,imx23-usb", 1},
291 usbmode &= ~EHCI_UM_CM;
300 if (!ofw_bus_status_okay(
dev))
304 device_set_desc(
dev,
"Freescale i.MX integrated USB controller");
305 return (BUS_PROBE_DEFAULT);
317 sc = device_get_softc(
dev);
322 if ((err = device_delete_children(
dev)) != 0)
331 bus_release_resource(
dev, SYS_RES_IRQ, 0,
334 bus_release_resource(
dev, SYS_RES_MEMORY, 0,
346 pcell_t usbmprops[2];
352 node = ofw_bus_get_node(sc->
dev);
353 size = OF_getencprop(node,
"fsl,usbmisc", usbmprops,
355 if (
size <
sizeof(usbmprops)) {
356 device_printf(sc->
dev,
"failed to retrieve fsl,usbmisc "
357 "property, cannot disable overcurrent protection");
361 usbmdev = OF_device_from_xref(usbmprops[0]);
362 if (usbmdev == NULL) {
363 device_printf(sc->
dev,
"usbmisc device not found, "
364 "cannot disable overcurrent protection");
368 index = usbmprops[1];
379 sc = device_get_softc(
dev);
389 device_printf(
dev,
"Cannot allocate memory resources\n");
398 device_printf(
dev,
"Cannot allocate IRQ resources\n");
412 device_printf(
dev,
"usb_bus_mem_alloc_all() failed\n");
421 err = bus_space_subregion(esc->
sc_io_tag,
425 device_printf(
dev,
"bus_space_subregion() failed\n");
431 err = bus_setup_intr(
dev, sc->
ehci_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
434 device_printf(
dev,
"Could not setup IRQ\n");
439 imx_ccm_usb_enable(
dev);
442 if (OF_hasprop(ofw_bus_get_node(sc->
dev),
"disable-over-current"))
448 device_printf(
dev,
"Could not add USB device\n");
466 device_printf(
dev,
"USB init failed, usb_err_t=%d\n",
473 err = device_probe_and_attach(esc->
sc_bus.
bdev);
476 "device_probe_and_attach() failed\n");
495 DEVMETHOD(device_suspend, bus_generic_suspend),
496 DEVMETHOD(device_resume, bus_generic_resume),
497 DEVMETHOD(device_shutdown, bus_generic_shutdown),
500 DEVMETHOD(bus_print_child, bus_generic_print_child),
void ehci_interrupt(ehci_softc_t *sc)
void ehci_detach(ehci_softc_t *sc)
usb_error_t ehci_init(ehci_softc_t *sc)
uint16_t ehci_get_port_speed_portsc(struct ehci_softc *sc, uint16_t index)
#define EHCI_SCFLG_DONEINIT
#define EHCI_SCFLG_NORESTERM
#define EOWRITE4(sc, a, x)
usb_bus_mem_cb_t ehci_iterate_hw_softc
static int imx_ehci_attach(device_t dev)
static struct ofw_compat_data usbmisc_compat_data[]
static int imx_ehci_probe(device_t dev)
#define USBNC_OVER_CUR_DIS
static int imx_usbmisc_detach(device_t dev)
static device_method_t imx_usbmisc_methods[]
static void imx_usbmisc_set_ctrl(device_t dev, u_int index, uint32_t bits)
static devclass_t ehci_devclass
static struct ofw_compat_data compat_data[]
static devclass_t imx_usbmisc_devclass
static driver_t imx_usbmisc_driver
static device_method_t ehci_methods[]
EARLY_DRIVER_MODULE(imx_usbmisc, simplebus, imx_usbmisc_driver, imx_usbmisc_devclass, 0, 0, BUS_PASS_DEFAULT - 1000)
static int imx_usbmisc_probe(device_t dev)
static void imx_ehci_post_reset(struct ehci_softc *ehci_softc)
static void imx_ehci_disable_oc(struct imx_ehci_softc *sc)
DRIVER_MODULE(imx_ehci, simplebus, ehci_driver, ehci_devclass, 0, 0)
#define IMX_EHCI_REG_SIZE
MODULE_DEPEND(imx_ehci, usb, 1, 1, 1)
static int imx_usbmisc_attach(device_t dev)
static driver_t ehci_driver
static int imx_ehci_detach(device_t dev)
#define EHCI_USBMODE_NOLPM
struct usb_device * sc_devices[EHCI_MAX_DEVICES]
struct resource * sc_irq_res
bus_space_handle_t sc_io_hdl
void(* sc_vendor_post_reset)(struct ehci_softc *sc)
bus_space_tag_t sc_io_tag
uint16_t(* sc_vendor_get_port_speed)(struct ehci_softc *sc, uint16_t index)
struct resource * ehci_mem_res
struct resource * ehci_irq_res
struct usb_device ** devices
#define USB_GET_DMA_TAG(dev)
void usb_bus_mem_free_all(struct usb_bus *bus, usb_bus_mem_cb_t *cb)
uint8_t usb_bus_mem_alloc_all(struct usb_bus *bus, bus_dma_tag_t dmat, usb_bus_mem_cb_t *cb)