]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: chipidea: imx: add two samsung picophy parameters tuning implementation
authorPeter Chen <peter.chen@nxp.com>
Mon, 30 Sep 2019 05:56:26 +0000 (13:56 +0800)
committerPeter Chen <peter.chen@nxp.com>
Sun, 23 Aug 2020 03:40:08 +0000 (11:40 +0800)
These two parameters are used to improve USB signal for board level,
in this commit, we read it from the dtb, and write to related register
during the initialization.

Signed-off-by: Peter Chen <peter.chen@nxp.com>
drivers/usb/chipidea/ci_hdrc_imx.c
drivers/usb/chipidea/ci_hdrc_imx.h
drivers/usb/chipidea/usbmisc_imx.c

index c39e2b615ac6d179c822250e7bc33b8c1b41f64b..d6085f46772feb06e191357c17ae7fae191ad5fb 100644 (file)
@@ -165,6 +165,11 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev)
        if (of_usb_get_phy_mode(np) == USBPHY_INTERFACE_MODE_ULPI)
                data->ulpi = 1;
 
+       of_property_read_u32(np, "samsung,picophy-pre-emp-curr-control",
+                       &data->emp_curr_control);
+       of_property_read_u32(np, "samsung,picophy-dc-vol-level-adjust",
+                       &data->dc_vol_level_adjust);
+
        return data;
 }
 
index 99f846119c00418eb3383f4bee91e8a864f9bd7e..999c65390b7f1c20cf505fa95a9b73fa7e076abb 100644 (file)
@@ -26,6 +26,8 @@ struct imx_usbmisc_data {
        unsigned int ext_vbus:1; /* Vbus from exteranl event */
        struct usb_phy *usb_phy;
        enum usb_dr_mode available_role; /* runtime usb dr mode */
+       int emp_curr_control;
+       int dc_vol_level_adjust;
 };
 
 int imx_usbmisc_init(struct imx_usbmisc_data *data);
index 322e4de6b24af096877360107e96297c1b267cb2..6d8331e7da99ec31da164573b49709149f9ad28c 100644 (file)
 #define MX7D_USB_OTG_PHY_STATUS_VBUS_VLD       BIT(3)
 #define MX7D_USB_OTG_PHY_STATUS_CHRGDET                BIT(29)
 
+#define MX7D_USB_OTG_PHY_CFG1          0x30
+#define TXPREEMPAMPTUNE0_BIT           28
+#define TXPREEMPAMPTUNE0_MASK          (3 << 28)
+#define TXVREFTUNE0_BIT                        20
+#define TXVREFTUNE0_MASK               (0xf << 20)
+
 #define MX6_USB_OTG_WAKEUP_BITS (MX6_BM_WAKEUP_ENABLE | MX6_BM_VBUS_WAKEUP | \
                                 MX6_BM_ID_WAKEUP)
 
@@ -649,6 +655,21 @@ static int usbmisc_imx7d_init(struct imx_usbmisc_data *data)
                writel(reg | MX7D_USB_VBUS_WAKEUP_SOURCE_BVALID
                        | MX7D_USBNC_AUTO_RESUME,
                        usbmisc->base + MX7D_USBNC_USB_CTRL2);
+               /* PHY tuning for signal quality */
+               reg = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG1);
+               if (data->emp_curr_control && data->emp_curr_control <=
+                       (TXPREEMPAMPTUNE0_MASK >> TXPREEMPAMPTUNE0_BIT)) {
+                       reg &= ~TXPREEMPAMPTUNE0_MASK;
+                       reg |= (data->emp_curr_control << TXPREEMPAMPTUNE0_BIT);
+               }
+
+               if (data->dc_vol_level_adjust && data->dc_vol_level_adjust <=
+                       (TXVREFTUNE0_MASK >> TXVREFTUNE0_BIT)) {
+                       reg &= ~TXVREFTUNE0_MASK;
+                       reg |= (data->dc_vol_level_adjust << TXVREFTUNE0_BIT);
+               }
+
+               writel(reg, usbmisc->base + MX7D_USB_OTG_PHY_CFG1);
        }
 
        spin_unlock_irqrestore(&usbmisc->lock, flags);