[U-Boot] [PATCH v3 1/3] usb:ehci-mx6 add board_usb_phy_mode function

Peng Fan Peng.Fan at freescale.com
Fri Nov 7 02:08:12 CET 2014


Include a weak function board_usb_phy_mode.

usb_phy_enable decide whether the controller in device mode or in host mode by
'*phy_ctrl & USBPHY_CTRL_OTG_ID'.

There are two usb port on mx6sxsabresd and also mx6slevk.
1. OTG port
2. HOST port
There are connected to SOC USB controller OTG1 core and OTG2 core as following:
OTG1 core <----> board OTG port
OTG2 core <----> board HOST port

However to these two board, no ID pin for the board host port. If only use
'*phy_ctrl & USBPHY_CTRL_OTG_ID' to decide the work mode, the host port will
not work, because "type = usb_phy_enable(index, ehci) ? USB_INIT_DEVICE :
USB_INIT_HOST;" will always set 'type' with USB_INIT_DEVICE.

So introduce this weak function to let board level code can decide to work
in host or device mode, if board level code want to implement this function.

Signed-off-by: Peng Fan <Peng.Fan at freescale.com>
Signed-off-by: Ye Li <B37916 at freescale.com>
---

Changes v3:
 Take Marek's suggestions, replace 'return val & USBPHY_CTRL_OTG_ID' with
 this new function like 'return board_usb_phy_mode(index);'
 Here board_usb_phy_mode only has one parameter 'index' as board_ehci_power and
 board_echi_hcd_init do.
 "http://lists.denx.de/pipermail/u-boot/2014-November/194183.html" has detailed
 discussion.

Changes v2:
 Introduce a new weak function to let board have a choice to decide which mode
 to work at. 

 drivers/usb/host/ehci-mx6.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
index 9ec5a0a..e2a247e 100644
--- a/drivers/usb/host/ehci-mx6.c
+++ b/drivers/usb/host/ehci-mx6.c
@@ -113,6 +113,20 @@ static void usb_power_config(int index)
 		     pll_480_ctrl_set);
 }
 
+int __weak board_usb_phy_mode(int port)
+{
+	void __iomem *phy_reg;
+	void __iomem *phy_ctrl;
+	u32 val;
+
+	phy_reg = (void __iomem *)phy_bases[port];
+	phy_ctrl = (void __iomem *)(phy_reg + USBPHY_CTRL);
+
+	val = __raw_readl(phy_ctrl);
+
+	return val & USBPHY_CTRL_OTG_ID;
+}
+
 /* Return 0 : host node, <>0 : device mode */
 static int usb_phy_enable(int index, struct usb_ehci *ehci)
 {
@@ -160,7 +174,7 @@ static int usb_phy_enable(int index, struct usb_ehci *ehci)
 	val |= (USBPHY_CTRL_ENUTMILEVEL2 | USBPHY_CTRL_ENUTMILEVEL3);
 	__raw_writel(val, phy_ctrl);
 
-	return val & USBPHY_CTRL_OTG_ID;
+	return board_usb_phy_mode(index);
 }
 
 /* Base address for this IP block is 0x02184800 */
-- 
1.8.4.5



More information about the U-Boot mailing list