From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Fri, 7 Nov 2014 09:25:14 +0100 Subject: [U-Boot] [PATCH v3 1/3] usb:ehci-mx6 add board_usb_phy_mode function In-Reply-To: <1415322494-20415-2-git-send-email-Peng.Fan@freescale.com> References: <1415322494-20415-1-git-send-email-Peng.Fan@freescale.com> <1415322494-20415-2-git-send-email-Peng.Fan@freescale.com> Message-ID: <201411070925.14856.marex@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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. btw. an idea for a separate patch(set) -- the PHY registers should be converted to struct-based access. > } > > /* Base address for this IP block is 0x02184800 */