[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <DU0PR04MB9417F545EDAF40730E1C872D889C9@DU0PR04MB9417.eurprd04.prod.outlook.com>
Date: Mon, 17 Apr 2023 00:55:06 +0000
From: Peng Fan <peng.fan@....com>
To: Adam Ford <aford173@...il.com>,
"linux-clk@...r.kernel.org" <linux-clk@...r.kernel.org>
CC: "aford@...conembedded.com" <aford@...conembedded.com>,
Abel Vesa <abelvesa@...nel.org>,
Michael Turquette <mturquette@...libre.com>,
Stephen Boyd <sboyd@...nel.org>,
Shawn Guo <shawnguo@...nel.org>,
Sascha Hauer <s.hauer@...gutronix.de>,
Pengutronix Kernel Team <kernel@...gutronix.de>,
Fabio Estevam <festevam@...il.com>,
dl-linux-imx <linux-imx@....com>,
"linux-arm-kernel@...ts.infradead.org"
<linux-arm-kernel@...ts.infradead.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
Subject: RE: [PATCH] clk: imx: composite-8m: Fix clock divisions greater than
8
> Subject: [PATCH] clk: imx: composite-8m: Fix clock divisions greater than 8
>
> When adding imx8m_clk_divider_determine_rate to let the imx8mm and
> imx8mn get finer granulatiry of video clocks, it accidentally broke the
> imx8mp ability to divide clocks by more than 8 on clocks when the
> CLK_SET_RATE_PARENT flag is not set.
>
> On the imx8mp, the CLK_SET_RATE_PARENT flag cannot be set on either
> media_disp1_pix or media_disp2_pix, because they both share the
> video_pll as a common clock, and if two displays are used, the parent clock
> needs to be something that both child clocks can divide.
>
> imx8m_clk_divider_determine_rate ends up calling clk_divider_bestdiv
> which uses the value of 'width' to setup the maximum divisor. The clk-
> composite-8m driver sets the with to 3 which means the maximum divisor is
> 8, but these clocks can divide by up to 64.
>
> Currently, if the video_pll is set to 1039500000, the slowest clock rate
> achievable is 129937500 which breaks a whole bunch of lower resolution
> and refresh options for both media_disp1_pix and media_disp2_pix.
>
> By changing the 'width' variable to PCG_DIV_WIDTH, the maximum divisor
> becomes 64 which allows the clocks to divide down more, so the lower
> resolutions and refresh rates are achievable again.
>
> Fixes: 156e96ff2172 ("clk: imx: composite-8m: Add support to
> determine_rate")
> Signed-off-by: Adam Ford <aford173@...il.com>
>
> diff --git a/drivers/clk/imx/clk-composite-8m.c b/drivers/clk/imx/clk-
> composite-8m.c
> index 6883a8199b6c..805e6aada83d 100644
> --- a/drivers/clk/imx/clk-composite-8m.c
> +++ b/drivers/clk/imx/clk-composite-8m.c
> @@ -47,6 +47,7 @@ static unsigned long
> imx8m_clk_composite_divider_recalc_rate(struct clk_hw *hw,
> divider->flags, PCG_DIV_WIDTH);
> }
>
> +
> static int imx8m_clk_composite_compute_dividers(unsigned long rate,
> unsigned long parent_rate,
> int *prediv, int *postdiv)
> @@ -215,12 +216,12 @@ struct clk_hw *__imx8m_clk_hw_composite(const
> char *name,
> mux_ops = &imx8m_clk_composite_mux_ops;
> } else if (composite_flags & IMX_COMPOSITE_BUS) {
> div->shift = PCG_PREDIV_SHIFT;
> - div->width = PCG_PREDIV_WIDTH;
> + div->width = PCG_DIV_WIDTH;
This is wrong. Pre divider width is 3, not 6.
> divider_ops = &imx8m_clk_composite_divider_ops;
> mux_ops = &imx8m_clk_composite_mux_ops;
> } else {
> div->shift = PCG_PREDIV_SHIFT;
> - div->width = PCG_PREDIV_WIDTH;
> + div->width = PCG_DIV_WIDTH;
Ditto.
You need find the other way to resolve the regression.
Regards,
Peng.
> divider_ops = &imx8m_clk_composite_divider_ops;
> mux_ops = &clk_mux_ops;
> if (!(composite_flags & IMX_COMPOSITE_FW_MANAGED))
> --
> 2.39.2
Powered by blists - more mailing lists