devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 0/6] Make dwc3 use Generic PHY Framework
@ 2014-03-03 11:38 Kishon Vijay Abraham I
  2014-03-03 11:38 ` [PATCH v5 1/6] usb: dwc3: core: support optional PHYs Kishon Vijay Abraham I
                   ` (7 more replies)
  0 siblings, 8 replies; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-03 11:38 UTC (permalink / raw)
  To: bcousson, balbi, devicetree, linux-doc, linux-kernel, linux-omap,
	linux-arm-kernel, linux-usb, george.cherian, heikki.krogerus,
	rogerq
  Cc: rob.herring, pawel.moll, mark.rutland, swarren, ijc+devicetree,
	rob, tony, linux, kishon, gregkh, grant.likely, s.nawrocki, galak

Added support for optional PHY in dwc3 as not all SoCs having PHYs for DWC3
should be programmed. While this can be considered as a temporary fix,
a long term solution would be to add 'nop' PHY for platforms that does
not have programmable PHY.
Adapted DWC3 and USB3 PHY to use Generic PHY framework. Also changed the
name of USB3 PHY driver to PIPE3 PHY driver since the same driver has to
be used for SATA and PCIE too.

Changes from v4: (sending the entire patch series again)
* check the return values of phy_init and phy_power_on
* print errors if power_on or power_off of PHY fails.

Changes from v3: (Sent only adapt dwc3 core to use Generic PHY Framework) 
* avoided using quirks and rely on the return values of PHY APIs to find the
presence of PHY.

Changes from v2:
* added a couple of fixes. One is invoking phy_resume after phy_init and the
other is power off phy in error patch
* used quirks to identify if a particular platform does not have PHYs
* removed using separate header for pipe3 driver and also removed all referencs
to SATA and PCIe in pipe3 driver since it's not yet adapted for those drivers.

Changes from v1:
* The logic in which the driver detects the presence of PHYs has changed.
* patch ordering has changed
* udelay is replaced with usleep_range
* A patch to remove set_suspend callback which was deferred from Generic
PHY Framework series has been included.

Kishon Vijay Abraham I (6):
  usb: dwc3: core: support optional PHYs
  usb: dwc3: adapt dwc3 core to use Generic PHY Framework
  drivers: phy: usb3/pipe3: Adapt pipe3 driver to Generic PHY Framework
  usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2
  phy: omap-usb2: move omap_usb.h from linux/usb/ to linux/phy/
  arm/dts: added dt properties to adapt to the new phy framwork

 Documentation/devicetree/bindings/usb/dwc3.txt     |    6 +-
 arch/arm/boot/dts/omap5.dtsi                       |    5 +-
 drivers/phy/Kconfig                                |   11 +
 drivers/phy/Makefile                               |    1 +
 drivers/phy/phy-omap-usb2.c                        |   27 +--
 .../phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c}     |  240 ++++++++++++--------
 drivers/usb/dwc3/core.c                            |  116 +++++++---
 drivers/usb/dwc3/core.h                            |    7 +
 drivers/usb/phy/Kconfig                            |   11 -
 drivers/usb/phy/Makefile                           |    1 -
 include/linux/{usb => phy}/omap_usb.h              |    3 -
 11 files changed, 264 insertions(+), 164 deletions(-)
 rename drivers/{usb/phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c} (54%)
 rename include/linux/{usb => phy}/omap_usb.h (95%)

