[PATCH v4 06/15] clk: exynos5420: update clocks for DISP1 block
Shaik Ameer Basha
shaik.samsung at gmail.com
Wed May 7 05:39:56 PDT 2014
Hi Tomasz,
On Tue, May 6, 2014 at 10:48 PM, Tomasz Figa <tomasz.figa at gmail.com> wrote:
> Hi Shaik,
>
>
> On 06.05.2014 18:26, Shaik Ameer Basha wrote:
>>
>> This patch corrects some child-parent clock relationships,
>> and updates the clocks according to the latest datasheet.
>>
>> Signed-off-by: Rahul Sharma <rahul.sharma at samsung.com>
>> Signed-off-by: Shaik Ameer Basha <shaik.ameer at samsung.com>
>> ---
>> drivers/clk/samsung/clk-exynos5420.c | 58
>> ++++++++++++++++++++++----------
>> include/dt-bindings/clock/exynos5420.h | 3 +-
>> 2 files changed, 43 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/clk/samsung/clk-exynos5420.c
>> b/drivers/clk/samsung/clk-exynos5420.c
>> index 5bc4798..9750659 100644
>> --- a/drivers/clk/samsung/clk-exynos5420.c
>> +++ b/drivers/clk/samsung/clk-exynos5420.c
>> @@ -61,7 +61,8 @@
>> #define SRC_TOP10 0x10280
>> #define SRC_TOP11 0x10284
>> #define SRC_TOP12 0x10288
>> -#define SRC_MASK_DISP10 0x1032c
>> +#define SRC_MASK_TOP2 0x10308
>> +#define SRC_MASK_DISP10 0x1032c
>> #define SRC_MASK_FSYS 0x10340
>> #define SRC_MASK_PERIC0 0x10350
>> #define SRC_MASK_PERIC1 0x10354
>> @@ -100,6 +101,7 @@
>> #define GATE_TOP_SCLK_MAU 0x1083c
>> #define GATE_TOP_SCLK_FSYS 0x10840
>> #define GATE_TOP_SCLK_PERIC 0x10850
>> +#define TOP_SPARE2 0x10b08
>> #define BPLL_LOCK 0x20010
>> #define BPLL_CON0 0x20110
>> #define SRC_CDREX 0x20200
>> @@ -146,6 +148,7 @@ static unsigned long exynos5420_clk_regs[] __initdata
>> = {
>> SRC_TOP10,
>> SRC_TOP11,
>> SRC_TOP12,
>> + SRC_MASK_TOP2,
>> SRC_MASK_DISP10,
>> SRC_MASK_FSYS,
>> SRC_MASK_PERIC0,
>> @@ -186,6 +189,7 @@ static unsigned long exynos5420_clk_regs[] __initdata
>> = {
>> GATE_TOP_SCLK_MAU,
>> GATE_TOP_SCLK_FSYS,
>> GATE_TOP_SCLK_PERIC,
>> + TOP_SPARE2,
>> SRC_CDREX,
>> SRC_KFC,
>> DIV_KFC0,
>> @@ -252,6 +256,7 @@ PNAME(mout_group3_p) = {"mout_sclk_rpll",
>> "mout_sclk_spll"};
>> PNAME(mout_group4_p) = {"mout_sclk_ipll", "mout_sclk_dpll",
>> "mout_sclk_mpll"};
>> PNAME(mout_group5_p) = {"mout_sclk_vpll", "mout_sclk_dpll"};
>>
>> +PNAME(mout_fimd1_final_p) = {"mout_fimd1", "mout_fimd1_opt"};
>> PNAME(mout_sw_aclk66_p) = {"dout_aclk66", "mout_sclk_spll"};
>> PNAME(mout_aclk66_peric_p) = { "fin_pll", "mout_sw_aclk66" };
>>
>> @@ -271,7 +276,7 @@ PNAME(mout_sw_aclk333_432_isp_p) =
>> {"dout_aclk333_432_isp", "mout_sclk_spll"};
>> PNAME(mout_user_aclk333_432_isp_p) = {"fin_pll",
>> "mout_sw_aclk333_432_isp"};
>>
>> PNAME(mout_sw_aclk200_p) = {"dout_aclk200", "mout_sclk_spll"};
>> -PNAME(mout_aclk200_disp1_p) = {"fin_pll", "mout_sw_aclk200"};
>> +PNAME(mout_user_aclk200_disp1_p) = {"fin_pll", "mout_sw_aclk200"};
>>
>> PNAME(mout_sw_aclk400_mscl_p) = {"dout_aclk400_mscl", "mout_sclk_spll"};
>> PNAME(mout_user_aclk400_mscl_p) = {"fin_pll",
>> "mout_sw_aclk400_mscl"};
>> @@ -293,7 +298,9 @@ PNAME(mout_sw_aclk300_gscl_p) = {"dout_aclk300_gscl",
>> "mout_sclk_spll"};
>> PNAME(mout_user_aclk300_gscl_p) = {"fin_pll",
>> "mout_sw_aclk300_gscl"};
>>
>> PNAME(mout_sw_aclk300_disp1_p) = {"dout_aclk300_disp1",
>> "mout_sclk_spll"};
>> +PNAME(mout_sw_aclk400_disp1_p) = {"dout_aclk400_disp1",
>> "mout_sclk_spll"};
>> PNAME(mout_user_aclk300_disp1_p) = {"fin_pll", "mout_sw_aclk300_disp1"};
>> +PNAME(mout_user_aclk400_disp1_p) = {"fin_pll", "mout_sw_aclk400_disp1"};
>>
>> PNAME(mout_sw_aclk300_jpeg_p) = {"dout_aclk300_jpeg", "mout_sclk_spll"};
>> PNAME(mout_user_aclk300_jpeg_p) = {"fin_pll", "mout_sw_aclk300_jpeg"};
>> @@ -368,6 +375,7 @@ static struct samsung_mux_clock exynos5420_mux_clks[]
>> __initdata = {
>> MUX(0, "mout_aclk166", mout_group1_p, SRC_TOP1, 24, 2),
>> MUX(0, "mout_aclk333", mout_group1_p, SRC_TOP1, 28, 2),
>>
>> + MUX(0, "mout_aclk400_disp1", mout_group1_p, SRC_TOP2, 4, 2),
>> MUX(0, "mout_aclk333_g2d", mout_group1_p, SRC_TOP2, 8, 2),
>> MUX(0, "mout_aclk266_g2d", mout_group1_p, SRC_TOP2, 12, 2),
>> MUX(0, "mout_aclk_g3d", mout_group5_p, SRC_TOP2, 16, 1),
>> @@ -379,7 +387,8 @@ static struct samsung_mux_clock exynos5420_mux_clks[]
>> __initdata = {
>> SRC_TOP3, 0, 1),
>> MUX(0, "mout_user_aclk400_mscl", mout_user_aclk400_mscl_p,
>> SRC_TOP3, 4, 1),
>> - MUX(0, "mout_aclk200_disp1", mout_aclk200_disp1_p, SRC_TOP3, 8,
>> 1),
>> + MUX(0, "mout_user_aclk200_disp1", mout_user_aclk200_disp1_p,
>> + SRC_TOP3, 8, 1),
>> MUX(0, "mout_user_aclk200_fsys2", mout_user_aclk200_fsys2_p,
>> SRC_TOP3, 12, 1),
>> MUX(0, "mout_user_aclk200_fsys", mout_user_aclk200_fsys_p,
>> @@ -398,6 +407,8 @@ static struct samsung_mux_clock exynos5420_mux_clks[]
>> __initdata = {
>> MUX(0, "mout_user_aclk166", mout_user_aclk166_p, SRC_TOP4, 24, 1),
>> MUX(0, "mout_user_aclk333", mout_user_aclk333_p, SRC_TOP4, 28, 1),
>>
>> + MUX(0, "mout_user_aclk400_disp1", mout_user_aclk400_disp1_p,
>> + SRC_TOP5, 0, 1),
>> MUX(0, "mout_aclk66_psgen", mout_aclk66_peric_p, SRC_TOP5, 4, 1),
>> MUX(0, "mout_user_aclk333_g2d", mout_user_aclk333_g2d_p, SRC_TOP5,
>> 8, 1),
>> @@ -442,6 +453,8 @@ static struct samsung_mux_clock exynos5420_mux_clks[]
>> __initdata = {
>> MUX(0, "mout_sw_aclk166", mout_sw_aclk166_p, SRC_TOP11, 24, 1),
>> MUX(0, "mout_sw_aclk333", mout_sw_aclk333_p, SRC_TOP11, 28, 1),
>>
>> + MUX(0, "mout_sw_aclk400_disp1", mout_sw_aclk400_disp1_p,
>> + SRC_TOP12, 4, 1),
>> MUX(0, "mout_sw_aclk333_g2d", mout_sw_aclk333_g2d_p,
>> SRC_TOP12, 8, 1),
>> MUX(0, "mout_sw_aclk266_g2d", mout_sw_aclk266_g2d_p,
>> @@ -460,6 +473,10 @@ static struct samsung_mux_clock exynos5420_mux_clks[]
>> __initdata = {
>> MUX(0, "mout_dp1", mout_group2_p, SRC_DISP10, 20, 3),
>> MUX(0, "mout_pixel", mout_group2_p, SRC_DISP10, 24, 3),
>> MUX(CLK_MOUT_HDMI, "mout_hdmi", mout_hdmi_p, SRC_DISP10, 28, 1),
>> + MUX_F(0, "mout_fimd1_opt", mout_group2_p,
>> + SRC_DISP10, 8, 3, CLK_SET_RATE_PARENT, 0),
>> + MUX_F(0, "mout_fimd1_final", mout_fimd1_final_p,
>> + TOP_SPARE2, 8, 1, CLK_SET_RATE_PARENT, 0),
>
>
> the CLK_SET_RATE_PARENT flag doesn't seem right here as it would cause
> reconfiguration of a lot of shared clocks if set_rate called on this clock.
> Is there any reason to have it here?
>
> In general this flag should be set for simple clock paths without nodes
> inside shared across multiple other clock paths to don't let one driver step
> on another with calls to clk_set_rate().
>
>
>>
>> /* MAU Block */
>> MUX(0, "mout_maudio0", mout_maudio0_p, SRC_MAU, 28, 3),
>> @@ -523,15 +540,16 @@ static struct samsung_div_clock
>> exynos5420_div_clks[] __initdata = {
>> DIV(0, "dout_aclk266_g2d", "mout_aclk266_g2d", DIV_TOP2, 12, 3),
>> DIV(0, "dout_aclk_g3d", "mout_aclk_g3d", DIV_TOP2, 16, 3),
>> DIV(0, "dout_aclk300_jpeg", "mout_aclk300_jpeg", DIV_TOP2, 20, 3),
>> - DIV_A(0, "dout_aclk300_disp1", "mout_aclk300_disp1",
>> - DIV_TOP2, 24, 3, "aclk300_disp1"),
>> + DIV(0, "dout_aclk300_disp1", "mout_aclk300_disp1", DIV_TOP2, 24,
>> 3),
>> DIV(0, "dout_aclk300_gscl", "mout_aclk300_gscl", DIV_TOP2, 28, 3),
>>
>> /* DISP1 Block */
>> - DIV(0, "dout_fimd1", "mout_fimd1", DIV_DISP10, 0, 4),
>> + DIV(0, "dout_fimd1", "mout_fimd1_final", DIV_DISP10, 0, 4),
>> DIV(0, "dout_mipi1", "mout_mipi1", DIV_DISP10, 16, 8),
>> DIV(0, "dout_dp1", "mout_dp1", DIV_DISP10, 24, 4),
>> DIV(CLK_DOUT_PIXEL, "dout_hdmi_pixel", "mout_pixel", DIV_DISP10,
>> 28, 4),
>> + DIV(0, "dout_disp1_blk", "aclk200_disp1", DIV2_RATIO0, 16, 2),
>> + DIV(0, "dout_aclk400_disp1", "mout_aclk400_disp1", DIV_TOP2, 4,
>> 3),
>>
>> /* Audio Block */
>> DIV(0, "dout_maudio0", "mout_maudio0", DIV_MAU, 20, 4),
>> @@ -640,6 +658,11 @@ static struct samsung_gate_clock
>> exynos5420_gate_clks[] __initdata = {
>> GATE_BUS_TOP, 16, 0, 0),
>> GATE(CLK_ACLK400_MSCL, "aclk400_mscl", "mout_user_aclk400_mscl",
>> GATE_BUS_TOP, 17, CLK_IGNORE_UNUSED, 0),
>> + GATE(CLK_ACLK200_DISP1, "aclk200_disp1",
>> "mout_user_aclk200_disp1",
>> + GATE_BUS_TOP, 18, CLK_IGNORE_UNUSED, 0),
>> +
>> + GATE(CLK_ACLK300_DISP1, "aclk300_disp1",
>> "mout_user_aclk300_disp1",
>> + SRC_MASK_TOP2, 24, CLK_IGNORE_UNUSED, 0),
>
>
> The CLK_IGNORE_UNUSED flags would suggest that you don't need to define this
> clock here at all and use their parents directly for child clocks of these
> intermediate clocks defined here. In general, this is related to the mis-use
> of GATE_BUS_* registers in this driver.
True. I will fix this. And try to remove the GATE_BUS_* usage as much
as possible.
Regards,
Shaik
>
>
>>
>> /* sclk */
>> GATE(CLK_SCLK_UART0, "sclk_uart0", "dout_uart0",
>> @@ -689,15 +712,15 @@ static struct samsung_gate_clock
>> exynos5420_gate_clks[] __initdata = {
>>
>> /* Display */
>> GATE(CLK_SCLK_FIMD1, "sclk_fimd1", "dout_fimd1",
>> - GATE_TOP_SCLK_DISP1, 0, CLK_SET_RATE_PARENT, 0),
>> + GATE_TOP_SCLK_DISP1, 0, CLK_SET_RATE_PARENT, 0),
>> GATE(CLK_SCLK_MIPI1, "sclk_mipi1", "dout_mipi1",
>> - GATE_TOP_SCLK_DISP1, 3, CLK_SET_RATE_PARENT, 0),
>> + GATE_TOP_SCLK_DISP1, 3, CLK_SET_RATE_PARENT, 0),
>> GATE(CLK_SCLK_HDMI, "sclk_hdmi", "mout_hdmi",
>> - GATE_TOP_SCLK_DISP1, 9, CLK_SET_RATE_PARENT, 0),
>> + GATE_TOP_SCLK_DISP1, 9, CLK_SET_RATE_PARENT, 0),
>
>
> CLK_SET_RATE_PARENT for a clock with a mux as the parent doesn't seem right
> to me. Is there any specific reason to have it here?
>
>
>> GATE(CLK_SCLK_PIXEL, "sclk_pixel", "dout_hdmi_pixel",
>> - GATE_TOP_SCLK_DISP1, 10, CLK_SET_RATE_PARENT, 0),
>> + GATE_TOP_SCLK_DISP1, 10, CLK_SET_RATE_PARENT, 0),
>> GATE(CLK_SCLK_DP1, "sclk_dp1", "dout_dp1",
>> - GATE_TOP_SCLK_DISP1, 20, CLK_SET_RATE_PARENT, 0),
>> + GATE_TOP_SCLK_DISP1, 20, CLK_SET_RATE_PARENT, 0),
>>
>> /* Maudio Block */
>> GATE(CLK_SCLK_MAUDIO0, "sclk_maudio0", "dout_maudio0",
>> @@ -826,10 +849,14 @@ static struct samsung_gate_clock
>> exynos5420_gate_clks[] __initdata = {
>> GATE(CLK_FIMD1, "fimd1", "aclk300_disp1", GATE_IP_DISP1, 0, 0, 0),
>> GATE(CLK_DSIM1, "dsim1", "aclk200_disp1", GATE_IP_DISP1, 3, 0, 0),
>> GATE(CLK_DP1, "dp1", "aclk200_disp1", GATE_IP_DISP1, 4, 0, 0),
>> - GATE(CLK_MIXER, "mixer", "aclk166", GATE_IP_DISP1, 5, 0, 0),
>> + GATE(CLK_MIXER, "mixer", "aclk200_disp1", GATE_IP_DISP1, 5, 0, 0),
>> GATE(CLK_HDMI, "hdmi", "aclk200_disp1", GATE_IP_DISP1, 6, 0, 0),
>> - GATE(CLK_SMMU_FIMD1, "smmu_fimd1", "aclk300_disp1", GATE_IP_DISP1,
>> 8, 0,
>> - 0),
>> + GATE(CLK_SMMU_FIMD1M0, "smmu_fimd1m0", "dout_disp1_blk",
>> + GATE_IP_DISP1, 7, CLK_SET_RATE_PARENT, 0),
>> + GATE(CLK_SMMU_FIMD1M1, "smmu_fimd1m1", "dout_disp1_blk",
>> + GATE_IP_DISP1, 8, CLK_SET_RATE_PARENT, 0),
>
>
> CLK_SET_RATE_PARENT for these two definitely is not right, since these
> clocks have a shared divider block as their parents.
>
> Best regards,
> Tomasz
More information about the linux-arm-kernel
mailing list