Linux clock framework development
 help / color / mirror / Atom feed
From: "Yu-Chun Lin [林祐君]" <eleanor.lin@realtek.com>
To: Jerome Brunet <jbrunet@baylibre.com>
Cc: "jbrunet+clk@baylibre.com" <jbrunet+clk@baylibre.com>,
	"sboyd@kernel.org" <sboyd@kernel.org>,
	"robh@kernel.org" <robh@kernel.org>,
	"krzk+dt@kernel.org" <krzk+dt@kernel.org>,
	"conor+dt@kernel.org" <conor+dt@kernel.org>,
	"p.zabel@pengutronix.de" <p.zabel@pengutronix.de>,
	"Edgar Lee [李承諭]" <cylee12@realtek.com>,
	"afaerber@suse.com" <afaerber@suse.com>,
	"Jyan Chou [周芷安]" <jyanchou@realtek.com>,
	"bmasney+clk@redhat.com" <bmasney+clk@redhat.com>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"linux-clk@vger.kernel.org" <linux-clk@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-realtek-soc@lists.infradead.org"
	<linux-realtek-soc@lists.infradead.org>,
	"James Tai [戴志峰]" <james.tai@realtek.com>,
	"CY_Huang[黃鉦晏]" <cy.huang@realtek.com>,
	"Stanley Chang[昌育德]" <stanley_chang@realtek.com>,
	"Brian Masney" <bmasney@redhat.com>
Subject: RE: [PATCH v15 08/11] clk: realtek: Add support for MMC-tuned PLL clocks
Date: Sat, 17 Oct 2026 09:28:07 +0000	[thread overview]
Message-ID: <443e5b0f037541e78e250e8e3141c8f3@realtek.com> (raw)
In-Reply-To: <179157057524.266328.18071910694635064414.b4-review@b4>

Hi Jerome,

