mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 05:04:02 +02:00
phy: rockchip: samsung-hdptx: Fix rate recalculation for 3.2GHz FRL
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@kernel.org>
Closes: https://sashiko.dev/#/patchset/20260611-hdptx-clk-fixes-v3-0-67b1b0c00e16@collabora.com?part=1
Fixes: de5dba8331 ("phy: rockchip: samsung-hdptx: Add HDMI 2.1 FRL support")
Tested-by: Diederik de Haas <diederik@cknow-tech.com> # NanoPC-T6 LTS
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Andy Yan <andy.yan@rock-chips.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
Link: https://patch.msgid.link/20260811-hdptx-clk-fixes-v6-4-75bca0ee5753@collabora.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
229788526f
commit
9ac3daadb9
|
|
@ -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__);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user