> > From: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> > > In order to connect the USB 2.0 PHY to its controller, we also need to set > "u0_pdrstn_split_sw_usbpipe_plugen" [1]. Some downstream U-Boot versions > did that, but upstream firmware does not, and the kernel must not rely on such > behavior anyway. Failing to set this left the USB gadget port invisible to > connected hosts behind. > > Link: > https://doc-en.rvspace.org/JH7110/TRM/JH7110_TRM/sys_syscon.html#sys_sys > con__section_b3l_fqs_wsb [1] > Fixes: 16d3a71c20cf ("phy: starfive: Add JH7110 USB 2.0 PHY driver") > Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> > --- > drivers/phy/starfive/phy-jh7110-usb.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/drivers/phy/starfive/phy-jh7110-usb.c > b/drivers/phy/starfive/phy-jh7110-usb.c > index 633912f8a05d..67882bc4cebc 100644 > --- a/drivers/phy/starfive/phy-jh7110-usb.c > +++ b/drivers/phy/starfive/phy-jh7110-usb.c > @@ -10,18 +10,24 @@ > #include <linux/clk.h> > #include <linux/err.h> > #include <linux/io.h> > +#include <linux/mfd/syscon.h> > #include <linux/module.h> > #include <linux/phy/phy.h> > #include <linux/platform_device.h> > +#include <linux/regmap.h> > #include <linux/usb/of.h> > > #define USB_125M_CLK_RATE 125000000 > #define USB_LS_KEEPALIVE_OFF 0x4 > #define USB_LS_KEEPALIVE_ENABLE BIT(4) > > +#define USB_PDRSTN_SPLIT BIT(17) > + > struct jh7110_usb2_phy { > struct phy *phy; > void __iomem *regs; > + struct regmap *sys_syscon; > + u32 sys_phy_connect; > struct clk *usb_125m_clk; > struct clk *app_125m; > enum phy_mode mode; > @@ -61,6 +67,10 @@ static int usb2_phy_set_mode(struct phy *_phy, > usb2_set_ls_keepalive(phy, (mode != PHY_MODE_USB_DEVICE)); > } > > + /* Connect usb 2.0 phy mode */ > + regmap_update_bits(phy->sys_syscon, phy->sys_phy_connect, > + USB_PDRSTN_SPLIT, USB_PDRSTN_SPLIT); > + > return 0; > } > > @@ -101,6 +111,7 @@ static int jh7110_usb_phy_probe(struct > platform_device *pdev) > struct jh7110_usb2_phy *phy; > struct device *dev = &pdev->dev; > struct phy_provider *phy_provider; > + u32 args[1]; > > phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); > if (!phy) > @@ -129,6 +140,15 @@ static int jh7110_usb_phy_probe(struct > platform_device *pdev) > phy_set_drvdata(phy->phy, phy); > phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); > > + phy->sys_syscon = > + syscon_regmap_lookup_by_phandle_args(pdev->dev.of_node, > + "starfive,sys-syscon", > + 1, args); > + if (IS_ERR(phy->sys_syscon)) > + return dev_err_probe(dev, PTR_ERR(phy->phy), > + "Failed to get sys-syscon\n"); > + phy->sys_phy_connect = args[0]; > + > return PTR_ERR_OR_ZERO(phy_provider); > } > Reviewed-by: Minda Chen <minda.chen@xxxxxxxxxxxxxxxx>