aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-exynos
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-exynos')
-rw-r--r--arch/arm/mach-exynos/Kconfig9
-rw-r--r--arch/arm/mach-exynos/Makefile.boot3
-rw-r--r--arch/arm/mach-exynos/clock-exynos4.c31
-rw-r--r--arch/arm/mach-exynos/clock-exynos5.c172
-rw-r--r--arch/arm/mach-exynos/common.c26
-rw-r--r--arch/arm/mach-exynos/common.h5
-rw-r--r--arch/arm/mach-exynos/hotplug.c18
-rw-r--r--arch/arm/mach-exynos/include/mach/map.h12
-rw-r--r--arch/arm/mach-exynos/include/mach/sysmmu.h2
-rw-r--r--arch/arm/mach-exynos/mach-armlex4210.c1
-rw-r--r--arch/arm/mach-exynos/mach-exynos4-dt.c32
-rw-r--r--arch/arm/mach-exynos/mach-exynos5-dt.c17
-rw-r--r--arch/arm/mach-exynos/mach-nuri.c1
-rw-r--r--arch/arm/mach-exynos/mach-origen.c7
-rw-r--r--arch/arm/mach-exynos/mach-smdk4x12.c8
-rw-r--r--arch/arm/mach-exynos/mach-smdkv310.c9
-rw-r--r--arch/arm/mach-exynos/mach-universal_c210.c1
-rw-r--r--arch/arm/mach-exynos/platsmp.c29
18 files changed, 290 insertions, 93 deletions
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index b5b4c8c9db11..4372075c551f 100644
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -221,6 +221,7 @@ config MACH_SMDKV310
221 select EXYNOS4_SETUP_KEYPAD 221 select EXYNOS4_SETUP_KEYPAD
222 select EXYNOS4_SETUP_SDHCI 222 select EXYNOS4_SETUP_SDHCI
223 select EXYNOS4_SETUP_USB_PHY 223 select EXYNOS4_SETUP_USB_PHY
224 select S3C24XX_PWM
224 help 225 help
225 Machine support for Samsung SMDKV310 226 Machine support for Samsung SMDKV310
226 227
@@ -348,6 +349,7 @@ config MACH_ORIGEN
348 select EXYNOS4_SETUP_FIMD0 349 select EXYNOS4_SETUP_FIMD0
349 select EXYNOS4_SETUP_SDHCI 350 select EXYNOS4_SETUP_SDHCI
350 select EXYNOS4_SETUP_USB_PHY 351 select EXYNOS4_SETUP_USB_PHY
352 select S3C24XX_PWM
351 help 353 help
352 Machine support for ORIGEN based on Samsung EXYNOS4210 354 Machine support for ORIGEN based on Samsung EXYNOS4210
353 355
@@ -383,6 +385,7 @@ config MACH_SMDK4212
383 select EXYNOS4_SETUP_KEYPAD 385 select EXYNOS4_SETUP_KEYPAD
384 select EXYNOS4_SETUP_SDHCI 386 select EXYNOS4_SETUP_SDHCI
385 select EXYNOS4_SETUP_USB_PHY 387 select EXYNOS4_SETUP_USB_PHY
388 select S3C24XX_PWM
386 help 389 help
387 Machine support for Samsung SMDK4212 390 Machine support for Samsung SMDK4212
388 391
@@ -405,6 +408,8 @@ config MACH_EXYNOS4_DT
405 select USE_OF 408 select USE_OF
406 select ARM_AMBA 409 select ARM_AMBA
407 select HAVE_SAMSUNG_KEYPAD if INPUT_KEYBOARD 410 select HAVE_SAMSUNG_KEYPAD if INPUT_KEYBOARD
411 select PINCTRL
412 select PINCTRL_EXYNOS4
408 help 413 help
409 Machine support for Samsung Exynos4 machine with device tree enabled. 414 Machine support for Samsung Exynos4 machine with device tree enabled.
410 Select this if a fdt blob is available for the Exynos4 SoC based board. 415 Select this if a fdt blob is available for the Exynos4 SoC based board.
@@ -418,8 +423,8 @@ config MACH_EXYNOS5_DT
418 select USE_OF 423 select USE_OF
419 select ARM_AMBA 424 select ARM_AMBA
420 help 425 help
421 Machine support for Samsung Exynos4 machine with device tree enabled. 426 Machine support for Samsung EXYNOS5 machine with device tree enabled.
422 Select this if a fdt blob is available for the EXYNOS4 SoC based board. 427 Select this if a fdt blob is available for the EXYNOS5 SoC based board.
423 428
424if ARCH_EXYNOS4 429if ARCH_EXYNOS4
425 430
diff --git a/arch/arm/mach-exynos/Makefile.boot b/arch/arm/mach-exynos/Makefile.boot
index 31bd181b0514..b9862e22bf10 100644
--- a/arch/arm/mach-exynos/Makefile.boot
+++ b/arch/arm/mach-exynos/Makefile.boot
@@ -1,5 +1,2 @@
1 zreladdr-y += 0x40008000 1 zreladdr-y += 0x40008000
2params_phys-y := 0x40000100 2params_phys-y := 0x40000100
3
4dtb-$(CONFIG_MACH_EXYNOS4_DT) += exynos4210-origen.dtb exynos4210-smdkv310.dtb
5dtb-$(CONFIG_MACH_EXYNOS5_DT) += exynos5250-smdk5250.dtb
diff --git a/arch/arm/mach-exynos/clock-exynos4.c b/arch/arm/mach-exynos/clock-exynos4.c
index 2f51293c1875..6a45c9a9abe9 100644
--- a/arch/arm/mach-exynos/clock-exynos4.c
+++ b/arch/arm/mach-exynos/clock-exynos4.c
@@ -501,6 +501,10 @@ static struct clk exynos4_init_clocks_off[] = {
501 .enable = exynos4_clk_ip_cam_ctrl, 501 .enable = exynos4_clk_ip_cam_ctrl,
502 .ctrlbit = (1 << 3), 502 .ctrlbit = (1 << 3),
503 }, { 503 }, {
504 .name = "tsi",
505 .enable = exynos4_clk_ip_fsys_ctrl,
506 .ctrlbit = (1 << 4),
507 }, {
504 .name = "hsmmc", 508 .name = "hsmmc",
505 .devname = "exynos4-sdhci.0", 509 .devname = "exynos4-sdhci.0",
506 .parent = &exynos4_clk_aclk_133.clk, 510 .parent = &exynos4_clk_aclk_133.clk,
@@ -530,6 +534,14 @@ static struct clk exynos4_init_clocks_off[] = {
530 .enable = exynos4_clk_ip_fsys_ctrl, 534 .enable = exynos4_clk_ip_fsys_ctrl,
531 .ctrlbit = (1 << 9), 535 .ctrlbit = (1 << 9),
532 }, { 536 }, {
537 .name = "onenand",
538 .enable = exynos4_clk_ip_fsys_ctrl,
539 .ctrlbit = (1 << 15),
540 }, {
541 .name = "nfcon",
542 .enable = exynos4_clk_ip_fsys_ctrl,
543 .ctrlbit = (1 << 16),
544 }, {
533 .name = "dac", 545 .name = "dac",
534 .devname = "s5p-sdo", 546 .devname = "s5p-sdo",
535 .enable = exynos4_clk_ip_tv_ctrl, 547 .enable = exynos4_clk_ip_tv_ctrl,
@@ -615,6 +627,25 @@ static struct clk exynos4_init_clocks_off[] = {
615 .enable = exynos4_clk_ip_peril_ctrl, 627 .enable = exynos4_clk_ip_peril_ctrl,
616 .ctrlbit = (1 << 21), 628 .ctrlbit = (1 << 21),
617 }, { 629 }, {
630 .name = "pcm",
631 .devname = "samsung-pcm.1",
632 .enable = exynos4_clk_ip_peril_ctrl,
633 .ctrlbit = (1 << 22),
634 }, {
635 .name = "pcm",
636 .devname = "samsung-pcm.2",
637 .enable = exynos4_clk_ip_peril_ctrl,
638 .ctrlbit = (1 << 23),
639 }, {
640 .name = "slimbus",
641 .enable = exynos4_clk_ip_peril_ctrl,
642 .ctrlbit = (1 << 25),
643 }, {
644 .name = "spdif",
645 .devname = "samsung-spdif",
646 .enable = exynos4_clk_ip_peril_ctrl,
647 .ctrlbit = (1 << 26),
648 }, {
618 .name = "ac97", 649 .name = "ac97",
619 .devname = "samsung-ac97", 650 .devname = "samsung-ac97",
620 .enable = exynos4_clk_ip_peril_ctrl, 651 .enable = exynos4_clk_ip_peril_ctrl,
diff --git a/arch/arm/mach-exynos/clock-exynos5.c b/arch/arm/mach-exynos/clock-exynos5.c
index 774533c67066..c44ca1ee1b8d 100644
--- a/arch/arm/mach-exynos/clock-exynos5.c
+++ b/arch/arm/mach-exynos/clock-exynos5.c
@@ -166,11 +166,6 @@ static int exynos5_clk_ip_gen_ctrl(struct clk *clk, int enable)
166 return s5p_gatectrl(EXYNOS5_CLKGATE_IP_GEN, clk, enable); 166 return s5p_gatectrl(EXYNOS5_CLKGATE_IP_GEN, clk, enable);
167} 167}
168 168
169static int exynos5_clk_ip_gps_ctrl(struct clk *clk, int enable)
170{
171 return s5p_gatectrl(EXYNOS5_CLKGATE_IP_GPS, clk, enable);
172}
173
174static int exynos5_clk_ip_mfc_ctrl(struct clk *clk, int enable) 169static int exynos5_clk_ip_mfc_ctrl(struct clk *clk, int enable)
175{ 170{
176 return s5p_gatectrl(EXYNOS5_CLKGATE_IP_MFC, clk, enable); 171 return s5p_gatectrl(EXYNOS5_CLKGATE_IP_MFC, clk, enable);
@@ -552,6 +547,68 @@ static struct clksrc_clk exynos5_clk_aclk_66 = {
552 .reg_div = { .reg = EXYNOS5_CLKDIV_TOP0, .shift = 0, .size = 3 }, 547 .reg_div = { .reg = EXYNOS5_CLKDIV_TOP0, .shift = 0, .size = 3 },
553}; 548};
554 549
550static struct clksrc_clk exynos5_clk_mout_aclk_300_gscl_mid = {
551 .clk = {
552 .name = "mout_aclk_300_gscl_mid",
553 },
554 .sources = &exynos5_clkset_aclk,
555 .reg_src = { .reg = EXYNOS5_CLKSRC_TOP0, .shift = 24, .size = 1 },
556};
557
558static struct clk *exynos5_clkset_aclk_300_mid1_list[] = {
559 [0] = &exynos5_clk_sclk_vpll.clk,
560 [1] = &exynos5_clk_mout_cpll.clk,
561};
562
563static struct clksrc_sources exynos5_clkset_aclk_300_gscl_mid1 = {
564 .sources = exynos5_clkset_aclk_300_mid1_list,
565 .nr_sources = ARRAY_SIZE(exynos5_clkset_aclk_300_mid1_list),
566};
567
568static struct clksrc_clk exynos5_clk_mout_aclk_300_gscl_mid1 = {
569 .clk = {
570 .name = "mout_aclk_300_gscl_mid1",
571 },
572 .sources = &exynos5_clkset_aclk_300_gscl_mid1,
573 .reg_src = { .reg = EXYNOS5_CLKSRC_TOP1, .shift = 12, .size = 1 },
574};
575
576static struct clk *exynos5_clkset_aclk_300_gscl_list[] = {
577 [0] = &exynos5_clk_mout_aclk_300_gscl_mid.clk,
578 [1] = &exynos5_clk_mout_aclk_300_gscl_mid1.clk,
579};
580
581static struct clksrc_sources exynos5_clkset_aclk_300_gscl = {
582 .sources = exynos5_clkset_aclk_300_gscl_list,
583 .nr_sources = ARRAY_SIZE(exynos5_clkset_aclk_300_gscl_list),
584};
585
586static struct clksrc_clk exynos5_clk_mout_aclk_300_gscl = {
587 .clk = {
588 .name = "mout_aclk_300_gscl",
589 },
590 .sources = &exynos5_clkset_aclk_300_gscl,
591 .reg_src = { .reg = EXYNOS5_CLKSRC_TOP0, .shift = 25, .size = 1 },
592};
593
594static struct clk *exynos5_clk_src_gscl_300_list[] = {
595 [0] = &clk_ext_xtal_mux,
596 [1] = &exynos5_clk_mout_aclk_300_gscl.clk,
597};
598
599static struct clksrc_sources exynos5_clk_src_gscl_300 = {
600 .sources = exynos5_clk_src_gscl_300_list,
601 .nr_sources = ARRAY_SIZE(exynos5_clk_src_gscl_300_list),
602};
603
604static struct clksrc_clk exynos5_clk_aclk_300_gscl = {
605 .clk = {
606 .name = "aclk_300_gscl",
607 },
608 .sources = &exynos5_clk_src_gscl_300,
609 .reg_src = { .reg = EXYNOS5_CLKSRC_TOP3, .shift = 10, .size = 1 },
610};
611
555static struct clk exynos5_init_clocks_off[] = { 612static struct clk exynos5_init_clocks_off[] = {
556 { 613 {
557 .name = "timers", 614 .name = "timers",
@@ -569,35 +626,30 @@ static struct clk exynos5_init_clocks_off[] = {
569 .enable = exynos5_clk_ip_peris_ctrl, 626 .enable = exynos5_clk_ip_peris_ctrl,
570 .ctrlbit = (1 << 19), 627 .ctrlbit = (1 << 19),
571 }, { 628 }, {
572 .name = "hsmmc", 629 .name = "biu", /* bus interface unit clock */
573 .devname = "exynos4-sdhci.0", 630 .devname = "dw_mmc.0",
574 .parent = &exynos5_clk_aclk_200.clk, 631 .parent = &exynos5_clk_aclk_200.clk,
575 .enable = exynos5_clk_ip_fsys_ctrl, 632 .enable = exynos5_clk_ip_fsys_ctrl,
576 .ctrlbit = (1 << 12), 633 .ctrlbit = (1 << 12),
577 }, { 634 }, {
578 .name = "hsmmc", 635 .name = "biu",
579 .devname = "exynos4-sdhci.1", 636 .devname = "dw_mmc.1",
580 .parent = &exynos5_clk_aclk_200.clk, 637 .parent = &exynos5_clk_aclk_200.clk,
581 .enable = exynos5_clk_ip_fsys_ctrl, 638 .enable = exynos5_clk_ip_fsys_ctrl,
582 .ctrlbit = (1 << 13), 639 .ctrlbit = (1 << 13),
583 }, { 640 }, {
584 .name = "hsmmc", 641 .name = "biu",
585 .devname = "exynos4-sdhci.2", 642 .devname = "dw_mmc.2",
586 .parent = &exynos5_clk_aclk_200.clk, 643 .parent = &exynos5_clk_aclk_200.clk,
587 .enable = exynos5_clk_ip_fsys_ctrl, 644 .enable = exynos5_clk_ip_fsys_ctrl,
588 .ctrlbit = (1 << 14), 645 .ctrlbit = (1 << 14),
589 }, { 646 }, {
590 .name = "hsmmc", 647 .name = "biu",
591 .devname = "exynos4-sdhci.3", 648 .devname = "dw_mmc.3",
592 .parent = &exynos5_clk_aclk_200.clk, 649 .parent = &exynos5_clk_aclk_200.clk,
593 .enable = exynos5_clk_ip_fsys_ctrl, 650 .enable = exynos5_clk_ip_fsys_ctrl,
594 .ctrlbit = (1 << 15), 651 .ctrlbit = (1 << 15),
595 }, { 652 }, {
596 .name = "dwmci",
597 .parent = &exynos5_clk_aclk_200.clk,
598 .enable = exynos5_clk_ip_fsys_ctrl,
599 .ctrlbit = (1 << 16),
600 }, {
601 .name = "sata", 653 .name = "sata",
602 .devname = "ahci", 654 .devname = "ahci",
603 .enable = exynos5_clk_ip_fsys_ctrl, 655 .enable = exynos5_clk_ip_fsys_ctrl,
@@ -672,10 +724,6 @@ static struct clk exynos5_init_clocks_off[] = {
672 .enable = exynos5_clk_ip_fsys_ctrl, 724 .enable = exynos5_clk_ip_fsys_ctrl,
673 .ctrlbit = (1 << 7), 725 .ctrlbit = (1 << 7),
674 }, { 726 }, {
675 .name = "gps",
676 .enable = exynos5_clk_ip_gps_ctrl,
677 .ctrlbit = ((1 << 3) | (1 << 2) | (1 << 0)),
678 }, {
679 .name = "nfcon", 727 .name = "nfcon",
680 .enable = exynos5_clk_ip_fsys_ctrl, 728 .enable = exynos5_clk_ip_fsys_ctrl,
681 .ctrlbit = (1 << 22), 729 .ctrlbit = (1 << 22),
@@ -764,6 +812,26 @@ static struct clk exynos5_init_clocks_off[] = {
764 .enable = exynos5_clk_ip_peric_ctrl, 812 .enable = exynos5_clk_ip_peric_ctrl,
765 .ctrlbit = (1 << 18), 813 .ctrlbit = (1 << 18),
766 }, { 814 }, {
815 .name = "gscl",
816 .devname = "exynos-gsc.0",
817 .enable = exynos5_clk_ip_gscl_ctrl,
818 .ctrlbit = (1 << 0),
819 }, {
820 .name = "gscl",
821 .devname = "exynos-gsc.1",
822 .enable = exynos5_clk_ip_gscl_ctrl,
823 .ctrlbit = (1 << 1),
824 }, {
825 .name = "gscl",
826 .devname = "exynos-gsc.2",
827 .enable = exynos5_clk_ip_gscl_ctrl,
828 .ctrlbit = (1 << 2),
829 }, {
830 .name = "gscl",
831 .devname = "exynos-gsc.3",
832 .enable = exynos5_clk_ip_gscl_ctrl,
833 .ctrlbit = (1 << 3),
834 }, {
767 .name = SYSMMU_CLOCK_NAME, 835 .name = SYSMMU_CLOCK_NAME,
768 .devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0), 836 .devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0),
769 .enable = &exynos5_clk_ip_mfc_ctrl, 837 .enable = &exynos5_clk_ip_mfc_ctrl,
@@ -891,6 +959,13 @@ static struct clk exynos5_clk_mdma1 = {
891 .ctrlbit = (1 << 4), 959 .ctrlbit = (1 << 4),
892}; 960};
893 961
962static struct clk exynos5_clk_fimd1 = {
963 .name = "fimd",
964 .devname = "exynos5-fb.1",
965 .enable = exynos5_clk_ip_disp1_ctrl,
966 .ctrlbit = (1 << 0),
967};
968
894struct clk *exynos5_clkset_group_list[] = { 969struct clk *exynos5_clkset_group_list[] = {
895 [0] = &clk_ext_xtal_mux, 970 [0] = &clk_ext_xtal_mux,
896 [1] = NULL, 971 [1] = NULL,
@@ -1015,8 +1090,8 @@ static struct clksrc_clk exynos5_clk_sclk_uart3 = {
1015 1090
1016static struct clksrc_clk exynos5_clk_sclk_mmc0 = { 1091static struct clksrc_clk exynos5_clk_sclk_mmc0 = {
1017 .clk = { 1092 .clk = {
1018 .name = "sclk_mmc", 1093 .name = "ciu", /* card interface unit clock */
1019 .devname = "exynos4-sdhci.0", 1094 .devname = "dw_mmc.0",
1020 .parent = &exynos5_clk_dout_mmc0.clk, 1095 .parent = &exynos5_clk_dout_mmc0.clk,
1021 .enable = exynos5_clksrc_mask_fsys_ctrl, 1096 .enable = exynos5_clksrc_mask_fsys_ctrl,
1022 .ctrlbit = (1 << 0), 1097 .ctrlbit = (1 << 0),
@@ -1026,8 +1101,8 @@ static struct clksrc_clk exynos5_clk_sclk_mmc0 = {
1026 1101
1027static struct clksrc_clk exynos5_clk_sclk_mmc1 = { 1102static struct clksrc_clk exynos5_clk_sclk_mmc1 = {
1028 .clk = { 1103 .clk = {
1029 .name = "sclk_mmc", 1104 .name = "ciu",
1030 .devname = "exynos4-sdhci.1", 1105 .devname = "dw_mmc.1",
1031 .parent = &exynos5_clk_dout_mmc1.clk, 1106 .parent = &exynos5_clk_dout_mmc1.clk,
1032 .enable = exynos5_clksrc_mask_fsys_ctrl, 1107 .enable = exynos5_clksrc_mask_fsys_ctrl,
1033 .ctrlbit = (1 << 4), 1108 .ctrlbit = (1 << 4),
@@ -1037,8 +1112,8 @@ static struct clksrc_clk exynos5_clk_sclk_mmc1 = {
1037 1112
1038static struct clksrc_clk exynos5_clk_sclk_mmc2 = { 1113static struct clksrc_clk exynos5_clk_sclk_mmc2 = {
1039 .clk = { 1114 .clk = {
1040 .name = "sclk_mmc", 1115 .name = "ciu",
1041 .devname = "exynos4-sdhci.2", 1116 .devname = "dw_mmc.2",
1042 .parent = &exynos5_clk_dout_mmc2.clk, 1117 .parent = &exynos5_clk_dout_mmc2.clk,
1043 .enable = exynos5_clksrc_mask_fsys_ctrl, 1118 .enable = exynos5_clksrc_mask_fsys_ctrl,
1044 .ctrlbit = (1 << 8), 1119 .ctrlbit = (1 << 8),
@@ -1048,8 +1123,8 @@ static struct clksrc_clk exynos5_clk_sclk_mmc2 = {
1048 1123
1049static struct clksrc_clk exynos5_clk_sclk_mmc3 = { 1124static struct clksrc_clk exynos5_clk_sclk_mmc3 = {
1050 .clk = { 1125 .clk = {
1051 .name = "sclk_mmc", 1126 .name = "ciu",
1052 .devname = "exynos4-sdhci.3", 1127 .devname = "dw_mmc.3",
1053 .parent = &exynos5_clk_dout_mmc3.clk, 1128 .parent = &exynos5_clk_dout_mmc3.clk,
1054 .enable = exynos5_clksrc_mask_fsys_ctrl, 1129 .enable = exynos5_clksrc_mask_fsys_ctrl,
1055 .ctrlbit = (1 << 12), 1130 .ctrlbit = (1 << 12),
@@ -1120,27 +1195,21 @@ static struct clksrc_clk exynos5_clk_sclk_spi2 = {
1120 .reg_div = { .reg = EXYNOS5_CLKDIV_PERIC2, .shift = 8, .size = 8 }, 1195 .reg_div = { .reg = EXYNOS5_CLKDIV_PERIC2, .shift = 8, .size = 8 },
1121}; 1196};
1122 1197
1198struct clksrc_clk exynos5_clk_sclk_fimd1 = {
1199 .clk = {
1200 .name = "sclk_fimd",
1201 .devname = "exynos5-fb.1",
1202 .enable = exynos5_clksrc_mask_disp1_0_ctrl,
1203 .ctrlbit = (1 << 0),
1204 },
1205 .sources = &exynos5_clkset_group,
1206 .reg_src = { .reg = EXYNOS5_CLKSRC_DISP1_0, .shift = 0, .size = 4 },
1207 .reg_div = { .reg = EXYNOS5_CLKDIV_DISP1_0, .shift = 0, .size = 4 },
1208};
1209
1123static struct clksrc_clk exynos5_clksrcs[] = { 1210static struct clksrc_clk exynos5_clksrcs[] = {
1124 { 1211 {
1125 .clk = { 1212 .clk = {
1126 .name = "sclk_dwmci",
1127 .parent = &exynos5_clk_dout_mmc4.clk,
1128 .enable = exynos5_clksrc_mask_fsys_ctrl,
1129 .ctrlbit = (1 << 16),
1130 },
1131 .reg_div = { .reg = EXYNOS5_CLKDIV_FSYS3, .shift = 8, .size = 8 },
1132 }, {
1133 .clk = {
1134 .name = "sclk_fimd",
1135 .devname = "s3cfb.1",
1136 .enable = exynos5_clksrc_mask_disp1_0_ctrl,
1137 .ctrlbit = (1 << 0),
1138 },
1139 .sources = &exynos5_clkset_group,
1140 .reg_src = { .reg = EXYNOS5_CLKSRC_DISP1_0, .shift = 0, .size = 4 },
1141 .reg_div = { .reg = EXYNOS5_CLKDIV_DISP1_0, .shift = 0, .size = 4 },
1142 }, {
1143 .clk = {
1144 .name = "aclk_266_gscl", 1213 .name = "aclk_266_gscl",
1145 }, 1214 },
1146 .sources = &clk_src_gscl_266, 1215 .sources = &clk_src_gscl_266,
@@ -1225,6 +1294,10 @@ static struct clksrc_clk *exynos5_sysclks[] = {
1225 &exynos5_clk_aclk_266, 1294 &exynos5_clk_aclk_266,
1226 &exynos5_clk_aclk_200, 1295 &exynos5_clk_aclk_200,
1227 &exynos5_clk_aclk_166, 1296 &exynos5_clk_aclk_166,
1297 &exynos5_clk_aclk_300_gscl,
1298 &exynos5_clk_mout_aclk_300_gscl,
1299 &exynos5_clk_mout_aclk_300_gscl_mid,
1300 &exynos5_clk_mout_aclk_300_gscl_mid1,
1228 &exynos5_clk_aclk_66_pre, 1301 &exynos5_clk_aclk_66_pre,
1229 &exynos5_clk_aclk_66, 1302 &exynos5_clk_aclk_66,
1230 &exynos5_clk_dout_mmc0, 1303 &exynos5_clk_dout_mmc0,
@@ -1240,12 +1313,14 @@ static struct clksrc_clk *exynos5_sysclks[] = {
1240 &exynos5_clk_mdout_spi0, 1313 &exynos5_clk_mdout_spi0,
1241 &exynos5_clk_mdout_spi1, 1314 &exynos5_clk_mdout_spi1,
1242 &exynos5_clk_mdout_spi2, 1315 &exynos5_clk_mdout_spi2,
1316 &exynos5_clk_sclk_fimd1,
1243}; 1317};
1244 1318
1245static struct clk *exynos5_clk_cdev[] = { 1319static struct clk *exynos5_clk_cdev[] = {
1246 &exynos5_clk_pdma0, 1320 &exynos5_clk_pdma0,
1247 &exynos5_clk_pdma1, 1321 &exynos5_clk_pdma1,
1248 &exynos5_clk_mdma1, 1322 &exynos5_clk_mdma1,
1323 &exynos5_clk_fimd1,
1249}; 1324};
1250 1325
1251static struct clksrc_clk *exynos5_clksrc_cdev[] = { 1326static struct clksrc_clk *exynos5_clksrc_cdev[] = {
@@ -1274,6 +1349,7 @@ static struct clk_lookup exynos5_clk_lookup[] = {
1274 CLKDEV_INIT("dma-pl330.0", "apb_pclk", &exynos5_clk_pdma0), 1349 CLKDEV_INIT("dma-pl330.0", "apb_pclk", &exynos5_clk_pdma0),
1275 CLKDEV_INIT("dma-pl330.1", "apb_pclk", &exynos5_clk_pdma1), 1350 CLKDEV_INIT("dma-pl330.1", "apb_pclk", &exynos5_clk_pdma1),
1276 CLKDEV_INIT("dma-pl330.2", "apb_pclk", &exynos5_clk_mdma1), 1351 CLKDEV_INIT("dma-pl330.2", "apb_pclk", &exynos5_clk_mdma1),
1352 CLKDEV_INIT("exynos5-fb.1", "lcd", &exynos5_clk_fimd1),
1277}; 1353};
1278 1354
1279static unsigned long exynos5_epll_get_rate(struct clk *clk) 1355static unsigned long exynos5_epll_get_rate(struct clk *clk)
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c
index 4eb39cdf75ea..715b690e5009 100644
--- a/arch/arm/mach-exynos/common.c
+++ b/arch/arm/mach-exynos/common.c
@@ -980,6 +980,32 @@ static int __init exynos_init_irq_eint(void)
980{ 980{
981 int irq; 981 int irq;
982 982
983#ifdef CONFIG_PINCTRL_SAMSUNG
984 /*
985 * The Samsung pinctrl driver provides an integrated gpio/pinmux/pinconf
986 * functionality along with support for external gpio and wakeup
987 * interrupts. If the samsung pinctrl driver is enabled and includes
988 * the wakeup interrupt support, then the setting up external wakeup
989 * interrupts here can be skipped. This check here is temporary to
990 * allow exynos4 platforms that do not use Samsung pinctrl driver to
991 * co-exist with platforms that do. When all of the Samsung Exynos4
992 * platforms switch over to using the pinctrl driver, the wakeup
993 * interrupt support code here can be completely removed.
994 */
995 struct device_node *pctrl_np, *wkup_np;
996 const char *pctrl_compat = "samsung,pinctrl-exynos4210";
997 const char *wkup_compat = "samsung,exynos4210-wakeup-eint";
998
999 for_each_compatible_node(pctrl_np, NULL, pctrl_compat) {
1000 if (of_device_is_available(pctrl_np)) {
1001 wkup_np = of_find_compatible_node(pctrl_np, NULL,
1002 wkup_compat);
1003 if (wkup_np)
1004 return -ENODEV;
1005 }
1006 }
1007#endif
1008
983 if (soc_is_exynos5250()) 1009 if (soc_is_exynos5250())
984 exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K); 1010 exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K);
985 else 1011 else
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h
index aed2eeb06517..dac146df79ac 100644
--- a/arch/arm/mach-exynos/common.h
+++ b/arch/arm/mach-exynos/common.h
@@ -14,6 +14,7 @@
14 14
15extern struct sys_timer exynos4_timer; 15extern struct sys_timer exynos4_timer;
16 16
17struct map_desc;
17void exynos_init_io(struct map_desc *mach_desc, int size); 18void exynos_init_io(struct map_desc *mach_desc, int size);
18void exynos4_init_irq(void); 19void exynos4_init_irq(void);
19void exynos5_init_irq(void); 20void exynos5_init_irq(void);
@@ -59,4 +60,8 @@ void exynos4212_register_clocks(void);
59#define exynos4212_register_clocks() 60#define exynos4212_register_clocks()
60#endif 61#endif
61 62
63extern struct smp_operations exynos_smp_ops;
64
65extern void exynos_cpu_die(unsigned int cpu);
66
62#endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */ 67#endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */
diff --git a/arch/arm/mach-exynos/hotplug.c b/arch/arm/mach-exynos/hotplug.c
index 9c17a0a43858..f4d7dd20cdac 100644
--- a/arch/arm/mach-exynos/hotplug.c
+++ b/arch/arm/mach-exynos/hotplug.c
@@ -21,7 +21,7 @@
21 21
22#include <mach/regs-pmu.h> 22#include <mach/regs-pmu.h>
23 23
24extern volatile int pen_release; 24#include "common.h"
25 25
26static inline void cpu_enter_lowpower(void) 26static inline void cpu_enter_lowpower(void)
27{ 27{
@@ -95,17 +95,12 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
95 } 95 }
96} 96}
97 97
98int platform_cpu_kill(unsigned int cpu)
99{
100 return 1;
101}
102
103/* 98/*
104 * platform-specific code to shutdown a CPU 99 * platform-specific code to shutdown a CPU
105 * 100 *
106 * Called with IRQs disabled 101 * Called with IRQs disabled
107 */ 102 */
108void platform_cpu_die(unsigned int cpu) 103void __ref exynos_cpu_die(unsigned int cpu)
109{ 104{
110 int spurious = 0; 105 int spurious = 0;
111 106
@@ -124,12 +119,3 @@ void platform_cpu_die(unsigned int cpu)
124 if (spurious) 119 if (spurious)
125 pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious); 120 pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
126} 121}
127
128int platform_cpu_disable(unsigned int cpu)
129{
130 /*
131 * we don't allow CPU 0 to be shutdown (it is still too special
132 * e.g. clock tick interrupts)
133 */
134 return cpu == 0 ? -EPERM : 0;
135}
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h
index c72b675b3e4b..8480849affb9 100644
--- a/arch/arm/mach-exynos/include/mach/map.h
+++ b/arch/arm/mach-exynos/include/mach/map.h
@@ -89,7 +89,7 @@
89#define EXYNOS4_PA_L2CC 0x10502000 89#define EXYNOS4_PA_L2CC 0x10502000
90 90
91#define EXYNOS4_PA_MDMA0 0x10810000 91#define EXYNOS4_PA_MDMA0 0x10810000
92#define EXYNOS4_PA_MDMA1 0x12840000 92#define EXYNOS4_PA_MDMA1 0x12850000
93#define EXYNOS4_PA_PDMA0 0x12680000 93#define EXYNOS4_PA_PDMA0 0x12680000
94#define EXYNOS4_PA_PDMA1 0x12690000 94#define EXYNOS4_PA_PDMA1 0x12690000
95#define EXYNOS5_PA_MDMA0 0x10800000 95#define EXYNOS5_PA_MDMA0 0x10800000
@@ -121,6 +121,11 @@
121#define EXYNOS4_PA_SYSMMU_MFC_L 0x13620000 121#define EXYNOS4_PA_SYSMMU_MFC_L 0x13620000
122#define EXYNOS4_PA_SYSMMU_MFC_R 0x13630000 122#define EXYNOS4_PA_SYSMMU_MFC_R 0x13630000
123 123
124#define EXYNOS5_PA_GSC0 0x13E00000
125#define EXYNOS5_PA_GSC1 0x13E10000
126#define EXYNOS5_PA_GSC2 0x13E20000
127#define EXYNOS5_PA_GSC3 0x13E30000
128
124#define EXYNOS5_PA_SYSMMU_MDMA1 0x10A40000 129#define EXYNOS5_PA_SYSMMU_MDMA1 0x10A40000
125#define EXYNOS5_PA_SYSMMU_SSS 0x10A50000 130#define EXYNOS5_PA_SYSMMU_SSS 0x10A50000
126#define EXYNOS5_PA_SYSMMU_2D 0x10A60000 131#define EXYNOS5_PA_SYSMMU_2D 0x10A60000
@@ -131,7 +136,6 @@
131#define EXYNOS5_PA_SYSMMU_JPEG 0x11F20000 136#define EXYNOS5_PA_SYSMMU_JPEG 0x11F20000
132#define EXYNOS5_PA_SYSMMU_IOP 0x12360000 137#define EXYNOS5_PA_SYSMMU_IOP 0x12360000
133#define EXYNOS5_PA_SYSMMU_RTIC 0x12370000 138#define EXYNOS5_PA_SYSMMU_RTIC 0x12370000
134#define EXYNOS5_PA_SYSMMU_GPS 0x12630000
135#define EXYNOS5_PA_SYSMMU_ISP 0x13260000 139#define EXYNOS5_PA_SYSMMU_ISP 0x13260000
136#define EXYNOS5_PA_SYSMMU_DRC 0x12370000 140#define EXYNOS5_PA_SYSMMU_DRC 0x12370000
137#define EXYNOS5_PA_SYSMMU_SCALERC 0x13280000 141#define EXYNOS5_PA_SYSMMU_SCALERC 0x13280000
@@ -173,6 +177,10 @@
173 177
174#define EXYNOS4_PA_HSMMC(x) (0x12510000 + ((x) * 0x10000)) 178#define EXYNOS4_PA_HSMMC(x) (0x12510000 + ((x) * 0x10000))
175#define EXYNOS4_PA_DWMCI 0x12550000 179#define EXYNOS4_PA_DWMCI 0x12550000
180#define EXYNOS5_PA_DWMCI0 0x12200000
181#define EXYNOS5_PA_DWMCI1 0x12210000
182#define EXYNOS5_PA_DWMCI2 0x12220000
183#define EXYNOS5_PA_DWMCI3 0x12230000
176 184
177#define EXYNOS4_PA_HSOTG 0x12480000 185#define EXYNOS4_PA_HSOTG 0x12480000
178#define EXYNOS4_PA_USB_HSPHY 0x125B0000 186#define EXYNOS4_PA_USB_HSPHY 0x125B0000
diff --git a/arch/arm/mach-exynos/include/mach/sysmmu.h b/arch/arm/mach-exynos/include/mach/sysmmu.h
index 998daf2add92..88a4543b0001 100644
--- a/arch/arm/mach-exynos/include/mach/sysmmu.h
+++ b/arch/arm/mach-exynos/include/mach/sysmmu.h
@@ -58,7 +58,7 @@ static inline void platform_set_sysmmu(
58#endif 58#endif
59 59
60#else /* !CONFIG_EXYNOS_DEV_SYSMMU */ 60#else /* !CONFIG_EXYNOS_DEV_SYSMMU */
61#define platform_set_sysmmu(dev, sysmmu) do { } while (0) 61#define platform_set_sysmmu(sysmmu, dev) do { } while (0)
62#endif 62#endif
63 63
64#define SYSMMU_CLOCK_DEVNAME(ipname, id) (SYSMMU_DEVNAME_BASE "." #id) 64#define SYSMMU_CLOCK_DEVNAME(ipname, id) (SYSMMU_DEVNAME_BASE "." #id)
diff --git a/arch/arm/mach-exynos/mach-armlex4210.c b/arch/arm/mach-exynos/mach-armlex4210.c
index 5a3daa0168d8..3f37a5e8a1f4 100644
--- a/arch/arm/mach-exynos/mach-armlex4210.c
+++ b/arch/arm/mach-exynos/mach-armlex4210.c
@@ -199,6 +199,7 @@ static void __init armlex4210_machine_init(void)
199MACHINE_START(ARMLEX4210, "ARMLEX4210") 199MACHINE_START(ARMLEX4210, "ARMLEX4210")
200 /* Maintainer: Alim Akhtar <alim.akhtar@samsung.com> */ 200 /* Maintainer: Alim Akhtar <alim.akhtar@samsung.com> */
201 .atag_offset = 0x100, 201 .atag_offset = 0x100,
202 .smp = smp_ops(exynos_smp_ops),
202 .init_irq = exynos4_init_irq, 203 .init_irq = exynos4_init_irq,
203 .map_io = armlex4210_map_io, 204 .map_io = armlex4210_map_io,
204 .handle_irq = gic_handle_irq, 205 .handle_irq = gic_handle_irq,
diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c
index b2b5d5faa748..e58d786faf78 100644
--- a/arch/arm/mach-exynos/mach-exynos4-dt.c
+++ b/arch/arm/mach-exynos/mach-exynos4-dt.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Samsung's Exynos4210 flattened device tree enabled machine 2 * Samsung's EXYNOS4 flattened device tree enabled machine
3 * 3 *
4 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. 4 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com 5 * http://www.samsung.com
@@ -36,7 +36,7 @@
36 * at some point, the drivers should be capable of parsing all the platform 36 * at some point, the drivers should be capable of parsing all the platform
37 * data from the device tree. 37 * data from the device tree.
38 */ 38 */
39static const struct of_dev_auxdata exynos4210_auxdata_lookup[] __initconst = { 39static const struct of_dev_auxdata exynos4_auxdata_lookup[] __initconst = {
40 OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS4_PA_UART0, 40 OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS4_PA_UART0,
41 "exynos4210-uart.0", NULL), 41 "exynos4210-uart.0", NULL),
42 OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS4_PA_UART1, 42 OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS4_PA_UART1,
@@ -55,6 +55,20 @@ static const struct of_dev_auxdata exynos4210_auxdata_lookup[] __initconst = {
55 "exynos4-sdhci.3", NULL), 55 "exynos4-sdhci.3", NULL),
56 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(0), 56 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(0),
57 "s3c2440-i2c.0", NULL), 57 "s3c2440-i2c.0", NULL),
58 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(1),
59 "s3c2440-i2c.1", NULL),
60 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(2),
61 "s3c2440-i2c.2", NULL),
62 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(3),
63 "s3c2440-i2c.3", NULL),
64 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(4),
65 "s3c2440-i2c.4", NULL),
66 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(5),
67 "s3c2440-i2c.5", NULL),
68 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(6),
69 "s3c2440-i2c.6", NULL),
70 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(7),
71 "s3c2440-i2c.7", NULL),
58 OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI0, 72 OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI0,
59 "exynos4210-spi.0", NULL), 73 "exynos4210-spi.0", NULL),
60 OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI1, 74 OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI1,
@@ -66,19 +80,19 @@ static const struct of_dev_auxdata exynos4210_auxdata_lookup[] __initconst = {
66 {}, 80 {},
67}; 81};
68 82
69static void __init exynos4210_dt_map_io(void) 83static void __init exynos4_dt_map_io(void)
70{ 84{
71 exynos_init_io(NULL, 0); 85 exynos_init_io(NULL, 0);
72 s3c24xx_init_clocks(24000000); 86 s3c24xx_init_clocks(24000000);
73} 87}
74 88
75static void __init exynos4210_dt_machine_init(void) 89static void __init exynos4_dt_machine_init(void)
76{ 90{
77 of_platform_populate(NULL, of_default_bus_match_table, 91 of_platform_populate(NULL, of_default_bus_match_table,
78 exynos4210_auxdata_lookup, NULL); 92 exynos4_auxdata_lookup, NULL);
79} 93}
80 94
81static char const *exynos4210_dt_compat[] __initdata = { 95static char const *exynos4_dt_compat[] __initdata = {
82 "samsung,exynos4210", 96 "samsung,exynos4210",
83 NULL 97 NULL
84}; 98};
@@ -86,11 +100,11 @@ static char const *exynos4210_dt_compat[] __initdata = {
86DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)") 100DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)")
87 /* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */ 101 /* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */
88 .init_irq = exynos4_init_irq, 102 .init_irq = exynos4_init_irq,
89 .map_io = exynos4210_dt_map_io, 103 .map_io = exynos4_dt_map_io,
90 .handle_irq = gic_handle_irq, 104 .handle_irq = gic_handle_irq,
91 .init_machine = exynos4210_dt_machine_init, 105 .init_machine = exynos4_dt_machine_init,
92 .init_late = exynos_init_late, 106 .init_late = exynos_init_late,
93 .timer = &exynos4_timer, 107 .timer = &exynos4_timer,
94 .dt_compat = exynos4210_dt_compat, 108 .dt_compat = exynos4_dt_compat,
95 .restart = exynos4_restart, 109 .restart = exynos4_restart,
96MACHINE_END 110MACHINE_END
diff --git a/arch/arm/mach-exynos/mach-exynos5-dt.c b/arch/arm/mach-exynos/mach-exynos5-dt.c
index ef770bc2318f..db1cd8eacf28 100644
--- a/arch/arm/mach-exynos/mach-exynos5-dt.c
+++ b/arch/arm/mach-exynos/mach-exynos5-dt.c
@@ -47,6 +47,14 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = {
47 "s3c2440-i2c.0", NULL), 47 "s3c2440-i2c.0", NULL),
48 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS5_PA_IIC(1), 48 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS5_PA_IIC(1),
49 "s3c2440-i2c.1", NULL), 49 "s3c2440-i2c.1", NULL),
50 OF_DEV_AUXDATA("samsung,exynos5250-dw-mshc", EXYNOS5_PA_DWMCI0,
51 "dw_mmc.0", NULL),
52 OF_DEV_AUXDATA("samsung,exynos5250-dw-mshc", EXYNOS5_PA_DWMCI1,
53 "dw_mmc.1", NULL),
54 OF_DEV_AUXDATA("samsung,exynos5250-dw-mshc", EXYNOS5_PA_DWMCI2,
55 "dw_mmc.2", NULL),
56 OF_DEV_AUXDATA("samsung,exynos5250-dw-mshc", EXYNOS5_PA_DWMCI3,
57 "dw_mmc.3", NULL),
50 OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI0, 58 OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI0,
51 "exynos4210-spi.0", NULL), 59 "exynos4210-spi.0", NULL),
52 OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI1, 60 OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI1,
@@ -56,6 +64,14 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = {
56 OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA0, "dma-pl330.0", NULL), 64 OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA0, "dma-pl330.0", NULL),
57 OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", NULL), 65 OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", NULL),
58 OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_MDMA1, "dma-pl330.2", NULL), 66 OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_MDMA1, "dma-pl330.2", NULL),
67 OF_DEV_AUXDATA("samsung,exynos5-gsc", EXYNOS5_PA_GSC0,
68 "exynos-gsc.0", NULL),
69 OF_DEV_AUXDATA("samsung,exynos5-gsc", EXYNOS5_PA_GSC1,
70 "exynos-gsc.1", NULL),
71 OF_DEV_AUXDATA("samsung,exynos5-gsc", EXYNOS5_PA_GSC2,
72 "exynos-gsc.2", NULL),
73 OF_DEV_AUXDATA("samsung,exynos5-gsc", EXYNOS5_PA_GSC3,
74 "exynos-gsc.3", NULL),
59 {}, 75 {},
60}; 76};
61 77
@@ -79,6 +95,7 @@ static char const *exynos5250_dt_compat[] __initdata = {
79DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)") 95DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")
80 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ 96 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
81 .init_irq = exynos5_init_irq, 97 .init_irq = exynos5_init_irq,
98 .smp = smp_ops(exynos_smp_ops),
82 .map_io = exynos5250_dt_map_io, 99 .map_io = exynos5250_dt_map_io,
83 .handle_irq = gic_handle_irq, 100 .handle_irq = gic_handle_irq,
84 .init_machine = exynos5250_dt_machine_init, 101 .init_machine = exynos5250_dt_machine_init,
diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c
index bdbaef2ae2cd..d397fd2f07ff 100644
--- a/arch/arm/mach-exynos/mach-nuri.c
+++ b/arch/arm/mach-exynos/mach-nuri.c
@@ -1380,6 +1380,7 @@ static void __init nuri_machine_init(void)
1380MACHINE_START(NURI, "NURI") 1380MACHINE_START(NURI, "NURI")
1381 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */ 1381 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
1382 .atag_offset = 0x100, 1382 .atag_offset = 0x100,
1383 .smp = smp_ops(exynos_smp_ops),
1383 .init_irq = exynos4_init_irq, 1384 .init_irq = exynos4_init_irq,
1384 .map_io = nuri_map_io, 1385 .map_io = nuri_map_io,
1385 .handle_irq = gic_handle_irq, 1386 .handle_irq = gic_handle_irq,
diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c
index 0b8d24e27e74..8ff06eb87c49 100644
--- a/arch/arm/mach-exynos/mach-origen.c
+++ b/arch/arm/mach-exynos/mach-origen.c
@@ -15,6 +15,7 @@
15#include <linux/platform_device.h> 15#include <linux/platform_device.h>
16#include <linux/io.h> 16#include <linux/io.h>
17#include <linux/input.h> 17#include <linux/input.h>
18#include <linux/pwm.h>
18#include <linux/pwm_backlight.h> 19#include <linux/pwm_backlight.h>
19#include <linux/gpio_keys.h> 20#include <linux/gpio_keys.h>
20#include <linux/i2c.h> 21#include <linux/i2c.h>
@@ -614,6 +615,10 @@ static struct platform_device origen_lcd_hv070wsa = {
614 .dev.platform_data = &origen_lcd_hv070wsa_data, 615 .dev.platform_data = &origen_lcd_hv070wsa_data,
615}; 616};
616 617
618static struct pwm_lookup origen_pwm_lookup[] = {
619 PWM_LOOKUP("s3c24xx-pwm.0", 0, "pwm-backlight.0", NULL),
620};
621
617#ifdef CONFIG_DRM_EXYNOS 622#ifdef CONFIG_DRM_EXYNOS
618static struct exynos_drm_fimd_pdata drm_fimd_pdata = { 623static struct exynos_drm_fimd_pdata drm_fimd_pdata = {
619 .panel = { 624 .panel = {
@@ -798,6 +803,7 @@ static void __init origen_machine_init(void)
798 803
799 platform_add_devices(origen_devices, ARRAY_SIZE(origen_devices)); 804 platform_add_devices(origen_devices, ARRAY_SIZE(origen_devices));
800 805
806 pwm_add_table(origen_pwm_lookup, ARRAY_SIZE(origen_pwm_lookup));
801 samsung_bl_set(&origen_bl_gpio_info, &origen_bl_data); 807 samsung_bl_set(&origen_bl_gpio_info, &origen_bl_data);
802 808
803 origen_bt_setup(); 809 origen_bt_setup();
@@ -806,6 +812,7 @@ static void __init origen_machine_init(void)
806MACHINE_START(ORIGEN, "ORIGEN") 812MACHINE_START(ORIGEN, "ORIGEN")
807 /* Maintainer: JeongHyeon Kim <jhkim@insignal.co.kr> */ 813 /* Maintainer: JeongHyeon Kim <jhkim@insignal.co.kr> */
808 .atag_offset = 0x100, 814 .atag_offset = 0x100,
815 .smp = smp_ops(exynos_smp_ops),
809 .init_irq = exynos4_init_irq, 816 .init_irq = exynos4_init_irq,
810 .map_io = origen_map_io, 817 .map_io = origen_map_io,
811 .handle_irq = gic_handle_irq, 818 .handle_irq = gic_handle_irq,
diff --git a/arch/arm/mach-exynos/mach-smdk4x12.c b/arch/arm/mach-exynos/mach-smdk4x12.c
index 6a791fd4fb0d..7a265d1a82d3 100644
--- a/arch/arm/mach-exynos/mach-smdk4x12.c
+++ b/arch/arm/mach-exynos/mach-smdk4x12.c
@@ -17,6 +17,7 @@
17#include <linux/mfd/max8997.h> 17#include <linux/mfd/max8997.h>
18#include <linux/mmc/host.h> 18#include <linux/mmc/host.h>
19#include <linux/platform_device.h> 19#include <linux/platform_device.h>
20#include <linux/pwm.h>
20#include <linux/pwm_backlight.h> 21#include <linux/pwm_backlight.h>
21#include <linux/regulator/machine.h> 22#include <linux/regulator/machine.h>
22#include <linux/serial_core.h> 23#include <linux/serial_core.h>
@@ -222,6 +223,10 @@ static struct platform_pwm_backlight_data smdk4x12_bl_data = {
222 .pwm_period_ns = 1000, 223 .pwm_period_ns = 1000,
223}; 224};
224 225
226static struct pwm_lookup smdk4x12_pwm_lookup[] = {
227 PWM_LOOKUP("s3c24xx-pwm.1", 0, "pwm-backlight.0", NULL),
228};
229
225static uint32_t smdk4x12_keymap[] __initdata = { 230static uint32_t smdk4x12_keymap[] __initdata = {
226 /* KEY(row, col, keycode) */ 231 /* KEY(row, col, keycode) */
227 KEY(1, 3, KEY_1), KEY(1, 4, KEY_2), KEY(1, 5, KEY_3), 232 KEY(1, 3, KEY_1), KEY(1, 4, KEY_2), KEY(1, 5, KEY_3),
@@ -349,6 +354,7 @@ static void __init smdk4x12_machine_init(void)
349 ARRAY_SIZE(smdk4x12_i2c_devs7)); 354 ARRAY_SIZE(smdk4x12_i2c_devs7));
350 355
351 samsung_bl_set(&smdk4x12_bl_gpio_info, &smdk4x12_bl_data); 356 samsung_bl_set(&smdk4x12_bl_gpio_info, &smdk4x12_bl_data);
357 pwm_add_table(smdk4x12_pwm_lookup, ARRAY_SIZE(smdk4x12_pwm_lookup));
352 358
353 samsung_keypad_set_platdata(&smdk4x12_keypad_data); 359 samsung_keypad_set_platdata(&smdk4x12_keypad_data);
354 360
@@ -370,6 +376,7 @@ static void __init smdk4x12_machine_init(void)
370MACHINE_START(SMDK4212, "SMDK4212") 376MACHINE_START(SMDK4212, "SMDK4212")
371 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ 377 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
372 .atag_offset = 0x100, 378 .atag_offset = 0x100,
379 .smp = smp_ops(exynos_smp_ops),
373 .init_irq = exynos4_init_irq, 380 .init_irq = exynos4_init_irq,
374 .map_io = smdk4x12_map_io, 381 .map_io = smdk4x12_map_io,
375 .handle_irq = gic_handle_irq, 382 .handle_irq = gic_handle_irq,
@@ -383,6 +390,7 @@ MACHINE_START(SMDK4412, "SMDK4412")
383 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ 390 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
384 /* Maintainer: Changhwan Youn <chaos.youn@samsung.com> */ 391 /* Maintainer: Changhwan Youn <chaos.youn@samsung.com> */
385 .atag_offset = 0x100, 392 .atag_offset = 0x100,
393 .smp = smp_ops(exynos_smp_ops),
386 .init_irq = exynos4_init_irq, 394 .init_irq = exynos4_init_irq,
387 .map_io = smdk4x12_map_io, 395 .map_io = smdk4x12_map_io,
388 .handle_irq = gic_handle_irq, 396 .handle_irq = gic_handle_irq,
diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c
index 1b864ee387cd..c15d2238ceb0 100644
--- a/arch/arm/mach-exynos/mach-smdkv310.c
+++ b/arch/arm/mach-exynos/mach-smdkv310.c
@@ -18,6 +18,7 @@
18#include <linux/io.h> 18#include <linux/io.h>
19#include <linux/i2c.h> 19#include <linux/i2c.h>
20#include <linux/input.h> 20#include <linux/input.h>
21#include <linux/pwm.h>
21#include <linux/pwm_backlight.h> 22#include <linux/pwm_backlight.h>
22#include <linux/platform_data/s3c-hsotg.h> 23#include <linux/platform_data/s3c-hsotg.h>
23 24
@@ -360,6 +361,10 @@ static struct i2c_board_info hdmiphy_info = {
360 I2C_BOARD_INFO("hdmiphy-exynos4210", 0x38), 361 I2C_BOARD_INFO("hdmiphy-exynos4210", 0x38),
361}; 362};
362 363
364static struct pwm_lookup smdkv310_pwm_lookup[] = {
365 PWM_LOOKUP("s3c24xx-pwm.1", 0, "pwm-backlight.0", NULL),
366};
367
363static void s5p_tv_setup(void) 368static void s5p_tv_setup(void)
364{ 369{
365 /* direct HPD to HDMI chip */ 370 /* direct HPD to HDMI chip */
@@ -399,6 +404,8 @@ static void __init smdkv310_machine_init(void)
399 samsung_keypad_set_platdata(&smdkv310_keypad_data); 404 samsung_keypad_set_platdata(&smdkv310_keypad_data);
400 405
401 samsung_bl_set(&smdkv310_bl_gpio_info, &smdkv310_bl_data); 406 samsung_bl_set(&smdkv310_bl_gpio_info, &smdkv310_bl_data);
407 pwm_add_table(smdkv310_pwm_lookup, ARRAY_SIZE(smdkv310_pwm_lookup));
408
402#ifdef CONFIG_DRM_EXYNOS 409#ifdef CONFIG_DRM_EXYNOS
403 s5p_device_fimd0.dev.platform_data = &drm_fimd_pdata; 410 s5p_device_fimd0.dev.platform_data = &drm_fimd_pdata;
404 exynos4_fimd0_gpio_setup_24bpp(); 411 exynos4_fimd0_gpio_setup_24bpp();
@@ -417,6 +424,7 @@ MACHINE_START(SMDKV310, "SMDKV310")
417 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ 424 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
418 /* Maintainer: Changhwan Youn <chaos.youn@samsung.com> */ 425 /* Maintainer: Changhwan Youn <chaos.youn@samsung.com> */
419 .atag_offset = 0x100, 426 .atag_offset = 0x100,
427 .smp = smp_ops(exynos_smp_ops),
420 .init_irq = exynos4_init_irq, 428 .init_irq = exynos4_init_irq,
421 .map_io = smdkv310_map_io, 429 .map_io = smdkv310_map_io,
422 .handle_irq = gic_handle_irq, 430 .handle_irq = gic_handle_irq,
@@ -429,6 +437,7 @@ MACHINE_END
429MACHINE_START(SMDKC210, "SMDKC210") 437MACHINE_START(SMDKC210, "SMDKC210")
430 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ 438 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
431 .atag_offset = 0x100, 439 .atag_offset = 0x100,
440 .smp = smp_ops(exynos_smp_ops),
432 .init_irq = exynos4_init_irq, 441 .init_irq = exynos4_init_irq,
433 .map_io = smdkv310_map_io, 442 .map_io = smdkv310_map_io,
434 .handle_irq = gic_handle_irq, 443 .handle_irq = gic_handle_irq,
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
index 8b9ee219efb7..6e7313382088 100644
--- a/arch/arm/mach-exynos/mach-universal_c210.c
+++ b/arch/arm/mach-exynos/mach-universal_c210.c
@@ -1152,6 +1152,7 @@ static void __init universal_machine_init(void)
1152MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210") 1152MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")
1153 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */ 1153 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
1154 .atag_offset = 0x100, 1154 .atag_offset = 0x100,
1155 .smp = smp_ops(exynos_smp_ops),
1155 .init_irq = exynos4_init_irq, 1156 .init_irq = exynos4_init_irq,
1156 .map_io = universal_map_io, 1157 .map_io = universal_map_io,
1157 .handle_irq = gic_handle_irq, 1158 .handle_irq = gic_handle_irq,
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c
index 36c3984aaa47..f93d820ecab5 100644
--- a/arch/arm/mach-exynos/platsmp.c
+++ b/arch/arm/mach-exynos/platsmp.c
@@ -32,19 +32,14 @@
32 32
33#include <plat/cpu.h> 33#include <plat/cpu.h>
34 34
35#include "common.h"
36
35extern void exynos4_secondary_startup(void); 37extern void exynos4_secondary_startup(void);
36 38
37#define CPU1_BOOT_REG (samsung_rev() == EXYNOS4210_REV_1_1 ? \ 39#define CPU1_BOOT_REG (samsung_rev() == EXYNOS4210_REV_1_1 ? \
38 S5P_INFORM5 : S5P_VA_SYSRAM) 40 S5P_INFORM5 : S5P_VA_SYSRAM)
39 41
40/* 42/*
41 * control for which core is the next to come out of the secondary
42 * boot "holding pen"
43 */
44
45volatile int __cpuinitdata pen_release = -1;
46
47/*
48 * Write pen_release in a way that is guaranteed to be visible to all 43 * Write pen_release in a way that is guaranteed to be visible to all
49 * observers, irrespective of whether they're taking part in coherency 44 * observers, irrespective of whether they're taking part in coherency
50 * or not. This is necessary for the hotplug code to work reliably. 45 * or not. This is necessary for the hotplug code to work reliably.
@@ -64,7 +59,7 @@ static void __iomem *scu_base_addr(void)
64 59
65static DEFINE_SPINLOCK(boot_lock); 60static DEFINE_SPINLOCK(boot_lock);
66 61
67void __cpuinit platform_secondary_init(unsigned int cpu) 62static void __cpuinit exynos_secondary_init(unsigned int cpu)
68{ 63{
69 /* 64 /*
70 * if any interrupts are already enabled for the primary 65 * if any interrupts are already enabled for the primary
@@ -86,7 +81,7 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
86 spin_unlock(&boot_lock); 81 spin_unlock(&boot_lock);
87} 82}
88 83
89int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) 84static int __cpuinit exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
90{ 85{
91 unsigned long timeout; 86 unsigned long timeout;
92 87
@@ -139,7 +134,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
139 134
140 __raw_writel(virt_to_phys(exynos4_secondary_startup), 135 __raw_writel(virt_to_phys(exynos4_secondary_startup),
141 CPU1_BOOT_REG); 136 CPU1_BOOT_REG);
142 gic_raise_softirq(cpumask_of(cpu), 1); 137 gic_raise_softirq(cpumask_of(cpu), 0);
143 138
144 if (pen_release == -1) 139 if (pen_release == -1)
145 break; 140 break;
@@ -161,7 +156,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
161 * which may be present or become present in the system. 156 * which may be present or become present in the system.
162 */ 157 */
163 158
164void __init smp_init_cpus(void) 159static void __init exynos_smp_init_cpus(void)
165{ 160{
166 void __iomem *scu_base = scu_base_addr(); 161 void __iomem *scu_base = scu_base_addr();
167 unsigned int i, ncores; 162 unsigned int i, ncores;
@@ -184,7 +179,7 @@ void __init smp_init_cpus(void)
184 set_smp_cross_call(gic_raise_softirq); 179 set_smp_cross_call(gic_raise_softirq);
185} 180}
186 181
187void __init platform_smp_prepare_cpus(unsigned int max_cpus) 182static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)
188{ 183{
189 if (!soc_is_exynos5250()) 184 if (!soc_is_exynos5250())
190 scu_enable(scu_base_addr()); 185 scu_enable(scu_base_addr());
@@ -198,3 +193,13 @@ void __init platform_smp_prepare_cpus(unsigned int max_cpus)
198 __raw_writel(virt_to_phys(exynos4_secondary_startup), 193 __raw_writel(virt_to_phys(exynos4_secondary_startup),
199 CPU1_BOOT_REG); 194 CPU1_BOOT_REG);
200} 195}
196
197struct smp_operations exynos_smp_ops __initdata = {
198 .smp_init_cpus = exynos_smp_init_cpus,
199 .smp_prepare_cpus = exynos_smp_prepare_cpus,
200 .smp_secondary_init = exynos_secondary_init,
201 .smp_boot_secondary = exynos_boot_secondary,
202#ifdef CONFIG_HOTPLUG_CPU
203 .cpu_die = exynos_cpu_die,
204#endif
205};