All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK
@ 2020-02-18  8:34 Patrick Delaunay
  2020-02-18  8:34 ` [PATCH v4 1/5] dm: clk: add stub when CONFIG_CLK is desactivated Patrick Delaunay
                   ` (5 more replies)
  0 siblings, 6 replies; 14+ messages in thread
From: Patrick Delaunay @ 2020-02-18  8:34 UTC (permalink / raw)
  To: u-boot


In this serie I update the DWC2 host driver to use the device tree
information and the associated PHY and CLOCK drivers when they are
availables.

The V4 is rebased on latest master (v2020.04-rc2).
CI-Tavis build is OK:
    https://travis-ci.org/patrickdelaunay/u-boot/builds/651479714

NB: CI-Travis build was OK for all target after V3:
    https://travis-ci.org/patrickdelaunay/u-boot/builds/609496187
    As in V2, I cause the warnings for some boards:
    drivers/usb/host/built-in.o: In function `dwc2_usb_remove':
    drivers/usb/host/dwc2.c:1441: undefined reference to `clk_disable_bulk'

I test this serie on stm32mp157c-ev1 board, with PHY and CLK
support

The U-CLASS are provided by:
- PHY by USBPHYC driver = ./drivers/phy/phy-stm32-usbphyc.c
- CLOCK by RCC clock driver = drivers/clk/clk_stm32mp1.c
- RESET by RCC reset driver = drivers/reset/stm32-reset.c

And I activate the configuration
+CONFIG_USB_DWC2=y

PS: it is not the default configuration to avoid conflict with gadget
    driver

To solve a binding issue, I also deactivate the gadget support:
by default only one driver is bound to the usbotg_hs node with "snps,dwc2"
compatible, and today it is the device one (the first in the driver list).

I also need to deactivate hnp-srp support with:

&usbotg_hs {
	/* need to disable ONLY for HOST support */
	hnp-srp-disable;
};

WARNING: OTG with device or host support is not correctly handle by DWC2
         driver (see example for dynamic OTG role in DWC3 driver).

The tests executed on the stm32mp157c-ev1 target:

STM32MP> usb start
starting USB...
Bus usb-otg at 49000000: USB DWC2
Bus usbh-ehci at 5800d000: USB EHCI 1.00
scanning bus usb-otg at 49000000 for devices... 2 USB Device(s) found
scanning bus usbh-ehci at 5800d000 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 2 Storage Device(s) found
STM32MP> usb tree
USB device tree:
  1  Hub (480 Mb/s, 0mA)
  |   U-Boot Root Hub
  |
  +-2  Mass Storage (480 Mb/s, 300mA)
       Verbatim STORE N GO 070731C8ACD7EE97

  1  Hub (480 Mb/s, 0mA)
  |  u-boot EHCI Host Controller
  |
  +-2  Hub (480 Mb/s, 2mA)

STM32MP> ls usb 0
<DIR>       4096 .
<DIR>       4096 ..
<DIR>      16384 lost+found
<DIR>       4096 record
         1490212 xipImage
        21058006 vmlinux

STM32MP> load usb 0 0xC0000000 vmlinux
21058006 bytes read in 10851 ms (1.9 MiB/s)


Changes in v4:
- Add stub for all functions using 'struct clk' or 'struct clk_bulk'
  after remarks on v3

Changes in v3:
- Add stub for clk_disable_bulk

Changes in v2:
- update dev_err
- update commit message
- change dev_err to dev_dbg for PHY function call
- treat dwc2_shutdown_phy error
- add clk_disable_bulk in dwc2_usb_remove

Patrick Delaunay (5):
  dm: clk: add stub when CONFIG_CLK is desactivated
  usb: host: dwc2: add phy support
  usb: host: dwc2: add clk support
  usb: host: dwc2: force reset assert
  usb: host: dwc2: add trace to have clean usb start

 drivers/usb/host/dwc2.c | 100 ++++++++++++++++++++++++++++++++++++++-
 include/clk.h           | 101 ++++++++++++++++++++++++++++++++++------
 2 files changed, 187 insertions(+), 14 deletions(-)

-- 
2.17.1

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

* [PATCH v4 1/5] dm: clk: add stub when CONFIG_CLK is desactivated
  2020-02-18  8:34 [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Patrick Delaunay
@ 2020-02-18  8:34 ` Patrick Delaunay
  2020-03-04 19:48   ` Simon Goldschmidt
  2020-02-18  8:35 ` [PATCH v4 2/5] usb: host: dwc2: add phy support Patrick Delaunay
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Patrick Delaunay @ 2020-02-18  8:34 UTC (permalink / raw)
  To: u-boot

Add stub for functions clk_...() when CONFIG_CLK is desactivated.

This patch avoids compilation issues for driver using these API
without protection (#if CONFIG_IS_ENABLED(CLK))

For example, before this patch we have undefined reference to
`clk_disable_bulk') for code:
  clk_disable_bulk(&priv->clks);
  clk_release_bulk(&priv->clks);

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
---

Changes in v4:
- Add stub for all functions using 'struct clk' or 'struct clk_bulk'
  after remarks on v3

Changes in v3:
- Add stub for clk_disable_bulk

Changes in v2: None

 include/clk.h | 101 +++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 88 insertions(+), 13 deletions(-)

diff --git a/include/clk.h b/include/clk.h
index 3336301815..1fb415ddc8 100644
--- a/include/clk.h
+++ b/include/clk.h
@@ -312,6 +312,7 @@ static inline int clk_release_bulk(struct clk_bulk *bulk)
 	return clk_release_all(bulk->clks, bulk->count);
 }
 
+#if CONFIG_IS_ENABLED(CLK)
 /**
  * clk_request - Request a clock by provider-specific ID.
  *
@@ -433,19 +434,6 @@ int clk_disable_bulk(struct clk_bulk *bulk);
  */
 bool clk_is_match(const struct clk *p, const struct clk *q);
 