-- 
1.7.9.5

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v5 1/6] usb: dwc3: core: support optional PHYs
  2014-03-03 11:38 [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Kishon Vijay Abraham I
@ 2014-03-03 11:38 ` Kishon Vijay Abraham I
  2014-03-03 11:38 ` [PATCH v5 2/6] usb: dwc3: adapt dwc3 core to use Generic PHY Framework Kishon Vijay Abraham I
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-03 11:38 UTC (permalink / raw)
  To: bcousson, balbi, devicetree, linux-doc, linux-kernel, linux-omap,
	linux-arm-kernel, linux-usb, george.cherian, heikki.krogerus,
	rogerq
  Cc: rob.herring, pawel.moll, mark.rutland, swarren, ijc+devicetree,
	rob, tony, linux, kishon, gregkh, grant.likely, s.nawrocki, galak

Since PHYs for dwc3 is optional (not all SoCs having PHYs for DWC3
should be programmed), do not return from probe if the USB PHY library
returns -ENODEV as that indicates the platform does not have a
programmable PHY.

While this can be considered as a temporary fix, a long term solution
would be to add 'nop' PHY for platforms that does not have programmable
PHY.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Reviewed-by: Roger Quadros <rogerq@ti.com>
---
 drivers/usb/dwc3/core.c |   34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 7d0cb34..225a4d6 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -529,32 +529,26 @@ static int dwc3_probe(struct platform_device *pdev)
 
 	if (IS_ERR(dwc->usb2_phy)) {
 		ret = PTR_ERR(dwc->usb2_phy);
-
-		/*
-		 * if -ENXIO is returned, it means PHY layer wasn't
-		 * enabled, so it makes no sense to return -EPROBE_DEFER
-		 * in that case, since no PHY driver will ever probe.
-		 */
-		if (ret == -ENXIO)
+		if (ret == -ENXIO || ret == -ENODEV) {
+			dwc->usb2_phy = NULL;
+		} else if (ret == -EPROBE_DEFER) {
 			return ret;
-
-		dev_err(dev, "no usb2 phy configured\n");
-		return -EPROBE_DEFER;
+		} else {
+			dev_err(dev, "no usb2 phy configured\n");
+			return ret;
+		}
 	}
 
 	if (IS_ERR(dwc->usb3_phy)) {
 		ret = PTR_ERR(dwc->usb3_phy);
-
-		/*
-		 * if -ENXIO is returned, it means PHY layer wasn't
-		 * enabled, so it makes no sense to return -EPROBE_DEFER
-		 * in that case, since no PHY driver will ever probe.
-		 */
-		if (ret == -ENXIO)
+		if (ret == -ENXIO || ret == -ENODEV) {
+			dwc->usb3_phy = NULL;
+		} else if (ret == -EPROBE_DEFER) {
 			return ret;
-
-		dev_err(dev, "no usb3 phy configured\n");
-		return -EPROBE_DEFER;
+		} else {
+			dev_err(dev, "no usb3 phy configured\n");
+			return ret;
+		}
 	}
 
 	dwc->xhci_resources[0].start = res->start;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v5 2/6] usb: dwc3: adapt dwc3 core to use Generic PHY Framework
  2014-03-03 11:38 [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Kishon Vijay Abraham I
  2014-03-03 11:38 ` [PATCH v5 1/6] usb: dwc3: core: support optional PHYs Kishon Vijay Abraham I
@ 2014-03-03 11:38 ` Kishon Vijay Abraham I
  2014-03-05 14:43   ` Roger Quadros
  2014-03-03 11:38 ` [PATCH v5 3/6] drivers: phy: usb3/pipe3: Adapt pipe3 driver to " Kishon Vijay Abraham I
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-03 11:38 UTC (permalink / raw)
  To: bcousson, balbi, devicetree, linux-doc, linux-kernel, linux-omap,
	linux-arm-kernel, linux-usb, george.cherian, heikki.krogerus,
	rogerq
  Cc: rob.herring, pawel.moll, mark.rutland, swarren, ijc+devicetree,
	rob, tony, linux, kishon, gregkh, grant.likely, s.nawrocki, galak

Adapted dwc3 core to use the Generic PHY Framework. So for init, exit,
power_on and power_off the following APIs are used phy_init(), phy_exit(),
phy_power_on() and phy_power_off().

However using the old USB phy library wont be removed till the PHYs of all
other SoC's using dwc3 core is adapted to the Generic PHY Framework.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
 Documentation/devicetree/bindings/usb/dwc3.txt |    6 +-
 drivers/usb/dwc3/core.c                        |   86 +++++++++++++++++++++---
 drivers/usb/dwc3/core.h                        |    7 ++
 3 files changed, 89 insertions(+), 10 deletions(-)

diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt
index e807635..471366d 100644
--- a/Documentation/devicetree/bindings/usb/dwc3.txt
+++ b/Documentation/devicetree/bindings/usb/dwc3.txt
@@ -6,11 +6,13 @@ Required properties:
  - compatible: must be "snps,dwc3"
  - reg : Address and length of the register set for the device
  - interrupts: Interrupts used by the dwc3 controller.
+
+Optional properties:
  - usb-phy : array of phandle for the PHY device.  The first element
    in the array is expected to be a handle to the USB2/HS PHY and
    the second element is expected to be a handle to the USB3/SS PHY
-
-Optional properties:
+ - phys: from the *Generic PHY* bindings
+ - phy-names: from the *Generic PHY* bindings
  - tx-fifo-resize: determines if the FIFO *has* to be reallocated.
 
 This is usually a subnode to DWC3 glue to which it is connected.
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 225a4d6..497234a 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -61,9 +61,10 @@ void dwc3_set_mode(struct dwc3 *dwc, u32 mode)
  * dwc3_core_soft_reset - Issues core soft reset and PHY reset
  * @dwc: pointer to our context structure
  */
-static void dwc3_core_soft_reset(struct dwc3 *dwc)
+static int dwc3_core_soft_reset(struct dwc3 *dwc)
 {
 	u32		reg;
+	int		ret;
 
 	/* Before Resetting PHY, put Core in Reset */
 	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
@@ -82,6 +83,15 @@ static void dwc3_core_soft_reset(struct dwc3 *dwc)
 
 	usb_phy_init(dwc->usb2_phy);
 	usb_phy_init(dwc->usb3_phy);
+	ret = phy_init(dwc->usb2_generic_phy);
+	if (ret < 0)
+		return ret;
+
+	ret = phy_init(dwc->usb3_generic_phy);
+	if (ret < 0) {
+		phy_exit(dwc->usb2_generic_phy);
+		return ret;
+	}
 	mdelay(100);
 
 	/* Clear USB3 PHY reset */
@@ -100,6 +110,8 @@ static void dwc3_core_soft_reset(struct dwc3 *dwc)
 	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
 	reg &= ~DWC3_GCTL_CORESOFTRESET;
 	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
+
+	return 0;
 }
 
 /**
@@ -381,7 +393,9 @@ static int dwc3_core_init(struct dwc3 *dwc)
 		cpu_relax();
 	} while (true);
 
-	dwc3_core_soft_reset(dwc);
+	ret = dwc3_core_soft_reset(dwc);
+	if (ret)
+		goto err0;
 
 	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
 	reg &= ~DWC3_GCTL_SCALEDOWN_MASK;
@@ -446,6 +460,8 @@ err2:
 err1:
 	usb_phy_shutdown(dwc->usb2_phy);
 	usb_phy_shutdown(dwc->usb3_phy);
+	phy_exit(dwc->usb2_generic_phy);
+	phy_exit(dwc->usb3_generic_phy);
 
 err0:
 	return ret;
@@ -453,14 +469,12 @@ err0:
 
 static void dwc3_core_exit(struct dwc3 *dwc)
 {
-	if (!IS_ERR(dwc->usb2_phy))
-		usb_phy_shutdown(dwc->usb2_phy);
-	if (!IS_ERR(dwc->usb3_phy))
-		usb_phy_shutdown(dwc->usb3_phy);
-
 	dwc3_free_scratch_buffers(dwc);
 	usb_phy_shutdown(dwc->usb2_phy);
 	usb_phy_shutdown(dwc->usb3_phy);
+	phy_exit(dwc->usb2_generic_phy);
+	phy_exit(dwc->usb3_generic_phy);
+
 }
 
 #define DWC3_ALIGN_MASK		(16 - 1)
@@ -551,6 +565,32 @@ static int dwc3_probe(struct platform_device *pdev)
 		}
 	}
 
+	dwc->usb2_generic_phy = devm_phy_get(dev, "usb2-phy");
+	if (IS_ERR(dwc->usb2_generic_phy)) {
+		ret = PTR_ERR(dwc->usb2_generic_phy);
+		if (ret == -ENOSYS || ret == -ENODEV) {
+			dwc->usb2_generic_phy = NULL;
+		} else if (ret == -EPROBE_DEFER) {
+			return ret;
+		} else {
+			dev_err(dev, "no usb2 phy configured\n");
+			return ret;
+		}
+	}
+
+	dwc->usb3_generic_phy = devm_phy_get(dev, "usb3-phy");
+	if (IS_ERR(dwc->usb3_generic_phy)) {
+		ret = PTR_ERR(dwc->usb3_generic_phy);
+		if (ret == -ENOSYS || ret == -ENODEV) {
+			dwc->usb3_generic_phy = NULL;
+		} else if (ret == -EPROBE_DEFER) {
+			return ret;
+		} else {
+			dev_err(dev, "no usb3 phy configured\n");
+			return ret;
+		}
+	}
+
 	dwc->xhci_resources[0].start = res->start;
 	dwc->xhci_resources[0].end = dwc->xhci_resources[0].start +
 					DWC3_XHCI_REGS_END;
@@ -607,11 +647,18 @@ static int dwc3_probe(struct platform_device *pdev)
 
 	usb_phy_set_suspend(dwc->usb2_phy, 0);
 	usb_phy_set_suspend(dwc->usb3_phy, 0);
+	ret = phy_power_on(dwc->usb2_generic_phy);
+	if (ret < 0)
+		goto err1;
+
+	ret = phy_power_on(dwc->usb3_generic_phy);
+	if (ret < 0)
+		goto err_usb2phy_power;
 
 	ret = dwc3_event_buffers_setup(dwc);
 	if (ret) {
 		dev_err(dwc->dev, "failed to setup event buffers\n");
-		goto err1;
+		goto err_usb3phy_power;
 	}
 
 	switch (dwc->dr_mode) {
@@ -680,6 +727,12 @@ err3:
 err2:
 	dwc3_event_buffers_cleanup(dwc);
 
+err_usb3phy_power:
+	phy_power_off(dwc->usb3_generic_phy);
+
+err_usb2phy_power:
+	phy_power_off(dwc->usb2_generic_phy);
+
 err1:
 	usb_phy_set_suspend(dwc->usb2_phy, 1);
 	usb_phy_set_suspend(dwc->usb3_phy, 1);
@@ -697,6 +750,8 @@ static int dwc3_remove(struct platform_device *pdev)
 
 	usb_phy_set_suspend(dwc->usb2_phy, 1);
 	usb_phy_set_suspend(dwc->usb3_phy, 1);
+	phy_power_off(dwc->usb2_generic_phy);
+	phy_power_off(dwc->usb3_generic_phy);
 
 	pm_runtime_put_sync(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
@@ -794,6 +849,8 @@ static int dwc3_suspend(struct device *dev)
 
 	usb_phy_shutdown(dwc->usb3_phy);
 	usb_phy_shutdown(dwc->usb2_phy);
+	phy_exit(dwc->usb2_generic_phy);
+	phy_exit(dwc->usb3_generic_phy);
 
 	return 0;
 }
@@ -802,9 +859,17 @@ static int dwc3_resume(struct device *dev)
 {
 	struct dwc3	*dwc = dev_get_drvdata(dev);
 	unsigned long	flags;
+	int		ret;
 
 	usb_phy_init(dwc->usb3_phy);
 	usb_phy_init(dwc->usb2_phy);
+	ret = phy_init(dwc->usb2_generic_phy);
+	if (ret < 0)
+		return ret;
+
+	ret = phy_init(dwc->usb3_generic_phy);
+	if (ret < 0)
+		goto err_usb2phy_init;
 
 	spin_lock_irqsave(&dwc->lock, flags);
 
@@ -828,6 +893,11 @@ static int dwc3_resume(struct device *dev)
 	pm_runtime_enable(dev);
 
 	return 0;
+
+err_usb2phy_init:
+	phy_exit(dwc->usb2_generic_phy);
+
+	return ret;
 }
 
 static const struct dev_pm_ops dwc3_dev_pm_ops = {
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 00b0578..def4ebd 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -31,6 +31,8 @@
 #include <linux/usb/gadget.h>
 #include <linux/usb/otg.h>
 
+#include <linux/phy/phy.h>
+
 /* Global constants */
 #define DWC3_EP0_BOUNCE_SIZE	512
 #define DWC3_ENDPOINTS_NUM	32
@@ -619,6 +621,8 @@ struct dwc3_scratchpad_array {
  * @dr_mode: requested mode of operation
  * @usb2_phy: pointer to USB2 PHY
  * @usb3_phy: pointer to USB3 PHY
+ * @usb2_generic_phy: pointer to USB2 PHY
+ * @usb3_generic_phy: pointer to USB3 PHY
  * @dcfg: saved contents of DCFG register
  * @gctl: saved contents of GCTL register
  * @isoch_delay: wValue from Set Isochronous Delay request;
@@ -679,6 +683,9 @@ struct dwc3 {
 	struct usb_phy		*usb2_phy;
 	struct usb_phy		*usb3_phy;
 
+	struct phy		*usb2_generic_phy;
+	struct phy		*usb3_generic_phy;
+
 	void __iomem		*regs;
 	size_t			regs_size;
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v5 3/6] drivers: phy: usb3/pipe3: Adapt pipe3 driver to Generic PHY Framework
  2014-03-03 11:38 [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Kishon Vijay Abraham I
  2014-03-03 11:38 ` [PATCH v5 1/6] usb: dwc3: core: support optional PHYs Kishon Vijay Abraham I
  2014-03-03 11:38 ` [PATCH v5 2/6] usb: dwc3: adapt dwc3 core to use Generic PHY Framework Kishon Vijay Abraham I
@ 2014-03-03 11:38 ` Kishon Vijay Abraham I
  2014-03-06  9:30   ` Kishon Vijay Abraham I
  2014-03-03 11:38 ` [PATCH v5 4/6] usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2 Kishon Vijay Abraham I
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-03 11:38 UTC (permalink / raw)
  To: bcousson, balbi, devicetree, linux-doc, linux-kernel, linux-omap,
	linux-arm-kernel, linux-usb, george.cherian, heikki.krogerus,
	rogerq
  Cc: mark.rutland, linux, s.nawrocki, pawel.moll, ijc+devicetree, tony,
	gregkh, swarren, rob.herring, kishon, rob, galak, grant.likely

Adapted omap-usb3 PHY driver to Generic PHY Framework and moved phy-omap-usb3
driver in drivers/usb/phy to drivers/phy and also renamed the file to
phy-ti-pipe3 since this same driver will be used for SATA PHY and
PCIE PHY.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
 drivers/phy/Kconfig                                |   11 +
 drivers/phy/Makefile                               |    1 +
 .../phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c}     |  240 ++++++++++++--------
 drivers/usb/phy/Kconfig                            |   11 -
 drivers/usb/phy/Makefile                           |    1 -
 5 files changed, 158 insertions(+), 106 deletions(-)
 rename drivers/{usb/phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c} (54%)

diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index c7a551c..e3ec7d1 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -40,6 +40,17 @@ config OMAP_USB2
 	  The USB OTG controller communicates with the comparator using this
 	  driver.
 
+config TI_PIPE3
+	tristate "TI PIPE3 PHY Driver"
+	depends on ARCH_OMAP2PLUS || COMPILE_TEST
+	select GENERIC_PHY
+	select OMAP_CONTROL_USB
+	help
+	  Enable this to support the PIPE3 PHY that is part of TI SOCs. This
+	  driver takes care of all the PHY functionality apart from comparator.
+	  This driver interacts with the "OMAP Control PHY Driver" to power
+	  on/off the PHY.
+
 config TWL4030_USB
 	tristate "TWL4030 USB Transceiver Driver"
 	depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
index b57c253..32e3f94 100644
--- a/drivers/phy/Makefile
+++ b/drivers/phy/Makefile
@@ -8,4 +8,5 @@ obj-$(CONFIG_PHY_EXYNOS_DP_VIDEO)	+= phy-exynos-dp-video.o
 obj-$(CONFIG_PHY_EXYNOS_MIPI_VIDEO)	+= phy-exynos-mipi-video.o
 obj-$(CONFIG_PHY_MVEBU_SATA)		+= phy-mvebu-sata.o
 obj-$(CONFIG_OMAP_USB2)			+= phy-omap-usb2.o
+obj-$(CONFIG_TI_PIPE3)			+= phy-ti-pipe3.o
 obj-$(CONFIG_TWL4030_USB)		+= phy-twl4030-usb.o
diff --git a/drivers/usb/phy/phy-omap-usb3.c b/drivers/phy/phy-ti-pipe3.c
similarity index 54%
rename from drivers/usb/phy/phy-omap-usb3.c
rename to drivers/phy/phy-ti-pipe3.c
index 0c6ba29..67b189d 100644
--- a/drivers/usb/phy/phy-omap-usb3.c
+++ b/drivers/phy/phy-ti-pipe3.c
@@ -1,5 +1,5 @@
 /*
- * omap-usb3 - USB PHY, talking to dwc3 controller in OMAP.
+ * phy-ti-pipe3 - PIPE3 PHY driver.
  *
  * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
  * This program is free software; you can redistribute it and/or modify
@@ -19,10 +19,11 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
-#include <linux/usb/omap_usb.h>
+#include <linux/phy/phy.h>
 #include <linux/of.h>
 #include <linux/clk.h>
 #include <linux/err.h>
+#include <linux/io.h>
 #include <linux/pm_runtime.h>
 #include <linux/delay.h>
 #include <linux/usb/omap_control_usb.h>
@@ -52,17 +53,34 @@
 
 /*
  * This is an Empirical value that works, need to confirm the actual
- * value required for the USB3PHY_PLL_CONFIGURATION2.PLL_IDLE status
- * to be correctly reflected in the USB3PHY_PLL_STATUS register.
+ * value required for the PIPE3PHY_PLL_CONFIGURATION2.PLL_IDLE status
+ * to be correctly reflected in the PIPE3PHY_PLL_STATUS register.
  */
 # define PLL_IDLE_TIME  100;
 
-struct usb_dpll_map {
+struct pipe3_dpll_params {
+	u16	m;
+	u8	n;
+	u8	freq:3;
+	u8	sd;
+	u32	mf;
+};
+
+struct ti_pipe3 {
+	void __iomem		*pll_ctrl_base;
+	struct device		*dev;
+	struct device		*control_dev;
+	struct clk		*wkupclk;
+	struct clk		*sys_clk;
+	struct clk		*optclk;
+};
+
+struct pipe3_dpll_map {
 	unsigned long rate;
-	struct usb_dpll_params params;
+	struct pipe3_dpll_params params;
 };
 
-static struct usb_dpll_map dpll_map[] = {
+static struct pipe3_dpll_map dpll_map[] = {
 	{12000000, {1250, 5, 4, 20, 0} },	/* 12 MHz */
 	{16800000, {3125, 20, 4, 20, 0} },	/* 16.8 MHz */
 	{19200000, {1172, 8, 4, 20, 65537} },	/* 19.2 MHz */
@@ -71,7 +89,18 @@ static struct usb_dpll_map dpll_map[] = {
 	{38400000, {3125, 47, 4, 20, 92843} },	/* 38.4 MHz */
 };
 
-static struct usb_dpll_params *omap_usb3_get_dpll_params(unsigned long rate)
+static inline u32 ti_pipe3_readl(void __iomem *addr, unsigned offset)
+{
+	return __raw_readl(addr + offset);
+}
+
+static inline void ti_pipe3_writel(void __iomem *addr, unsigned offset,
+	u32 data)
+{
+	__raw_writel(data, addr + offset);
+}
+
+static struct pipe3_dpll_params *ti_pipe3_get_dpll_params(unsigned long rate)
 {
 	int i;
 
@@ -83,110 +112,123 @@ static struct usb_dpll_params *omap_usb3_get_dpll_params(unsigned long rate)
 	return NULL;
 }
 
-static int omap_usb3_suspend(struct usb_phy *x, int suspend)
+static int ti_pipe3_power_off(struct phy *x)
+{
+	struct ti_pipe3 *phy = phy_get_drvdata(x);
+	int val;
+	int timeout = PLL_IDLE_TIME;
+
+	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
+	val |= PLL_IDLE;
+	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
+
+	do {
+		val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS);
+		if (val & PLL_TICOPWDN)
+			break;
+		udelay(5);
+	} while (--timeout);
+
+	if (!timeout) {
+		dev_err(phy->dev, "power off failed\n");
+		return -EBUSY;
+	}
+
+	omap_control_usb_phy_power(phy->control_dev, 0);
+
+	return 0;
+}
+
+static int ti_pipe3_power_on(struct phy *x)
 {
-	struct omap_usb *phy = phy_to_omapusb(x);
-	int	val;
+	struct ti_pipe3 *phy = phy_get_drvdata(x);
+	int val;
 	int timeout = PLL_IDLE_TIME;
 
-	if (suspend && !phy->is_suspended) {
-		val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
-		val |= PLL_IDLE;
-		omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
-
-		do {
-			val = omap_usb_readl(phy->pll_ctrl_base, PLL_STATUS);
-			if (val & PLL_TICOPWDN)
-				break;
-			udelay(1);
-		} while (--timeout);
-
-		omap_control_usb_phy_power(phy->control_dev, 0);
-
-		phy->is_suspended	= 1;
-	} else if (!suspend && phy->is_suspended) {
-		phy->is_suspended	= 0;
-
-		val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
-		val &= ~PLL_IDLE;
-		omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
-
-		do {
-			val = omap_usb_readl(phy->pll_ctrl_base, PLL_STATUS);
-			if (!(val & PLL_TICOPWDN))
-				break;
-			udelay(1);
-		} while (--timeout);
+	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
+	val &= ~PLL_IDLE;
+	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
+
+	do {
+		val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS);
+		if (!(val & PLL_TICOPWDN))
+			break;
+		udelay(5);
+	} while (--timeout);
+
+	if (!timeout) {
+		dev_err(phy->dev, "power on failed\n");
+		return -EBUSY;
 	}
 
 	return 0;
 }
 
-static void omap_usb_dpll_relock(struct omap_usb *phy)
+static void ti_pipe3_dpll_relock(struct ti_pipe3 *phy)
 {
 	u32		val;
 	unsigned long	timeout;
 
-	omap_usb_writel(phy->pll_ctrl_base, PLL_GO, SET_PLL_GO);
+	ti_pipe3_writel(phy->pll_ctrl_base, PLL_GO, SET_PLL_GO);
 
 	timeout = jiffies + msecs_to_jiffies(20);
 	do {
-		val = omap_usb_readl(phy->pll_ctrl_base, PLL_STATUS);
+		val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS);
 		if (val & PLL_LOCK)
 			break;
 	} while (!WARN_ON(time_after(jiffies, timeout)));
 }
 
-static int omap_usb_dpll_lock(struct omap_usb *phy)
+static int ti_pipe3_dpll_lock(struct ti_pipe3 *phy)
 {
 	u32			val;
 	unsigned long		rate;
-	struct usb_dpll_params *dpll_params;
+	struct pipe3_dpll_params *dpll_params;
 
 	rate = clk_get_rate(phy->sys_clk);
-	dpll_params = omap_usb3_get_dpll_params(rate);
+	dpll_params = ti_pipe3_get_dpll_params(rate);
 	if (!dpll_params) {
 		dev_err(phy->dev,
 			  "No DPLL configuration for %lu Hz SYS CLK\n", rate);
 		return -EINVAL;
 	}
 
-	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1);
+	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1);
 	val &= ~PLL_REGN_MASK;
 	val |= dpll_params->n << PLL_REGN_SHIFT;
-	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val);
+	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val);
 
-	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
+	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
 	val &= ~PLL_SELFREQDCO_MASK;
 	val |= dpll_params->freq << PLL_SELFREQDCO_SHIFT;
-	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
+	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
 
-	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1);
+	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1);
 	val &= ~PLL_REGM_MASK;
 	val |= dpll_params->m << PLL_REGM_SHIFT;
-	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val);
+	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val);
 
-	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION4);
+	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION4);
 	val &= ~PLL_REGM_F_MASK;
 	val |= dpll_params->mf << PLL_REGM_F_SHIFT;
-	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION4, val);
+	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION4, val);
 
-	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION3);
+	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION3);
 	val &= ~PLL_SD_MASK;
 	val |= dpll_params->sd << PLL_SD_SHIFT;
-	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION3, val);
+	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION3, val);
 
-	omap_usb_dpll_relock(phy);
+	ti_pipe3_dpll_relock(phy);
 
 	return 0;
 }
 
-static int omap_usb3_init(struct usb_phy *x)
+static int ti_pipe3_init(struct phy *x)
 {
-	struct omap_usb	*phy = phy_to_omapusb(x);
+	struct ti_pipe3 *phy = phy_get_drvdata(x);
 	int ret;
 
-	ret = omap_usb_dpll_lock(phy);
+	ret = ti_pipe3_dpll_lock(phy);
 	if (ret)
 		return ret;
 
@@ -195,9 +237,18 @@ static int omap_usb3_init(struct usb_phy *x)
 	return 0;
 }
 
-static int omap_usb3_probe(struct platform_device *pdev)
+static struct phy_ops ops = {
+	.init		= ti_pipe3_init,
+	.power_on	= ti_pipe3_power_on,
+	.power_off	= ti_pipe3_power_off,
+	.owner		= THIS_MODULE,
+};
+
+static int ti_pipe3_probe(struct platform_device *pdev)
 {
-	struct omap_usb *phy;
+	struct ti_pipe3 *phy;
+	struct phy *generic_phy;
+	struct phy_provider *phy_provider;
 	struct resource *res;
 	struct device_node *node = pdev->dev.of_node;
 	struct device_node *control_node;
@@ -208,7 +259,7 @@ static int omap_usb3_probe(struct platform_device *pdev)
 
 	phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL);
 	if (!phy) {
-		dev_err(&pdev->dev, "unable to alloc mem for OMAP USB3 PHY\n");
+		dev_err(&pdev->dev, "unable to alloc mem for TI PIPE3 PHY\n");
 		return -ENOMEM;
 	}
 
@@ -219,13 +270,6 @@ static int omap_usb3_probe(struct platform_device *pdev)
 
 	phy->dev		= &pdev->dev;
 
-	phy->phy.dev		= phy->dev;
-	phy->phy.label		= "omap-usb3";
-	phy->phy.init		= omap_usb3_init;
-	phy->phy.set_suspend	= omap_usb3_suspend;
-	phy->phy.type		= USB_PHY_TYPE_USB3;
-
-	phy->is_suspended	= 1;
 	phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k");
 	if (IS_ERR(phy->wkupclk)) {
 		dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n");
@@ -251,6 +295,7 @@ static int omap_usb3_probe(struct platform_device *pdev)
 		dev_err(&pdev->dev, "Failed to get control device phandle\n");
 		return -EINVAL;
 	}
+
 	control_pdev = of_find_device_by_node(control_node);
 	if (!control_pdev) {
 		dev_err(&pdev->dev, "Failed to get control device\n");
@@ -260,23 +305,31 @@ static int omap_usb3_probe(struct platform_device *pdev)
 	phy->control_dev = &control_pdev->dev;
 
 	omap_control_usb_phy_power(phy->control_dev, 0);
-	usb_add_phy_dev(&phy->phy);
 
 	platform_set_drvdata(pdev, phy);
-
 	pm_runtime_enable(phy->dev);
+
+	generic_phy = devm_phy_create(phy->dev, &ops, NULL);
+	if (IS_ERR(generic_phy))
+		return PTR_ERR(generic_phy);
+
+	phy_set_drvdata(generic_phy, phy);
+	phy_provider = devm_of_phy_provider_register(phy->dev,
+			of_phy_simple_xlate);
+	if (IS_ERR(phy_provider))
+		return PTR_ERR(phy_provider);
+
 	pm_runtime_get(&pdev->dev);
 
 	return 0;
 }
 
-static int omap_usb3_remove(struct platform_device *pdev)
+static int ti_pipe3_remove(struct platform_device *pdev)
 {
-	struct omap_usb *phy = platform_get_drvdata(pdev);
+	struct ti_pipe3 *phy = platform_get_drvdata(pdev);
 
 	clk_unprepare(phy->wkupclk);
 	clk_unprepare(phy->optclk);
-	usb_remove_phy(&phy->phy);
 	if (!pm_runtime_suspended(&pdev->dev))
 		pm_runtime_put(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
@@ -286,10 +339,9 @@ static int omap_usb3_remove(struct platform_device *pdev)
 
 #ifdef CONFIG_PM_RUNTIME
 
-static int omap_usb3_runtime_suspend(struct device *dev)
+static int ti_pipe3_runtime_suspend(struct device *dev)
 {
-	struct platform_device	*pdev = to_platform_device(dev);
-	struct omap_usb	*phy = platform_get_drvdata(pdev);
+	struct ti_pipe3	*phy = dev_get_drvdata(dev);
 
 	clk_disable(phy->wkupclk);
 	clk_disable(phy->optclk);
@@ -297,11 +349,10 @@ static int omap_usb3_runtime_suspend(struct device *dev)
 	return 0;
 }
 
-static int omap_usb3_runtime_resume(struct device *dev)
+static int ti_pipe3_runtime_resume(struct device *dev)
 {
 	u32 ret = 0;
-	struct platform_device	*pdev = to_platform_device(dev);
-	struct omap_usb	*phy = platform_get_drvdata(pdev);
+	struct ti_pipe3	*phy = dev_get_drvdata(dev);
 
 	ret = clk_enable(phy->optclk);
 	if (ret) {
@@ -324,38 +375,39 @@ err1:
 	return ret;
 }
 
-static const struct dev_pm_ops omap_usb3_pm_ops = {
-	SET_RUNTIME_PM_OPS(omap_usb3_runtime_suspend, omap_usb3_runtime_resume,
-		NULL)
+static const struct dev_pm_ops ti_pipe3_pm_ops = {
+	SET_RUNTIME_PM_OPS(ti_pipe3_runtime_suspend,
+		ti_pipe3_runtime_resume, NULL)
 };
 
-#define DEV_PM_OPS     (&omap_usb3_pm_ops)
+#define DEV_PM_OPS     (&ti_pipe3_pm_ops)
 #else
 #define DEV_PM_OPS     NULL
 #endif
 
 #ifdef CONFIG_OF
-static const struct of_device_id omap_usb3_id_table[] = {
+static const struct of_device_id ti_pipe3_id_table[] = {
+	{ .compatible = "ti,phy-usb3" },
 	{ .compatible = "ti,omap-usb3" },
 	{}
 };
-MODULE_DEVICE_TABLE(of, omap_usb3_id_table);
+MODULE_DEVICE_TABLE(of, ti_pipe3_id_table);
 #endif
 
-static struct platform_driver omap_usb3_driver = {
-	.probe		= omap_usb3_probe,
-	.remove		= omap_usb3_remove,
+static struct platform_driver ti_pipe3_driver = {
+	.probe		= ti_pipe3_probe,
+	.remove		= ti_pipe3_remove,
 	.driver		= {
-		.name	= "omap-usb3",
+		.name	= "ti-pipe3",
 		.owner	= THIS_MODULE,
 		.pm	= DEV_PM_OPS,
-		.of_match_table = of_match_ptr(omap_usb3_id_table),
+		.of_match_table = of_match_ptr(ti_pipe3_id_table),
 	},
 };
 
-module_platform_driver(omap_usb3_driver);
+module_platform_driver(ti_pipe3_driver);
 
-MODULE_ALIAS("platform: omap_usb3");
+MODULE_ALIAS("platform: ti_pipe3");
 MODULE_AUTHOR("Texas Instruments Inc.");
-MODULE_DESCRIPTION("OMAP USB3 phy driver");
+MODULE_DESCRIPTION("TI PIPE3 phy driver");
 MODULE_LICENSE("GPL v2");
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
index 7d1451d..c337ba2 100644
--- a/drivers/usb/phy/Kconfig
+++ b/drivers/usb/phy/Kconfig
@@ -85,17 +85,6 @@ config OMAP_CONTROL_USB
 	  power on the USB2 PHY is present in OMAP4 and OMAP5. OMAP5 has an
 	  additional register to power on USB3 PHY.
 
-config OMAP_USB3
-	tristate "OMAP USB3 PHY Driver"
-	depends on ARCH_OMAP2PLUS || COMPILE_TEST
-	select OMAP_CONTROL_USB
-	select USB_PHY
-	help
-	  Enable this to support the USB3 PHY that is part of SOC. This
-	  driver takes care of all the PHY functionality apart from comparator.
-	  This driver interacts with the "OMAP Control USB Driver" to power
-	  on/off the PHY.
-
 config AM335X_CONTROL_USB
 	tristate
 
diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
index be58ada..15f1878 100644
--- a/drivers/usb/phy/Makefile
+++ b/drivers/usb/phy/Makefile
@@ -17,7 +17,6 @@ obj-$(CONFIG_OMAP_CONTROL_USB)		+= phy-omap-control.o
 obj-$(CONFIG_AM335X_CONTROL_USB)	+= phy-am335x-control.o
 obj-$(CONFIG_AM335X_PHY_USB)		+= phy-am335x.o
 obj-$(CONFIG_OMAP_OTG)			+= phy-omap-otg.o
-obj-$(CONFIG_OMAP_USB3)			+= phy-omap-usb3.o
 obj-$(CONFIG_SAMSUNG_USBPHY)		+= phy-samsung-usb.o
 obj-$(CONFIG_SAMSUNG_USB2PHY)		+= phy-samsung-usb2.o
 obj-$(CONFIG_SAMSUNG_USB3PHY)		+= phy-samsung-usb3.o
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v5 4/6] usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2
  2014-03-03 11:38 [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Kishon Vijay Abraham I
                   ` (2 preceding siblings ...)
  2014-03-03 11:38 ` [PATCH v5 3/6] drivers: phy: usb3/pipe3: Adapt pipe3 driver to " Kishon Vijay Abraham I
@ 2014-03-03 11:38 ` Kishon Vijay Abraham I
  2014-03-03 11:38 ` [PATCH v5 5/6] phy: omap-usb2: move omap_usb.h from linux/usb/ to linux/phy/ Kishon Vijay Abraham I
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-03 11:38 UTC (permalink / raw)
  To: bcousson, balbi, devicetree, linux-doc, linux-kernel, linux-omap,
	linux-arm-kernel, linux-usb, george.cherian, heikki.krogerus,
	rogerq
  Cc: rob.herring, pawel.moll, mark.rutland, swarren, ijc+devicetree,
	rob, tony, linux, kishon, gregkh, grant.likely, s.nawrocki, galak

Now that omap-usb2 is adapted to the new generic PHY framework,
*set_suspend* ops can be removed from omap-usb2 driver.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Acked-by: Felipe Balbi <balbi@ti.com>
Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
---
 drivers/phy/phy-omap-usb2.c |   25 -------------------------
 1 file changed, 25 deletions(-)

diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c
index 7699752..705af5a 100644
--- a/drivers/phy/phy-omap-usb2.c
+++ b/drivers/phy/phy-omap-usb2.c
@@ -98,28 +98,6 @@ static int omap_usb_set_peripheral(struct usb_otg *otg,
 	return 0;
 }
 
-static int omap_usb2_suspend(struct usb_phy *x, int suspend)
-{
-	struct omap_usb *phy = phy_to_omapusb(x);
-	int ret;
-
-	if (suspend && !phy->is_suspended) {
-		omap_control_usb_phy_power(phy->control_dev, 0);
-		pm_runtime_put_sync(phy->dev);
-		phy->is_suspended = 1;
-	} else if (!suspend && phy->is_suspended) {
-		ret = pm_runtime_get_sync(phy->dev);
-		if (ret < 0) {
-			dev_err(phy->dev, "get_sync failed with err %d\n", ret);
-			return ret;
-		}
-		omap_control_usb_phy_power(phy->control_dev, 1);
-		phy->is_suspended = 0;
-	}
-
-	return 0;
-}
-
 static int omap_usb_power_off(struct phy *x)
 {
 	struct omap_usb *phy = phy_get_drvdata(x);
@@ -173,7 +151,6 @@ static int omap_usb2_probe(struct platform_device *pdev)
 
 	phy->phy.dev		= phy->dev;
 	phy->phy.label		= "omap-usb2";
-	phy->phy.set_suspend	= omap_usb2_suspend;
 	phy->phy.otg		= otg;
 	phy->phy.type		= USB_PHY_TYPE_USB2;
 
@@ -190,8 +167,6 @@ static int omap_usb2_probe(struct platform_device *pdev)
 	}
 
 	phy->control_dev = &control_pdev->dev;
-
-	phy->is_suspended	= 1;
 	omap_control_usb_phy_power(phy->control_dev, 0);
 
 	otg->set_host		= omap_usb_set_host;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v5 5/6] phy: omap-usb2: move omap_usb.h from linux/usb/ to linux/phy/
  2014-03-03 11:38 [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Kishon Vijay Abraham I
                   ` (3 preceding siblings ...)
  2014-03-03 11:38 ` [PATCH v5 4/6] usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2 Kishon Vijay Abraham I
@ 2014-03-03 11:38 ` Kishon Vijay Abraham I
  2014-03-03 11:38 ` [PATCH v5 6/6] arm/dts: added dt properties to adapt to the new phy framwork Kishon Vijay Abraham I
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-03 11:38 UTC (permalink / raw)
  To: bcousson, balbi, devicetree, linux-doc, linux-kernel, linux-omap,
	linux-arm-kernel, linux-usb, george.cherian, heikki.krogerus,
	rogerq
  Cc: rob.herring, pawel.moll, mark.rutland, swarren, ijc+devicetree,
	rob, tony, linux, kishon, gregkh, grant.likely, s.nawrocki, galak

No functional change. Moved omap_usb.h from linux/usb/ to linux/phy/.
Also removed the unused members of struct omap_usb (after phy-omap-pipe3
started using it's own header file)

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
 drivers/phy/phy-omap-usb2.c           |    2 +-
 include/linux/{usb => phy}/omap_usb.h |    3 ---
 2 files changed, 1 insertion(+), 4 deletions(-)
 rename include/linux/{usb => phy}/omap_usb.h (95%)

diff --git a/drivers/phy/phy-omap-usb2.c b/drivers/phy/phy-omap-usb2.c
index 705af5a..9c3f056 100644
--- a/drivers/phy/phy-omap-usb2.c
+++ b/drivers/phy/phy-omap-usb2.c
@@ -21,7 +21,7 @@
 #include <linux/slab.h>
 #include <linux/of.h>
 #include <linux/io.h>
-#include <linux/usb/omap_usb.h>
+#include <linux/phy/omap_usb.h>
 #include <linux/usb/phy_companion.h>
 #include <linux/clk.h>
 #include <linux/err.h>
diff --git a/include/linux/usb/omap_usb.h b/include/linux/phy/omap_usb.h
similarity index 95%
rename from include/linux/usb/omap_usb.h
rename to include/linux/phy/omap_usb.h
index 6ae2936..19d343c3 100644
--- a/include/linux/usb/omap_usb.h
+++ b/include/linux/phy/omap_usb.h
@@ -33,13 +33,10 @@ struct usb_dpll_params {
 struct omap_usb {
 	struct usb_phy		phy;
 	struct phy_companion	*comparator;
-	void __iomem		*pll_ctrl_base;
 	struct device		*dev;
 	struct device		*control_dev;
 	struct clk		*wkupclk;
-	struct clk		*sys_clk;
 	struct clk		*optclk;
-	u8			is_suspended:1;
 };
 
 #define	phy_to_omapusb(x)	container_of((x), struct omap_usb, phy)
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v5 6/6] arm/dts: added dt properties to adapt to the new phy framwork
  2014-03-03 11:38 [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Kishon Vijay Abraham I
                   ` (4 preceding siblings ...)
  2014-03-03 11:38 ` [PATCH v5 5/6] phy: omap-usb2: move omap_usb.h from linux/usb/ to linux/phy/ Kishon Vijay Abraham I
@ 2014-03-03 11:38 ` Kishon Vijay Abraham I
  2014-03-05 12:42   ` Kishon Vijay Abraham I
  2014-03-03 12:21 ` [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Roger Quadros
       [not found] ` <1393846695-14644-1-git-send-email-kishon-l0cyMroinI0@public.gmane.org>
  7 siblings, 1 reply; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-03 11:38 UTC (permalink / raw)
  To: bcousson, balbi, devicetree, linux-doc, linux-kernel, linux-omap,
	linux-arm-kernel, linux-usb, george.cherian, heikki.krogerus,
	rogerq
  Cc: rob.herring, pawel.moll, mark.rutland, swarren, ijc+devicetree,
	rob, tony, linux, kishon, gregkh, grant.likely, s.nawrocki, galak

Added device tree bindings for dwc3, usb2 and usb3 PHYs. The documentation
of these can be found at Documentation/devicetree/bindings/phy/phy-bindings.txt
and Documentation/devicetree/bindings/phy/ti-phy.txt.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
 arch/arm/boot/dts/omap5.dtsi |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi
index a72813a..1c68558 100644
--- a/arch/arm/boot/dts/omap5.dtsi
+++ b/arch/arm/boot/dts/omap5.dtsi
@@ -732,7 +732,8 @@
 				compatible = "snps,dwc3";
 				reg = <0x4a030000 0x10000>;
 				interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
-				usb-phy = <&usb2_phy>, <&usb3_phy>;
+				phys = <&usb2_phy>, <&usb3_phy>;
+				phy-names = "usb2-phy", "usb3-phy";
 				dr_mode = "peripheral";
 				tx-fifo-resize;
 			};
@@ -749,6 +750,7 @@
 				compatible = "ti,omap-usb2";
 				reg = <0x4a084000 0x7c>;
 				ctrl-module = <&omap_control_usb2phy>;
+				#phy-cells = <0>;
 			};
 
 			usb3_phy: usb3phy@4a084400 {
@@ -758,6 +760,7 @@
 				      <0x4a084c00 0x40>;
 				reg-names = "phy_rx", "phy_tx", "pll_ctrl";
 				ctrl-module = <&omap_control_usb3phy>;
+				#phy-cells = <0>;
 			};
 		};
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 0/6] Make dwc3 use Generic PHY Framework
  2014-03-03 11:38 [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Kishon Vijay Abraham I
                   ` (5 preceding siblings ...)
  2014-03-03 11:38 ` [PATCH v5 6/6] arm/dts: added dt properties to adapt to the new phy framwork Kishon Vijay Abraham I
@ 2014-03-03 12:21 ` Roger Quadros
  2014-03-03 12:36   ` Kishon Vijay Abraham I
       [not found] ` <1393846695-14644-1-git-send-email-kishon-l0cyMroinI0@public.gmane.org>
  7 siblings, 1 reply; 17+ messages in thread
From: Roger Quadros @ 2014-03-03 12:21 UTC (permalink / raw)
  To: Kishon Vijay Abraham I, bcousson, balbi, devicetree, linux-doc,
	linux-kernel, linux-omap, linux-arm-kernel, linux-usb,
	george.cherian, heikki.krogerus
  Cc: mark.rutland, linux, s.nawrocki, pawel.moll, ijc+devicetree, tony,
	gregkh, swarren, rob.herring, rob, galak, grant.likely

Hi Kishon,

Which tree are these patches based on?

cheers,
-roger

On 03/03/2014 01:38 PM, Kishon Vijay Abraham I wrote:
> Added support for optional PHY in dwc3 as not all SoCs having PHYs for DWC3
> should be programmed. While this can be considered as a temporary fix,
> a long term solution would be to add 'nop' PHY for platforms that does
> not have programmable PHY.
> Adapted DWC3 and USB3 PHY to use Generic PHY framework. Also changed the
> name of USB3 PHY driver to PIPE3 PHY driver since the same driver has to
> be used for SATA and PCIE too.
> 
> Changes from v4: (sending the entire patch series again)
> * check the return values of phy_init and phy_power_on
> * print errors if power_on or power_off of PHY fails.
> 
> Changes from v3: (Sent only adapt dwc3 core to use Generic PHY Framework) 
> * avoided using quirks and rely on the return values of PHY APIs to find the
> presence of PHY.
> 
> Changes from v2:
> * added a couple of fixes. One is invoking phy_resume after phy_init and the
> other is power off phy in error patch
> * used quirks to identify if a particular platform does not have PHYs
> * removed using separate header for pipe3 driver and also removed all referencs
> to SATA and PCIe in pipe3 driver since it's not yet adapted for those drivers.
> 
> Changes from v1:
> * The logic in which the driver detects the presence of PHYs has changed.
> * patch ordering has changed
> * udelay is replaced with usleep_range
> * A patch to remove set_suspend callback which was deferred from Generic
> PHY Framework series has been included.
> 
> Kishon Vijay Abraham I (6):
>   usb: dwc3: core: support optional PHYs
>   usb: dwc3: adapt dwc3 core to use Generic PHY Framework
>   drivers: phy: usb3/pipe3: Adapt pipe3 driver to Generic PHY Framework
>   usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2
>   phy: omap-usb2: move omap_usb.h from linux/usb/ to linux/phy/
>   arm/dts: added dt properties to adapt to the new phy framwork
> 
>  Documentation/devicetree/bindings/usb/dwc3.txt     |    6 +-
>  arch/arm/boot/dts/omap5.dtsi                       |    5 +-
>  drivers/phy/Kconfig                                |   11 +
>  drivers/phy/Makefile                               |    1 +
>  drivers/phy/phy-omap-usb2.c                        |   27 +--
>  .../phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c}     |  240 ++++++++++++--------
>  drivers/usb/dwc3/core.c                            |  116 +++++++---
>  drivers/usb/dwc3/core.h                            |    7 +
>  drivers/usb/phy/Kconfig                            |   11 -
>  drivers/usb/phy/Makefile                           |    1 -
>  include/linux/{usb => phy}/omap_usb.h              |    3 -
>  11 files changed, 264 insertions(+), 164 deletions(-)
>  rename drivers/{usb/phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c} (54%)
>  rename include/linux/{usb => phy}/omap_usb.h (95%)
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 0/6] Make dwc3 use Generic PHY Framework
  2014-03-03 12:21 ` [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Roger Quadros
@ 2014-03-03 12:36   ` Kishon Vijay Abraham I
  0 siblings, 0 replies; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-03 12:36 UTC (permalink / raw)
  To: Roger Quadros, bcousson, balbi, devicetree, linux-doc,
	linux-kernel, linux-omap, linux-arm-kernel, linux-usb,
	george.cherian, heikki.krogerus
  Cc: rob.herring, pawel.moll, mark.rutland, swarren, ijc+devicetree,
	rob, tony, linux, gregkh, grant.likely, s.nawrocki, galak

Roger,

On Monday 03 March 2014 05:51 PM, Roger Quadros wrote:
> Hi Kishon,
>
> Which tree are these patches based on?

mainline + Felipe's testing/next + Revert "usb: dwc3: core: enable 
Suspend bit for USB2/3 PHYs" + Revert "usb: dwc3: preparation for 
adapting dwc3 to generic phy framework"

Thanks
Kishon

>
> cheers,
> -roger
>
> On 03/03/2014 01:38 PM, Kishon Vijay Abraham I wrote:
>> Added support for optional PHY in dwc3 as not all SoCs having PHYs for DWC3
>> should be programmed. While this can be considered as a temporary fix,
>> a long term solution would be to add 'nop' PHY for platforms that does
>> not have programmable PHY.
>> Adapted DWC3 and USB3 PHY to use Generic PHY framework. Also changed the
>> name of USB3 PHY driver to PIPE3 PHY driver since the same driver has to
>> be used for SATA and PCIE too.
>>
>> Changes from v4: (sending the entire patch series again)
>> * check the return values of phy_init and phy_power_on
>> * print errors if power_on or power_off of PHY fails.
>>
>> Changes from v3: (Sent only adapt dwc3 core to use Generic PHY Framework)
>> * avoided using quirks and rely on the return values of PHY APIs to find the
>> presence of PHY.
>>
>> Changes from v2:
>> * added a couple of fixes. One is invoking phy_resume after phy_init and the
>> other is power off phy in error patch
>> * used quirks to identify if a particular platform does not have PHYs
>> * removed using separate header for pipe3 driver and also removed all referencs
>> to SATA and PCIe in pipe3 driver since it's not yet adapted for those drivers.
>>
>> Changes from v1:
>> * The logic in which the driver detects the presence of PHYs has changed.
>> * patch ordering has changed
>> * udelay is replaced with usleep_range
>> * A patch to remove set_suspend callback which was deferred from Generic
>> PHY Framework series has been included.
>>
>> Kishon Vijay Abraham I (6):
>>    usb: dwc3: core: support optional PHYs
>>    usb: dwc3: adapt dwc3 core to use Generic PHY Framework
>>    drivers: phy: usb3/pipe3: Adapt pipe3 driver to Generic PHY Framework
>>    usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2
>>    phy: omap-usb2: move omap_usb.h from linux/usb/ to linux/phy/
>>    arm/dts: added dt properties to adapt to the new phy framwork
>>
>>   Documentation/devicetree/bindings/usb/dwc3.txt     |    6 +-
>>   arch/arm/boot/dts/omap5.dtsi                       |    5 +-
>>   drivers/phy/Kconfig                                |   11 +
>>   drivers/phy/Makefile                               |    1 +
>>   drivers/phy/phy-omap-usb2.c                        |   27 +--
>>   .../phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c}     |  240 ++++++++++++--------
>>   drivers/usb/dwc3/core.c                            |  116 +++++++---
>>   drivers/usb/dwc3/core.h                            |    7 +
>>   drivers/usb/phy/Kconfig                            |   11 -
>>   drivers/usb/phy/Makefile                           |    1 -
>>   include/linux/{usb => phy}/omap_usb.h              |    3 -
>>   11 files changed, 264 insertions(+), 164 deletions(-)
>>   rename drivers/{usb/phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c} (54%)
>>   rename include/linux/{usb => phy}/omap_usb.h (95%)
>>
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 0/6] Make dwc3 use Generic PHY Framework
       [not found] ` <1393846695-14644-1-git-send-email-kishon-l0cyMroinI0@public.gmane.org>
@ 2014-03-03 16:40   ` Felipe Balbi
  2014-03-04 13:31     ` Kishon Vijay Abraham I
  0 siblings, 1 reply; 17+ messages in thread
From: Felipe Balbi @ 2014-03-03 16:40 UTC (permalink / raw)
  To: Kishon Vijay Abraham I
  Cc: bcousson-rdvid1DuHRBWk0Htik3J/w, balbi-l0cyMroinI0,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	linux-usb-u79uwXL29TY76Z2rM5mHXA, george.cherian-l0cyMroinI0,
	heikki.krogerus-VuQAYsv1563Yd54FQh9/CA, rogerq-l0cyMroinI0,
	rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, swarren-3lzwWm7+Weoh9ZMKESR00Q,
	ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg, rob-VoJi6FS/r0vR7s880joybQ,
	tony-4v6yS6AI5VpBDgjK7y7TUQ, linux-lFZ/pmaqli7XmaaqVzeoHQ,
	gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A,
	s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ, galak-sgV2jX0FEOL9JmXXK+q4OQ

[-- Attachment #1: Type: text/plain, Size: 2103 bytes --]

Hi,

On Mon, Mar 03, 2014 at 05:08:09PM +0530, Kishon Vijay Abraham I wrote:
> Added support for optional PHY in dwc3 as not all SoCs having PHYs for DWC3
> should be programmed. While this can be considered as a temporary fix,
> a long term solution would be to add 'nop' PHY for platforms that does
> not have programmable PHY.
> Adapted DWC3 and USB3 PHY to use Generic PHY framework. Also changed the
> name of USB3 PHY driver to PIPE3 PHY driver since the same driver has to
> be used for SATA and PCIE too.
> 
> Changes from v4: (sending the entire patch series again)
> * check the return values of phy_init and phy_power_on
> * print errors if power_on or power_off of PHY fails.
> 
> Changes from v3: (Sent only adapt dwc3 core to use Generic PHY Framework) 
> * avoided using quirks and rely on the return values of PHY APIs to find the
> presence of PHY.
> 
> Changes from v2:
> * added a couple of fixes. One is invoking phy_resume after phy_init and the
> other is power off phy in error patch
> * used quirks to identify if a particular platform does not have PHYs
> * removed using separate header for pipe3 driver and also removed all referencs
> to SATA and PCIe in pipe3 driver since it's not yet adapted for those drivers.
> 
> Changes from v1:
> * The logic in which the driver detects the presence of PHYs has changed.
> * patch ordering has changed
> * udelay is replaced with usleep_range
> * A patch to remove set_suspend callback which was deferred from Generic
> PHY Framework series has been included.
> 
> Kishon Vijay Abraham I (6):
>   usb: dwc3: core: support optional PHYs
>   usb: dwc3: adapt dwc3 core to use Generic PHY Framework
>   drivers: phy: usb3/pipe3: Adapt pipe3 driver to Generic PHY Framework
>   usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2
>   phy: omap-usb2: move omap_usb.h from linux/usb/ to linux/phy/
>   arm/dts: added dt properties to adapt to the new phy framwork

patches 1 and 2 are in my testing/next, I guess 3,4,5 and 6 have no
direct dependency on those, right ?

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 0/6] Make dwc3 use Generic PHY Framework
  2014-03-03 16:40   ` Felipe Balbi
