usb: xhci: tegra: enable MC FLUSH of partition before ELPG
Ajay Gupta [Sat, 2 Mar 2013 01:02:58 +0000 (17:02 -0800)]
The partition client maintains credits for requests to MC. At the time of
ELPG entry, if there are any outstanding requests before the partition reset
is asserted, the credits are returned from MC at the time of ELPG exit after
the reset is released. This will result in overflow of credits and either cause
deadlock/lead to undesirable side effects in all future transactions.

In order to avoid this, SW needs to assert a hot reset to the PC which will
send out a FLUSH_DONE signal at a clean boundary after which all future
transactions are blocked. Only then partition reset can be asserted followed
by ELPG entry.

Bug 1237267

Change-Id: Ide45db658a327b1d663d0293817c7526b7068e74
Signed-off-by: Ajay Gupta <ajayg@nvidia.com>
Reviewed-on: http://git-master/r/205738
Reviewed-by: Henry Lin <henryl@nvidia.com>
Reviewed-by: Jui Chang Kuo <jckuo@nvidia.com>
Reviewed-by: Bo Yan <byan@nvidia.com>
(cherry picked from commit 782cecfe449e08fec201c0ebf011bc57b7545fbd)
Reviewed-on: http://git-master/r/208862
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Ashutosh Jha <ajha@nvidia.com>
GVS: Gerrit_Virtual_Submit

drivers/usb/host/xhci-tegra.c

index ca83f28..08ef726 100644 (file)
@@ -1490,6 +1490,9 @@ static int tegra_xhci_host_elpg_entry(struct tegra_xhci_hcd *tegra)
        /* wait 150us */
        usleep_range(150, 200);
 
+       /* flush MC client of XUSB_HOST */
+       tegra_powergate_mc_flush(TEGRA_POWERGATE_XUSBC);
+
        /* STEP 4: Powergate host partition */
        /* tegra_powergate_partition also does partition reset assert */
        ret = tegra_powergate_partition(TEGRA_POWERGATE_XUSBC);
@@ -1629,6 +1632,9 @@ tegra_xhci_host_partition_elpg_exit(struct tegra_xhci_hcd *tegra)
                tegra->lp0_exit = false;
        }
 
+       /* Clear FLUSH_ENABLE of MC client */
+       tegra_powergate_mc_flush_done(TEGRA_POWERGATE_XUSBC);
+
        /*
         * PWR_UNGATE Host partition. XUSBC
         * tegra_unpowergate_partition also does partition reset deassert