diff options
author | Eric Miao <eric.miao@marvell.com> | 2008-09-27 15:49:57 +0800 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-10-07 19:12:57 +0100 |
commit | 097b53348f34a461d2b07081eae12d823cf3d729 (patch) | |
tree | 62f59bdfc0252346666158b6c236fc250850cb36 /drivers/usb | |
parent | 52358ba3a89012c54712c24074ceb4b1c669af52 (diff) | |
download | op-kernel-dev-097b53348f34a461d2b07081eae12d823cf3d729.zip op-kernel-dev-097b53348f34a461d2b07081eae12d823cf3d729.tar.gz |
[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.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 7f0f35c..2a7d5e0 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); |