@ 2014-03-04 13:31     ` Kishon Vijay Abraham I
  0 siblings, 0 replies; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-04 13:31 UTC (permalink / raw)
  To: balbi
  Cc: mark.rutland, heikki.krogerus, linux-doc, tony, s.nawrocki, linux,
	swarren, grant.likely, devicetree, george.cherian, bcousson,
	pawel.moll, ijc+devicetree, rob.herring, linux-omap,
	linux-arm-kernel, rogerq, gregkh, linux-usb, linux-kernel, rob,
	galak


On Monday 03 March 2014 10:10 PM, Felipe Balbi wrote:
> Hi,
>
> On Mon, Mar 03, 2014 at 05:08:09PM +0530, Kishon Vijay Abraham I wrote:
>> Added support for optional PHY in dwc3 as not all SoCs having PHYs for DWC3
>> should be programmed. While this can be considered as a temporary fix,
>> a long term solution would be to add 'nop' PHY for platforms that does
>> not have programmable PHY.
>> Adapted DWC3 and USB3 PHY to use Generic PHY framework. Also changed the
>> name of USB3 PHY driver to PIPE3 PHY driver since the same driver has to
>> be used for SATA and PCIE too.
>>
>> Changes from v4: (sending the entire patch series again)
>> * check the return values of phy_init and phy_power_on
>> * print errors if power_on or power_off of PHY fails.
>>
>> Changes from v3: (Sent only adapt dwc3 core to use Generic PHY Framework)
>> * avoided using quirks and rely on the return values of PHY APIs to find the
>> presence of PHY.
>>
>> Changes from v2:
>> * added a couple of fixes. One is invoking phy_resume after phy_init and the
>> other is power off phy in error patch
>> * used quirks to identify if a particular platform does not have PHYs
>> * removed using separate header for pipe3 driver and also removed all referencs
>> to SATA and PCIe in pipe3 driver since it's not yet adapted for those drivers.
>>
>> Changes from v1:
>> * The logic in which the driver detects the presence of PHYs has changed.
>> * patch ordering has changed
>> * udelay is replaced with usleep_range
>> * A patch to remove set_suspend callback which was deferred from Generic
>> PHY Framework series has been included.
>>
>> Kishon Vijay Abraham I (6):
>>    usb: dwc3: core: support optional PHYs
>>    usb: dwc3: adapt dwc3 core to use Generic PHY Framework
>>    drivers: phy: usb3/pipe3: Adapt pipe3 driver to Generic PHY Framework
>>    usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2
>>    phy: omap-usb2: move omap_usb.h from linux/usb/ to linux/phy/
>>    arm/dts: added dt properties to adapt to the new phy framwork
>
> patches 1 and 2 are in my testing/next, I guess 3,4,5 and 6 have no
> direct dependency on those, right ?

that's right. I'll take 3, 4 and 5th patch in my tree and ping Tony to 
take 6th patch.

-Kishon

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 6/6] arm/dts: added dt properties to adapt to the new phy framwork
  2014-03-03 11:38 ` [PATCH v5 6/6] arm/dts: added dt properties to adapt to the new phy framwork Kishon Vijay Abraham I
