diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-07 14:28:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-07 14:28:42 -0400 |
commit | bb9055b2744ada735a2fe555c4196ad39a83ef2a (patch) | |
tree | 014e0f462217cfa49988872a5134ae41b90b2e9c /drivers/clk | |
parent | 1bf25e78af317e6d5d9b5594dfeb0036e0d589d6 (diff) | |
parent | 241a9871263f3114717c0ed416a1bd1d2415d1fb (diff) |
Merge tag 'multiplatform-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull late ARM Exynos multiplatform changes from Arnd Bergmann:
"These continue the multiplatform support for exynos, adding support
for building most of the essential drivers (clocksource, clk, irqchip)
when combined with other platforms. As a result, it should become
really easy to add full multiplatform exynos support in 3.11, although
we don't yet enable it for 3.10.
The changes were not included in the earlier multiplatform series in
order to avoid clashes with the other Exynos updates.
This also includes work from Tomasz Figa to fix the pwm clocksource
code on Exynos, which is not strictly required for multiplatform, but
related to the other patches in this set and needed as a bug fix for
at least one board."
* tag 'multiplatform-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (22 commits)
ARM: dts: exynops4210: really add universal_c210 dts
ARM: dts: exynos4210: Add basic dts file for universal_c210 board
ARM: dts: exynos4: Add node for PWM device
ARM: SAMSUNG: Do not register legacy timer interrupts on Exynos
clocksource: samsung_pwm_timer: Work around rounding errors in clockevents core
clocksource: samsung_pwm_timer: Correct programming of clock events
clocksource: samsung_pwm_timer: Use proper clockevents max_delta
clocksource: samsung_pwm_timer: Add support for non-DT platforms
clocksource: samsung_pwm_timer: Drop unused samsung_pwm struct
clocksource: samsung_pwm_timer: Keep all driver data in a structure
clocksource: samsung_pwm_timer: Make PWM spinlock global
clocksource: samsung_pwm_timer: Let platforms select the driver
Documentation: Add device tree bindings for Samsung PWM timers
clocksource: add samsung pwm timer driver
irqchip: exynos: look up irq using irq_find_mapping
irqchip: exynos: pass irq_base from platform
irqchip: exynos: localize irq lookup for ATAGS
irqchip: exynos: allocate combiner_data dynamically
irqchip: exynos: pass max combiner number to combiner_init
ARM: exynos: add missing properties for combiner IRQs
...
Diffstat (limited to 'drivers/clk')
-rw-r--r-- | drivers/clk/samsung/clk-exynos4.c | 93 | ||||
-rw-r--r-- | drivers/clk/samsung/clk-exynos5250.c | 1 | ||||
-rw-r--r-- | drivers/clk/samsung/clk-exynos5440.c | 1 | ||||
-rw-r--r-- | drivers/clk/samsung/clk.h | 2 |
4 files changed, 42 insertions, 55 deletions
diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c index 71046694d9dd..d0940e69d034 100644 --- a/drivers/clk/samsung/clk-exynos4.c +++ b/drivers/clk/samsung/clk-exynos4.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/of.h> | 16 | #include <linux/of.h> |
17 | #include <linux/of_address.h> | 17 | #include <linux/of_address.h> |
18 | 18 | ||
19 | #include <plat/cpu.h> | ||
20 | #include "clk.h" | 19 | #include "clk.h" |
21 | #include "clk-pll.h" | 20 | #include "clk-pll.h" |
22 | 21 | ||
@@ -910,16 +909,6 @@ struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = { | |||
910 | CLK_IGNORE_UNUSED, 0), | 909 | CLK_IGNORE_UNUSED, 0), |
911 | }; | 910 | }; |
912 | 911 | ||
913 | #ifdef CONFIG_OF | ||
914 | static struct of_device_id exynos4_clk_ids[] __initdata = { | ||
915 | { .compatible = "samsung,exynos4210-clock", | ||
916 | .data = (void *)EXYNOS4210, }, | ||
917 | { .compatible = "samsung,exynos4412-clock", | ||
918 | .data = (void *)EXYNOS4X12, }, | ||
919 | { }, | ||
920 | }; | ||
921 | #endif | ||
922 | |||
923 | /* | 912 | /* |
924 | * The parent of the fin_pll clock is selected by the XOM[0] bit. This bit | 913 | * The parent of the fin_pll clock is selected by the XOM[0] bit. This bit |
925 | * resides in chipid register space, outside of the clock controller memory | 914 | * resides in chipid register space, outside of the clock controller memory |
@@ -927,33 +916,40 @@ static struct of_device_id exynos4_clk_ids[] __initdata = { | |||
927 | * controller is first remapped and the value of XOM[0] bit is read to | 916 | * controller is first remapped and the value of XOM[0] bit is read to |
928 | * determine the parent clock. | 917 | * determine the parent clock. |
929 | */ | 918 | */ |
930 | static void __init exynos4_clk_register_finpll(void) | 919 | static unsigned long exynos4_get_xom(void) |
931 | { | 920 | { |
932 | struct samsung_fixed_rate_clock fclk; | 921 | unsigned long xom = 0; |
922 | void __iomem *chipid_base; | ||
933 | struct device_node *np; | 923 | struct device_node *np; |
934 | struct clk *clk; | ||
935 | void __iomem *chipid_base = S5P_VA_CHIPID; | ||
936 | unsigned long xom, finpll_f = 24000000; | ||
937 | char *parent_name; | ||
938 | 924 | ||
939 | np = of_find_compatible_node(NULL, NULL, "samsung,exynos4210-chipid"); | 925 | np = of_find_compatible_node(NULL, NULL, "samsung,exynos4210-chipid"); |
940 | if (np) | 926 | if (np) { |
941 | chipid_base = of_iomap(np, 0); | 927 | chipid_base = of_iomap(np, 0); |
942 | 928 | ||
943 | if (chipid_base) { | 929 | if (chipid_base) |
944 | xom = readl(chipid_base + 8); | 930 | xom = readl(chipid_base + 8); |
945 | parent_name = xom & 1 ? "xusbxti" : "xxti"; | 931 | |
946 | clk = clk_get(NULL, parent_name); | 932 | iounmap(chipid_base); |
947 | if (IS_ERR(clk)) { | 933 | } |
948 | pr_err("%s: failed to lookup parent clock %s, assuming " | 934 | |
949 | "fin_pll clock frequency is 24MHz\n", __func__, | 935 | return xom; |
950 | parent_name); | 936 | } |
951 | } else { | 937 | |
952 | finpll_f = clk_get_rate(clk); | 938 | static void __init exynos4_clk_register_finpll(unsigned long xom) |
953 | } | 939 | { |
940 | struct samsung_fixed_rate_clock fclk; | ||
941 | struct clk *clk; | ||
942 | unsigned long finpll_f = 24000000; | ||
943 | char *parent_name; | ||
944 | |||
945 | parent_name = xom & 1 ? "xusbxti" : "xxti"; | ||
946 | clk = clk_get(NULL, parent_name); | ||
947 | if (IS_ERR(clk)) { | ||
948 | pr_err("%s: failed to lookup parent clock %s, assuming " | ||
949 | "fin_pll clock frequency is 24MHz\n", __func__, | ||
950 | parent_name); | ||
954 | } else { | 951 | } else { |
955 | pr_err("%s: failed to map chipid registers, assuming " | 952 | finpll_f = clk_get_rate(clk); |
956 | "fin_pll clock frequency is 24MHz\n", __func__); | ||
957 | } | 953 | } |
958 | 954 | ||
959 | fclk.id = fin_pll; | 955 | fclk.id = fin_pll; |
@@ -963,8 +959,6 @@ static void __init exynos4_clk_register_finpll(void) | |||
963 | fclk.fixed_rate = finpll_f; | 959 | fclk.fixed_rate = finpll_f; |
964 | samsung_clk_register_fixed_rate(&fclk, 1); | 960 | samsung_clk_register_fixed_rate(&fclk, 1); |
965 | 961 | ||
966 | if (np) | ||
967 | iounmap(chipid_base); | ||
968 | } | 962 | } |
969 | 963 | ||
970 | /* | 964 | /* |
@@ -988,28 +982,14 @@ static __initdata struct of_device_id ext_clk_match[] = { | |||
988 | }; | 982 | }; |
989 | 983 | ||
990 | /* register exynos4 clocks */ | 984 | /* register exynos4 clocks */ |
991 | void __init exynos4_clk_init(struct device_node *np) | 985 | void __init exynos4_clk_init(struct device_node *np, enum exynos4_soc exynos4_soc, void __iomem *reg_base, unsigned long xom) |
992 | { | 986 | { |
993 | void __iomem *reg_base; | ||
994 | struct clk *apll, *mpll, *epll, *vpll; | 987 | struct clk *apll, *mpll, *epll, *vpll; |
995 | u32 exynos4_soc; | ||
996 | 988 | ||
997 | if (np) { | 989 | if (np) { |
998 | const struct of_device_id *match; | ||
999 | match = of_match_node(exynos4_clk_ids, np); | ||
1000 | exynos4_soc = (u32)match->data; | ||
1001 | |||
1002 | reg_base = of_iomap(np, 0); | 990 | reg_base = of_iomap(np, 0); |
1003 | if (!reg_base) | 991 | if (!reg_base) |
1004 | panic("%s: failed to map registers\n", __func__); | 992 | panic("%s: failed to map registers\n", __func__); |
1005 | } else { | ||
1006 | reg_base = S5P_VA_CMU; | ||
1007 | if (soc_is_exynos4210()) | ||
1008 | exynos4_soc = EXYNOS4210; | ||
1009 | else if (soc_is_exynos4212() || soc_is_exynos4412()) | ||
1010 | exynos4_soc = EXYNOS4X12; | ||
1011 | else | ||
1012 | panic("%s: unable to determine soc\n", __func__); | ||
1013 | } | 993 | } |
1014 | 994 | ||
1015 | if (exynos4_soc == EXYNOS4210) | 995 | if (exynos4_soc == EXYNOS4210) |
@@ -1026,7 +1006,7 @@ void __init exynos4_clk_init(struct device_node *np) | |||
1026 | ARRAY_SIZE(exynos4_fixed_rate_ext_clks), | 1006 | ARRAY_SIZE(exynos4_fixed_rate_ext_clks), |
1027 | ext_clk_match); | 1007 | ext_clk_match); |
1028 | 1008 | ||
1029 | exynos4_clk_register_finpll(); | 1009 | exynos4_clk_register_finpll(xom); |
1030 | 1010 | ||
1031 | if (exynos4_soc == EXYNOS4210) { | 1011 | if (exynos4_soc == EXYNOS4210) { |
1032 | apll = samsung_clk_register_pll45xx("fout_apll", "fin_pll", | 1012 | apll = samsung_clk_register_pll45xx("fout_apll", "fin_pll", |
@@ -1087,5 +1067,16 @@ void __init exynos4_clk_init(struct device_node *np) | |||
1087 | _get_rate("sclk_epll"), _get_rate("sclk_vpll"), | 1067 | _get_rate("sclk_epll"), _get_rate("sclk_vpll"), |
1088 | _get_rate("arm_clk")); | 1068 | _get_rate("arm_clk")); |
1089 | } | 1069 | } |
1090 | CLK_OF_DECLARE(exynos4210_clk, "samsung,exynos4210-clock", exynos4_clk_init); | 1070 | |
1091 | CLK_OF_DECLARE(exynos4412_clk, "samsung,exynos4412-clock", exynos4_clk_init); | 1071 | |
1072 | static void __init exynos4210_clk_init(struct device_node *np) | ||
1073 | { | ||
1074 | exynos4_clk_init(np, EXYNOS4210, NULL, exynos4_get_xom()); | ||
1075 | } | ||
1076 | CLK_OF_DECLARE(exynos4210_clk, "samsung,exynos4210-clock", exynos4210_clk_init); | ||
1077 | |||
1078 | static void __init exynos4412_clk_init(struct device_node *np) | ||
1079 | { | ||
1080 | exynos4_clk_init(np, EXYNOS4X12, NULL, exynos4_get_xom()); | ||
1081 | } | ||
1082 | CLK_OF_DECLARE(exynos4412_clk, "samsung,exynos4412-clock", exynos4412_clk_init); | ||
diff --git a/drivers/clk/samsung/clk-exynos5250.c b/drivers/clk/samsung/clk-exynos5250.c index bb54606ff035..5c97e75924a8 100644 --- a/drivers/clk/samsung/clk-exynos5250.c +++ b/drivers/clk/samsung/clk-exynos5250.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/of.h> | 16 | #include <linux/of.h> |
17 | #include <linux/of_address.h> | 17 | #include <linux/of_address.h> |
18 | 18 | ||
19 | #include <plat/cpu.h> | ||
20 | #include "clk.h" | 19 | #include "clk.h" |
21 | #include "clk-pll.h" | 20 | #include "clk-pll.h" |
22 | 21 | ||
diff --git a/drivers/clk/samsung/clk-exynos5440.c b/drivers/clk/samsung/clk-exynos5440.c index a0a094c06f19..7d5434167a96 100644 --- a/drivers/clk/samsung/clk-exynos5440.c +++ b/drivers/clk/samsung/clk-exynos5440.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/of.h> | 15 | #include <linux/of.h> |
16 | #include <linux/of_address.h> | 16 | #include <linux/of_address.h> |
17 | 17 | ||
18 | #include <plat/cpu.h> | ||
19 | #include "clk.h" | 18 | #include "clk.h" |
20 | #include "clk-pll.h" | 19 | #include "clk-pll.h" |
21 | 20 | ||
diff --git a/drivers/clk/samsung/clk.h b/drivers/clk/samsung/clk.h index 10b2111f0c0f..e4ad6ea9aa76 100644 --- a/drivers/clk/samsung/clk.h +++ b/drivers/clk/samsung/clk.h | |||
@@ -20,8 +20,6 @@ | |||
20 | #include <linux/of.h> | 20 | #include <linux/of.h> |
21 | #include <linux/of_address.h> | 21 | #include <linux/of_address.h> |
22 | 22 | ||
23 | #include <mach/map.h> | ||
24 | |||
25 | /** | 23 | /** |
26 | * struct samsung_clock_alias: information about mux clock | 24 | * struct samsung_clock_alias: information about mux clock |
27 | * @id: platform specific id of the clock. | 25 | * @id: platform specific id of the clock. |