usb: phy: mxs: Enable IC fixes for related SoCs
authorPeter Chen <peter.chen@freescale.com>
Mon, 24 Feb 2014 02:20:59 +0000 (10:20 +0800)
committerFelipe Balbi <balbi@ti.com>
Wed, 5 Mar 2014 20:40:08 +0000 (14:40 -0600)
Two PHY bugs are fixed by IC logic, but these bits are not
enabled by default, so we enable them at driver.
The two bugs are: MXS_PHY_ABNORMAL_IN_SUSPEND and MXS_PHY_SENDING_SOF_TOO_FAST
which are described at code.

Signed-off-by: Peter Chen <peter.chen@freescale.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/phy/phy-mxs-usb.c

index 1663a6683ec17a1e180f4de731cfc29463286db4..cb711354315332c1ad7934a12058dddb96ca785b 100644 (file)
 #define HW_USBPHY_CTRL_SET                     0x34
 #define HW_USBPHY_CTRL_CLR                     0x38
 
+#define HW_USBPHY_IP                           0x90
+#define HW_USBPHY_IP_SET                       0x94
+#define HW_USBPHY_IP_CLR                       0x98
+
 #define BM_USBPHY_CTRL_SFTRST                  BIT(31)
 #define BM_USBPHY_CTRL_CLKGATE                 BIT(30)
 #define BM_USBPHY_CTRL_ENAUTOSET_USBCLKS       BIT(26)
@@ -42,6 +46,8 @@
 #define BM_USBPHY_CTRL_ENUTMILEVEL2            BIT(14)
 #define BM_USBPHY_CTRL_ENHOSTDISCONDETECT      BIT(1)
 
+#define BM_USBPHY_IP_FIX                       (BIT(17) | BIT(18))
+
 #define to_mxs_phy(p) container_of((p), struct mxs_phy, phy)
 
 /* Do disconnection between PHY and controller without vbus */
  */
 #define MXS_PHY_SENDING_SOF_TOO_FAST           BIT(2)
 
+/*
+ * IC has bug fixes logic, they include
+ * MXS_PHY_ABNORMAL_IN_SUSPEND and MXS_PHY_SENDING_SOF_TOO_FAST
+ * which are described at above flags, the RTL will handle it
+ * according to different versions.
+ */
+#define MXS_PHY_NEED_IP_FIX                    BIT(3)
+
 struct mxs_phy_data {
        unsigned int flags;
 };
@@ -70,11 +84,13 @@ static const struct mxs_phy_data imx23_phy_data = {
 
 static const struct mxs_phy_data imx6q_phy_data = {
        .flags = MXS_PHY_SENDING_SOF_TOO_FAST |
-               MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS,
+               MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS |
+               MXS_PHY_NEED_IP_FIX,
 };
 
 static const struct mxs_phy_data imx6sl_phy_data = {
-       .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS,
+       .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS |
+               MXS_PHY_NEED_IP_FIX,
 };
 
 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)
                BM_USBPHY_CTRL_ENUTMILEVEL3,
               base + HW_USBPHY_CTRL_SET);
 
+       if (mxs_phy->data->flags & MXS_PHY_NEED_IP_FIX)
+               writel(BM_USBPHY_IP_FIX, base + HW_USBPHY_IP_SET);
+
        return 0;
 }