diff mbox series

[v3,13/19] usb: ohci-at91: Add USB PHY functionality

Message ID 20221212133949.226246-14-sergiu.moga@microchip.com
State Superseded
Delegated to: Eugen Hristev
Headers show
Series Add USB on SAM9X60, SAMA7G5 and SAMA5D2 boards | expand

Commit Message

Sergiu Moga Dec. 12, 2022, 1:39 p.m. UTC
Add the ability to enable/disable whatever USB PHY's are
passed to the AT91 OHCI driver through DT.

Signed-off-by: Sergiu Moga <sergiu.moga@microchip.com>
Tested-by: Mihai Sain <mihai.sain@microchip.com>
---



v1 -> v3:
- No change



 drivers/usb/host/ohci-at91.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)
diff mbox series

Patch

diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
index 8a10a29564..4b1aff4127 100644
--- a/drivers/usb/host/ohci-at91.c
+++ b/drivers/usb/host/ohci-at91.c
@@ -74,6 +74,10 @@  int usb_cpu_init_fail(void)
 #include <usb.h>
 #include "ohci.h"
 
+#if CONFIG_IS_ENABLED(PHY_MICROCHIP_SAMA7_USB)
+#include <generic-phy.h>
+#endif
+
 #define AT91_MAX_USBH_PORTS        3
 
 #define at91_for_each_port(index)	\
@@ -90,6 +94,10 @@  struct ohci_at91_priv {
 	struct clk *fclk;
 	struct clk *hclk;
 	bool clocked;
+
+#if CONFIG_IS_ENABLED(PHY_MICROCHIP_SAMA7_USB)
+	struct phy phy[AT91_MAX_USBH_PORTS];
+#endif
 };
 
 static void at91_start_clock(struct ohci_at91_priv *ohci_at91)
@@ -97,6 +105,13 @@  static void at91_start_clock(struct ohci_at91_priv *ohci_at91)
 	if (ohci_at91->clocked)
 		return;
 
+#if CONFIG_IS_ENABLED(PHY_MICROCHIP_SAMA7_USB)
+	int i;
+
+	at91_for_each_port(i)
+		generic_phy_power_on(&ohci_at91->phy[i]);
+#endif
+
 	clk_set_rate(ohci_at91->fclk, 48000000);
 	clk_prepare_enable(ohci_at91->hclk);
 	clk_prepare_enable(ohci_at91->iclk);
@@ -109,6 +124,13 @@  static void at91_stop_clock(struct ohci_at91_priv *ohci_at91)
 	if (!ohci_at91->clocked)
 		return;
 
+#if CONFIG_IS_ENABLED(PHY_MICROCHIP_SAMA7_USB)
+	int i;
+
+	at91_for_each_port(i)
+		generic_phy_power_off(&ohci_at91->phy[i]);
+#endif
+
 	clk_disable_unprepare(ohci_at91->fclk);
 	clk_disable_unprepare(ohci_at91->iclk);
 	clk_disable_unprepare(ohci_at91->hclk);
@@ -214,6 +236,14 @@  static int ohci_atmel_probe(struct udevice *dev)
 		goto fail;
 	}
 
+#if CONFIG_IS_ENABLED(PHY_MICROCHIP_SAMA7_USB)
+	at91_for_each_port(i) {
+		generic_phy_get_by_index(dev, i, &ohci_at91->phy[i]);
+		generic_phy_init(&ohci_at91->phy[i]);
+		generic_phy_configure(&ohci_at91->phy[i], NULL);
+	}
+#endif
+
 	at91_start_hc(dev);
 
 	return ohci_register(dev, regs);
@@ -228,6 +258,7 @@  fail:
 
 static const struct udevice_id ohci_usb_ids[] = {
 	{ .compatible = "atmel,at91rm9200-ohci", },
+	{ .compatible = "microchip,sama7g5-ohci", },
 	{ }
 };