Commit 6f9d713f authored by Vinod Koul's avatar Vinod Koul

Merge branch 'fixes' into next

This brings rockchip,pcie3-phy changes into next which incoming patches
are dependent on
parents 0338e1d2 47b3e2f3
...@@ -110,8 +110,10 @@ static int imx8_pcie_phy_power_on(struct phy *phy) ...@@ -110,8 +110,10 @@ static int imx8_pcie_phy_power_on(struct phy *phy)
/* Source clock from SoC internal PLL */ /* Source clock from SoC internal PLL */
writel(ANA_PLL_CLK_OUT_TO_EXT_IO_SEL, writel(ANA_PLL_CLK_OUT_TO_EXT_IO_SEL,
imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG062); imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG062);
writel(AUX_PLL_REFCLK_SEL_SYS_PLL, if (imx8_phy->drvdata->variant != IMX8MM) {
imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG063); writel(AUX_PLL_REFCLK_SEL_SYS_PLL,
imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG063);
}
val = ANA_AUX_RX_TX_SEL_TX | ANA_AUX_TX_TERM; val = ANA_AUX_RX_TX_SEL_TX | ANA_AUX_TX_TERM;
writel(val | ANA_AUX_RX_TERM_GND_EN, writel(val | ANA_AUX_RX_TERM_GND_EN,
imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG064); imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG064);
......
...@@ -603,7 +603,7 @@ static void comphy_gbe_phy_init(struct mvebu_a3700_comphy_lane *lane, ...@@ -603,7 +603,7 @@ static void comphy_gbe_phy_init(struct mvebu_a3700_comphy_lane *lane,
u16 val; u16 val;
fix_idx = 0; fix_idx = 0;
for (addr = 0; addr < 512; addr++) { for (addr = 0; addr < ARRAY_SIZE(gbe_phy_init); addr++) {
/* /*
* All PHY register values are defined in full for 3.125Gbps * All PHY register values are defined in full for 3.125Gbps
* SERDES speed. The values required for 1.25 Gbps are almost * SERDES speed. The values required for 1.25 Gbps are almost
...@@ -611,11 +611,12 @@ static void comphy_gbe_phy_init(struct mvebu_a3700_comphy_lane *lane, ...@@ -611,11 +611,12 @@ static void comphy_gbe_phy_init(struct mvebu_a3700_comphy_lane *lane,
* comparison to 3.125 Gbps values. These register values are * comparison to 3.125 Gbps values. These register values are
* stored in "gbe_phy_init_fix" array. * stored in "gbe_phy_init_fix" array.
*/ */
if (!is_1gbps && gbe_phy_init_fix[fix_idx].addr == addr) { if (!is_1gbps &&
fix_idx < ARRAY_SIZE(gbe_phy_init_fix) &&
gbe_phy_init_fix[fix_idx].addr == addr) {
/* Use new value */ /* Use new value */
val = gbe_phy_init_fix[fix_idx].value; val = gbe_phy_init_fix[fix_idx].value;
if (fix_idx < ARRAY_SIZE(gbe_phy_init_fix)) fix_idx++;
fix_idx++;
} else { } else {
val = gbe_phy_init[addr]; val = gbe_phy_init[addr];
} }
......
...@@ -297,7 +297,7 @@ static int m31usb_phy_probe(struct platform_device *pdev) ...@@ -297,7 +297,7 @@ static int m31usb_phy_probe(struct platform_device *pdev)
return dev_err_probe(dev, PTR_ERR(qphy->phy), return dev_err_probe(dev, PTR_ERR(qphy->phy),
"failed to create phy\n"); "failed to create phy\n");
qphy->vreg = devm_regulator_get(dev, "vdda-phy"); qphy->vreg = devm_regulator_get(dev, "vdd");
if (IS_ERR(qphy->vreg)) if (IS_ERR(qphy->vreg))
return dev_err_probe(dev, PTR_ERR(qphy->vreg), return dev_err_probe(dev, PTR_ERR(qphy->vreg),
"failed to get vreg\n"); "failed to get vreg\n");
......
...@@ -77,6 +77,7 @@ enum qphy_reg_layout { ...@@ -77,6 +77,7 @@ enum qphy_reg_layout {
QPHY_COM_BIAS_EN_CLKBUFLR_EN, QPHY_COM_BIAS_EN_CLKBUFLR_EN,
QPHY_DP_PHY_STATUS, QPHY_DP_PHY_STATUS,
QPHY_DP_PHY_VCO_DIV,
QPHY_TX_TX_POL_INV, QPHY_TX_TX_POL_INV,
QPHY_TX_TX_DRV_LVL, QPHY_TX_TX_DRV_LVL,
...@@ -102,6 +103,7 @@ static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { ...@@ -102,6 +103,7 @@ static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
[QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN,
[QPHY_DP_PHY_STATUS] = QSERDES_V3_DP_PHY_STATUS, [QPHY_DP_PHY_STATUS] = QSERDES_V3_DP_PHY_STATUS,
[QPHY_DP_PHY_VCO_DIV] = QSERDES_V3_DP_PHY_VCO_DIV,
[QPHY_TX_TX_POL_INV] = QSERDES_V3_TX_TX_POL_INV, [QPHY_TX_TX_POL_INV] = QSERDES_V3_TX_TX_POL_INV,
[QPHY_TX_TX_DRV_LVL] = QSERDES_V3_TX_TX_DRV_LVL, [QPHY_TX_TX_DRV_LVL] = QSERDES_V3_TX_TX_DRV_LVL,
...@@ -126,6 +128,7 @@ static const unsigned int qmp_v45_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { ...@@ -126,6 +128,7 @@ static const unsigned int qmp_v45_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
[QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN,
[QPHY_DP_PHY_STATUS] = QSERDES_V4_DP_PHY_STATUS, [QPHY_DP_PHY_STATUS] = QSERDES_V4_DP_PHY_STATUS,
[QPHY_DP_PHY_VCO_DIV] = QSERDES_V4_DP_PHY_VCO_DIV,
[QPHY_TX_TX_POL_INV] = QSERDES_V4_TX_TX_POL_INV, [QPHY_TX_TX_POL_INV] = QSERDES_V4_TX_TX_POL_INV,
[QPHY_TX_TX_DRV_LVL] = QSERDES_V4_TX_TX_DRV_LVL, [QPHY_TX_TX_DRV_LVL] = QSERDES_V4_TX_TX_DRV_LVL,
...@@ -2202,9 +2205,9 @@ static bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp) ...@@ -2202,9 +2205,9 @@ static bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp)
writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
if (reverse) if (reverse)
writel(0x4c, qmp->pcs + QSERDES_DP_PHY_MODE); writel(0x4c, qmp->dp_dp_phy + QSERDES_DP_PHY_MODE);
else else
writel(0x5c, qmp->pcs + QSERDES_DP_PHY_MODE); writel(0x5c, qmp->dp_dp_phy + QSERDES_DP_PHY_MODE);
return reverse; return reverse;
} }
...@@ -2214,6 +2217,7 @@ static int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp) ...@@ -2214,6 +2217,7 @@ static int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp)
const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
u32 phy_vco_div; u32 phy_vco_div;
unsigned long pixel_freq; unsigned long pixel_freq;
const struct qmp_phy_cfg *cfg = qmp->cfg;
switch (dp_opts->link_rate) { switch (dp_opts->link_rate) {
case 1620: case 1620:
...@@ -2236,7 +2240,7 @@ static int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp) ...@@ -2236,7 +2240,7 @@ static int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp)
/* Other link rates aren't supported */ /* Other link rates aren't supported */
return -EINVAL; return -EINVAL;
} }
writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_VCO_DIV); writel(phy_vco_div, qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_VCO_DIV]);
clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000); clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000);
clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq); clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq);
......
...@@ -125,12 +125,15 @@ struct rockchip_combphy_grfcfg { ...@@ -125,12 +125,15 @@ struct rockchip_combphy_grfcfg {
}; };
struct rockchip_combphy_cfg { struct rockchip_combphy_cfg {
unsigned int num_phys;
unsigned int phy_ids[3];
const struct rockchip_combphy_grfcfg *grfcfg; const struct rockchip_combphy_grfcfg *grfcfg;
int (*combphy_cfg)(struct rockchip_combphy_priv *priv); int (*combphy_cfg)(struct rockchip_combphy_priv *priv);
}; };
struct rockchip_combphy_priv { struct rockchip_combphy_priv {
u8 type; u8 type;
int id;
void __iomem *mmio; void __iomem *mmio;
int num_clks; int num_clks;
struct clk_bulk_data *clks; struct clk_bulk_data *clks;
...@@ -320,7 +323,7 @@ static int rockchip_combphy_probe(struct platform_device *pdev) ...@@ -320,7 +323,7 @@ static int rockchip_combphy_probe(struct platform_device *pdev)
struct rockchip_combphy_priv *priv; struct rockchip_combphy_priv *priv;
const struct rockchip_combphy_cfg *phy_cfg; const struct rockchip_combphy_cfg *phy_cfg;
struct resource *res; struct resource *res;
int ret; int ret, id;
phy_cfg = of_device_get_match_data(dev); phy_cfg = of_device_get_match_data(dev);
if (!phy_cfg) { if (!phy_cfg) {
...@@ -338,6 +341,15 @@ static int rockchip_combphy_probe(struct platform_device *pdev) ...@@ -338,6 +341,15 @@ static int rockchip_combphy_probe(struct platform_device *pdev)
return ret; return ret;
} }
/* find the phy-id from the io address */
priv->id = -ENODEV;
for (id = 0; id < phy_cfg->num_phys; id++) {
if (res->start == phy_cfg->phy_ids[id]) {
priv->id = id;
break;
}
}
priv->dev = dev; priv->dev = dev;
priv->type = PHY_NONE; priv->type = PHY_NONE;
priv->cfg = phy_cfg; priv->cfg = phy_cfg;
...@@ -562,6 +574,12 @@ static const struct rockchip_combphy_grfcfg rk3568_combphy_grfcfgs = { ...@@ -562,6 +574,12 @@ static const struct rockchip_combphy_grfcfg rk3568_combphy_grfcfgs = {
}; };
static const struct rockchip_combphy_cfg rk3568_combphy_cfgs = { static const struct rockchip_combphy_cfg rk3568_combphy_cfgs = {
.num_phys = 3,
.phy_ids = {
0xfe820000,
0xfe830000,
0xfe840000,
},
.grfcfg = &rk3568_combphy_grfcfgs, .grfcfg = &rk3568_combphy_grfcfgs,
.combphy_cfg = rk3568_combphy_cfg, .combphy_cfg = rk3568_combphy_cfg,
}; };
...@@ -578,8 +596,14 @@ static int rk3588_combphy_cfg(struct rockchip_combphy_priv *priv) ...@@ -578,8 +596,14 @@ static int rk3588_combphy_cfg(struct rockchip_combphy_priv *priv)
rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_pcie, true); rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_pcie, true);
rockchip_combphy_param_write(priv->phy_grf, &cfg->con2_for_pcie, true); rockchip_combphy_param_write(priv->phy_grf, &cfg->con2_for_pcie, true);
rockchip_combphy_param_write(priv->phy_grf, &cfg->con3_for_pcie, true); rockchip_combphy_param_write(priv->phy_grf, &cfg->con3_for_pcie, true);
rockchip_combphy_param_write(priv->pipe_grf, &cfg->pipe_pcie1l0_sel, true); switch (priv->id) {
rockchip_combphy_param_write(priv->pipe_grf, &cfg->pipe_pcie1l1_sel, true); case 1:
rockchip_combphy_param_write(priv->pipe_grf, &cfg->pipe_pcie1l0_sel, true);
break;
case 2:
rockchip_combphy_param_write(priv->pipe_grf, &cfg->pipe_pcie1l1_sel, true);
break;
}
break; break;
case PHY_TYPE_USB3: case PHY_TYPE_USB3:
/* Set SSC downward spread spectrum */ /* Set SSC downward spread spectrum */
...@@ -736,6 +760,12 @@ static const struct rockchip_combphy_grfcfg rk3588_combphy_grfcfgs = { ...@@ -736,6 +760,12 @@ static const struct rockchip_combphy_grfcfg rk3588_combphy_grfcfgs = {
}; };
static const struct rockchip_combphy_cfg rk3588_combphy_cfgs = { static const struct rockchip_combphy_cfg rk3588_combphy_cfgs = {
.num_phys = 3,
.phy_ids = {
0xfee00000,
0xfee10000,
0xfee20000,
},
.grfcfg = &rk3588_combphy_grfcfgs, .grfcfg = &rk3588_combphy_grfcfgs,
.combphy_cfg = rk3588_combphy_cfg, .combphy_cfg = rk3588_combphy_cfg,
}; };
......
...@@ -40,6 +40,8 @@ ...@@ -40,6 +40,8 @@
#define RK3588_BIFURCATION_LANE_0_1 BIT(0) #define RK3588_BIFURCATION_LANE_0_1 BIT(0)
#define RK3588_BIFURCATION_LANE_2_3 BIT(1) #define RK3588_BIFURCATION_LANE_2_3 BIT(1)
#define RK3588_LANE_AGGREGATION BIT(2) #define RK3588_LANE_AGGREGATION BIT(2)
#define RK3588_PCIE1LN_SEL_EN (GENMASK(1, 0) << 16)
#define RK3588_PCIE30_PHY_MODE_EN (GENMASK(2, 0) << 16)
struct rockchip_p3phy_ops; struct rockchip_p3phy_ops;
...@@ -132,7 +134,7 @@ static const struct rockchip_p3phy_ops rk3568_ops = { ...@@ -132,7 +134,7 @@ static const struct rockchip_p3phy_ops rk3568_ops = {
static int rockchip_p3phy_rk3588_init(struct rockchip_p3phy_priv *priv) static int rockchip_p3phy_rk3588_init(struct rockchip_p3phy_priv *priv)
{ {
u32 reg = 0; u32 reg = 0;
u8 mode = 0; u8 mode = RK3588_LANE_AGGREGATION; /* default */
int ret; int ret;
/* Deassert PCIe PMA output clamp mode */ /* Deassert PCIe PMA output clamp mode */
...@@ -140,31 +142,24 @@ static int rockchip_p3phy_rk3588_init(struct rockchip_p3phy_priv *priv) ...@@ -140,31 +142,24 @@ static int rockchip_p3phy_rk3588_init(struct rockchip_p3phy_priv *priv)
/* Set bifurcation if needed */ /* Set bifurcation if needed */
for (int i = 0; i < priv->num_lanes; i++) { for (int i = 0; i < priv->num_lanes; i++) {
if (!priv->lanes[i])
mode |= (BIT(i) << 3);
if (priv->lanes[i] > 1) if (priv->lanes[i] > 1)
mode |= (BIT(i) >> 1); mode &= ~RK3588_LANE_AGGREGATION;
} if (priv->lanes[i] == 3)
mode |= RK3588_BIFURCATION_LANE_0_1;
if (!mode) if (priv->lanes[i] == 4)
reg = RK3588_LANE_AGGREGATION; mode |= RK3588_BIFURCATION_LANE_2_3;
else {
if (mode & (BIT(0) | BIT(1)))
reg |= RK3588_BIFURCATION_LANE_0_1;
if (mode & (BIT(2) | BIT(3)))
reg |= RK3588_BIFURCATION_LANE_2_3;
} }
regmap_write(priv->phy_grf, RK3588_PCIE3PHY_GRF_CMN_CON0, (0x7<<16) | reg); reg = mode;
regmap_write(priv->phy_grf, RK3588_PCIE3PHY_GRF_CMN_CON0,
RK3588_PCIE30_PHY_MODE_EN | reg);
/* Set pcie1ln_sel in PHP_GRF_PCIESEL_CON */ /* Set pcie1ln_sel in PHP_GRF_PCIESEL_CON */
if (!IS_ERR(priv->pipe_grf)) { if (!IS_ERR(priv->pipe_grf)) {
reg = (mode & (BIT(6) | BIT(7))) >> 6; reg = mode & (RK3588_BIFURCATION_LANE_0_1 | RK3588_BIFURCATION_LANE_2_3);
if (reg) if (reg)
regmap_write(priv->pipe_grf, PHP_GRF_PCIESEL_CON, regmap_write(priv->pipe_grf, PHP_GRF_PCIESEL_CON,
(reg << 16) | reg); RK3588_PCIE1LN_SEL_EN | reg);
} }
reset_control_deassert(priv->p30phy); reset_control_deassert(priv->p30phy);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment