From: Patrick Wildt Subject: Re: Add RK3588 support to rkusbphy(4) To: Mark Kettenis Cc: dlg@openbsd.org, patrick@openbsd.org, brad@comstyle.com, tech@openbsd.org Date: Sun, 23 Jun 2024 11:58:18 +0200 Am Fri, Jun 14, 2024 at 12:23:50AM +0200 schrieb Mark Kettenis: > While trying a more recent U-Boot version, I noticed a hang after > ohci(4) attached. After bisecting U-Boot, the breakage started to > happen after some fixes to the U-Boot driver for the USB PHY. Adding > support for the RK3588 SoC fixes the issue. > > On the RK3588 there is no "rockchip,usbgrf" property. Instead we need > to use the regmap provided by the parent. Also since the PHYs are > dedicated to OTG or host ports, there is only one otg-port or > host-port subnode, but not both. So don't warn if either of those is > missing. > > ok? > ok patrick@ > > Index: dev/fdt/rkusbphy.c > =================================================================== > RCS file: /cvs/src/sys/dev/fdt/rkusbphy.c,v > retrieving revision 1.4 > diff -u -p -r1.4 rkusbphy.c > --- dev/fdt/rkusbphy.c 29 Sep 2023 17:30:35 -0000 1.4 > +++ dev/fdt/rkusbphy.c 13 Jun 2024 22:18:06 -0000 > @@ -90,6 +90,38 @@ static const struct rkusbphy_chip rkusbp > }, > }; > > +static const struct rkusbphy_regs rkusbphy_rk3588_regs = { > + /* shift, mask, set */ > + .clk_enable = { 0x0000, 0, 0x1, 0x0 }, > + > + .otg = { > + .phy_enable = { 0x000c, 11, 0x1, 0x0 }, > + }, > + > + .host = { > + .phy_enable = { 0x0008, 2, 0x1, 0x0 }, > + }, > +}; > + > +static const struct rkusbphy_chip rkusbphy_rk3588[] = { > + { > + .c_base_addr = 0x0000, > + .c_regs = &rkusbphy_rk3588_regs, > + }, > + { > + .c_base_addr = 0x4000, > + .c_regs = &rkusbphy_rk3588_regs, > + }, > + { > + .c_base_addr = 0x8000, > + .c_regs = &rkusbphy_rk3588_regs, > + }, > + { > + .c_base_addr = 0xc000, > + .c_regs = &rkusbphy_rk3588_regs, > + }, > +}; > + > /* > * driver stuff > */ > @@ -159,6 +191,7 @@ struct rkusbphy_id { > > static const struct rkusbphy_id rkusbphy_ids[] = { > RKUSBPHY_ID("rockchip,rk3568-usb2phy", rkusbphy_rk3568), > + RKUSBPHY_ID("rockchip,rk3588-usb2phy", rkusbphy_rk3588), > }; > > static const struct rkusbphy_id * > @@ -213,7 +246,10 @@ rkusbphy_attach(struct device *parent, s > sc->sc_node = faa->fa_node; > > grfph = OF_getpropint(sc->sc_node, "rockchip,usbgrf", 0); > - sc->sc_grf = regmap_byphandle(grfph); > + if (grfph) > + sc->sc_grf = regmap_byphandle(grfph); > + else > + sc->sc_grf = regmap_bynode(OF_parent(faa->fa_node)); > if (sc->sc_grf == NULL) { > printf("%s: rockchip,usbgrf 0x%x not found\n", DEVNAME(sc), > grfph); > @@ -267,10 +303,8 @@ rkusbphy_register(struct rkusbphy_softc > int node; > > node = OF_getnodebyname(sc->sc_node, pc->pc_name); > - if (node == 0) { > - printf("%s: cannot find %s\n", DEVNAME(sc), pc->pc_name); > + if (node == 0) > return; > - } > > if (OF_getprop(node, "status", status, sizeof(status)) > 0 && > strcmp(status, "disabled") == 0)