[PATCH v4 3/8] phy: rockchip: samsung-hdptx: Fix rate recalculation for 3.2GHz FRL
Andy Yan
andy.yan at rock-chips.com
Thu Jul 23 04:50:02 PDT 2026
Hello,
On 6/12/26 07:45, Cristian Ciocaltea wrote:
> rk_hdptx_phy_clk_calc_rate_from_pll_cfg() is currently unable to handle
> cascade mode for the 3.2GHz FRL operating mode, as it relies solely on
> LCPLL_LCVCO_MODE_EN_MASK to determinate the rate from the
> rk_hdptx_frl_lcpll_cfg array. Since there is no entry for this
> particular rate, the function returns 0.
>
> This is the only rate which requires LC_REF_CLK_SEL to be set in
> GRF_HDPTX_CON0, hence extend the FRL matching accordingly.
>
> Reported-by: Sashiko <sashiko-bot at kernel.org>
> Closes: https://sashiko.dev/#/patchset/20260611-hdptx-clk-fixes-v3-0-67b1b0c00e16@collabora.com?part=1
> Fixes: de5dba833118 ("phy: rockchip: samsung-hdptx: Add HDMI 2.1 FRL support")
> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
Reviewed-by: Andy Yan <andy.yan at rock-chips.com>
> ---
> drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c | 33 ++++++++++++++++-------
> 1 file changed, 24 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
> index 8c044381b83a..b210c1a88b25 100644
> --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
> +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
> @@ -2206,16 +2206,31 @@ static u64 rk_hdptx_phy_clk_calc_rate_from_pll_cfg(struct rk_hdptx_phy *hdptx)
> return 0;
> lcpll_hw.sdc_n = (val & LCPLL_SDC_N_MASK) >> 1;
>
> - for (i = 0; i < ARRAY_SIZE(rk_hdptx_frl_lcpll_cfg); i++) {
> - const struct lcpll_config *cfg = &rk_hdptx_frl_lcpll_cfg[i];
> + ret = regmap_read(hdptx->grf, GRF_HDPTX_CON0, &val);
> + if (ret)
> + return 0;
>
> - if (cfg->pms_mdiv == lcpll_hw.pms_mdiv &&
> - cfg->pms_sdiv == lcpll_hw.pms_sdiv &&
> - cfg->sdm_num_sign == lcpll_hw.sdm_num_sign &&
> - cfg->sdm_num == lcpll_hw.sdm_num &&
> - cfg->sdm_deno == lcpll_hw.sdm_deno &&
> - cfg->sdc_n == lcpll_hw.sdc_n)
> - return cfg->rate;
> + if (val & LC_REF_CLK_SEL) {
> + if (lcpll_hw.pms_mdiv == 0x6b &&
> + lcpll_hw.sdm_num_sign == 0x01 &&
> + lcpll_hw.sdm_num == 0x02 &&
> + lcpll_hw.sdm_deno == 0x09 &&
> + lcpll_hw.sdc_n == FIELD_GET(LCPLL_SDC_N_MASK, 0x02))
> + return FRL_8G4L_RATE;
> + } else {
> + const struct lcpll_config *cfg;
> +
> + for (i = 0; i < ARRAY_SIZE(rk_hdptx_frl_lcpll_cfg); i++) {
> + cfg = &rk_hdptx_frl_lcpll_cfg[i];
> +
> + if (cfg->pms_mdiv == lcpll_hw.pms_mdiv &&
> + cfg->pms_sdiv == lcpll_hw.pms_sdiv &&
> + cfg->sdm_num_sign == lcpll_hw.sdm_num_sign &&
> + cfg->sdm_num == lcpll_hw.sdm_num &&
> + cfg->sdm_deno == lcpll_hw.sdm_deno &&
> + cfg->sdc_n == lcpll_hw.sdc_n)
> + return cfg->rate;
> + }
> }
>
> dev_dbg(hdptx->dev, "%s no FRL match found\n", __func__);
>
More information about the Linux-rockchip
mailing list