Based on: *2dc8224e37/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c* https://lore.kernel.org/all/20241016-b4-rk3588-bridge-upstream-v10-1-87ef92a6d14e@collabora.com/ *a52dffaa46/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c*a52dffaa46/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c*a52dffaa46/drivers/gpu/drm/rockchip/rockchip_vop2_reg.cSigned-off-by: Liangbin Lian <jjm2473@gmail.com>
242 lines
9.7 KiB
Diff
242 lines
9.7 KiB
Diff
From 85bc910629a9f31b879aeb4f1a1c5fa211406f4a Mon Sep 17 00:00:00 2001
|
|
From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
Date: Tue, 18 Mar 2025 14:35:42 +0200
|
|
Subject: [PATCH 07/11] phy: rockchip: samsung-hdptx: Avoid Hz<->hHz unit
|
|
conversion overhead
|
|
|
|
The ropll_tmds_cfg table used to identify the configuration params for
|
|
the supported rates expects the search key, i.e. bit_rate member of
|
|
struct ropll_config, to be provided in hHz rather than Hz (1 hHz = 100
|
|
Hz). This requires multiple conversions between these units being
|
|
performed at runtime.
|
|
|
|
Improve implementation clarity and efficiency by consistently using the
|
|
Hz unit throughout driver's internal data structures and functions.
|
|
Also rename the rather misleading struct member.
|
|
|
|
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
|
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
|
|
Link: https://lore.kernel.org/r/20250318-phy-sam-hdptx-bpc-v6-8-8cb1678e7663@collabora.com
|
|
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
|
---
|
|
.../phy/rockchip/phy-rockchip-samsung-hdptx.c | 79 +++++++++----------
|
|
1 file changed, 39 insertions(+), 40 deletions(-)
|
|
|
|
diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
|
|
index de333b743810..36b01a2e414b 100644
|
|
--- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
|
|
+++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c
|
|
@@ -196,7 +196,7 @@
|
|
#define HDMI20_MAX_RATE 600000000
|
|
|
|
struct ropll_config {
|
|
- u32 bit_rate;
|
|
+ unsigned long long rate;
|
|
u8 pms_mdiv;
|
|
u8 pms_mdiv_afc;
|
|
u8 pms_pdiv;
|
|
@@ -259,45 +259,45 @@ struct rk_hdptx_phy {
|
|
};
|
|
|
|
static const struct ropll_config ropll_tmds_cfg[] = {
|
|
- { 5940000, 124, 124, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
+ { 594000000ULL, 124, 124, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 3712500, 155, 155, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
+ { 371250000ULL, 155, 155, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 2970000, 124, 124, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
+ { 297000000ULL, 124, 124, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 1620000, 135, 135, 1, 1, 3, 1, 1, 0, 1, 1, 1, 1, 4, 0, 3, 5, 5, 0x10,
|
|
+ { 162000000ULL, 135, 135, 1, 1, 3, 1, 1, 0, 1, 1, 1, 1, 4, 0, 3, 5, 5, 0x10,
|
|
1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 1856250, 155, 155, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
+ { 185625000ULL, 155, 155, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 1540000, 193, 193, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 193, 1, 32, 2, 1,
|
|
+ { 154000000ULL, 193, 193, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 193, 1, 32, 2, 1,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 1485000, 0x7b, 0x7b, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 0, 3, 5, 5,
|
|
+ { 148500000ULL, 0x7b, 0x7b, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, 0, 3, 5, 5,
|
|
0x10, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 1462500, 122, 122, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 244, 1, 16, 2, 1, 1,
|
|
+ { 146250000ULL, 122, 122, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 244, 1, 16, 2, 1, 1,
|
|
1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 1190000, 149, 149, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 149, 1, 16, 2, 1, 1,
|
|
+ { 119000000ULL, 149, 149, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 149, 1, 16, 2, 1, 1,
|
|
1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 1065000, 89, 89, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 89, 1, 16, 1, 0, 1,
|
|
+ { 106500000ULL, 89, 89, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 89, 1, 16, 1, 0, 1,
|
|
1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 1080000, 135, 135, 1, 1, 5, 1, 1, 0, 1, 0, 1, 1, 0x9, 0, 0x05, 0,
|
|
+ { 108000000ULL, 135, 135, 1, 1, 5, 1, 1, 0, 1, 0, 1, 1, 0x9, 0, 0x05, 0,
|
|
0x14, 0x18, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 855000, 214, 214, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 214, 1, 16, 2, 1,
|
|
+ { 85500000ULL, 214, 214, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 214, 1, 16, 2, 1,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 835000, 105, 105, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 42, 1, 16, 1, 0,
|
|
+ { 83500000ULL, 105, 105, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 42, 1, 16, 1, 0,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 928125, 155, 155, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
+ { 92812500ULL, 155, 155, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 742500, 124, 124, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
+ { 74250000ULL, 124, 124, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 62, 1, 16, 5, 0,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 650000, 162, 162, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 54, 0, 16, 4, 1,
|
|
+ { 65000000ULL, 162, 162, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 54, 0, 16, 4, 1,
|
|
1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 337500, 0x70, 0x70, 1, 1, 0xf, 1, 1, 1, 1, 1, 1, 1, 0x2, 0, 0x01, 5,
|
|
+ { 33750000ULL, 0x70, 0x70, 1, 1, 0xf, 1, 1, 1, 1, 1, 1, 1, 0x2, 0, 0x01, 5,
|
|
1, 1, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 400000, 100, 100, 1, 1, 11, 1, 1, 0, 1, 0, 1, 1, 0x9, 0, 0x05, 0,
|
|
+ { 40000000ULL, 100, 100, 1, 1, 11, 1, 1, 0, 1, 0, 1, 1, 0x9, 0, 0x05, 0,
|
|
0x14, 0x18, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 270000, 0x5a, 0x5a, 1, 1, 0xf, 1, 1, 0, 1, 0, 1, 1, 0x9, 0, 0x05, 0,
|
|
+ { 27000000ULL, 0x5a, 0x5a, 1, 1, 0xf, 1, 1, 0, 1, 0, 1, 1, 0x9, 0, 0x05, 0,
|
|
0x14, 0x18, 1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
- { 251750, 84, 84, 1, 1, 0xf, 1, 1, 1, 1, 1, 1, 1, 168, 1, 16, 4, 1, 1,
|
|
+ { 25175000ULL, 84, 84, 1, 1, 0xf, 1, 1, 1, 1, 1, 1, 1, 168, 1, 16, 4, 1, 1,
|
|
1, 0, 0x20, 0x0c, 1, 0x0e, 0, 0, },
|
|
};
|
|
|
|
@@ -659,10 +659,10 @@ static void rk_hdptx_phy_disable(struct rk_hdptx_phy *hdptx)
|
|
regmap_write(hdptx->grf, GRF_HDPTX_CON0, val);
|
|
}
|
|
|
|
-static bool rk_hdptx_phy_clk_pll_calc(unsigned int data_rate,
|
|
+static bool rk_hdptx_phy_clk_pll_calc(unsigned long long rate,
|
|
struct ropll_config *cfg)
|
|
{
|
|
- const unsigned int fout = data_rate / 2, fref = 24000;
|
|
+ const unsigned int fout = div_u64(rate, 200), fref = 24000;
|
|
unsigned long k = 0, lc, k_sub, lc_sub;
|
|
unsigned int fvco, sdc;
|
|
u32 mdiv, sdiv, n = 8;
|
|
@@ -732,14 +732,14 @@ static bool rk_hdptx_phy_clk_pll_calc(unsigned int data_rate,
|
|
}
|
|
|
|
static int rk_hdptx_ropll_tmds_cmn_config(struct rk_hdptx_phy *hdptx,
|
|
- unsigned int rate)
|
|
+ unsigned long long rate)
|
|
{
|
|
const struct ropll_config *cfg = NULL;
|
|
struct ropll_config rc = {0};
|
|
int ret, i;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(ropll_tmds_cfg); i++)
|
|
- if (rate == ropll_tmds_cfg[i].bit_rate) {
|
|
+ if (rate == ropll_tmds_cfg[i].rate) {
|
|
cfg = &ropll_tmds_cfg[i];
|
|
break;
|
|
}
|
|
@@ -753,8 +753,8 @@ static int rk_hdptx_ropll_tmds_cmn_config(struct rk_hdptx_phy *hdptx,
|
|
}
|
|
}
|
|
|
|
- dev_dbg(hdptx->dev, "mdiv=%u, sdiv=%u, sdm_en=%u, k_sign=%u, k=%u, lc=%u\n",
|
|
- cfg->pms_mdiv, cfg->pms_sdiv + 1, cfg->sdm_en,
|
|
+ dev_dbg(hdptx->dev, "%s rate=%llu mdiv=%u sdiv=%u sdm_en=%u k_sign=%u k=%u lc=%u\n",
|
|
+ __func__, rate, cfg->pms_mdiv, cfg->pms_sdiv + 1, cfg->sdm_en,
|
|
cfg->sdm_num_sign, cfg->sdm_num, cfg->sdm_deno);
|
|
|
|
rk_hdptx_pre_power_up(hdptx);
|
|
@@ -793,19 +793,19 @@ static int rk_hdptx_ropll_tmds_cmn_config(struct rk_hdptx_phy *hdptx,
|
|
|
|
ret = rk_hdptx_post_enable_pll(hdptx);
|
|
if (!ret)
|
|
- hdptx->rate = rate * 100;
|
|
+ hdptx->rate = rate;
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int rk_hdptx_ropll_tmds_mode_config(struct rk_hdptx_phy *hdptx,
|
|
- unsigned int rate)
|
|
+ unsigned long long rate)
|
|
{
|
|
rk_hdptx_multi_reg_write(hdptx, rk_hdtpx_common_sb_init_seq);
|
|
|
|
regmap_write(hdptx->regmap, LNTOP_REG(0200), 0x06);
|
|
|
|
- if (rate > HDMI14_MAX_RATE / 100) {
|
|
+ if (rate > HDMI14_MAX_RATE) {
|
|
/* For 1/40 bitrate clk */
|
|
rk_hdptx_multi_reg_write(hdptx, rk_hdtpx_tmds_lntop_highbr_seq);
|
|
} else {
|
|
@@ -823,7 +823,7 @@ static int rk_hdptx_ropll_tmds_mode_config(struct rk_hdptx_phy *hdptx,
|
|
}
|
|
|
|
static int rk_hdptx_phy_consumer_get(struct rk_hdptx_phy *hdptx,
|
|
- unsigned int rate)
|
|
+ unsigned long long rate)
|
|
{
|
|
u32 status;
|
|
int ret;
|
|
@@ -881,7 +881,7 @@ static int rk_hdptx_phy_consumer_put(struct rk_hdptx_phy *hdptx, bool force)
|
|
static int rk_hdptx_phy_power_on(struct phy *phy)
|
|
{
|
|
struct rk_hdptx_phy *hdptx = phy_get_drvdata(phy);
|
|
- int bus_width = phy_get_bus_width(hdptx->phy);
|
|
+ unsigned long long rate;
|
|
int ret;
|
|
|
|
/*
|
|
@@ -889,10 +889,10 @@ static int rk_hdptx_phy_power_on(struct phy *phy)
|
|
* from the HDMI bridge driver until phy_configure_opts_hdmi
|
|
* becomes available in the PHY API.
|
|
*/
|
|
- unsigned int rate = bus_width & 0xfffffff;
|
|
+ rate = phy_get_bus_width(hdptx->phy) & 0xfffffff;
|
|
+ rate *= 100;
|
|
|
|
- dev_dbg(hdptx->dev, "%s bus_width=%x rate=%u\n",
|
|
- __func__, bus_width, rate);
|
|
+ dev_dbg(hdptx->dev, "%s rate=%llu\n", __func__, rate);
|
|
|
|
ret = rk_hdptx_phy_consumer_get(hdptx, rate);
|
|
if (ret)
|
|
@@ -927,7 +927,7 @@ static int rk_hdptx_phy_clk_prepare(struct clk_hw *hw)
|
|
{
|
|
struct rk_hdptx_phy *hdptx = to_rk_hdptx_phy(hw);
|
|
|
|
- return rk_hdptx_phy_consumer_get(hdptx, hdptx->rate / 100);
|
|
+ return rk_hdptx_phy_consumer_get(hdptx, hdptx->rate);
|
|
}
|
|
|
|
static void rk_hdptx_phy_clk_unprepare(struct clk_hw *hw)
|
|
@@ -948,18 +948,17 @@ static unsigned long rk_hdptx_phy_clk_recalc_rate(struct clk_hw *hw,
|
|
static long rk_hdptx_phy_clk_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
unsigned long *parent_rate)
|
|
{
|
|
- u32 bit_rate = rate / 100;
|
|
int i;
|
|
|
|
if (rate > HDMI20_MAX_RATE)
|
|
return rate;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(ropll_tmds_cfg); i++)
|
|
- if (bit_rate == ropll_tmds_cfg[i].bit_rate)
|
|
+ if (rate == ropll_tmds_cfg[i].rate)
|
|
break;
|
|
|
|
if (i == ARRAY_SIZE(ropll_tmds_cfg) &&
|
|
- !rk_hdptx_phy_clk_pll_calc(bit_rate, NULL))
|
|
+ !rk_hdptx_phy_clk_pll_calc(rate, NULL))
|
|
return -EINVAL;
|
|
|
|
return rate;
|
|
@@ -970,7 +969,7 @@ static int rk_hdptx_phy_clk_set_rate(struct clk_hw *hw, unsigned long rate,
|
|
{
|
|
struct rk_hdptx_phy *hdptx = to_rk_hdptx_phy(hw);
|
|
|
|
- return rk_hdptx_ropll_tmds_cmn_config(hdptx, rate / 100);
|
|
+ return rk_hdptx_ropll_tmds_cmn_config(hdptx, rate);
|
|
}
|
|
|
|
static const struct clk_ops hdptx_phy_clk_ops = {
|
|
--
|
|
2.51.0
|
|
|