clk: imx6: fix i.MX6DL clock tree to reflect reality
PATCH 1/2 clk: imx6: fix i.MX6DL clock tree to reflect reality
The current clock tree only implements the minimal set of differences between the i.MX6Q and the i.MX6DL, but that doesn't really reflect reality.
Apply the following fixes to match the RM:
- DL has no GPU3D_SHADER_SEL/PODF, the shader domain is clocked by GPU3D_CORE
- GPU3D_SHADER_SEL/PODF has been repurposed as GPU2D_CORE_SEL/PODF
- GPU2D_CORE_SEL/PODF has been repurposed as MLB_SEL/PODF
--- drivers/clk/imx/clk-imx6q.c | 28 ++++++++++++++++------------ include/dt-bindings/clock/imx6qdl-clock.h | 4 +++- 2 files changed, 19 insertions(+), 13 deletions(-)
drivers/clk/imx/clk-imx6q.c +16 -12
@@ -318,11 +318,16 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) clk[IMX6QDL_CLK_IPG_PER_SEL ] =imx_clk_mux ("ipg_per_sel" , base +0x1c ,6 ,1 , ipg_per_sels,ARRAY_SIZE (ipg_per_sels)); clk[IMX6QDL_CLK_UART_SEL ] =imx_clk_mux ("uart_sel" , base +0x24 ,6 ,1 , uart_sels,ARRAY_SIZE (uart_sels)); clk[IMX6QDL_CLK_GPU2D_CORE_SEL ] =imx_clk_mux ("gpu2d_core_sel" , base +0x18 ,16 ,2 , gpu2d_core_sels_2,ARRAY_SIZE (gpu2d_core_sels_2)); + }else if (clk_on_imx6dl ()) { + clk[IMX6QDL_CLK_MLB_SEL ] =imx_clk_mux ("mlb_sel" , base +0x18 ,16 ,2 , gpu2d_core_sels,ARRAY_SIZE (gpu2d_core_sels)); }else { clk[IMX6QDL_CLK_GPU2D_CORE_SEL ] =imx_clk_mux ("gpu2d_core_sel" , base +0x18 ,16 ,2 , gpu2d_core_sels,ARRAY_SIZE (gpu2d_core_sels)); } clk[IMX6QDL_CLK_GPU3D_CORE_SEL ] =imx_clk_mux ("gpu3d_core_sel" , base +0x18 ,4 ,2 , gpu3d_core_sels,ARRAY_SIZE (gpu3d_core_sels)); - clk[IMX6QDL_CLK_GPU3D_SHADER_SEL ] =imx_clk_mux ("gpu3d_shader_sel" , base +0x18 ,8 ,2 , gpu3d_shader_sels,ARRAY_SIZE (gpu3d_shader_sels)); +if (clk_on_imx6dl ()) + clk[IMX6QDL_CLK_GPU2D_CORE_SEL ] =imx_clk_mux ("gpu2d_core_sel" , base +0x18 ,8 ,2 , gpu3d_shader_sels,ARRAY_SIZE (gpu3d_shader_sels)); +else + clk[IMX6QDL_CLK_GPU3D_SHADER_SEL ] =imx_clk_mux ("gpu3d_shader_sel" , base +0x18 ,8 ,2 , gpu3d_shader_sels,ARRAY_SIZE (gpu3d_shader_sels)); clk[IMX6QDL_CLK_IPU1_SEL ] =imx_clk_mux ("ipu1_sel" , base +0x3c ,9 ,2 , ipu_sels,ARRAY_SIZE (ipu_sels)); clk[IMX6QDL_CLK_IPU2_SEL ] =imx_clk_mux ("ipu2_sel" , base +0x3c ,14 ,2 , ipu_sels,ARRAY_SIZE (ipu_sels)); clk[IMX6QDL_CLK_LDB_DI0_SEL ] =imx_clk_mux_flags ("ldb_di0_sel" , base +0x2c ,9 ,3 , ldb_di_sels,ARRAY_SIZE (ldb_di_sels),CLK_SET_RATE_PARENT );
@@ -400,9 +405,15 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) clk[IMX6QDL_CLK_LDB_DI0_DIV_3_5 ] =imx_clk_fixed_factor ("ldb_di0_div_3_5" ,"ldb_di0_sel" ,2 ,7 ); clk[IMX6QDL_CLK_LDB_DI1_DIV_3_5 ] =imx_clk_fixed_factor ("ldb_di1_div_3_5" ,"ldb_di1_sel" ,2 ,7 ); } - clk[IMX6QDL_CLK_GPU2D_CORE_PODF ] =imx_clk_divider ("gpu2d_core_podf" ,"gpu2d_core_sel" , base +0x18 ,23 ,3 ); +if (clk_on_imx6dl ()) + clk[IMX6QDL_CLK_MLB_PODF ] =imx_clk_divider ("mlb_podf" ,"mlb_sel" , base +0x18 ,23 ,3 ); +else + clk[IMX6QDL_CLK_GPU2D_CORE_PODF ] =imx_clk_divider ("gpu2d_core_podf" ,"gpu2d_core_sel" , base +0x18 ,23 ,3 ); clk[IMX6QDL_CLK_GPU3D_CORE_PODF ] =imx_clk_divider ("gpu3d_core_podf" ,"gpu3d_core_sel" , base +0x18 ,26 ,3 ); - clk[IMX6QDL_CLK_GPU3D_SHADER ] =imx_clk_divider ("gpu3d_shader" ,"gpu3d_shader_sel" , base +0x18 ,29 ,3 ); +if (clk_on_imx6dl ()) + clk[IMX6QDL_CLK_GPU2D_CORE_PODF ] =imx_clk_divider ("gpu2d_core_podf" ,"gpu2d_core_sel" , base +0x18 ,29 ,3 ); +else + clk[IMX6QDL_CLK_GPU3D_SHADER ] =imx_clk_divider ("gpu3d_shader" ,"gpu3d_shader_sel" , base +0x18 ,29 ,3 ); clk[IMX6QDL_CLK_IPU1_PODF ] =imx_clk_divider ("ipu1_podf" ,"ipu1_sel" , base +0x3c ,11 ,3 ); clk[IMX6QDL_CLK_IPU2_PODF ] =imx_clk_divider ("ipu2_podf" ,"ipu2_sel" , base +0x3c ,16 ,3 ); clk[IMX6QDL_CLK_LDB_DI0_PODF ] =imx_clk_divider_flags ("ldb_di0_podf" ,"ldb_di0_div_3_5" , base +0x20 ,10 ,1 ,0 );
@@ -473,14 +484,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) clk[IMX6QDL_CLK_ESAI_MEM ] =imx_clk_gate2_shared ("esai_mem" ,"ahb" , base +0x6c ,16 , &share_count_esai); clk[IMX6QDL_CLK_GPT_IPG ] =imx_clk_gate2 ("gpt_ipg" ,"ipg" , base +0x6c ,20 ); clk[IMX6QDL_CLK_GPT_IPG_PER ] =imx_clk_gate2 ("gpt_ipg_per" ,"ipg_per" , base +0x6c ,22 ); -if (clk_on_imx6dl ()) -/* -* The multiplexer and divider of imx6q clock gpu3d_shader get -* redefined/reused as gpu2d_core_sel and gpu2d_core_podf on imx6dl. -*/ - clk[IMX6QDL_CLK_GPU2D_CORE ] =imx_clk_gate2 ("gpu2d_core" ,"gpu3d_shader" , base +0x6c ,24 ); -else - clk[IMX6QDL_CLK_GPU2D_CORE ] =imx_clk_gate2 ("gpu2d_core" ,"gpu2d_core_podf" , base +0x6c ,24 ); + clk[IMX6QDL_CLK_GPU2D_CORE ] =imx_clk_gate2 ("gpu2d_core" ,"gpu2d_core_podf" , base +0x6c ,24 ); clk[IMX6QDL_CLK_GPU3D_CORE ] =imx_clk_gate2 ("gpu3d_core" ,"gpu3d_core_podf" , base +0x6c ,26 ); clk[IMX6QDL_CLK_HDMI_IAHB ] =imx_clk_gate2 ("hdmi_iahb" ,"ahb" , base +0x70 ,0 ); clk[IMX6QDL_CLK_HDMI_ISFR ] =imx_clk_gate2 ("hdmi_isfr" ,"video_27m" , base +0x70 ,4 );
@@ -511,7 +515,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)* The multiplexer and divider of the imx6q clock gpu2d get * redefined/reused as mlb_sys_sel and mlb_sys_clk_podf on imx6dl. */ - clk[IMX6QDL_CLK_MLB ] =imx_clk_gate2 ("mlb" ,"gpu2d_core_podf" , base +0x74 ,18 ); + clk[IMX6QDL_CLK_MLB ] =imx_clk_gate2 ("mlb" ,"mlb_podf" , base +0x74 ,18 ); else clk[IMX6QDL_CLK_MLB ] =imx_clk_gate2 ("mlb" ,"axi" , base +0x74 ,18 ); clk[IMX6QDL_CLK_MMDC_CH0_AXI ] =imx_clk_gate2 ("mmdc_ch0_axi" ,"mmdc_ch0_axi_podf" , base +0x74 ,20 );
include/dt-bindings/clock/imx6qdl-clock.h +3 -1
@@ -269,6 +269,8 @@#define IMX6QDL_CLK_PRG0_APB 256#define IMX6QDL_CLK_PRG1_APB 257#define IMX6QDL_CLK_PRE_AXI 258 -#define IMX6QDL_CLK_END 259 +#define IMX6QDL_CLK_MLB_SEL 259 +#define IMX6QDL_CLK_MLB_PODF 260 +#define IMX6QDL_CLK_END 261#endif /* __DT_BINDINGS_CLOCK_IMX6QDL_H */
Signature · 1 line
2.8.1
PATCH 2/2 clk: imx6: initialize GPU clocks
Initialize the GPU clock muxes to sane inputs. Until now they have not been changed from their default values, which means that both GPU3D shader and GPU2D core were fed by clock inputs whose rates exceed the maximium allowed frequency of the cores by as much as 200MHz.
This fixes a severe GPU stability issue on i.MX6DL.
--- drivers/clk/imx/clk-imx6q.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/clk/imx/clk-imx6q.c +18 -0
@@ -633,6 +633,24 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)if (IS_ENABLED (CONFIG_PCI_IMX6 ))clk_set_parent (clk[IMX6QDL_CLK_LVDS1_SEL ], clk[IMX6QDL_CLK_SATA_REF_100M ]); +/* +* Initialize the GPU clock muxes, so that the maximum specified clock +* rates for the respective SoC are not exceeded. +*/ +if (clk_on_imx6dl ()) { +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); +clk_set_parent (clk[IMX6QDL_CLK_GPU2D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); + }else if (clk_on_imx6q ()) { +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_CORE_SEL ], + clk[IMX6QDL_CLK_MMDC_CH0_AXI ]); +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_SHADER_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); +clk_set_parent (clk[IMX6QDL_CLK_GPU2D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL3_USB_OTG ]); + } +imx_register_uart_clocks (uart_clks); }CLK_OF_DECLARE (imx6q,"fsl,imx6q-ccm" , imx6q_clocks_init);
Signature · 1 line
2.8.1
PATCH 2/2 clk: imx6: initialize GPU clocks
Quoted 30 lines · Lucas Stach
Initialize the GPU clock muxes to sane inputs. Until now they have not been changed from their default values, which means that both GPU3D shader and GPU2D core were fed by clock inputs whose rates exceed the maximium allowed frequency of the cores by as much as 200MHz.
This fixes a severe GPU stability issue on i.MX6DL.
Cc stable at vger.kernel.orgSigned-off-by Lucas Stach <[email protected]>--- drivers/clk/imx/clk-imx6q.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)drivers/clk/imx/clk-imx6q.c +8
-0@@ -633,6 +633,24 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)if (IS_ENABLED (CONFIG_PCI_IMX6 ))clk_set_parent (clk[IMX6QDL_CLK_LVDS1_SEL ], clk[IMX6QDL_CLK_SATA_REF_100M ]); +/* +* Initialize the GPU clock muxes, so that the maximum specified clock +* rates for the respective SoC are not exceeded. +*/ +if (clk_on_imx6dl ()) { +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); + clk_set_parent(clk[IMX6QDL_CLK_GPU2D_CORE_SEL],
drivers/clk/imx/clk-imx6q.c static void __init imx6q_clocks_init(struct device_node *ccm_node) · line 653
Quoted 10 lines
drivers/clk/imx/clk-imx6q.c +10
-0+ clk[IMX6QDL_CLK_PLL2_PFD1_594M]); + }else if (clk_on_imx6q ()) { +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_CORE_SEL ], + clk[IMX6QDL_CLK_MMDC_CH0_AXI ]); +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_SHADER_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); +clk_set_parent (clk[IMX6QDL_CLK_GPU2D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL3_USB_OTG ]); + } +
Can we handle these with assigned-clock-parents from device tree?
Shawn
Quoted 11 lines
drivers/clk/imx/clk-imx6q.c +0
-0imx_register_uart_clocks (uart_clks); }CLK_OF_DECLARE (imx6q,"fsl,imx6q-ccm" , imx6q_clocks_init);Signature · 7 lines
2.8.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH 2/2 clk: imx6: initialize GPU clocks
Am Sonntag, den 18.09.2016, 08:17 +0800 schrieb Shawn Guo:
Quoted 35 lines · Lucas Stach
Quoted 34 lines
Initialize the GPU clock muxes to sane inputs. Until now they have not been changed from their default values, which means that both GPU3D shader and GPU2D core were fed by clock inputs whose rates exceed the maximium allowed frequency of the cores by as much as 200MHz.
This fixes a severe GPU stability issue on i.MX6DL.
Cc stable at vger.kernel.orgSigned-off-by Lucas Stach <[email protected]>--- drivers/clk/imx/clk-imx6q.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)drivers/clk/imx/clk-imx6q.c +12
-0@@ -633,6 +633,24 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)if (IS_ENABLED (CONFIG_PCI_IMX6 ))clk_set_parent (clk[IMX6QDL_CLK_LVDS1_SEL ], clk[IMX6QDL_CLK_SATA_REF_100M ]); +/* +* Initialize the GPU clock muxes, so that the maximum specified clock +* rates for the respective SoC are not exceeded. +*/ +if (clk_on_imx6dl ()) { +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); +clk_set_parent (clk[IMX6QDL_CLK_GPU2D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); + }else if (clk_on_imx6q ()) { +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_CORE_SEL ], + clk[IMX6QDL_CLK_MMDC_CH0_AXI ]);
Quoted 9 lines
drivers/clk/imx/clk-imx6q.c static void __init imx6q_clocks_init(struct device_node *ccm_node) · line 653
Quoted 6 lines
drivers/clk/imx/clk-imx6q.c +6
-0+clk_set_parent (clk[IMX6QDL_CLK_GPU3D_SHADER_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); +clk_set_parent (clk[IMX6QDL_CLK_GPU2D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL3_USB_OTG ]); + } +Can we handle these with assigned-clock-parents from device tree?
No, we want to get rid of the GPU overclocking even with old DTs. DT stability rules and all that...
Regards,
Lucas
PATCH 2/2 clk: imx6: initialize GPU clocks
Quoted 29 lines · Lucas Stach
Quoted 20 lines
Quoted 20 lines
drivers/clk/imx/clk-imx6q.c +12
-0@@ -633,6 +633,24 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)if (IS_ENABLED (CONFIG_PCI_IMX6 ))clk_set_parent (clk[IMX6QDL_CLK_LVDS1_SEL ], clk[IMX6QDL_CLK_SATA_REF_100M ]); +/* +* Initialize the GPU clock muxes, so that the maximum specified clock +* rates for the respective SoC are not exceeded. +*/ +if (clk_on_imx6dl ()) { +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); +clk_set_parent (clk[IMX6QDL_CLK_GPU2D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); + }else if (clk_on_imx6q ()) { +clk_set_parent (clk[IMX6QDL_CLK_GPU3D_CORE_SEL ], + clk[IMX6QDL_CLK_MMDC_CH0_AXI ]);Quoted 9 lines
drivers/clk/imx/clk-imx6q.c static void __init imx6q_clocks_init(struct device_node *ccm_node) · line 653
Quoted 6 lines
drivers/clk/imx/clk-imx6q.c +6
-0+clk_set_parent (clk[IMX6QDL_CLK_GPU3D_SHADER_SEL ], + clk[IMX6QDL_CLK_PLL2_PFD1_594M ]); +clk_set_parent (clk[IMX6QDL_CLK_GPU2D_CORE_SEL ], + clk[IMX6QDL_CLK_PLL3_USB_OTG ]); + } +Can we handle these with assigned-clock-parents from device tree?
Quoted 2 lines
No, we want to get rid of the GPU overclocking even with old DTs. DT stability rules and all that...
Fair point. For both patches,
Stephen Boyd
AppliedPATCH 2/2 clk: imx6: initialize GPU clocks
In reply to Lucas StachQuoted 11 lines · Lucas Stach
Initialize the GPU clock muxes to sane inputs. Until now they have not been changed from their default values, which means that both GPU3D shader and GPU2D core were fed by clock inputs whose rates exceed the maximium allowed frequency of the cores by as much as 200MHz.
This fixes a severe GPU stability issue on i.MX6DL.
Cc stable at vger.kernel.orgSigned-off-by Lucas Stach <[email protected]>---
Applied to clk-next
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH 1/2 clk: imx6: fix i.MX6DL clock tree to reflect reality
In reply to Lucas StachHi Anson,
Can you please help review/confirm the following clock tree changes for i.MX6DL? Thanks.
Shawn
Quoted 104 lines · Lucas Stach
The current clock tree only implements the minimal set of differences between the i.MX6Q and the i.MX6DL, but that doesn't really reflect reality.
Apply the following fixes to match the RM:
- DL has no GPU3D_SHADER_SEL/PODF, the shader domain is clocked byGPU3D_CORE
- GPU3D_SHADER_SEL/PODF has been repurposed as GPU2D_CORE_SEL/PODF
- GPU2D_CORE_SEL/PODF has been repurposed as MLB_SEL/PODFCc stable at vger.kernel.orgSigned-off-by Lucas Stach <[email protected]>--- drivers/clk/imx/clk-imx6q.c | 28 ++++++++++++++++------------ include/dt-bindings/clock/imx6qdl-clock.h | 4 +++- 2 files changed, 19 insertions(+), 13 deletions(-)drivers/clk/imx/clk-imx6q.c +16
-12@@ -318,11 +318,16 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) clk[IMX6QDL_CLK_IPG_PER_SEL ] =imx_clk_mux ("ipg_per_sel" , base +0x1c ,6 ,1 , ipg_per_sels,ARRAY_SIZE (ipg_per_sels)); clk[IMX6QDL_CLK_UART_SEL ] =imx_clk_mux ("uart_sel" , base +0x24 ,6 ,1 , uart_sels,ARRAY_SIZE (uart_sels)); clk[IMX6QDL_CLK_GPU2D_CORE_SEL ] =imx_clk_mux ("gpu2d_core_sel" , base +0x18 ,16 ,2 , gpu2d_core_sels_2,ARRAY_SIZE (gpu2d_core_sels_2)); + }else if (clk_on_imx6dl ()) { + clk[IMX6QDL_CLK_MLB_SEL ] =imx_clk_mux ("mlb_sel" , base +0x18 ,16 ,2 , gpu2d_core_sels,ARRAY_SIZE (gpu2d_core_sels)); }else { clk[IMX6QDL_CLK_GPU2D_CORE_SEL ] =imx_clk_mux ("gpu2d_core_sel" , base +0x18 ,16 ,2 , gpu2d_core_sels,ARRAY_SIZE (gpu2d_core_sels)); } clk[IMX6QDL_CLK_GPU3D_CORE_SEL ] =imx_clk_mux ("gpu3d_core_sel" , base +0x18 ,4 ,2 , gpu3d_core_sels,ARRAY_SIZE (gpu3d_core_sels)); - clk[IMX6QDL_CLK_GPU3D_SHADER_SEL ] =imx_clk_mux ("gpu3d_shader_sel" , base +0x18 ,8 ,2 , gpu3d_shader_sels,ARRAY_SIZE (gpu3d_shader_sels)); +if (clk_on_imx6dl ()) + clk[IMX6QDL_CLK_GPU2D_CORE_SEL ] =imx_clk_mux ("gpu2d_core_sel" , base +0x18 ,8 ,2 , gpu3d_shader_sels,ARRAY_SIZE (gpu3d_shader_sels)); +else + clk[IMX6QDL_CLK_GPU3D_SHADER_SEL ] =imx_clk_mux ("gpu3d_shader_sel" , base +0x18 ,8 ,2 , gpu3d_shader_sels,ARRAY_SIZE (gpu3d_shader_sels)); clk[IMX6QDL_CLK_IPU1_SEL ] =imx_clk_mux ("ipu1_sel" , base +0x3c ,9 ,2 , ipu_sels,ARRAY_SIZE (ipu_sels)); clk[IMX6QDL_CLK_IPU2_SEL ] =imx_clk_mux ("ipu2_sel" , base +0x3c ,14 ,2 , ipu_sels,ARRAY_SIZE (ipu_sels)); clk[IMX6QDL_CLK_LDB_DI0_SEL ] =imx_clk_mux_flags ("ldb_di0_sel" , base +0x2c ,9 ,3 , ldb_di_sels,ARRAY_SIZE (ldb_di_sels),CLK_SET_RATE_PARENT );@@ -400,9 +405,15 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) clk[IMX6QDL_CLK_LDB_DI0_DIV_3_5 ] =imx_clk_fixed_factor ("ldb_di0_div_3_5" ,"ldb_di0_sel" ,2 ,7 ); clk[IMX6QDL_CLK_LDB_DI1_DIV_3_5 ] =imx_clk_fixed_factor ("ldb_di1_div_3_5" ,"ldb_di1_sel" ,2 ,7 ); } - clk[IMX6QDL_CLK_GPU2D_CORE_PODF ] =imx_clk_divider ("gpu2d_core_podf" ,"gpu2d_core_sel" , base +0x18 ,23 ,3 ); +if (clk_on_imx6dl ()) + clk[IMX6QDL_CLK_MLB_PODF ] =imx_clk_divider ("mlb_podf" ,"mlb_sel" , base +0x18 ,23 ,3 ); +else + clk[IMX6QDL_CLK_GPU2D_CORE_PODF ] =imx_clk_divider ("gpu2d_core_podf" ,"gpu2d_core_sel" , base +0x18 ,23 ,3 ); clk[IMX6QDL_CLK_GPU3D_CORE_PODF ] =imx_clk_divider ("gpu3d_core_podf" ,"gpu3d_core_sel" , base +0x18 ,26 ,3 ); - clk[IMX6QDL_CLK_GPU3D_SHADER ] =imx_clk_divider ("gpu3d_shader" ,"gpu3d_shader_sel" , base +0x18 ,29 ,3 ); +if (clk_on_imx6dl ()) + clk[IMX6QDL_CLK_GPU2D_CORE_PODF ] =imx_clk_divider ("gpu2d_core_podf" ,"gpu2d_core_sel" , base +0x18 ,29 ,3 ); +else + clk[IMX6QDL_CLK_GPU3D_SHADER ] =imx_clk_divider ("gpu3d_shader" ,"gpu3d_shader_sel" , base +0x18 ,29 ,3 ); clk[IMX6QDL_CLK_IPU1_PODF ] =imx_clk_divider ("ipu1_podf" ,"ipu1_sel" , base +0x3c ,11 ,3 ); clk[IMX6QDL_CLK_IPU2_PODF ] =imx_clk_divider ("ipu2_podf" ,"ipu2_sel" , base +0x3c ,16 ,3 ); clk[IMX6QDL_CLK_LDB_DI0_PODF ] =imx_clk_divider_flags ("ldb_di0_podf" ,"ldb_di0_div_3_5" , base +0x20 ,10 ,1 ,0 );@@ -473,14 +484,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) clk[IMX6QDL_CLK_ESAI_MEM ] =imx_clk_gate2_shared ("esai_mem" ,"ahb" , base +0x6c ,16 , &share_count_esai); clk[IMX6QDL_CLK_GPT_IPG ] =imx_clk_gate2 ("gpt_ipg" ,"ipg" , base +0x6c ,20 ); clk[IMX6QDL_CLK_GPT_IPG_PER ] =imx_clk_gate2 ("gpt_ipg_per" ,"ipg_per" , base +0x6c ,22 ); -if (clk_on_imx6dl ()) -/* -* The multiplexer and divider of imx6q clock gpu3d_shader get -* redefined/reused as gpu2d_core_sel and gpu2d_core_podf on imx6dl. -*/ - clk[IMX6QDL_CLK_GPU2D_CORE ] =imx_clk_gate2 ("gpu2d_core" ,"gpu3d_shader" , base +0x6c ,24 ); -else - clk[IMX6QDL_CLK_GPU2D_CORE ] =imx_clk_gate2 ("gpu2d_core" ,"gpu2d_core_podf" , base +0x6c ,24 ); + clk[IMX6QDL_CLK_GPU2D_CORE ] =imx_clk_gate2 ("gpu2d_core" ,"gpu2d_core_podf" , base +0x6c ,24 ); clk[IMX6QDL_CLK_GPU3D_CORE ] =imx_clk_gate2 ("gpu3d_core" ,"gpu3d_core_podf" , base +0x6c ,26 ); clk[IMX6QDL_CLK_HDMI_IAHB ] =imx_clk_gate2 ("hdmi_iahb" ,"ahb" , base +0x70 ,0 ); clk[IMX6QDL_CLK_HDMI_ISFR ] =imx_clk_gate2 ("hdmi_isfr" ,"video_27m" , base +0x70 ,4 );@@ -511,7 +515,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)* The multiplexer and divider of the imx6q clock gpu2d get * redefined/reused as mlb_sys_sel and mlb_sys_clk_podf on imx6dl. */ - clk[IMX6QDL_CLK_MLB ] =imx_clk_gate2 ("mlb" ,"gpu2d_core_podf" , base +0x74 ,18 ); + clk[IMX6QDL_CLK_MLB ] =imx_clk_gate2 ("mlb" ,"mlb_podf" , base +0x74 ,18 ); else clk[IMX6QDL_CLK_MLB ] =imx_clk_gate2 ("mlb" ,"axi" , base +0x74 ,18 ); clk[IMX6QDL_CLK_MMDC_CH0_AXI ] =imx_clk_gate2 ("mmdc_ch0_axi" ,"mmdc_ch0_axi_podf" , base +0x74 ,20 );include/dt-bindings/clock/imx6qdl-clock.h +3
-1@@ -269,6 +269,8 @@#define IMX6QDL_CLK_PRG0_APB 256#define IMX6QDL_CLK_PRG1_APB 257#define IMX6QDL_CLK_PRE_AXI 258 -#define IMX6QDL_CLK_END 259 +#define IMX6QDL_CLK_MLB_SEL 259 +#define IMX6QDL_CLK_MLB_PODF 260 +#define IMX6QDL_CLK_END 261#endif /* __DT_BINDINGS_CLOCK_IMX6QDL_H */ Signature · 7 lines
2.8.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Stephen Boyd
AppliedPATCH 1/2 clk: imx6: fix i.MX6DL clock tree to reflect reality
In reply to Lucas StachQuoted 10 lines · Lucas Stach
The current clock tree only implements the minimal set of differences between the i.MX6Q and the i.MX6DL, but that doesn't really reflect reality.
Apply the following fixes to match the RM:
- DL has no GPU3D_SHADER_SEL/PODF, the shader domain is clocked byGPU3D_CORE
- GPU3D_SHADER_SEL/PODF has been repurposed as GPU2D_CORE_SEL/PODF
- GPU2D_CORE_SEL/PODF has been repurposed as MLB_SEL/PODF
Quoted 3 lines
Cc stable at vger.kernel.orgSigned-off-by Lucas Stach <[email protected]>---
Applied to clk-next
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project