All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Osipenko <digetx@gmail.com>
To: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Peter Chen" <Peter.Chen@nxp.com>,
	"Thierry Reding" <thierry.reding@gmail.com>,
	"Jonathan Hunter" <jonathanh@nvidia.com>,
	"Felipe Balbi" <balbi@kernel.org>,
	"Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Cc: linux-usb@vger.kernel.org, linux-tegra@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v4 13/20] usb: phy: tegra: Use device-tree notion of reset-GPIO's active-state
Date: Mon,  6 Jan 2020 04:34:09 +0300	[thread overview]
Message-ID: <20200106013416.9604-14-digetx@gmail.com> (raw)
In-Reply-To: <20200106013416.9604-1-digetx@gmail.com>

It is much more intuitive if reset is treated as asserted when GPIO value
is set to 1. All NVIDIA Tegra device-trees are properly specifying active
state of the reset-GPIO since 2013, let's clean up that part of the code.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
 drivers/usb/phy/phy-tegra-usb.c   | 70 +++++++------------------------
 include/linux/usb/tegra_usb_phy.h |  3 +-
 2 files changed, 18 insertions(+), 55 deletions(-)

diff --git a/drivers/usb/phy/phy-tegra-usb.c b/drivers/usb/phy/phy-tegra-usb.c
index f9acbab477cf..c431968d0433 100644
--- a/drivers/usb/phy/phy-tegra-usb.c
+++ b/drivers/usb/phy/phy-tegra-usb.c
@@ -693,12 +693,7 @@ static int ulpi_phy_power_on(struct tegra_usb_phy *phy)
 	u32 val;
 	int err;
 
-	err = gpio_direction_output(phy->reset_gpio, 0);
-	if (err) {
-		dev_err(phy->u_phy.dev, "GPIO %d not set to 0: %d\n",
-			phy->reset_gpio, err);
-		return err;
-	}
+	gpiod_set_value_cansleep(phy->reset_gpio, 1);
 
 	err = clk_prepare_enable(phy->clk);
 	if (err)
@@ -706,12 +701,7 @@ static int ulpi_phy_power_on(struct tegra_usb_phy *phy)
 
 	usleep_range(5000, 6000);
 
-	err = gpio_direction_output(phy->reset_gpio, 1);
-	if (err) {
-		dev_err(phy->u_phy.dev, "GPIO %d not set to 1: %d\n",
-			phy->reset_gpio, err);
-		goto disable_clk;
-	}
+	gpiod_set_value_cansleep(phy->reset_gpio, 0);
 
 	usleep_range(1000, 2000);
 
@@ -773,16 +763,8 @@ static int ulpi_phy_power_on(struct tegra_usb_phy *phy)
 
 static int ulpi_phy_power_off(struct tegra_usb_phy *phy)
 {
-	int err;
-
-	err = gpio_direction_output(phy->reset_gpio, 0);
-	if (err) {
-		dev_err(phy->u_phy.dev, "reset GPIO not asserted: %d\n", err);
-		return err;
-	}
-
+	gpiod_set_value_cansleep(phy->reset_gpio, 1);
 	usleep_range(5000, 6000);
-
 	clk_disable_unprepare(phy->clk);
 
 	return 0;
@@ -857,21 +839,6 @@ static int tegra_usb_phy_set_suspend(struct usb_phy *u_phy, int suspend)
 		return tegra_usb_phy_power_on(phy);
 }
 
-static int ulpi_open(struct tegra_usb_phy *phy)
-{
-	int err;
-
-	err = gpio_direction_output(phy->reset_gpio, 0);
-	if (err) {
-		dev_err(phy->u_phy.dev,
-			"ULPI reset GPIO %d direction not asserted: %d\n",
-			phy->reset_gpio, err);
-		return err;
-	}
-
-	return 0;
-}
-
 static int tegra_usb_phy_init(struct usb_phy *u_phy)
 {
 	struct tegra_usb_phy *phy = to_tegra_usb_phy(u_phy);
@@ -907,12 +874,11 @@ static int tegra_usb_phy_init(struct usb_phy *u_phy)
 		goto fail;
 	}
 
-	if (phy->is_ulpi_phy)
-		err = ulpi_open(phy);
-	else
+	if (!phy->is_ulpi_phy) {
 		err = utmip_pad_open(phy);
-	if (err)
-		goto fail;
+		if (err)
+			goto fail;
+	}
 
 	err = tegra_usb_phy_power_on(phy);
 	if (err)
@@ -1101,6 +1067,7 @@ static int tegra_usb_phy_probe(struct platform_device *pdev)
 	struct tegra_usb_phy *tegra_phy;
 	enum usb_phy_interface phy_type;
 	struct reset_control *reset;
+	struct gpio_desc *gpiod;
 	struct resource *res;
 	struct usb_phy *phy;
 	int err;
@@ -1178,15 +1145,6 @@ static int tegra_usb_phy_probe(struct platform_device *pdev)
 	case USBPHY_INTERFACE_MODE_ULPI:
 		tegra_phy->is_ulpi_phy = true;
 
