diff options
author | Swapnil Jakhade <sjakhade@cadence.com> | 2020-09-17 09:30:41 +0200 |
---|---|---|
committer | Vinod Koul <vkoul@kernel.org> | 2020-09-18 10:47:20 +0530 |
commit | cd9aa94737477c9d7cd8595ebc3558b00403f093 (patch) | |
tree | 168aa1cfb8edc0e369b5da4089d7f13f7258e3ec /drivers | |
parent | 07084c9566635fa1029502e79315a7fe785b80f4 (diff) |
phy: cadence-torrent: Add PHY link configuration sequences for single link
Add support to configure link_cmn_vals and xcvr_diag_vals in case of single
link PHY configuration.
Signed-off-by: Swapnil Jakhade <sjakhade@cadence.com>
Link: https://lore.kernel.org/r/1600327846-9733-9-git-send-email-sjakhade@cadence.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/phy/cadence/phy-cadence-torrent.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/drivers/phy/cadence/phy-cadence-torrent.c b/drivers/phy/cadence/phy-cadence-torrent.c index 6641f2f3a367..0367c0fe15e2 100644 --- a/drivers/phy/cadence/phy-cadence-torrent.c +++ b/drivers/phy/cadence/phy-cadence-torrent.c @@ -1809,6 +1809,7 @@ static int cdns_torrent_phy_init(struct phy *phy) struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent); const struct cdns_torrent_data *init_data = cdns_phy->init_data; struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals; + struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals; struct cdns_torrent_inst *inst = phy_get_drvdata(phy); enum cdns_torrent_phy_type phy_type = inst->phy_type; enum cdns_torrent_ssc_mode ssc = inst->ssc_mode; @@ -1823,6 +1824,29 @@ static int cdns_torrent_phy_init(struct phy *phy) if (phy_type == TYPE_DP) return cdns_torrent_dp_init(phy); + /* PHY configuration specific registers for single link */ + link_cmn_vals = init_data->link_cmn_vals[phy_type][TYPE_NONE][ssc]; + if (link_cmn_vals) { + reg_pairs = link_cmn_vals->reg_pairs; + num_regs = link_cmn_vals->num_regs; + regmap = cdns_phy->regmap_common_cdb; + for (i = 0; i < num_regs; i++) + regmap_write(regmap, reg_pairs[i].off, + reg_pairs[i].val); + } + + xcvr_diag_vals = init_data->xcvr_diag_vals[phy_type][TYPE_NONE][ssc]; + if (xcvr_diag_vals) { + reg_pairs = xcvr_diag_vals->reg_pairs; + num_regs = xcvr_diag_vals->num_regs; + for (i = 0; i < inst->num_lanes; i++) { + regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane]; + for (j = 0; j < num_regs; j++) + regmap_write(regmap, reg_pairs[j].off, + reg_pairs[j].val); + } + } + /* PMA common registers configurations */ cmn_vals = init_data->cmn_vals[phy_type][TYPE_NONE][ssc]; if (cmn_vals) { @@ -2643,6 +2667,11 @@ static const struct cdns_torrent_data cdns_map_torrent = { .reg_offset_shift = 0x2, .link_cmn_vals = { [TYPE_PCIE] = { + [TYPE_NONE] = { + [NO_SSC] = NULL, + [EXTERNAL_SSC] = NULL, + [INTERNAL_SSC] = NULL, + }, [TYPE_SGMII] = { [NO_SSC] = &pcie_sgmii_link_cmn_vals, [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, @@ -2671,6 +2700,11 @@ static const struct cdns_torrent_data cdns_map_torrent = { }, .xcvr_diag_vals = { [TYPE_PCIE] = { + [TYPE_NONE] = { + [NO_SSC] = NULL, + [EXTERNAL_SSC] = NULL, + [INTERNAL_SSC] = NULL, + }, [TYPE_SGMII] = { [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, @@ -2803,6 +2837,11 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = { .reg_offset_shift = 0x1, .link_cmn_vals = { [TYPE_PCIE] = { + [TYPE_NONE] = { + [NO_SSC] = NULL, + [EXTERNAL_SSC] = NULL, + [INTERNAL_SSC] = NULL, + }, [TYPE_SGMII] = { [NO_SSC] = &pcie_sgmii_link_cmn_vals, [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, @@ -2831,6 +2870,11 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = { }, .xcvr_diag_vals = { [TYPE_PCIE] = { + [TYPE_NONE] = { + [NO_SSC] = NULL, + [EXTERNAL_SSC] = NULL, + [INTERNAL_SSC] = NULL, + }, [TYPE_SGMII] = { [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, |