[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250625165229.3458-9-shradha.t@samsung.com>
Date: Wed, 25 Jun 2025 22:22:27 +0530
From: Shradha Todi <shradha.t@...sung.com>
To: linux-pci@...r.kernel.org, devicetree@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org, linux-samsung-soc@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-phy@...ts.infradead.org,
linux-fsd@...la.com
Cc: manivannan.sadhasivam@...aro.org, lpieralisi@...nel.org, kw@...ux.com,
robh@...nel.org, bhelgaas@...gle.com, jingoohan1@...il.com,
krzk+dt@...nel.org, conor+dt@...nel.org, alim.akhtar@...sung.com,
vkoul@...nel.org, kishon@...nel.org, arnd@...db.de,
m.szyprowski@...sung.com, jh80.chung@...sung.com, pankaj.dubey@...sung.com,
Shradha Todi <shradha.t@...sung.com>
Subject: [PATCH v2 08/10] phy: exynos: Add PCIe PHY support for FSD SoC
Add PCIe PHY support for Tesla FSD SoC.
Signed-off-by: Shradha Todi <shradha.t@...sung.com>
---
drivers/phy/samsung/phy-exynos-pcie.c | 317 +++++++++++++++++++++++++-
1 file changed, 316 insertions(+), 1 deletion(-)
diff --git a/drivers/phy/samsung/phy-exynos-pcie.c b/drivers/phy/samsung/phy-exynos-pcie.c
index 53c9230c2907..001a49bde2f4 100644
--- a/drivers/phy/samsung/phy-exynos-pcie.c
+++ b/drivers/phy/samsung/phy-exynos-pcie.c
@@ -34,11 +34,113 @@
/* PMU PCIE PHY isolation control */
#define EXYNOS5433_PMU_PCIE_PHY_OFFSET 0x730
+/* FSD: PCIe PHY common registers */
+#define FSD_PCIE_PHY_TRSV_CMN_REG03 0x000c
+#define FSD_PCIE_PHY_TRSV_CMN_REG01E 0x0078
+#define FSD_PCIE_PHY_TRSV_CMN_REG02D 0x00b4
+#define FSD_PCIE_PHY_TRSV_CMN_REG031 0x00c4
+#define FSD_PCIE_PHY_TRSV_CMN_REG036 0x00d8
+#define FSD_PCIE_PHY_TRSV_CMN_REG05F 0x017c
+#define FSD_PCIE_PHY_TRSV_CMN_REG060 0x0180
+#define FSD_PCIE_PHY_TRSV_CMN_REG062 0x0188
+#define FSD_PCIE_PHY_TRSV_CMN_REG061 0x0184
+#define FSD_PCIE_PHY_AGG_BIF_RESET 0x0200
+#define FSD_PCIE_PHY_AGG_BIF_CLOCK 0x0208
+#define FSD_PCIE_PHY_CMN_RESET 0x0228
+
+/* FSD: PCIe PHY lane registers */
+#define FSD_PCIE_LANE_OFFSET 0x0400
+#define FSD_PCIE_NUM_LANES 0x4
+
+#define FSD_PCIE_PHY_TRSV_REG001_LN_N 0x0404
+#define FSD_PCIE_PHY_TRSV_REG002_LN_N 0x0408
+#define FSD_PCIE_PHY_TRSV_REG005_LN_N 0x0414
+#define FSD_PCIE_PHY_TRSV_REG006_LN_N 0x0418
+#define FSD_PCIE_PHY_TRSV_REG007_LN_N 0x041c
+#define FSD_PCIE_PHY_TRSV_REG009_LN_N 0x0424
+#define FSD_PCIE_PHY_TRSV_REG00A_LN_N 0x0428
+#define FSD_PCIE_PHY_TRSV_REG00C_LN_N 0x0430
+#define FSD_PCIE_PHY_TRSV_REG012_LN_N 0x0448
+#define FSD_PCIE_PHY_TRSV_REG013_LN_N 0x044c
+#define FSD_PCIE_PHY_TRSV_REG014_LN_N 0x0450
+#define FSD_PCIE_PHY_TRSV_REG015_LN_N 0x0454
+#define FSD_PCIE_PHY_TRSV_REG016_LN_N 0x0458
+#define FSD_PCIE_PHY_TRSV_REG018_LN_N 0x0460
+#define FSD_PCIE_PHY_TRSV_REG020_LN_N 0x0480
+#define FSD_PCIE_PHY_TRSV_REG026_LN_N 0x0498
+#define FSD_PCIE_PHY_TRSV_REG029_LN_N 0x04a4
+#define FSD_PCIE_PHY_TRSV_REG031_LN_N 0x04c4
+#define FSD_PCIE_PHY_TRSV_REG036_LN_N 0x04d8
+#define FSD_PCIE_PHY_TRSV_REG039_LN_N 0x04e4
+#define FSD_PCIE_PHY_TRSV_REG03B_LN_N 0x04ec
+#define FSD_PCIE_PHY_TRSV_REG03C_LN_N 0x04f0
+#define FSD_PCIE_PHY_TRSV_REG03E_LN_N 0x04f8
+#define FSD_PCIE_PHY_TRSV_REG03F_LN_N 0x04fc
+#define FSD_PCIE_PHY_TRSV_REG043_LN_N 0x050c
+#define FSD_PCIE_PHY_TRSV_REG044_LN_N 0x0510
+#define FSD_PCIE_PHY_TRSV_REG046_LN_N 0x0518
+#define FSD_PCIE_PHY_TRSV_REG048_LN_N 0x0520
+#define FSD_PCIE_PHY_TRSV_REG049_LN_N 0x0524
+#define FSD_PCIE_PHY_TRSV_REG04E_LN_N 0x0538
+#define FSD_PCIE_PHY_TRSV_REG052_LN_N 0x0548
+#define FSD_PCIE_PHY_TRSV_REG068_LN_N 0x05a0
+#define FSD_PCIE_PHY_TRSV_REG069_LN_N 0x05a4
+#define FSD_PCIE_PHY_TRSV_REG06A_LN_N 0x05a8
+#define FSD_PCIE_PHY_TRSV_REG06B_LN_N 0x05ac
+#define FSD_PCIE_PHY_TRSV_REG07B_LN_N 0x05ec
+#define FSD_PCIE_PHY_TRSV_REG083_LN_N 0x060c
+#define FSD_PCIE_PHY_TRSV_REG084_LN_N 0x0610
+#define FSD_PCIE_PHY_TRSV_REG086_LN_N 0x0618
+#define FSD_PCIE_PHY_TRSV_REG087_LN_N 0x061c
+#define FSD_PCIE_PHY_TRSV_REG08B_LN_N 0x062c
+#define FSD_PCIE_PHY_TRSV_REG09C_LN_N 0x0670
+#define FSD_PCIE_PHY_TRSV_REG09D_LN_N 0x0674
+#define FSD_PCIE_PHY_TRSV_REG09E_LN_N 0x0678
+#define FSD_PCIE_PHY_TRSV_REG09F_LN_N 0x067c
+#define FSD_PCIE_PHY_TRSV_REG0A2_LN_N 0x0688
+#define FSD_PCIE_PHY_TRSV_REG0A4_LN_N 0x0690
+#define FSD_PCIE_PHY_TRSV_REG0CE_LN_N 0x0738
+#define FSD_PCIE_PHY_TRSV_REG0FC_LN_N 0x07f0
+#define FSD_PCIE_PHY_TRSV_REG0FD_LN_N 0x07f4
+#define FSD_PCIE_PHY_TRSV_REG0FE_LN_N 0x07f8
+#define FSD_PCIE_PHY_TRSV_REG0CE_LN_1 0x0b38
+#define FSD_PCIE_PHY_TRSV_REG0CE_LN_2 0x0f38
+#define FSD_PCIE_PHY_TRSV_REG0CE_LN_3 0x1338
+
+/* FSD: PCIe PCS registers */
+#define FSD_PCIE_PCS_BRF_0 0x0004
+#define FSD_PCIE_PCS_BRF_1 0x0804
+#define FSD_PCIE_PCS_CLK 0x0180
+
+/* FSD: PCIe SYSREG registers */
+#define FSD_PCIE_SYSREG_PHY_0_CON 0x042c
+#define FSD_PCIE_SYSREG_PHY_0_CON_MASK 0x03ff
+#define FSD_PCIE_SYSREG_PHY_0_REF_SEL (0x2 << 0)
+#define FSD_PCIE_SYSREG_PHY_0_REF_SEL_MASK 0x3
+#define FSD_PCIE_SYSREG_PHY_0_AUX_EN BIT(4)
+#define FSD_PCIE_SYSREG_PHY_0_CMN_RSTN BIT(8)
+#define FSD_PCIE_SYSREG_PHY_0_INIT_RSTN BIT(9)
+
+#define FSD_PCIE_SYSREG_PHY_1_CON 0x0500
+#define FSD_PCIE_SYSREG_PHY_1_CON_MASK 0x01ff
+#define FSD_PCIE_SYSREG_PHY_1_REF_SEL (0x2 << 4)
+#define FSD_PCIE_SYSREG_PHY_1_REF_SEL_MASK 0x30
+#define FSD_PCIE_SYSREG_PHY_1_AUX_EN BIT(0)
+#define FSD_PCIE_SYSREG_PHY_1_CMN_RSTN BIT(1)
+#define FSD_PCIE_SYSREG_PHY_1_INIT_RSTN BIT(3)
+
/* For Exynos pcie phy */
struct exynos_pcie_phy {
void __iomem *base;
+ void __iomem *pcs_base;
struct regmap *pmureg;
struct regmap *fsysreg;
+ int phy_id;
+ const struct samsung_drv_data *drv_data;
+};
+
+struct samsung_drv_data {
+ const struct phy_ops *phy_ops;
};
static void exynos_pcie_phy_writel(void __iomem *base, u32 val, u32 offset)
@@ -133,9 +235,212 @@ static const struct phy_ops exynos5433_phy_ops = {
.owner = THIS_MODULE,
};
+static void fsd_pcie_phy_writel(struct exynos_pcie_phy *phy_ctrl, u32 offset, u32 val)
+{
+ void __iomem *phy_base = phy_ctrl->base;
+ u32 i;
+
+ for (i = 0; i < FSD_PCIE_NUM_LANES; i++)
+ writel(val, phy_base + (offset + i * FSD_PCIE_LANE_OFFSET));
+}
+
+struct fsd_pcie_phy_pdata {
+ u32 phy_con_offset;
+ u32 phy_con_mask;
+ u32 phy_ref_sel;
+ u32 phy_ref_sel_mask;
+ u32 phy_aux_en;
+ u32 phy_cmn_rstn;
+ u32 phy_init_rstn;
+};
+
+static const struct fsd_pcie_phy_pdata fsd_phy_con[] = {
+{
+ .phy_con_offset = FSD_PCIE_SYSREG_PHY_0_CON,
+ .phy_con_mask = FSD_PCIE_SYSREG_PHY_0_CON_MASK,
+ .phy_ref_sel = FSD_PCIE_SYSREG_PHY_0_REF_SEL,
+ .phy_ref_sel_mask = FSD_PCIE_SYSREG_PHY_0_REF_SEL_MASK,
+ .phy_aux_en = FSD_PCIE_SYSREG_PHY_0_AUX_EN,
+ .phy_cmn_rstn = FSD_PCIE_SYSREG_PHY_0_CMN_RSTN,
+ .phy_init_rstn = FSD_PCIE_SYSREG_PHY_0_INIT_RSTN,
+ },
+ {
+ .phy_con_offset = FSD_PCIE_SYSREG_PHY_1_CON,
+ .phy_con_mask = FSD_PCIE_SYSREG_PHY_1_CON_MASK,
+ .phy_ref_sel = FSD_PCIE_SYSREG_PHY_1_REF_SEL,
+ .phy_ref_sel_mask = FSD_PCIE_SYSREG_PHY_1_REF_SEL_MASK,
+ .phy_aux_en = FSD_PCIE_SYSREG_PHY_1_AUX_EN,
+ .phy_cmn_rstn = FSD_PCIE_SYSREG_PHY_1_CMN_RSTN,
+ .phy_init_rstn = FSD_PCIE_SYSREG_PHY_1_INIT_RSTN,
+ },
+ { },
+};
+
+static int fsd_pcie_phy_reset(struct phy *phy)
+{
+ struct exynos_pcie_phy *phy_ctrl = phy_get_drvdata(phy);
+ const struct fsd_pcie_phy_pdata *pdata = &fsd_phy_con[phy_ctrl->phy_id];
+
+ writel(0x1, phy_ctrl->pcs_base + FSD_PCIE_PCS_CLK);
+
+ regmap_update_bits(phy_ctrl->fsysreg, pdata->phy_con_offset,
+ pdata->phy_con_mask, 0x0);
+ regmap_update_bits(phy_ctrl->fsysreg, pdata->phy_con_offset,
+ pdata->phy_aux_en, pdata->phy_aux_en);
+ regmap_update_bits(phy_ctrl->fsysreg, pdata->phy_con_offset,
+ pdata->phy_ref_sel_mask, pdata->phy_ref_sel);
+ /* perform init reset release */
+ regmap_update_bits(phy_ctrl->fsysreg, pdata->phy_con_offset,
+ pdata->phy_init_rstn, pdata->phy_init_rstn);
+
+ return 0;
+}
+
+static void fsd_pcie_phy1_init(struct exynos_pcie_phy *phy_ctrl)
+{
+ void __iomem *pbase = phy_ctrl->base;
+
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG07B_LN_N, 0x20);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG052_LN_N, 0x00);
+ writel(0xaa, pbase + FSD_PCIE_PHY_TRSV_CMN_REG01E);
+ writel(0x28, pbase + FSD_PCIE_PHY_TRSV_CMN_REG02D);
+ writel(0x28, pbase + FSD_PCIE_PHY_TRSV_CMN_REG031);
+ writel(0x21, pbase + FSD_PCIE_PHY_TRSV_CMN_REG036);
+ writel(0x12, pbase + FSD_PCIE_PHY_TRSV_CMN_REG05F);
+ writel(0x23, pbase + FSD_PCIE_PHY_TRSV_CMN_REG060);
+ writel(0x0, pbase + FSD_PCIE_PHY_TRSV_CMN_REG061);
+ writel(0x0, pbase + FSD_PCIE_PHY_TRSV_CMN_REG062);
+ writel(0x15, pbase + FSD_PCIE_PHY_TRSV_CMN_REG03);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG039_LN_N, 0xf);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG03B_LN_N, 0x13);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG03C_LN_N, 0x66);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG044_LN_N, 0x57);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG03E_LN_N, 0x10);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG03F_LN_N, 0x44);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG043_LN_N, 0x11);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG046_LN_N, 0xef);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG048_LN_N, 0x06);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG049_LN_N, 0xaf);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG04E_LN_N, 0x28);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG068_LN_N, 0x1f);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG069_LN_N, 0xc);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG06A_LN_N, 0x8);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG06B_LN_N, 0x78);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG083_LN_N, 0xa);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG084_LN_N, 0x80);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG087_LN_N, 0x30);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG08B_LN_N, 0xa0);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG09C_LN_N, 0xf7);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG09E_LN_N, 0x33);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG0A2_LN_N, 0xfa);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG0A4_LN_N, 0xf2);
+ writel(0x8, pbase + FSD_PCIE_PHY_TRSV_REG0CE_LN_N);
+ writel(0x9, pbase + FSD_PCIE_PHY_TRSV_REG0CE_LN_1);
+ writel(0x9, pbase + FSD_PCIE_PHY_TRSV_REG0CE_LN_2);
+ writel(0x9, pbase + FSD_PCIE_PHY_TRSV_REG0CE_LN_3);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG0FE_LN_N, 0x33);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG001_LN_N, 0x3f);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG005_LN_N, 0x2b);
+}
+
+static void fsd_pcie_phy0_init(struct exynos_pcie_phy *phy_ctrl)
+{
+ void __iomem *pbase = phy_ctrl->base;
+
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG07B_LN_N, 0x20);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG052_LN_N, 0x00);
+ writel(0x11, pbase + FSD_PCIE_PHY_TRSV_CMN_REG05F);
+ writel(0x23, pbase + FSD_PCIE_PHY_TRSV_CMN_REG060);
+ writel(0x0, pbase + FSD_PCIE_PHY_TRSV_CMN_REG062);
+ writel(0x15, pbase + FSD_PCIE_PHY_TRSV_CMN_REG03);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG0CE_LN_N, 0x8);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG039_LN_N, 0xf);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG03B_LN_N, 0x13);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG03C_LN_N, 0xf6);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG044_LN_N, 0x57);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG03E_LN_N, 0x10);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG03F_LN_N, 0x04);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG043_LN_N, 0x11);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG049_LN_N, 0x6f);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG04E_LN_N, 0x18);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG068_LN_N, 0x1f);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG069_LN_N, 0xc);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG06B_LN_N, 0x78);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG083_LN_N, 0xa);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG084_LN_N, 0x80);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG086_LN_N, 0xff);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG087_LN_N, 0x3c);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG09D_LN_N, 0x7c);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG09E_LN_N, 0x33);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG09F_LN_N, 0x33);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG001_LN_N, 0x3f);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG002_LN_N, 0x1c);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG005_LN_N, 0x2b);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG006_LN_N, 0x3);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG007_LN_N, 0x0c);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG009_LN_N, 0x10);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG00A_LN_N, 0x1);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG00C_LN_N, 0x93);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG012_LN_N, 0x1);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG013_LN_N, 0x0);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG014_LN_N, 0x70);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG015_LN_N, 0x0);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG016_LN_N, 0x70);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG0FC_LN_N, 0x80);
+ fsd_pcie_phy_writel(phy_ctrl, FSD_PCIE_PHY_TRSV_REG0FD_LN_N, 0x0);
+}
+
+static int fsd_pcie_phy_init(struct phy *phy)
+{
+ struct exynos_pcie_phy *phy_ctrl = phy_get_drvdata(phy);
+ void __iomem *phy_base = phy_ctrl->base;
+ const struct fsd_pcie_phy_pdata *pdata = &fsd_phy_con[phy_ctrl->phy_id];
+
+ fsd_pcie_phy_reset(phy);
+
+ if (phy_ctrl->phy_id == 1)
+ writel(0x2, phy_base + FSD_PCIE_PHY_CMN_RESET);
+
+ writel(0x00, phy_ctrl->pcs_base + FSD_PCIE_PCS_BRF_0);
+ writel(0x00, phy_ctrl->pcs_base + FSD_PCIE_PCS_BRF_1);
+ writel(0x00, phy_base + FSD_PCIE_PHY_AGG_BIF_RESET);
+ writel(0x00, phy_base + FSD_PCIE_PHY_AGG_BIF_CLOCK);
+
+ if (phy_ctrl->phy_id == 1) {
+ fsd_pcie_phy1_init(phy_ctrl);
+ writel(0x3, phy_base + FSD_PCIE_PHY_CMN_RESET);
+ } else {
+ fsd_pcie_phy0_init(phy_ctrl);
+ }
+
+ regmap_update_bits(phy_ctrl->fsysreg, pdata->phy_con_offset,
+ pdata->phy_cmn_rstn, pdata->phy_cmn_rstn);
+
+ return 0;
+}
+
+static const struct phy_ops fsd_phy_ops = {
+ .init = fsd_pcie_phy_init,
+ .reset = fsd_pcie_phy_reset,
+ .owner = THIS_MODULE,
+};
+
+static const struct samsung_drv_data exynos5433_drv_data = {
+ .phy_ops = &exynos5433_phy_ops,
+};
+
+static const struct samsung_drv_data fsd_drv_data = {
+ .phy_ops = &fsd_phy_ops,
+};
+
static const struct of_device_id exynos_pcie_phy_match[] = {
{
.compatible = "samsung,exynos5433-pcie-phy",
+ .data = &exynos5433_drv_data,
+ },
+ {
+ .compatible = "tesla,fsd-pcie-phy",
+ .data = &fsd_drv_data,
},
{},
};
@@ -146,11 +451,18 @@ static int exynos_pcie_phy_probe(struct platform_device *pdev)
struct exynos_pcie_phy *exynos_phy;
struct phy *generic_phy;
struct phy_provider *phy_provider;
+ const struct samsung_drv_data *drv_data;
+
+ drv_data = of_device_get_match_data(dev);
+ if (!drv_data)
+ return -ENODEV;
exynos_phy = devm_kzalloc(dev, sizeof(*exynos_phy), GFP_KERNEL);
if (!exynos_phy)
return -ENOMEM;
+ exynos_phy->drv_data = drv_data;
+
exynos_phy->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(exynos_phy->base))
return PTR_ERR(exynos_phy->base);
@@ -169,12 +481,15 @@ static int exynos_pcie_phy_probe(struct platform_device *pdev)
return PTR_ERR(exynos_phy->fsysreg);
}
- generic_phy = devm_phy_create(dev, dev->of_node, &exynos5433_phy_ops);
+ generic_phy = devm_phy_create(dev, dev->of_node, drv_data->phy_ops);
if (IS_ERR(generic_phy)) {
dev_err(dev, "failed to create PHY\n");
return PTR_ERR(generic_phy);
}
+ exynos_phy->pcs_base = devm_platform_ioremap_resource(pdev, 1);
+
+ exynos_phy->phy_id = of_alias_get_id(dev->of_node, "pciephy");
phy_set_drvdata(generic_phy, exynos_phy);
phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
--
2.49.0
Powered by blists - more mailing lists