Message ID | cd7b125c8c797f9d63440944df7121f9db0a49ad.1722457123.git.jan.kiszka@siemens.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | riscv: jh7110: Fix configuration for on-chip USB 2.0 support | expand |
> > From: Jan Kiszka <jan.kiszka@siemens.com> > > 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@siemens.com> > --- > 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@starfivetech.com>
Hi Jan, kernel test robot noticed the following build warnings: https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Jan-Kiszka/dt-bindings-phy-jh7110-usb-phy-Add-sys-syscon-property/20240802-101748 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next patch link: https://lore.kernel.org/r/cd7b125c8c797f9d63440944df7121f9db0a49ad.1722457123.git.jan.kiszka%40siemens.com patch subject: [PATCH 3/3] phy: starfive: jh7110-usb: Fix link configuration to controller config: microblaze-randconfig-r072-20240810 (https://download.01.org/0day-ci/archive/20240811/202408110917.hE9xidPH-lkp@intel.com/config) compiler: microblaze-linux-gcc (GCC) 14.1.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <dan.carpenter@linaro.org> | Closes: https://lore.kernel.org/r/202408110917.hE9xidPH-lkp@intel.com/ smatch warnings: drivers/phy/starfive/phy-jh7110-usb.c:148 jh7110_usb_phy_probe() warn: passing zero to 'PTR_ERR' vim +/PTR_ERR +148 drivers/phy/starfive/phy-jh7110-usb.c 16d3a71c20cf2e Minda Chen 2023-06-29 109 static int jh7110_usb_phy_probe(struct platform_device *pdev) 16d3a71c20cf2e Minda Chen 2023-06-29 110 { 16d3a71c20cf2e Minda Chen 2023-06-29 111 struct jh7110_usb2_phy *phy; 16d3a71c20cf2e Minda Chen 2023-06-29 112 struct device *dev = &pdev->dev; 16d3a71c20cf2e Minda Chen 2023-06-29 113 struct phy_provider *phy_provider; 0ed73d833230fd Jan Kiszka 2024-07-31 114 u32 args[1]; 16d3a71c20cf2e Minda Chen 2023-06-29 115 16d3a71c20cf2e Minda Chen 2023-06-29 116 phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); 16d3a71c20cf2e Minda Chen 2023-06-29 117 if (!phy) 16d3a71c20cf2e Minda Chen 2023-06-29 118 return -ENOMEM; 16d3a71c20cf2e Minda Chen 2023-06-29 119 16d3a71c20cf2e Minda Chen 2023-06-29 120 phy->usb_125m_clk = devm_clk_get(dev, "125m"); 16d3a71c20cf2e Minda Chen 2023-06-29 121 if (IS_ERR(phy->usb_125m_clk)) 16d3a71c20cf2e Minda Chen 2023-06-29 122 return dev_err_probe(dev, PTR_ERR(phy->usb_125m_clk), 16d3a71c20cf2e Minda Chen 2023-06-29 123 "Failed to get 125m clock\n"); 16d3a71c20cf2e Minda Chen 2023-06-29 124 16d3a71c20cf2e Minda Chen 2023-06-29 125 phy->app_125m = devm_clk_get(dev, "app_125m"); 16d3a71c20cf2e Minda Chen 2023-06-29 126 if (IS_ERR(phy->app_125m)) 16d3a71c20cf2e Minda Chen 2023-06-29 127 return dev_err_probe(dev, PTR_ERR(phy->app_125m), 16d3a71c20cf2e Minda Chen 2023-06-29 128 "Failed to get app 125m clock\n"); 16d3a71c20cf2e Minda Chen 2023-06-29 129 16d3a71c20cf2e Minda Chen 2023-06-29 130 phy->regs = devm_platform_ioremap_resource(pdev, 0); 16d3a71c20cf2e Minda Chen 2023-06-29 131 if (IS_ERR(phy->regs)) 16d3a71c20cf2e Minda Chen 2023-06-29 132 return dev_err_probe(dev, PTR_ERR(phy->regs), 16d3a71c20cf2e Minda Chen 2023-06-29 133 "Failed to map phy base\n"); 16d3a71c20cf2e Minda Chen 2023-06-29 134 16d3a71c20cf2e Minda Chen 2023-06-29 135 phy->phy = devm_phy_create(dev, NULL, &jh7110_usb2_phy_ops); 16d3a71c20cf2e Minda Chen 2023-06-29 136 if (IS_ERR(phy->phy)) 16d3a71c20cf2e Minda Chen 2023-06-29 137 return dev_err_probe(dev, PTR_ERR(phy->phy), 16d3a71c20cf2e Minda Chen 2023-06-29 138 "Failed to create phy\n"); 16d3a71c20cf2e Minda Chen 2023-06-29 139 16d3a71c20cf2e Minda Chen 2023-06-29 140 phy_set_drvdata(phy->phy, phy); 16d3a71c20cf2e Minda Chen 2023-06-29 141 phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 16d3a71c20cf2e Minda Chen 2023-06-29 142 0ed73d833230fd Jan Kiszka 2024-07-31 143 phy->sys_syscon = 0ed73d833230fd Jan Kiszka 2024-07-31 144 syscon_regmap_lookup_by_phandle_args(pdev->dev.of_node, 0ed73d833230fd Jan Kiszka 2024-07-31 145 "starfive,sys-syscon", 0ed73d833230fd Jan Kiszka 2024-07-31 146 1, args); 0ed73d833230fd Jan Kiszka 2024-07-31 147 if (IS_ERR(phy->sys_syscon)) 0ed73d833230fd Jan Kiszka 2024-07-31 @148 return dev_err_probe(dev, PTR_ERR(phy->phy), Passing the wrong variable. It should be phy->sys_syscon instead of phy->phy. 0ed73d833230fd Jan Kiszka 2024-07-31 149 "Failed to get sys-syscon\n"); 0ed73d833230fd Jan Kiszka 2024-07-31 150 phy->sys_phy_connect = args[0]; 0ed73d833230fd Jan Kiszka 2024-07-31 151 16d3a71c20cf2e Minda Chen 2023-06-29 152 return PTR_ERR_OR_ZERO(phy_provider); 16d3a71c20cf2e Minda Chen 2023-06-29 153 }
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); }