Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 088e3312 authored by Mayank Rana's avatar Mayank Rana
Browse files

usb: phy: qusb: Fix occasional glitch issue with DP/DM pulse transition



Due to having two set of registers to enable/disable pullup and pulldown
registers if DP/DM is kept into high-z state for fraction of time, there
is occasional glitch seen on falling or rising edge with DP/DM pulse. To
address this issue, take approach of "make-before-break" (i.e. enable
required pulldown or pullup before removing pullup or pulldown) which makes
sure that DP/DM pulse transition is clean.

Change-Id: Ia140561a423a4c6258d1c90e2926b2db0c4d8093
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent e949c31b
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -367,12 +367,13 @@ static int qusb_phy_update_dpdm(struct usb_phy *phy, int value)
		usleep_range(2000, 3000);

		 /* Set DP to 0.6v, sleep 2-3ms */
		reg = readl_relaxed(qphy->base + QUSB2PHY_PORT_QC2);
		reg &= ~(RDP_UP_EN | RPUP_LOW_EN);
		writel_relaxed(reg, qphy->base + QUSB2PHY_PORT_QC2);
		reg = readl_relaxed(qphy->base + QUSB2PHY_PORT_QC1);
		reg |= VDP_SRC_EN;
		writel_relaxed(reg, qphy->base + QUSB2PHY_PORT_QC1);

		reg = readl_relaxed(qphy->base + QUSB2PHY_PORT_QC2);
		reg &= ~(RDP_UP_EN | RPUP_LOW_EN);
		writel_relaxed(reg, qphy->base + QUSB2PHY_PORT_QC2);
		/* complete above write */
		mb();
		/*
@@ -385,13 +386,14 @@ static int qusb_phy_update_dpdm(struct usb_phy *phy, int value)
	case POWER_SUPPLY_DP_DM_DM_PULSE:
		dev_dbg(phy->dev, "POWER_SUPPLY_DP_DM_DM_PULSE\n");
		/* Set DM to 0.6v, sleep 2-3ms */
		reg = readl_relaxed(qphy->base + QUSB2PHY_PORT_QC1);
		reg |= VDM_SRC_EN;
		writel_relaxed(reg, qphy->base + QUSB2PHY_PORT_QC1);

		reg = readl_relaxed(qphy->base + QUSB2PHY_PORT_QC2);
		reg &= ~(RDM_UP_EN | RPUM_LOW_EN);
		writel_relaxed(reg, qphy->base + QUSB2PHY_PORT_QC2);

		reg = readl_relaxed(qphy->base + QUSB2PHY_PORT_QC1);
		reg |= VDM_SRC_EN;
		writel_relaxed(reg, qphy->base + QUSB2PHY_PORT_QC1);
		/* complete above write */
		mb();

@@ -402,13 +404,14 @@ static int qusb_phy_update_dpdm(struct usb_phy *phy, int value)
		usleep_range(2000, 3000);

		/* DM to 3.075v, sleep 2-3ms */
		reg = readl_relaxed(qphy->base + QUSB2PHY_PORT_QC2);
		reg |= (RPUM_LOW_EN | RDM_UP_EN);
		writel_relaxed(reg, qphy->base + QUSB2PHY_PORT_QC2);

		reg = readl_relaxed(qphy->base + QUSB2PHY_PORT_QC1);
		reg &= ~VDM_SRC_EN;
		writel_relaxed(reg, qphy->base + QUSB2PHY_PORT_QC1);

		reg = readl_relaxed(qphy->base + QUSB2PHY_PORT_QC2);
		reg |= (RPUM_LOW_EN | RDM_UP_EN);
		writel_relaxed(reg, qphy->base + QUSB2PHY_PORT_QC2);
		/* complete above write */
		mb();