aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-exynos
diff options
context:
space:
mode:
authorKukjin Kim <kgene.kim@samsung.com>2012-11-15 01:48:56 -0500
committerKukjin Kim <kgene.kim@samsung.com>2012-11-21 23:09:18 -0500
commit2edb36c4ea09fe5077e2d19e60fd353ab1fc6eee (patch)
tree2d2557688f94d7fd6f734a7a97fe33a1cde75ff6 /arch/arm/mach-exynos
parent77b67063bb6bce6d475e910d3b886a606d0d91f7 (diff)
ARM: EXYNOS: add support for EXYNOS5440 SoC
This patch adds support for EXYNOS5440 SoC which is including ARM Cortex-A15 Quad cores. Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Diffstat (limited to 'arch/arm/mach-exynos')
-rw-r--r--arch/arm/mach-exynos/Kconfig11
-rw-r--r--arch/arm/mach-exynos/Makefile2
-rw-r--r--arch/arm/mach-exynos/common.c68
-rw-r--r--arch/arm/mach-exynos/include/mach/irqs.h5
-rw-r--r--arch/arm/mach-exynos/include/mach/map.h5
-rw-r--r--arch/arm/mach-exynos/include/mach/regs-pmu.h1
-rw-r--r--arch/arm/mach-exynos/mach-exynos5-dt.c31
-rw-r--r--arch/arm/mach-exynos/mct.c11
-rw-r--r--arch/arm/mach-exynos/setup-i2c0.c2
9 files changed, 116 insertions, 20 deletions
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index da55107033dd..ed17e353956e 100644
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -67,6 +67,15 @@ config SOC_EXYNOS5250
67 help 67 help
68 Enable EXYNOS5250 SoC support 68 Enable EXYNOS5250 SoC support
69 69
70config SOC_EXYNOS5440
71 bool "SAMSUNG EXYNOS5440"
72 default y
73 depends on ARCH_EXYNOS5
74 select ARM_ARCH_TIMER
75 select AUTO_ZRELADDR
76 help
77 Enable EXYNOS5440 SoC support
78
70config EXYNOS4_MCT 79config EXYNOS4_MCT
71 bool 80 bool
72 default y 81 default y
@@ -417,9 +426,9 @@ config MACH_EXYNOS4_DT
417 426
418config MACH_EXYNOS5_DT 427config MACH_EXYNOS5_DT
419 bool "SAMSUNG EXYNOS5 Machine using device tree" 428 bool "SAMSUNG EXYNOS5 Machine using device tree"
429 default y
420 depends on ARCH_EXYNOS5 430 depends on ARCH_EXYNOS5
421 select ARM_AMBA 431 select ARM_AMBA
422 select SOC_EXYNOS5250
423 select USE_OF 432 select USE_OF
424 help 433 help
425 Machine support for Samsung EXYNOS5 machine with device tree enabled. 434 Machine support for Samsung EXYNOS5 machine with device tree enabled.
diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile
index 9b58024f7d43..1a076df02bd8 100644
--- a/arch/arm/mach-exynos/Makefile
+++ b/arch/arm/mach-exynos/Makefile
@@ -14,9 +14,9 @@ obj- :=
14 14
15obj-$(CONFIG_ARCH_EXYNOS) += common.o 15obj-$(CONFIG_ARCH_EXYNOS) += common.o
16obj-$(CONFIG_ARCH_EXYNOS4) += clock-exynos4.o 16obj-$(CONFIG_ARCH_EXYNOS4) += clock-exynos4.o
17obj-$(CONFIG_ARCH_EXYNOS5) += clock-exynos5.o
18obj-$(CONFIG_CPU_EXYNOS4210) += clock-exynos4210.o 17obj-$(CONFIG_CPU_EXYNOS4210) += clock-exynos4210.o
19obj-$(CONFIG_SOC_EXYNOS4212) += clock-exynos4212.o 18obj-$(CONFIG_SOC_EXYNOS4212) += clock-exynos4212.o
19obj-$(CONFIG_SOC_EXYNOS5250) += clock-exynos5.o
20 20
21obj-$(CONFIG_PM) += pm.o 21obj-$(CONFIG_PM) += pm.o
22obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o 22obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c
index 1947be8e5f5b..94f1dedc0617 100644
--- a/arch/arm/mach-exynos/common.c
+++ b/arch/arm/mach-exynos/common.c
@@ -58,9 +58,11 @@ static const char name_exynos4210[] = "EXYNOS4210";
58static const char name_exynos4212[] = "EXYNOS4212"; 58static const char name_exynos4212[] = "EXYNOS4212";
59static const char name_exynos4412[] = "EXYNOS4412"; 59static const char name_exynos4412[] = "EXYNOS4412";
60static const char name_exynos5250[] = "EXYNOS5250"; 60static const char name_exynos5250[] = "EXYNOS5250";
61static const char name_exynos5440[] = "EXYNOS5440";
61 62
62static void exynos4_map_io(void); 63static void exynos4_map_io(void);
63static void exynos5_map_io(void); 64static void exynos5_map_io(void);
65static void exynos5440_map_io(void);
64static void exynos4_init_clocks(int xtal); 66static void exynos4_init_clocks(int xtal);
65static void exynos5_init_clocks(int xtal); 67static void exynos5_init_clocks(int xtal);
66static void exynos_init_uarts(struct s3c2410_uartcfg *cfg, int no); 68static void exynos_init_uarts(struct s3c2410_uartcfg *cfg, int no);
@@ -99,6 +101,12 @@ static struct cpu_table cpu_ids[] __initdata = {
99 .init_uarts = exynos_init_uarts, 101 .init_uarts = exynos_init_uarts,
100 .init = exynos_init, 102 .init = exynos_init,
101 .name = name_exynos5250, 103 .name = name_exynos5250,
104 }, {
105 .idcode = EXYNOS5440_SOC_ID,
106 .idmask = EXYNOS5_SOC_MASK,
107 .map_io = exynos5440_map_io,
108 .init = exynos_init,
109 .name = name_exynos5440,
102 }, 110 },
103}; 111};
104 112
@@ -113,6 +121,15 @@ static struct map_desc exynos_iodesc[] __initdata = {
113 }, 121 },
114}; 122};
115 123
124static struct map_desc exynos5440_iodesc[] __initdata = {
125 {
126 .virtual = (unsigned long)S5P_VA_CHIPID,
127 .pfn = __phys_to_pfn(EXYNOS5440_PA_CHIPID),
128 .length = SZ_4K,
129 .type = MT_DEVICE,
130 },
131};
132
116static struct map_desc exynos4_iodesc[] __initdata = { 133static struct map_desc exynos4_iodesc[] __initdata = {
117 { 134 {
118 .virtual = (unsigned long)S3C_VA_SYS, 135 .virtual = (unsigned long)S3C_VA_SYS,
@@ -279,6 +296,15 @@ static struct map_desc exynos5_iodesc[] __initdata = {
279 }, 296 },
280}; 297};
281 298
299static struct map_desc exynos5440_iodesc0[] __initdata = {
300 {
301 .virtual = (unsigned long)S3C_VA_UART,
302 .pfn = __phys_to_pfn(EXYNOS5440_PA_UART0),
303 .length = SZ_512K,
304 .type = MT_DEVICE,
305 },
306};
307
282void exynos4_restart(char mode, const char *cmd) 308void exynos4_restart(char mode, const char *cmd)
283{ 309{
284 __raw_writel(0x1, S5P_SWRESET); 310 __raw_writel(0x1, S5P_SWRESET);
@@ -286,11 +312,29 @@ void exynos4_restart(char mode, const char *cmd)
286 312
287void exynos5_restart(char mode, const char *cmd) 313void exynos5_restart(char mode, const char *cmd)
288{ 314{
289 __raw_writel(0x1, EXYNOS_SWRESET); 315 u32 val;
316 void __iomem *addr;
317
318 if (of_machine_is_compatible("samsung,exynos5250")) {
319 val = 0x1;
320 addr = EXYNOS_SWRESET;
321 } else if (of_machine_is_compatible("samsung,exynos5440")) {
322 val = (0x10 << 20) | (0x1 << 16);
323 addr = EXYNOS5440_SWRESET;
324 } else {
325 pr_err("%s: cannot support non-DT\n", __func__);
326 return;
327 }
328
329 __raw_writel(val, addr);
290} 330}
291 331
292void __init exynos_init_late(void) 332void __init exynos_init_late(void)
293{ 333{
334 if (of_machine_is_compatible("samsung,exynos5440"))
335 /* to be supported later */
336 return;
337
294 exynos_pm_late_initcall(); 338 exynos_pm_late_initcall();
295} 339}
296 340
@@ -303,7 +347,11 @@ void __init exynos_init_late(void)
303void __init exynos_init_io(struct map_desc *mach_desc, int size) 347void __init exynos_init_io(struct map_desc *mach_desc, int size)
304{ 348{
305 /* initialize the io descriptors we need for initialization */ 349 /* initialize the io descriptors we need for initialization */
306 iotable_init(exynos_iodesc, ARRAY_SIZE(exynos_iodesc)); 350 if (of_machine_is_compatible("samsung,exynos5440"))
351 iotable_init(exynos5440_iodesc, ARRAY_SIZE(exynos5440_iodesc));
352 else
353 iotable_init(exynos_iodesc, ARRAY_SIZE(exynos_iodesc));
354
307 if (mach_desc) 355 if (mach_desc)
308 iotable_init(mach_desc, size); 356 iotable_init(mach_desc, size);
309 357
@@ -389,6 +437,11 @@ static void __init exynos4_init_clocks(int xtal)
389 exynos4_setup_clocks(); 437 exynos4_setup_clocks();
390} 438}
391 439
440static void __init exynos5440_map_io(void)
441{
442 iotable_init(exynos5440_iodesc0, ARRAY_SIZE(exynos5440_iodesc0));
443}
444
392static void __init exynos5_init_clocks(int xtal) 445static void __init exynos5_init_clocks(int xtal)
393{ 446{
394 printk(KERN_DEBUG "%s: initializing clocks\n", __func__); 447 printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
@@ -604,8 +657,9 @@ int __init combiner_of_init(struct device_node *np, struct device_node *parent)
604 return 0; 657 return 0;
605} 658}
606 659
607static const struct of_device_id exynos4_dt_irq_match[] = { 660static const struct of_device_id exynos_dt_irq_match[] = {
608 { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, 661 { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, },
662 { .compatible = "arm,cortex-a15-gic", .data = gic_of_init, },
609 { .compatible = "samsung,exynos4210-combiner", 663 { .compatible = "samsung,exynos4210-combiner",
610 .data = combiner_of_init, }, 664 .data = combiner_of_init, },
611 {}, 665 {},
@@ -622,7 +676,7 @@ void __init exynos4_init_irq(void)
622 gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset, NULL); 676 gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset, NULL);
623#ifdef CONFIG_OF 677#ifdef CONFIG_OF
624 else 678 else
625 of_irq_init(exynos4_dt_irq_match); 679 of_irq_init(exynos_dt_irq_match);
626#endif 680#endif
627 681
628 if (!of_have_populated_dt()) 682 if (!of_have_populated_dt())
@@ -639,7 +693,7 @@ void __init exynos4_init_irq(void)
639void __init exynos5_init_irq(void) 693void __init exynos5_init_irq(void)
640{ 694{
641#ifdef CONFIG_OF 695#ifdef CONFIG_OF
642 of_irq_init(exynos4_dt_irq_match); 696 of_irq_init(exynos_dt_irq_match);
643#endif 697#endif
644 /* 698 /*
645 * The parameters of s5p_init_irq() are for VIC init. 699 * The parameters of s5p_init_irq() are for VIC init.
@@ -669,7 +723,7 @@ static int __init exynos4_l2x0_cache_init(void)
669{ 723{
670 int ret; 724 int ret;
671 725
672 if (soc_is_exynos5250()) 726 if (soc_is_exynos5250() || soc_is_exynos5440())
673 return 0; 727 return 0;
674 728
675 ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK); 729 ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK);
@@ -1010,6 +1064,8 @@ static int __init exynos_init_irq_eint(void)
1010 } 1064 }
1011 } 1065 }
1012#endif 1066#endif
1067 if (soc_is_exynos5440())
1068 return 0;
1013 1069
1014 if (soc_is_exynos5250()) 1070 if (soc_is_exynos5250())
1015 exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K); 1071 exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K);
diff --git a/arch/arm/mach-exynos/include/mach/irqs.h b/arch/arm/mach-exynos/include/mach/irqs.h
index 35bced6f9092..f43a96ca6f98 100644
--- a/arch/arm/mach-exynos/include/mach/irqs.h
+++ b/arch/arm/mach-exynos/include/mach/irqs.h
@@ -333,6 +333,11 @@
333#define EXYNOS5_IRQ_FIMC_LITE1 IRQ_SPI(126) 333#define EXYNOS5_IRQ_FIMC_LITE1 IRQ_SPI(126)
334#define EXYNOS5_IRQ_RP_TIMER IRQ_SPI(127) 334#define EXYNOS5_IRQ_RP_TIMER IRQ_SPI(127)
335 335
336/* EXYNOS5440 */
337
338#define EXYNOS5440_IRQ_UART0 IRQ_SPI(2)
339#define EXYNOS5440_IRQ_UART1 IRQ_SPI(3)
340
336#define EXYNOS5_IRQ_PMU COMBINER_IRQ(1, 2) 341#define EXYNOS5_IRQ_PMU COMBINER_IRQ(1, 2)
337 342
338#define EXYNOS5_IRQ_SYSMMU_GSC0_0 COMBINER_IRQ(2, 0) 343#define EXYNOS5_IRQ_SYSMMU_GSC0_0 COMBINER_IRQ(2, 0)
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h
index 8480849affb9..aa3760e1d668 100644
--- a/arch/arm/mach-exynos/include/mach/map.h
+++ b/arch/arm/mach-exynos/include/mach/map.h
@@ -53,6 +53,7 @@
53#define EXYNOS4_PA_ONENAND_DMA 0x0C600000 53#define EXYNOS4_PA_ONENAND_DMA 0x0C600000
54 54
55#define EXYNOS_PA_CHIPID 0x10000000 55#define EXYNOS_PA_CHIPID 0x10000000
56#define EXYNOS5440_PA_CHIPID 0x00160000
56 57
57#define EXYNOS4_PA_SYSCON 0x10010000 58#define EXYNOS4_PA_SYSCON 0x10010000
58#define EXYNOS5_PA_SYSCON 0x10050100 59#define EXYNOS5_PA_SYSCON 0x10050100
@@ -281,6 +282,10 @@
281#define EXYNOS5_PA_UART3 0x12C30000 282#define EXYNOS5_PA_UART3 0x12C30000
282#define EXYNOS5_SZ_UART SZ_256 283#define EXYNOS5_SZ_UART SZ_256
283 284
285#define EXYNOS5440_PA_UART0 0x000B0000
286#define EXYNOS5440_PA_UART1 0x000C0000
287#define EXYNOS5440_SZ_UART SZ_256
288
284#define S3C_VA_UARTx(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET)) 289#define S3C_VA_UARTx(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET))
285 290
286#endif /* __ASM_ARCH_MAP_H */ 291#endif /* __ASM_ARCH_MAP_H */
diff --git a/arch/arm/mach-exynos/include/mach/regs-pmu.h b/arch/arm/mach-exynos/include/mach/regs-pmu.h
index d4e392b811a3..c0b74f388178 100644
--- a/arch/arm/mach-exynos/include/mach/regs-pmu.h
+++ b/arch/arm/mach-exynos/include/mach/regs-pmu.h
@@ -31,6 +31,7 @@
31 31
32#define S5P_SWRESET S5P_PMUREG(0x0400) 32#define S5P_SWRESET S5P_PMUREG(0x0400)
33#define EXYNOS_SWRESET S5P_PMUREG(0x0400) 33#define EXYNOS_SWRESET S5P_PMUREG(0x0400)
34#define EXYNOS5440_SWRESET S5P_PMUREG(0x00C4)
34 35
35#define S5P_WAKEUP_STAT S5P_PMUREG(0x0600) 36#define S5P_WAKEUP_STAT S5P_PMUREG(0x0600)
36#define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604) 37#define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604)
diff --git a/arch/arm/mach-exynos/mach-exynos5-dt.c b/arch/arm/mach-exynos/mach-exynos5-dt.c
index db1cd8eacf28..4db2ee1238b4 100644
--- a/arch/arm/mach-exynos/mach-exynos5-dt.c
+++ b/arch/arm/mach-exynos/mach-exynos5-dt.c
@@ -75,20 +75,33 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = {
75 {}, 75 {},
76}; 76};
77 77
78static void __init exynos5250_dt_map_io(void) 78static const struct of_dev_auxdata exynos5440_auxdata_lookup[] __initconst = {
79 OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS5440_PA_UART0,
80 "exynos4210-uart.0", NULL),
81 {},
82};
83
84static void __init exynos5_dt_map_io(void)
79{ 85{
80 exynos_init_io(NULL, 0); 86 exynos_init_io(NULL, 0);
81 s3c24xx_init_clocks(24000000); 87
88 if (of_machine_is_compatible("samsung,exynos5250"))
89 s3c24xx_init_clocks(24000000);
82} 90}
83 91
84static void __init exynos5250_dt_machine_init(void) 92static void __init exynos5_dt_machine_init(void)
85{ 93{
86 of_platform_populate(NULL, of_default_bus_match_table, 94 if (of_machine_is_compatible("samsung,exynos5250"))
87 exynos5250_auxdata_lookup, NULL); 95 of_platform_populate(NULL, of_default_bus_match_table,
96 exynos5250_auxdata_lookup, NULL);
97 else if (of_machine_is_compatible("samsung,exynos5440"))
98 of_platform_populate(NULL, of_default_bus_match_table,
99 exynos5440_auxdata_lookup, NULL);
88} 100}
89 101
90static char const *exynos5250_dt_compat[] __initdata = { 102static char const *exynos5_dt_compat[] __initdata = {
91 "samsung,exynos5250", 103 "samsung,exynos5250",
104 "samsung,exynos5440",
92 NULL 105 NULL
93}; 106};
94 107
@@ -96,11 +109,11 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")
96 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ 109 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
97 .init_irq = exynos5_init_irq, 110 .init_irq = exynos5_init_irq,
98 .smp = smp_ops(exynos_smp_ops), 111 .smp = smp_ops(exynos_smp_ops),
99 .map_io = exynos5250_dt_map_io, 112 .map_io = exynos5_dt_map_io,
100 .handle_irq = gic_handle_irq, 113 .handle_irq = gic_handle_irq,
101 .init_machine = exynos5250_dt_machine_init, 114 .init_machine = exynos5_dt_machine_init,
102 .init_late = exynos_init_late, 115 .init_late = exynos_init_late,
103 .timer = &exynos4_timer, 116 .timer = &exynos4_timer,
104 .dt_compat = exynos5250_dt_compat, 117 .dt_compat = exynos5_dt_compat,
105 .restart = exynos5_restart, 118 .restart = exynos5_restart,
106MACHINE_END 119MACHINE_END
diff --git a/arch/arm/mach-exynos/mct.c b/arch/arm/mach-exynos/mct.c
index b601fb8a408b..57668eb68e75 100644
--- a/arch/arm/mach-exynos/mct.c
+++ b/arch/arm/mach-exynos/mct.c
@@ -19,7 +19,9 @@
19#include <linux/platform_device.h> 19#include <linux/platform_device.h>
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/percpu.h> 21#include <linux/percpu.h>
22#include <linux/of.h>
22 23
24#include <asm/arch_timer.h>
23#include <asm/hardware/gic.h> 25#include <asm/hardware/gic.h>
24#include <asm/localtimer.h> 26#include <asm/localtimer.h>
25 27
@@ -476,8 +478,13 @@ static void __init exynos4_timer_resources(void)
476#endif /* CONFIG_LOCAL_TIMERS */ 478#endif /* CONFIG_LOCAL_TIMERS */
477} 479}
478 480
479static void __init exynos4_timer_init(void) 481static void __init exynos_timer_init(void)
480{ 482{
483 if (soc_is_exynos5440()) {
484 arch_timer_of_register();
485 return;
486 }
487
481 if ((soc_is_exynos4210()) || (soc_is_exynos5250())) 488 if ((soc_is_exynos4210()) || (soc_is_exynos5250()))
482 mct_int_type = MCT_INT_SPI; 489 mct_int_type = MCT_INT_SPI;
483 else 490 else
@@ -489,5 +496,5 @@ static void __init exynos4_timer_init(void)
489} 496}
490 497
491struct sys_timer exynos4_timer = { 498struct sys_timer exynos4_timer = {
492 .init = exynos4_timer_init, 499 .init = exynos_timer_init,
493}; 500};
diff --git a/arch/arm/mach-exynos/setup-i2c0.c b/arch/arm/mach-exynos/setup-i2c0.c
index 5700f23629f7..e2d9dfbf102c 100644
--- a/arch/arm/mach-exynos/setup-i2c0.c
+++ b/arch/arm/mach-exynos/setup-i2c0.c
@@ -20,7 +20,7 @@ struct platform_device; /* don't need the contents */
20 20
21void s3c_i2c0_cfg_gpio(struct platform_device *dev) 21void s3c_i2c0_cfg_gpio(struct platform_device *dev)
22{ 22{
23 if (soc_is_exynos5250()) 23 if (soc_is_exynos5250() || soc_is_exynos5440())
24 /* will be implemented with gpio function */ 24 /* will be implemented with gpio function */
25 return; 25 return;
26 26