#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)
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
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);
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,