-int soc_clk_dump(void);
-
-/**
- * clk_valid() - check if clk is valid
- *
- * @clk:	the clock to check
- * @return true if valid, or false
- */
-static inline bool clk_valid(struct clk *clk)
-{
-	return clk && !!clk->dev;
-}
-
 /**
  * clk_get_by_id() - Get the clock by its ID
  *
@@ -465,6 +453,93 @@ int clk_get_by_id(ulong id, struct clk **clkp);
  * @return true on binded, or false on no
  */
 bool clk_dev_binded(struct clk *clk);
+
+#else /* CONFIG_IS_ENABLED(CLK) */
+
+static inline int clk_request(struct udevice *dev, struct clk *clk)
+{
+	return -ENOSYS;
+}
+
+static inline int clk_free(struct clk *clk)
+{
+	return -ENOSYS;
+}
+
+static inline ulong clk_get_rate(struct clk *clk)
+{
+	return -ENOSYS;
+}
+
+static inline struct clk *clk_get_parent(struct clk *clk)
+{
+	return (struct clk *)-ENOSYS;
+}
+
+static inline long long clk_get_parent_rate(struct clk *clk)
+{
+	return -ENOSYS;
+}
+
+static inline ulong clk_set_rate(struct clk *clk, ulong rate)
+{
+	return -ENOSYS;
+}
+
+static inline int clk_set_parent(struct clk *clk, struct clk *parent)
+{
+	return -ENOSYS;
+}
+
+static inline int clk_enable(struct clk *clk)
+{
+	return -ENOSYS;
+}
+
+static inline int clk_enable_bulk(struct clk_bulk *bulk)
+{
+	return bulk && bulk->count == 0 ? 0 : -ENOSYS;
+}
+
+static inline int clk_disable(struct clk *clk)
+{
+	return -ENOSYS;
+}
+
+static inline int clk_disable_bulk(struct clk_bulk *bulk)
+{
+	return bulk && bulk->count == 0 ? 0 : -ENOSYS;
+}
+
+static inline bool clk_is_match(const struct clk *p, const struct clk *q)
+{
+	return false;
+}
+
+static inline int clk_get_by_id(ulong id, struct clk **clkp)
+{
+	return -ENOSYS;
+}
+
+static inline bool clk_dev_binded(struct clk *clk)
+{
+	return false;
+}
+#endif /* CONFIG_IS_ENABLED(CLK) */
+
+/**
+ * clk_valid() - check if clk is valid
+ *
+ * @clk:	the clock to check
+ * @return true if valid, or false
+ */
+static inline bool clk_valid(struct clk *clk)
+{
+	return clk && !!clk->dev;
+}
+
+int soc_clk_dump(void);
+
 #endif
 
 #define clk_prepare_enable(clk) clk_enable(clk)
-- 
2.17.1

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

