From 097b53348f34a461d2b07081eae12d823cf3d729 Mon Sep 17 00:00:00 2001 From: Eric Miao Date: Sat, 27 Sep 2008 15:49:57 +0800 Subject: [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 Signed-off-by: Russell King --- drivers/usb/host/ohci-pxa27x.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'drivers/usb/host') diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 7f0f35c7818..2a7d5e0965d 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); -- cgit v1.2.3