usb: xhci: tegra: fix compilation with lockdep enabled
[linux-3.10.git] / drivers / usb / host / xhci-tegra.c
index c83c026..da83737 100644 (file)
 #include <linux/of_device.h>
 #include <linux/of_gpio.h>
 #include <linux/tegra-fuse.h>
+#include <linux/tegra_pm_domains.h>
 
 #include <mach/tegra_usb_pad_ctrl.h>
 #include <mach/tegra_usb_pmc.h>
-#include <mach/pm_domains.h>
 #include <mach/mc.h>
 #include <mach/xusb.h>
 
@@ -90,6 +90,7 @@
                _reg, readl(_base + _reg))
 
 #define PMC_PORTMAP_MASK(map, pad)     (((map) >> 4*(pad)) & 0xF)
+#define GET_SS_PORTMAP(map, p)         (((map) >> 4*(p)) & 0xF)
 
 #define PMC_USB_DEBOUNCE_DEL_0                 0xec
 #define   UTMIP_LINE_DEB_CNT(x)                (((x) & 0xf) << 16)
@@ -179,7 +180,8 @@ struct cfgtbl {
        u8 magic[8];
        u32 SS_low_power_entry_timeout;
        u8 num_hsic_port;
-       u8 padding[139]; /* padding bytes to makeup 256-bytes cfgtbl */
+       u8 ss_portmap;
+       u8 padding[138]; /* padding bytes to makeup 256-bytes cfgtbl */
 };
 
 struct xusb_save_regs {
@@ -2189,6 +2191,14 @@ static void tegra_xhci_program_ss_pad(struct tegra_xhci_hcd *tegra,
                (port ? TEGRA_XUSB_SS1_PORT_MAP : TEGRA_XUSB_SS0_PORT_MAP));
        writel(reg, tegra->padctl_base + padregs->ss_port_map_0);
 
+       /* Make sure the SS port capability set correctly */
+       reg = readl(tegra->padctl_base + padregs->usb2_port_cap_0);
+       reg &= ~USB2_PORT_CAP_MASK(
+                       GET_SS_PORTMAP(tegra->bdata->ss_portmap, port));
+       reg |= USB2_PORT_CAP_HOST(
+                       GET_SS_PORTMAP(tegra->bdata->ss_portmap, port));
+       writel(reg, tegra->padctl_base + padregs->usb2_port_cap_0);
+
        tegra_xhci_restore_dfe_context(tegra, port);
        tegra_xhci_restore_ctle_context(tegra, port);
 }
@@ -2450,9 +2460,10 @@ static int load_firmware(struct tegra_xhci_hcd *tegra, bool resetARU)
        struct xhci_op_regs __iomem *op_regs;
        int pad;
 
-       /* enable mbox interrupt */
-       writel(readl(tegra->fpci_base + XUSB_CFG_ARU_MBOX_CMD) | MBOX_INT_EN,
-               tegra->fpci_base + XUSB_CFG_ARU_MBOX_CMD);
+       /* Program SS port map config */
+       cfg_tbl->ss_portmap = 0x0;
+       cfg_tbl->ss_portmap |=
+               (tegra->bdata->portmap & ((1 << XUSB_SS_PORT_COUNT) - 1));
 
        /* First thing, reset the ARU. By the time we get to
         * loading boot code below, reset would be complete.
@@ -2701,14 +2712,6 @@ static int tegra_xhci_host_elpg_entry(struct tegra_xhci_hcd *tegra)
                /* TODO: error handling? */
                return ret;
        }
-       if (tegra_powergate_is_powered(TEGRA_POWERGATE_PCIE)) {
-               ret = tegra_powergate_partition(TEGRA_POWERGATE_PCIE);
-               if (ret) {
-                       xhci_err(xhci, "%s: could not powergate pex partition %d\n",
-                               __func__, ret);
-                       return ret;
-               }
-       }
        tegra->host_pwr_gated = true;
        clk_disable(tegra->host_clk);
 
@@ -3036,15 +3039,6 @@ tegra_xhci_host_partition_elpg_exit(struct tegra_xhci_hcd *tegra)
                        __func__, ret);
                goto out;
        }
-       /* unpwrgate PEX(if not done by PCIE driver) due to HW Bug1320346 */
-       if (!tegra_powergate_is_powered(TEGRA_POWERGATE_PCIE)) {
-               ret = tegra_unpowergate_partition(TEGRA_POWERGATE_PCIE);
-               if (ret) {
-                       xhci_err(xhci, "%s: could not unpowergate pex partition %d\n",
-                               __func__, ret);
-                       goto out;
-               }
-       }
        clk_enable(tegra->host_clk);
 
        /* Step 4: Deassert reset to host partition clk */
