提交 e7051e9d 编写于 作者: A Arnd Bergmann

Merge branch 'samsung/exynos5' into next/soc2

...@@ -3780,7 +3780,7 @@ F: Documentation/kdump/ ...@@ -3780,7 +3780,7 @@ F: Documentation/kdump/
KERNEL AUTOMOUNTER v4 (AUTOFS4) KERNEL AUTOMOUNTER v4 (AUTOFS4)
M: Ian Kent <raven@themaw.net> M: Ian Kent <raven@themaw.net>
L: autofs@linux.kernel.org L: autofs@vger.kernel.org
S: Maintained S: Maintained
F: fs/autofs4/ F: fs/autofs4/
...@@ -4685,7 +4685,7 @@ NTFS FILESYSTEM ...@@ -4685,7 +4685,7 @@ NTFS FILESYSTEM
M: Anton Altaparmakov <anton@tuxera.com> M: Anton Altaparmakov <anton@tuxera.com>
L: linux-ntfs-dev@lists.sourceforge.net L: linux-ntfs-dev@lists.sourceforge.net
W: http://www.tuxera.com/ W: http://www.tuxera.com/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs.git
S: Supported S: Supported
F: Documentation/filesystems/ntfs.txt F: Documentation/filesystems/ntfs.txt
F: fs/ntfs/ F: fs/ntfs/
...@@ -7271,7 +7271,7 @@ WATCHDOG DEVICE DRIVERS ...@@ -7271,7 +7271,7 @@ WATCHDOG DEVICE DRIVERS
M: Wim Van Sebroeck <wim@iguana.be> M: Wim Van Sebroeck <wim@iguana.be>
L: linux-watchdog@vger.kernel.org L: linux-watchdog@vger.kernel.org
W: http://www.linux-watchdog.org/ W: http://www.linux-watchdog.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog.git T: git git://www.linux-watchdog.org/linux-watchdog.git
S: Maintained S: Maintained
F: Documentation/watchdog/ F: Documentation/watchdog/
F: drivers/watchdog/ F: drivers/watchdog/
......
VERSION = 3 VERSION = 3
PATCHLEVEL = 3 PATCHLEVEL = 3
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc5 EXTRAVERSION = -rc6
NAME = Saber-toothed Squirrel NAME = Saber-toothed Squirrel
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -180,6 +180,7 @@ machine-$(CONFIG_ARCH_S5P64X0) := s5p64x0 ...@@ -180,6 +180,7 @@ machine-$(CONFIG_ARCH_S5P64X0) := s5p64x0
machine-$(CONFIG_ARCH_S5PC100) := s5pc100 machine-$(CONFIG_ARCH_S5PC100) := s5pc100
machine-$(CONFIG_ARCH_S5PV210) := s5pv210 machine-$(CONFIG_ARCH_S5PV210) := s5pv210
machine-$(CONFIG_ARCH_EXYNOS4) := exynos machine-$(CONFIG_ARCH_EXYNOS4) := exynos
machine-$(CONFIG_ARCH_EXYNOS5) := exynos
machine-$(CONFIG_ARCH_SA1100) := sa1100 machine-$(CONFIG_ARCH_SA1100) := sa1100
machine-$(CONFIG_ARCH_SHARK) := shark machine-$(CONFIG_ARCH_SHARK) := shark
machine-$(CONFIG_ARCH_SHMOBILE) := shmobile machine-$(CONFIG_ARCH_SHMOBILE) := shmobile
......
/*
* SAMSUNG SMDK5250 board device tree source
*
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
* http://www.samsung.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/dts-v1/;
/include/ "exynos5250.dtsi"
/ {
model = "SAMSUNG SMDK5250 board based on EXYNOS5250";
compatible = "samsung,smdk5250", "samsung,exynos5250";
memory {
reg = <0x40000000 0x80000000>;
};
chosen {
bootargs = "root=/dev/ram0 rw ramdisk=8192 console=ttySAC1,115200";
};
};
/*
* SAMSUNG EXYNOS5250 SoC device tree source
*
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
* http://www.samsung.com
*
* SAMSUNG EXYNOS5250 SoC device nodes are listed in this file.
* EXYNOS5250 based board files can include this file and provide
* values for board specfic bindings.
*
* Note: This file does not include device nodes for all the controllers in
* EXYNOS5250 SoC. As device tree coverage for EXYNOS5250 increases,
* additional nodes can be added to this file.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/include/ "skeleton.dtsi"
/ {
compatible = "samsung,exynos5250";
interrupt-parent = <&gic>;
gic:interrupt-controller@10490000 {
compatible = "arm,cortex-a9-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x10490000 0x1000>, <0x10480000 0x100>;
};
watchdog {
compatible = "samsung,s3c2410-wdt";
reg = <0x101D0000 0x100>;
interrupts = <0 42 0>;
};
rtc {
compatible = "samsung,s3c6410-rtc";
reg = <0x101E0000 0x100>;
interrupts = <0 43 0>, <0 44 0>;
};
sdhci@12200000 {
compatible = "samsung,exynos4210-sdhci";
reg = <0x12200000 0x100>;
interrupts = <0 75 0>;
};
sdhci@12210000 {
compatible = "samsung,exynos4210-sdhci";
reg = <0x12210000 0x100>;
interrupts = <0 76 0>;
};
sdhci@12220000 {
compatible = "samsung,exynos4210-sdhci";
reg = <0x12220000 0x100>;
interrupts = <0 77 0>;
};
sdhci@12230000 {
compatible = "samsung,exynos4210-sdhci";
reg = <0x12230000 0x100>;
interrupts = <0 78 0>;
};
serial@12C00000 {
compatible = "samsung,exynos4210-uart";
reg = <0x12C00000 0x100>;
interrupts = <0 51 0>;
};
serial@12C10000 {
compatible = "samsung,exynos4210-uart";
reg = <0x12C10000 0x100>;
interrupts = <0 52 0>;
};
serial@12C20000 {
compatible = "samsung,exynos4210-uart";
reg = <0x12C20000 0x100>;
interrupts = <0 53 0>;
};
serial@12C30000 {
compatible = "samsung,exynos4210-uart";
reg = <0x12C30000 0x100>;
interrupts = <0 54 0>;
};
i2c@12C60000 {
compatible = "samsung,s3c2440-i2c";
reg = <0x12C60000 0x100>;
interrupts = <0 56 0>;
};
i2c@12C70000 {
compatible = "samsung,s3c2440-i2c";
reg = <0x12C70000 0x100>;
interrupts = <0 57 0>;
};
i2c@12C80000 {
compatible = "samsung,s3c2440-i2c";
reg = <0x12C80000 0x100>;
interrupts = <0 58 0>;
};
i2c@12C90000 {
compatible = "samsung,s3c2440-i2c";
reg = <0x12C90000 0x100>;
interrupts = <0 59 0>;
};
i2c@12CA0000 {
compatible = "samsung,s3c2440-i2c";
reg = <0x12CA0000 0x100>;
interrupts = <0 60 0>;
};
i2c@12CB0000 {
compatible = "samsung,s3c2440-i2c";
reg = <0x12CB0000 0x100>;
interrupts = <0 61 0>;
};
i2c@12CC0000 {
compatible = "samsung,s3c2440-i2c";
reg = <0x12CC0000 0x100>;
interrupts = <0 62 0>;
};
i2c@12CD0000 {
compatible = "samsung,s3c2440-i2c";
reg = <0x12CD0000 0x100>;
interrupts = <0 63 0>;
};
amba {
#address-cells = <1>;
#size-cells = <1>;
compatible = "arm,amba-bus";
interrupt-parent = <&gic>;
ranges;
pdma0: pdma@121A0000 {
compatible = "arm,pl330", "arm,primecell";
reg = <0x121A0000 0x1000>;
interrupts = <0 34 0>;
};
pdma1: pdma@121B0000 {
compatible = "arm,pl330", "arm,primecell";
reg = <0x121B0000 0x1000>;
interrupts = <0 35 0>;
};
mdma0: pdma@10800000 {
compatible = "arm,pl330", "arm,primecell";
reg = <0x10800000 0x1000>;
interrupts = <0 33 0>;
};
mdma1: pdma@11C10000 {
compatible = "arm,pl330", "arm,primecell";
reg = <0x11C10000 0x1000>;
interrupts = <0 124 0>;
};
};
gpio-controllers {
#address-cells = <1>;
#size-cells = <1>;
gpio-controller;
ranges;
gpa0: gpio-controller@11400000 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400000 0x20>;
#gpio-cells = <4>;
};
gpa1: gpio-controller@11400020 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400020 0x20>;
#gpio-cells = <4>;
};
gpa2: gpio-controller@11400040 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400040 0x20>;
#gpio-cells = <4>;
};
gpb0: gpio-controller@11400060 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400060 0x20>;
#gpio-cells = <4>;
};
gpb1: gpio-controller@11400080 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400080 0x20>;
#gpio-cells = <4>;
};
gpb2: gpio-controller@114000A0 {
compatible = "samsung,exynos4-gpio";
reg = <0x114000A0 0x20>;
#gpio-cells = <4>;
};
gpb3: gpio-controller@114000C0 {
compatible = "samsung,exynos4-gpio";
reg = <0x114000C0 0x20>;
#gpio-cells = <4>;
};
gpc0: gpio-controller@114000E0 {
compatible = "samsung,exynos4-gpio";
reg = <0x114000E0 0x20>;
#gpio-cells = <4>;
};
gpc1: gpio-controller@11400100 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400100 0x20>;
#gpio-cells = <4>;
};
gpc2: gpio-controller@11400120 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400120 0x20>;
#gpio-cells = <4>;
};
gpc3: gpio-controller@11400140 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400140 0x20>;
#gpio-cells = <4>;
};
gpd0: gpio-controller@11400160 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400160 0x20>;
#gpio-cells = <4>;
};
gpd1: gpio-controller@11400180 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400180 0x20>;
#gpio-cells = <4>;
};
gpy0: gpio-controller@114001A0 {
compatible = "samsung,exynos4-gpio";
reg = <0x114001A0 0x20>;
#gpio-cells = <4>;
};
gpy1: gpio-controller@114001C0 {
compatible = "samsung,exynos4-gpio";
reg = <0x114001C0 0x20>;
#gpio-cells = <4>;
};
gpy2: gpio-controller@114001E0 {
compatible = "samsung,exynos4-gpio";
reg = <0x114001E0 0x20>;
#gpio-cells = <4>;
};
gpy3: gpio-controller@11400200 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400200 0x20>;
#gpio-cells = <4>;
};
gpy4: gpio-controller@11400220 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400220 0x20>;
#gpio-cells = <4>;
};
gpy5: gpio-controller@11400240 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400240 0x20>;
#gpio-cells = <4>;
};
gpy6: gpio-controller@11400260 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400260 0x20>;
#gpio-cells = <4>;
};
gpx0: gpio-controller@11400C00 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400C00 0x20>;
#gpio-cells = <4>;
};
gpx1: gpio-controller@11400C20 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400C20 0x20>;
#gpio-cells = <4>;
};
gpx2: gpio-controller@11400C40 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400C40 0x20>;
#gpio-cells = <4>;
};
gpx3: gpio-controller@11400C60 {
compatible = "samsung,exynos4-gpio";
reg = <0x11400C60 0x20>;
#gpio-cells = <4>;
};
gpe0: gpio-controller@13400000 {
compatible = "samsung,exynos4-gpio";
reg = <0x13400000 0x20>;
#gpio-cells = <4>;
};
gpe1: gpio-controller@13400020 {
compatible = "samsung,exynos4-gpio";
reg = <0x13400020 0x20>;
#gpio-cells = <4>;
};
gpf0: gpio-controller@13400040 {
compatible = "samsung,exynos4-gpio";
reg = <0x13400040 0x20>;
#gpio-cells = <4>;
};
gpf1: gpio-controller@13400060 {
compatible = "samsung,exynos4-gpio";
reg = <0x13400060 0x20>;
#gpio-cells = <4>;
};
gpg0: gpio-controller@13400080 {
compatible = "samsung,exynos4-gpio";
reg = <0x13400080 0x20>;
#gpio-cells = <4>;
};
gpg1: gpio-controller@134000A0 {
compatible = "samsung,exynos4-gpio";
reg = <0x134000A0 0x20>;
#gpio-cells = <4>;
};
gpg2: gpio-controller@134000C0 {
compatible = "samsung,exynos4-gpio";
reg = <0x134000C0 0x20>;
#gpio-cells = <4>;
};
gph0: gpio-controller@134000E0 {
compatible = "samsung,exynos4-gpio";
reg = <0x134000E0 0x20>;
#gpio-cells = <4>;
};
gph1: gpio-controller@13400100 {
compatible = "samsung,exynos4-gpio";
reg = <0x13400100 0x20>;
#gpio-cells = <4>;
};
gpv0: gpio-controller@10D10000 {
compatible = "samsung,exynos4-gpio";
reg = <0x10D10000 0x20>;
#gpio-cells = <4>;
};
gpv1: gpio-controller@10D10020 {
compatible = "samsung,exynos4-gpio";
reg = <0x10D10020 0x20>;
#gpio-cells = <4>;
};
gpv2: gpio-controller@10D10040 {
compatible = "samsung,exynos4-gpio";
reg = <0x10D10040 0x20>;
#gpio-cells = <4>;
};
gpv3: gpio-controller@10D10060 {
compatible = "samsung,exynos4-gpio";
reg = <0x10D10060 0x20>;
#gpio-cells = <4>;
};
gpv4: gpio-controller@10D10080 {
compatible = "samsung,exynos4-gpio";
reg = <0x10D10080 0x20>;
#gpio-cells = <4>;
};
gpz: gpio-controller@03860000 {
compatible = "samsung,exynos4-gpio";
reg = <0x03860000 0x20>;
#gpio-cells = <4>;
};
};
};
...@@ -11,18 +11,19 @@ if ARCH_EXYNOS ...@@ -11,18 +11,19 @@ if ARCH_EXYNOS
menu "SAMSUNG EXYNOS SoCs Support" menu "SAMSUNG EXYNOS SoCs Support"
choice
prompt "EXYNOS System Type"
default ARCH_EXYNOS4
config ARCH_EXYNOS4 config ARCH_EXYNOS4
bool "SAMSUNG EXYNOS4" bool "SAMSUNG EXYNOS4"
default y
select HAVE_SMP select HAVE_SMP
select MIGHT_HAVE_CACHE_L2X0 select MIGHT_HAVE_CACHE_L2X0
help help
Samsung EXYNOS4 SoCs based systems Samsung EXYNOS4 SoCs based systems
endchoice config ARCH_EXYNOS5
bool "SAMSUNG EXYNOS5"
select HAVE_SMP
help
Samsung EXYNOS5 (Cortex-A15) SoC based systems
comment "EXYNOS SoCs" comment "EXYNOS SoCs"
...@@ -41,6 +42,7 @@ config SOC_EXYNOS4212 ...@@ -41,6 +42,7 @@ config SOC_EXYNOS4212
bool "SAMSUNG EXYNOS4212" bool "SAMSUNG EXYNOS4212"
default y default y
depends on ARCH_EXYNOS4 depends on ARCH_EXYNOS4
select SAMSUNG_DMADEV
select S5P_PM if PM select S5P_PM if PM
select S5P_SLEEP if PM select S5P_SLEEP if PM
help help
...@@ -50,9 +52,17 @@ config SOC_EXYNOS4412 ...@@ -50,9 +52,17 @@ config SOC_EXYNOS4412
bool "SAMSUNG EXYNOS4412" bool "SAMSUNG EXYNOS4412"
default y default y
depends on ARCH_EXYNOS4 depends on ARCH_EXYNOS4
select SAMSUNG_DMADEV
help help
Enable EXYNOS4412 SoC support Enable EXYNOS4412 SoC support
config SOC_EXYNOS5250
bool "SAMSUNG EXYNOS5250"
default y
depends on ARCH_EXYNOS5
help
Enable EXYNOS5250 SoC support
config EXYNOS4_MCT config EXYNOS4_MCT
bool bool
default y default y
...@@ -333,6 +343,7 @@ config MACH_SMDK4212 ...@@ -333,6 +343,7 @@ config MACH_SMDK4212
select SAMSUNG_DEV_BACKLIGHT select SAMSUNG_DEV_BACKLIGHT
select SAMSUNG_DEV_KEYPAD select SAMSUNG_DEV_KEYPAD
select SAMSUNG_DEV_PWM select SAMSUNG_DEV_PWM
select EXYNOS4_DEV_DMA
select EXYNOS4_SETUP_I2C1 select EXYNOS4_SETUP_I2C1
select EXYNOS4_SETUP_I2C3 select EXYNOS4_SETUP_I2C3
select EXYNOS4_SETUP_I2C7 select EXYNOS4_SETUP_I2C7
...@@ -351,7 +362,7 @@ config MACH_SMDK4412 ...@@ -351,7 +362,7 @@ config MACH_SMDK4412
Machine support for Samsung SMDK4412 Machine support for Samsung SMDK4412
endif endif
comment "Flattened Device Tree based board for Exynos4 based SoC" comment "Flattened Device Tree based board for EXYNOS SoCs"
config MACH_EXYNOS4_DT config MACH_EXYNOS4_DT
bool "Samsung Exynos4 Machine using device tree" bool "Samsung Exynos4 Machine using device tree"
...@@ -365,6 +376,15 @@ config MACH_EXYNOS4_DT ...@@ -365,6 +376,15 @@ config MACH_EXYNOS4_DT
Note: This is under development and not all peripherals can be supported Note: This is under development and not all peripherals can be supported
with this machine file. with this machine file.
config MACH_EXYNOS5_DT
bool "SAMSUNG EXYNOS5 Machine using device tree"
select SOC_EXYNOS5250
select USE_OF
select ARM_AMBA
help
Machine support for Samsung Exynos4 machine with device tree enabled.
Select this if a fdt blob is available for the EXYNOS4 SoC based board.
if ARCH_EXYNOS4 if ARCH_EXYNOS4
comment "Configuration for HSMMC 8-bit bus width" comment "Configuration for HSMMC 8-bit bus width"
......
...@@ -12,7 +12,9 @@ obj- := ...@@ -12,7 +12,9 @@ obj- :=
# Core # Core
obj-$(CONFIG_ARCH_EXYNOS4) += common.o clock.o obj-$(CONFIG_ARCH_EXYNOS) += common.o
obj-$(CONFIG_ARCH_EXYNOS4) += clock-exynos4.o
obj-$(CONFIG_ARCH_EXYNOS5) += clock-exynos5.o
obj-$(CONFIG_CPU_EXYNOS4210) += clock-exynos4210.o obj-$(CONFIG_CPU_EXYNOS4210) += clock-exynos4210.o
obj-$(CONFIG_SOC_EXYNOS4212) += clock-exynos4212.o obj-$(CONFIG_SOC_EXYNOS4212) += clock-exynos4212.o
...@@ -40,9 +42,11 @@ obj-$(CONFIG_MACH_SMDK4212) += mach-smdk4x12.o ...@@ -40,9 +42,11 @@ obj-$(CONFIG_MACH_SMDK4212) += mach-smdk4x12.o
obj-$(CONFIG_MACH_SMDK4412) += mach-smdk4x12.o obj-$(CONFIG_MACH_SMDK4412) += mach-smdk4x12.o
obj-$(CONFIG_MACH_EXYNOS4_DT) += mach-exynos4-dt.o obj-$(CONFIG_MACH_EXYNOS4_DT) += mach-exynos4-dt.o
obj-$(CONFIG_MACH_EXYNOS5_DT) += mach-exynos5-dt.o
# device support # device support
obj-y += dev-uart.o
obj-$(CONFIG_ARCH_EXYNOS4) += dev-audio.o obj-$(CONFIG_ARCH_EXYNOS4) += dev-audio.o
obj-$(CONFIG_EXYNOS4_DEV_AHCI) += dev-ahci.o obj-$(CONFIG_EXYNOS4_DEV_AHCI) += dev-ahci.o
obj-$(CONFIG_EXYNOS4_DEV_PD) += dev-pd.o obj-$(CONFIG_EXYNOS4_DEV_PD) += dev-pd.o
...@@ -51,7 +55,7 @@ obj-$(CONFIG_EXYNOS4_DEV_DWMCI) += dev-dwmci.o ...@@ -51,7 +55,7 @@ obj-$(CONFIG_EXYNOS4_DEV_DWMCI) += dev-dwmci.o
obj-$(CONFIG_EXYNOS4_DEV_DMA) += dma.o obj-$(CONFIG_EXYNOS4_DEV_DMA) += dma.o
obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI) += dev-ohci.o obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI) += dev-ohci.o
obj-$(CONFIG_ARCH_EXYNOS4) += setup-i2c0.o obj-$(CONFIG_ARCH_EXYNOS) += setup-i2c0.o
obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o
obj-$(CONFIG_EXYNOS4_SETUP_FIMD0) += setup-fimd0.o obj-$(CONFIG_EXYNOS4_SETUP_FIMD0) += setup-fimd0.o
obj-$(CONFIG_EXYNOS4_SETUP_I2C1) += setup-i2c1.o obj-$(CONFIG_EXYNOS4_SETUP_I2C1) += setup-i2c1.o
......
/* /*
* linux/arch/arm/mach-exynos4/include/mach/exynos4-clock.h * Copyright (c) 2011-2012 Samsung Electronics Co., Ltd.
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com * http://www.samsung.com
* *
* Header file for exynos4 clock support * Header file for exynos4 clock support
...@@ -16,25 +14,14 @@ ...@@ -16,25 +14,14 @@
#include <linux/clk.h> #include <linux/clk.h>
extern struct clk clk_sclk_hdmi27m; extern struct clksrc_clk exynos4_clk_aclk_133;
extern struct clk clk_sclk_usbphy0; extern struct clksrc_clk exynos4_clk_mout_mpll;
extern struct clk clk_sclk_usbphy1;
extern struct clk clk_sclk_hdmiphy;
extern struct clksrc_clk clk_sclk_apll;
extern struct clksrc_clk clk_mout_mpll;
extern struct clksrc_clk clk_aclk_133;
extern struct clksrc_clk clk_mout_epll;
extern struct clksrc_clk clk_sclk_vpll;
extern struct clk *clkset_corebus_list[];
extern struct clksrc_sources clkset_mout_corebus;
extern struct clk *clkset_aclk_top_list[]; extern struct clksrc_sources exynos4_clkset_mout_corebus;
extern struct clksrc_sources clkset_aclk; extern struct clksrc_sources exynos4_clkset_group;
extern struct clk *clkset_group_list[]; extern struct clk *exynos4_clkset_aclk_top_list[];
extern struct clksrc_sources clkset_group; extern struct clk *exynos4_clkset_group_list[];
extern int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable); extern int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable);
extern int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable); extern int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable);
......
/* /*
* linux/arch/arm/mach-exynos4/clock-exynos4210.c * Copyright (c) 2011-2012 Samsung Electronics Co., Ltd.
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com * http://www.samsung.com
* *
* EXYNOS4210 - Clock support * EXYNOS4210 - Clock support
...@@ -28,20 +26,20 @@ ...@@ -28,20 +26,20 @@
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/map.h> #include <mach/map.h>
#include <mach/regs-clock.h> #include <mach/regs-clock.h>
#include <mach/exynos4-clock.h>
#include "common.h" #include "common.h"
#include "clock-exynos4.h"
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static struct sleep_save exynos4210_clock_save[] = { static struct sleep_save exynos4210_clock_save[] = {
SAVE_ITEM(S5P_CLKSRC_IMAGE), SAVE_ITEM(EXYNOS4_CLKSRC_IMAGE),
SAVE_ITEM(S5P_CLKSRC_LCD1), SAVE_ITEM(EXYNOS4_CLKDIV_IMAGE),
SAVE_ITEM(S5P_CLKDIV_IMAGE), SAVE_ITEM(EXYNOS4210_CLKSRC_LCD1),
SAVE_ITEM(S5P_CLKDIV_LCD1), SAVE_ITEM(EXYNOS4210_CLKDIV_LCD1),
SAVE_ITEM(S5P_CLKSRC_MASK_LCD1), SAVE_ITEM(EXYNOS4210_CLKSRC_MASK_LCD1),
SAVE_ITEM(S5P_CLKGATE_IP_IMAGE_4210), SAVE_ITEM(EXYNOS4210_CLKGATE_IP_IMAGE),
SAVE_ITEM(S5P_CLKGATE_IP_LCD1), SAVE_ITEM(EXYNOS4210_CLKGATE_IP_LCD1),
SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4210), SAVE_ITEM(EXYNOS4210_CLKGATE_IP_PERIR),
}; };
#endif #endif
...@@ -51,7 +49,7 @@ static struct clksrc_clk *sysclks[] = { ...@@ -51,7 +49,7 @@ static struct clksrc_clk *sysclks[] = {
static int exynos4_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable) static int exynos4_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable)
{ {
return s5p_gatectrl(S5P_CLKSRC_MASK_LCD1, clk, enable); return s5p_gatectrl(EXYNOS4210_CLKSRC_MASK_LCD1, clk, enable);
} }
static struct clksrc_clk clksrcs[] = { static struct clksrc_clk clksrcs[] = {
...@@ -62,9 +60,9 @@ static struct clksrc_clk clksrcs[] = { ...@@ -62,9 +60,9 @@ static struct clksrc_clk clksrcs[] = {
.enable = exynos4_clksrc_mask_fsys_ctrl, .enable = exynos4_clksrc_mask_fsys_ctrl,
.ctrlbit = (1 << 24), .ctrlbit = (1 << 24),
}, },
.sources = &clkset_mout_corebus, .sources = &exynos4_clkset_mout_corebus,
.reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 24, .size = 1 }, .reg_src = { .reg = EXYNOS4_CLKSRC_FSYS, .shift = 24, .size = 1 },
.reg_div = { .reg = S5P_CLKDIV_FSYS0, .shift = 20, .size = 4 }, .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS0, .shift = 20, .size = 4 },
}, { }, {
.clk = { .clk = {
.name = "sclk_fimd", .name = "sclk_fimd",
...@@ -72,9 +70,9 @@ static struct clksrc_clk clksrcs[] = { ...@@ -72,9 +70,9 @@ static struct clksrc_clk clksrcs[] = {
.enable = exynos4_clksrc_mask_lcd1_ctrl, .enable = exynos4_clksrc_mask_lcd1_ctrl,
.ctrlbit = (1 << 0), .ctrlbit = (1 << 0),
}, },
.sources = &clkset_group, .sources = &exynos4_clkset_group,
.reg_src = { .reg = S5P_CLKSRC_LCD1, .shift = 0, .size = 4 }, .reg_src = { .reg = EXYNOS4210_CLKSRC_LCD1, .shift = 0, .size = 4 },
.reg_div = { .reg = S5P_CLKDIV_LCD1, .shift = 0, .size = 4 }, .reg_div = { .reg = EXYNOS4210_CLKDIV_LCD1, .shift = 0, .size = 4 },
}, },
}; };
...@@ -82,13 +80,13 @@ static struct clk init_clocks_off[] = { ...@@ -82,13 +80,13 @@ static struct clk init_clocks_off[] = {
{ {
.name = "sataphy", .name = "sataphy",
.id = -1, .id = -1,
.parent = &clk_aclk_133.clk, .parent = &exynos4_clk_aclk_133.clk,
.enable = exynos4_clk_ip_fsys_ctrl, .enable = exynos4_clk_ip_fsys_ctrl,
.ctrlbit = (1 << 3), .ctrlbit = (1 << 3),
}, { }, {
.name = "sata", .name = "sata",
.id = -1, .id = -1,
.parent = &clk_aclk_133.clk, .parent = &exynos4_clk_aclk_133.clk,
.enable = exynos4_clk_ip_fsys_ctrl, .enable = exynos4_clk_ip_fsys_ctrl,
.ctrlbit = (1 << 10), .ctrlbit = (1 << 10),
}, { }, {
...@@ -117,7 +115,7 @@ static void exynos4210_clock_resume(void) ...@@ -117,7 +115,7 @@ static void exynos4210_clock_resume(void)
#define exynos4210_clock_resume NULL #define exynos4210_clock_resume NULL
#endif #endif
struct syscore_ops exynos4210_clock_syscore_ops = { static struct syscore_ops exynos4210_clock_syscore_ops = {
.suspend = exynos4210_clock_suspend, .suspend = exynos4210_clock_suspend,
.resume = exynos4210_clock_resume, .resume = exynos4210_clock_resume,
}; };
...@@ -126,9 +124,9 @@ void __init exynos4210_register_clocks(void) ...@@ -126,9 +124,9 @@ void __init exynos4210_register_clocks(void)
{ {
int ptr; int ptr;
clk_mout_mpll.reg_src.reg = S5P_CLKSRC_CPU; exynos4_clk_mout_mpll.reg_src.reg = EXYNOS4_CLKSRC_CPU;
clk_mout_mpll.reg_src.shift = 8; exynos4_clk_mout_mpll.reg_src.shift = 8;
clk_mout_mpll.reg_src.size = 1; exynos4_clk_mout_mpll.reg_src.size = 1;
for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++) for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
s3c_register_clksrc(sysclks[ptr], 1); s3c_register_clksrc(sysclks[ptr], 1);
......
/* /*
* linux/arch/arm/mach-exynos4/clock-exynos4212.c * Copyright (c) 2011-2012 Samsung Electronics Co., Ltd.
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com * http://www.samsung.com
* *
* EXYNOS4212 - Clock support * EXYNOS4212 - Clock support
...@@ -28,22 +26,22 @@ ...@@ -28,22 +26,22 @@
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/map.h> #include <mach/map.h>
#include <mach/regs-clock.h> #include <mach/regs-clock.h>
#include <mach/exynos4-clock.h>
#include "common.h" #include "common.h"
#include "clock-exynos4.h"
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static struct sleep_save exynos4212_clock_save[] = { static struct sleep_save exynos4212_clock_save[] = {
SAVE_ITEM(S5P_CLKSRC_IMAGE), SAVE_ITEM(EXYNOS4_CLKSRC_IMAGE),
SAVE_ITEM(S5P_CLKDIV_IMAGE), SAVE_ITEM(EXYNOS4_CLKDIV_IMAGE),
SAVE_ITEM(S5P_CLKGATE_IP_IMAGE_4212), SAVE_ITEM(EXYNOS4212_CLKGATE_IP_IMAGE),
SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4212), SAVE_ITEM(EXYNOS4212_CLKGATE_IP_PERIR),
}; };
#endif #endif
static struct clk *clk_src_mpll_user_list[] = { static struct clk *clk_src_mpll_user_list[] = {
[0] = &clk_fin_mpll, [0] = &clk_fin_mpll,
[1] = &clk_mout_mpll.clk, [1] = &exynos4_clk_mout_mpll.clk,
}; };
static struct clksrc_sources clk_src_mpll_user = { static struct clksrc_sources clk_src_mpll_user = {
...@@ -56,7 +54,7 @@ static struct clksrc_clk clk_mout_mpll_user = { ...@@ -56,7 +54,7 @@ static struct clksrc_clk clk_mout_mpll_user = {
.name = "mout_mpll_user", .name = "mout_mpll_user",
}, },
.sources = &clk_src_mpll_user, .sources = &clk_src_mpll_user,
.reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 24, .size = 1 }, .reg_src = { .reg = EXYNOS4_CLKSRC_CPU, .shift = 24, .size = 1 },
}; };
static struct clksrc_clk *sysclks[] = { static struct clksrc_clk *sysclks[] = {
...@@ -89,7 +87,7 @@ static void exynos4212_clock_resume(void) ...@@ -89,7 +87,7 @@ static void exynos4212_clock_resume(void)
#define exynos4212_clock_resume NULL #define exynos4212_clock_resume NULL
#endif #endif
struct syscore_ops exynos4212_clock_syscore_ops = { static struct syscore_ops exynos4212_clock_syscore_ops = {
.suspend = exynos4212_clock_suspend, .suspend = exynos4212_clock_suspend,
.resume = exynos4212_clock_resume, .resume = exynos4212_clock_resume,
}; };
...@@ -99,15 +97,15 @@ void __init exynos4212_register_clocks(void) ...@@ -99,15 +97,15 @@ void __init exynos4212_register_clocks(void)
int ptr; int ptr;
/* usbphy1 is removed */ /* usbphy1 is removed */
clkset_group_list[4] = NULL; exynos4_clkset_group_list[4] = NULL;
/* mout_mpll_user is used */ /* mout_mpll_user is used */
clkset_group_list[6] = &clk_mout_mpll_user.clk; exynos4_clkset_group_list[6] = &clk_mout_mpll_user.clk;
clkset_aclk_top_list[0] = &clk_mout_mpll_user.clk; exynos4_clkset_aclk_top_list[0] = &clk_mout_mpll_user.clk;
clk_mout_mpll.reg_src.reg = S5P_CLKSRC_DMC; exynos4_clk_mout_mpll.reg_src.reg = EXYNOS4_CLKSRC_DMC;
clk_mout_mpll.reg_src.shift = 12; exynos4_clk_mout_mpll.reg_src.shift = 12;
clk_mout_mpll.reg_src.size = 1; exynos4_clk_mout_mpll.reg_src.size = 1;
for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++) for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
s3c_register_clksrc(sysclks[ptr], 1); s3c_register_clksrc(sysclks[ptr], 1);
......
此差异已折叠。
...@@ -49,6 +49,14 @@ ...@@ -49,6 +49,14 @@
static const char name_exynos4210[] = "EXYNOS4210"; static const char name_exynos4210[] = "EXYNOS4210";
static const char name_exynos4212[] = "EXYNOS4212"; static const char name_exynos4212[] = "EXYNOS4212";
static const char name_exynos4412[] = "EXYNOS4412"; static const char name_exynos4412[] = "EXYNOS4412";
static const char name_exynos5250[] = "EXYNOS5250";
static void exynos4_map_io(void);
static void exynos5_map_io(void);
static void exynos4_init_clocks(int xtal);
static void exynos5_init_clocks(int xtal);
static void exynos_init_uarts(struct s3c2410_uartcfg *cfg, int no);
static int exynos_init(void);
static struct cpu_table cpu_ids[] __initdata = { static struct cpu_table cpu_ids[] __initdata = {
{ {
...@@ -56,7 +64,7 @@ static struct cpu_table cpu_ids[] __initdata = { ...@@ -56,7 +64,7 @@ static struct cpu_table cpu_ids[] __initdata = {
.idmask = EXYNOS4_CPU_MASK, .idmask = EXYNOS4_CPU_MASK,
.map_io = exynos4_map_io, .map_io = exynos4_map_io,
.init_clocks = exynos4_init_clocks, .init_clocks = exynos4_init_clocks,
.init_uarts = exynos4_init_uarts, .init_uarts = exynos_init_uarts,
.init = exynos_init, .init = exynos_init,
.name = name_exynos4210, .name = name_exynos4210,
}, { }, {
...@@ -64,7 +72,7 @@ static struct cpu_table cpu_ids[] __initdata = { ...@@ -64,7 +72,7 @@ static struct cpu_table cpu_ids[] __initdata = {
.idmask = EXYNOS4_CPU_MASK, .idmask = EXYNOS4_CPU_MASK,
.map_io = exynos4_map_io, .map_io = exynos4_map_io,
.init_clocks = exynos4_init_clocks, .init_clocks = exynos4_init_clocks,
.init_uarts = exynos4_init_uarts, .init_uarts = exynos_init_uarts,
.init = exynos_init, .init = exynos_init,
.name = name_exynos4212, .name = name_exynos4212,
}, { }, {
...@@ -72,9 +80,17 @@ static struct cpu_table cpu_ids[] __initdata = { ...@@ -72,9 +80,17 @@ static struct cpu_table cpu_ids[] __initdata = {
.idmask = EXYNOS4_CPU_MASK, .idmask = EXYNOS4_CPU_MASK,
.map_io = exynos4_map_io, .map_io = exynos4_map_io,
.init_clocks = exynos4_init_clocks, .init_clocks = exynos4_init_clocks,
.init_uarts = exynos4_init_uarts, .init_uarts = exynos_init_uarts,
.init = exynos_init, .init = exynos_init,
.name = name_exynos4412, .name = name_exynos4412,
}, {
.idcode = EXYNOS5250_SOC_ID,
.idmask = EXYNOS5_SOC_MASK,
.map_io = exynos5_map_io,
.init_clocks = exynos5_init_clocks,
.init_uarts = exynos_init_uarts,
.init = exynos_init,
.name = name_exynos5250,
}, },
}; };
...@@ -83,10 +99,14 @@ static struct cpu_table cpu_ids[] __initdata = { ...@@ -83,10 +99,14 @@ static struct cpu_table cpu_ids[] __initdata = {
static struct map_desc exynos_iodesc[] __initdata = { static struct map_desc exynos_iodesc[] __initdata = {
{ {
.virtual = (unsigned long)S5P_VA_CHIPID, .virtual = (unsigned long)S5P_VA_CHIPID,
.pfn = __phys_to_pfn(EXYNOS4_PA_CHIPID), .pfn = __phys_to_pfn(EXYNOS_PA_CHIPID),
.length = SZ_4K, .length = SZ_4K,
.type = MT_DEVICE, .type = MT_DEVICE,
}, { },
};
static struct map_desc exynos4_iodesc[] __initdata = {
{
.virtual = (unsigned long)S3C_VA_SYS, .virtual = (unsigned long)S3C_VA_SYS,
.pfn = __phys_to_pfn(EXYNOS4_PA_SYSCON), .pfn = __phys_to_pfn(EXYNOS4_PA_SYSCON),
.length = SZ_64K, .length = SZ_64K,
...@@ -136,11 +156,7 @@ static struct map_desc exynos_iodesc[] __initdata = { ...@@ -136,11 +156,7 @@ static struct map_desc exynos_iodesc[] __initdata = {
.pfn = __phys_to_pfn(EXYNOS4_PA_UART), .pfn = __phys_to_pfn(EXYNOS4_PA_UART),
.length = SZ_512K, .length = SZ_512K,
.type = MT_DEVICE, .type = MT_DEVICE,
}, }, {
};
static struct map_desc exynos4_iodesc[] __initdata = {
{
.virtual = (unsigned long)S5P_VA_CMU, .virtual = (unsigned long)S5P_VA_CMU,
.pfn = __phys_to_pfn(EXYNOS4_PA_CMU), .pfn = __phys_to_pfn(EXYNOS4_PA_CMU),
.length = SZ_128K, .length = SZ_128K,
...@@ -201,11 +217,80 @@ static struct map_desc exynos4_iodesc1[] __initdata = { ...@@ -201,11 +217,80 @@ static struct map_desc exynos4_iodesc1[] __initdata = {
}, },
}; };
static struct map_desc exynos5_iodesc[] __initdata = {
{
.virtual = (unsigned long)S3C_VA_SYS,
.pfn = __phys_to_pfn(EXYNOS5_PA_SYSCON),
.length = SZ_64K,
.type = MT_DEVICE,
}, {
.virtual = (unsigned long)S3C_VA_TIMER,
.pfn = __phys_to_pfn(EXYNOS5_PA_TIMER),
.length = SZ_16K,
.type = MT_DEVICE,
}, {
.virtual = (unsigned long)S3C_VA_WATCHDOG,
.pfn = __phys_to_pfn(EXYNOS5_PA_WATCHDOG),
.length = SZ_4K,
.type = MT_DEVICE,
}, {
.virtual = (unsigned long)S5P_VA_SROMC,
.pfn = __phys_to_pfn(EXYNOS5_PA_SROMC),
.length = SZ_4K,
.type = MT_DEVICE,
}, {
.virtual = (unsigned long)S5P_VA_SYSTIMER,
.pfn = __phys_to_pfn(EXYNOS5_PA_SYSTIMER),
.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),
.length = 144 * SZ_1K,
.type = MT_DEVICE,
}, {
.virtual = (unsigned long)S5P_VA_PMU,
.pfn = __phys_to_pfn(EXYNOS5_PA_PMU),
.length = SZ_64K,
.type = MT_DEVICE,
}, {
.virtual = (unsigned long)S5P_VA_COMBINER_BASE,
.pfn = __phys_to_pfn(EXYNOS5_PA_COMBINER),
.length = SZ_4K,
.type = MT_DEVICE,
}, {
.virtual = (unsigned long)S3C_VA_UART,
.pfn = __phys_to_pfn(EXYNOS5_PA_UART),
.length = SZ_512K,
.type = MT_DEVICE,
}, {
.virtual = (unsigned long)S5P_VA_GIC_CPU,
.pfn = __phys_to_pfn(EXYNOS5_PA_GIC_CPU),
.length = SZ_64K,
.type = MT_DEVICE,
}, {
.virtual = (unsigned long)S5P_VA_GIC_DIST,
.pfn = __phys_to_pfn(EXYNOS5_PA_GIC_DIST),
.length = SZ_64K,
.type = MT_DEVICE,
},
};
void exynos4_restart(char mode, const char *cmd) void exynos4_restart(char mode, const char *cmd)
{ {
__raw_writel(0x1, S5P_SWRESET); __raw_writel(0x1, S5P_SWRESET);
} }
void exynos5_restart(char mode, const char *cmd)
{
__raw_writel(0x1, EXYNOS_SWRESET);
}
/* /*
* exynos_map_io * exynos_map_io
* *
...@@ -225,7 +310,7 @@ void __init exynos_init_io(struct map_desc *mach_desc, int size) ...@@ -225,7 +310,7 @@ void __init exynos_init_io(struct map_desc *mach_desc, int size)
s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
} }
void __init exynos4_map_io(void) static void __init exynos4_map_io(void)
{ {
iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc)); iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
...@@ -256,7 +341,22 @@ void __init exynos4_map_io(void) ...@@ -256,7 +341,22 @@ void __init exynos4_map_io(void)
s5p_hdmi_setname("exynos4-hdmi"); s5p_hdmi_setname("exynos4-hdmi");
} }
void __init exynos4_init_clocks(int xtal) static void __init exynos5_map_io(void)
{
iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
s3c_device_i2c0.resource[0].start = EXYNOS5_PA_IIC(0);
s3c_device_i2c0.resource[0].end = EXYNOS5_PA_IIC(0) + SZ_4K - 1;
s3c_device_i2c0.resource[1].start = EXYNOS5_IRQ_IIC;
s3c_device_i2c0.resource[1].end = EXYNOS5_IRQ_IIC;
/* The I2C bus controllers are directly compatible with s3c2440 */
s3c_i2c0_setname("s3c2440-i2c");
s3c_i2c1_setname("s3c2440-i2c");
s3c_i2c2_setname("s3c2440-i2c");
}
static void __init exynos4_init_clocks(int xtal)
{ {
printk(KERN_DEBUG "%s: initializing clocks\n", __func__); printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
...@@ -272,6 +372,17 @@ void __init exynos4_init_clocks(int xtal) ...@@ -272,6 +372,17 @@ void __init exynos4_init_clocks(int xtal)
exynos4_setup_clocks(); exynos4_setup_clocks();
} }
static void __init exynos5_init_clocks(int xtal)
{
printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
s3c24xx_register_baseclocks(xtal);
s5p_register_clocks(xtal);
exynos5_register_clocks();
exynos5_setup_clocks();
}
#define COMBINER_ENABLE_SET 0x0 #define COMBINER_ENABLE_SET 0x0
#define COMBINER_ENABLE_CLEAR 0x4 #define COMBINER_ENABLE_CLEAR 0x4
#define COMBINER_INT_STATUS 0xC #define COMBINER_INT_STATUS 0xC
...@@ -345,7 +456,14 @@ static struct irq_chip combiner_chip = { ...@@ -345,7 +456,14 @@ static struct irq_chip combiner_chip = {
static void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq) static void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq)
{ {
if (combiner_nr >= MAX_COMBINER_NR) unsigned int max_nr;
if (soc_is_exynos5250())
max_nr = EXYNOS5_MAX_COMBINER_NR;
else
max_nr = EXYNOS4_MAX_COMBINER_NR;
if (combiner_nr >= max_nr)
BUG(); BUG();
if (irq_set_handler_data(irq, &combiner_data[combiner_nr]) != 0) if (irq_set_handler_data(irq, &combiner_data[combiner_nr]) != 0)
BUG(); BUG();
...@@ -356,8 +474,14 @@ static void __init combiner_init(unsigned int combiner_nr, void __iomem *base, ...@@ -356,8 +474,14 @@ static void __init combiner_init(unsigned int combiner_nr, void __iomem *base,
unsigned int irq_start) unsigned int irq_start)
{ {
unsigned int i; unsigned int i;
unsigned int max_nr;
if (soc_is_exynos5250())
max_nr = EXYNOS5_MAX_COMBINER_NR;
else
max_nr = EXYNOS4_MAX_COMBINER_NR;
if (combiner_nr >= MAX_COMBINER_NR) if (combiner_nr >= max_nr)
BUG(); BUG();
combiner_data[combiner_nr].base = base; combiner_data[combiner_nr].base = base;
...@@ -400,8 +524,28 @@ void __init exynos4_init_irq(void) ...@@ -400,8 +524,28 @@ void __init exynos4_init_irq(void)
of_irq_init(exynos4_dt_irq_match); of_irq_init(exynos4_dt_irq_match);
#endif #endif
for (irq = 0; irq < MAX_COMBINER_NR; irq++) { for (irq = 0; irq < EXYNOS4_MAX_COMBINER_NR; irq++) {
combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq),
COMBINER_IRQ(irq, 0));
combiner_cascade_irq(irq, IRQ_SPI(irq));
}
/*
* The parameters of s5p_init_irq() are for VIC init.
* Theses parameters should be NULL and 0 because EXYNOS4
* uses GIC instead of VIC.
*/
s5p_init_irq(NULL, 0);
}
void __init exynos5_init_irq(void)
{
int irq;
gic_init(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU);
for (irq = 0; irq < EXYNOS5_MAX_COMBINER_NR; irq++) {
combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq),
COMBINER_IRQ(irq, 0)); COMBINER_IRQ(irq, 0));
combiner_cascade_irq(irq, IRQ_SPI(irq)); combiner_cascade_irq(irq, IRQ_SPI(irq));
...@@ -420,19 +564,34 @@ struct bus_type exynos4_subsys = { ...@@ -420,19 +564,34 @@ struct bus_type exynos4_subsys = {
.dev_name = "exynos4-core", .dev_name = "exynos4-core",
}; };
struct bus_type exynos5_subsys = {
.name = "exynos5-core",
.dev_name = "exynos5-core",
};
static struct device exynos4_dev = { static struct device exynos4_dev = {
.bus = &exynos4_subsys, .bus = &exynos4_subsys,
}; };
static int __init exynos4_core_init(void) static struct device exynos5_dev = {
.bus = &exynos5_subsys,
};
static int __init exynos_core_init(void)
{ {
return subsys_system_register(&exynos4_subsys, NULL); if (soc_is_exynos5250())
return subsys_system_register(&exynos5_subsys, NULL);
else
return subsys_system_register(&exynos4_subsys, NULL);
} }
core_initcall(exynos4_core_init); core_initcall(exynos_core_init);
#ifdef CONFIG_CACHE_L2X0 #ifdef CONFIG_CACHE_L2X0
static int __init exynos4_l2x0_cache_init(void) static int __init exynos4_l2x0_cache_init(void)
{ {
if (soc_is_exynos5250())
return 0;
/* TAG, Data Latency Control: 2cycle */ /* TAG, Data Latency Control: 2cycle */
__raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL); __raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL);
...@@ -452,19 +611,47 @@ static int __init exynos4_l2x0_cache_init(void) ...@@ -452,19 +611,47 @@ static int __init exynos4_l2x0_cache_init(void)
return 0; return 0;
} }
early_initcall(exynos4_l2x0_cache_init); early_initcall(exynos4_l2x0_cache_init);
#endif #endif
int __init exynos_init(void) static int __init exynos5_l2_cache_init(void)
{
unsigned int val;
if (!soc_is_exynos5250())
return 0;
asm volatile("mrc p15, 0, %0, c1, c0, 0\n"
"bic %0, %0, #(1 << 2)\n" /* cache disable */
"mcr p15, 0, %0, c1, c0, 0\n"
"mrc p15, 1, %0, c9, c0, 2\n"
: "=r"(val));
val |= (1 << 9) | (1 << 5) | (2 << 6) | (2 << 0);
asm volatile("mcr p15, 1, %0, c9, c0, 2\n" : : "r"(val));
asm volatile("mrc p15, 0, %0, c1, c0, 0\n"
"orr %0, %0, #(1 << 2)\n" /* cache enable */
"mcr p15, 0, %0, c1, c0, 0\n"
: : "r"(val));
return 0;
}
early_initcall(exynos5_l2_cache_init);
static int __init exynos_init(void)
{ {
printk(KERN_INFO "EXYNOS: Initializing architecture\n"); printk(KERN_INFO "EXYNOS: Initializing architecture\n");
return device_register(&exynos4_dev);
if (soc_is_exynos5250())
return device_register(&exynos5_dev);
else
return device_register(&exynos4_dev);
} }
/* uart registration process */ /* uart registration process */
void __init exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no) static void __init exynos_init_uarts(struct s3c2410_uartcfg *cfg, int no)
{ {
struct s3c2410_uartcfg *tcfg = cfg; struct s3c2410_uartcfg *tcfg = cfg;
u32 ucnt; u32 ucnt;
...@@ -472,69 +659,138 @@ void __init exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no) ...@@ -472,69 +659,138 @@ void __init exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no)
for (ucnt = 0; ucnt < no; ucnt++, tcfg++) for (ucnt = 0; ucnt < no; ucnt++, tcfg++)
tcfg->has_fracval = 1; tcfg->has_fracval = 1;
s3c24xx_init_uartdevs("exynos4210-uart", s5p_uart_resources, cfg, no); if (soc_is_exynos5250())
s3c24xx_init_uartdevs("exynos4210-uart", exynos5_uart_resources, cfg, no);
else
s3c24xx_init_uartdevs("exynos4210-uart", exynos4_uart_resources, cfg, no);
} }
static void __iomem *exynos_eint_base;
static DEFINE_SPINLOCK(eint_lock); static DEFINE_SPINLOCK(eint_lock);
static unsigned int eint0_15_data[16]; static unsigned int eint0_15_data[16];
static unsigned int exynos4_get_irq_nr(unsigned int number) static inline int exynos4_irq_to_gpio(unsigned int irq)
{ {
u32 ret = 0; if (irq < IRQ_EINT(0))
return -EINVAL;
switch (number) { irq -= IRQ_EINT(0);
case 0 ... 3: if (irq < 8)
ret = (number + IRQ_EINT0); return EXYNOS4_GPX0(irq);
break;
case 4 ... 7: irq -= 8;
ret = (number + (IRQ_EINT4 - 4)); if (irq < 8)
break; return EXYNOS4_GPX1(irq);
case 8 ... 15:
ret = (number + (IRQ_EINT8 - 8)); irq -= 8;
break; if (irq < 8)
default: return EXYNOS4_GPX2(irq);
printk(KERN_ERR "number available : %d\n", number);
}
return ret; irq -= 8;
if (irq < 8)
return EXYNOS4_GPX3(irq);
return -EINVAL;
} }
static inline void exynos4_irq_eint_mask(struct irq_data *data) static inline int exynos5_irq_to_gpio(unsigned int irq)
{
if (irq < IRQ_EINT(0))
return -EINVAL;
irq -= IRQ_EINT(0);
if (irq < 8)
return EXYNOS5_GPX0(irq);
irq -= 8;
if (irq < 8)
return EXYNOS5_GPX1(irq);
irq -= 8;
if (irq < 8)
return EXYNOS5_GPX2(irq);
irq -= 8;
if (irq < 8)
return EXYNOS5_GPX3(irq);
return -EINVAL;
}
static unsigned int exynos4_eint0_15_src_int[16] = {
EXYNOS4_IRQ_EINT0,
EXYNOS4_IRQ_EINT1,
EXYNOS4_IRQ_EINT2,
EXYNOS4_IRQ_EINT3,
EXYNOS4_IRQ_EINT4,
EXYNOS4_IRQ_EINT5,
EXYNOS4_IRQ_EINT6,
EXYNOS4_IRQ_EINT7,
EXYNOS4_IRQ_EINT8,
EXYNOS4_IRQ_EINT9,
EXYNOS4_IRQ_EINT10,
EXYNOS4_IRQ_EINT11,
EXYNOS4_IRQ_EINT12,
EXYNOS4_IRQ_EINT13,
EXYNOS4_IRQ_EINT14,
EXYNOS4_IRQ_EINT15,
};
static unsigned int exynos5_eint0_15_src_int[16] = {
EXYNOS5_IRQ_EINT0,
EXYNOS5_IRQ_EINT1,
EXYNOS5_IRQ_EINT2,
EXYNOS5_IRQ_EINT3,
EXYNOS5_IRQ_EINT4,
EXYNOS5_IRQ_EINT5,
EXYNOS5_IRQ_EINT6,
EXYNOS5_IRQ_EINT7,
EXYNOS5_IRQ_EINT8,
EXYNOS5_IRQ_EINT9,
EXYNOS5_IRQ_EINT10,
EXYNOS5_IRQ_EINT11,
EXYNOS5_IRQ_EINT12,
EXYNOS5_IRQ_EINT13,
EXYNOS5_IRQ_EINT14,
EXYNOS5_IRQ_EINT15,
};
static inline void exynos_irq_eint_mask(struct irq_data *data)
{ {
u32 mask; u32 mask;
spin_lock(&eint_lock); spin_lock(&eint_lock);
mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); mask = __raw_readl(EINT_MASK(exynos_eint_base, data->irq));
mask |= eint_irq_to_bit(data->irq); mask |= EINT_OFFSET_BIT(data->irq);
__raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); __raw_writel(mask, EINT_MASK(exynos_eint_base, data->irq));
spin_unlock(&eint_lock); spin_unlock(&eint_lock);
} }
static void exynos4_irq_eint_unmask(struct irq_data *data) static void exynos_irq_eint_unmask(struct irq_data *data)
{ {
u32 mask; u32 mask;
spin_lock(&eint_lock); spin_lock(&eint_lock);
mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); mask = __raw_readl(EINT_MASK(exynos_eint_base, data->irq));
mask &= ~(eint_irq_to_bit(data->irq)); mask &= ~(EINT_OFFSET_BIT(data->irq));
__raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); __raw_writel(mask, EINT_MASK(exynos_eint_base, data->irq));
spin_unlock(&eint_lock); spin_unlock(&eint_lock);
} }
static inline void exynos4_irq_eint_ack(struct irq_data *data) static inline void exynos_irq_eint_ack(struct irq_data *data)
{ {
__raw_writel(eint_irq_to_bit(data->irq), __raw_writel(EINT_OFFSET_BIT(data->irq),
S5P_EINT_PEND(EINT_REG_NR(data->irq))); EINT_PEND(exynos_eint_base, data->irq));
} }
static void exynos4_irq_eint_maskack(struct irq_data *data) static void exynos_irq_eint_maskack(struct irq_data *data)
{ {
exynos4_irq_eint_mask(data); exynos_irq_eint_mask(data);
exynos4_irq_eint_ack(data); exynos_irq_eint_ack(data);
} }
static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) static int exynos_irq_eint_set_type(struct irq_data *data, unsigned int type)
{ {
int offs = EINT_OFFSET(data->irq); int offs = EINT_OFFSET(data->irq);
int shift; int shift;
...@@ -571,39 +827,27 @@ static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) ...@@ -571,39 +827,27 @@ static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type)
mask = 0x7 << shift; mask = 0x7 << shift;
spin_lock(&eint_lock); spin_lock(&eint_lock);
ctrl = __raw_readl(S5P_EINT_CON(EINT_REG_NR(data->irq))); ctrl = __raw_readl(EINT_CON(exynos_eint_base, data->irq));
ctrl &= ~mask; ctrl &= ~mask;
ctrl |= newvalue << shift; ctrl |= newvalue << shift;
__raw_writel(ctrl, S5P_EINT_CON(EINT_REG_NR(data->irq))); __raw_writel(ctrl, EINT_CON(exynos_eint_base, data->irq));
spin_unlock(&eint_lock); spin_unlock(&eint_lock);
switch (offs) { if (soc_is_exynos5250())
case 0 ... 7: s3c_gpio_cfgpin(exynos5_irq_to_gpio(data->irq), S3C_GPIO_SFN(0xf));
s3c_gpio_cfgpin(EINT_GPIO_0(offs & 0x7), EINT_MODE); else
break; s3c_gpio_cfgpin(exynos4_irq_to_gpio(data->irq), S3C_GPIO_SFN(0xf));
case 8 ... 15:
s3c_gpio_cfgpin(EINT_GPIO_1(offs & 0x7), EINT_MODE);
break;
case 16 ... 23:
s3c_gpio_cfgpin(EINT_GPIO_2(offs & 0x7), EINT_MODE);
break;
case 24 ... 31:
s3c_gpio_cfgpin(EINT_GPIO_3(offs & 0x7), EINT_MODE);
break;
default:
printk(KERN_ERR "No such irq number %d", offs);
}
return 0; return 0;
} }
static struct irq_chip exynos4_irq_eint = { static struct irq_chip exynos_irq_eint = {
.name = "exynos4-eint", .name = "exynos-eint",
.irq_mask = exynos4_irq_eint_mask, .irq_mask = exynos_irq_eint_mask,
.irq_unmask = exynos4_irq_eint_unmask, .irq_unmask = exynos_irq_eint_unmask,
.irq_mask_ack = exynos4_irq_eint_maskack, .irq_mask_ack = exynos_irq_eint_maskack,
.irq_ack = exynos4_irq_eint_ack, .irq_ack = exynos_irq_eint_ack,
.irq_set_type = exynos4_irq_eint_set_type, .irq_set_type = exynos_irq_eint_set_type,
#ifdef CONFIG_PM #ifdef CONFIG_PM
.irq_set_wake = s3c_irqext_wake, .irq_set_wake = s3c_irqext_wake,
#endif #endif
...@@ -618,12 +862,12 @@ static struct irq_chip exynos4_irq_eint = { ...@@ -618,12 +862,12 @@ static struct irq_chip exynos4_irq_eint = {
* *
* Each EINT pend/mask registers handle eight of them. * Each EINT pend/mask registers handle eight of them.
*/ */
static inline void exynos4_irq_demux_eint(unsigned int start) static inline void exynos_irq_demux_eint(unsigned int start)
{ {
unsigned int irq; unsigned int irq;
u32 status = __raw_readl(S5P_EINT_PEND(EINT_REG_NR(start))); u32 status = __raw_readl(EINT_PEND(exynos_eint_base, start));
u32 mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(start))); u32 mask = __raw_readl(EINT_MASK(exynos_eint_base, start));
status &= ~mask; status &= ~mask;
status &= 0xff; status &= 0xff;
...@@ -635,16 +879,16 @@ static inline void exynos4_irq_demux_eint(unsigned int start) ...@@ -635,16 +879,16 @@ static inline void exynos4_irq_demux_eint(unsigned int start)
} }
} }
static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) static void exynos_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
{ {
struct irq_chip *chip = irq_get_chip(irq); struct irq_chip *chip = irq_get_chip(irq);
chained_irq_enter(chip, desc); chained_irq_enter(chip, desc);
exynos4_irq_demux_eint(IRQ_EINT(16)); exynos_irq_demux_eint(IRQ_EINT(16));
exynos4_irq_demux_eint(IRQ_EINT(24)); exynos_irq_demux_eint(IRQ_EINT(24));
chained_irq_exit(chip, desc); chained_irq_exit(chip, desc);
} }
static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) static void exynos_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
{ {
u32 *irq_data = irq_get_handler_data(irq); u32 *irq_data = irq_get_handler_data(irq);
struct irq_chip *chip = irq_get_chip(irq); struct irq_chip *chip = irq_get_chip(irq);
...@@ -661,27 +905,44 @@ static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) ...@@ -661,27 +905,44 @@ static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
chained_irq_exit(chip, desc); chained_irq_exit(chip, desc);
} }
int __init exynos4_init_irq_eint(void) static int __init exynos_init_irq_eint(void)
{ {
int irq; int irq;
if (soc_is_exynos5250())
exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K);
else
exynos_eint_base = ioremap(EXYNOS4_PA_GPIO2, SZ_4K);
if (exynos_eint_base == NULL) {
pr_err("unable to ioremap for EINT base address\n");
return -ENOMEM;
}
for (irq = 0 ; irq <= 31 ; irq++) { for (irq = 0 ; irq <= 31 ; irq++) {
irq_set_chip_and_handler(IRQ_EINT(irq), &exynos4_irq_eint, irq_set_chip_and_handler(IRQ_EINT(irq), &exynos_irq_eint,
handle_level_irq); handle_level_irq);
set_irq_flags(IRQ_EINT(irq), IRQF_VALID); set_irq_flags(IRQ_EINT(irq), IRQF_VALID);
} }
irq_set_chained_handler(IRQ_EINT16_31, exynos4_irq_demux_eint16_31); irq_set_chained_handler(EXYNOS_IRQ_EINT16_31, exynos_irq_demux_eint16_31);
for (irq = 0 ; irq <= 15 ; irq++) { for (irq = 0 ; irq <= 15 ; irq++) {
eint0_15_data[irq] = IRQ_EINT(irq); eint0_15_data[irq] = IRQ_EINT(irq);
irq_set_handler_data(exynos4_get_irq_nr(irq), if (soc_is_exynos5250()) {
&eint0_15_data[irq]); irq_set_handler_data(exynos5_eint0_15_src_int[irq],
irq_set_chained_handler(exynos4_get_irq_nr(irq), &eint0_15_data[irq]);
exynos4_irq_eint0_15); irq_set_chained_handler(exynos5_eint0_15_src_int[irq],
exynos_irq_eint0_15);
} else {
irq_set_handler_data(exynos4_eint0_15_src_int[irq],
&eint0_15_data[irq]);
irq_set_chained_handler(exynos4_eint0_15_src_int[irq],
exynos_irq_eint0_15);
}
} }
return 0; return 0;
} }
arch_initcall(exynos4_init_irq_eint); arch_initcall(exynos_init_irq_eint);
...@@ -12,30 +12,44 @@ ...@@ -12,30 +12,44 @@
#ifndef __ARCH_ARM_MACH_EXYNOS_COMMON_H #ifndef __ARCH_ARM_MACH_EXYNOS_COMMON_H
#define __ARCH_ARM_MACH_EXYNOS_COMMON_H #define __ARCH_ARM_MACH_EXYNOS_COMMON_H
extern struct sys_timer exynos4_timer;
void exynos_init_io(struct map_desc *mach_desc, int size); void exynos_init_io(struct map_desc *mach_desc, int size);
void exynos4_init_irq(void); void exynos4_init_irq(void);
void exynos5_init_irq(void);
void exynos4_restart(char mode, const char *cmd);
void exynos5_restart(char mode, const char *cmd);
#ifdef CONFIG_ARCH_EXYNOS4
void exynos4_register_clocks(void); void exynos4_register_clocks(void);
void exynos4_setup_clocks(void); void exynos4_setup_clocks(void);
void exynos4210_register_clocks(void); #else
void exynos4212_register_clocks(void); #define exynos4_register_clocks()
#define exynos4_setup_clocks()
#endif
void exynos4_restart(char mode, const char *cmd); #ifdef CONFIG_ARCH_EXYNOS5
void exynos5_register_clocks(void);
void exynos5_setup_clocks(void);
extern struct sys_timer exynos4_timer; #else
#define exynos5_register_clocks()
#define exynos5_setup_clocks()
#endif
#ifdef CONFIG_CPU_EXYNOS4210
void exynos4210_register_clocks(void);
#ifdef CONFIG_ARCH_EXYNOS #else
extern int exynos_init(void); #define exynos4210_register_clocks()
extern void exynos4_map_io(void); #endif
extern void exynos4_init_clocks(int xtal);
extern void exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no); #ifdef CONFIG_SOC_EXYNOS4212
void exynos4212_register_clocks(void);
#else #else
#define exynos4_init_clocks NULL #define exynos4212_register_clocks()
#define exynos4_init_uarts NULL
#define exynos4_map_io NULL
#define exynos_init NULL
#endif #endif
#endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */ #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */
...@@ -242,8 +242,8 @@ static struct resource exynos4_ahci_resource[] = { ...@@ -242,8 +242,8 @@ static struct resource exynos4_ahci_resource[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
.start = IRQ_SATA, .start = EXYNOS4_IRQ_SATA,
.end = IRQ_SATA, .end = EXYNOS4_IRQ_SATA,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
......
...@@ -304,8 +304,8 @@ static struct resource exynos4_ac97_resource[] = { ...@@ -304,8 +304,8 @@ static struct resource exynos4_ac97_resource[] = {
.flags = IORESOURCE_DMA, .flags = IORESOURCE_DMA,
}, },
[4] = { [4] = {
.start = IRQ_AC97, .start = EXYNOS4_IRQ_AC97,
.end = IRQ_AC97, .end = EXYNOS4_IRQ_AC97,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
......
/*
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
* http://www.samsung.com
*
* Base EXYNOS UART resource and device definitions
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/ioport.h>
#include <linux/platform_device.h>
#include <asm/mach/arch.h>
#include <asm/mach/irq.h>
#include <mach/hardware.h>
#include <mach/map.h>
#include <plat/devs.h>
#define EXYNOS_UART_RESOURCE(_series, _nr) \
static struct resource exynos##_series##_uart##_nr##_resource[] = { \
[0] = DEFINE_RES_MEM(EXYNOS##_series##_PA_UART##_nr, EXYNOS##_series##_SZ_UART), \
[1] = DEFINE_RES_IRQ(EXYNOS##_series##_IRQ_UART##_nr), \
};
EXYNOS_UART_RESOURCE(4, 0)
EXYNOS_UART_RESOURCE(4, 1)
EXYNOS_UART_RESOURCE(4, 2)
EXYNOS_UART_RESOURCE(4, 3)
struct s3c24xx_uart_resources exynos4_uart_resources[] __initdata = {
[0] = {
.resources = exynos4_uart0_resource,
.nr_resources = ARRAY_SIZE(exynos4_uart0_resource),
},
[1] = {
.resources = exynos4_uart1_resource,
.nr_resources = ARRAY_SIZE(exynos4_uart1_resource),
},
[2] = {
.resources = exynos4_uart2_resource,
.nr_resources = ARRAY_SIZE(exynos4_uart2_resource),
},
[3] = {
.resources = exynos4_uart3_resource,
.nr_resources = ARRAY_SIZE(exynos4_uart3_resource),
},
};
EXYNOS_UART_RESOURCE(5, 0)
EXYNOS_UART_RESOURCE(5, 1)
EXYNOS_UART_RESOURCE(5, 2)
EXYNOS_UART_RESOURCE(5, 3)
struct s3c24xx_uart_resources exynos5_uart_resources[] __initdata = {
[0] = {
.resources = exynos5_uart0_resource,
.nr_resources = ARRAY_SIZE(exynos5_uart0_resource),
},
[1] = {
.resources = exynos5_uart1_resource,
.nr_resources = ARRAY_SIZE(exynos5_uart0_resource),
},
[2] = {
.resources = exynos5_uart2_resource,
.nr_resources = ARRAY_SIZE(exynos5_uart2_resource),
},
[3] = {
.resources = exynos5_uart3_resource,
.nr_resources = ARRAY_SIZE(exynos5_uart3_resource),
},
};
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/irqs.h> #include <plat/irqs.h>
#include <plat/cpu.h>
#include <mach/map.h> #include <mach/map.h>
#include <mach/irqs.h> #include <mach/irqs.h>
...@@ -36,7 +37,7 @@ ...@@ -36,7 +37,7 @@
static u64 dma_dmamask = DMA_BIT_MASK(32); static u64 dma_dmamask = DMA_BIT_MASK(32);
u8 pdma0_peri[] = { static u8 exynos4210_pdma0_peri[] = {
DMACH_PCM0_RX, DMACH_PCM0_RX,
DMACH_PCM0_TX, DMACH_PCM0_TX,
DMACH_PCM2_RX, DMACH_PCM2_RX,
...@@ -69,15 +70,47 @@ u8 pdma0_peri[] = { ...@@ -69,15 +70,47 @@ u8 pdma0_peri[] = {
DMACH_AC97_PCMOUT, DMACH_AC97_PCMOUT,
}; };
struct dma_pl330_platdata exynos4_pdma0_pdata = { static u8 exynos4212_pdma0_peri[] = {
.nr_valid_peri = ARRAY_SIZE(pdma0_peri), DMACH_PCM0_RX,
.peri_id = pdma0_peri, DMACH_PCM0_TX,
DMACH_PCM2_RX,
DMACH_PCM2_TX,
DMACH_MIPI_HSI0,
DMACH_MIPI_HSI1,
DMACH_SPI0_RX,
DMACH_SPI0_TX,
DMACH_SPI2_RX,
DMACH_SPI2_TX,
DMACH_I2S0S_TX,
DMACH_I2S0_RX,
DMACH_I2S0_TX,
DMACH_I2S2_RX,
DMACH_I2S2_TX,
DMACH_UART0_RX,
DMACH_UART0_TX,
DMACH_UART2_RX,
DMACH_UART2_TX,
DMACH_UART4_RX,
DMACH_UART4_TX,
DMACH_SLIMBUS0_RX,
DMACH_SLIMBUS0_TX,
DMACH_SLIMBUS2_RX,
DMACH_SLIMBUS2_TX,
DMACH_SLIMBUS4_RX,
DMACH_SLIMBUS4_TX,
DMACH_AC97_MICIN,
DMACH_AC97_PCMIN,
DMACH_AC97_PCMOUT,
DMACH_MIPI_HSI4,
DMACH_MIPI_HSI5,
}; };
AMBA_AHB_DEVICE(exynos4_pdma0, "dma-pl330.0", 0x00041330, EXYNOS4_PA_PDMA0, struct dma_pl330_platdata exynos4_pdma0_pdata;
{IRQ_PDMA0}, &exynos4_pdma0_pdata);
static AMBA_AHB_DEVICE(exynos4_pdma0, "dma-pl330.0", 0x00041330,
EXYNOS4_PA_PDMA0, {EXYNOS4_IRQ_PDMA0}, &exynos4_pdma0_pdata);
u8 pdma1_peri[] = { static u8 exynos4210_pdma1_peri[] = {
DMACH_PCM0_RX, DMACH_PCM0_RX,
DMACH_PCM0_TX, DMACH_PCM0_TX,
DMACH_PCM1_RX, DMACH_PCM1_RX,
...@@ -105,19 +138,84 @@ u8 pdma1_peri[] = { ...@@ -105,19 +138,84 @@ u8 pdma1_peri[] = {
DMACH_SLIMBUS5_TX, DMACH_SLIMBUS5_TX,
}; };
struct dma_pl330_platdata exynos4_pdma1_pdata = { static u8 exynos4212_pdma1_peri[] = {
.nr_valid_peri = ARRAY_SIZE(pdma1_peri), DMACH_PCM0_RX,
.peri_id = pdma1_peri, DMACH_PCM0_TX,
DMACH_PCM1_RX,
DMACH_PCM1_TX,
DMACH_MIPI_HSI2,
DMACH_MIPI_HSI3,
DMACH_SPI1_RX,
DMACH_SPI1_TX,
DMACH_I2S0S_TX,
DMACH_I2S0_RX,
DMACH_I2S0_TX,
DMACH_I2S1_RX,
DMACH_I2S1_TX,
DMACH_UART0_RX,
DMACH_UART0_TX,
DMACH_UART1_RX,
DMACH_UART1_TX,
DMACH_UART3_RX,
DMACH_UART3_TX,
DMACH_SLIMBUS1_RX,
DMACH_SLIMBUS1_TX,
DMACH_SLIMBUS3_RX,
DMACH_SLIMBUS3_TX,
DMACH_SLIMBUS5_RX,
DMACH_SLIMBUS5_TX,
DMACH_SLIMBUS0AUX_RX,
DMACH_SLIMBUS0AUX_TX,
DMACH_SPDIF,
DMACH_MIPI_HSI6,
DMACH_MIPI_HSI7,
};
static struct dma_pl330_platdata exynos4_pdma1_pdata;
static AMBA_AHB_DEVICE(exynos4_pdma1, "dma-pl330.1", 0x00041330,
EXYNOS4_PA_PDMA1, {EXYNOS4_IRQ_PDMA1}, &exynos4_pdma1_pdata);
static u8 mdma_peri[] = {
DMACH_MTOM_0,
DMACH_MTOM_1,
DMACH_MTOM_2,
DMACH_MTOM_3,
DMACH_MTOM_4,
DMACH_MTOM_5,
DMACH_MTOM_6,
DMACH_MTOM_7,
}; };
AMBA_AHB_DEVICE(exynos4_pdma1, "dma-pl330.1", 0x00041330, EXYNOS4_PA_PDMA1, static struct dma_pl330_platdata exynos4_mdma1_pdata = {
{IRQ_PDMA1}, &exynos4_pdma1_pdata); .nr_valid_peri = ARRAY_SIZE(mdma_peri),
.peri_id = mdma_peri,
};
static AMBA_AHB_DEVICE(exynos4_mdma1, "dma-pl330.2", 0x00041330,
EXYNOS4_PA_MDMA1, {EXYNOS4_IRQ_MDMA1}, &exynos4_mdma1_pdata);
static int __init exynos4_dma_init(void) static int __init exynos4_dma_init(void)
{ {
if (of_have_populated_dt()) if (of_have_populated_dt())
return 0; return 0;
if (soc_is_exynos4210()) {
exynos4_pdma0_pdata.nr_valid_peri =
ARRAY_SIZE(exynos4210_pdma0_peri);
exynos4_pdma0_pdata.peri_id = exynos4210_pdma0_peri;
exynos4_pdma1_pdata.nr_valid_peri =
ARRAY_SIZE(exynos4210_pdma1_peri);
exynos4_pdma1_pdata.peri_id = exynos4210_pdma1_peri;
} else if (soc_is_exynos4212() || soc_is_exynos4412()) {
exynos4_pdma0_pdata.nr_valid_peri =
ARRAY_SIZE(exynos4212_pdma0_peri);
exynos4_pdma0_pdata.peri_id = exynos4212_pdma0_peri;
exynos4_pdma1_pdata.nr_valid_peri =
ARRAY_SIZE(exynos4212_pdma1_peri);
exynos4_pdma1_pdata.peri_id = exynos4212_pdma1_peri;
}
dma_cap_set(DMA_SLAVE, exynos4_pdma0_pdata.cap_mask); dma_cap_set(DMA_SLAVE, exynos4_pdma0_pdata.cap_mask);
dma_cap_set(DMA_CYCLIC, exynos4_pdma0_pdata.cap_mask); dma_cap_set(DMA_CYCLIC, exynos4_pdma0_pdata.cap_mask);
amba_device_register(&exynos4_pdma0_device, &iomem_resource); amba_device_register(&exynos4_pdma0_device, &iomem_resource);
...@@ -126,6 +224,9 @@ static int __init exynos4_dma_init(void) ...@@ -126,6 +224,9 @@ static int __init exynos4_dma_init(void)
dma_cap_set(DMA_CYCLIC, exynos4_pdma1_pdata.cap_mask); dma_cap_set(DMA_CYCLIC, exynos4_pdma1_pdata.cap_mask);
amba_device_register(&exynos4_pdma1_device, &iomem_resource); amba_device_register(&exynos4_pdma1_device, &iomem_resource);
dma_cap_set(DMA_MEMCPY, exynos4_mdma1_pdata.cap_mask);
amba_device_register(&exynos4_mdma1_device, &iomem_resource);
return 0; return 0;
} }
arch_initcall(exynos4_dma_init); arch_initcall(exynos4_dma_init);
...@@ -21,8 +21,13 @@ ...@@ -21,8 +21,13 @@
*/ */
.macro addruart, rp, rv, tmp .macro addruart, rp, rv, tmp
ldr \rp, = S3C_PA_UART mov \rp, #0x10000000
ldr \rv, = S3C_VA_UART ldr \rp, [\rp, #0x0]
and \rp, \rp, #0xf00000
teq \rp, #0x500000 @@ EXYNOS5
ldreq \rp, =EXYNOS5_PA_UART
movne \rp, #EXYNOS4_PA_UART @@ EXYNOS4
ldr \rv, =S3C_VA_UART
#if CONFIG_DEBUG_S3C_UART != 0 #if CONFIG_DEBUG_S3C_UART != 0
add \rp, \rp, #(0x10000 * CONFIG_DEBUG_S3C_UART) add \rp, \rp, #(0x10000 * CONFIG_DEBUG_S3C_UART)
add \rv, \rv, #(0x10000 * CONFIG_DEBUG_S3C_UART) add \rv, \rv, #(0x10000 * CONFIG_DEBUG_S3C_UART)
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define EXYNOS4_PA_SYSRAM0 0x02025000 #define EXYNOS4_PA_SYSRAM0 0x02025000
#define EXYNOS4_PA_SYSRAM1 0x02020000 #define EXYNOS4_PA_SYSRAM1 0x02020000
#define EXYNOS5_PA_SYSRAM 0x02020000
#define EXYNOS4_PA_FIMC0 0x11800000 #define EXYNOS4_PA_FIMC0 0x11800000
#define EXYNOS4_PA_FIMC1 0x11810000 #define EXYNOS4_PA_FIMC1 0x11810000
...@@ -44,14 +45,23 @@ ...@@ -44,14 +45,23 @@
#define EXYNOS4_PA_ONENAND 0x0C000000 #define EXYNOS4_PA_ONENAND 0x0C000000
#define EXYNOS4_PA_ONENAND_DMA 0x0C600000 #define EXYNOS4_PA_ONENAND_DMA 0x0C600000
#define EXYNOS4_PA_CHIPID 0x10000000 #define EXYNOS_PA_CHIPID 0x10000000
#define EXYNOS4_PA_SYSCON 0x10010000 #define EXYNOS4_PA_SYSCON 0x10010000
#define EXYNOS5_PA_SYSCON 0x10050100
#define EXYNOS4_PA_PMU 0x10020000 #define EXYNOS4_PA_PMU 0x10020000
#define EXYNOS5_PA_PMU 0x10040000
#define EXYNOS4_PA_CMU 0x10030000 #define EXYNOS4_PA_CMU 0x10030000
#define EXYNOS5_PA_CMU 0x10010000
#define EXYNOS4_PA_SYSTIMER 0x10050000 #define EXYNOS4_PA_SYSTIMER 0x10050000
#define EXYNOS5_PA_SYSTIMER 0x101C0000
#define EXYNOS4_PA_WATCHDOG 0x10060000 #define EXYNOS4_PA_WATCHDOG 0x10060000
#define EXYNOS5_PA_WATCHDOG 0x101D0000
#define EXYNOS4_PA_RTC 0x10070000 #define EXYNOS4_PA_RTC 0x10070000
#define EXYNOS4_PA_KEYPAD 0x100A0000 #define EXYNOS4_PA_KEYPAD 0x100A0000
...@@ -59,15 +69,19 @@ ...@@ -59,15 +69,19 @@
#define EXYNOS4_PA_DMC0 0x10400000 #define EXYNOS4_PA_DMC0 0x10400000
#define EXYNOS4_PA_COMBINER 0x10440000 #define EXYNOS4_PA_COMBINER 0x10440000
#define EXYNOS5_PA_COMBINER 0x10440000
#define EXYNOS4_PA_GIC_CPU 0x10480000 #define EXYNOS4_PA_GIC_CPU 0x10480000
#define EXYNOS4_PA_GIC_DIST 0x10490000 #define EXYNOS4_PA_GIC_DIST 0x10490000
#define EXYNOS5_PA_GIC_CPU 0x10480000
#define EXYNOS5_PA_GIC_DIST 0x10490000
#define EXYNOS4_PA_COREPERI 0x10500000 #define EXYNOS4_PA_COREPERI 0x10500000
#define EXYNOS4_PA_TWD 0x10500600 #define EXYNOS4_PA_TWD 0x10500600
#define EXYNOS4_PA_L2CC 0x10502000 #define EXYNOS4_PA_L2CC 0x10502000
#define EXYNOS4_PA_MDMA 0x10810000 #define EXYNOS4_PA_MDMA0 0x10810000
#define EXYNOS4_PA_MDMA1 0x12840000
#define EXYNOS4_PA_PDMA0 0x12680000 #define EXYNOS4_PA_PDMA0 0x12680000
#define EXYNOS4_PA_PDMA1 0x12690000 #define EXYNOS4_PA_PDMA1 0x12690000
...@@ -91,7 +105,6 @@ ...@@ -91,7 +105,6 @@
#define EXYNOS4_PA_SPI1 0x13930000 #define EXYNOS4_PA_SPI1 0x13930000
#define EXYNOS4_PA_SPI2 0x13940000 #define EXYNOS4_PA_SPI2 0x13940000
#define EXYNOS4_PA_GPIO1 0x11400000 #define EXYNOS4_PA_GPIO1 0x11400000
#define EXYNOS4_PA_GPIO2 0x11000000 #define EXYNOS4_PA_GPIO2 0x11000000
#define EXYNOS4_PA_GPIO3 0x03860000 #define EXYNOS4_PA_GPIO3 0x03860000
...@@ -109,6 +122,7 @@ ...@@ -109,6 +122,7 @@
#define EXYNOS4_PA_SATAPHY_CTRL 0x126B0000 #define EXYNOS4_PA_SATAPHY_CTRL 0x126B0000
#define EXYNOS4_PA_SROMC 0x12570000 #define EXYNOS4_PA_SROMC 0x12570000
#define EXYNOS5_PA_SROMC 0x12250000
#define EXYNOS4_PA_EHCI 0x12580000 #define EXYNOS4_PA_EHCI 0x12580000
#define EXYNOS4_PA_OHCI 0x12590000 #define EXYNOS4_PA_OHCI 0x12590000
...@@ -116,6 +130,7 @@ ...@@ -116,6 +130,7 @@
#define EXYNOS4_PA_MFC 0x13400000 #define EXYNOS4_PA_MFC 0x13400000
#define EXYNOS4_PA_UART 0x13800000 #define EXYNOS4_PA_UART 0x13800000
#define EXYNOS5_PA_UART 0x12C00000
#define EXYNOS4_PA_VP 0x12C00000 #define EXYNOS4_PA_VP 0x12C00000
#define EXYNOS4_PA_MIXER 0x12C10000 #define EXYNOS4_PA_MIXER 0x12C10000
...@@ -124,6 +139,7 @@ ...@@ -124,6 +139,7 @@
#define EXYNOS4_PA_IIC_HDMIPHY 0x138E0000 #define EXYNOS4_PA_IIC_HDMIPHY 0x138E0000
#define EXYNOS4_PA_IIC(x) (0x13860000 + ((x) * 0x10000)) #define EXYNOS4_PA_IIC(x) (0x13860000 + ((x) * 0x10000))
#define EXYNOS5_PA_IIC(x) (0x12C60000 + ((x) * 0x10000))
#define EXYNOS4_PA_ADC 0x13910000 #define EXYNOS4_PA_ADC 0x13910000
#define EXYNOS4_PA_ADC1 0x13911000 #define EXYNOS4_PA_ADC1 0x13911000
...@@ -133,8 +149,10 @@ ...@@ -133,8 +149,10 @@
#define EXYNOS4_PA_SPDIF 0x139B0000 #define EXYNOS4_PA_SPDIF 0x139B0000
#define EXYNOS4_PA_TIMER 0x139D0000 #define EXYNOS4_PA_TIMER 0x139D0000
#define EXYNOS5_PA_TIMER 0x12DD0000
#define EXYNOS4_PA_SDRAM 0x40000000 #define EXYNOS4_PA_SDRAM 0x40000000
#define EXYNOS5_PA_SDRAM 0x40000000
/* Compatibiltiy Defines */ /* Compatibiltiy Defines */
...@@ -152,7 +170,6 @@ ...@@ -152,7 +170,6 @@
#define S3C_PA_IIC7 EXYNOS4_PA_IIC(7) #define S3C_PA_IIC7 EXYNOS4_PA_IIC(7)
#define S3C_PA_RTC EXYNOS4_PA_RTC #define S3C_PA_RTC EXYNOS4_PA_RTC
#define S3C_PA_WDT EXYNOS4_PA_WATCHDOG #define S3C_PA_WDT EXYNOS4_PA_WATCHDOG
#define S3C_PA_UART EXYNOS4_PA_UART
#define S3C_PA_SPI0 EXYNOS4_PA_SPI0 #define S3C_PA_SPI0 EXYNOS4_PA_SPI0
#define S3C_PA_SPI1 EXYNOS4_PA_SPI1 #define S3C_PA_SPI1 EXYNOS4_PA_SPI1
#define S3C_PA_SPI2 EXYNOS4_PA_SPI2 #define S3C_PA_SPI2 EXYNOS4_PA_SPI2
...@@ -181,15 +198,18 @@ ...@@ -181,15 +198,18 @@
/* Compatibility UART */ /* Compatibility UART */
#define S3C_VA_UARTx(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET)) #define EXYNOS4_PA_UART0 0x13800000
#define EXYNOS4_PA_UART1 0x13810000
#define EXYNOS4_PA_UART2 0x13820000
#define EXYNOS4_PA_UART3 0x13830000
#define EXYNOS4_SZ_UART SZ_256
#define S5P_PA_UART(x) (EXYNOS4_PA_UART + ((x) * S3C_UART_OFFSET)) #define EXYNOS5_PA_UART0 0x12C00000
#define S5P_PA_UART0 S5P_PA_UART(0) #define EXYNOS5_PA_UART1 0x12C10000
#define S5P_PA_UART1 S5P_PA_UART(1) #define EXYNOS5_PA_UART2 0x12C20000
#define S5P_PA_UART2 S5P_PA_UART(2) #define EXYNOS5_PA_UART3 0x12C30000
#define S5P_PA_UART3 S5P_PA_UART(3) #define EXYNOS5_SZ_UART SZ_256
#define S5P_PA_UART4 S5P_PA_UART(4)
#define S5P_SZ_UART SZ_256 #define S3C_VA_UARTx(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET))
#endif /* __ASM_ARCH_MAP_H */ #endif /* __ASM_ARCH_MAP_H */
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#define S5P_USE_STANDBYWFE_ISP_ARM (1 << 26) #define S5P_USE_STANDBYWFE_ISP_ARM (1 << 26)
#define S5P_SWRESET S5P_PMUREG(0x0400) #define S5P_SWRESET S5P_PMUREG(0x0400)
#define EXYNOS_SWRESET S5P_PMUREG(0x0400)
#define S5P_WAKEUP_STAT S5P_PMUREG(0x0600) #define S5P_WAKEUP_STAT S5P_PMUREG(0x0600)
#define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604) #define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604)
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册