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

Commit dadae594 authored by Mayank Rana's avatar Mayank Rana
Browse files

usb: phy: qusb: Fix check to enable dpdm regulator



Commit a69fe6c4 ("usb: phy: Fix compilation errors") inverted
check for dpdm regulator enable/disable causing dpdm regulator is
never getting turned ON. This results into dpdm state not being seen
in High-Z state causing USB charger detection failure. Fix this issue
by correcting the check as well rename rm_pulldown as dpdm_enable to
reflect actual functionality.

Also fix check with dpdm regulator related enable/disable APIs with
return value of qusb_phy_enable_power() API.

Change-Id: I351222b1b3c7c47fe44599e4b213af8280d6b551
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent 4bb2701f
Loading
Loading
Loading
Loading
+20 −16
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ struct qusb_phy {
	bool			clocks_enabled;
	bool			cable_connected;
	bool			suspended;
	bool			rm_pulldown;
	bool			dpdm_enable;

	struct regulator_desc	dpdm_rdesc;
	struct regulator_dev	*dpdm_rdev;
@@ -636,15 +636,17 @@ static int qusb_phy_dpdm_regulator_enable(struct regulator_dev *rdev)
	int ret = 0;
	struct qusb_phy *qphy = rdev_get_drvdata(rdev);

	dev_dbg(qphy->phy.dev, "%s\n", __func__);
	dev_dbg(qphy->phy.dev, "%s dpdm_enable:%d\n",
				__func__, qphy->dpdm_enable);

	if (qphy->rm_pulldown) {
	if (!qphy->dpdm_enable) {
		ret = qusb_phy_enable_power(qphy, true, false);
		if (ret >= 0) {
			qphy->rm_pulldown = true;
			dev_dbg(qphy->phy.dev, "dpdm_enable:rm_pulldown:%d\n",
							qphy->rm_pulldown);
		if (ret < 0) {
			dev_dbg(qphy->phy.dev,
				"dpdm regulator enable failed:%d\n", ret);
			return ret;
		}
		qphy->dpdm_enable = true;
	}

	return ret;
@@ -655,15 +657,17 @@ static int qusb_phy_dpdm_regulator_disable(struct regulator_dev *rdev)
	int ret = 0;
	struct qusb_phy *qphy = rdev_get_drvdata(rdev);

	dev_dbg(qphy->phy.dev, "%s\n", __func__);
	dev_dbg(qphy->phy.dev, "%s dpdm_enable:%d\n",
				__func__, qphy->dpdm_enable);

	if (!qphy->rm_pulldown) {
	if (qphy->dpdm_enable) {
		ret = qusb_phy_enable_power(qphy, false, false);
		if (ret >= 0) {
			qphy->rm_pulldown = false;
			dev_dbg(qphy->phy.dev, "dpdm_disable:rm_pulldown:%d\n",
							qphy->rm_pulldown);
		if (ret < 0) {
			dev_dbg(qphy->phy.dev,
				"dpdm regulator disable failed:%d\n", ret);
			return ret;
		}
		qphy->dpdm_enable = false;
	}

	return ret;
@@ -673,9 +677,9 @@ static int qusb_phy_dpdm_regulator_is_enabled(struct regulator_dev *rdev)
{
	struct qusb_phy *qphy = rdev_get_drvdata(rdev);

	dev_dbg(qphy->phy.dev, "%s qphy->rm_pulldown = %d\n", __func__,
					qphy->rm_pulldown);
	return qphy->rm_pulldown;
	dev_dbg(qphy->phy.dev, "%s qphy->dpdm_enable = %d\n", __func__,
					qphy->dpdm_enable);
	return qphy->dpdm_enable;
}

static struct regulator_ops qusb_phy_dpdm_regulator_ops = {
+21 −17
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -130,7 +130,7 @@ struct qusb_phy {
	bool			cable_connected;
	bool			suspended;
	bool			ulpi_mode;
	bool			rm_pulldown;
	bool			dpdm_enable;
	bool			is_se_clk;

	struct regulator_desc	dpdm_rdesc;
@@ -673,15 +673,17 @@ static int qusb_phy_dpdm_regulator_enable(struct regulator_dev *rdev)
	int ret = 0;
	struct qusb_phy *qphy = rdev_get_drvdata(rdev);

	dev_dbg(qphy->phy.dev, "%s\n", __func__);
	dev_dbg(qphy->phy.dev, "%s dpdm_enable:%d\n",
				__func__, qphy->dpdm_enable);

	if (qphy->rm_pulldown) {
	if (!qphy->dpdm_enable) {
		ret = qusb_phy_enable_power(qphy, true, false);
		if (ret >= 0) {
			qphy->rm_pulldown = true;
			dev_dbg(qphy->phy.dev, "dpdm_enable:rm_pulldown:%d\n",
							qphy->rm_pulldown);
		if (ret < 0) {
			dev_dbg(qphy->phy.dev,
				"dpdm regulator enable failed:%d\n", ret);
			return ret;
		}
		qphy->dpdm_enable = true;
	}

	return ret;
@@ -692,15 +694,17 @@ static int qusb_phy_dpdm_regulator_disable(struct regulator_dev *rdev)
	int ret = 0;
	struct qusb_phy *qphy = rdev_get_drvdata(rdev);

	dev_dbg(qphy->phy.dev, "%s\n", __func__);
	dev_dbg(qphy->phy.dev, "%s dpdm_enable:%d\n",
				__func__, qphy->dpdm_enable);

	if (!qphy->rm_pulldown) {
	if (qphy->dpdm_enable) {
		ret = qusb_phy_enable_power(qphy, false, false);
		if (ret >= 0) {
			qphy->rm_pulldown = false;
			dev_dbg(qphy->phy.dev, "dpdm_disable:rm_pulldown:%d\n",
							qphy->rm_pulldown);
		if (ret < 0) {
			dev_dbg(qphy->phy.dev,
				"dpdm regulator disable failed:%d\n", ret);
			return ret;
		}
		qphy->dpdm_enable = false;
	}

	return ret;
@@ -710,9 +714,9 @@ static int qusb_phy_dpdm_regulator_is_enabled(struct regulator_dev *rdev)
{
	struct qusb_phy *qphy = rdev_get_drvdata(rdev);

	dev_dbg(qphy->phy.dev, "%s qphy->rm_pulldown = %d\n", __func__,
					qphy->rm_pulldown);
	return qphy->rm_pulldown;
	dev_dbg(qphy->phy.dev, "%s qphy->dpdm_enable = %d\n", __func__,
					qphy->dpdm_enable);
	return qphy->dpdm_enable;
}

static struct regulator_ops qusb_phy_dpdm_regulator_ops = {