aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel Vadot <manu@FreeBSD.org>2022-11-15 08:58:30 +0000
committerEmmanuel Vadot <manu@FreeBSD.org>2022-11-16 10:58:31 +0000
commit0a5f342aa5a0ddd5d173bdfc856c6a81d1c12c6c (patch)
tree8605a45b067187ea671deac27da9e50c77af0ddd
parentbd4f986644b3804e19b92d39f1f90ffabff83e14 (diff)
-rw-r--r--sys/dev/usb/controller/dwc3.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/sys/dev/usb/controller/dwc3.c b/sys/dev/usb/controller/dwc3.c
index 2e8f868bc47b..eaea4d57a764 100644
--- a/sys/dev/usb/controller/dwc3.c
+++ b/sys/dev/usb/controller/dwc3.c
@@ -86,6 +86,11 @@ struct snps_dwc3_softc {
bus_space_tag_t bst;
bus_space_handle_t bsh;
uint32_t snpsid;
+#ifdef FDT
+ clk_t clk_ref;
+ clk_t clk_suspend;
+ clk_t clk_bus;
+#endif
};
#define DWC3_WRITE(_sc, _off, _val) \
@@ -394,9 +399,32 @@ snps_dwc3_common_attach(device_t dev, bool is_fdt)
if (!is_fdt)
goto skip_phys;
- /* Get the phys */
node = ofw_bus_get_node(dev);
+ /* Get the clocks if any */
+ if (ofw_bus_is_compatible(dev, "rockchip,rk3328-dwc3") == 1) {
+ if (clk_get_by_ofw_name(dev, node, "ref_clk", &sc->clk_ref) != 0)
+ device_printf(dev, "Cannot get ref_clk\n");
+ if (clk_get_by_ofw_name(dev, node, "suspend_clk", &sc->clk_suspend) != 0)
+ device_printf(dev, "Cannot get suspend_clk\n");
+ if (clk_get_by_ofw_name(dev, node, "bus_clk", &sc->clk_bus) != 0)
+ device_printf(dev, "Cannot get bus_clk\n");
+ }
+
+ if (sc->clk_ref != NULL) {
+ if (clk_enable(sc->clk_ref) != 0)
+ device_printf(dev, "Cannot enable ref_clk\n");
+ }
+ if (sc->clk_suspend != NULL) {
+ if (clk_enable(sc->clk_suspend) != 0)
+ device_printf(dev, "Cannot enable suspend_clk\n");
+ }
+ if (sc->clk_bus != NULL) {
+ if (clk_enable(sc->clk_bus) != 0)
+ device_printf(dev, "Cannot enable bus_clk\n");
+ }
+
+ /* Get the phys */
usb2_phy = usb3_phy = NULL;
error = phy_get_by_ofw_name(dev, node, "usb2-phy", &usb2_phy);
if (error == 0 && usb2_phy != NULL)
@@ -427,6 +455,16 @@ skip_phys:
snsp_dwc3_dump_regs(sc, "Post XHCI init");
#endif
+#ifdef FDT
+ if (error) {
+ if (sc->clk_ref != NULL)
+ clk_disable(sc->clk_ref);
+ if (sc->clk_suspend != NULL)
+ clk_disable(sc->clk_suspend);
+ if (sc->clk_bus != NULL)
+ clk_disable(sc->clk_bus);
+ }
+#endif
return (error);
}