From 62c3fe8ad9be9281165563b7f15e02df5711503b Mon Sep 17 00:00:00 2001 From: Jaehoon Chung Date: Mon, 8 Jan 2024 18:51:44 +0900 Subject: [PATCH] usb: cdns3: starfive: Disable USb 3.0 phy mode This code is referred to v6.1 Tizen kernel. There is a code to disconnect usb3.0 phy. It's only using usb2_mode. To use sdb, tizen needs to use only usb2_mode. Change-Id: Ie28f501ecd12f8f92e3a2fa653ee722c682bffa5 Signed-off-by: Jaehoon Chung --- arch/riscv/boot/dts/starfive/jh7110.dtsi | 1 + drivers/usb/cdns3/cdns3-starfive.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/arch/riscv/boot/dts/starfive/jh7110.dtsi b/arch/riscv/boot/dts/starfive/jh7110.dtsi index fe82185..41a9e35 100644 --- a/arch/riscv/boot/dts/starfive/jh7110.dtsi +++ b/arch/riscv/boot/dts/starfive/jh7110.dtsi @@ -536,6 +536,7 @@ #address-cells = <1>; #size-cells = <1>; starfive,stg-syscon = <&stg_syscon 0x4>; + starfive,sys-syscon = <&sys_syscon 0x18>; clocks = <&stgcrg JH7110_STGCLK_USB0_LPM>, <&stgcrg JH7110_STGCLK_USB0_STB>, <&stgcrg JH7110_STGCLK_USB0_APB>, diff --git a/drivers/usb/cdns3/cdns3-starfive.c b/drivers/usb/cdns3/cdns3-starfive.c index 89b6c1e..8c5e028 100644 --- a/drivers/usb/cdns3/cdns3-starfive.c +++ b/drivers/usb/cdns3/cdns3-starfive.c @@ -29,6 +29,7 @@ #define USB_SUSPENDM_HOST BIT(19) #define USB_SUSPENDM_MASK BIT(19) +#define USB_PDRSTN_SPLIT BIT(17) #define USB_MISC_CFG_MASK GENMASK(23, 20) #define USB_SUSPENDM_BYPS BIT(20) @@ -42,6 +43,8 @@ struct cdns_starfive { struct clk_bulk_data *clks; int num_clks; u32 stg_usb_mode; + struct regmap *sys_syscon; + u32 sys_offset; #if IS_ENABLED(CONFIG_USB_CDNS3_STARFIVE_EXTCON) struct extcon_dev *edev; #endif @@ -50,12 +53,24 @@ struct cdns_starfive { static void cdns_mode_init(struct platform_device *pdev, struct cdns_starfive *data) { + struct device_node *child; enum usb_dr_mode mode; + child = of_get_compatible_child(pdev->dev.of_node, "cdns,usb3"); + if (!child) { + dev_err(&pdev->dev, "Failed to find child node\n"); + return; + } regmap_update_bits(data->stg_syscon, data->stg_usb_mode, USB_MISC_CFG_MASK, USB_SUSPENDM_BYPS | USB_PLL_EN | USB_REFCLK_MODE); + + if (!of_find_property(child, "cdns3,usb3-phy", NULL)) { + /* Disconnect usb 3.0 phy mode */ + regmap_update_bits(data->sys_syscon, data->sys_offset, + USB_PDRSTN_SPLIT, USB_PDRSTN_SPLIT); + } /* dr mode setting */ mode = usb_get_dr_mode(&pdev->dev); @@ -157,6 +172,14 @@ static int cdns_starfive_probe(struct platform_device *pdev) data->stg_usb_mode = args; + data->sys_syscon = syscon_regmap_lookup_by_phandle_args(pdev->dev.of_node, + "starfive,sys-syscon", 1, &args); + if (IS_ERR(data->sys_syscon)) + return dev_err_probe(dev, PTR_ERR(data->sys_syscon), + "Failed to parse starfive,sys-syscon\n"); + + data->sys_offset = args; + data->num_clks = devm_clk_bulk_get_all(data->dev, &data->clks); if (data->num_clks < 0) return dev_err_probe(data->dev, -ENODEV, -- 2.7.4