From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kuo-Jung Su Date: Mon, 13 May 2013 16:28:11 +0800 Subject: [U-Boot] [PATCH v7 2/4] usb: ehci: add weak-aliased function for PORTSC In-Reply-To: <1368433693-18599-1-git-send-email-dantesu@gmail.com> References: <1368433693-18599-1-git-send-email-dantesu@gmail.com> Message-ID: <1368433693-18599-3-git-send-email-dantesu@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de From: Kuo-Jung Su There is at least one non-EHCI compliant controller (i.e. Faraday EHCI) not only leave RESERVED and CONFIGFLAG registers un-implemented but also has their address spaces removed. As an result, the PORTSC register of Faraday EHCI always starts from 0x30 instead of 0x44 in standard EHCI. So that we'll need a weak-aliased function for abstraction. Signed-off-by: Kuo-Jung Su CC: Marek Vasut --- Changes for v7: - Rebase to u-boot-bbd0f7e3ba66d288a2f146f1c7797801e04598ae - Drop TDI weak-aliased functions, since there is another similar patch had been committed and acceptted. - ehci_get_portsc_register(): make sure port is always >= 0 Changes for v6: - Simplify weak aliased function declaration - Drop redundant line feed Changes for v5: - Split up from Faraday EHCI patch Changes for v2 - v4: - See 'usb: ehci: add Faraday USB 2.0 EHCI support' drivers/usb/host/ehci-hcd.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index e0f3e4b..316de15 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -603,6 +603,23 @@ fail: return -1; } +__weak uint32_t *ehci_get_portsc_register(struct ehci_hcor *hcor, int port) +{ + /* + * The u-boot would somehow set port=-1 at usb start-up, + * so this quick fix is necessary. + */ + if (port < 0) + port = 0; + + if (port >= CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) { + printf("The request port(%u) is not configured\n", port); + return NULL; + } + + return (uint32_t *)&hcor->or_portsc[port]; +} + int ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, int length, struct devrequest *req) @@ -616,11 +633,9 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, int port = le16_to_cpu(req->index) & 0xff; struct ehci_ctrl *ctrl = dev->controller; - if (port > CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) { - printf("The request port(%d) is not configured\n", port - 1); + status_reg = ehci_get_portsc_register(ctrl->hcor, port - 1); + if (!status_reg) return -1; - } - status_reg = (uint32_t *)&ctrl->hcor->or_portsc[port - 1]; srclen = 0; debug("req=%u (%#x), type=%u (%#x), value=%u, index=%u\n", -- 1.7.9.5