--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts 2018-04-28 19:24:56.090524456 +0200 +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts 2018-04-29 23:09:48.559371108 +0200 @@ -409,6 +409,7 @@ &usb0_phy { status = "okay"; phy-supply = <&usb_otg_pwr>; + dr_mode = "otg"; }; &usb1_phy { @@ -418,6 +419,7 @@ &usb0 { status = "okay"; + dr_mode = "host"; }; &usb1 { --- a/drivers/phy/amlogic/phy-meson8b-usb2.c 2018-04-28 19:22:57.420144229 +0200 +++ b/drivers/phy/amlogic/phy-meson8b-usb2.c 2018-04-29 23:13:57.136515043 +0200 @@ -113,6 +113,7 @@ struct phy_meson8b_usb2_priv { void __iomem *regs; enum usb_dr_mode dr_mode; + enum usb_dr_mode phy_mode; struct clk *clk_usb_general; struct clk *clk_usb; struct reset_control *reset; @@ -181,7 +182,7 @@ phy_meson8b_usb2_mask_bits(priv, REG_CTRL, REG_CTRL_SOF_TOGGLE_OUT, REG_CTRL_SOF_TOGGLE_OUT); - if (priv->dr_mode == USB_DR_MODE_HOST) { + if (priv->phy_mode == USB_DR_MODE_HOST) { phy_meson8b_usb2_mask_bits(priv, REG_ADP_BC, REG_ADP_BC_ACA_ENABLE, REG_ADP_BC_ACA_ENABLE); @@ -251,6 +252,11 @@ return -EINVAL; } + priv->phy_mode = usb_get_dr_mode(&pdev->dev); + if (priv->phy_mode == USB_DR_MODE_UNKNOWN) { + priv->phy_mode = priv->dr_mode; + } + phy = devm_phy_create(&pdev->dev, NULL, &phy_meson8b_usb2_ops); if (IS_ERR(phy)) { dev_err(&pdev->dev, "failed to create PHY\n");