-		tegra_phy->reset_gpio =
-			of_get_named_gpio(np, "nvidia,phy-reset-gpio", 0);
-
-		if (!gpio_is_valid(tegra_phy->reset_gpio)) {
-			dev_err(&pdev->dev,
-				"Invalid GPIO: %d\n", tegra_phy->reset_gpio);
-			return tegra_phy->reset_gpio;
-		}
-
 		tegra_phy->clk = devm_clk_get(&pdev->dev, "ulpi-link");
 		err = PTR_ERR_OR_ZERO(tegra_phy->clk);
 		if (err) {
@@ -1195,13 +1153,17 @@ static int tegra_usb_phy_probe(struct platform_device *pdev)
 			return err;
 		}
 
-		err = devm_gpio_request(&pdev->dev, tegra_phy->reset_gpio,
-					"ulpi_phy_reset_b");
+		gpiod = devm_gpiod_get_from_of_node(&pdev->dev, np,
+						    "nvidia,phy-reset-gpio",
+						    0, GPIOD_OUT_HIGH,
+						    "ulpi_phy_reset_b");
+		err = PTR_ERR_OR_ZERO(gpiod);
 		if (err) {
-			dev_err(&pdev->dev, "Request failed for GPIO %d: %d\n",
-				tegra_phy->reset_gpio, err);
+			dev_err(&pdev->dev,
+				"Request failed for reset GPIO: %d\n", err);
 			return err;
 		}
+		tegra_phy->reset_gpio = gpiod;
 
 		phy = devm_otg_ulpi_create(&pdev->dev,
 					   &ulpi_viewport_access_ops, 0);
diff --git a/include/linux/usb/tegra_usb_phy.h b/include/linux/usb/tegra_usb_phy.h
index 3ae73bdc6245..c29d1b4c9381 100644
--- a/include/linux/usb/tegra_usb_phy.h
+++ b/include/linux/usb/tegra_usb_phy.h
@@ -17,6 +17,7 @@
 #define __TEGRA_USB_PHY_H
 
 #include <linux/clk.h>
+#include <linux/gpio.h>
 #include <linux/reset.h>
 #include <linux/usb/otg.h>
 
@@ -76,7 +77,7 @@ struct tegra_usb_phy {
 	struct usb_phy u_phy;
 	bool is_legacy_phy;
 	bool is_ulpi_phy;
-	int reset_gpio;
+	struct gpio_desc *reset_gpio;
 	struct reset_control *pad_rst;
 	bool powered_on;
 };
-- 
2.24.0

  parent reply	other threads:[~2020-01-06  1:34 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-06  1:33 [PATCH v4 00/20] NVIDIA Tegra USB2 drivers clean up Dmitry Osipenko
2020-01-06  1:33 ` [PATCH v4 01/20] dt-binding: usb: ci-hdrc-usb2: Document NVIDIA Tegra support Dmitry Osipenko
2020-01-06  1:33 ` [PATCH v4 02/20] usb: host: ehci-tegra: Correct teardown order of driver's removal Dmitry Osipenko
2020-01-06  1:33 ` [PATCH v4 03/20] usb: phy: tegra: Clean up ulpi_phy_power_off Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 04/20] usb: phy: tegra: Keep track of power on-off state Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 05/20] usb: phy: tegra: Hook up init/shutdown callbacks Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 06/20] usb: phy: tegra: Perform general clean up of the code Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 07/20] usb: phy: tegra: Clean up included headers Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 08/20] usb: phy: tegra: Use relaxed versions of readl/writel Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 09/20] usb: phy: tegra: Use generic stub for a missing VBUS regulator Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 10/20] usb: ulpi: Add resource-managed variant of otg_ulpi_create() Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 11/20] usb: phy: tegra: Use devm_otg_ulpi_create() Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 12/20] usb: phy: tegra: Use u32 for hardware register variables Dmitry Osipenko
2020-01-06  1:34 ` Dmitry Osipenko [this message]
2020-01-06  1:34 ` [PATCH v4 14/20] usb: phy: tegra: Disable VBUS regulator on tegra_usb_phy_init failure Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 15/20] usb: phy: tegra: Move utmip_pad_count checking under lock Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 16/20] usb: phy: tegra: Keep CPU interrupts enabled Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 17/20] usb: chipidea: tegra: Stop managing PHY's power Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 18/20] usb: chipidea: tegra: Add USB_TEGRA_PHY to driver's dependencies Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 19/20] usb: host: ehci-tegra: Stop managing PHY's power Dmitry Osipenko
2020-01-06  1:34 ` [PATCH v4 20/20] usb: host: ehci-tegra: Remove unused fields from tegra_ehci_hcd Dmitry Osipenko
2020-01-06 15:16   ` Alan Stern
2020-01-07 16:13     ` Dmitry Osipenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200106013416.9604-14-digetx@gmail.com \
    --to=digetx@gmail.com \
    --cc=Peter.Chen@nxp.com \
    --cc=balbi@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jonathanh@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mirq-linux@rere.qmqm.pl \
    --cc=thierry.reding@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.