@ 2014-03-05 12:42   ` Kishon Vijay Abraham I
       [not found]     ` <53171BC9.8050808-l0cyMroinI0@public.gmane.org>
  0 siblings, 1 reply; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-05 12:42 UTC (permalink / raw)
  To: bcousson, linux-doc, linux-kernel, linux-omap, linux-arm-kernel,
	linux-usb, george.cherian, heikki.krogerus, rogerq, tony
  Cc: mark.rutland, devicetree, linux, s.nawrocki, pawel.moll, swarren,
	gregkh, ijc+devicetree, rob.herring, balbi, rob, galak,
	grant.likely

Tony/Benoit,

On Monday 03 March 2014 05:08 PM, Kishon Vijay Abraham I wrote:
> Added device tree bindings for dwc3, usb2 and usb3 PHYs. The documentation
> of these can be found at Documentation/devicetree/bindings/phy/phy-bindings.txt
> and Documentation/devicetree/bindings/phy/ti-phy.txt.

Can this patch be queued for 3.15 merge window?

Thanks
Kishon

>
> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
> ---
>   arch/arm/boot/dts/omap5.dtsi |    5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi
> index a72813a..1c68558 100644
> --- a/arch/arm/boot/dts/omap5.dtsi
> +++ b/arch/arm/boot/dts/omap5.dtsi
> @@ -732,7 +732,8 @@
>   				compatible = "snps,dwc3";
>   				reg = <0x4a030000 0x10000>;
>   				interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
> -				usb-phy = <&usb2_phy>, <&usb3_phy>;
> +				phys = <&usb2_phy>, <&usb3_phy>;
> +				phy-names = "usb2-phy", "usb3-phy";
>   				dr_mode = "peripheral";
>   				tx-fifo-resize;
>   			};
> @@ -749,6 +750,7 @@
>   				compatible = "ti,omap-usb2";
>   				reg = <0x4a084000 0x7c>;
>   				ctrl-module = <&omap_control_usb2phy>;
> +				#phy-cells = <0>;
>   			};
>
>   			usb3_phy: usb3phy@4a084400 {
> @@ -758,6 +760,7 @@
>   				      <0x4a084c00 0x40>;
>   				reg-names = "phy_rx", "phy_tx", "pll_ctrl";
>   				ctrl-module = <&omap_control_usb3phy>;
> +				#phy-cells = <0>;
>   			};
>   		};
>
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 2/6] usb: dwc3: adapt dwc3 core to use Generic PHY Framework
  2014-03-03 11:38 ` [PATCH v5 2/6] usb: dwc3: adapt dwc3 core to use Generic PHY Framework Kishon Vijay Abraham I
@ 2014-03-05 14:43   ` Roger Quadros
  2014-03-05 14:47     ` Kishon Vijay Abraham I
  0 siblings, 1 reply; 17+ messages in thread
From: Roger Quadros @ 2014-03-05 14:43 UTC (permalink / raw)
  To: Kishon Vijay Abraham I, bcousson, balbi, devicetree, linux-doc,
	linux-kernel, linux-omap, linux-arm-kernel, linux-usb,
	george.cherian, heikki.krogerus
  Cc: mark.rutland, linux, s.nawrocki, pawel.moll, ijc+devicetree, tony,
	gregkh, swarren, rob.herring, rob, galak, grant.likely

Hi Kishon,

On 03/03/2014 01:38 PM, Kishon Vijay Abraham I wrote:
> Adapted dwc3 core to use the Generic PHY Framework. So for init, exit,
> power_on and power_off the following APIs are used phy_init(), phy_exit(),
> phy_power_on() and phy_power_off().
> 
> However using the old USB phy library wont be removed till the PHYs of all
> other SoC's using dwc3 core is adapted to the Generic PHY Framework.
> 
> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
> ---
>  Documentation/devicetree/bindings/usb/dwc3.txt |    6 +-
>  drivers/usb/dwc3/core.c                        |   86 +++++++++++++++++++++---
>  drivers/usb/dwc3/core.h                        |    7 ++
>  3 files changed, 89 insertions(+), 10 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt
> index e807635..471366d 100644
> --- a/Documentation/devicetree/bindings/usb/dwc3.txt
> +++ b/Documentation/devicetree/bindings/usb/dwc3.txt
> @@ -6,11 +6,13 @@ Required properties:
>   - compatible: must be "snps,dwc3"
>   - reg : Address and length of the register set for the device
>   - interrupts: Interrupts used by the dwc3 controller.
> +
> +Optional properties:
>   - usb-phy : array of phandle for the PHY device.  The first element
>     in the array is expected to be a handle to the USB2/HS PHY and
>     the second element is expected to be a handle to the USB3/SS PHY
> -
> -Optional properties:
> + - phys: from the *Generic PHY* bindings
> + - phy-names: from the *Generic PHY* bindings
>   - tx-fifo-resize: determines if the FIFO *has* to be reallocated.
>  
>  This is usually a subnode to DWC3 glue to which it is connected.
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 225a4d6..497234a 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -61,9 +61,10 @@ void dwc3_set_mode(struct dwc3 *dwc, u32 mode)
>   * dwc3_core_soft_reset - Issues core soft reset and PHY reset
>   * @dwc: pointer to our context structure
>   */
> -static void dwc3_core_soft_reset(struct dwc3 *dwc)
> +static int dwc3_core_soft_reset(struct dwc3 *dwc)
>  {
>  	u32		reg;
> +	int		ret;
>  
>  	/* Before Resetting PHY, put Core in Reset */
>  	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
> @@ -82,6 +83,15 @@ static void dwc3_core_soft_reset(struct dwc3 *dwc)
>  
>  	usb_phy_init(dwc->usb2_phy);
>  	usb_phy_init(dwc->usb3_phy);
> +	ret = phy_init(dwc->usb2_generic_phy);

you need to check if dwc->usb?_generic_phy is not NULL before using any of the PHY APIs
throughout this patch.

> +	if (ret < 0)
> +		return ret;
> +
> +	ret = phy_init(dwc->usb3_generic_phy);
> +	if (ret < 0) {
> +		phy_exit(dwc->usb2_generic_phy);
> +		return ret;
> +	}
>  	mdelay(100);
>  
>  	/* Clear USB3 PHY reset */
> @@ -100,6 +110,8 @@ static void dwc3_core_soft_reset(struct dwc3 *dwc)
>  	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
>  	reg &= ~DWC3_GCTL_CORESOFTRESET;
>  	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
> +
> +	return 0;
>  }
>  

cheers,
-roger

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 2/6] usb: dwc3: adapt dwc3 core to use Generic PHY Framework
  2014-03-05 14:43   ` Roger Quadros
