Patchwork [U-Boot,v9,2/5] usb: ehci: add weak-aliased function for PORTSC

login
register
mail settings
Submitter Kuo-Jung Su
Date May 15, 2013, 7:29 a.m.
Message ID <1368602964-20687-3-git-send-email-dantesu@gmail.com>
Download mbox | patch
Permalink /patch/243909/
State Awaiting Upstream
Delegated to: Marek Vasut
Headers show

Comments

Kuo-Jung Su - May 15, 2013, 7:29 a.m.
From: Kuo-Jung Su <dantesu@faraday-tech.com>

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 <dantesu@faraday-tech.com>
CC: Marek Vasut <marex@denx.de>
---
Changes for v9:
   - Drop the quick fix to 'port=-1' from ehci_get_portsc_register().

Changes for v8:
   - Nothing updates

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 |   17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

--
1.7.9.5

Patch

diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 6022049..cfb2097 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -603,6 +603,17 @@  fail:
 	return -1;
 }

+__weak uint32_t *ehci_get_portsc_register(struct ehci_hcor *hcor, int port)
+{
+	if (port < 0 || port >= CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS) {
+		/* Printing the message would cause a scan failure! */
+		debug("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)
@@ -629,11 +640,9 @@  ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
 	case USB_REQ_GET_STATUS | ((USB_RT_PORT | USB_DIR_IN) << 8):
 	case USB_REQ_SET_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8):
 	case USB_REQ_CLEAR_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8):
-		if (!port || 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];
 		break;
 	default:
 		status_reg = NULL;