|
|
@@ -139,7 +139,7 @@
|
|
|
#define SIERRA_PHY_PLL_CFG 0xe
|
|
|
|
|
|
#define SIERRA_MACRO_ID 0x00007364
|
|
|
-#define SIERRA_MAX_LANES 4
|
|
|
+#define SIERRA_MAX_LANES 16
|
|
|
#define PLL_LOCK_TIME 100000
|
|
|
|
|
|
static const struct reg_field macro_id_type =
|
|
|
@@ -197,6 +197,7 @@ struct cdns_sierra_phy {
|
|
|
struct regmap_field *pllctrl_lock[SIERRA_MAX_LANES];
|
|
|
struct clk *clk;
|
|
|
int nsubnodes;
|
|
|
+ u32 num_lanes;
|
|
|
bool autoconf;
|
|
|
};
|
|
|
|
|
|
@@ -233,6 +234,18 @@ static struct regmap_config cdns_sierra_lane_cdb_config[] = {
|
|
|
SIERRA_LANE_CDB_REGMAP_CONF("1"),
|
|
|
SIERRA_LANE_CDB_REGMAP_CONF("2"),
|
|
|
SIERRA_LANE_CDB_REGMAP_CONF("3"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("4"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("5"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("6"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("7"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("8"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("9"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("10"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("11"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("12"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("13"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("14"),
|
|
|
+ SIERRA_LANE_CDB_REGMAP_CONF("15"),
|
|
|
};
|
|
|
|
|
|
static struct regmap_config cdns_sierra_common_cdb_config = {
|
|
|
@@ -546,6 +559,8 @@ static int cdns_sierra_phy_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ sp->num_lanes += sp->phys[node].num_lanes;
|
|
|
+
|
|
|
gphy = devm_phy_create(dev, child, &ops);
|
|
|
|
|
|
if (IS_ERR(gphy)) {
|
|
|
@@ -559,6 +574,11 @@ static int cdns_sierra_phy_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
sp->nsubnodes = node;
|
|
|
|
|
|
+ if (sp->num_lanes > SIERRA_MAX_LANES) {
|
|
|
+ dev_err(dev, "Invalid lane configuration\n");
|
|
|
+ goto put_child2;
|
|
|
+ }
|
|
|
+
|
|
|
/* If more than one subnode, configure the PHY as multilink */
|
|
|
if (!sp->autoconf && sp->nsubnodes > 1)
|
|
|
regmap_field_write(sp->phy_pll_cfg_1, 0x1);
|