diff options
Diffstat (limited to 'drivers/usb/phy/phy-mxs-usb.c')
-rw-r--r-- | drivers/usb/phy/phy-mxs-usb.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c index 1663a6683ec1..cb7113543153 100644 --- a/drivers/usb/phy/phy-mxs-usb.c +++ b/drivers/usb/phy/phy-mxs-usb.c | |||
@@ -31,6 +31,10 @@ | |||
31 | #define HW_USBPHY_CTRL_SET 0x34 | 31 | #define HW_USBPHY_CTRL_SET 0x34 |
32 | #define HW_USBPHY_CTRL_CLR 0x38 | 32 | #define HW_USBPHY_CTRL_CLR 0x38 |
33 | 33 | ||
34 | #define HW_USBPHY_IP 0x90 | ||
35 | #define HW_USBPHY_IP_SET 0x94 | ||
36 | #define HW_USBPHY_IP_CLR 0x98 | ||
37 | |||
34 | #define BM_USBPHY_CTRL_SFTRST BIT(31) | 38 | #define BM_USBPHY_CTRL_SFTRST BIT(31) |
35 | #define BM_USBPHY_CTRL_CLKGATE BIT(30) | 39 | #define BM_USBPHY_CTRL_CLKGATE BIT(30) |
36 | #define BM_USBPHY_CTRL_ENAUTOSET_USBCLKS BIT(26) | 40 | #define BM_USBPHY_CTRL_ENAUTOSET_USBCLKS BIT(26) |
@@ -42,6 +46,8 @@ | |||
42 | #define BM_USBPHY_CTRL_ENUTMILEVEL2 BIT(14) | 46 | #define BM_USBPHY_CTRL_ENUTMILEVEL2 BIT(14) |
43 | #define BM_USBPHY_CTRL_ENHOSTDISCONDETECT BIT(1) | 47 | #define BM_USBPHY_CTRL_ENHOSTDISCONDETECT BIT(1) |
44 | 48 | ||
49 | #define BM_USBPHY_IP_FIX (BIT(17) | BIT(18)) | ||
50 | |||
45 | #define to_mxs_phy(p) container_of((p), struct mxs_phy, phy) | 51 | #define to_mxs_phy(p) container_of((p), struct mxs_phy, phy) |
46 | 52 | ||
47 | /* Do disconnection between PHY and controller without vbus */ | 53 | /* Do disconnection between PHY and controller without vbus */ |
@@ -60,6 +66,14 @@ | |||
60 | */ | 66 | */ |
61 | #define MXS_PHY_SENDING_SOF_TOO_FAST BIT(2) | 67 | #define MXS_PHY_SENDING_SOF_TOO_FAST BIT(2) |
62 | 68 | ||
69 | /* | ||
70 | * IC has bug fixes logic, they include | ||
71 | * MXS_PHY_ABNORMAL_IN_SUSPEND and MXS_PHY_SENDING_SOF_TOO_FAST | ||
72 | * which are described at above flags, the RTL will handle it | ||
73 | * according to different versions. | ||
74 | */ | ||
75 | #define MXS_PHY_NEED_IP_FIX BIT(3) | ||
76 | |||
63 | struct mxs_phy_data { | 77 | struct mxs_phy_data { |
64 | unsigned int flags; | 78 | unsigned int flags; |
65 | }; | 79 | }; |
@@ -70,11 +84,13 @@ static const struct mxs_phy_data imx23_phy_data = { | |||
70 | 84 | ||
71 | static const struct mxs_phy_data imx6q_phy_data = { | 85 | static const struct mxs_phy_data imx6q_phy_data = { |
72 | .flags = MXS_PHY_SENDING_SOF_TOO_FAST | | 86 | .flags = MXS_PHY_SENDING_SOF_TOO_FAST | |
73 | MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS, | 87 | MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS | |
88 | MXS_PHY_NEED_IP_FIX, | ||
74 | }; | 89 | }; |
75 | 90 | ||
76 | static const struct mxs_phy_data imx6sl_phy_data = { | 91 | static const struct mxs_phy_data imx6sl_phy_data = { |
77 | .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS, | 92 | .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS | |
93 | MXS_PHY_NEED_IP_FIX, | ||
78 | }; | 94 | }; |
79 | 95 | ||
80 | static const struct of_device_id mxs_phy_dt_ids[] = { | 96 | static const struct of_device_id mxs_phy_dt_ids[] = { |
@@ -118,6 +134,9 @@ static int mxs_phy_hw_init(struct mxs_phy *mxs_phy) | |||
118 | BM_USBPHY_CTRL_ENUTMILEVEL3, | 134 | BM_USBPHY_CTRL_ENUTMILEVEL3, |
119 | base + HW_USBPHY_CTRL_SET); | 135 | base + HW_USBPHY_CTRL_SET); |
120 | 136 | ||
137 | if (mxs_phy->data->flags & MXS_PHY_NEED_IP_FIX) | ||
138 | writel(BM_USBPHY_IP_FIX, base + HW_USBPHY_IP_SET); | ||
139 | |||
121 | return 0; | 140 | return 0; |
122 | } | 141 | } |
123 | 142 | ||