From: Abel Vesa <abel.vesa@linaro.org>
To: Adam Ford <aford173@gmail.com>
Cc: linux-clk@vger.kernel.org, aford@beaconembedded.com,
Abel Vesa <abelvesa@kernel.org>, Peng Fan <peng.fan@nxp.com>,
Michael Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@kernel.org>, Shawn Guo <shawnguo@kernel.org>,
Sascha Hauer <s.hauer@pengutronix.de>,
Pengutronix Kernel Team <kernel@pengutronix.de>,
Fabio Estevam <festevam@gmail.com>,
NXP Linux Team <linux-imx@nxp.com>,
"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE"
<linux-arm-kernel@lists.infradead.org>,
open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] clk: imx: composite-8m: Add imx8m_divider_determine_rate
Date: Mon, 12 Jun 2023 11:56:12 +0300 [thread overview]
Message-ID: <ZIbdrLyBUwtgY2HE@linaro.org> (raw)
In-Reply-To: <20230506195325.876871-1-aford173@gmail.com>
On 23-05-06 14:53:25, Adam Ford wrote:
> Currently, certain clocks are derrived as a divider from their
> parent clock. For some clocks, even when CLK_SET_RATE_PARENT
> is set, the parent clock is not properly set which can lead
> to some relatively inaccurate clock values.
>
> Unlike imx/clk-composite-93 and imx/clk-divider-gate, it
> cannot rely on calling a standard determine_rate function,
> because the 8m composite clocks have a pre-divider and
> post-divider. Because of this, a custom determine_rate
> function is necessary to determine the maximum clock
> division which is equivalent to pre-divider * the
> post-divider.
>
> With this added, the system can attempt to adjust the parent rate
> when the proper flags are set which can lead to a more precise clock
> value.
>
> On the imx8mplus, no clock changes are present.
> On the Mini and Nano, this can help achieve more accurate
> lcdif clocks. When trying to get a pixel clock of 31.500MHz
> on an imx8m Nano, the clocks divided the 594MHz down, but
> left the parent rate untouched which caused a calulation error.
>
> Before:
> video_pll 594000000
> video_pll_bypass 594000000
> video_pll_out 594000000
> disp_pixel 31263158
> disp_pixel_clk 31263158
>
> Variance = -236842 Hz
>
> After this patch:
> video_pll 31500000
> video_pll_bypass 31500000
> video_pll_out 31500000
> disp_pixel 31500000
> disp_pixel_clk 31500000
>
> Variance = 0 Hz
>
> All other clocks rates and parent were the same.
> Similar results on imx8mm were found.
>
> Fixes: 690dccc4a0bf ("Revert "clk: imx: composite-8m: Add support to determine_rate"")
> Signed-off-by: Adam Ford <aford173@gmail.com>
Reviewed-by: Abel Vesa <abel.vesa@linaro.org>
> ---
> V2: Fix build warning found by build bot and fix prediv_value
> and div_value because the values stored are the divisor - 1,
> so we need to add 1 to the values to be correct.
>
> diff --git a/drivers/clk/imx/clk-composite-8m.c b/drivers/clk/imx/clk-composite-8m.c
> index cbf0d7955a00..7a6e3ce97133 100644
> --- a/drivers/clk/imx/clk-composite-8m.c
> +++ b/drivers/clk/imx/clk-composite-8m.c
> @@ -119,10 +119,41 @@ static int imx8m_clk_composite_divider_set_rate(struct clk_hw *hw,
> return ret;
> }
>
> +static int imx8m_divider_determine_rate(struct clk_hw *hw,
> + struct clk_rate_request *req)
> +{
> + struct clk_divider *divider = to_clk_divider(hw);
> + int prediv_value;
> + int div_value;
> +
> + /* if read only, just return current value */
> + if (divider->flags & CLK_DIVIDER_READ_ONLY) {
> + u32 val;
> +
> + val = readl(divider->reg);
> + prediv_value = val >> divider->shift;
> + prediv_value &= clk_div_mask(divider->width);
> + prediv_value++;
> +
> + div_value = val >> PCG_DIV_SHIFT;
> + div_value &= clk_div_mask(PCG_DIV_WIDTH);
> + div_value++;
> +
> + return divider_ro_determine_rate(hw, req, divider->table,
> + PCG_PREDIV_WIDTH + PCG_DIV_WIDTH,
> + divider->flags, prediv_value * div_value);
> + }
> +
> + return divider_determine_rate(hw, req, divider->table,
> + PCG_PREDIV_WIDTH + PCG_DIV_WIDTH,
> + divider->flags);
> +}
> +
> static const struct clk_ops imx8m_clk_composite_divider_ops = {
> .recalc_rate = imx8m_clk_composite_divider_recalc_rate,
> .round_rate = imx8m_clk_composite_divider_round_rate,
> .set_rate = imx8m_clk_composite_divider_set_rate,
> + .determine_rate = imx8m_divider_determine_rate,
> };
>
> static u8 imx8m_clk_composite_mux_get_parent(struct clk_hw *hw)
> --
> 2.39.2
>
next prev parent reply other threads:[~2023-06-12 8:59 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-06 19:53 [PATCH] clk: imx: composite-8m: Add imx8m_divider_determine_rate Adam Ford
2023-05-12 3:03 ` Adam Ford
2023-05-19 22:04 ` Adam Ford
2023-05-20 11:36 ` Peng Fan
2023-05-23 2:32 ` Peng Fan
2023-05-23 3:23 ` Adam Ford
2023-05-28 3:31 ` Adam Ford
2023-06-06 18:45 ` Fabio Estevam
2023-06-11 17:02 ` Adam Ford
2023-06-12 16:08 ` Maxime Ripard
2023-06-12 16:11 ` Adam Ford
2023-06-13 8:23 ` Maxime Ripard
2023-06-12 8:56 ` Abel Vesa [this message]
2023-06-12 9:32 ` Abel Vesa
-- strict thread matches above, loose matches on Subject: below --
2023-05-06 16:24 Adam Ford
2023-05-06 17:41 ` kernel test robot
2023-05-06 18:12 ` kernel test robot
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=ZIbdrLyBUwtgY2HE@linaro.org \
--to=abel.vesa@linaro.org \
--cc=abelvesa@kernel.org \
--cc=aford173@gmail.com \
--cc=aford@beaconembedded.com \
--cc=festevam@gmail.com \
--cc=kernel@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-imx@nxp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=peng.fan@nxp.com \
--cc=s.hauer@pengutronix.de \
--cc=sboyd@kernel.org \
--cc=shawnguo@kernel.org \
/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