Patchwork [2/4] usb: host: tegra: Remove direct vbus regulator control using GPIOs

login
register
mail settings
Submitter Mikko Perttunen
Date June 26, 2013, 9:59 a.m.
Message ID <1372240781-1017-3-git-send-email-mperttunen@nvidia.com>
Download mbox | patch
Permalink /patch/254682/
State Superseded, archived
Headers show

Comments

Mikko Perttunen - June 26, 2013, 9:59 a.m.
The tegra ehci driver has enabled USB vbus regulators directly using
GPIOs and the device tree attribute nvidia,vbus-gpio. This is ugly
and causes error messages on boot when both the regulator driver
and the ehci driver want access to the same GPIO.

This patch removes this mechanism of vbus control, so that an actual
regulator interface can be used by the phy layer to control the
usb vbus regulator.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
---
 drivers/usb/host/ehci-tegra.c | 34 +---------------------------------
 1 file changed, 1 insertion(+), 33 deletions(-)
Stephen Warren - June 26, 2013, 5:16 p.m.
On 06/26/2013 03:59 AM, Mikko Perttunen wrote:
> The tegra ehci driver has enabled USB vbus regulators directly using
> GPIOs and the device tree attribute nvidia,vbus-gpio. This is ugly
> and causes error messages on boot when both the regulator driver
> and the ehci driver want access to the same GPIO.
> 
> This patch removes this mechanism of vbus control, so that an actual
> regulator interface can be used by the phy layer to control the
> usb vbus regulator.

This should be squashed into patch 1/4. The reason is that if just patch
1/4 is applied, then both ehci-tegra.c's legacy raw GPIO handling and
phy-tegra-usb.c's new regulator-based code will attempt to
gpio_request() the same GPIO, and one will fail, which will likely cause
the driver to fail to probe().
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index a1cec77..51cf1d2 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -328,33 +328,6 @@  static void tegra_ehci_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
 	free_dma_aligned_buffer(urb);
 }
 
-static int setup_vbus_gpio(struct platform_device *pdev,
-			   struct tegra_ehci_platform_data *pdata)
-{
-	int err = 0;
-	int gpio;
-
-	gpio = pdata->vbus_gpio;
-	if (!gpio_is_valid(gpio))
-		gpio = of_get_named_gpio(pdev->dev.of_node,
-					 "nvidia,vbus-gpio", 0);
-	if (!gpio_is_valid(gpio))
-		return 0;
-
-	err = gpio_request(gpio, "vbus_gpio");
-	if (err) {
-		dev_err(&pdev->dev, "can't request vbus gpio %d", gpio);
-		return err;
-	}
-	err = gpio_direction_output(gpio, 1);
-	if (err) {
-		dev_err(&pdev->dev, "can't enable vbus\n");
-		return err;
-	}
-
-	return err;
-}
-
 static int tegra_ehci_probe(struct platform_device *pdev)
 {
 	struct resource *res;
@@ -382,14 +355,11 @@  static int tegra_ehci_probe(struct platform_device *pdev)
 	if (!pdev->dev.coherent_dma_mask)
 		pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
 
-	setup_vbus_gpio(pdev, pdata);
-
 	hcd = usb_create_hcd(&tegra_ehci_hc_driver, &pdev->dev,
 					dev_name(&pdev->dev));
 	if (!hcd) {
 		dev_err(&pdev->dev, "Unable to create HCD\n");
-		err = -ENOMEM;
-		goto cleanup_vbus_gpio;
+		return -ENOMEM;
 	}
 	platform_set_drvdata(pdev, hcd);
 	ehci = hcd_to_ehci(hcd);
@@ -505,8 +475,6 @@  cleanup_clk_get:
 	clk_put(tegra->clk);
 cleanup_hcd_create:
 	usb_put_hcd(hcd);
-cleanup_vbus_gpio:
-	/* FIXME: Undo setup_vbus_gpio() here */
 	return err;
 }