usb: cdns3: starfive: Disable USb 3.0 phy mode
authorJaehoon Chung <jh80.chung@samsung.com>
Mon, 8 Jan 2024 09:51:44 +0000 (18:51 +0900)
committerJaehoon Chung <jh80.chung@samsung.com>
Mon, 19 Feb 2024 00:13:55 +0000 (09:13 +0900)
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 <jh80.chung@samsung.com>
arch/riscv/boot/dts/starfive/jh7110.dtsi
drivers/usb/cdns3/cdns3-starfive.c

index fe82185..41a9e35 100644 (file)
                        #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>,
index 89b6c1e..8c5e028 100644 (file)
@@ -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,