From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peng Fan Date: Fri, 7 Nov 2014 19:03:30 +0800 Subject: [U-Boot] [PATCH v3 1/3] usb:ehci-mx6 add board_usb_phy_mode function In-Reply-To: <201411070925.14856.marex@denx.de> References: <1415322494-20415-1-git-send-email-Peng.Fan@freescale.com> <1415322494-20415-2-git-send-email-Peng.Fan@freescale.com> <201411070925.14856.marex@denx.de> Message-ID: <545CA702.6090301@freescale.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de ? 11/7/2014 4:25 PM, Marek Vasut ??: > On Friday, November 07, 2014 at 02:08:12 AM, Peng Fan wrote: >> 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 > > This patch has nothing to do with any board, so this part should not > be in the commit message. > >> 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 >> Signed-off-by: Ye Li >> --- >> >> 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); > > This should be called from ehci_hcd_init() right after usb_phy_enable(). > Afterall, the mode detection has nothing to do with the PHY enabling. > This back to what I did in patch v2. right after usb_phy_enable(), just paste that piece of code here: The weak function: +int __weak board_ehci_usb_mode(int index, enum usb_init_type *type) +{ + return 0; +} + type = usb_phy_enable(index, ehci) ? USB_INIT_DEVICE : USB_INIT_HOST; + board_usb_phy_mode(index, &type); + What need to do is to let board can modify the `type` like following: +int board_usb_phy_mode(int port, enum usb_init_type *type) +{ + if (port == 1) + /* port1 works in HOST Mode */ + *type = USB_INIT_HOST; + + return 0; +} + This is the way that I did in patch v2. If this is fine, I'll resent this patch set. > btw. an idea for a separate patch(set) -- the PHY registers should be > converted to struct-based access. > Yeah, struct based access PHY register should be done. After this board level usb support patch is finished. >> } >> >> /* Base address for this IP block is 0x02184800 */ Regards, Peng.