]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/host/pci-quirks.c
Merge commit 'v2.6.27-rc8' into genirq
[linux-2.6-omap-h63xx.git] / drivers / usb / host / pci-quirks.c
index 20861650905e63606955056b5169581a0b92463c..ae6e70edd745769700e8dc9d7d20057ce371817c 100644 (file)
@@ -44,6 +44,7 @@
 #define EHCI_USBSTS            4               /* status register */
 #define EHCI_USBSTS_HALTED     (1 << 12)       /* HCHalted bit */
 #define EHCI_USBINTR           8               /* interrupt register */
+#define EHCI_CONFIGFLAG                0x40            /* configured flag register */
 #define EHCI_USBLEGSUP         0               /* legacy support register */
 #define EHCI_USBLEGSUP_BIOS    (1 << 16)       /* BIOS semaphore */
 #define EHCI_USBLEGSUP_OS      (1 << 24)       /* OS semaphore */
@@ -105,7 +106,7 @@ int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base)
        pci_read_config_word(pdev, UHCI_USBLEGSUP, &legsup);
        if (legsup & ~(UHCI_USBLEGSUP_RO | UHCI_USBLEGSUP_RWC)) {
                dev_dbg(&pdev->dev, "%s: legsup = 0x%04x\n",
-                               __FUNCTION__, legsup);
+                               __func__, legsup);
                goto reset_needed;
        }
 
@@ -113,14 +114,14 @@ int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base)
        if ((cmd & UHCI_USBCMD_RUN) || !(cmd & UHCI_USBCMD_CONFIGURE) ||
                        !(cmd & UHCI_USBCMD_EGSM)) {
                dev_dbg(&pdev->dev, "%s: cmd = 0x%04x\n",
-                               __FUNCTION__, cmd);
+                               __func__, cmd);
                goto reset_needed;
        }
 
        intr = inw(base + UHCI_USBINTR);
        if (intr & (~UHCI_USBINTR_RESUME)) {
                dev_dbg(&pdev->dev, "%s: intr = 0x%04x\n",
-                               __FUNCTION__, intr);
+                               __func__, intr);
                goto reset_needed;
        }
        return 0;
@@ -189,9 +190,8 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev)
                        msleep(10);
                }
                if (wait_time <= 0)
-                       printk(KERN_WARNING "%s %s: BIOS handoff "
-                                       "failed (BIOS bug ?) %08x\n",
-                                       pdev->dev.bus_id, "OHCI",
+                       dev_warn(&pdev->dev, "OHCI: BIOS handoff failed"
+                                       " (BIOS bug?) %08x\n",
                                        readl(base + OHCI_CONTROL));
 
                /* reset controller, preserving RWC */
@@ -216,6 +216,7 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev)
        u32     hcc_params, val;
        u8      offset, cap_length;
        int     count = 256/4;
+       int     tried_handoff = 0;
 
        if (!mmio_resource_enabled(pdev, 0))
                return;
@@ -241,8 +242,7 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev)
                switch (cap & 0xff) {
                case 1:                 /* BIOS/SMM/... handoff support */
                        if ((cap & EHCI_USBLEGSUP_BIOS)) {
-                               pr_debug("%s %s: BIOS handoff\n",
-                                               pdev->dev.bus_id, "EHCI");
+                               dev_dbg(&pdev->dev, "EHCI: BIOS handoff\n");
 
 #if 0
 /* aleksey_gorelov@phoenix.com reports that some systems need SMI forced on,
@@ -273,6 +273,7 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev)
                         */
                        msec = 5000;
                        while ((cap & EHCI_USBLEGSUP_BIOS) && (msec > 0)) {
+                               tried_handoff = 1;
                                msleep(10);
                                msec -= 10;
                                pci_read_config_dword(pdev, offset, &cap);
@@ -282,9 +283,8 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev)
                                /* well, possibly buggy BIOS... try to shut
                                 * it down, and hope nothing goes too wrong
                                 */
-                               printk(KERN_WARNING "%s %s: BIOS handoff "
-                                               "failed (BIOS bug ?) %08x\n",
-                                       pdev->dev.bus_id, "EHCI", cap);
+                               dev_warn(&pdev->dev, "EHCI: BIOS handoff failed"
+                                               " (BIOS bug?) %08x\n", cap);
                                pci_write_config_byte(pdev, offset + 2, 0);
                        }
 
@@ -292,22 +292,25 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev)
                        pci_write_config_dword(pdev,
                                        offset + EHCI_USBLEGCTLSTS,
                                        0);
+
+                       /* If the BIOS ever owned the controller then we
+                        * can't expect any power sessions to remain intact.
+                        */
+                       if (tried_handoff)
+                               writel(0, op_reg_base + EHCI_CONFIGFLAG);
                        break;
                case 0:                 /* illegal reserved capability */
                        cap = 0;
                        /* FALLTHROUGH */
                default:
-                       printk(KERN_WARNING "%s %s: unrecognized "
-                                       "capability %02x\n",
-                                       pdev->dev.bus_id, "EHCI",
-                                       cap & 0xff);
+                       dev_warn(&pdev->dev, "EHCI: unrecognized capability "
+                                       "%02x\n", cap & 0xff);
                        break;
                }
                offset = (cap >> 8) & 0xff;
        }
        if (!count)
-               printk(KERN_DEBUG "%s %s: capability loop?\n",
-                               pdev->dev.bus_id, "EHCI");
+               dev_printk(KERN_DEBUG, &pdev->dev, "EHCI: capability loop?\n");
 
        /*
         * halt EHCI & disable its interrupts in any case