@@ -31,13 +31,19 @@ enum airoha_pcie_port_gen {
31
31
* @csr_2l: Analogic lane IO mapped register base address
32
32
* @pma0: IO mapped register base address of PMA0-PCIe
33
33
* @pma1: IO mapped register base address of PMA1-PCIe
34
+ * @p0_xr_dtime: IO mapped register base address of port0 Tx-Rx detection time
35
+ * @p1_xr_dtime: IO mapped register base address of port1 Tx-Rx detection time
36
+ * @rx_aeq: IO mapped register base address of Rx AEQ training
34
37
*/
35
38
struct airoha_pcie_phy {
36
39
struct device * dev ;
37
40
struct phy * phy ;
38
41
void __iomem * csr_2l ;
39
42
void __iomem * pma0 ;
40
43
void __iomem * pma1 ;
44
+ void __iomem * p0_xr_dtime ;
45
+ void __iomem * p1_xr_dtime ;
46
+ void __iomem * rx_aeq ;
41
47
};
42
48
43
49
static void airoha_phy_clear_bits (void __iomem * reg , u32 mask )
@@ -1101,6 +1107,21 @@ static void airoha_pcie_phy_load_kflow(struct airoha_pcie_phy *pcie_phy)
1101
1107
static int airoha_pcie_phy_init (struct phy * phy )
1102
1108
{
1103
1109
struct airoha_pcie_phy * pcie_phy = phy_get_drvdata (phy );
1110
+ u32 val ;
1111
+
1112
+ /* Setup Tx-Rx detection time */
1113
+ val = FIELD_PREP (PCIE_XTP_RXDET_VCM_OFF_STB_T_SEL , 0x33 ) |
1114
+ FIELD_PREP (PCIE_XTP_RXDET_EN_STB_T_SEL , 0x1 ) |
1115
+ FIELD_PREP (PCIE_XTP_RXDET_FINISH_STB_T_SEL , 0x2 ) |
1116
+ FIELD_PREP (PCIE_XTP_TXPD_TX_DATA_EN_DLY , 0x3 ) |
1117
+ FIELD_PREP (PCIE_XTP_RXDET_LATCH_STB_T_SEL , 0x1 );
1118
+ writel (val , pcie_phy -> p0_xr_dtime + REG_PCIE_PEXTP_DIG_GLB44 );
1119
+ writel (val , pcie_phy -> p1_xr_dtime + REG_PCIE_PEXTP_DIG_GLB44 );
1120
+ /* Setup Rx AEQ training time */
1121
+ val = FIELD_PREP (PCIE_XTP_LN_RX_PDOWN_L1P2_EXIT_WAIT , 0x32 ) |
1122
+ FIELD_PREP (PCIE_XTP_LN_RX_PDOWN_E0_AEQEN_WAIT , 0x5050 );
1123
+ writel (val , pcie_phy -> rx_aeq + REG_PCIE_PEXTP_DIG_LN_RX30_P0 );
1124
+ writel (val , pcie_phy -> rx_aeq + REG_PCIE_PEXTP_DIG_LN_RX30_P1 );
1104
1125
1105
1126
/* enable load FLL-K flow */
1106
1127
airoha_phy_pma0_set_bits (pcie_phy , REG_PCIE_PMA_DIG_RESERVE_14 ,
@@ -1217,6 +1238,23 @@ static int airoha_pcie_phy_probe(struct platform_device *pdev)
1217
1238
return dev_err_probe (dev , PTR_ERR (pcie_phy -> phy ),
1218
1239
"Failed to create PCIe phy\n" );
1219
1240
1241
+ pcie_phy -> p0_xr_dtime =
1242
+ devm_platform_ioremap_resource_byname (pdev , "p0-xr-dtime" );
1243
+ if (IS_ERR (pcie_phy -> p0_xr_dtime ))
1244
+ return dev_err_probe (dev , PTR_ERR (pcie_phy -> p0_xr_dtime ),
1245
+ "Failed to map P0 Tx-Rx dtime base\n" );
1246
+
1247
+ pcie_phy -> p1_xr_dtime =
1248
+ devm_platform_ioremap_resource_byname (pdev , "p1-xr-dtime" );
1249
+ if (IS_ERR (pcie_phy -> p1_xr_dtime ))
1250
+ return dev_err_probe (dev , PTR_ERR (pcie_phy -> p1_xr_dtime ),
1251
+ "Failed to map P1 Tx-Rx dtime base\n" );
1252
+
1253
+ pcie_phy -> rx_aeq = devm_platform_ioremap_resource_byname (pdev , "rx-aeq" );
1254
+ if (IS_ERR (pcie_phy -> rx_aeq ))
1255
+ return dev_err_probe (dev , PTR_ERR (pcie_phy -> rx_aeq ),
1256
+ "Failed to map Rx AEQ base\n" );
1257
+
1220
1258
pcie_phy -> dev = dev ;
1221
1259
phy_set_drvdata (pcie_phy -> phy , pcie_phy );
1222
1260
0 commit comments