aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2016-08-01 13:25:37 -0400
committerBjorn Helgaas <bhelgaas@google.com>2016-08-01 13:25:37 -0400
commitea1f4e9d1daf87c08ec399669300ee5d1fb68e89 (patch)
treec4eeb0293b9933b588b4672c1fcc1d770b88ae24
parent79dd99346166bcbf3b082f6e234db788da1db3c9 (diff)
parentf814430c3ec89177f5d530484c4df95c268aedfb (diff)
Merge branch 'pci/host-tegra' into next
* pci/host-tegra: PCI: tegra: Program PADS_REFCLK_CFG* registers with per-SoC values PCI: tegra: Program PADS_REFCLK_CFG* always, not just on legacy SoCs PCI: tegra: Stop setting pcibios_min_mem PCI: tegra: Use generic pci_remap_iospace() rather than ARM32-specific one PCI: tegra: Use lower-case hex consistently for register definitions Conflicts: drivers/pci/host/pci-tegra.c Drop stray pci_ioremap_io() per Thierry Reding <treding@nvidia.com>; removal tested by Jon Hunter <jonathanh@nvidia.com>.
-rw-r--r--drivers/pci/host/pci-tegra.c55
1 files changed, 25 insertions, 30 deletions
diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
index 584777e0ad79..6de0757b11e4 100644
--- a/drivers/pci/host/pci-tegra.c
+++ b/drivers/pci/host/pci-tegra.c
@@ -185,26 +185,26 @@
185 185
186#define AFI_PEXBIAS_CTRL_0 0x168 186#define AFI_PEXBIAS_CTRL_0 0x168
187 187
188#define RP_VEND_XP 0x00000F00 188#define RP_VEND_XP 0x00000f00
189#define RP_VEND_XP_DL_UP (1 << 30) 189#define RP_VEND_XP_DL_UP (1 << 30)
190 190
191#define RP_PRIV_MISC 0x00000FE0 191#define RP_PRIV_MISC 0x00000fe0
192#define RP_PRIV_MISC_PRSNT_MAP_EP_PRSNT (0xE << 0) 192#define RP_PRIV_MISC_PRSNT_MAP_EP_PRSNT (0xe << 0)
193#define RP_PRIV_MISC_PRSNT_MAP_EP_ABSNT (0xF << 0) 193#define RP_PRIV_MISC_PRSNT_MAP_EP_ABSNT (0xf << 0)
194 194
195#define RP_LINK_CONTROL_STATUS 0x00000090 195#define RP_LINK_CONTROL_STATUS 0x00000090
196#define RP_LINK_CONTROL_STATUS_DL_LINK_ACTIVE 0x20000000 196#define RP_LINK_CONTROL_STATUS_DL_LINK_ACTIVE 0x20000000
197#define RP_LINK_CONTROL_STATUS_LINKSTAT_MASK 0x3fff0000 197#define RP_LINK_CONTROL_STATUS_LINKSTAT_MASK 0x3fff0000
198 198
199#define PADS_CTL_SEL 0x0000009C 199#define PADS_CTL_SEL 0x0000009c
200 200
201#define PADS_CTL 0x000000A0 201#define PADS_CTL 0x000000a0
202#define PADS_CTL_IDDQ_1L (1 << 0) 202#define PADS_CTL_IDDQ_1L (1 << 0)
203#define PADS_CTL_TX_DATA_EN_1L (1 << 6) 203#define PADS_CTL_TX_DATA_EN_1L (1 << 6)
204#define PADS_CTL_RX_DATA_EN_1L (1 << 10) 204#define PADS_CTL_RX_DATA_EN_1L (1 << 10)
205 205
206#define PADS_PLL_CTL_TEGRA20 0x000000B8 206#define PADS_PLL_CTL_TEGRA20 0x000000b8
207#define PADS_PLL_CTL_TEGRA30 0x000000B4 207#define PADS_PLL_CTL_TEGRA30 0x000000b4
208#define PADS_PLL_CTL_RST_B4SM (1 << 1) 208#define PADS_PLL_CTL_RST_B4SM (1 << 1)
209#define PADS_PLL_CTL_LOCKDET (1 << 8) 209#define PADS_PLL_CTL_LOCKDET (1 << 8)
210#define PADS_PLL_CTL_REFCLK_MASK (0x3 << 16) 210#define PADS_PLL_CTL_REFCLK_MASK (0x3 << 16)
@@ -216,9 +216,9 @@
216#define PADS_PLL_CTL_TXCLKREF_DIV5 (1 << 20) 216#define PADS_PLL_CTL_TXCLKREF_DIV5 (1 << 20)
217#define PADS_PLL_CTL_TXCLKREF_BUF_EN (1 << 22) 217#define PADS_PLL_CTL_TXCLKREF_BUF_EN (1 << 22)
218 218
219#define PADS_REFCLK_CFG0 0x000000C8 219#define PADS_REFCLK_CFG0 0x000000c8
220#define PADS_REFCLK_CFG1 0x000000CC 220#define PADS_REFCLK_CFG1 0x000000cc
221#define PADS_REFCLK_BIAS 0x000000D0 221#define PADS_REFCLK_BIAS 0x000000d0
222 222
223/* 223/*
224 * Fields in PADS_REFCLK_CFG*. Those registers form an array of 16-bit 224 * Fields in PADS_REFCLK_CFG*. Those registers form an array of 16-bit
@@ -230,15 +230,6 @@
230#define PADS_REFCLK_CFG_PREDI_SHIFT 8 /* 11:8 */ 230#define PADS_REFCLK_CFG_PREDI_SHIFT 8 /* 11:8 */
231#define PADS_REFCLK_CFG_DRVI_SHIFT 12 /* 15:12 */ 231#define PADS_REFCLK_CFG_DRVI_SHIFT 12 /* 15:12 */
232 232
233/* Default value provided by HW engineering is 0xfa5c */
234#define PADS_REFCLK_CFG_VALUE \
235 ( \
236 (0x17 << PADS_REFCLK_CFG_TERM_SHIFT) | \
237 (0 << PADS_REFCLK_CFG_E_TERM_SHIFT) | \
238 (0xa << PADS_REFCLK_CFG_PREDI_SHIFT) | \
239 (0xf << PADS_REFCLK_CFG_DRVI_SHIFT) \
240 )
241
242struct tegra_msi { 233struct tegra_msi {
243 struct msi_controller chip; 234 struct msi_controller chip;
244 DECLARE_BITMAP(used, INT_PCI_MSI_NR); 235 DECLARE_BITMAP(used, INT_PCI_MSI_NR);
@@ -254,6 +245,8 @@ struct tegra_pcie_soc_data {
254 unsigned int msi_base_shift; 245 unsigned int msi_base_shift;
255 u32 pads_pll_ctl; 246 u32 pads_pll_ctl;
256 u32 tx_ref_sel; 247 u32 tx_ref_sel;
248 u32 pads_refclk_cfg0;
249 u32 pads_refclk_cfg1;
257 bool has_pex_clkreq_en; 250 bool has_pex_clkreq_en;
258 bool has_pex_bias_ctrl; 251 bool has_pex_bias_ctrl;
259 bool has_intr_prsnt_sense; 252 bool has_intr_prsnt_sense;
@@ -628,8 +621,6 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
628 if (err < 0) 621 if (err < 0)
629 return err; 622 return err;
630 623
631 pci_ioremap_io(pcie->pio.start, pcie->io.start);
632
633 pci_add_resource_offset(&sys->resources, &pcie->pio, sys->io_offset); 624 pci_add_resource_offset(&sys->resources, &pcie->pio, sys->io_offset);
634 pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); 625 pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
635 pci_add_resource_offset(&sys->resources, &pcie->prefetch, 626 pci_add_resource_offset(&sys->resources, &pcie->prefetch,
@@ -640,6 +631,7 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
640 if (err < 0) 631 if (err < 0)
641 return err; 632 return err;
642 633
634 pci_remap_iospace(&pcie->pio, pcie->io.start);
643 return 1; 635 return 1;
644} 636}
645 637
@@ -831,12 +823,6 @@ static int tegra_pcie_phy_enable(struct tegra_pcie *pcie)
831 value |= PADS_PLL_CTL_RST_B4SM; 823 value |= PADS_PLL_CTL_RST_B4SM;
832 pads_writel(pcie, value, soc->pads_pll_ctl); 824 pads_writel(pcie, value, soc->pads_pll_ctl);
833 825
834 /* Configure the reference clock driver */
835 value = PADS_REFCLK_CFG_VALUE | (PADS_REFCLK_CFG_VALUE << 16);
836 pads_writel(pcie, value, PADS_REFCLK_CFG0);
837 if (soc->num_ports > 2)
838 pads_writel(pcie, PADS_REFCLK_CFG_VALUE, PADS_REFCLK_CFG1);
839
840 /* wait for the PLL to lock */ 826 /* wait for the PLL to lock */
841 err = tegra_pcie_pll_wait(pcie, 500); 827 err = tegra_pcie_pll_wait(pcie, 500);
842 if (err < 0) { 828 if (err < 0) {
@@ -920,6 +906,7 @@ static int tegra_pcie_port_phy_power_off(struct tegra_pcie_port *port)
920 906
921static int tegra_pcie_phy_power_on(struct tegra_pcie *pcie) 907static int tegra_pcie_phy_power_on(struct tegra_pcie *pcie)
922{ 908{
909 const struct tegra_pcie_soc_data *soc = pcie->soc_data;
923 struct tegra_pcie_port *port; 910 struct tegra_pcie_port *port;
924 int err; 911 int err;
925 912
@@ -945,6 +932,12 @@ static int tegra_pcie_phy_power_on(struct tegra_pcie *pcie)
945 } 932 }
946 } 933 }
947 934
935 /* Configure the reference clock driver */
936 pads_writel(pcie, soc->pads_refclk_cfg0, PADS_REFCLK_CFG0);
937
938 if (soc->num_ports > 2)
939 pads_writel(pcie, soc->pads_refclk_cfg1, PADS_REFCLK_CFG1);
940
948 return 0; 941 return 0;
949} 942}
950 943
@@ -2055,6 +2048,7 @@ static const struct tegra_pcie_soc_data tegra20_pcie_data = {
2055 .msi_base_shift = 0, 2048 .msi_base_shift = 0,
2056 .pads_pll_ctl = PADS_PLL_CTL_TEGRA20, 2049 .pads_pll_ctl = PADS_PLL_CTL_TEGRA20,
2057 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_DIV10, 2050 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_DIV10,
2051 .pads_refclk_cfg0 = 0xfa5cfa5c,
2058 .has_pex_clkreq_en = false, 2052 .has_pex_clkreq_en = false,
2059 .has_pex_bias_ctrl = false, 2053 .has_pex_bias_ctrl = false,
2060 .has_intr_prsnt_sense = false, 2054 .has_intr_prsnt_sense = false,
@@ -2067,6 +2061,8 @@ static const struct tegra_pcie_soc_data tegra30_pcie_data = {
2067 .msi_base_shift = 8, 2061 .msi_base_shift = 8,
2068 .pads_pll_ctl = PADS_PLL_CTL_TEGRA30, 2062 .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
2069 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN, 2063 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
2064 .pads_refclk_cfg0 = 0xfa5cfa5c,
2065 .pads_refclk_cfg1 = 0xfa5cfa5c,
2070 .has_pex_clkreq_en = true, 2066 .has_pex_clkreq_en = true,
2071 .has_pex_bias_ctrl = true, 2067 .has_pex_bias_ctrl = true,
2072 .has_intr_prsnt_sense = true, 2068 .has_intr_prsnt_sense = true,
@@ -2079,6 +2075,7 @@ static const struct tegra_pcie_soc_data tegra124_pcie_data = {
2079 .msi_base_shift = 8, 2075 .msi_base_shift = 8,
2080 .pads_pll_ctl = PADS_PLL_CTL_TEGRA30, 2076 .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
2081 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN, 2077 .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
2078 .pads_refclk_cfg0 = 0x44ac44ac,
2082 .has_pex_clkreq_en = true, 2079 .has_pex_clkreq_en = true,
2083 .has_pex_bias_ctrl = true, 2080 .has_pex_bias_ctrl = true,
2084 .has_intr_prsnt_sense = true, 2081 .has_intr_prsnt_sense = true,
@@ -2225,8 +2222,6 @@ static int tegra_pcie_probe(struct platform_device *pdev)
2225 if (err < 0) 2222 if (err < 0)
2226 return err; 2223 return err;
2227 2224
2228 pcibios_min_mem = 0;
2229
2230 err = tegra_pcie_get_resources(pcie); 2225 err = tegra_pcie_get_resources(pcie);
2231 if (err < 0) { 2226 if (err < 0) {
2232 dev_err(&pdev->dev, "failed to request resources: %d\n", err); 2227 dev_err(&pdev->dev, "failed to request resources: %d\n", err);