38#include <sys/condvar.h>
39#include <sys/kernel.h>
40#include <sys/module.h>
42#include <machine/bus.h>
43#include <dev/ofw/ofw_bus.h>
44#include <dev/ofw/ofw_bus_subr.h>
59#include <dev/extres/clk/clk.h>
60#include <dev/extres/hwreset/hwreset.h>
61#include <dev/extres/phy/phy.h>
62#include <dev/extres/phy/phy_usb.h>
64#include "generic_usb_if.h"
93 if (!ofw_bus_status_okay(
dev))
96 if (!ofw_bus_is_compatible(
dev,
"generic-ohci"))
99 device_set_desc(
dev,
"Generic OHCI Controller");
101 return (BUS_PROBE_DEFAULT);
158 INTR_TYPE_BIO | INTR_MPSAFE, NULL,
165 TAILQ_INIT(&sc->clk_list);
167 for (off = 0; clk_get_by_ofw_index(
dev, 0, off, &clk) == 0; off++) {
168 err = clk_enable(clk);
170 device_printf(
dev,
"Could not enable clock %s\n",
174 clkp = malloc(
sizeof(*clkp), M_DEVBUF, M_WAITOK | M_ZERO);
176 TAILQ_INSERT_TAIL(&sc->clk_list, clkp,
next);
180 TAILQ_INIT(&sc->rst_list);
181 for (off = 0; hwreset_get_by_ofw_idx(
dev, 0, off, &rst) == 0; off++) {
182 err = hwreset_deassert(rst);
184 device_printf(
dev,
"Could not de-assert reset\n");
187 rstp = malloc(
sizeof(*rstp), M_DEVBUF, M_WAITOK | M_ZERO);
189 TAILQ_INSERT_TAIL(&sc->rst_list, rstp,
next);
193 TAILQ_INIT(&sc->phy_list);
194 for (off = 0; phy_get_by_ofw_idx(
dev, 0, off, &phy) == 0; off++) {
195 err = phy_usb_set_mode(phy, PHY_USB_MODE_HOST);
197 device_printf(
dev,
"Could not set phy to host mode\n");
200 err = phy_enable(phy);
202 device_printf(
dev,
"Could not enable phy\n");
205 phyp = malloc(
sizeof(*phyp), M_DEVBUF, M_WAITOK | M_ZERO);
207 TAILQ_INSERT_TAIL(&sc->phy_list, phyp,
next);
210 if (GENERIC_USB_INIT(
dev) != 0) {
237 device_delete_children(
dev);
262 bus_release_resource(
dev, SYS_RES_IRQ, 0,
267 bus_release_resource(
dev, SYS_RES_MEMORY, 0,
274 TAILQ_FOREACH_SAFE(phy, &sc->phy_list,
next, phy_tmp) {
275 err = phy_disable(phy->phy);
277 device_printf(
dev,
"Could not disable phy\n");
278 phy_release(phy->phy);
279 TAILQ_REMOVE(&sc->phy_list, phy,
next);
284 TAILQ_FOREACH_SAFE(rst, &sc->rst_list,
next, rst_tmp) {
285 hwreset_assert(rst->rst);
286 hwreset_release(rst->rst);
287 TAILQ_REMOVE(&sc->rst_list, rst,
next);
292 TAILQ_FOREACH_SAFE(clk, &sc->clk_list,
next, clk_tmp) {
293 err = clk_disable(clk->clk);
295 device_printf(
dev,
"Could not disable clock %s\n",
296 clk_get_name(clk->clk));
297 err = clk_release(clk->clk);
299 device_printf(
dev,
"Could not release clock %s\n",
300 clk_get_name(clk->clk));
301 TAILQ_REMOVE(&sc->clk_list, clk,
next);
305 if (GENERIC_USB_DEINIT(
dev) != 0)
317 DEVMETHOD(device_suspend, bus_generic_suspend),
318 DEVMETHOD(device_resume, bus_generic_resume),
319 DEVMETHOD(device_shutdown, bus_generic_shutdown),
static device_method_t generic_ohci_methods[]
MODULE_DEPEND(ohci, usb, 1, 1, 1)
static devclass_t generic_ohci_devclass
driver_t generic_ohci_driver
static int generic_ohci_detach(device_t)
DRIVER_MODULE(ohci, simplebus, generic_ohci_driver, generic_ohci_devclass, 0, 0)
static int generic_ohci_probe(device_t dev)
static int generic_ohci_attach(device_t dev)
void ohci_interrupt(ohci_softc_t *sc)
void ohci_detach(struct ohci_softc *sc)
usb_error_t ohci_init(ohci_softc_t *sc)
usb_bus_mem_cb_t ohci_iterate_hw_softc
bus_space_tag_t sc_io_tag
struct usb_device * sc_devices[OHCI_MAX_DEVICES]
struct resource * sc_irq_res
struct resource * sc_io_res
bus_space_handle_t sc_io_hdl
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)
TAILQ_HEAD(, urb) bsd_urb_list