> > +
> > +static int rtk_clk_regmap_pll_mmc_prepare(struct clk_hw *hw) {
> > +     struct rtk_clk_regmap_pll_mmc *clkm = to_clk_pll_mmc(hw);
> > +
> > +     return set_pow_ctl(clkm, 7);
> > +}
> > +
> > +static void rtk_clk_regmap_pll_mmc_unprepare(struct clk_hw *hw) {
> > +     struct rtk_clk_regmap_pll_mmc *clkm = to_clk_pll_mmc(hw);
> > +
> > +     set_pow_ctl(clkm, 0);
> > +}
> > +
> > +static int rtk_clk_regmap_pll_mmc_is_prepared(struct clk_hw *hw) {
> > +     struct rtk_clk_regmap_pll_mmc *clkm = to_clk_pll_mmc(hw);
> > +     u32 val;
> > +     int ret;
> > +
> > +     ret = get_pow_ctl(clkm, &val);
> > +     if (ret)
> > +             return 1;
> > +
> > +     return val != 0x0;
> > +}
> > +
> > +static int rtk_clk_regmap_pll_mmc_enable(struct clk_hw *hw) {
> > +     struct rtk_clk_regmap_pll_mmc *clkm = to_clk_pll_mmc(hw);
> > +     int ret;
> > +
> > +     ret = set_phrt0(clkm, 1);
> > +     if (ret)
> > +             return ret;
> 
> looks fairly close to the regular gate as it stand.
> should your _pow be in there instead ?
> 

Will move the power-on/off operations into the .enable/.disable callbacks.

[...]

> > +
> > +static unsigned long rtk_clk_regmap_pll_mmc_recalc_rate(struct clk_hw
> *hw,
> > +                                                     unsigned
> long
> > +parent_rate) {
> > +     struct rtk_clk_regmap_pll_mmc *clkm = to_clk_pll_mmc(hw);
> > +     u32 val, ext_f;
> > +     u64 rate, base;
> > +     int ret;
> > +
> > +     ret = get_ssc_div_n(clkm, &val);
> > +     if (ret)
> > +             return 0;
> > +
> > +     ret = get_ssc_div_ext_f(clkm, &ext_f);
> > +     if (ret)
> > +             return 0;
> > +
> > +     base = parent_rate / 4;
> 
> So you've got a pre-divider
> 
> > +     rate = base * (val + 2);
> 
> Then an integer divider
> 
> > +     rate += div_u64(base * ext_f, 8192);
> 
> and finally the fractional part
> 
> > +
> > +     return rate;
> > +}
> > +
> > +static int rtk_clk_regmap_pll_mmc_determine_rate(struct clk_hw *hw,
> > +struct clk_rate_request *req) {
> > +     u32 val = RTK_PLL_MMC_SSC_DIV_N_VAL + 2;
> > +     u64 tmp;
> > +
> > +     if (!req->best_parent_rate)
> > +             return -EINVAL;
> > +
> > +     req->rate = req->best_parent_rate / 4 * val;
> 
> Here you seem to support only a single integer part setting
> 
> > +     tmp = (u64)(req->best_parent_rate / 4) * 1517;
> > +     req->rate += tmp >> 13;
> 
> So nothing says that here that the math won't overflow
> 
> Could you explain the 1517 here ? I suppose it is linked to the 8192 above ?
> 

The full formula is:
parent_rate / 4 * (val + 2) + (parent_rate / 4 * ext_f) / 8192;

To avoid hardcoding magic numbers,
We will introduce a rate table ('struct clk_pll_mmc_rate')

For example:
static const struct clk_pll_mmc_rate rtd1625_pll_emmc_rate_tbl[] = {
	{ .rate = 196999969, .ssc_div_n = 27,
	  .ssc_div_ext_f = 1517, .ncode = 27, .fcode = 321, .gran_est = 5985 },

The logic in rtk_clk_regmap_pll_mmc_determine_rate() will be updated to find
the closest match from this table, similar to the
'rtk_clk_regmap_pll_determine_rate' approach.

Additionally, in 'rtk_clk_regmap_pll_mmc_recalc_rate()', we will first
attempt to find an exact match in the rate table by comparing the full set
of register values. This aligns with our approach of relying on
characterized operating points, ensuring we return the exact validated
rate without integer truncation errors.

If no exact match is found, it will fall back to a helper function that
calculates the rate using the mathematical formula, casting variables to
u64 to prevent overflow.

> > +
> > +     return 0;
> > +}
> > +
> > +static int rtk_clk_regmap_pll_mmc_set_rate(struct clk_hw *hw, unsigned
> long rate,
> > +                                        unsigned long parent_rate)
> {
> > +     struct rtk_clk_regmap_pll_mmc *clkm = to_clk_pll_mmc(hw);
> > +     u32 val = RTK_PLL_MMC_SSC_DIV_N_VAL;
> > +     int ret;
> > +
> > +     /*
> > +      * The 'rate' and 'parent_rate' are intentionally unused here.
> > +      *
> > +      * Despite receiving various rate requests (e.g., 26MHz, 52MHz,
> 200MHz),
> > +      * this function consistently configures the hardware for 27MHz
> (0x1b).
> 
> Maybe you should fix the mmc driver then and properly request 27MHz if this
> what you expect of this particular PLL. Just taking any request and setting
> something else regardless is not OK.
>

With the introduction of the rate table (rtd1625_pll_emmc_rate_tbl) mentioned
above, the actual calculated output rate (e.g., 196999969) for the shared
27 MHz reference settings will be properly defined.

The driver will properly respect the requested rate, pick the corresponding
configuration from the rate table, and apply the exact register settings.

[...]

> > +}
> > +
> > +const struct clk_ops rtk_clk_pll_mmc_ops = {
> > +     .prepare          = rtk_clk_regmap_pll_mmc_prepare,
> > +     .unprepare        = rtk_clk_regmap_pll_mmc_unprepare,
> > +     .is_prepared      = rtk_clk_regmap_pll_mmc_is_prepared,
> 
> prepare is meant for slow (as in sleeping) operation.
> I've seen no sleeping operation in your implementation.
> If the regmap is slow, then there is problem because your using the same one
> in enable/disable() which run under a spin lock
> 

Agreed, as the above talk about. will remove these three callback implementaiton.
merge them to enable, disable and is_enable().

[...]

> > +struct rtk_clk_regmap_pll_mmc {
> > +     struct rtk_clk_regmap clkr;
> > +     unsigned int pll_ofs;
> > +     unsigned int ssc_dig_ofs;
> > +     struct clk_hw phase0_hw;
> > +     struct clk_hw phase1_hw;
> 
> your phases and pll use completly different ops. Why do you to mix the 2
> here ?
> 

Will create 'struct rtk_clk_pll_mmc_phase' for the phase clocks, separating
them entirely from the main 'struct rtk_clk_regmap_pll_mmc'.

Best Regards,
Yu-Chun

> --
> Jerome

  reply	other threads:[~2026-10-17  9:29 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-02  7:43 [PATCH v15 00/11] clk / reset: realtek: Add RTD1625 clock and reset support Yu-Chun Lin
2026-10-02  7:43 ` [PATCH v15 01/11] dt-bindings: clock: Add Realtek RTD1625 Clock & Reset Controller Yu-Chun Lin
2026-10-02  7:43 ` [PATCH v15 02/11] reset: Add Realtek basic reset support Yu-Chun Lin
2026-10-02  7:43 ` [PATCH v15 03/11] reset: realtek: Add RTD1625 reset controller driver Yu-Chun Lin
2026-10-02  7:43 ` [PATCH v15 04/11] clk: realtek: Introduce common probe() Yu-Chun Lin
2026-10-02  9:14   ` sashiko-bot
2026-10-02  7:43 ` [PATCH v15 05/11] clk: realtek: Add support for phase locked loops (PLLs) Yu-Chun Lin
2026-10-09 18:29   ` Jerome Brunet
2026-10-17  8:45     ` Yu-Chun Lin [林祐君]
2026-10-02  7:43 ` [PATCH v15 06/11] clk: realtek: Add support for gate clock Yu-Chun Lin
2026-10-09 18:29   ` Jerome Brunet
2026-10-17  9:05     ` Yu-Chun Lin [林祐君]
2026-10-02  7:43 ` [PATCH v15 07/11] clk: realtek: Add support for mux clock Yu-Chun Lin
2026-10-02  7:43 ` [PATCH v15 08/11] clk: realtek: Add support for MMC-tuned PLL clocks Yu-Chun Lin
2026-10-09 18:29   ` Jerome Brunet
2026-10-17  9:28     ` Yu-Chun Lin [林祐君] [this message]
2026-10-02  7:43 ` [PATCH v15 09/11] clk: realtek: Add RTD1625-CRT clock controller driver Yu-Chun Lin
2026-10-02  9:14   ` sashiko-bot
2026-10-09 18:29   ` Jerome Brunet
2026-10-17  9:08     ` Yu-Chun Lin [林祐君]
2026-10-02  7:43 ` [PATCH v15 10/11] clk: realtek: Add RTD1625-ISO " Yu-Chun Lin
2026-10-09 18:29   ` Jerome Brunet
2026-10-17  9:10     ` Yu-Chun Lin [林祐君]
2026-10-02  7:43 ` [PATCH v15 11/11] arm64: dts: realtek: Add clock support for RTD1625 Yu-Chun Lin
2026-10-09 18:29 ` [PATCH v15 00/11] clk / reset: realtek: Add RTD1625 clock and reset support Jerome Brunet
2026-10-17  8:37   ` Yu-Chun Lin [林祐君]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=443e5b0f037541e78e250e8e3141c8f3@realtek.com \
    --to=eleanor.lin@realtek.com \
    --cc=afaerber@suse.com \
    --cc=bmasney+clk@redhat.com \
    --cc=bmasney@redhat.com \
    --cc=conor+dt@kernel.org \
    --cc=cy.huang@realtek.com \
    --cc=cylee12@realtek.com \
    --cc=devicetree@vger.kernel.org \
    --cc=james.tai@realtek.com \
    --cc=jbrunet+clk@baylibre.com \
    --cc=jbrunet@baylibre.com \
    --cc=jyanchou@realtek.com \
    --cc=krzk+dt@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-realtek-soc@lists.infradead.org \
    --cc=p.zabel@pengutronix.de \
    --cc=robh@kernel.org \
    --cc=sboyd@kernel.org \
    --cc=stanley_chang@realtek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox