]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/host/ohci-pxa27x.c
[ARM] ohci-pxa27x: introduce flags to avoid direct access to OHCI registers
[linux-2.6-omap-h63xx.git] / drivers / usb / host / ohci-pxa27x.c
index 7f0f35c781858628a995dc85df361c6cae56b264..2a7d5e0965d739b990786c9fc847e2551637dbb7 100644 (file)
@@ -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);