]> Git Repo - linux.git/commitdiff
Merge tag 'samsung-drivers-2' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene...
authorOlof Johansson <[email protected]>
Sat, 31 May 2014 04:48:39 +0000 (21:48 -0700)
committerOlof Johansson <[email protected]>
Sat, 31 May 2014 04:48:39 +0000 (21:48 -0700)
Merge "Samsung 2nd drivers for 3.16" from Kukjin Kim:

This is including fix exynos cpufreq driver compilation with
ARCH_MULTIPLATFORM. Even though this is a work around, this
is required for support exynos multiplatform for a while and
will be updated in near future.

This is based on tags/samsung-exynos.

* tag 'samsung-drivers-2' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung: (24 commits)
  cpufreq: exynos: Fix driver compilation with ARCH_MULTIPLATFORM
  ARM: EXYNOS: Enable multi-platform build support
  ARM: EXYNOS: Consolidate Kconfig entries
  ARM: EXYNOS: Add support for EXYNOS5410 SoC
  ARM: EXYNOS: Support secondary CPU boot of Exynos3250
  ARM: EXYNOS: Add Exynos3250 SoC ID
  ARM: EXYNOS: Add 5800 SoC support
  ARM: EXYNOS: initial board support for exynos5260 SoC
  clk: exynos5250: Add missing sysmmu clocks for DISP and ISP blocks
  cpufreq: exynos: Fix the compile error
  ARM: S3C24XX: move debug-macro.S into the common space
  ARM: S3C24XX: use generic DEBUG_UART_PHY/_VIRT in debug macro
  ARM: S3C24XX: trim down debug uart handling
  ARM: compressed/head.S: remove s3c24xx special case
  ARM: EXYNOS: Remove unnecessary inclusion of cpu.h
  ARM: EXYNOS: Migrate Exynos specific macros from plat to mach
  ARM: EXYNOS: Remove exynos_subsys registration
  ARM: EXYNOS: Remove duplicate lines in Makefile
  ARM: EXYNOS: use v7_exit_coherency_flush macro for cache disabling
  ARM: dts: Remove g2d_pd node for exynos5420
  ...

Signed-off-by: Olof Johansson <[email protected]>
1  2 
arch/arm/boot/dts/exynos5420.dtsi
arch/arm/mach-exynos/Kconfig
arch/arm/mach-exynos/Makefile
arch/arm/mach-exynos/common.h
arch/arm/mach-exynos/exynos.c
arch/arm/mach-exynos/firmware.c
arch/arm/mach-exynos/hotplug.c
arch/arm/mach-exynos/platsmp.c
arch/arm/mach-exynos/pm.c
drivers/clk/samsung/clk-exynos5250.c

