#define XUSB_PADCTL_UPHY_MISC_PAD_P1_CTL1_AUX_TX_RDET_STATUS (1 << 7)
#define XUSB_PADCTL_UPHY_MISC_PAD_P2_CTL1 0x4E0
+#define XUSB_PADCTL_UPHY_MISC_PAD_P2_CTL1_AUX_TX_RDET_STATUS (1 << 7)
+
#define XUSB_PADCTL_UPHY_MISC_PAD_P3_CTL1 0x520
+#define XUSB_PADCTL_UPHY_MISC_PAD_P3_CTL1_AUX_TX_RDET_STATUS (1 << 7)
+
#define XUSB_PADCTL_UPHY_MISC_PAD_P4_CTL1 0x560
+#define XUSB_PADCTL_UPHY_MISC_PAD_P4_CTL1_AUX_TX_RDET_STATUS (1 << 7)
#define XUSB_PADCTL_UPHY_MISC_PAD_P0_CTL2 0x464
#define XUSB_PADCTL_UPHY_MISC_PAD_P0_CTL2_TX_IDDQ (1 << 0)
#endif
#if defined(CONFIG_ARCH_TEGRA_21x_SOC)
-static u32 rp_to_lane_map[] = {1, 0};
+static u32 rp_to_lane_map[2][4] = { {1, 2, 3, 4}, {0} };
#endif
struct tegra_pcie_soc_data {
afi_writel(port->pcie, data, AFI_PCIE_CONFIG);
}
+#if defined(CONFIG_ARCH_TEGRA_21x_SOC)
+static bool get_rdet_status(u32 index)
+{
+ u32 i = 0;
+ bool flag = 0;
+ for (i = 0; i < ARRAY_SIZE(rp_to_lane_map[index]); i++)
+ flag |= tegra_phy_get_lane_rdet(rp_to_lane_map[index][i]);
+ return flag;
+}
+#endif
+
/*
* FIXME: If there are no PCIe cards attached, then calling this function
* can result in the increase of the bootup time as there are big timeout
unsigned long value;
PR_FUNC_LINE;
+#if defined(CONFIG_ARCH_TEGRA_21x_SOC)
+ if (!get_rdet_status(port->index))
+ return false;
+#endif
do {
unsigned int timeout = TEGRA_PCIE_LINKUP_TIMEOUT;
return true;
usleep_range(1000, 2000);
} while (--timeout);
-#if defined(CONFIG_ARCH_TEGRA_21x_SOC)
- if (tegra_phy_get_lane_rdet(
- rp_to_lane_map[port->index]))
- goto retry;
- else
- return false;
-
-retry:
-#endif
dev_info(port->pcie->dev, "link %u down, retrying\n",
port->index);
tegra_pcie_port_reset(port);
/* Wait for clock to latch (min of 100us) */
udelay(100);
tegra_periph_reset_deassert(pcie->pcie_xclk);
-
+ /* at this point in time, there is no end point which would
+ * take more than 20 msec for root port to detect receiver and
+ * set AUX_TX_RDET_STATUS bit. This would bring link up checking
+ * time from its current value (around 200ms) to flat 20ms
+ */
+ msleep(20);
list_for_each_entry_safe(port, tmp, &pcie->ports, list) {
if (tegra_pcie_port_check_link(port)) {
port->status = 1;
data = data &
XUSB_PADCTL_UPHY_MISC_PAD_P1_CTL1_AUX_TX_RDET_STATUS;
break;
+ case 2:
+ data = readl(pad_base + XUSB_PADCTL_UPHY_MISC_PAD_P2_CTL1);
+ data = data &
+ XUSB_PADCTL_UPHY_MISC_PAD_P2_CTL1_AUX_TX_RDET_STATUS;
+ break;
+ case 3:
+ data = readl(pad_base + XUSB_PADCTL_UPHY_MISC_PAD_P3_CTL1);
+ data = data &
+ XUSB_PADCTL_UPHY_MISC_PAD_P3_CTL1_AUX_TX_RDET_STATUS;
+ break;
+ case 4:
+ data = readl(pad_base + XUSB_PADCTL_UPHY_MISC_PAD_P4_CTL1);
+ data = data &
+ XUSB_PADCTL_UPHY_MISC_PAD_P4_CTL1_AUX_TX_RDET_STATUS;
+ break;
default:
return 0;
}