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

Commit 0ea12e96 authored by Pratham Pratap's avatar Pratham Pratap Committed by Gerrit - the friendly Code Review server
Browse files

usb: phy: qusb2: Do not perform phy reset if EUD is enabled



If EUD is enabled and phy reset is performed due to
spoof connect, EUD enumeration fails. Fix this issue
by reading EUD enable register before phy init. Check
the status in and qusb_phy_dpdm_regulator_enable()
which also performs phy reset.

Change-Id: Ia2321d8608842036b9048767d72b485340b2c6ef
Signed-off-by: default avatarPratham Pratap <prathampratap@codeaurora.org>
parent fbad67d3
Loading
Loading
Loading
Loading
+21 −0
Original line number Original line Diff line number Diff line
@@ -89,6 +89,7 @@ struct qusb_phy {
	void __iomem		*base;
	void __iomem		*base;
	void __iomem		*efuse_reg;
	void __iomem		*efuse_reg;
	void __iomem		*refgen_north_bg_reg;
	void __iomem		*refgen_north_bg_reg;
	void __iomem		*eud_enable_reg;


	struct clk		*ref_clk_src;
	struct clk		*ref_clk_src;
	struct clk		*ref_clk;
	struct clk		*ref_clk;
@@ -492,6 +493,11 @@ static int qusb_phy_init(struct usb_phy *phy)


	dev_dbg(phy->dev, "%s\n", __func__);
	dev_dbg(phy->dev, "%s\n", __func__);


	if (qphy->eud_enable_reg && readl_relaxed(qphy->eud_enable_reg)) {
		dev_err(qphy->phy.dev, "eud is enabled\n");
		return 0;
	}

	qusb_phy_reset(qphy);
	qusb_phy_reset(qphy);


	if (qphy->qusb_phy_host_init_seq && qphy->phy.flags & PHY_HOST_MODE) {
	if (qphy->qusb_phy_host_init_seq && qphy->phy.flags & PHY_HOST_MODE) {
@@ -744,6 +750,11 @@ static int qusb_phy_dpdm_regulator_enable(struct regulator_dev *rdev)
	dev_dbg(qphy->phy.dev, "%s dpdm_enable:%d\n",
	dev_dbg(qphy->phy.dev, "%s dpdm_enable:%d\n",
				__func__, qphy->dpdm_enable);
				__func__, qphy->dpdm_enable);


	if (qphy->eud_enable_reg && readl_relaxed(qphy->eud_enable_reg)) {
		dev_err(qphy->phy.dev, "eud is enabled\n");
		return 0;
	}

	if (!qphy->dpdm_enable) {
	if (!qphy->dpdm_enable) {
		ret = qusb_phy_enable_power(qphy);
		ret = qusb_phy_enable_power(qphy);
		if (ret < 0) {
		if (ret < 0) {
@@ -919,6 +930,16 @@ static int qusb_phy_probe(struct platform_device *pdev)
		qphy->refgen_north_bg_reg = devm_ioremap(dev, res->start,
		qphy->refgen_north_bg_reg = devm_ioremap(dev, res->start,
						resource_size(res));
						resource_size(res));


	res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
			"eud_enable_reg");
	if (res) {
		qphy->eud_enable_reg = devm_ioremap_resource(dev, res);
		if (IS_ERR(qphy->eud_enable_reg)) {
			dev_err(dev, "err getting eud_enable_reg address\n");
			return PTR_ERR(qphy->eud_enable_reg);
		}
	}

	/* ref_clk_src is needed irrespective of SE_CLK or DIFF_CLK usage */
	/* ref_clk_src is needed irrespective of SE_CLK or DIFF_CLK usage */
	qphy->ref_clk_src = devm_clk_get(dev, "ref_clk_src");
	qphy->ref_clk_src = devm_clk_get(dev, "ref_clk_src");
	if (IS_ERR(qphy->ref_clk_src)) {
	if (IS_ERR(qphy->ref_clk_src)) {