index 3c530722e8dc580708e13975e64751510c36ed15,d433fe4d00f033c0b2b4632a71d55e575f671ab7..638efd5a84569c2d5c2e0b7a32ac2715480921a9
@@@ -58,7 -58,6 +58,7 @@@
                        compatible = "arm,cortex-a15";
                        reg = <0x0>;
                        clock-frequency = <1800000000>;
 +                      cci-control-port = <&cci_control1>;
                };
  
                cpu1: cpu@1 {
@@@ -66,7 -65,6 +66,7 @@@
                        compatible = "arm,cortex-a15";
                        reg = <0x1>;
                        clock-frequency = <1800000000>;
 +                      cci-control-port = <&cci_control1>;
                };
  
                cpu2: cpu@2 {
@@@ -74,7 -72,6 +74,7 @@@
                        compatible = "arm,cortex-a15";
                        reg = <0x2>;
                        clock-frequency = <1800000000>;
 +                      cci-control-port = <&cci_control1>;
                };
  
                cpu3: cpu@3 {
@@@ -82,7 -79,6 +82,7 @@@
                        compatible = "arm,cortex-a15";
                        reg = <0x3>;
                        clock-frequency = <1800000000>;
 +                      cci-control-port = <&cci_control1>;
                };
  
                cpu4: cpu@100 {
@@@ -90,7 -86,6 +90,7 @@@
                        compatible = "arm,cortex-a7";
                        reg = <0x100>;
                        clock-frequency = <1000000000>;
 +                      cci-control-port = <&cci_control0>;
                };
  
                cpu5: cpu@101 {
@@@ -98,7 -93,6 +98,7 @@@
                        compatible = "arm,cortex-a7";
                        reg = <0x101>;
                        clock-frequency = <1000000000>;
 +                      cci-control-port = <&cci_control0>;
                };
  
                cpu6: cpu@102 {
                        compatible = "arm,cortex-a7";
                        reg = <0x102>;
                        clock-frequency = <1000000000>;
 +                      cci-control-port = <&cci_control0>;
                };
  
                cpu7: cpu@103 {
                        compatible = "arm,cortex-a7";
                        reg = <0x103>;
                        clock-frequency = <1000000000>;
 +                      cci-control-port = <&cci_control0>;
 +              };
 +      };
 +
 +      cci@10d20000 {
 +              compatible = "arm,cci-400";
 +              #address-cells = <1>;
 +              #size-cells = <1>;
 +              reg = <0x10d20000 0x1000>;
 +              ranges = <0x0 0x10d20000 0x6000>;
 +
 +              cci_control0: slave-if@4000 {
 +                      compatible = "arm,cci-400-ctrl-if";
 +                      interface-type = "ace";
 +                      reg = <0x4000 0x1000>;
 +              };
 +              cci_control1: slave-if@5000 {
 +                      compatible = "arm,cci-400-ctrl-if";
 +                      interface-type = "ace";
 +                      reg = <0x5000 0x1000>;
 +              };
 +      };
 +
 +      sysram@02020000 {
 +              compatible = "mmio-sram";
 +              reg = <0x02020000 0x54000>;
 +              #address-cells = <1>;
 +              #size-cells = <1>;
 +              ranges = <0 0x02020000 0x54000>;
 +
 +              smp-sysram@0 {
 +                      compatible = "samsung,exynos4210-sysram";
 +                      reg = <0x0 0x1000>;
 +              };
 +
 +              smp-sysram@53000 {
 +                      compatible = "samsung,exynos4210-sysram-ns";
 +                      reg = <0x53000 0x1000>;
                };
        };
  
                clock-names = "pll_ref", "pll_in", "sclk_audio", "sclk_pcm_in";
        };
  
 -      codec@11000000 {
 +      mfc: codec@11000000 {
                compatible = "samsung,mfc-v7";
                reg = <0x11000000 0x10000>;
                interrupts = <0 96 0>;
                status = "disabled";
        };
  
 -      mct@101C0000 {
 +      mct: mct@101C0000 {
                compatible = "samsung,exynos4210-mct";
                reg = <0x101C0000 0x800>;
                interrupt-controller;
                reg = <0x100440C0 0x20>;
        };
  
-       mau_pd: power-domain@100440E0 {
-               compatible = "samsung,exynos4210-pd";
-               reg = <0x100440E0 0x20>;
-       };
-       g2d_pd: power-domain@10044100 {
-               compatible = "samsung,exynos4210-pd";
-               reg = <0x10044100 0x20>;
-       };
        msc_pd: power-domain@10044120 {
                compatible = "samsung,exynos4210-pd";
                reg = <0x10044120 0x20>;
                interrupts = <0 47 0>;
        };
  
 -      rtc@101E0000 {
 +      rtc: rtc@101E0000 {
                clocks = <&clock CLK_RTC>;
                clock-names = "rtc";
                status = "disabled";
                        #dma-cells = <1>;
                        #dma-channels = <8>;
                        #dma-requests = <1>;
+                       /*
+                        * MDMA1 can support both secure and non-secure
+                        * AXI transactions. When this is enabled in the kernel
+                        * for boards that run in secure mode, we are getting
+                        * imprecise external aborts causing the kernel to oops.
+                        */
+                       status = "disabled";
                };
        };
  
                status = "disabled";
        };
  
 -      serial@12C00000 {
 +      uart_0: serial@12C00000 {
                clocks = <&clock CLK_UART0>, <&clock CLK_SCLK_UART0>;
                clock-names = "uart", "clk_uart_baud0";
        };
  
 -      serial@12C10000 {
 +      uart_1: serial@12C10000 {
                clocks = <&clock CLK_UART1>, <&clock CLK_SCLK_UART1>;
                clock-names = "uart", "clk_uart_baud0";
        };
  
 -      serial@12C20000 {
 +      uart_2: serial@12C20000 {
                clocks = <&clock CLK_UART2>, <&clock CLK_SCLK_UART2>;
                clock-names = "uart", "clk_uart_baud0";
        };
  
 -      serial@12C30000 {
 +      uart_3: serial@12C30000 {
                clocks = <&clock CLK_UART3>, <&clock CLK_SCLK_UART3>;
                clock-names = "uart", "clk_uart_baud0";
        };
                #phy-cells = <0>;
        };
  
 -      dp-controller@145B0000 {
 +      dp: dp-controller@145B0000 {
                clocks = <&clock CLK_DP1>;
                clock-names = "dp";
                phys = <&dp_phy>;
                phy-names = "dp";
        };
  
 -      fimd@14400000 {
 +      fimd: fimd@14400000 {
                samsung,power-domain = <&disp_pd>;
                clocks = <&clock CLK_SCLK_FIMD1>, <&clock CLK_FIMD1>;
                clock-names = "sclk_fimd", "fimd";
                status = "disabled";
        };
  
 -      hdmi@14530000 {
 +      hdmi: hdmi@14530000 {
                compatible = "samsung,exynos4212-hdmi";
                reg = <0x14530000 0x70000>;
                interrupts = <0 95 0>;
                status = "disabled";
        };
  
 -      mixer@14450000 {
 +      mixer: mixer@14450000 {
                compatible = "samsung,exynos5420-mixer";
                reg = <0x14450000 0x10000>;
                interrupts = <0 94 0>;
                clock-names = "tmu_apbif", "tmu_triminfo_apbif";
        };
  
 -        watchdog@101D0000 {
 +        watchdog: watchdog@101D0000 {
                compatible = "samsung,exynos5420-wdt";
                reg = <0x101D0000 0x100>;
                interrupts = <0 42 0>;
                samsung,syscon-phandle = <&pmu_system_controller>;
          };
  
 -      sss@10830000 {
 +      sss: sss@10830000 {
                compatible = "samsung,exynos4210-secss";
                reg = <0x10830000 0x10000>;
                interrupts = <0 112 0>;
                clocks = <&clock 471>;
                clock-names = "secss";
-               samsung,power-domain = <&g2d_pd>;
        };
  };
index 1602abce6ec043ae40b5e97bd3d296901503750c,0031a57aad94b30040012445049a69e5b1ccc36d..d58995c9a95a8addd71915b3d1b29a0720692476
  
  # Configuration options for the EXYNOS4
  
+ config ARCH_EXYNOS
+       bool "Samsung EXYNOS" if ARCH_MULTI_V7
+       select ARCH_HAS_BANDGAP
+       select ARCH_HAS_CPUFREQ
+       select ARCH_HAS_HOLES_MEMORYMODEL
+       select ARCH_REQUIRE_GPIOLIB
+       select ARM_AMBA
+       select ARM_GIC
+       select COMMON_CLK_SAMSUNG
+       select HAVE_ARM_SCU if SMP
+       select HAVE_S3C2410_I2C if I2C
+       select HAVE_S3C2410_WATCHDOG if WATCHDOG
+       select HAVE_S3C_RTC if RTC_CLASS
+       select PINCTRL
+       select PINCTRL_EXYNOS
+       select PM_GENERIC_DOMAINS if PM_RUNTIME
+       select S5P_DEV_MFC
+       select SRAM
+       help
+         Support for SAMSUNG EXYNOS SoCs (EXYNOS4/5)
  if ARCH_EXYNOS
  
  menu "SAMSUNG EXYNOS SoCs Support"
  
+ config ARCH_EXYNOS3
+       bool "SAMSUNG EXYNOS3"
+       select ARM_CPU_SUSPEND if PM
+       help
+         Samsung EXYNOS3 (Crotex-A7) SoC based systems
  config ARCH_EXYNOS4
        bool "SAMSUNG EXYNOS4"
        default y
-       select ARM_AMBA
-       select CLKSRC_OF
+       select ARM_CPU_SUSPEND if PM_SLEEP
        select CLKSRC_SAMSUNG_PWM if CPU_EXYNOS4210
        select CPU_EXYNOS4210
        select GIC_NON_BANKED
        select KEYBOARD_SAMSUNG if INPUT_KEYBOARD
-       select HAVE_ARM_SCU if SMP
-       select HAVE_SMP
        select MIGHT_HAVE_CACHE_L2X0
-       select PINCTRL
-       select PM_GENERIC_DOMAINS if PM_RUNTIME
-       select S5P_DEV_MFC
        help
-         Samsung EXYNOS4 SoCs based systems
+         Samsung EXYNOS4 (Cortex-A9) SoC based systems
  
  config ARCH_EXYNOS5
        bool "SAMSUNG EXYNOS5"
-       select ARM_AMBA
-       select CLKSRC_OF
-       select HAVE_ARM_SCU if SMP
-       select HAVE_SMP
-       select PINCTRL
+       default y
        help
-         Samsung EXYNOS5 (Cortex-A15) SoC based systems
+         Samsung EXYNOS5 (Cortex-A15/A7) SoC based systems
  
  comment "EXYNOS SoCs"
  
+ config SOC_EXYNOS3250
+       bool "SAMSUNG EXYNOS3250"
+       default y
+       depends on ARCH_EXYNOS3
  config CPU_EXYNOS4210
        bool "SAMSUNG EXYNOS4210"
        default y
        depends on ARCH_EXYNOS4
-       select ARCH_HAS_BANDGAP
-       select ARM_CPU_SUSPEND if PM_SLEEP
-       select PINCTRL_EXYNOS
-       select SAMSUNG_DMADEV
-       help
-         Enable EXYNOS4210 CPU support
  
  config SOC_EXYNOS4212
        bool "SAMSUNG EXYNOS4212"
        default y
        depends on ARCH_EXYNOS4
-       select ARCH_HAS_BANDGAP
-       select PINCTRL_EXYNOS
-       select SAMSUNG_DMADEV
-       help
-         Enable EXYNOS4212 SoC support
  
  config SOC_EXYNOS4412
        bool "SAMSUNG EXYNOS4412"
        default y
        depends on ARCH_EXYNOS4
-       select ARCH_HAS_BANDGAP
-       select PINCTRL_EXYNOS
-       select SAMSUNG_DMADEV
-       help
-         Enable EXYNOS4412 SoC support
  
  config SOC_EXYNOS5250
        bool "SAMSUNG EXYNOS5250"
        default y
        depends on ARCH_EXYNOS5
-       select ARCH_HAS_BANDGAP
-       select PINCTRL_EXYNOS
-       select PM_GENERIC_DOMAINS if PM_RUNTIME
-       select S5P_DEV_MFC
-       select SAMSUNG_DMADEV
-       help
-         Enable EXYNOS5250 SoC support
+ config SOC_EXYNOS5260
+       bool "SAMSUNG EXYNOS5260"
+       default y
+       depends on ARCH_EXYNOS5
+ config SOC_EXYNOS5410
+       bool "SAMSUNG EXYNOS5410"
+       default y
+       depends on ARCH_EXYNOS5
  
  config SOC_EXYNOS5420
        bool "SAMSUNG EXYNOS5420"
        default y
        depends on ARCH_EXYNOS5
-       select PM_GENERIC_DOMAINS if PM_RUNTIME
-       help
-         Enable EXYNOS5420 SoC support
  
  config SOC_EXYNOS5440
        bool "SAMSUNG EXYNOS5440"
        default y
        depends on ARCH_EXYNOS5
        select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
-       select ARCH_HAS_BANDGAP
        select ARCH_HAS_OPP
        select HAVE_ARM_ARCH_TIMER
        select AUTO_ZRELADDR
        help
          Enable EXYNOS5440 SoC support
  
+ config SOC_EXYNOS5800
+       bool "SAMSUNG EXYNOS5800"
+       default y
+       depends on SOC_EXYNOS5420
  endmenu
  
 +config EXYNOS5420_MCPM
 +      bool "Exynos5420 Multi-Cluster PM support"
 +      depends on MCPM && SOC_EXYNOS5420
 +      select ARM_CCI
 +      help
 +        This is needed to provide CPU and cluster power management
 +        on Exynos5420 implementing big.LITTLE.
 +
  endif
index 3705048f744a834aa6d255e48d374747c0a2e10d,24a8efe3d4bd3145b29fb0c37d1be7f5adea4ba8..6f3608602bfa0286dbdf3ada5b8cad07179811aa
@@@ -5,6 -5,8 +5,8 @@@
  #
  # Licensed under GPLv2
  
+ ccflags-$(CONFIG_ARCH_MULTIPLATFORM) += -I$(srctree)/$(src)/include -I$(srctree)/arch/arm/plat-samsung/include
  obj-y                         :=
  obj-m                         :=
  obj-n                         :=
@@@ -12,21 -14,15 +14,16 @@@ obj-                               :
  
  # Core
  
- obj-$(CONFIG_ARCH_EXYNOS)     += exynos.o
+ obj-$(CONFIG_ARCH_EXYNOS)     += exynos.o pmu.o exynos-smc.o firmware.o
  
  obj-$(CONFIG_PM_SLEEP)                += pm.o sleep.o
  obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
 -obj-$(CONFIG_CPU_IDLE)                += cpuidle.o
  
- obj-$(CONFIG_ARCH_EXYNOS)     += pmu.o
  obj-$(CONFIG_SMP)             += platsmp.o headsmp.o
  
  obj-$(CONFIG_HOTPLUG_CPU)     += hotplug.o
  
- obj-$(CONFIG_ARCH_EXYNOS)     += exynos-smc.o
- obj-$(CONFIG_ARCH_EXYNOS)     += firmware.o
  plus_sec := $(call as-instr,.arch_extension sec,+sec)
  AFLAGS_exynos-smc.o           :=-Wa,-march=armv7-a$(plus_sec)
 +
 +obj-$(CONFIG_EXYNOS5420_MCPM) += mcpm-exynos.o
index 5848d3cc29e9d92cdb07bdf34f0a6eb7d4734027,099b22f9fd9ffa1d4e98a15cb5df48bcb97550c0..80b90e346ca06353287cc53a6cb8f76f0eb0567c
  #include <linux/reboot.h>
  #include <linux/of.h>
  
+ #define EXYNOS3250_SOC_ID     0xE3472000
+ #define EXYNOS3_SOC_MASK      0xFFFFF000
+ #define EXYNOS4210_CPU_ID     0x43210000
+ #define EXYNOS4212_CPU_ID     0x43220000
+ #define EXYNOS4412_CPU_ID     0xE4412200
+ #define EXYNOS4_CPU_MASK      0xFFFE0000
+ #define EXYNOS5250_SOC_ID     0x43520000
+ #define EXYNOS5410_SOC_ID     0xE5410000
+ #define EXYNOS5420_SOC_ID     0xE5420000
+ #define EXYNOS5440_SOC_ID     0xE5440000
+ #define EXYNOS5800_SOC_ID     0xE5422000
+ #define EXYNOS5_SOC_MASK      0xFFFFF000
+ extern unsigned long samsung_cpu_id;
+ #define IS_SAMSUNG_CPU(name, id, mask)                \
+ static inline int is_samsung_##name(void)     \
+ {                                             \
+       return ((samsung_cpu_id & mask) == (id & mask));        \
+ }
+ IS_SAMSUNG_CPU(exynos3250, EXYNOS3250_SOC_ID, EXYNOS3_SOC_MASK)
+ IS_SAMSUNG_CPU(exynos4210, EXYNOS4210_CPU_ID, EXYNOS4_CPU_MASK)
+ IS_SAMSUNG_CPU(exynos4212, EXYNOS4212_CPU_ID, EXYNOS4_CPU_MASK)
+ IS_SAMSUNG_CPU(exynos4412, EXYNOS4412_CPU_ID, EXYNOS4_CPU_MASK)
+ IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK)
+ IS_SAMSUNG_CPU(exynos5410, EXYNOS5410_SOC_ID, EXYNOS5_SOC_MASK)
+ IS_SAMSUNG_CPU(exynos5420, EXYNOS5420_SOC_ID, EXYNOS5_SOC_MASK)
+ IS_SAMSUNG_CPU(exynos5440, EXYNOS5440_SOC_ID, EXYNOS5_SOC_MASK)
+ IS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS5_SOC_MASK)
+ #if defined(CONFIG_SOC_EXYNOS3250)
+ # define soc_is_exynos3250()  is_samsung_exynos3250()
+ #else
+ # define soc_is_exynos3250()  0
+ #endif
+ #if defined(CONFIG_CPU_EXYNOS4210)
+ # define soc_is_exynos4210()  is_samsung_exynos4210()
+ #else
+ # define soc_is_exynos4210()  0
+ #endif
+ #if defined(CONFIG_SOC_EXYNOS4212)
+ # define soc_is_exynos4212()  is_samsung_exynos4212()
+ #else
+ # define soc_is_exynos4212()  0
+ #endif
+ #if defined(CONFIG_SOC_EXYNOS4412)
+ # define soc_is_exynos4412()  is_samsung_exynos4412()
+ #else
+ # define soc_is_exynos4412()  0
+ #endif
+ #define EXYNOS4210_REV_0      (0x0)
+ #define EXYNOS4210_REV_1_0    (0x10)
+ #define EXYNOS4210_REV_1_1    (0x11)
+ #if defined(CONFIG_SOC_EXYNOS5250)
+ # define soc_is_exynos5250()  is_samsung_exynos5250()
+ #else
+ # define soc_is_exynos5250()  0
+ #endif
+ #if defined(CONFIG_SOC_EXYNOS5410)
+ # define soc_is_exynos5410()  is_samsung_exynos5410()
+ #else
+ # define soc_is_exynos5410()  0
+ #endif
+ #if defined(CONFIG_SOC_EXYNOS5420)
+ # define soc_is_exynos5420()  is_samsung_exynos5420()
+ #else
+ # define soc_is_exynos5420()  0
+ #endif
+ #if defined(CONFIG_SOC_EXYNOS5440)
+ # define soc_is_exynos5440()  is_samsung_exynos5440()
+ #else
+ # define soc_is_exynos5440()  0
+ #endif
+ #if defined(CONFIG_SOC_EXYNOS5800)
+ # define soc_is_exynos5800()  is_samsung_exynos5800()
+ #else
+ # define soc_is_exynos5800()  0
+ #endif
+ #define soc_is_exynos4() (soc_is_exynos4210() || soc_is_exynos4212() || \
+                         soc_is_exynos4412())
+ #define soc_is_exynos5() (soc_is_exynos5250() || soc_is_exynos5410() || \
+                         soc_is_exynos5420() || soc_is_exynos5800())
  void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1);
  
  struct map_desc;
 +extern void __iomem *sysram_ns_base_addr;
 +extern void __iomem *sysram_base_addr;
  void exynos_init_io(void);
  void exynos_restart(enum reboot_mode mode, const char *cmd);
  void exynos_cpuidle_init(void);
@@@ -64,12 -158,8 +160,15 @@@ struct exynos_pmu_conf 
  };
  
  extern void exynos_sys_powerdown_conf(enum sys_powerdown mode);
 +extern void exynos_cpu_power_down(int cpu);
 +extern void exynos_cpu_power_up(int cpu);
 +extern int  exynos_cpu_power_state(int cpu);
 +extern void exynos_cluster_power_down(int cluster);
 +extern void exynos_cluster_power_up(int cluster);
 +extern int  exynos_cluster_power_state(int cluster);
 +extern void exynos_enter_aftr(void);
  
+ extern void s5p_init_cpu(void __iomem *cpuid_addr);
+ extern unsigned int samsung_rev(void);
  #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */
index 7d9d8762b56e83aa1d424527371db467520b1d2b,0bcf11c650ad2e007f25ba5503c90ab36e1cbf5a..8cf0c99c1d2b9d52afb679056888f1dd25f04aef
@@@ -26,8 -26,6 +26,6 @@@
  #include <asm/mach/map.h>
  #include <asm/memory.h>
  
- #include <plat/cpu.h>
  #include "common.h"
  #include "mfc.h"
  #include "regs-pmu.h"
@@@ -114,6 -112,51 +112,6 @@@ static struct map_desc exynos4_iodesc[
        },
  };
  
 -static struct map_desc exynos4_iodesc0[] __initdata = {
 -      {
 -              .virtual        = (unsigned long)S5P_VA_SYSRAM,
 -              .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSRAM0),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
 -      },
 -};
 -
 -static struct map_desc exynos4_iodesc1[] __initdata = {
 -      {
 -              .virtual        = (unsigned long)S5P_VA_SYSRAM,
 -              .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSRAM1),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
 -      },
 -};
 -
 -static struct map_desc exynos4210_iodesc[] __initdata = {
 -      {
 -              .virtual        = (unsigned long)S5P_VA_SYSRAM_NS,
 -              .pfn            = __phys_to_pfn(EXYNOS4210_PA_SYSRAM_NS),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
 -      },
 -};
 -
 -static struct map_desc exynos4x12_iodesc[] __initdata = {
 -      {
 -              .virtual        = (unsigned long)S5P_VA_SYSRAM_NS,
 -              .pfn            = __phys_to_pfn(EXYNOS4x12_PA_SYSRAM_NS),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
 -      },
 -};
 -
 -static struct map_desc exynos5250_iodesc[] __initdata = {
 -      {
 -              .virtual        = (unsigned long)S5P_VA_SYSRAM_NS,
 -              .pfn            = __phys_to_pfn(EXYNOS5250_PA_SYSRAM_NS),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
 -      },
 -};
 -
  static struct map_desc exynos5_iodesc[] __initdata = {
        {
                .virtual        = (unsigned long)S3C_VA_SYS,
                .pfn            = __phys_to_pfn(EXYNOS5_PA_SROMC),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
 -      }, {
 -              .virtual        = (unsigned long)S5P_VA_SYSRAM,
 -              .pfn            = __phys_to_pfn(EXYNOS5_PA_SYSRAM),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
        }, {
                .virtual        = (unsigned long)S5P_VA_CMU,
                .pfn            = __phys_to_pfn(EXYNOS5_PA_CMU),
@@@ -171,16 -219,12 +169,16 @@@ void exynos_restart(enum reboot_mode mo
  }
  
  static struct platform_device exynos_cpuidle = {
 -      .name           = "exynos_cpuidle",
 -      .id             = -1,
 +      .name              = "exynos_cpuidle",
 +      .dev.platform_data = exynos_enter_aftr,
 +      .id                = -1,
  };
  
  void __init exynos_cpuidle_init(void)
  {
 +      if (soc_is_exynos5440())
 +              return;
 +
        platform_device_register(&exynos_cpuidle);
  }
  
@@@ -234,6 -278,20 +232,6 @@@ static void __init exynos_map_io(void
  
        if (soc_is_exynos5())
                iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
 -
 -      if (soc_is_exynos4210()) {
 -              if (samsung_rev() == EXYNOS4210_REV_0)
 -                      iotable_init(exynos4_iodesc0,
 -                                              ARRAY_SIZE(exynos4_iodesc0));
 -              else
 -                      iotable_init(exynos4_iodesc1,
 -                                              ARRAY_SIZE(exynos4_iodesc1));
 -              iotable_init(exynos4210_iodesc, ARRAY_SIZE(exynos4210_iodesc));
 -      }
 -      if (soc_is_exynos4212() || soc_is_exynos4412())
 -              iotable_init(exynos4x12_iodesc, ARRAY_SIZE(exynos4x12_iodesc));
 -      if (soc_is_exynos5250())
 -              iotable_init(exynos5250_iodesc, ARRAY_SIZE(exynos5250_iodesc));
  }
  
  void __init exynos_init_io(void)
        exynos_map_io();
  }
  
- struct bus_type exynos_subsys = {
-       .name           = "exynos-core",
-       .dev_name       = "exynos-core",
- };
- static int __init exynos_core_init(void)
- {
-       return subsys_system_register(&exynos_subsys, NULL);
- }
- core_initcall(exynos_core_init);
  static int __init exynos4_l2x0_cache_init(void)
  {
        int ret;
@@@ -310,12 -357,15 +297,15 @@@ static void __init exynos_dt_machine_in
  }
  
  static char const *exynos_dt_compat[] __initconst = {
+       "samsung,exynos3",
+       "samsung,exynos3250",
        "samsung,exynos4",
        "samsung,exynos4210",
        "samsung,exynos4212",
        "samsung,exynos4412",
        "samsung,exynos5",
        "samsung,exynos5250",
+       "samsung,exynos5260",
        "samsung,exynos5420",
        "samsung,exynos5440",
        NULL
index 483dfcd690650c54674584169b99ef00967964d0,1120c28394ddb88ea35c13d053e1b8f36c56a87b..eb91d2350f8c97883b0d167c5abf719deeca44a1
@@@ -29,18 -29,31 +29,36 @@@ static int exynos_do_idle(void
  
  static int exynos_cpu_boot(int cpu)
  {
+       /*
+        * Exynos3250 doesn't need to send smc command for secondary CPU boot
+        * because Exynos3250 removes WFE in secure mode.
+        */
+       if (soc_is_exynos3250())
+               return 0;
+       /*
+        * The second parameter of SMC_CMD_CPU1BOOT command means CPU id.
+        * But, Exynos4212 has only one secondary CPU so second parameter
+        * isn't used for informing secure firmware about CPU id.
+        */
+       if (soc_is_exynos4212())
+               cpu = 0;
        exynos_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0);
        return 0;
  }
  
  static int exynos_set_cpu_boot_addr(int cpu, unsigned long boot_addr)
  {
 -      void __iomem *boot_reg = S5P_VA_SYSRAM_NS + 0x1c;
 +      void __iomem *boot_reg;
 +
 +      if (!sysram_ns_base_addr)
 +              return -ENODEV;
 +
-       boot_reg = sysram_ns_base_addr + 0x1c + 4*cpu;
++      boot_reg = sysram_ns_base_addr + 0x1c;
+       if (!soc_is_exynos4212() && !soc_is_exynos3250())
+               boot_reg += 4*cpu;
  
        __raw_writel(boot_addr, boot_reg);
        return 0;
index 609c99ca59c44f7a5814a1696ceebe5982fa5837,3cab3f5066892091e7698099ef7890f44525d07e..69fa483973943a2ad6373e2c6f1c2e7063e1c802
  #include <asm/cp15.h>
  #include <asm/smp_plat.h>
  
- #include <plat/cpu.h>
  #include "common.h"
  #include "regs-pmu.h"
  
- static inline void cpu_enter_lowpower_a9(void)
- {
-       unsigned int v;
-       asm volatile(
-       "       mcr     p15, 0, %1, c7, c5, 0\n"
-       "       mcr     p15, 0, %1, c7, c10, 4\n"
-       /*
-        * Turn off coherency
-        */
-       "       mrc     p15, 0, %0, c1, c0, 1\n"
-       "       bic     %0, %0, %3\n"
-       "       mcr     p15, 0, %0, c1, c0, 1\n"
-       "       mrc     p15, 0, %0, c1, c0, 0\n"
-       "       bic     %0, %0, %2\n"
-       "       mcr     p15, 0, %0, c1, c0, 0\n"
-         : "=&r" (v)
-         : "r" (0), "Ir" (CR_C), "Ir" (0x40)
-         : "cc");
- }
- static inline void cpu_enter_lowpower_a15(void)
- {
-       unsigned int v;
-       asm volatile(
-       "       mrc     p15, 0, %0, c1, c0, 0\n"
-       "       bic     %0, %0, %1\n"
-       "       mcr     p15, 0, %0, c1, c0, 0\n"
-         : "=&r" (v)
-         : "Ir" (CR_C)
-         : "cc");
-       flush_cache_louis();
-       asm volatile(
-       /*
-       * Turn off coherency
-       */
-       "       mrc     p15, 0, %0, c1, c0, 1\n"
-       "       bic     %0, %0, %1\n"
-       "       mcr     p15, 0, %0, c1, c0, 1\n"
-       : "=&r" (v)
-       : "Ir" (0x40)
-       : "cc");
-       isb();
-       dsb();
- }
  static inline void cpu_leave_lowpower(void)
  {
        unsigned int v;
@@@ -96,7 -44,7 +44,7 @@@ static inline void platform_do_lowpower
  
                /* make cpu1 to be turned off at next WFI command */
                if (cpu == 1)
 -                      __raw_writel(0, S5P_ARM_CORE1_CONFIGURATION);
 +                      exynos_cpu_power_down(cpu);
  
                /*
                 * here's the WFI
  void __ref exynos_cpu_die(unsigned int cpu)
  {
        int spurious = 0;
-       int primary_part = 0;
  
-       /*
-        * we're ready for shutdown now, so do it.
-        * Exynos4 is A9 based while Exynos5 is A15; check the CPU part
-        * number by reading the Main ID register and then perform the
-        * appropriate sequence for entering low power.
-        */
-       asm("mrc p15, 0, %0, c0, c0, 0" : "=r"(primary_part) : : "cc");
-       if ((primary_part & 0xfff0) == 0xc0f0)
-               cpu_enter_lowpower_a15();
-       else
-               cpu_enter_lowpower_a9();
+       v7_exit_coherency_flush(louis);
  
        platform_do_lowpower(cpu, &spurious);
  
index 9e5e230575ddaeaac320c100049a66a17394bc4e,f5ec7e805298ff130a5ce6784396b439ae587d2f..ec02422e84993d4bb8f813e5976ffd9fe3b3bdeb
  #include <linux/jiffies.h>
  #include <linux/smp.h>
  #include <linux/io.h>
 +#include <linux/of_address.h>
  
  #include <asm/cacheflush.h>
  #include <asm/smp_plat.h>
  #include <asm/smp_scu.h>
  #include <asm/firmware.h>
  
- #include <plat/cpu.h>
  #include "common.h"
  #include "regs-pmu.h"
  
  extern void exynos4_secondary_startup(void);
  
 +void __iomem *sysram_base_addr;
 +void __iomem *sysram_ns_base_addr;
 +
 +static void __init exynos_smp_prepare_sysram(void)
 +{
 +      struct device_node *node;
 +
 +      for_each_compatible_node(node, NULL, "samsung,exynos4210-sysram") {
 +              if (!of_device_is_available(node))
 +                      continue;
 +              sysram_base_addr = of_iomap(node, 0);
 +              break;
 +      }
 +
 +      for_each_compatible_node(node, NULL, "samsung,exynos4210-sysram-ns") {
 +              if (!of_device_is_available(node))
 +                      continue;
 +              sysram_ns_base_addr = of_iomap(node, 0);
 +              break;
 +      }
 +}
 +
  static inline void __iomem *cpu_boot_reg_base(void)
  {
        if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_1_1)
                return S5P_INFORM5;
 -      return S5P_VA_SYSRAM;
 +      return sysram_base_addr;
  }
  
  static inline void __iomem *cpu_boot_reg(int cpu)
        void __iomem *boot_reg;
  
        boot_reg = cpu_boot_reg_base();
 +      if (!boot_reg)
 +              return ERR_PTR(-ENODEV);
        if (soc_is_exynos4412())
                boot_reg += 4*cpu;
-       else if (soc_is_exynos5420())
+       else if (soc_is_exynos5420() || soc_is_exynos5800())
                boot_reg += 4;
        return boot_reg;
  }
@@@ -115,7 -88,6 +113,7 @@@ static int exynos_boot_secondary(unsign
  {
        unsigned long timeout;
        unsigned long phys_cpu = cpu_logical_map(cpu);
 +      int ret = -ENOSYS;
  
        /*
         * Set synchronisation state between this boot processor
         */
        write_pen_release(phys_cpu);
  
 -      if (!(__raw_readl(S5P_ARM_CORE1_STATUS) & S5P_CORE_LOCAL_PWR_EN)) {
 -              __raw_writel(S5P_CORE_LOCAL_PWR_EN,
 -                           S5P_ARM_CORE1_CONFIGURATION);
 -
 +      if (!exynos_cpu_power_state(cpu)) {
 +              exynos_cpu_power_up(cpu);
                timeout = 10;
  
                /* wait max 10 ms until cpu1 is on */
 -              while ((__raw_readl(S5P_ARM_CORE1_STATUS)
 -                      & S5P_CORE_LOCAL_PWR_EN) != S5P_CORE_LOCAL_PWR_EN) {
 +              while (exynos_cpu_power_state(cpu) != S5P_CORE_LOCAL_PWR_EN) {
                        if (timeout-- == 0)
                                break;
  
                 * Try to set boot address using firmware first
                 * and fall back to boot register if it fails.
                 */
 -              if (call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr))
 +              ret = call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr);
 +              if (ret && ret != -ENOSYS)
 +                      goto fail;
 +              if (ret == -ENOSYS) {
 +                      void __iomem *boot_reg = cpu_boot_reg(phys_cpu);
 +
 +                      if (IS_ERR(boot_reg)) {
 +                              ret = PTR_ERR(boot_reg);
 +                              goto fail;
 +                      }
                        __raw_writel(boot_addr, cpu_boot_reg(phys_cpu));
 +              }
  
                call_firmware_op(cpu_boot, phys_cpu);
  
         * now the secondary core is starting up let it run its
         * calibrations, then wait for it to finish
         */
 +fail:
        spin_unlock(&boot_lock);
  
 -      return pen_release != -1 ? -ENOSYS : 0;
 +      return pen_release != -1 ? ret : 0;
  }
  
  /*
@@@ -239,8 -203,6 +237,8 @@@ static void __init exynos_smp_prepare_c
        if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9)
                scu_enable(scu_base_addr());
  
 +      exynos_smp_prepare_sysram();
 +
        /*
         * Write the address of secondary startup into the
         * system-wide flags register. The boot monitor waits
        for (i = 1; i < max_cpus; ++i) {
                unsigned long phys_cpu;
                unsigned long boot_addr;
 +              int ret;
  
                phys_cpu = cpu_logical_map(i);
                boot_addr = virt_to_phys(exynos4_secondary_startup);
  
 -              if (call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr))
 +              ret = call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr);
 +              if (ret && ret != -ENOSYS)
 +                      break;
 +              if (ret == -ENOSYS) {
 +                      void __iomem *boot_reg = cpu_boot_reg(phys_cpu);
 +
 +                      if (IS_ERR(boot_reg))
 +                              break;
                        __raw_writel(boot_addr, cpu_boot_reg(phys_cpu));
 +              }
        }
  }
  
index 0d1a46e7b021d3b2d360259ecf8aa7a6c49116ad,ca672e24b5cd176b34cbb3f6f93d0d1eb6f751bb..87c0d34c7fbab3625386667cfe6ede06ab9fb0c8
@@@ -16,7 -16,6 +16,7 @@@
  #include <linux/init.h>
  #include <linux/suspend.h>
  #include <linux/syscore_ops.h>
 +#include <linux/cpu_pm.h>
  #include <linux/io.h>
  #include <linux/irqchip/arm-gic.h>
  #include <linux/err.h>
@@@ -27,7 -26,6 +27,6 @@@
  #include <asm/smp_scu.h>
  #include <asm/suspend.h>
  
- #include <plat/cpu.h>
  #include <plat/pm-common.h>
  #include <plat/pll.h>
  #include <plat/regs-srom.h>
@@@ -101,141 -99,9 +100,141 @@@ static int exynos_irq_set_wake(struct i
        return -ENOENT;
  }
  
 +/**
 + * exynos_core_power_down : power down the specified cpu
 + * @cpu : the cpu to power down
 + *
 + * Power down the specified cpu. The sequence must be finished by a
 + * call to cpu_do_idle()
 + *
 + */
 +void exynos_cpu_power_down(int cpu)
 +{
 +      __raw_writel(0, EXYNOS_ARM_CORE_CONFIGURATION(cpu));
 +}
 +
 +/**
 + * exynos_cpu_power_up : power up the specified cpu
 + * @cpu : the cpu to power up
 + *
 + * Power up the specified cpu
 + */
 +void exynos_cpu_power_up(int cpu)
 +{
 +      __raw_writel(S5P_CORE_LOCAL_PWR_EN,
 +                   EXYNOS_ARM_CORE_CONFIGURATION(cpu));
 +}
 +
 +/**
 + * exynos_cpu_power_state : returns the power state of the cpu
 + * @cpu : the cpu to retrieve the power state from
 + *
 + */
 +int exynos_cpu_power_state(int cpu)
 +{
 +      return (__raw_readl(EXYNOS_ARM_CORE_STATUS(cpu)) &
 +                      S5P_CORE_LOCAL_PWR_EN);
 +}
 +
 +/**
 + * exynos_cluster_power_down : power down the specified cluster
 + * @cluster : the cluster to power down
 + */
 +void exynos_cluster_power_down(int cluster)
 +{
 +      __raw_writel(0, EXYNOS_COMMON_CONFIGURATION(cluster));
 +}
 +
 +/**
 + * exynos_cluster_power_up : power up the specified cluster
 + * @cluster : the cluster to power up
 + */
 +void exynos_cluster_power_up(int cluster)
 +{
 +      __raw_writel(S5P_CORE_LOCAL_PWR_EN,
 +                   EXYNOS_COMMON_CONFIGURATION(cluster));
 +}
 +
 +/**
 + * exynos_cluster_power_state : returns the power state of the cluster
 + * @cluster : the cluster to retrieve the power state from
 + *
 + */
 +int exynos_cluster_power_state(int cluster)
 +{
 +      return (__raw_readl(EXYNOS_COMMON_STATUS(cluster)) &
 +                      S5P_CORE_LOCAL_PWR_EN);
 +}
 +
 +#define EXYNOS_BOOT_VECTOR_ADDR       (samsung_rev() == EXYNOS4210_REV_1_1 ? \
 +                      S5P_INFORM7 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \
 +                      (sysram_base_addr + 0x24) : S5P_INFORM0))
 +#define EXYNOS_BOOT_VECTOR_FLAG       (samsung_rev() == EXYNOS4210_REV_1_1 ? \
 +                      S5P_INFORM6 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \
 +                      (sysram_base_addr + 0x20) : S5P_INFORM1))
 +
 +#define S5P_CHECK_AFTR  0xFCBA0D10
 +#define S5P_CHECK_SLEEP 0x00000BAD
 +
 +/* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */
 +static void exynos_set_wakeupmask(long mask)
 +{
 +      __raw_writel(mask, S5P_WAKEUP_MASK);
 +}
 +
 +static void exynos_cpu_set_boot_vector(long flags)
 +{
 +      __raw_writel(virt_to_phys(exynos_cpu_resume), EXYNOS_BOOT_VECTOR_ADDR);
 +      __raw_writel(flags, EXYNOS_BOOT_VECTOR_FLAG);
 +}
 +
 +void exynos_enter_aftr(void)
 +{
 +      exynos_set_wakeupmask(0x0000ff3e);
 +      exynos_cpu_set_boot_vector(S5P_CHECK_AFTR);
 +      /* Set value of power down register for aftr mode */
 +      exynos_sys_powerdown_conf(SYS_AFTR);
 +}
 +
  /* For Cortex-A9 Diagnostic and Power control register */
  static unsigned int save_arm_register[2];
  
 +static void exynos_cpu_save_register(void)
 +{
 +      unsigned long tmp;
 +
 +      /* Save Power control register */
 +      asm ("mrc p15, 0, %0, c15, c0, 0"
 +           : "=r" (tmp) : : "cc");
 +
 +      save_arm_register[0] = tmp;
 +
 +      /* Save Diagnostic register */
 +      asm ("mrc p15, 0, %0, c15, c0, 1"
 +           : "=r" (tmp) : : "cc");
 +
 +      save_arm_register[1] = tmp;
 +}
 +
 +static void exynos_cpu_restore_register(void)
 +{
 +      unsigned long tmp;
 +
 +      /* Restore Power control register */
 +      tmp = save_arm_register[0];
 +
 +      asm volatile ("mcr p15, 0, %0, c15, c0, 0"
 +                    : : "r" (tmp)
 +                    : "cc");
 +
 +      /* Restore Diagnostic register */
 +      tmp = save_arm_register[1];
 +
 +      asm volatile ("mcr p15, 0, %0, c15, c0, 1"
 +                    : : "r" (tmp)
 +                    : "cc");
 +}
 +
  static int exynos_cpu_suspend(unsigned long arg)
  {
  #ifdef CONFIG_CACHE_L2X0
@@@ -280,34 -146,37 +279,34 @@@ static void exynos_pm_prepare(void
        __raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0);
  }
  
 -static int exynos_pm_suspend(void)
 +static void exynos_pm_central_suspend(void)
  {
        unsigned long tmp;
  
        /* Setting Central Sequence Register for power down mode */
 -
        tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
        tmp &= ~S5P_CENTRAL_LOWPWR_CFG;
        __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
 +}
 +
 +static int exynos_pm_suspend(void)
 +{
 +      unsigned long tmp;
 +
 +      exynos_pm_central_suspend();
  
        /* Setting SEQ_OPTION register */
  
        tmp = (S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0);
        __raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION);
  
 -      if (!soc_is_exynos5250()) {
 -              /* Save Power control register */
 -              asm ("mrc p15, 0, %0, c15, c0, 0"
 -                   : "=r" (tmp) : : "cc");
 -              save_arm_register[0] = tmp;
 -
 -              /* Save Diagnostic register */
 -              asm ("mrc p15, 0, %0, c15, c0, 1"
 -                   : "=r" (tmp) : : "cc");
 -              save_arm_register[1] = tmp;
 -      }
 +      if (!soc_is_exynos5250())
 +              exynos_cpu_save_register();
  
        return 0;
  }
  
 -static void exynos_pm_resume(void)
 +static int exynos_pm_central_resume(void)
  {
        unsigned long tmp;
  
                /* clear the wakeup state register */
                __raw_writel(0x0, S5P_WAKEUP_STAT);
                /* No need to perform below restore code */
 -              goto early_wakeup;
 -      }
 -      if (!soc_is_exynos5250()) {
 -              /* Restore Power control register */
 -              tmp = save_arm_register[0];
 -              asm volatile ("mcr p15, 0, %0, c15, c0, 0"
 -                            : : "r" (tmp)
 -                            : "cc");
 -
 -              /* Restore Diagnostic register */
 -              tmp = save_arm_register[1];
 -              asm volatile ("mcr p15, 0, %0, c15, c0, 1"
 -                            : : "r" (tmp)
 -                            : "cc");
 +              return -1;
        }
  
 +      return 0;
 +}
 +
 +static void exynos_pm_resume(void)
 +{
 +      if (exynos_pm_central_resume())
 +              goto early_wakeup;
 +
 +      if (!soc_is_exynos5250())
 +              exynos_cpu_restore_register();
 +
        /* For release retention */
  
        __raw_writel((1 << 28), S5P_PAD_RET_MAUDIO_OPTION);
  
        s3c_pm_do_restore_core(exynos_core_save, ARRAY_SIZE(exynos_core_save));
  
 -      if (IS_ENABLED(CONFIG_SMP) && !soc_is_exynos5250())
 +      if (!soc_is_exynos5250())
                scu_enable(S5P_VA_SCU);
  
  early_wakeup:
@@@ -432,42 -303,10 +431,42 @@@ static const struct platform_suspend_op
        .valid          = suspend_valid_only_mem,
  };
  
 +static int exynos_cpu_pm_notifier(struct notifier_block *self,
 +                                unsigned long cmd, void *v)
 +{
 +      int cpu = smp_processor_id();
 +
 +      switch (cmd) {
 +      case CPU_PM_ENTER:
 +              if (cpu == 0) {
 +                      exynos_pm_central_suspend();
 +                      exynos_cpu_save_register();
 +              }
 +              break;
 +
 +      case CPU_PM_EXIT:
 +              if (cpu == 0) {
 +                      if (!soc_is_exynos5250())
 +                              scu_enable(S5P_VA_SCU);
 +                      exynos_cpu_restore_register();
 +                      exynos_pm_central_resume();
 +              }
 +              break;
 +      }
 +
 +      return NOTIFY_OK;
 +}
 +
 +static struct notifier_block exynos_cpu_pm_notifier_block = {
 +      .notifier_call = exynos_cpu_pm_notifier,
 +};
 +
  void __init exynos_pm_init(void)
  {
        u32 tmp;
  
 +      cpu_pm_register_notifier(&exynos_cpu_pm_notifier_block);
 +
        /* Platform-specific GIC callback */
        gic_arch_extn.irq_set_wake = exynos_irq_set_wake;
  
index 1416c97032662abbf65ad895fa81cd00facb15e5,870e18b9a6876ffe1484801c51d17fccf67c277d..1fad4c5e3f5d1138cbd25b74104c8afddc32c562
  #define APLL_CON0             0x100
  #define SRC_CPU                       0x200
  #define DIV_CPU0              0x500
 +#define PWR_CTRL1             0x1020
 +#define PWR_CTRL2             0x1024
  #define MPLL_LOCK             0x4000
  #define MPLL_CON0             0x4100
  #define SRC_CORE1             0x4204
  #define GATE_IP_ACP           0x8800
+ #define GATE_IP_ISP0          0xc800
+ #define GATE_IP_ISP1          0xc804
  #define CPLL_LOCK             0x10020
  #define EPLL_LOCK             0x10030
  #define VPLL_LOCK             0x10040
  #define SRC_CDREX             0x20200
  #define PLL_DIV2_SEL          0x20a24
  
 +/*Below definitions are used for PWR_CTRL settings*/
 +#define PWR_CTRL1_CORE2_DOWN_RATIO            (7 << 28)
 +#define PWR_CTRL1_CORE1_DOWN_RATIO            (7 << 16)
 +#define PWR_CTRL1_DIV2_DOWN_EN                        (1 << 9)
 +#define PWR_CTRL1_DIV1_DOWN_EN                        (1 << 8)
 +#define PWR_CTRL1_USE_CORE1_WFE                       (1 << 5)
 +#define PWR_CTRL1_USE_CORE0_WFE                       (1 << 4)
 +#define PWR_CTRL1_USE_CORE1_WFI                       (1 << 1)
 +#define PWR_CTRL1_USE_CORE0_WFI                       (1 << 0)
 +
 +#define PWR_CTRL2_DIV2_UP_EN                  (1 << 25)
 +#define PWR_CTRL2_DIV1_UP_EN                  (1 << 24)
 +#define PWR_CTRL2_DUR_STANDBY2_VAL            (1 << 16)
 +#define PWR_CTRL2_DUR_STANDBY1_VAL            (1 << 8)
 +#define PWR_CTRL2_CORE2_UP_RATIO              (1 << 4)
 +#define PWR_CTRL2_CORE1_UP_RATIO              (1 << 0)
 +
  /* list of PLLs to be registered */
  enum exynos5250_plls {
        apll, mpll, cpll, epll, vpll, gpll, bpll,
@@@ -119,8 -102,6 +121,8 @@@ static struct samsung_clk_reg_dump *exy
  static unsigned long exynos5250_clk_regs[] __initdata = {
        SRC_CPU,
        DIV_CPU0,
 +      PWR_CTRL1,
 +      PWR_CTRL2,
        SRC_CORE1,
        SRC_TOP0,
        SRC_TOP1,
        PLL_DIV2_SEL,
        GATE_IP_DISP1,
        GATE_IP_ACP,
+       GATE_IP_ISP0,
+       GATE_IP_ISP1,
  };
  
  static int exynos5250_clk_suspend(void)
@@@ -223,6 -206,7 +227,7 @@@ PNAME(mout_aclk400_p)      = { "mout_aclk400
  PNAME(mout_aclk200_sub_p) = { "fin_pll", "div_aclk200" };
  PNAME(mout_aclk266_sub_p) = { "fin_pll", "div_aclk266" };
  PNAME(mout_aclk333_sub_p) = { "fin_pll", "div_aclk333" };
+ PNAME(mout_aclk400_isp_sub_p) = { "fin_pll", "div_aclk400_isp" };
  PNAME(mout_hdmi_p)    = { "div_hdmi_pixel", "sclk_hdmiphy" };
  PNAME(mout_usb3_p)    = { "mout_mpll_user", "mout_cpll" };
  PNAME(mout_group1_p)  = { "fin_pll", "fin_pll", "sclk_hdmi27m",
@@@ -302,6 -286,7 +307,7 @@@ static struct samsung_mux_clock exynos5
        MUX(0, "mout_aclk333", mout_aclk166_p, SRC_TOP0, 16, 1),
        MUX(0, "mout_aclk400_g3d_mid", mout_aclk200_p, SRC_TOP0, 20, 1),
  
+       MUX(0, "mout_aclk400_isp", mout_aclk200_p, SRC_TOP1, 24, 1),
        MUX(0, "mout_aclk400_g3d", mout_aclk400_p, SRC_TOP1, 28, 1),
  
        MUX(0, "mout_cpll", mout_cpll_p, SRC_TOP2, 8, 1),
  
        MUX(0, "mout_aclk200_disp1_sub", mout_aclk200_sub_p, SRC_TOP3, 4, 1),
        MUX(0, "mout_aclk266_gscl_sub", mout_aclk266_sub_p, SRC_TOP3, 8, 1),
+       MUX(0, "mout_aclk_266_isp_sub", mout_aclk266_sub_p, SRC_TOP3, 16, 1),
+       MUX(0, "mout_aclk_400_isp_sub", mout_aclk400_isp_sub_p,
+                       SRC_TOP3, 20, 1),
        MUX(0, "mout_aclk333_sub", mout_aclk333_sub_p, SRC_TOP3, 24, 1),
  
        MUX(0, "mout_cam_bayer", mout_group1_p, SRC_GSCL, 12, 4),
@@@ -385,6 -373,7 +394,7 @@@ static struct samsung_div_clock exynos5
        DIV(0, "div_aclk400_g3d", "mout_aclk400_g3d", DIV_TOP0,
                                                        24, 3),
  
+       DIV(0, "div_aclk400_isp", "mout_aclk400_isp", DIV_TOP1, 20, 3),
        DIV(0, "div_aclk66_pre", "mout_mpll_user", DIV_TOP1, 24, 3),
  
        DIV(0, "div_cam_bayer", "mout_cam_bayer", DIV_GSCL, 12, 4),
@@@ -650,6 -639,31 +660,31 @@@ static struct samsung_gate_clock exynos
        GATE(CLK_WDT, "wdt", "div_aclk66", GATE_IP_PERIS, 19, 0, 0),
        GATE(CLK_RTC, "rtc", "div_aclk66", GATE_IP_PERIS, 20, 0, 0),
        GATE(CLK_TMU, "tmu", "div_aclk66", GATE_IP_PERIS, 21, 0, 0),
+       GATE(CLK_SMMU_TV, "smmu_tv", "mout_aclk200_disp1_sub",
+                       GATE_IP_DISP1, 2, 0, 0),
+       GATE(CLK_SMMU_FIMD1, "smmu_fimd1", "mout_aclk200_disp1_sub",
+                       GATE_IP_DISP1, 8, 0, 0),
+       GATE(CLK_SMMU_2D, "smmu_2d", "div_aclk200", GATE_IP_ACP, 7, 0, 0),
+       GATE(CLK_SMMU_FIMC_ISP, "smmu_fimc_isp", "mout_aclk_266_isp_sub",
+                       GATE_IP_ISP0, 8, 0, 0),
+       GATE(CLK_SMMU_FIMC_DRC, "smmu_fimc_drc", "mout_aclk_266_isp_sub",
+                       GATE_IP_ISP0, 9, 0, 0),
+       GATE(CLK_SMMU_FIMC_FD, "smmu_fimc_fd", "mout_aclk_266_isp_sub",
+                       GATE_IP_ISP0, 10, 0, 0),
+       GATE(CLK_SMMU_FIMC_SCC, "smmu_fimc_scc", "mout_aclk_266_isp_sub",
+                       GATE_IP_ISP0, 11, 0, 0),
+       GATE(CLK_SMMU_FIMC_SCP, "smmu_fimc_scp", "mout_aclk_266_isp_sub",
+                       GATE_IP_ISP0, 12, 0, 0),
+       GATE(CLK_SMMU_FIMC_MCU, "smmu_fimc_mcu", "mout_aclk_400_isp_sub",
+                       GATE_IP_ISP0, 13, 0, 0),
+       GATE(CLK_SMMU_FIMC_ODC, "smmu_fimc_odc", "mout_aclk_266_isp_sub",
+                       GATE_IP_ISP1, 4, 0, 0),
+       GATE(CLK_SMMU_FIMC_DIS0, "smmu_fimc_dis0", "mout_aclk_266_isp_sub",
+                       GATE_IP_ISP1, 5, 0, 0),
+       GATE(CLK_SMMU_FIMC_DIS1, "smmu_fimc_dis1", "mout_aclk_266_isp_sub",
+                       GATE_IP_ISP1, 6, 0, 0),
+       GATE(CLK_SMMU_FIMC_3DNR, "smmu_fimc_3dnr", "mout_aclk_266_isp_sub",
+                       GATE_IP_ISP1, 7, 0, 0),
  };
  
  static struct samsung_pll_rate_table vpll_24mhz_tbl[] __initdata = {
@@@ -722,7 -736,6 +757,7 @@@ static struct of_device_id ext_clk_matc
  static void __init exynos5250_clk_init(struct device_node *np)
  {
        struct samsung_clk_provider *ctx;
 +      unsigned int tmp;
  
        if (np) {
                reg_base = of_iomap(np, 0);
        samsung_clk_register_gate(ctx, exynos5250_gate_clks,
                        ARRAY_SIZE(exynos5250_gate_clks));
  
 +      /*
 +       * Enable arm clock down (in idle) and set arm divider
 +       * ratios in WFI/WFE state.
 +       */
 +      tmp = (PWR_CTRL1_CORE2_DOWN_RATIO | PWR_CTRL1_CORE1_DOWN_RATIO |
 +              PWR_CTRL1_DIV2_DOWN_EN | PWR_CTRL1_DIV1_DOWN_EN |
 +              PWR_CTRL1_USE_CORE1_WFE | PWR_CTRL1_USE_CORE0_WFE |
 +              PWR_CTRL1_USE_CORE1_WFI | PWR_CTRL1_USE_CORE0_WFI);
 +      __raw_writel(tmp, reg_base + PWR_CTRL1);
 +
 +      /*
 +       * Enable arm clock up (on exiting idle). Set arm divider
 +       * ratios when not in idle along with the standby duration
 +       * ratios.
 +       */
 +      tmp = (PWR_CTRL2_DIV2_UP_EN | PWR_CTRL2_DIV1_UP_EN |
 +              PWR_CTRL2_DUR_STANDBY2_VAL | PWR_CTRL2_DUR_STANDBY1_VAL |
 +              PWR_CTRL2_CORE2_UP_RATIO | PWR_CTRL2_CORE1_UP_RATIO);
 +      __raw_writel(tmp, reg_base + PWR_CTRL2);
 +
        exynos5250_clk_sleep_init();
  
        pr_info("Exynos5250: clock setup completed, armclk=%ld\n",
This page took 0.114546 seconds and 4 git commands to generate.