39#include <sys/condvar.h>
40#include <sys/kernel.h>
41#include <sys/module.h>
54#include <dev/fdt/fdt_common.h>
55#include <dev/ofw/openfirm.h>
56#include <dev/ofw/ofw_bus.h>
57#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>
97 if (!ofw_bus_status_okay(self))
100 if (!ofw_bus_is_compatible(self,
"generic-ehci"))
103 device_set_desc(self,
"Generic EHCI Controller");
104 return (BUS_PROBE_DEFAULT);
120 sc = device_get_softc(
dev);
122 TAILQ_INIT(&sc->clk_list);
124 for (off = 0; clk_get_by_ofw_index(
dev, 0, off, &clk) == 0; off++) {
125 err = clk_enable(clk);
127 device_printf(
dev,
"Could not enable clock %s\n",
131 clkp = malloc(
sizeof(*clkp), M_DEVBUF, M_WAITOK | M_ZERO);
133 TAILQ_INSERT_TAIL(&sc->clk_list, clkp,
next);
137 TAILQ_INIT(&sc->rst_list);
138 for (off = 0; hwreset_get_by_ofw_idx(
dev, 0, off, &rst) == 0; off++) {
139 err = hwreset_deassert(rst);
141 device_printf(
dev,
"Could not de-assert reset\n");
144 rstp = malloc(
sizeof(*rstp), M_DEVBUF, M_WAITOK | M_ZERO);
146 TAILQ_INSERT_TAIL(&sc->rst_list, rstp,
next);
150 TAILQ_INIT(&sc->phy_list);
151 for (off = 0; phy_get_by_ofw_idx(
dev, 0, off, &phy) == 0; off++) {
152 err = phy_usb_set_mode(phy, PHY_USB_MODE_HOST);
154 device_printf(
dev,
"Could not set phy to host mode\n");
157 err = phy_enable(phy);
159 device_printf(
dev,
"Could not enable phy\n");
162 phyp = malloc(
sizeof(*phyp), M_DEVBUF, M_WAITOK | M_ZERO);
164 TAILQ_INSERT_TAIL(&sc->phy_list, phyp,
next);
191 sc = device_get_softc(
dev);
194 TAILQ_FOREACH_SAFE(clk, &sc->clk_list,
next, clk_tmp) {
195 err = clk_disable(clk->clk);
197 device_printf(
dev,
"Could not disable clock %s\n",
198 clk_get_name(clk->clk));
199 err = clk_release(clk->clk);
201 device_printf(
dev,
"Could not release clock %s\n",
202 clk_get_name(clk->clk));
203 TAILQ_REMOVE(&sc->clk_list, clk,
next);
208 TAILQ_FOREACH_SAFE(rst, &sc->rst_list,
next, rst_tmp) {
209 hwreset_assert(rst->rst);
210 hwreset_release(rst->rst);
211 TAILQ_REMOVE(&sc->rst_list, rst,
next);
216 TAILQ_FOREACH_SAFE(phy, &sc->phy_list,
next, phy_tmp) {
217 err = phy_disable(phy->phy);
219 device_printf(
dev,
"Could not disable phy\n");
220 phy_release(phy->phy);
221 TAILQ_REMOVE(&sc->phy_list, phy,
next);
driver_t generic_ehci_driver
device_detach_t generic_ehci_detach
device_attach_t generic_ehci_attach
DRIVER_MODULE(generic_ehci, simplebus, ehci_fdt_driver, ehci_fdt_devclass, 0, 0)
static device_method_t ehci_fdt_methods[]
DEFINE_CLASS_1(ehci, ehci_fdt_driver, ehci_fdt_methods, sizeof(ehci_softc_t), generic_ehci_driver)
static device_detach_t generic_ehci_fdt_detach
static device_probe_t generic_ehci_fdt_probe
MODULE_DEPEND(generic_ehci, usb, 1, 1, 1)
static device_attach_t generic_ehci_fdt_attach
static devclass_t ehci_fdt_devclass
TAILQ_HEAD(, urb) bsd_urb_list