[PATCH 2/2] phy: rockchip-naneng-combo: Support rk3576
Frank Wang
frawang.cn at gmail.com
Mon Oct 14 23:58:40 PDT 2024
Hi Heiko,
On 2024/10/15 14:15, Heiko Stübner wrote:
> Hi Frank,
>
> Am Dienstag, 15. Oktober 2024, 03:33:51 CEST schrieb Frank Wang:
>> From: Kever Yang <kever.yang at rock-chips.com>
>>
>> phy0: pcie, sata
>> phy1: pcie, sata, usb3
>>
>> Signed-off-by: Kever Yang <kever.yang at rock-chips.com>
>> Signed-off-by: William Wu <william.wu at rock-chips.com>
>> Signed-off-by: Frank Wang <frank.wang at rock-chips.com>
>> ---
>> .../rockchip/phy-rockchip-naneng-combphy.c | 202 ++++++++++++++++++
>> 1 file changed, 202 insertions(+)
>>
>> diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
>> index 0a9989e41237..4c41317a8041 100644
>> --- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
>> +++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
>> @@ -584,6 +585,203 @@ static const struct rockchip_combphy_cfg rk3568_combphy_cfgs = {
>> .combphy_cfg = rk3568_combphy_cfg,
>> };
>>
>> +static int rk3576_combphy_cfg(struct rockchip_combphy_priv *priv)
>> +{
>> + const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
>> + unsigned long rate;
>> +
>> + switch (priv->type) {
>> + case PHY_TYPE_PCIE:
>> + /* Set SSC downward spread spectrum */
>> + rockchip_combphy_updatel(priv, GENMASK(5, 4), BIT(4), 0x7c);
> Can we get constants for those magic values please?
Ah of cause, I will amend them and send a new patch.
Best regards,
Frank
> The combophys for rk3568 and rk3588 do use actual constants to at least
> somewhat describe what happens, so it would be really nice for the rk3576
> to do this as well.
>
> Same for the rockchip_combphy_updatel and other writel calls below.
>
>
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_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->con3_for_pcie, true);
>> + break;
>> + case PHY_TYPE_USB3:
>> + /* Set SSC downward spread spectrum */
>> + rockchip_combphy_updatel(priv, GENMASK(5, 4), BIT(4), 0x7c);
>> +
>> + /* Enable adaptive CTLE for USB3.0 Rx */
>> + rockchip_combphy_updatel(priv, GENMASK(0, 0), BIT(0), 0x38);
>> +
>> + /* Set PLL KVCO fine tuning signals */
>> + rockchip_combphy_updatel(priv, GENMASK(4, 2), BIT(3), 0x80);
>> +
>> + /* Set PLL LPF R1 to su_trim[10:7]=1001 */
>> + writel(0x4, priv->mmio + (0xb << 2));
>> +
>> + /* Set PLL input clock divider 1/2 */
>> + rockchip_combphy_updatel(priv, GENMASK(7, 6), BIT(6), 0x14);
>> +
>> + /* Set PLL loop divider */
>> + writel(0x32, priv->mmio + (0x11 << 2));
>> +
>> + /* Set PLL KVCO to min and set PLL charge pump current to max */
>> + writel(0xf0, priv->mmio + (0xa << 2));
>> +
>> + /* Set Rx squelch input filler bandwidth */
>> + writel(0x0d, priv->mmio + (0x14 << 2));
>> +
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->usb_mode_set, true);
>> + break;
>> + case PHY_TYPE_SATA:
>> + /* Enable adaptive CTLE for SATA Rx */
>> + rockchip_combphy_updatel(priv, GENMASK(0, 0), BIT(0), 0x38);
>> +
>> + /* Set tx_rterm = 50 ohm and rx_rterm = 43.5 ohm */
>> + writel(0x8F, priv->mmio + (0x06 << 2));
>> +
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_for_sata, true);
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_sata, true);
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->con2_for_sata, true);
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->con3_for_sata, true);
>> + rockchip_combphy_param_write(priv->pipe_grf, &cfg->pipe_con0_for_sata, true);
>> + rockchip_combphy_param_write(priv->pipe_grf, &cfg->pipe_con1_for_sata, true);
>> + break;
>> + default:
>> + dev_err(priv->dev, "incompatible PHY type\n");
>> + return -EINVAL;
>> + }
>> +
>> + rate = clk_get_rate(priv->refclk);
>> +
>> + switch (rate) {
>> + case REF_CLOCK_24MHz:
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_24m, true);
>> + if (priv->type == PHY_TYPE_USB3 || priv->type == PHY_TYPE_SATA) {
>> + /* Set ssc_cnt[9:0]=0101111101 & 31.5KHz */
>> + rockchip_combphy_updatel(priv, GENMASK(7, 6), BIT(6), 0xe << 2);
>> +
>> + rockchip_combphy_updatel(priv, GENMASK(7, 0), 0x5f, 0xf << 2);
>> + } else if (priv->type == PHY_TYPE_PCIE) {
>> + /* PLL KVCO tuning fine */
>> + rockchip_combphy_updatel(priv, GENMASK(4, 2), 0x4 << 2, 0x20 << 2);
>> +
>> + /* Set up rx_trim */
>> + writel(0x0, priv->mmio + (0x1b << 2));
>> +
>> + /* Set up su_trim: T0_1 */
>> + writel(0x90, priv->mmio + (0xa << 2));
>> + writel(0x02, priv->mmio + (0xb << 2));
>> + writel(0x57, priv->mmio + (0xd << 2));
>> +
>> + writel(0x5f, priv->mmio + (0xf << 2));
> This does includes both the value as well as the register addresses,
> because a hex-value with a bit shift makes that even less readable.
>
> Thanks a lot
> Heiko
>
>
>> + }
>> + break;
>> + case REF_CLOCK_25MHz:
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_25m, true);
>> + break;
>> + case REF_CLOCK_100MHz:
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
>> + if (priv->type == PHY_TYPE_PCIE) {
>> + /* gate_tx_pck_sel length select work for L1SS */
>> + writel(0xc0, priv->mmio + 0x74);
>> +
>> + /* PLL KVCO tuning fine */
>> + rockchip_combphy_updatel(priv, GENMASK(4, 2), 0x4 << 2, 0x20 << 2);
>> +
>> + /* Set up rx_trim: PLL LPF C1 85pf R1 1.25kohm */
>> + writel(0x4c, priv->mmio + (0x1b << 2));
>> +
>> + /* Set up su_trim: T3_P1 650mv */
>> + writel(0x90, priv->mmio + (0xa << 2));
>> + writel(0x43, priv->mmio + (0xb << 2));
>> + writel(0x88, priv->mmio + (0xc << 2));
>> + writel(0x56, priv->mmio + (0xd << 2));
>> + } else if (priv->type == PHY_TYPE_SATA) {
>> + /* downward spread spectrum +500ppm */
>> + rockchip_combphy_updatel(priv, GENMASK(7, 4), 0x50, 0x1f << 2);
>> +
>> + /* ssc ppm adjust to 3500ppm */
>> + rockchip_combphy_updatel(priv, GENMASK(3, 0), 0x7, 0x9 << 2);
>> + }
>> + break;
>> + default:
>> + dev_err(priv->dev, "Unsupported rate: %lu\n", rate);
>> + return -EINVAL;
>> + }
>> +
>> + if (priv->ext_refclk) {
>> + rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_ext, true);
>> + if (priv->type == PHY_TYPE_PCIE && rate == REF_CLOCK_100MHz) {
>> + writel(0x10, priv->mmio + (0x20 << 2));
>> +
>> + writel(0x0c, priv->mmio + (0x1b << 2));
>> +
>> + /* Set up su_trim: T3_P1 650mv */
>> + writel(0x90, priv->mmio + (0xa << 2));
>> + writel(0x43, priv->mmio + (0xb << 2));
>> + writel(0x88, priv->mmio + (0xc << 2));
>> + writel(0x56, priv->mmio + (0xd << 2));
>> + }
>> + }
>> +
>> + if (priv->enable_ssc) {
>> + rockchip_combphy_updatel(priv, GENMASK(4, 4), BIT(4), 0x7 << 2);
>> +
>> + if (priv->type == PHY_TYPE_PCIE && rate == REF_CLOCK_24MHz) {
>> + /* Xin24M T0_1 650mV */
>> + writel(0x00, priv->mmio + (0x10 << 2));
>> + writel(0x32, priv->mmio + (0x11 << 2));
>> + writel(0x00, priv->mmio + (0x1b << 2));
>> + writel(0x90, priv->mmio + (0x0a << 2));
>> + writel(0x02, priv->mmio + (0x0b << 2));
>> + writel(0x08, priv->mmio + (0x0c << 2));
>> + writel(0x57, priv->mmio + (0x0d << 2));
>> + writel(0x40, priv->mmio + (0x0e << 2));
>> + writel(0x5f, priv->mmio + (0x0f << 2));
>> + writel(0x10, priv->mmio + (0x20 << 2));
>> + }
>> + }
>> +
>> + return 0;
>> +}
>
>
More information about the Linux-rockchip
mailing list