@ 2014-03-05 14:47     ` Kishon Vijay Abraham I
  2014-03-05 15:24       ` Roger Quadros
  0 siblings, 1 reply; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-05 14:47 UTC (permalink / raw)
  To: Roger Quadros, bcousson, balbi, devicetree, linux-doc,
	linux-kernel, linux-omap, linux-arm-kernel, linux-usb,
	george.cherian, heikki.krogerus
  Cc: mark.rutland, linux, s.nawrocki, pawel.moll, ijc+devicetree, tony,
	gregkh, swarren, rob.herring, rob, galak, grant.likely

Roger,

On Wednesday 05 March 2014 08:13 PM, Roger Quadros wrote:
> Hi Kishon,
>
> On 03/03/2014 01:38 PM, Kishon Vijay Abraham I wrote:
>> Adapted dwc3 core to use the Generic PHY Framework. So for init, exit,
>> power_on and power_off the following APIs are used phy_init(), phy_exit(),
>> phy_power_on() and phy_power_off().
>>
>> However using the old USB phy library wont be removed till the PHYs of all
>> other SoC's using dwc3 core is adapted to the Generic PHY Framework.
>>
>> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
>> ---
>>   Documentation/devicetree/bindings/usb/dwc3.txt |    6 +-
>>   drivers/usb/dwc3/core.c                        |   86 +++++++++++++++++++++---
>>   drivers/usb/dwc3/core.h                        |    7 ++
>>   3 files changed, 89 insertions(+), 10 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt
>> index e807635..471366d 100644
>> --- a/Documentation/devicetree/bindings/usb/dwc3.txt
>> +++ b/Documentation/devicetree/bindings/usb/dwc3.txt
>> @@ -6,11 +6,13 @@ Required properties:
>>    - compatible: must be "snps,dwc3"
>>    - reg : Address and length of the register set for the device
>>    - interrupts: Interrupts used by the dwc3 controller.
>> +
>> +Optional properties:
>>    - usb-phy : array of phandle for the PHY device.  The first element
>>      in the array is expected to be a handle to the USB2/HS PHY and
>>      the second element is expected to be a handle to the USB3/SS PHY
>> -
>> -Optional properties:
>> + - phys: from the *Generic PHY* bindings
>> + - phy-names: from the *Generic PHY* bindings
>>    - tx-fifo-resize: determines if the FIFO *has* to be reallocated.
>>
>>   This is usually a subnode to DWC3 glue to which it is connected.
>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
>> index 225a4d6..497234a 100644
>> --- a/drivers/usb/dwc3/core.c
>> +++ b/drivers/usb/dwc3/core.c
>> @@ -61,9 +61,10 @@ void dwc3_set_mode(struct dwc3 *dwc, u32 mode)
>>    * dwc3_core_soft_reset - Issues core soft reset and PHY reset
>>    * @dwc: pointer to our context structure
>>    */
>> -static void dwc3_core_soft_reset(struct dwc3 *dwc)
>> +static int dwc3_core_soft_reset(struct dwc3 *dwc)
>>   {
>>   	u32		reg;
>> +	int		ret;
>>
>>   	/* Before Resetting PHY, put Core in Reset */
>>   	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
>> @@ -82,6 +83,15 @@ static void dwc3_core_soft_reset(struct dwc3 *dwc)
>>
>>   	usb_phy_init(dwc->usb2_phy);
>>   	usb_phy_init(dwc->usb3_phy);
>> +	ret = phy_init(dwc->usb2_generic_phy);
>
> you need to check if dwc->usb?_generic_phy is not NULL before using any of the PHY APIs
> throughout this patch.

Recently a patch to allow NULL in phy APIs was added to support optional 
PHYs.

commit 04c2facad8fee66c981a51852806d8923336f362
Author: Andrew Lunn <andrew@lunn.ch>
Date:   Tue Feb 4 18:33:11 2014 +0100

     drivers: phy: Make NULL a valid phy reference

Thanks
Kishon

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 2/6] usb: dwc3: adapt dwc3 core to use Generic PHY Framework
  2014-03-05 14:47     ` Kishon Vijay Abraham I
@ 2014-03-05 15:24       ` Roger Quadros
  0 siblings, 0 replies; 17+ messages in thread