@@ -3088,6 +3082,7 @@ tegra_xhci_host_partition_elpg_exit(struct tegra_xhci_hcd *tegra)
                        csb_read(tegra, XUSB_FALC_FS_PVTPORTSC3));
        debug_print_portsc(xhci);
 
+       tegra_xhci_enable_fw_message(tegra);
        ret = load_firmware(tegra, false /* EPLG exit, do not reset ARU */);
        if (ret < 0) {
                xhci_err(xhci, "%s: failed to load firmware %d\n",
@@ -3373,12 +3368,13 @@ static irqreturn_t tegra_xhci_smi_irq(int irq, void *ptrdev)
         */
 
        temp = readl(tegra->fpci_base + XUSB_CFG_ARU_SMI_INTR);
-
-       /* write 1 to clear SMI INTR en bit ( bit 3 ) */
-       temp = MBOX_SMI_INTR_EN;
        writel(temp, tegra->fpci_base + XUSB_CFG_ARU_SMI_INTR);
 
-       schedule_work(&tegra->mbox_work);
+       xhci_dbg(tegra->xhci, "SMI INTR status 0x%x\n", temp);
+       if (temp & SMI_INTR_STATUS_FW_REINIT)
+               xhci_err(tegra->xhci, "Firmware reinit.\n");
+       if (temp & SMI_INTR_STATUS_MBOX)
+               schedule_work(&tegra->mbox_work);
 
        spin_unlock(&tegra->lock);
        return IRQ_HANDLED;
@@ -3695,9 +3691,6 @@ tegra_xhci_suspend(struct platform_device *pdev,
        }
        mutex_unlock(&tegra->sync_lock);
 
-       tegra_xhci_ss_wake_on_interrupts(tegra->bdata->portmap, false);
-       tegra_xhci_hs_wake_on_interrupts(tegra->bdata->portmap, false);
-
        /* enable_irq_wake for ss ports */
        ret = enable_irq_wake(tegra->padctl_irq);
        if (ret < 0) {
@@ -4271,7 +4264,7 @@ static int hsic_power_create_file(struct tegra_xhci_hcd *tegra)
                tegra->hsic_power_attr[p].show = hsic_power_show;
                tegra->hsic_power_attr[p].store = hsic_power_store;
                tegra->hsic_power_attr[p].attr.mode = (S_IRUGO | S_IWUSR);
-               sysfs_attr_init(&tegra->hsic_power_attr[p]);
+               sysfs_attr_init(&tegra->hsic_power_attr[p].attr);
 
                err = device_create_file(dev, &tegra->hsic_power_attr[p]);
                if (err) {
@@ -4424,13 +4417,6 @@ static int tegra_xhci_probe(struct platform_device *pdev)
        if (ret)
                dev_err(&pdev->dev, "could not unpowergate xusbc partition\n");
 
-       /* unpwrgate PEX(if not done by PCIE driver) due to HW Bug1320346 */
-       if (!tegra_powergate_is_powered(TEGRA_POWERGATE_PCIE)) {
-               ret = tegra_unpowergate_partition(TEGRA_POWERGATE_PCIE);
-               if (ret)
-                       dev_err(&pdev->dev, "could not unpowergate pex partition\n");
-       }
-
        ret = tegra_enable_xusb_clk(tegra, pdev);
        if (ret)
                dev_err(&pdev->dev, "could not enable partition clock\n");
@@ -4532,7 +4518,7 @@ static int tegra_xhci_probe2(struct tegra_xhci_hcd *tegra)
        unsigned port;
 
 
-       ret = load_firmware(tegra, true /* do reset ARU */);
+       ret = load_firmware(tegra, false /* do reset ARU */);
        if (ret < 0) {
                dev_err(&pdev->dev, "failed to load firmware\n");
                return -ENODEV;
@@ -4614,8 +4600,6 @@ static int tegra_xhci_probe2(struct tegra_xhci_hcd *tegra)
        tegra->mbox_owner = 0xffff;
        INIT_WORK(&tegra->mbox_work, tegra_xhci_process_mbox_message);
 
-       tegra_xhci_enable_fw_message(tegra);
-
        /* do ss partition elpg exit related initialization */
        INIT_WORK(&tegra->ss_elpg_exit_work, ss_partition_elpg_exit_work);
 
@@ -4660,6 +4644,7 @@ static int tegra_xhci_probe2(struct tegra_xhci_hcd *tegra)
                tegra->dfe_ctx_saved[port] = false;
        }
 
+       tegra_xhci_enable_fw_message(tegra);
        hsic_pad_pretend_connect(tegra);
 
        tegra_xhci_debug_read_pads(tegra);