summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorEric Miao <eric.miao@marvell.com>2008-09-27 15:49:57 +0800
committerRussell King <rmk+kernel@arm.linux.org.uk>2008-10-07 19:12:57 +0100
commit097b53348f34a461d2b07081eae12d823cf3d729 (patch)
tree62f59bdfc0252346666158b6c236fc250850cb36 /drivers/usb
parent52358ba3a89012c54712c24074ceb4b1c669af52 (diff)
[ARM] ohci-pxa27x: introduce flags to avoid direct access to OHCI registers
Direct access to USB host controller registers is considered to be not portable, and is usually a bad sign for poorly abstracted interface. Introduce .flags and .power_on_delay to "struct pxaohci_platform_data" so that most platforms don't bother to write their own .init/.exit() sequences. Signed-off-by: Eric Miao <eric.miao@marvell.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/host/ohci-pxa27x.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c
index 7f0f35c78185..2a7d5e0965d7 100644
--- a/drivers/usb/host/ohci-pxa27x.c
+++ b/drivers/usb/host/ohci-pxa27x.c
@@ -76,6 +76,41 @@ extern int usb_disabled(void);
/*-------------------------------------------------------------------------*/
+static inline void pxa27x_setup_hc(struct pxaohci_platform_data *inf)
+{
+ uint32_t uhchr = UHCHR;
+ uint32_t uhcrhda = UHCRHDA;
+
+ if (inf->flags & ENABLE_PORT1)
+ uhchr &= ~UHCHR_SSEP1;
+
+ if (inf->flags & ENABLE_PORT2)
+ uhchr &= ~UHCHR_SSEP2;
+
+ if (inf->flags & ENABLE_PORT3)
+ uhchr &= ~UHCHR_SSEP3;
+
+ if (inf->flags & POWER_CONTROL_LOW)
+ uhchr |= UHCHR_PCPL;
+
+ if (inf->flags & POWER_SENSE_LOW)
+ uhchr |= UHCHR_PSPL;
+
+ if (inf->flags & NO_OC_PROTECTION)
+ uhcrhda |= UHCRHDA_NOCP;
+
+ if (inf->flags & OC_MODE_PERPORT)
+ uhcrhda |= UHCRHDA_OCPM;
+
+ if (inf->power_on_delay) {
+ uhcrhda &= ~UHCRHDA_POTPGT(0xff);
+ uhcrhda |= UHCRHDA_POTPGT(inf->power_on_delay / 2);
+ }
+
+ UHCHR = uhchr;
+ UHCRHDA = uhcrhda;
+}
+
static int pxa27x_start_hc(struct device *dev)
{
int retval = 0;
@@ -93,6 +128,8 @@ static int pxa27x_start_hc(struct device *dev)
while (UHCHR & UHCHR_FSBIR)
cpu_relax();
+ pxa27x_setup_hc(inf);
+
if (inf->init)
retval = inf->init(dev);