From: Roger Quadros @ 2014-03-05 15:24 UTC (permalink / raw)
  To: Kishon Vijay Abraham I, bcousson, balbi, devicetree, linux-doc,
	linux-kernel, linux-omap, linux-arm-kernel, linux-usb,
	george.cherian, heikki.krogerus
  Cc: rob.herring, pawel.moll, mark.rutland, swarren, ijc+devicetree,
	rob, tony, linux, gregkh, grant.likely, s.nawrocki, galak

On 03/05/2014 04:47 PM, Kishon Vijay Abraham I wrote:
> Roger,
> 
> On Wednesday 05 March 2014 08:13 PM, Roger Quadros wrote:
>> Hi Kishon,
>>
>> On 03/03/2014 01:38 PM, Kishon Vijay Abraham I wrote:
>>> Adapted dwc3 core to use the Generic PHY Framework. So for init, exit,
>>> power_on and power_off the following APIs are used phy_init(), phy_exit(),
>>> phy_power_on() and phy_power_off().
>>>
>>> However using the old USB phy library wont be removed till the PHYs of all
>>> other SoC's using dwc3 core is adapted to the Generic PHY Framework.
>>>
>>> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
>>> ---
>>>   Documentation/devicetree/bindings/usb/dwc3.txt |    6 +-
>>>   drivers/usb/dwc3/core.c                        |   86 +++++++++++++++++++++---
>>>   drivers/usb/dwc3/core.h                        |    7 ++
>>>   3 files changed, 89 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt
>>> index e807635..471366d 100644
>>> --- a/Documentation/devicetree/bindings/usb/dwc3.txt
>>> +++ b/Documentation/devicetree/bindings/usb/dwc3.txt
>>> @@ -6,11 +6,13 @@ Required properties:
>>>    - compatible: must be "snps,dwc3"
>>>    - reg : Address and length of the register set for the device
>>>    - interrupts: Interrupts used by the dwc3 controller.
>>> +
>>> +Optional properties:
>>>    - usb-phy : array of phandle for the PHY device.  The first element
>>>      in the array is expected to be a handle to the USB2/HS PHY and
>>>      the second element is expected to be a handle to the USB3/SS PHY
>>> -
>>> -Optional properties:
>>> + - phys: from the *Generic PHY* bindings
>>> + - phy-names: from the *Generic PHY* bindings
>>>    - tx-fifo-resize: determines if the FIFO *has* to be reallocated.
>>>
>>>   This is usually a subnode to DWC3 glue to which it is connected.
>>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
>>> index 225a4d6..497234a 100644
>>> --- a/drivers/usb/dwc3/core.c
>>> +++ b/drivers/usb/dwc3/core.c
>>> @@ -61,9 +61,10 @@ void dwc3_set_mode(struct dwc3 *dwc, u32 mode)
>>>    * dwc3_core_soft_reset - Issues core soft reset and PHY reset
>>>    * @dwc: pointer to our context structure
>>>    */
>>> -static void dwc3_core_soft_reset(struct dwc3 *dwc)
>>> +static int dwc3_core_soft_reset(struct dwc3 *dwc)
>>>   {
>>>       u32        reg;
>>> +    int        ret;
>>>
>>>       /* Before Resetting PHY, put Core in Reset */
>>>       reg = dwc3_readl(dwc->regs, DWC3_GCTL);
>>> @@ -82,6 +83,15 @@ static void dwc3_core_soft_reset(struct dwc3 *dwc)
>>>
>>>       usb_phy_init(dwc->usb2_phy);
>>>       usb_phy_init(dwc->usb3_phy);
>>> +    ret = phy_init(dwc->usb2_generic_phy);
>>
>> you need to check if dwc->usb?_generic_phy is not NULL before using any of the PHY APIs
>> throughout this patch.
> 
> Recently a patch to allow NULL in phy APIs was added to support optional PHYs.
> 
> commit 04c2facad8fee66c981a51852806d8923336f362
> Author: Andrew Lunn <andrew@lunn.ch>
> Date:   Tue Feb 4 18:33:11 2014 +0100
> 
>     drivers: phy: Make NULL a valid phy reference

Oh OK, then it is fine. Thanks for the clarification.

cheers,
-roger

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 6/6] arm/dts: added dt properties to adapt to the new phy framwork
       [not found]     ` <53171BC9.8050808-l0cyMroinI0@public.gmane.org>
@ 2014-03-05 19:40       ` Tony Lindgren
  0 siblings, 0 replies; 17+ messages in thread
From: Tony Lindgren @ 2014-03-05 19:40 UTC (permalink / raw)
  To: Kishon Vijay Abraham I
  Cc: bcousson-rdvid1DuHRBWk0Htik3J/w, linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	linux-usb-u79uwXL29TY76Z2rM5mHXA, george.cherian-l0cyMroinI0,
	heikki.krogerus-VuQAYsv1563Yd54FQh9/CA, rogerq-l0cyMroinI0,
	balbi-l0cyMroinI0, devicetree-u79uwXL29TY76Z2rM5mHXA,
	rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, swarren-3lzwWm7+Weoh9ZMKESR00Q,
	ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg, rob-VoJi6FS/r0vR7s880joybQ,
	linux-lFZ/pmaqli7XmaaqVzeoHQ,
	gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A,
	s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ, galak-sgV2jX0FEOL9JmXXK+q4OQ

* Kishon Vijay Abraham I <kishon-l0cyMroinI0@public.gmane.org> [140305 04:46]:
> Tony/Benoit,
> 
> On Monday 03 March 2014 05:08 PM, Kishon Vijay Abraham I wrote:
> >Added device tree bindings for dwc3, usb2 and usb3 PHYs. The documentation
> >of these can be found at Documentation/devicetree/bindings/phy/phy-bindings.txt
> >and Documentation/devicetree/bindings/phy/ti-phy.txt.
> 
> Can this patch be queued for 3.15 merge window?

Thanks applying this patch into omap-for-v3.15/dt.

Tony
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v5 3/6] drivers: phy: usb3/pipe3: Adapt pipe3 driver to Generic PHY Framework
  2014-03-03 11:38 ` [PATCH v5 3/6] drivers: phy: usb3/pipe3: Adapt pipe3 driver to " Kishon Vijay Abraham I
@ 2014-03-06  9:30   ` Kishon Vijay Abraham I
  0 siblings, 0 replies; 17+ messages in thread
From: Kishon Vijay Abraham I @ 2014-03-06  9:30 UTC (permalink / raw)
  To: bcousson, balbi, devicetree, linux-doc, linux-kernel, linux-omap,
	linux-arm-kernel, linux-usb, george.cherian, heikki.krogerus,
	rogerq
  Cc: mark.rutland, linux, s.nawrocki, pawel.moll, ijc+devicetree, tony,
	gregkh, swarren, rob.herring, rob, galak, grant.likely



On Monday 03 March 2014 05:08 PM, Kishon Vijay Abraham I wrote:
> Adapted omap-usb3 PHY driver to Generic PHY Framework and moved phy-omap-usb3
> driver in drivers/usb/phy to drivers/phy and also renamed the file to
> phy-ti-pipe3 since this same driver will be used for SATA PHY and
> PCIE PHY.

merged 3rd, 4th and 5th patch of this series to linux-phy next.

Thanks
Kishon

