* [PATCH V3 1/4] clk: imx: composite-8m: Add support to determine_rate
2023-03-23 22:51 [PATCH V2 0/4] clk: imx: Improve imx8mm/imx8mn LCDIF clocks Adam Ford
@ 2023-03-23 22:51 ` Adam Ford
2023-03-23 22:51 ` [PATCH V3 2/4] clk: imx: Add imx8m_clk_hw_composite_flags macro Adam Ford
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Adam Ford @ 2023-03-23 22:51 UTC (permalink / raw)
To: linux-clk
Cc: aford, Adam Ford, Peng Fan, Fabio Estevam, Abel Vesa,
Michael Turquette, Stephen Boyd, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, NXP Linux Team, linux-arm-kernel,
linux-kernel
Similar to imx/clk-composite-93 and imx/clk-divider-gate, the
imx8m_clk_composite_divider_ops can support determine_rate.
Without this the parent clocks are set to a fixed value, and
if a consumer needs a slower reate, the clock is divided, but
the division is only as good as the parent clock rate.
With this added, the system can attempt to adjust the parent rate
if the proper flags are set which can lead to a more precise clock
value.
Signed-off-by: Adam Ford <aford173@gmail.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
---
V3: Change name clk_divider_determine_rate to
imx8m_clk_divider_determine_rate to match naming convention
V2: No Change
diff --git a/drivers/clk/imx/clk-composite-8m.c b/drivers/clk/imx/clk-composite-8m.c
index cbf0d7955a00..3b63e47f088f 100644
--- a/drivers/clk/imx/clk-composite-8m.c
+++ b/drivers/clk/imx/clk-composite-8m.c
@@ -119,10 +119,17 @@ static int imx8m_clk_composite_divider_set_rate(struct clk_hw *hw,
return ret;
}
+static int clk_divider_determine_rate(struct clk_hw *hw,
+ struct clk_rate_request *req)
+{
+ return clk_divider_ops.determine_rate(hw, req);
+}
+
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 = clk_divider_determine_rate,
};
static u8 imx8m_clk_composite_mux_get_parent(struct clk_hw *hw)
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH V3 2/4] clk: imx: Add imx8m_clk_hw_composite_flags macro
2023-03-23 22:51 [PATCH V2 0/4] clk: imx: Improve imx8mm/imx8mn LCDIF clocks Adam Ford
2023-03-23 22:51 ` [PATCH V3 1/4] clk: imx: composite-8m: Add support to determine_rate Adam Ford
@ 2023-03-23 22:51 ` Adam Ford
2023-03-23 22:51 ` [PATCH V3 3/4] clk: imx8mm: Let IMX8MM_CLK_LCDIF_PIXEL set parent rate Adam Ford
2023-03-23 22:51 ` [PATCH V3 4/4] clk: imx: Let IMX8MN_CLK_DISP_PIXEL " Adam Ford
3 siblings, 0 replies; 5+ messages in thread
From: Adam Ford @ 2023-03-23 22:51 UTC (permalink / raw)
To: linux-clk
Cc: aford, Adam Ford, Fabio Estevam, Abel Vesa, Peng Fan,
Michael Turquette, Stephen Boyd, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, NXP Linux Team, linux-arm-kernel,
linux-kernel
In order to set custom flags to imx8m_clk_hw_composite,
split it off into a separate macro which can accept additional
flags.
Signed-off-by: Adam Ford <aford173@gmail.com>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
diff --git a/drivers/clk/imx/clk.h b/drivers/clk/imx/clk.h
index 3d94722bbf99..621b0e84ef27 100644
--- a/drivers/clk/imx/clk.h
+++ b/drivers/clk/imx/clk.h
@@ -417,6 +417,10 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
_imx8m_clk_hw_composite(name, parent_names, reg, \
0, IMX_COMPOSITE_CLK_FLAGS_DEFAULT)
+#define imx8m_clk_hw_composite_flags(name, parent_names, reg, flags) \
+ _imx8m_clk_hw_composite(name, parent_names, reg, \
+ 0, IMX_COMPOSITE_CLK_FLAGS_DEFAULT | flags)
+
#define imx8m_clk_hw_composite_critical(name, parent_names, reg) \
_imx8m_clk_hw_composite(name, parent_names, reg, \
0, IMX_COMPOSITE_CLK_FLAGS_CRITICAL)
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH V3 3/4] clk: imx8mm: Let IMX8MM_CLK_LCDIF_PIXEL set parent rate
2023-03-23 22:51 [PATCH V2 0/4] clk: imx: Improve imx8mm/imx8mn LCDIF clocks Adam Ford
2023-03-23 22:51 ` [PATCH V3 1/4] clk: imx: composite-8m: Add support to determine_rate Adam Ford
2023-03-23 22:51 ` [PATCH V3 2/4] clk: imx: Add imx8m_clk_hw_composite_flags macro Adam Ford
@ 2023-03-23 22:51 ` Adam Ford
2023-03-23 22:51 ` [PATCH V3 4/4] clk: imx: Let IMX8MN_CLK_DISP_PIXEL " Adam Ford
3 siblings, 0 replies; 5+ messages in thread
From: Adam Ford @ 2023-03-23 22:51 UTC (permalink / raw)
To: linux-clk
Cc: aford, Adam Ford, Fabio Estevam, Abel Vesa, Peng Fan,
Michael Turquette, Stephen Boyd, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, NXP Linux Team, linux-arm-kernel,
linux-kernel
By default the display pixel clock needs to be evenly divide
down from 594MHz which rules out a significant number of
resolution and refresh rates.
The current clock tree looks something like:
video_pll1 594000000
video_pll1_bypass 594000000
video_pll1_out 594000000
lcdif_pixel 148500000
Now that composite-8m supports determine_rate, we can allow
lcdif_pixel to set the parent rate which then switches
every clock in the chain to a new frequency when lcdif_pixel
cannot evenly divide from video_pll1_out.
Signed-off-by: Adam Ford <aford173@gmail.com>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
diff --git a/drivers/clk/imx/clk-imx8mm.c b/drivers/clk/imx/clk-imx8mm.c
index b618892170f2..075f643e3f35 100644
--- a/drivers/clk/imx/clk-imx8mm.c
+++ b/drivers/clk/imx/clk-imx8mm.c
@@ -468,7 +468,7 @@ static int imx8mm_clocks_probe(struct platform_device *pdev)
hws[IMX8MM_CLK_PCIE1_PHY] = imx8m_clk_hw_composite("pcie1_phy", imx8mm_pcie1_phy_sels, base + 0xa380);
hws[IMX8MM_CLK_PCIE1_AUX] = imx8m_clk_hw_composite("pcie1_aux", imx8mm_pcie1_aux_sels, base + 0xa400);
hws[IMX8MM_CLK_DC_PIXEL] = imx8m_clk_hw_composite("dc_pixel", imx8mm_dc_pixel_sels, base + 0xa480);
- hws[IMX8MM_CLK_LCDIF_PIXEL] = imx8m_clk_hw_composite("lcdif_pixel", imx8mm_lcdif_pixel_sels, base + 0xa500);
+ hws[IMX8MM_CLK_LCDIF_PIXEL] = imx8m_clk_hw_composite_flags("lcdif_pixel", imx8mm_lcdif_pixel_sels, base + 0xa500, CLK_SET_RATE_PARENT);
hws[IMX8MM_CLK_SAI1] = imx8m_clk_hw_composite("sai1", imx8mm_sai1_sels, base + 0xa580);
hws[IMX8MM_CLK_SAI2] = imx8m_clk_hw_composite("sai2", imx8mm_sai2_sels, base + 0xa600);
hws[IMX8MM_CLK_SAI3] = imx8m_clk_hw_composite("sai3", imx8mm_sai3_sels, base + 0xa680);
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH V3 4/4] clk: imx: Let IMX8MN_CLK_DISP_PIXEL set parent rate
2023-03-23 22:51 [PATCH V2 0/4] clk: imx: Improve imx8mm/imx8mn LCDIF clocks Adam Ford
` (2 preceding siblings ...)
2023-03-23 22:51 ` [PATCH V3 3/4] clk: imx8mm: Let IMX8MM_CLK_LCDIF_PIXEL set parent rate Adam Ford
@ 2023-03-23 22:51 ` Adam Ford
3 siblings, 0 replies; 5+ messages in thread
From: Adam Ford @ 2023-03-23 22:51 UTC (permalink / raw)
To: linux-clk
Cc: aford, Adam Ford, Fabio Estevam, Abel Vesa, Peng Fan,
Michael Turquette, Stephen Boyd, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, NXP Linux Team, linux-arm-kernel,
linux-kernel
By default the display pixel clock needs to be evenly divide
down from the video_pll_out clock which rules out a significant
number of resolution and refresh rates.
The current clock tree looks something like:
video_pll 594000000
video_pll_bypass 594000000
video_pll_out 594000000
disp_pixel 148500000
disp_pixel_clk 148500000
Now that composite-8m supports determine_rate, we can allow
disp_pixel to set the parent rate which then switches
every clock in the chain to a new frequency when disp_pixel
cannot evenly divide from video_pll_out.
Signed-off-by: Adam Ford <aford173@gmail.com>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
diff --git a/drivers/clk/imx/clk-imx8mn.c b/drivers/clk/imx/clk-imx8mn.c
index a042ed3a9d6c..4b23a4648600 100644
--- a/drivers/clk/imx/clk-imx8mn.c
+++ b/drivers/clk/imx/clk-imx8mn.c
@@ -470,7 +470,7 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
hws[IMX8MN_CLK_DRAM_ALT] = imx8m_clk_hw_fw_managed_composite("dram_alt", imx8mn_dram_alt_sels, base + 0xa000);
hws[IMX8MN_CLK_DRAM_APB] = imx8m_clk_hw_fw_managed_composite_critical("dram_apb", imx8mn_dram_apb_sels, base + 0xa080);
- hws[IMX8MN_CLK_DISP_PIXEL] = imx8m_clk_hw_composite("disp_pixel", imx8mn_disp_pixel_sels, base + 0xa500);
+ hws[IMX8MN_CLK_DISP_PIXEL] = imx8m_clk_hw_composite_flags("disp_pixel", imx8mn_disp_pixel_sels, base + 0xa500, CLK_SET_RATE_PARENT);
hws[IMX8MN_CLK_SAI2] = imx8m_clk_hw_composite("sai2", imx8mn_sai2_sels, base + 0xa600);
hws[IMX8MN_CLK_SAI3] = imx8m_clk_hw_composite("sai3", imx8mn_sai3_sels, base + 0xa680);
hws[IMX8MN_CLK_SAI5] = imx8m_clk_hw_composite("sai5", imx8mn_sai5_sels, base + 0xa780);
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread