aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/samsung/clk-exynos5433.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clk/samsung/clk-exynos5433.c')
-rw-r--r--drivers/clk/samsung/clk-exynos5433.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/drivers/clk/samsung/clk-exynos5433.c b/drivers/clk/samsung/clk-exynos5433.c
index c44062d2904e..d272e42eb48c 100644
--- a/drivers/clk/samsung/clk-exynos5433.c
+++ b/drivers/clk/samsung/clk-exynos5433.c
@@ -419,6 +419,8 @@ static struct samsung_div_clock top_div_clks[] __initdata = {
419 DIV_TOP1, 0, 3), 419 DIV_TOP1, 0, 3),
420 420
421 /* DIV_TOP2 */ 421 /* DIV_TOP2 */
422 DIV(CLK_DIV_ACLK_MSCL_400, "div_aclk_mscl_400", "mout_aclk_mscl_400_b",
423 DIV_TOP2, 4, 3),
422 DIV(CLK_DIV_ACLK_FSYS_200, "div_aclk_fsys_200", "mout_bus_pll_user", 424 DIV(CLK_DIV_ACLK_FSYS_200, "div_aclk_fsys_200", "mout_bus_pll_user",
423 DIV_TOP2, 0, 3), 425 DIV_TOP2, 0, 3),
424 426
@@ -446,6 +448,10 @@ static struct samsung_div_clock top_div_clks[] __initdata = {
446 DIV(CLK_DIV_ACLK_BUS1_400, "div_aclk_bus1_400", "mout_bus_pll_user", 448 DIV(CLK_DIV_ACLK_BUS1_400, "div_aclk_bus1_400", "mout_bus_pll_user",
447 DIV_TOP4, 0, 3), 449 DIV_TOP4, 0, 3),
448 450
451 /* DIV_TOP_MSCL */
452 DIV(CLK_DIV_SCLK_JPEG, "div_sclk_jpeg", "mout_sclk_jpeg_c",
453 DIV_TOP_MSCL, 0, 4),
454
449 /* DIV_TOP_FSYS0 */ 455 /* DIV_TOP_FSYS0 */
450 DIV(CLK_DIV_SCLK_MMC1_B, "div_sclk_mmc1_b", "div_sclk_mmc1_a", 456 DIV(CLK_DIV_SCLK_MMC1_B, "div_sclk_mmc1_b", "div_sclk_mmc1_a",
451 DIV_TOP_FSYS0, 16, 8), 457 DIV_TOP_FSYS0, 16, 8),
@@ -542,6 +548,9 @@ static struct samsung_gate_clock top_gate_clks[] __initdata = {
542 GATE(CLK_ACLK_PERIS_66, "aclk_peris_66", "div_aclk_peris_66_b", 548 GATE(CLK_ACLK_PERIS_66, "aclk_peris_66", "div_aclk_peris_66_b",
543 ENABLE_ACLK_TOP, 21, 549 ENABLE_ACLK_TOP, 21,
544 CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), 550 CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
551 GATE(CLK_ACLK_MSCL_400, "aclk_mscl_400", "div_aclk_mscl_400",
552 ENABLE_ACLK_TOP, 19,
553 CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
545 GATE(CLK_ACLK_FSYS_200, "aclk_fsys_200", "div_aclk_fsys_200", 554 GATE(CLK_ACLK_FSYS_200, "aclk_fsys_200", "div_aclk_fsys_200",
546 ENABLE_ACLK_TOP, 18, 555 ENABLE_ACLK_TOP, 18,
547 CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), 556 CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
@@ -558,6 +567,10 @@ static struct samsung_gate_clock top_gate_clks[] __initdata = {
558 ENABLE_ACLK_TOP, 0, 567 ENABLE_ACLK_TOP, 0,
559 CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), 568 CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
560 569
570 /* ENABLE_SCLK_TOP_MSCL */
571 GATE(CLK_SCLK_JPEG_MSCL, "sclk_jpeg_mscl", "div_sclk_jpeg",
572 ENABLE_SCLK_TOP_MSCL, 0, 0, 0),
573
561 /* ENABLE_SCLK_TOP_FSYS */ 574 /* ENABLE_SCLK_TOP_FSYS */
562 GATE(CLK_SCLK_PCIE_100_FSYS, "sclk_pcie_100_fsys", "div_sclk_pcie_100", 575 GATE(CLK_SCLK_PCIE_100_FSYS, "sclk_pcie_100_fsys", "div_sclk_pcie_100",
563 ENABLE_SCLK_TOP_FSYS, 7, 0, 0), 576 ENABLE_SCLK_TOP_FSYS, 7, 0, 0),
@@ -3805,3 +3818,175 @@ static void __init exynos5433_cmu_atlas_init(struct device_node *np)
3805} 3818}
3806CLK_OF_DECLARE(exynos5433_cmu_atlas, "samsung,exynos5433-cmu-atlas", 3819CLK_OF_DECLARE(exynos5433_cmu_atlas, "samsung,exynos5433-cmu-atlas",
3807 exynos5433_cmu_atlas_init); 3820 exynos5433_cmu_atlas_init);
3821
3822/*
3823 * Register offset definitions for CMU_MSCL
3824 */
3825#define MUX_SEL_MSCL0 0x0200
3826#define MUX_SEL_MSCL1 0x0204
3827#define MUX_ENABLE_MSCL0 0x0300
3828#define MUX_ENABLE_MSCL1 0x0304
3829#define MUX_STAT_MSCL0 0x0400
3830#define MUX_STAT_MSCL1 0x0404
3831#define DIV_MSCL 0x0600
3832#define DIV_STAT_MSCL 0x0700
3833#define ENABLE_ACLK_MSCL 0x0800
3834#define ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0 0x0804
3835#define ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1 0x0808
3836#define ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG 0x080c
3837#define ENABLE_PCLK_MSCL 0x0900
3838#define ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0 0x0904
3839#define ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1 0x0908
3840#define ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG 0x000c
3841#define ENABLE_SCLK_MSCL 0x0a00
3842#define ENABLE_IP_MSCL0 0x0b00
3843#define ENABLE_IP_MSCL1 0x0b04
3844#define ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER0 0x0b08
3845#define ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER1 0x0b0c
3846#define ENABLE_IP_MSCL_SECURE_SMMU_JPEG 0x0b10
3847
3848static unsigned long mscl_clk_regs[] __initdata = {
3849 MUX_SEL_MSCL0,
3850 MUX_SEL_MSCL1,
3851 MUX_ENABLE_MSCL0,
3852 MUX_ENABLE_MSCL1,
3853 MUX_STAT_MSCL0,
3854 MUX_STAT_MSCL1,
3855 DIV_MSCL,
3856 DIV_STAT_MSCL,
3857 ENABLE_ACLK_MSCL,
3858 ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0,
3859 ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1,
3860 ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG,
3861 ENABLE_PCLK_MSCL,
3862 ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0,
3863 ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1,
3864 ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG,
3865 ENABLE_SCLK_MSCL,
3866 ENABLE_IP_MSCL0,
3867 ENABLE_IP_MSCL1,
3868 ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER0,
3869 ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER1,
3870 ENABLE_IP_MSCL_SECURE_SMMU_JPEG,
3871};
3872
3873/* list of all parent clock list */
3874PNAME(mout_sclk_jpeg_user_p) = { "oscclk", "sclk_jpeg_mscl", };
3875PNAME(mout_aclk_mscl_400_user_p) = { "oscclk", "aclk_mscl_400", };
3876PNAME(mout_sclk_jpeg_p) = { "mout_sclk_jpeg_user",
3877 "mout_aclk_mscl_400_user", };
3878
3879static struct samsung_mux_clock mscl_mux_clks[] __initdata = {
3880 /* MUX_SEL_MSCL0 */
3881 MUX(CLK_MOUT_SCLK_JPEG_USER, "mout_sclk_jpeg_user",
3882 mout_sclk_jpeg_user_p, MUX_SEL_MSCL0, 4, 1),
3883 MUX(CLK_MOUT_ACLK_MSCL_400_USER, "mout_aclk_mscl_400_user",
3884 mout_aclk_mscl_400_user_p, MUX_SEL_MSCL0, 0, 1),
3885
3886 /* MUX_SEL_MSCL1 */
3887 MUX(CLK_MOUT_SCLK_JPEG, "mout_sclk_jpeg", mout_sclk_jpeg_p,
3888 MUX_SEL_MSCL1, 0, 1),
3889};
3890
3891static struct samsung_div_clock mscl_div_clks[] __initdata = {
3892 /* DIV_MSCL */
3893 DIV(CLK_DIV_PCLK_MSCL, "div_pclk_mscl", "mout_aclk_mscl_400_user",
3894 DIV_MSCL, 0, 3),
3895};
3896
3897static struct samsung_gate_clock mscl_gate_clks[] __initdata = {
3898 /* ENABLE_ACLK_MSCL */
3899 GATE(CLK_ACLK_BTS_JPEG, "aclk_bts_jpeg", "mout_aclk_mscl_400_user",
3900 ENABLE_ACLK_MSCL, 9, 0, 0),
3901 GATE(CLK_ACLK_BTS_M2MSCALER1, "aclk_bts_m2mscaler1",
3902 "mout_aclk_mscl_400_user", ENABLE_ACLK_MSCL, 8, 0, 0),
3903 GATE(CLK_ACLK_BTS_M2MSCALER0, "aclk_bts_m2mscaler0",
3904 "mout_aclk_mscl_400_user", ENABLE_ACLK_MSCL, 7, 0, 0),
3905 GATE(CLK_ACLK_AHB2APB_MSCL0P, "aclk_abh2apb_mscl0p", "div_pclk_mscl",
3906 ENABLE_ACLK_MSCL, 6, CLK_IGNORE_UNUSED, 0),
3907 GATE(CLK_ACLK_XIU_MSCLX, "aclk_xiu_msclx", "mout_aclk_mscl_400_user",
3908 ENABLE_ACLK_MSCL, 5, CLK_IGNORE_UNUSED, 0),
3909 GATE(CLK_ACLK_MSCLNP_100, "aclk_msclnp_100", "div_pclk_mscl",
3910 ENABLE_ACLK_MSCL, 4, CLK_IGNORE_UNUSED, 0),
3911 GATE(CLK_ACLK_MSCLND_400, "aclk_msclnd_400", "mout_aclk_mscl_400_user",
3912 ENABLE_ACLK_MSCL, 3, CLK_IGNORE_UNUSED, 0),
3913 GATE(CLK_ACLK_JPEG, "aclk_jpeg", "mout_aclk_mscl_400_user",
3914 ENABLE_ACLK_MSCL, 2, 0, 0),
3915 GATE(CLK_ACLK_M2MSCALER1, "aclk_m2mscaler1", "mout_aclk_mscl_400_user",
3916 ENABLE_ACLK_MSCL, 1, 0, 0),
3917 GATE(CLK_ACLK_M2MSCALER0, "aclk_m2mscaler0", "mout_aclk_mscl_400_user",
3918 ENABLE_ACLK_MSCL, 0, 0, 0),
3919
3920 /* ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0 */
3921 GATE(CLK_ACLK_SMMU_M2MSCALER0, "aclk_smmu_m2mscaler0",
3922 "mout_aclk_mscl_400_user",
3923 ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0,
3924 0, CLK_IGNORE_UNUSED, 0),
3925
3926 /* ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1 */
3927 GATE(CLK_ACLK_SMMU_M2MSCALER1, "aclk_smmu_m2mscaler1",
3928 "mout_aclk_mscl_400_user",
3929 ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1,
3930 0, CLK_IGNORE_UNUSED, 0),
3931
3932 /* ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG */
3933 GATE(CLK_ACLK_SMMU_JPEG, "aclk_smmu_jpeg", "mout_aclk_mscl_400_user",
3934 ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG,
3935 0, CLK_IGNORE_UNUSED, 0),
3936
3937 /* ENABLE_PCLK_MSCL */
3938 GATE(CLK_PCLK_BTS_JPEG, "pclk_bts_jpeg", "div_pclk_mscl",
3939 ENABLE_PCLK_MSCL, 7, 0, 0),
3940 GATE(CLK_PCLK_BTS_M2MSCALER1, "pclk_bts_m2mscaler1", "div_pclk_mscl",
3941 ENABLE_PCLK_MSCL, 6, 0, 0),
3942 GATE(CLK_PCLK_BTS_M2MSCALER0, "pclk_bts_m2mscaler0", "div_pclk_mscl",
3943 ENABLE_PCLK_MSCL, 5, 0, 0),
3944 GATE(CLK_PCLK_PMU_MSCL, "pclk_pmu_mscl", "div_pclk_mscl",
3945 ENABLE_PCLK_MSCL, 4, CLK_IGNORE_UNUSED, 0),
3946 GATE(CLK_PCLK_SYSREG_MSCL, "pclk_sysreg_mscl", "div_pclk_mscl",
3947 ENABLE_PCLK_MSCL, 3, CLK_IGNORE_UNUSED, 0),
3948 GATE(CLK_PCLK_JPEG, "pclk_jpeg", "div_pclk_mscl",
3949 ENABLE_PCLK_MSCL, 2, 0, 0),
3950 GATE(CLK_PCLK_M2MSCALER1, "pclk_m2mscaler1", "div_pclk_mscl",
3951 ENABLE_PCLK_MSCL, 1, 0, 0),
3952 GATE(CLK_PCLK_M2MSCALER0, "pclk_m2mscaler0", "div_pclk_mscl",
3953 ENABLE_PCLK_MSCL, 0, 0, 0),
3954
3955 /* ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0 */
3956 GATE(CLK_PCLK_SMMU_M2MSCALER0, "pclk_smmu_m2mscaler0", "div_pclk_mscl",
3957 ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0,
3958 0, CLK_IGNORE_UNUSED, 0),
3959
3960 /* ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1 */
3961 GATE(CLK_PCLK_SMMU_M2MSCALER1, "pclk_smmu_m2mscaler1", "div_pclk_mscl",
3962 ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1,
3963 0, CLK_IGNORE_UNUSED, 0),
3964
3965 /* ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG */
3966 GATE(CLK_PCLK_SMMU_JPEG, "pclk_smmu_jpeg", "div_pclk_mscl",
3967 ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG,
3968 0, CLK_IGNORE_UNUSED, 0),
3969
3970 /* ENABLE_SCLK_MSCL */
3971 GATE(CLK_SCLK_JPEG, "sclk_jpeg", "mout_sclk_jpeg", ENABLE_SCLK_MSCL, 0,
3972 CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0),
3973};
3974
3975static struct samsung_cmu_info mscl_cmu_info __initdata = {
3976 .mux_clks = mscl_mux_clks,
3977 .nr_mux_clks = ARRAY_SIZE(mscl_mux_clks),
3978 .div_clks = mscl_div_clks,
3979 .nr_div_clks = ARRAY_SIZE(mscl_div_clks),
3980 .gate_clks = mscl_gate_clks,
3981 .nr_gate_clks = ARRAY_SIZE(mscl_gate_clks),
3982 .nr_clk_ids = MSCL_NR_CLK,
3983 .clk_regs = mscl_clk_regs,
3984 .nr_clk_regs = ARRAY_SIZE(mscl_clk_regs),
3985};
3986
3987static void __init exynos5433_cmu_mscl_init(struct device_node *np)
3988{
3989 samsung_cmu_register_one(np, &mscl_cmu_info);
3990}
3991CLK_OF_DECLARE(exynos5433_cmu_mscl, "samsung,exynos5433-cmu-mscl",
3992 exynos5433_cmu_mscl_init);