>
> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
> ---
>   drivers/phy/Kconfig                                |   11 +
>   drivers/phy/Makefile                               |    1 +
>   .../phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c}     |  240 ++++++++++++--------
>   drivers/usb/phy/Kconfig                            |   11 -
>   drivers/usb/phy/Makefile                           |    1 -
>   5 files changed, 158 insertions(+), 106 deletions(-)
>   rename drivers/{usb/phy/phy-omap-usb3.c => phy/phy-ti-pipe3.c} (54%)
>
> diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
> index c7a551c..e3ec7d1 100644
> --- a/drivers/phy/Kconfig
> +++ b/drivers/phy/Kconfig
> @@ -40,6 +40,17 @@ config OMAP_USB2
>   	  The USB OTG controller communicates with the comparator using this
>   	  driver.
>
> +config TI_PIPE3
> +	tristate "TI PIPE3 PHY Driver"
> +	depends on ARCH_OMAP2PLUS || COMPILE_TEST
> +	select GENERIC_PHY
> +	select OMAP_CONTROL_USB
> +	help
> +	  Enable this to support the PIPE3 PHY that is part of TI SOCs. This
> +	  driver takes care of all the PHY functionality apart from comparator.
> +	  This driver interacts with the "OMAP Control PHY Driver" to power
> +	  on/off the PHY.
> +
>   config TWL4030_USB
>   	tristate "TWL4030 USB Transceiver Driver"
>   	depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS
> diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
> index b57c253..32e3f94 100644
> --- a/drivers/phy/Makefile
> +++ b/drivers/phy/Makefile
> @@ -8,4 +8,5 @@ obj-$(CONFIG_PHY_EXYNOS_DP_VIDEO)	+= phy-exynos-dp-video.o
>   obj-$(CONFIG_PHY_EXYNOS_MIPI_VIDEO)	+= phy-exynos-mipi-video.o
>   obj-$(CONFIG_PHY_MVEBU_SATA)		+= phy-mvebu-sata.o
>   obj-$(CONFIG_OMAP_USB2)			+= phy-omap-usb2.o
> +obj-$(CONFIG_TI_PIPE3)			+= phy-ti-pipe3.o
>   obj-$(CONFIG_TWL4030_USB)		+= phy-twl4030-usb.o
> diff --git a/drivers/usb/phy/phy-omap-usb3.c b/drivers/phy/phy-ti-pipe3.c
> similarity index 54%
> rename from drivers/usb/phy/phy-omap-usb3.c
> rename to drivers/phy/phy-ti-pipe3.c
> index 0c6ba29..67b189d 100644
> --- a/drivers/usb/phy/phy-omap-usb3.c
> +++ b/drivers/phy/phy-ti-pipe3.c
> @@ -1,5 +1,5 @@
>   /*
> - * omap-usb3 - USB PHY, talking to dwc3 controller in OMAP.
> + * phy-ti-pipe3 - PIPE3 PHY driver.
>    *
>    * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
>    * This program is free software; you can redistribute it and/or modify
> @@ -19,10 +19,11 @@
>   #include <linux/module.h>
>   #include <linux/platform_device.h>
>   #include <linux/slab.h>
> -#include <linux/usb/omap_usb.h>
> +#include <linux/phy/phy.h>
>   #include <linux/of.h>
>   #include <linux/clk.h>
>   #include <linux/err.h>
> +#include <linux/io.h>
>   #include <linux/pm_runtime.h>
>   #include <linux/delay.h>
>   #include <linux/usb/omap_control_usb.h>
> @@ -52,17 +53,34 @@
>
>   /*
>    * This is an Empirical value that works, need to confirm the actual
> - * value required for the USB3PHY_PLL_CONFIGURATION2.PLL_IDLE status
> - * to be correctly reflected in the USB3PHY_PLL_STATUS register.
> + * value required for the PIPE3PHY_PLL_CONFIGURATION2.PLL_IDLE status
> + * to be correctly reflected in the PIPE3PHY_PLL_STATUS register.
>    */
>   # define PLL_IDLE_TIME  100;
>
> -struct usb_dpll_map {
> +struct pipe3_dpll_params {
> +	u16	m;
> +	u8	n;
> +	u8	freq:3;
> +	u8	sd;
> +	u32	mf;
> +};
> +
> +struct ti_pipe3 {
> +	void __iomem		*pll_ctrl_base;
> +	struct device		*dev;
> +	struct device		*control_dev;
> +	struct clk		*wkupclk;
> +	struct clk		*sys_clk;
> +	struct clk		*optclk;
> +};
> +
> +struct pipe3_dpll_map {
>   	unsigned long rate;
> -	struct usb_dpll_params params;
> +	struct pipe3_dpll_params params;
>   };
>
> -static struct usb_dpll_map dpll_map[] = {
> +static struct pipe3_dpll_map dpll_map[] = {
>   	{12000000, {1250, 5, 4, 20, 0} },	/* 12 MHz */
>   	{16800000, {3125, 20, 4, 20, 0} },	/* 16.8 MHz */
>   	{19200000, {1172, 8, 4, 20, 65537} },	/* 19.2 MHz */
> @@ -71,7 +89,18 @@ static struct usb_dpll_map dpll_map[] = {
>   	{38400000, {3125, 47, 4, 20, 92843} },	/* 38.4 MHz */
>   };
>
> -static struct usb_dpll_params *omap_usb3_get_dpll_params(unsigned long rate)
> +static inline u32 ti_pipe3_readl(void __iomem *addr, unsigned offset)
> +{
> +	return __raw_readl(addr + offset);
> +}
> +
> +static inline void ti_pipe3_writel(void __iomem *addr, unsigned offset,
> +	u32 data)
> +{
> +	__raw_writel(data, addr + offset);
> +}
> +
> +static struct pipe3_dpll_params *ti_pipe3_get_dpll_params(unsigned long rate)
>   {
>   	int i;
>
> @@ -83,110 +112,123 @@ static struct usb_dpll_params *omap_usb3_get_dpll_params(unsigned long rate)
>   	return NULL;
>   }
>
> -static int omap_usb3_suspend(struct usb_phy *x, int suspend)
> +static int ti_pipe3_power_off(struct phy *x)
> +{
> +	struct ti_pipe3 *phy = phy_get_drvdata(x);
> +	int val;
> +	int timeout = PLL_IDLE_TIME;
> +
> +	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
> +	val |= PLL_IDLE;
> +	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
> +
> +	do {
> +		val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS);
> +		if (val & PLL_TICOPWDN)
> +			break;
> +		udelay(5);
> +	} while (--timeout);
> +
> +	if (!timeout) {
> +		dev_err(phy->dev, "power off failed\n");
> +		return -EBUSY;
> +	}
> +
> +	omap_control_usb_phy_power(phy->control_dev, 0);
> +
> +	return 0;
> +}
> +
> +static int ti_pipe3_power_on(struct phy *x)
>   {
> -	struct omap_usb *phy = phy_to_omapusb(x);
> -	int	val;
> +	struct ti_pipe3 *phy = phy_get_drvdata(x);
> +	int val;
>   	int timeout = PLL_IDLE_TIME;
>
> -	if (suspend && !phy->is_suspended) {
> -		val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
> -		val |= PLL_IDLE;
> -		omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
> -
> -		do {
> -			val = omap_usb_readl(phy->pll_ctrl_base, PLL_STATUS);
> -			if (val & PLL_TICOPWDN)
> -				break;
> -			udelay(1);
> -		} while (--timeout);
> -
> -		omap_control_usb_phy_power(phy->control_dev, 0);
> -
> -		phy->is_suspended	= 1;
> -	} else if (!suspend && phy->is_suspended) {
> -		phy->is_suspended	= 0;
> -
> -		val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
> -		val &= ~PLL_IDLE;
> -		omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
> -
> -		do {
> -			val = omap_usb_readl(phy->pll_ctrl_base, PLL_STATUS);
> -			if (!(val & PLL_TICOPWDN))
> -				break;
> -			udelay(1);
> -		} while (--timeout);
> +	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
> +	val &= ~PLL_IDLE;
> +	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
> +
> +	do {
> +		val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS);
> +		if (!(val & PLL_TICOPWDN))
> +			break;
> +		udelay(5);
> +	} while (--timeout);
> +
> +	if (!timeout) {
> +		dev_err(phy->dev, "power on failed\n");
> +		return -EBUSY;
>   	}
>
>   	return 0;
>   }
>
> -static void omap_usb_dpll_relock(struct omap_usb *phy)
> +static void ti_pipe3_dpll_relock(struct ti_pipe3 *phy)
>   {
>   	u32		val;
>   	unsigned long	timeout;
>
> -	omap_usb_writel(phy->pll_ctrl_base, PLL_GO, SET_PLL_GO);
> +	ti_pipe3_writel(phy->pll_ctrl_base, PLL_GO, SET_PLL_GO);
>
>   	timeout = jiffies + msecs_to_jiffies(20);
>   	do {
> -		val = omap_usb_readl(phy->pll_ctrl_base, PLL_STATUS);
> +		val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS);
>   		if (val & PLL_LOCK)
>   			break;
>   	} while (!WARN_ON(time_after(jiffies, timeout)));
>   }
>
> -static int omap_usb_dpll_lock(struct omap_usb *phy)
> +static int ti_pipe3_dpll_lock(struct ti_pipe3 *phy)
>   {
>   	u32			val;
>   	unsigned long		rate;
> -	struct usb_dpll_params *dpll_params;
> +	struct pipe3_dpll_params *dpll_params;
>
>   	rate = clk_get_rate(phy->sys_clk);
> -	dpll_params = omap_usb3_get_dpll_params(rate);
> +	dpll_params = ti_pipe3_get_dpll_params(rate);
>   	if (!dpll_params) {
>   		dev_err(phy->dev,
>   			  "No DPLL configuration for %lu Hz SYS CLK\n", rate);
>   		return -EINVAL;
>   	}
>
> -	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1);
> +	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1);
>   	val &= ~PLL_REGN_MASK;
>   	val |= dpll_params->n << PLL_REGN_SHIFT;
> -	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val);
> +	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val);
>
> -	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
> +	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2);
>   	val &= ~PLL_SELFREQDCO_MASK;
>   	val |= dpll_params->freq << PLL_SELFREQDCO_SHIFT;
> -	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
> +	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val);
>
> -	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1);
> +	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1);
>   	val &= ~PLL_REGM_MASK;
>   	val |= dpll_params->m << PLL_REGM_SHIFT;
> -	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val);
> +	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val);
>
> -	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION4);
> +	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION4);
>   	val &= ~PLL_REGM_F_MASK;
>   	val |= dpll_params->mf << PLL_REGM_F_SHIFT;
> -	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION4, val);
> +	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION4, val);
>
> -	val = omap_usb_readl(phy->pll_ctrl_base, PLL_CONFIGURATION3);
> +	val = ti_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION3);
>   	val &= ~PLL_SD_MASK;
>   	val |= dpll_params->sd << PLL_SD_SHIFT;
> -	omap_usb_writel(phy->pll_ctrl_base, PLL_CONFIGURATION3, val);
> +	ti_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION3, val);
>
> -	omap_usb_dpll_relock(phy);
> +	ti_pipe3_dpll_relock(phy);
>
>   	return 0;
>   }
>
> -static int omap_usb3_init(struct usb_phy *x)
> +static int ti_pipe3_init(struct phy *x)
>   {
> -	struct omap_usb	*phy = phy_to_omapusb(x);
> +	struct ti_pipe3 *phy = phy_get_drvdata(x);
>   	int ret;
>
> -	ret = omap_usb_dpll_lock(phy);
> +	ret = ti_pipe3_dpll_lock(phy);
>   	if (ret)
>   		return ret;
>
> @@ -195,9 +237,18 @@ static int omap_usb3_init(struct usb_phy *x)
>   	return 0;
>   }
>
> -static int omap_usb3_probe(struct platform_device *pdev)
> +static struct phy_ops ops = {
> +	.init		= ti_pipe3_init,
> +	.power_on	= ti_pipe3_power_on,
> +	.power_off	= ti_pipe3_power_off,
> +	.owner		= THIS_MODULE,
> +};
> +
> +static int ti_pipe3_probe(struct platform_device *pdev)
>   {
> -	struct omap_usb *phy;
> +	struct ti_pipe3 *phy;
> +	struct phy *generic_phy;
> +	struct phy_provider *phy_provider;
>   	struct resource *res;
>   	struct device_node *node = pdev->dev.of_node;
>   	struct device_node *control_node;
> @@ -208,7 +259,7 @@ static int omap_usb3_probe(struct platform_device *pdev)
>
>   	phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL);
>   	if (!phy) {
> -		dev_err(&pdev->dev, "unable to alloc mem for OMAP USB3 PHY\n");
> +		dev_err(&pdev->dev, "unable to alloc mem for TI PIPE3 PHY\n");
>   		return -ENOMEM;
>   	}
>
> @@ -219,13 +270,6 @@ static int omap_usb3_probe(struct platform_device *pdev)
>
>   	phy->dev		= &pdev->dev;
>
> -	phy->phy.dev		= phy->dev;
> -	phy->phy.label		= "omap-usb3";
> -	phy->phy.init		= omap_usb3_init;
> -	phy->phy.set_suspend	= omap_usb3_suspend;
> -	phy->phy.type		= USB_PHY_TYPE_USB3;
> -
> -	phy->is_suspended	= 1;
>   	phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k");
>   	if (IS_ERR(phy->wkupclk)) {
>   		dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n");
> @@ -251,6 +295,7 @@ static int omap_usb3_probe(struct platform_device *pdev)
>   		dev_err(&pdev->dev, "Failed to get control device phandle\n");
>   		return -EINVAL;
>   	}
> +
>   	control_pdev = of_find_device_by_node(control_node);
>   	if (!control_pdev) {
>   		dev_err(&pdev->dev, "Failed to get control device\n");
> @@ -260,23 +305,31 @@ static int omap_usb3_probe(struct platform_device *pdev)
>   	phy->control_dev = &control_pdev->dev;
>
>   	omap_control_usb_phy_power(phy->control_dev, 0);
> -	usb_add_phy_dev(&phy->phy);
>
>   	platform_set_drvdata(pdev, phy);
> -
>   	pm_runtime_enable(phy->dev);
> +
> +	generic_phy = devm_phy_create(phy->dev, &ops, NULL);
> +	if (IS_ERR(generic_phy))
> +		return PTR_ERR(generic_phy);
> +
> +	phy_set_drvdata(generic_phy, phy);
> +	phy_provider = devm_of_phy_provider_register(phy->dev,
> +			of_phy_simple_xlate);
> +	if (IS_ERR(phy_provider))
> +		return PTR_ERR(phy_provider);
> +
>   	pm_runtime_get(&pdev->dev);
>
>   	return 0;
>   }
>
> -static int omap_usb3_remove(struct platform_device *pdev)
> +static int ti_pipe3_remove(struct platform_device *pdev)
>   {
> -	struct omap_usb *phy = platform_get_drvdata(pdev);
> +	struct ti_pipe3 *phy = platform_get_drvdata(pdev);
>
>   	clk_unprepare(phy->wkupclk);
>   	clk_unprepare(phy->optclk);
> -	usb_remove_phy(&phy->phy);
>   	if (!pm_runtime_suspended(&pdev->dev))
>   		pm_runtime_put(&pdev->dev);
>   	pm_runtime_disable(&pdev->dev);
> @@ -286,10 +339,9 @@ static int omap_usb3_remove(struct platform_device *pdev)
>
>   #ifdef CONFIG_PM_RUNTIME
>
> -static int omap_usb3_runtime_suspend(struct device *dev)
> +static int ti_pipe3_runtime_suspend(struct device *dev)
>   {
> -	struct platform_device	*pdev = to_platform_device(dev);
> -	struct omap_usb	*phy = platform_get_drvdata(pdev);
> +	struct ti_pipe3	*phy = dev_get_drvdata(dev);
>
>   	clk_disable(phy->wkupclk);
>   	clk_disable(phy->optclk);
> @@ -297,11 +349,10 @@ static int omap_usb3_runtime_suspend(struct device *dev)
>   	return 0;
>   }
>
> -static int omap_usb3_runtime_resume(struct device *dev)
> +static int ti_pipe3_runtime_resume(struct device *dev)
>   {
>   	u32 ret = 0;
> -	struct platform_device	*pdev = to_platform_device(dev);
> -	struct omap_usb	*phy = platform_get_drvdata(pdev);
> +	struct ti_pipe3	*phy = dev_get_drvdata(dev);
>
>   	ret = clk_enable(phy->optclk);
>   	if (ret) {
> @@ -324,38 +375,39 @@ err1:
>   	return ret;
>   }
>
> -static const struct dev_pm_ops omap_usb3_pm_ops = {
> -	SET_RUNTIME_PM_OPS(omap_usb3_runtime_suspend, omap_usb3_runtime_resume,
> -		NULL)
> +static const struct dev_pm_ops ti_pipe3_pm_ops = {
> +	SET_RUNTIME_PM_OPS(ti_pipe3_runtime_suspend,
> +		ti_pipe3_runtime_resume, NULL)
>   };
>
> -#define DEV_PM_OPS     (&omap_usb3_pm_ops)
> +#define DEV_PM_OPS     (&ti_pipe3_pm_ops)
>   #else
>   #define DEV_PM_OPS     NULL
>   #endif
>
>   #ifdef CONFIG_OF
> -static const struct of_device_id omap_usb3_id_table[] = {
> +static const struct of_device_id ti_pipe3_id_table[] = {
> +	{ .compatible = "ti,phy-usb3" },
>   	{ .compatible = "ti,omap-usb3" },
>   	{}
>   };
> -MODULE_DEVICE_TABLE(of, omap_usb3_id_table);
> +MODULE_DEVICE_TABLE(of, ti_pipe3_id_table);
>   #endif
>
> -static struct platform_driver omap_usb3_driver = {
> -	.probe		= omap_usb3_probe,
> -	.remove		= omap_usb3_remove,
> +static struct platform_driver ti_pipe3_driver = {
> +	.probe		= ti_pipe3_probe,
> +	.remove		= ti_pipe3_remove,
>   	.driver		= {
> -		.name	= "omap-usb3",
> +		.name	= "ti-pipe3",
>   		.owner	= THIS_MODULE,
>   		.pm	= DEV_PM_OPS,
> -		.of_match_table = of_match_ptr(omap_usb3_id_table),
> +		.of_match_table = of_match_ptr(ti_pipe3_id_table),
>   	},
>   };
>
> -module_platform_driver(omap_usb3_driver);
> +module_platform_driver(ti_pipe3_driver);
>
> -MODULE_ALIAS("platform: omap_usb3");
> +MODULE_ALIAS("platform: ti_pipe3");
>   MODULE_AUTHOR("Texas Instruments Inc.");
> -MODULE_DESCRIPTION("OMAP USB3 phy driver");
> +MODULE_DESCRIPTION("TI PIPE3 phy driver");
>   MODULE_LICENSE("GPL v2");
> diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
> index 7d1451d..c337ba2 100644
> --- a/drivers/usb/phy/Kconfig
> +++ b/drivers/usb/phy/Kconfig
> @@ -85,17 +85,6 @@ config OMAP_CONTROL_USB
>   	  power on the USB2 PHY is present in OMAP4 and OMAP5. OMAP5 has an
>   	  additional register to power on USB3 PHY.
>
> -config OMAP_USB3
> -	tristate "OMAP USB3 PHY Driver"
> -	depends on ARCH_OMAP2PLUS || COMPILE_TEST
> -	select OMAP_CONTROL_USB
> -	select USB_PHY
> -	help
> -	  Enable this to support the USB3 PHY that is part of SOC. This
> -	  driver takes care of all the PHY functionality apart from comparator.
> -	  This driver interacts with the "OMAP Control USB Driver" to power
> -	  on/off the PHY.
> -
>   config AM335X_CONTROL_USB
>   	tristate
>
> diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
> index be58ada..15f1878 100644
> --- a/drivers/usb/phy/Makefile
> +++ b/drivers/usb/phy/Makefile
> @@ -17,7 +17,6 @@ obj-$(CONFIG_OMAP_CONTROL_USB)		+= phy-omap-control.o
>   obj-$(CONFIG_AM335X_CONTROL_USB)	+= phy-am335x-control.o
>   obj-$(CONFIG_AM335X_PHY_USB)		+= phy-am335x.o
>   obj-$(CONFIG_OMAP_OTG)			+= phy-omap-otg.o
> -obj-$(CONFIG_OMAP_USB3)			+= phy-omap-usb3.o
>   obj-$(CONFIG_SAMSUNG_USBPHY)		+= phy-samsung-usb.o
>   obj-$(CONFIG_SAMSUNG_USB2PHY)		+= phy-samsung-usb2.o
>   obj-$(CONFIG_SAMSUNG_USB3PHY)		+= phy-samsung-usb3.o
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2014-03-06  9:30 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-03 11:38 [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Kishon Vijay Abraham I
2014-03-03 11:38 ` [PATCH v5 1/6] usb: dwc3: core: support optional PHYs Kishon Vijay Abraham I
2014-03-03 11:38 ` [PATCH v5 2/6] usb: dwc3: adapt dwc3 core to use Generic PHY Framework Kishon Vijay Abraham I
2014-03-05 14:43   ` Roger Quadros
2014-03-05 14:47     ` Kishon Vijay Abraham I
2014-03-05 15:24       ` Roger Quadros
2014-03-03 11:38 ` [PATCH v5 3/6] drivers: phy: usb3/pipe3: Adapt pipe3 driver to " Kishon Vijay Abraham I
2014-03-06  9:30   ` Kishon Vijay Abraham I
2014-03-03 11:38 ` [PATCH v5 4/6] usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2 Kishon Vijay Abraham I
2014-03-03 11:38 ` [PATCH v5 5/6] phy: omap-usb2: move omap_usb.h from linux/usb/ to linux/phy/ Kishon Vijay Abraham I
2014-03-03 11:38 ` [PATCH v5 6/6] arm/dts: added dt properties to adapt to the new phy framwork Kishon Vijay Abraham I
2014-03-05 12:42   ` Kishon Vijay Abraham I
     [not found]     ` <53171BC9.8050808-l0cyMroinI0@public.gmane.org>
2014-03-05 19:40       ` Tony Lindgren
2014-03-03 12:21 ` [PATCH v5 0/6] Make dwc3 use Generic PHY Framework Roger Quadros
2014-03-03 12:36   ` Kishon Vijay Abraham I
     [not found] ` <1393846695-14644-1-git-send-email-kishon-l0cyMroinI0@public.gmane.org>
2014-03-03 16:40   ` Felipe Balbi
2014-03-04 13:31     ` Kishon Vijay Abraham I

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).