summaryrefslogtreecommitdiff
path: root/drivers/ata
diff options
context:
space:
mode:
authorvenkatajagadish <vjagadish@nvidia.com>2013-06-04 16:35:55 +0530
committerVenkata Jagadish <vjagadish@nvidia.com>2013-11-18 21:59:05 -0800
commit228b2d50afeaea7107c4e7e4d63060acef2c81ee (patch)
treeb25ac48e1e2fdd491c3d049abe95c00de8680426 /drivers/ata
parentf24d81b3752118a9f17396b09b1f4e9495d21a76 (diff)
SATA: tegra: Sw War for GEN2 SATA Drive
GEN2 tests fail when Idle Detect Circuit in Pad Model is Enabled Bug 1294489 Change-Id: I5e5d86edf27daf58ef343b6796e6dc40dfba53bd Signed-off-by: venkatajagadish <vjagadish@nvidia.com> Reviewed-on: http://git-master/r/332302 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/ahci-tegra.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/ata/ahci-tegra.c b/drivers/ata/ahci-tegra.c
index 661a0c79b06d..85091a39745a 100644
--- a/drivers/ata/ahci-tegra.c
+++ b/drivers/ata/ahci-tegra.c
@@ -93,6 +93,7 @@ static u32 tegra_ahci_idle_time = TEGRA_AHCI_DEFAULT_IDLE_TIME;
#define FUSE_SATA_CALIB_MASK 0x3
#define T_SATA0_CFG_PHY_REG 0x120
+#define T_SATA0_CFG_PHY_SQUELCH_MASK (1 << 24)
#define PHY_USE_7BIT_ALIGN_DET_FOR_SPD_MASK (1 << 11)
#define T_SATA0_CFG_POWER_GATE 0x4ac
@@ -287,6 +288,15 @@ static u32 tegra_ahci_idle_time = TEGRA_AHCI_DEFAULT_IDLE_TIME;
#define PLLE_SSCBYP (1 << 12)
#define PLLE_INTERP_RESET (1 << 11)
+#define SATA_AUX_RX_STAT_INT_0 0x110c
+#define SATA_RX_STAT_INT_DISABLE (1 << 2)
+
+#define T_SATA0_NVOOB 0x114
+#define T_SATA0_NVOOB_SQUELCH_FILTER_MODE_SHIFT 24
+#define T_SATA0_NVOOB_SQUELCH_FILTER_MODE_MASK (3 << 24)
+#define T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH_SHIFT 26
+#define T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH_MASK (3 << 26)
+
#ifdef CONFIG_TEGRA_SATA_IDLE_POWERGATE
/* create a work for handling the async transfers */
@@ -989,8 +999,14 @@ static int tegra_ahci_controller_init(struct tegra_ahci_host_priv *tegra_hpriv,
*/
val = scfg_readl(T_SATA0_CFG_PHY_REG);
val &= ~PHY_USE_7BIT_ALIGN_DET_FOR_SPD_MASK;
+ val |= T_SATA0_CFG_PHY_SQUELCH_MASK;
scfg_writel(val, T_SATA0_CFG_PHY_REG);
+ val = scfg_readl(T_SATA0_NVOOB);
+ val |= (1 << T_SATA0_NVOOB_SQUELCH_FILTER_MODE_SHIFT);
+ val |= (3 << T_SATA0_NVOOB_SQUELCH_FILTER_LENGTH_SHIFT);
+ scfg_writel(val, T_SATA0_NVOOB);
+
/*
* WAR: Before enabling SATA PLL shutdown, lockdet needs to be ignored.
* To ignore lockdet, T_SATA0_DBG0_OFFSET register bit 10 needs to
@@ -1203,6 +1219,7 @@ static int tegra_ahci_resume(struct platform_device *pdev)
{
struct ata_host *host = dev_get_drvdata(&pdev->dev);
int rc;
+ u32 val;
dev_dbg(host->dev, "** entering %s: **\n", __func__);
rc = tegra_ahci_controller_resume(pdev);
@@ -1220,6 +1237,12 @@ static int tegra_ahci_resume(struct platform_device *pdev)
if (rc)
return rc;
+ val = misc_readl(SATA_AUX_RX_STAT_INT_0);
+ if (val && SATA_RX_STAT_INT_DISABLE) {
+ val &= ~SATA_RX_STAT_INT_DISABLE;
+ misc_writel(val, SATA_AUX_RX_STAT_INT_0);
+ }
+
ahci_init_controller(host);
}
@@ -2228,6 +2251,13 @@ static int tegra_ahci_hardreset(struct ata_link *link, unsigned int *class,
static irqreturn_t tegra_ahci_interrupt(int irq, void *dev_instance)
{
irqreturn_t irq_retval;
+ u32 val;
+
+ val = misc_readl(SATA_AUX_RX_STAT_INT_0);
+ if (!(val && SATA_RX_STAT_INT_DISABLE)) {
+ val |= SATA_RX_STAT_INT_DISABLE;
+ misc_writel(val, SATA_AUX_RX_STAT_INT_0);
+ }
irq_retval = ahci_interrupt(irq, dev_instance);
if (irq_retval == IRQ_NONE)