* [PATCH v4 2/5] usb: host: dwc2: add phy support
  2020-02-18  8:34 [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Patrick Delaunay
  2020-02-18  8:34 ` [PATCH v4 1/5] dm: clk: add stub when CONFIG_CLK is desactivated Patrick Delaunay
@ 2020-02-18  8:35 ` Patrick Delaunay
  2020-03-04 19:51   ` Simon Goldschmidt
  2020-02-18  8:35 ` [PATCH v4 3/5] usb: host: dwc2: add clk support Patrick Delaunay
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Patrick Delaunay @ 2020-02-18  8:35 UTC (permalink / raw)
  To: u-boot

Use generic phy to initialize the PHY associated to the
DWC2 device and available in the device tree.

This patch don't added dependency because when CONFIG_PHY
is not activated, the generic PHY function are stubbed.

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2:
- update dev_err
- update commit message
- change dev_err to dev_dbg for PHY function call
- treat dwc2_shutdown_phy error

 drivers/usb/host/dwc2.c | 66 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
index e4efaf1e59..5e7ffaddd9 100644
--- a/drivers/usb/host/dwc2.c
+++ b/drivers/usb/host/dwc2.c
@@ -8,6 +8,7 @@
 #include <cpu_func.h>
 #include <dm.h>
 #include <errno.h>
+#include <generic-phy.h>
 #include <usb.h>
 #include <malloc.h>
 #include <memalign.h>
@@ -37,6 +38,7 @@ struct dwc2_priv {
 #ifdef CONFIG_DM_REGULATOR
 	struct udevice *vbus_supply;
 #endif
+	struct phy phy;
 #else
 	uint8_t *aligned_buffer;
 	uint8_t *status_buffer;
@@ -1322,13 +1324,71 @@ static int dwc2_usb_ofdata_to_platdata(struct udevice *dev)
 	return 0;
 }
 
+static int dwc2_setup_phy(struct udevice *dev)
+{
+	struct dwc2_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	ret = generic_phy_get_by_index(dev, 0, &priv->phy);
+	if (ret) {
+		if (ret != -ENOENT) {
+			dev_err(dev, "Failed to get USB PHY: %d.\n", ret);
+			return ret;
+		}
+		return 0;
+	}
+
+	ret = generic_phy_init(&priv->phy);
+	if (ret) {
+		dev_dbg(dev, "Failed to init USB PHY: %d.\n", ret);
+		return ret;
+	}
+
+	ret = generic_phy_power_on(&priv->phy);
+	if (ret) {
+		dev_dbg(dev, "Failed to power on USB PHY: %d.\n", ret);
+		generic_phy_exit(&priv->phy);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int dwc2_shutdown_phy(struct udevice *dev)
+{
+	struct dwc2_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	if (!generic_phy_valid(&priv->phy))
+		return 0;
+
+	ret = generic_phy_power_off(&priv->phy);
+	if (ret) {
+		dev_dbg(dev, "Failed to power off USB PHY: %d.\n", ret);
+		return ret;
+	}
+
+	ret = generic_phy_exit(&priv->phy);
+	if (ret) {
+		dev_dbg(dev, "Failed to power off USB PHY: %d.\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
 static int dwc2_usb_probe(struct udevice *dev)
 {
 	struct dwc2_priv *priv = dev_get_priv(dev);
 	struct usb_bus_priv *bus_priv = dev_get_uclass_priv(dev);
+	int ret;
 
 	bus_priv->desc_before_addr = true;
 
+	ret = dwc2_setup_phy(dev);
+	if (ret)
+		return ret;
+
 	return dwc2_init_common(dev, priv);
 }
 
@@ -1341,6 +1401,12 @@ static int dwc2_usb_remove(struct udevice *dev)
 	if (ret)
 		return ret;
 
+	ret = dwc2_shutdown_phy(dev);
+	if (ret) {
+		dev_dbg(dev, "Failed to shutdown USB PHY: %d.\n", ret);
+		return ret;
+	}
+
 	dwc2_uninit_common(priv->regs);
 
 	reset_release_bulk(&priv->resets);
-- 
2.17.1

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

* [PATCH v4 3/5] usb: host: dwc2: add clk support
  2020-02-18  8:34 [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Patrick Delaunay
  2020-02-18  8:34 ` [PATCH v4 1/5] dm: clk: add stub when CONFIG_CLK is desactivated Patrick Delaunay
  2020-02-18  8:35 ` [PATCH v4 2/5] usb: host: dwc2: add phy support Patrick Delaunay
@ 2020-02-18  8:35 ` Patrick Delaunay
  2020-03-04 19:52   ` Simon Goldschmidt
  2020-02-18  8:35 ` [PATCH v4 4/5] usb: host: dwc2: force reset assert Patrick Delaunay
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Patrick Delaunay @ 2020-02-18  8:35 UTC (permalink / raw)
  To: u-boot

Add support for clock with driver model.

This patch don't added dependency because when CONFIG_CLK
is not activated the clk function are stubbed.

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/usb/host/dwc2.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
index 5e7ffaddd9..d56d0e61b5 100644
--- a/drivers/usb/host/dwc2.c
+++ b/drivers/usb/host/dwc2.c
@@ -5,14 +5,15 @@
  */
 
 #include <common.h>
+#include <clk.h>
 #include <cpu_func.h>
 #include <dm.h>
 #include <errno.h>
 #include <generic-phy.h>
-#include <usb.h>
 #include <malloc.h>
 #include <memalign.h>
 #include <phys2bus.h>
+#include <usb.h>
 #include <usbroothubdes.h>
 #include <wait_bit.h>
 #include <asm/io.h>
@@ -39,6 +40,7 @@ struct dwc2_priv {
 	struct udevice *vbus_supply;
 #endif
 	struct phy phy;
+	struct clk_bulk clks;
 #else
 	uint8_t *aligned_buffer;
 	uint8_t *status_buffer;
@@ -1377,6 +1379,26 @@ static int dwc2_shutdown_phy(struct udevice *dev)
 	return 0;
 }
 
+static int dwc2_clk_init(struct udevice *dev)
+{
+	struct dwc2_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	ret = clk_get_bulk(dev, &priv->clks);
+	if (ret == -ENOSYS || ret == -ENOENT)
+		return 0;
+	if (ret)
+		return ret;
+
+	ret = clk_enable_bulk(&priv->clks);
+	if (ret) {
+		clk_release_bulk(&priv->clks);
+		return ret;
+	}
+
+	return 0;
+}
+
 static int dwc2_usb_probe(struct udevice *dev)
 {
 	struct dwc2_priv *priv = dev_get_priv(dev);
@@ -1385,6 +1407,10 @@ static int dwc2_usb_probe(struct udevice *dev)
 
 	bus_priv->desc_before_addr = true;
 
+	ret = dwc2_clk_init(dev);
+	if (ret)
+		return ret;
+
 	ret = dwc2_setup_phy(dev);
 	if (ret)
 		return ret;
@@ -1410,6 +1436,8 @@ static int dwc2_usb_remove(struct udevice *dev)
 	dwc2_uninit_common(priv->regs);
 
 	reset_release_bulk(&priv->resets);
+	clk_disable_bulk(&priv->clks);
+	clk_release_bulk(&priv->clks);
 
 	return 0;
 }
-- 
2.17.1

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

* [PATCH v4 4/5] usb: host: dwc2: force reset assert
  2020-02-18  8:34 [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Patrick Delaunay
                   ` (2 preceding siblings ...)
  2020-02-18  8:35 ` [PATCH v4 3/5] usb: host: dwc2: add clk support Patrick Delaunay
@ 2020-02-18  8:35 ` Patrick Delaunay
  2020-02-18  8:35 ` [PATCH v4 5/5] usb: host: dwc2: add trace to have clean usb start Patrick Delaunay
  2020-02-18 17:44 ` [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Marek Vasut
  5 siblings, 0 replies; 14+ messages in thread
From: Patrick Delaunay @ 2020-02-18  8:35 UTC (permalink / raw)
  To: u-boot

Assert reset before deassert in dwc2_reset;
this patch solve issues when the DWC2 registers are already
initialized with value incompatible with host mode.

Force a hardware reset of the IP reset all the DWC2 registers at
default value, the host driver start with a clean state
(Core Soft reset doen in dwc_otg_core_reset is not enought
 to reset all register).

The error can occurs in U-Boot when DWC2 device gadget driver
force device mode (called by ums or dfu command, before to execute
the usb start command).

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2:
- add clk_disable_bulk in dwc2_usb_remove

 drivers/usb/host/dwc2.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
index d56d0e61b5..f53913cde4 100644
--- a/drivers/usb/host/dwc2.c
+++ b/drivers/usb/host/dwc2.c
@@ -1151,6 +1151,8 @@ static int dwc2_reset(struct udevice *dev)
 			return ret;
 	}
 
+	/* force reset to clear all IP register */
+	reset_assert_bulk(&priv->resets);
 	ret = reset_deassert_bulk(&priv->resets);
 	if (ret) {
 		reset_release_bulk(&priv->resets);
-- 
2.17.1

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

* [PATCH v4 5/5] usb: host: dwc2: add trace to have clean usb start
  2020-02-18  8:34 [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Patrick Delaunay
                   ` (3 preceding siblings ...)
  2020-02-18  8:35 ` [PATCH v4 4/5] usb: host: dwc2: force reset assert Patrick Delaunay
@ 2020-02-18  8:35 ` Patrick Delaunay
  2020-02-18 17:44 ` [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Marek Vasut
  5 siblings, 0 replies; 14+ messages in thread
From: Patrick Delaunay @ 2020-02-18  8:35 UTC (permalink / raw)
  To: u-boot

Solve issue for the display of "usb start" command on stm32mp1
because one carriage return is missing in DWC2 probe.

Before the patch:

STM32MP> usb start
starting USB...
Bus usb-otg at 49000000:    Bus usbh-ehci at 5800d000:   USB EHCI 1.00

after the patch:

STM32MP> usb start
starting USB...
Bus usb-otg at 49000000: USB DWC2
Bus usbh-ehci at 5800d000: USB EHCI 1.00

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/usb/host/dwc2.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
index f53913cde4..8cc395037d 100644
--- a/drivers/usb/host/dwc2.c
+++ b/drivers/usb/host/dwc2.c
@@ -1219,6 +1219,8 @@ static int dwc2_init_common(struct udevice *dev, struct dwc2_priv *priv)
 	if (readl(&regs->gintsts) & DWC2_GINTSTS_CURMODE_HOST)
 		mdelay(1000);
 
+	printf("USB DWC2\n");
+
 	return 0;
 }
 
-- 
2.17.1

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

* [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK
  2020-02-18  8:34 [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Patrick Delaunay
                   ` (4 preceding siblings ...)
  2020-02-18  8:35 ` [PATCH v4 5/5] usb: host: dwc2: add trace to have clean usb start Patrick Delaunay
@ 2020-02-18 17:44 ` Marek Vasut
  2020-02-19  7:27   ` Simon Goldschmidt
  5 siblings, 1 reply; 14+ messages in thread
From: Marek Vasut @ 2020-02-18 17:44 UTC (permalink / raw)
  To: u-boot

On 2/18/20 9:34 AM, Patrick Delaunay wrote:
> 
> In this serie I update the DWC2 host driver to use the device tree
> information and the associated PHY and CLOCK drivers when they are
> availables.
> 
> The V4 is rebased on latest master (v2020.04-rc2).
> CI-Tavis build is OK:
>     https://travis-ci.org/patrickdelaunay/u-boot/builds/651479714
> 
> NB: CI-Travis build was OK for all target after V3:
>     https://travis-ci.org/patrickdelaunay/u-boot/builds/609496187
>     As in V2, I cause the warnings for some boards:
>     drivers/usb/host/built-in.o: In function `dwc2_usb_remove':
>     drivers/usb/host/dwc2.c:1441: undefined reference to `clk_disable_bulk'
> 
> I test this serie on stm32mp157c-ev1 board, with PHY and CLK
> support
> 
> The U-CLASS are provided by:
> - PHY by USBPHYC driver = ./drivers/phy/phy-stm32-usbphyc.c
> - CLOCK by RCC clock driver = drivers/clk/clk_stm32mp1.c
> - RESET by RCC reset driver = drivers/reset/stm32-reset.c
> 
> And I activate the configuration
> +CONFIG_USB_DWC2=y

Simon, can you test this on SOCFPGA ?

[...]

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

* [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK
  2020-02-18 17:44 ` [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Marek Vasut
@ 2020-02-19  7:27   ` Simon Goldschmidt
  2020-03-04 19:58     ` Simon Goldschmidt
  0 siblings, 1 reply; 14+ messages in thread
From: Simon Goldschmidt @ 2020-02-19  7:27 UTC (permalink / raw)
  To: u-boot

On Tue, Feb 18, 2020 at 6:53 PM Marek Vasut <marex@denx.de> wrote:
>
> On 2/18/20 9:34 AM, Patrick Delaunay wrote:
> >
> > In this serie I update the DWC2 host driver to use the device tree
> > information and the associated PHY and CLOCK drivers when they are
> > availables.
> >
> > The V4 is rebased on latest master (v2020.04-rc2).
> > CI-Tavis build is OK:
> >     https://travis-ci.org/patrickdelaunay/u-boot/builds/651479714
> >
> > NB: CI-Travis build was OK for all target after V3:
> >     https://travis-ci.org/patrickdelaunay/u-boot/builds/609496187
> >     As in V2, I cause the warnings for some boards:
> >     drivers/usb/host/built-in.o: In function `dwc2_usb_remove':
> >     drivers/usb/host/dwc2.c:1441: undefined reference to `clk_disable_bulk'
> >
> > I test this serie on stm32mp157c-ev1 board, with PHY and CLK
> > support
> >
> > The U-CLASS are provided by:
> > - PHY by USBPHYC driver = ./drivers/phy/phy-stm32-usbphyc.c
> > - CLOCK by RCC clock driver = drivers/clk/clk_stm32mp1.c
> > - RESET by RCC reset driver = drivers/reset/stm32-reset.c
> >
> > And I activate the configuration
> > +CONFIG_USB_DWC2=y
>
> Simon, can you test this on SOCFPGA ?

I can test if it probes, but I don't have anything running on that USB port
the socfpga_socrates board has. Would that be enought to test?

Regards,
Simon

>
> [...]

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

* [PATCH v4 1/5] dm: clk: add stub when CONFIG_CLK is desactivated
  2020-02-18  8:34 ` [PATCH v4 1/5] dm: clk: add stub when CONFIG_CLK is desactivated Patrick Delaunay
@ 2020-03-04 19:48   ` Simon Goldschmidt
  2020-03-05 17:57     ` Patrick DELAUNAY
  0 siblings, 1 reply; 14+ messages in thread
From: Simon Goldschmidt @ 2020-03-04 19:48 UTC (permalink / raw)
  To: u-boot

Am 18.02.2020 um 09:34 schrieb Patrick Delaunay:
> Add stub for functions clk_...() when CONFIG_CLK is desactivated.
> 
> This patch avoids compilation issues for driver using these API
> without protection (#if CONFIG_IS_ENABLED(CLK))
> 
> For example, before this patch we have undefined reference to
> `clk_disable_bulk') for code:
>   clk_disable_bulk(&priv->clks);
>   clk_release_bulk(&priv->clks);
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
> ---
> 
> Changes in v4:
> - Add stub for all functions using 'struct clk' or 'struct clk_bulk'
>   after remarks on v3
> 
> Changes in v3:
> - Add stub for clk_disable_bulk
> 
> Changes in v2: None
> 
>  include/clk.h | 101 +++++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 88 insertions(+), 13 deletions(-)
> 
> diff --git a/include/clk.h b/include/clk.h
> index 3336301815..1fb415ddc8 100644
> --- a/include/clk.h
> +++ b/include/clk.h
> @@ -312,6 +312,7 @@ static inline int clk_release_bulk(struct clk_bulk *bulk)
>  	return clk_release_all(bulk->clks, bulk->count);
>  }
>  
> +#if CONFIG_IS_ENABLED(CLK)
>  /**
>   * clk_request - Request a clock by provider-specific ID.
>   *
> @@ -433,19 +434,6 @@ int clk_disable_bulk(struct clk_bulk *bulk);
>   */
>  bool clk_is_match(const struct clk *p, const struct clk *q);
>  
> -int soc_clk_dump(void);
> -
> -/**
> - * clk_valid() - check if clk is valid
> - *
> - * @clk:	the clock to check
> - * @return true if valid, or false
> - */
> -static inline bool clk_valid(struct clk *clk)
> -{
> -	return clk && !!clk->dev;
> -}
> -
>  /**
>   * clk_get_by_id() - Get the clock by its ID
>   *
> @@ -465,6 +453,93 @@ int clk_get_by_id(ulong id, struct clk **clkp);
>   * @return true on binded, or false on no
>   */
>  bool clk_dev_binded(struct clk *clk);
> +
> +#else /* CONFIG_IS_ENABLED(CLK) */
> +
> +static inline int clk_request(struct udevice *dev, struct clk *clk)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline int clk_free(struct clk *clk)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline ulong clk_get_rate(struct clk *clk)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline struct clk *clk_get_parent(struct clk *clk)
> +{
> +	return (struct clk *)-ENOSYS;

This should use ERR_PTR() to care for platforms defining
CONFIG_ERR_PTR_OFFSET.

> +}
> +
> +static inline long long clk_get_parent_rate(struct clk *clk)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline ulong clk_set_rate(struct clk *clk, ulong rate)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline int clk_set_parent(struct clk *clk, struct clk *parent)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline int clk_enable(struct clk *clk)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline int clk_enable_bulk(struct clk_bulk *bulk)
> +{
> +	return bulk && bulk->count == 0 ? 0 : -ENOSYS;

For this test to work, someone would need to set bulk->count to 0. This
is normally done by clk_get_bulk(), but you defined it to only return an
error.

I guess it works for you because all clk_bulk objects you use are from
the heap (which is currently zeroed out in U-Boot) or if they are on the
stack, you have if/else code that doesn't bring you here. Still it seems
wrong.

Regards,
Simon

> +}
> +
> +static inline int clk_disable(struct clk *clk)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline int clk_disable_bulk(struct clk_bulk *bulk)
> +{
> +	return bulk && bulk->count == 0 ? 0 : -ENOSYS;
> +}
> +
> +static inline bool clk_is_match(const struct clk *p, const struct clk *q)
> +{
> +	return false;
> +}
> +
> +static inline int clk_get_by_id(ulong id, struct clk **clkp)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline bool clk_dev_binded(struct clk *clk)
> +{
> +	return false;
> +}
> +#endif /* CONFIG_IS_ENABLED(CLK) */
> +
> +/**
> + * clk_valid() - check if clk is valid
> + *
> + * @clk:	the clock to check
> + * @return true if valid, or false
> + */
> +static inline bool clk_valid(struct clk *clk)
> +{
> +	return clk && !!clk->dev;
> +}
> +
> +int soc_clk_dump(void);
> +
>  #endif
>  
>  #define clk_prepare_enable(clk) clk_enable(clk)
> 

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

* [PATCH v4 2/5] usb: host: dwc2: add phy support
  2020-02-18  8:35 ` [PATCH v4 2/5] usb: host: dwc2: add phy support Patrick Delaunay
@ 2020-03-04 19:51   ` Simon Goldschmidt
  2020-03-05 18:24     ` Patrick DELAUNAY
  0 siblings, 1 reply; 14+ messages in thread
From: Simon Goldschmidt @ 2020-03-04 19:51 UTC (permalink / raw)
  To: u-boot

Am 18.02.2020 um 09:35 schrieb Patrick Delaunay:
> Use generic phy to initialize the PHY associated to the
> DWC2 device and available in the device tree.
> 
> This patch don't added dependency because when CONFIG_PHY
> is not activated, the generic PHY function are stubbed.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
> ---
> 
> Changes in v4: None
> Changes in v3: None
> Changes in v2:
> - update dev_err
> - update commit message
> - change dev_err to dev_dbg for PHY function call
> - treat dwc2_shutdown_phy error
> 
>  drivers/usb/host/dwc2.c | 66 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 66 insertions(+)
> 
> diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
> index e4efaf1e59..5e7ffaddd9 100644
> --- a/drivers/usb/host/dwc2.c
> +++ b/drivers/usb/host/dwc2.c
> @@ -8,6 +8,7 @@
>  #include <cpu_func.h>
>  #include <dm.h>
>  #include <errno.h>
> +#include <generic-phy.h>
>  #include <usb.h>
>  #include <malloc.h>
>  #include <memalign.h>
> @@ -37,6 +38,7 @@ struct dwc2_priv {
>  #ifdef CONFIG_DM_REGULATOR
>  	struct udevice *vbus_supply;
>  #endif
> +	struct phy phy;
>  #else
>  	uint8_t *aligned_buffer;
>  	uint8_t *status_buffer;
> @@ -1322,13 +1324,71 @@ static int dwc2_usb_ofdata_to_platdata(struct udevice *dev)
>  	return 0;
>  }
>  
> +static int dwc2_setup_phy(struct udevice *dev)
> +{
> +	struct dwc2_priv *priv = dev_get_priv(dev);
> +	int ret;
> +
> +	ret = generic_phy_get_by_index(dev, 0, &priv->phy);
> +	if (ret) {
> +		if (ret != -ENOENT) {

Could you invert this logic and add a comment like "no PHY" or something?

> +			dev_err(dev, "Failed to get USB PHY: %d.\n", ret);
> +			return ret;
> +		}
> +		return 0;
> +	}
> +
> +	ret = generic_phy_init(&priv->phy);
> +	if (ret) {
> +		dev_dbg(dev, "Failed to init USB PHY: %d.\n", ret);
> +		return ret;
> +	}
> +
> +	ret = generic_phy_power_on(&priv->phy);
> +	if (ret) {
> +		dev_dbg(dev, "Failed to power on USB PHY: %d.\n", ret);
> +		generic_phy_exit(&priv->phy);
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int dwc2_shutdown_phy(struct udevice *dev)
> +{
> +	struct dwc2_priv *priv = dev_get_priv(dev);
> +	int ret;
> +
> +	if (!generic_phy_valid(&priv->phy))

A comment saying that this is for platforms without a phy driver would
be nice.

Other than that:
Reviewed-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>

> +		return 0;
> +
> +	ret = generic_phy_power_off(&priv->phy);
> +	if (ret) {
> +		dev_dbg(dev, "Failed to power off USB PHY: %d.\n", ret);
> +		return ret;
> +	}
> +
> +	ret = generic_phy_exit(&priv->phy);
> +	if (ret) {
> +		dev_dbg(dev, "Failed to power off USB PHY: %d.\n", ret);
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
>  static int dwc2_usb_probe(struct udevice *dev)
>  {
>  	struct dwc2_priv *priv = dev_get_priv(dev);
>  	struct usb_bus_priv *bus_priv = dev_get_uclass_priv(dev);
> +	int ret;
>  
>  	bus_priv->desc_before_addr = true;
>  
> +	ret = dwc2_setup_phy(dev);
> +	if (ret)
> +		return ret;
> +
>  	return dwc2_init_common(dev, priv);
>  }
>  
> @@ -1341,6 +1401,12 @@ static int dwc2_usb_remove(struct udevice *dev)
>  	if (ret)
>  		return ret;
>  
> +	ret = dwc2_shutdown_phy(dev);
> +	if (ret) {
> +		dev_dbg(dev, "Failed to shutdown USB PHY: %d.\n", ret);
> +		return ret;
> +	}
> +
>  	dwc2_uninit_common(priv->regs);
>  
>  	reset_release_bulk(&priv->resets);
> 

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

* [PATCH v4 3/5] usb: host: dwc2: add clk support
  2020-02-18  8:35 ` [PATCH v4 3/5] usb: host: dwc2: add clk support Patrick Delaunay
@ 2020-03-04 19:52   ` Simon Goldschmidt
  0 siblings, 0 replies; 14+ messages in thread
From: Simon Goldschmidt @ 2020-03-04 19:52 UTC (permalink / raw)
  To: u-boot

Am 18.02.2020 um 09:35 schrieb Patrick Delaunay:
> Add support for clock with driver model.
> 
> This patch don't added dependency because when CONFIG_CLK
> is not activated the clk function are stubbed.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>

Reviewed-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>

> ---
> 
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
> 
>  drivers/usb/host/dwc2.c | 30 +++++++++++++++++++++++++++++-
>  1 file changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
> index 5e7ffaddd9..d56d0e61b5 100644
> --- a/drivers/usb/host/dwc2.c
> +++ b/drivers/usb/host/dwc2.c
> @@ -5,14 +5,15 @@
>   */
>  
>  #include <common.h>
> +#include <clk.h>
>  #include <cpu_func.h>
>  #include <dm.h>
>  #include <errno.h>
>  #include <generic-phy.h>
> -#include <usb.h>
>  #include <malloc.h>
>  #include <memalign.h>
>  #include <phys2bus.h>
> +#include <usb.h>
>  #include <usbroothubdes.h>
>  #include <wait_bit.h>
>  #include <asm/io.h>
> @@ -39,6 +40,7 @@ struct dwc2_priv {
>  	struct udevice *vbus_supply;
>  #endif
>  	struct phy phy;
> +	struct clk_bulk clks;
>  #else
>  	uint8_t *aligned_buffer;
>  	uint8_t *status_buffer;
> @@ -1377,6 +1379,26 @@ static int dwc2_shutdown_phy(struct udevice *dev)
>  	return 0;
>  }
>  
> +static int dwc2_clk_init(struct udevice *dev)
> +{
> +	struct dwc2_priv *priv = dev_get_priv(dev);
> +	int ret;
> +
> +	ret = clk_get_bulk(dev, &priv->clks);
> +	if (ret == -ENOSYS || ret == -ENOENT)
> +		return 0;
> +	if (ret)
> +		return ret;
> +
> +	ret = clk_enable_bulk(&priv->clks);
> +	if (ret) {
> +		clk_release_bulk(&priv->clks);
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
>  static int dwc2_usb_probe(struct udevice *dev)
>  {
>  	struct dwc2_priv *priv = dev_get_priv(dev);
> @@ -1385,6 +1407,10 @@ static int dwc2_usb_probe(struct udevice *dev)
>  
>  	bus_priv->desc_before_addr = true;
>  
> +	ret = dwc2_clk_init(dev);
> +	if (ret)
> +		return ret;
> +
>  	ret = dwc2_setup_phy(dev);
>  	if (ret)
>  		return ret;
> @@ -1410,6 +1436,8 @@ static int dwc2_usb_remove(struct udevice *dev)
>  	dwc2_uninit_common(priv->regs);
>  
>  	reset_release_bulk(&priv->resets);
> +	clk_disable_bulk(&priv->clks);
> +	clk_release_bulk(&priv->clks);
>  
>  	return 0;
>  }
> 

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

* [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK
  2020-02-19  7:27   ` Simon Goldschmidt
@ 2020-03-04 19:58     ` Simon Goldschmidt
  0 siblings, 0 replies; 14+ messages in thread
From: Simon Goldschmidt @ 2020-03-04 19:58 UTC (permalink / raw)
  To: u-boot

Am 19.02.2020 um 08:27 schrieb Simon Goldschmidt:
> On Tue, Feb 18, 2020 at 6:53 PM Marek Vasut <marex@denx.de> wrote:
>>
>> On 2/18/20 9:34 AM, Patrick Delaunay wrote:
>>>
>>> In this serie I update the DWC2 host driver to use the device tree
>>> information and the associated PHY and CLOCK drivers when they are
>>> availables.
>>>
>>> The V4 is rebased on latest master (v2020.04-rc2).
>>> CI-Tavis build is OK:
>>>     https://travis-ci.org/patrickdelaunay/u-boot/builds/651479714
>>>
>>> NB: CI-Travis build was OK for all target after V3:
>>>     https://travis-ci.org/patrickdelaunay/u-boot/builds/609496187
>>>     As in V2, I cause the warnings for some boards:
>>>     drivers/usb/host/built-in.o: In function `dwc2_usb_remove':
>>>     drivers/usb/host/dwc2.c:1441: undefined reference to `clk_disable_bulk'
>>>
>>> I test this serie on stm32mp157c-ev1 board, with PHY and CLK
>>> support
>>>
>>> The U-CLASS are provided by:
>>> - PHY by USBPHYC driver = ./drivers/phy/phy-stm32-usbphyc.c
>>> - CLOCK by RCC clock driver = drivers/clk/clk_stm32mp1.c
>>> - RESET by RCC reset driver = drivers/reset/stm32-reset.c
>>>
>>> And I activate the configuration
>>> +CONFIG_USB_DWC2=y
>>
>> Simon, can you test this on SOCFPGA ?
> 
> I can test if it probes, but I don't have anything running on that USB port
> the socfpga_socrates board has. Would that be enought to test?

Tested the whole series on socfpga_socrates by instantiating the driver.
Shows the same behaviour as before (I still have no OTG cable to test
attaching a storage device).

Regards,
Simon

> 
> Regards,
> Simon
> 
>>
>> [...]

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

* [PATCH v4 1/5] dm: clk: add stub when CONFIG_CLK is desactivated
  2020-03-04 19:48   ` Simon Goldschmidt
@ 2020-03-05 17:57     ` Patrick DELAUNAY
  0 siblings, 0 replies; 14+ messages in thread
From: Patrick DELAUNAY @ 2020-03-05 17:57 UTC (permalink / raw)
  To: u-boot

Hi Simon,

> From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
> Sent: mercredi 4 mars 2020 20:49
> 
> Am 18.02.2020 um 09:34 schrieb Patrick Delaunay:
> > Add stub for functions clk_...() when CONFIG_CLK is desactivated.
> >
> > This patch avoids compilation issues for driver using these API
> > without protection (#if CONFIG_IS_ENABLED(CLK))
> >
> > For example, before this patch we have undefined reference to
> > `clk_disable_bulk') for code:
> >   clk_disable_bulk(&priv->clks);
> >   clk_release_bulk(&priv->clks);
> >
> > Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
> > ---
> >
> > Changes in v4:
> > - Add stub for all functions using 'struct clk' or 'struct clk_bulk'
> >   after remarks on v3
> >
> > Changes in v3:
> > - Add stub for clk_disable_bulk
> >
> > Changes in v2: None
> >
> >  include/clk.h | 101
> > +++++++++++++++++++++++++++++++++++++++++++-------
> >  1 file changed, 88 insertions(+), 13 deletions(-)
> >
> > diff --git a/include/clk.h b/include/clk.h index
> > 3336301815..1fb415ddc8 100644
> > --- a/include/clk.h
> > +++ b/include/clk.h
> > @@ -312,6 +312,7 @@ static inline int clk_release_bulk(struct clk_bulk *bulk)
> >  	return clk_release_all(bulk->clks, bulk->count);  }
> >
> > +#if CONFIG_IS_ENABLED(CLK)
> >  /**
> >   * clk_request - Request a clock by provider-specific ID.
> >   *
> > @@ -433,19 +434,6 @@ int clk_disable_bulk(struct clk_bulk *bulk);
> >   */
> >  bool clk_is_match(const struct clk *p, const struct clk *q);
> >
> > -int soc_clk_dump(void);
> > -
> > -/**
> > - * clk_valid() - check if clk is valid
> > - *
> > - * @clk:	the clock to check
> > - * @return true if valid, or false
> > - */
> > -static inline bool clk_valid(struct clk *clk) -{
> > -	return clk && !!clk->dev;
> > -}
> > -
> >  /**
> >   * clk_get_by_id() - Get the clock by its ID
> >   *
> > @@ -465,6 +453,93 @@ int clk_get_by_id(ulong id, struct clk **clkp);
> >   * @return true on binded, or false on no
> >   */
> >  bool clk_dev_binded(struct clk *clk);
> > +
> > +#else /* CONFIG_IS_ENABLED(CLK) */
> > +
> > +static inline int clk_request(struct udevice *dev, struct clk *clk) {
> > +	return -ENOSYS;
> > +}
> > +
> > +static inline int clk_free(struct clk *clk) {
> > +	return -ENOSYS;
> > +}
> > +
> > +static inline ulong clk_get_rate(struct clk *clk) {
> > +	return -ENOSYS;
> > +}
> > +
> > +static inline struct clk *clk_get_parent(struct clk *clk) {
> > +	return (struct clk *)-ENOSYS;
> 
> This should use ERR_PTR() to care for platforms defining
> CONFIG_ERR_PTR_OFFSET.

Yes I take the point for V5.

> > +}
> > +
> > +static inline long long clk_get_parent_rate(struct clk *clk) {
> > +	return -ENOSYS;
> > +}
> > +
> > +static inline ulong clk_set_rate(struct clk *clk, ulong rate) {
> > +	return -ENOSYS;
> > +}
> > +
> > +static inline int clk_set_parent(struct clk *clk, struct clk *parent)
> > +{
> > +	return -ENOSYS;
> > +}
> > +
> > +static inline int clk_enable(struct clk *clk) {
> > +	return -ENOSYS;
> > +}
> > +
> > +static inline int clk_enable_bulk(struct clk_bulk *bulk) {
> > +	return bulk && bulk->count == 0 ? 0 : -ENOSYS;
> 
> For this test to work, someone would need to set bulk->count to 0. This is normally
> done by clk_get_bulk(), but you defined it to only return an error.
> 
> I guess it works for you because all clk_bulk objects you use are from the heap
> (which is currently zeroed out in U-Boot) or if they are on the stack, you have
> if/else code that doesn't bring you here. Still it seems wrong.

Yes exactly, it is working for me as the bulk was in private date, so zero allocated.

I will update on V5

> Regards,
> Simon

Thanks for the review

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

* [PATCH v4 2/5] usb: host: dwc2: add phy support
  2020-03-04 19:51   ` Simon Goldschmidt
@ 2020-03-05 18:24     ` Patrick DELAUNAY
  0 siblings, 0 replies; 14+ messages in thread
From: Patrick DELAUNAY @ 2020-03-05 18:24 UTC (permalink / raw)
  To: u-boot



> -----Original Message-----
> From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
> Sent: mercredi 4 mars 2020 20:52
> To: Patrick DELAUNAY <patrick.delaunay@st.com>; u-boot at lists.denx.de
> Cc: ley.foon.tan at intel.com; b.galvani at gmail.com; Daniel Schwierzeck
> <daniel.schwierzeck@gmail.com>; Marek Vasut <marex@denx.de>; Michal
> Suchanek <msuchanek@suse.de>; Simon Glass <sjg@chromium.org>; U-Boot
> STM32 <uboot-stm32@st-md-mailman.stormreply.com>
> Subject: Re: [PATCH v4 2/5] usb: host: dwc2: add phy support
> Importance: High
> 
> Am 18.02.2020 um 09:35 schrieb Patrick Delaunay:
> > Use generic phy to initialize the PHY associated to the
> > DWC2 device and available in the device tree.
> >
> > This patch don't added dependency because when CONFIG_PHY is not
> > activated, the generic PHY function are stubbed.
> >
> > Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
> > ---
> >
> > Changes in v4: None
> > Changes in v3: None
> > Changes in v2:
> > - update dev_err
> > - update commit message
> > - change dev_err to dev_dbg for PHY function call
> > - treat dwc2_shutdown_phy error
> >
> >  drivers/usb/host/dwc2.c | 66
> > +++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 66 insertions(+)
> >
> > diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c index
> > e4efaf1e59..5e7ffaddd9 100644
> > --- a/drivers/usb/host/dwc2.c
> > +++ b/drivers/usb/host/dwc2.c
> > @@ -8,6 +8,7 @@
> >  #include <cpu_func.h>
> >  #include <dm.h>
> >  #include <errno.h>
> > +#include <generic-phy.h>
> >  #include <usb.h>
> >  #include <malloc.h>
> >  #include <memalign.h>
> > @@ -37,6 +38,7 @@ struct dwc2_priv {
> >  #ifdef CONFIG_DM_REGULATOR
> >  	struct udevice *vbus_supply;
> >  #endif
> > +	struct phy phy;
> >  #else
> >  	uint8_t *aligned_buffer;
> >  	uint8_t *status_buffer;
> > @@ -1322,13 +1324,71 @@ static int dwc2_usb_ofdata_to_platdata(struct
> udevice *dev)
> >  	return 0;
> >  }
> >
> > +static int dwc2_setup_phy(struct udevice *dev) {
> > +	struct dwc2_priv *priv = dev_get_priv(dev);
> > +	int ret;
> > +
> > +	ret = generic_phy_get_by_index(dev, 0, &priv->phy);
> > +	if (ret) {
> > +		if (ret != -ENOENT) {
> 
> Could you invert this logic and add a comment like "no PHY" or something?

Yes in V5, it is more clear

	ret = generic_phy_get_by_index(dev, 0, &priv->phy);
	if (ret) {
		if (ret == -ENOENT)
			return 0; /* no PHY, nothing to do */
		dev_err(dev, "Failed to get USB PHY: %d.\n", ret);
		return ret;
	}

> > +			dev_err(dev, "Failed to get USB PHY: %d.\n", ret);
> > +			return ret;
> > +		}
> > +		return 0;
> > +	}
> > +
> > +	ret = generic_phy_init(&priv->phy);
> > +	if (ret) {
> > +		dev_dbg(dev, "Failed to init USB PHY: %d.\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	ret = generic_phy_power_on(&priv->phy);
> > +	if (ret) {
> > +		dev_dbg(dev, "Failed to power on USB PHY: %d.\n", ret);
> > +		generic_phy_exit(&priv->phy);
> > +		return ret;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int dwc2_shutdown_phy(struct udevice *dev) {
> > +	struct dwc2_priv *priv = dev_get_priv(dev);
> > +	int ret;
> > +
> > +	if (!generic_phy_valid(&priv->phy))
> 
> A comment saying that this is for platforms without a phy driver would be nice.

Yes in V5:

static int dwc2_shutdown_phy(struct udevice *dev)
{
	struct dwc2_priv *priv = dev_get_priv(dev);
	int ret;

	/* PHY is not valid when generic_phy_get_by_index() = -ENOENT */
	if (!generic_phy_valid(&priv->phy))
		return 0; /* no PHY, nothing to do */


> Other than that:
> Reviewed-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>

Thanks 
Regards

Patrick

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

end of thread, other threads:[~2020-03-05 18:24 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-18  8:34 [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Patrick Delaunay
2020-02-18  8:34 ` [PATCH v4 1/5] dm: clk: add stub when CONFIG_CLK is desactivated Patrick Delaunay
2020-03-04 19:48   ` Simon Goldschmidt
2020-03-05 17:57     ` Patrick DELAUNAY
2020-02-18  8:35 ` [PATCH v4 2/5] usb: host: dwc2: add phy support Patrick Delaunay
2020-03-04 19:51   ` Simon Goldschmidt
2020-03-05 18:24     ` Patrick DELAUNAY
2020-02-18  8:35 ` [PATCH v4 3/5] usb: host: dwc2: add clk support Patrick Delaunay
2020-03-04 19:52   ` Simon Goldschmidt
2020-02-18  8:35 ` [PATCH v4 4/5] usb: host: dwc2: force reset assert Patrick Delaunay
2020-02-18  8:35 ` [PATCH v4 5/5] usb: host: dwc2: add trace to have clean usb start Patrick Delaunay
2020-02-18 17:44 ` [PATCH v4 0/5] usb: host: dwc2: use driver model for PHY and CLOCK Marek Vasut
2020-02-19  7:27   ` Simon Goldschmidt
2020-03-04 19:58     ` Simon Goldschmidt

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.