svn commit: r352943 - head/sys/arm/allwinner
Emmanuel Vadot
manu at FreeBSD.org
Tue Oct 1 22:19:13 UTC 2019
Author: manu
Date: Tue Oct 1 22:19:12 2019
New Revision: 352943
URL: https://svnweb.freebsd.org/changeset/base/352943
Log:
arm: allwinner: a10_ehci: Enable all phys
Even if there should be only one phy enable all the ones declared in
the dts just to be sure.
Modified:
head/sys/arm/allwinner/a10_ehci.c
Modified: head/sys/arm/allwinner/a10_ehci.c
==============================================================================
--- head/sys/arm/allwinner/a10_ehci.c Tue Oct 1 20:32:03 2019 (r352942)
+++ head/sys/arm/allwinner/a10_ehci.c Tue Oct 1 22:19:12 2019 (r352943)
@@ -93,11 +93,16 @@ struct hwrst_list {
hwreset_t rst;
};
+struct phy_list {
+ TAILQ_ENTRY(phy_list) next;
+ phy_t phy;
+};
+
struct aw_ehci_softc {
ehci_softc_t sc;
TAILQ_HEAD(, clk_list) clk_list;
TAILQ_HEAD(, hwrst_list) rst_list;
- phy_t phy;
+ TAILQ_HEAD(, phy_list) phy_list;
};
struct aw_ehci_conf {
@@ -144,19 +149,18 @@ a10_ehci_attach(device_t self)
struct aw_ehci_softc *aw_sc = device_get_softc(self);
ehci_softc_t *sc = &aw_sc->sc;
const struct aw_ehci_conf *conf;
- phandle_t node;
bus_space_handle_t bsh;
int err, rid, off;
struct clk_list *clkp;
clk_t clk;
struct hwrst_list *rstp;
hwreset_t rst;
+ struct phy_list *phyp;
+ phy_t phy;
uint32_t reg_value = 0;
conf = USB_CONF(self);
- node = ofw_bus_get_node(self);
-
/* initialise some bus fields */
sc->sc_bus.parent = self;
sc->sc_bus.devices = sc->sc_devices;
@@ -244,17 +248,21 @@ a10_ehci_attach(device_t self)
}
/* Enable USB PHY */
- if (phy_get_by_ofw_idx(self, node, 0, &aw_sc->phy) == 0) {
- err = phy_usb_set_mode(aw_sc->phy, PHY_USB_MODE_HOST);
+ TAILQ_INIT(&aw_sc->phy_list);
+ for (off = 0; phy_get_by_ofw_idx(self, 0, off, &phy) == 0; off++) {
+ err = phy_usb_set_mode(phy, PHY_USB_MODE_HOST);
if (err != 0) {
device_printf(self, "Could not set phy to host mode\n");
goto error;
}
- err = phy_enable(aw_sc->phy);
+ err = phy_enable(phy);
if (err != 0) {
device_printf(self, "Could not enable phy\n");
goto error;
}
+ phyp = malloc(sizeof(*phyp), M_DEVBUF, M_WAITOK | M_ZERO);
+ phyp->phy = phy;
+ TAILQ_INSERT_TAIL(&aw_sc->phy_list, phyp, next);
}
/* Configure port */
@@ -289,6 +297,7 @@ a10_ehci_detach(device_t self)
uint32_t reg_value = 0;
struct clk_list *clk, *clk_tmp;
struct hwrst_list *rst, *rst_tmp;
+ struct phy_list *phy, *phy_tmp;
conf = USB_CONF(self);
@@ -348,6 +357,16 @@ a10_ehci_detach(device_t self)
hwreset_release(rst->rst);
TAILQ_REMOVE(&aw_sc->rst_list, rst, next);
free(rst, M_DEVBUF);
+ }
+
+ /* Disable phys */
+ TAILQ_FOREACH_SAFE(phy, &aw_sc->phy_list, next, phy_tmp) {
+ err = phy_disable(phy->phy);
+ if (err != 0)
+ device_printf(self, "Could not disable phy\n");
+ phy_release(phy->phy);
+ TAILQ_REMOVE(&aw_sc->phy_list, phy, next);
+ free(phy, M_DEVBUF);
}
return (0);
More information about the svn-src-all
mailing list