From: Jim Quinlan <jquin...@broadcom.com>

The PERST bit was moved to a different register in 7278-type STB chips.  In
addition, the polarity of the bit was also changed; for other chips writing
a 1 specified assert; for 7278-type chips, writing a 0 specifies assert.

Signal-wise, PERST is an asserted-low signal.

Signed-off-by: Jim Quinlan <jquin...@broadcom.com>
---
 drivers/pci/controller/pcie-brcmstb.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/pci/controller/pcie-brcmstb.c 
b/drivers/pci/controller/pcie-brcmstb.c
index f444751e247c..0bcae9eba048 100644
--- a/drivers/pci/controller/pcie-brcmstb.c
+++ b/drivers/pci/controller/pcie-brcmstb.c
@@ -81,6 +81,7 @@
 
 #define PCIE_MISC_PCIE_CTRL                            0x4064
 #define  PCIE_MISC_PCIE_CTRL_PCIE_L23_REQUEST_MASK     0x1
+#define PCIE_MISC_PCIE_CTRL_PCIE_PERSTB_MASK           0x4
 
 #define PCIE_MISC_PCIE_STATUS                          0x4068
 #define  PCIE_MISC_PCIE_STATUS_PCIE_PORT_MASK          0x80
@@ -686,9 +687,17 @@ static inline void brcm_pcie_perst_set(struct brcm_pcie 
*pcie, u32 val)
 {
        u32 tmp;
 
-       tmp = readl(pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
-       u32p_replace_bits(&tmp, val, PCIE_RGR1_SW_INIT_1_PERST_MASK);
-       writel(tmp, pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
+       if (pcie->type == BCM7278) {
+               /* Perst bit has moved and assert value is 0 */
+               tmp = readl(pcie->base + PCIE_MISC_PCIE_CTRL);
+               u32p_replace_bits(&tmp,
+                                 !val, PCIE_MISC_PCIE_CTRL_PCIE_PERSTB_MASK);
+               writel(tmp, pcie->base +  PCIE_MISC_PCIE_CTRL);
+       } else {
+               tmp = readl(pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
+               u32p_replace_bits(&tmp, val, PCIE_RGR1_SW_INIT_1_PERST_MASK);
+               writel(tmp, pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
+       }
 }
 
 static inline int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie,
-- 
2.17.1

Reply via email to