ARM: EXYNOS: add support for new EXYNOS5440 SoC
Subsystems (8)
cover ARM: EXYNOS: add support for new EXYNOS5440 SoC
This is for adding support EXYNOS5440 SoC which is including Cortex-A15 Quad cores and SSDK5440 board.
Note: this is based on Samsung common clk work and 3rd patch for uart is wip.
[PATCH 1/7] ARM: EXYNOS: add support for EXYNOS5440 SoC
[PATCH 2/7] clk: exynos5440: add common clock support for Samsung EXYNOS5440 [PATCH 3/7] ARM: EXYNOS: add support uart for EXYNOS SoCs - WIP [PATCH 4/7] ARM: dts: add initial dts file for EXYNOS5440, SSDK5440 [PATCH 5/7] ARM: dts: add clock controller node for Samsung EXYNOS5440 [PATCH 6/7] pinctrl: exynos5440: add pinctrl driver for Samsung EXYNOS5440 SoC [PATCH 7/7] ARM: dts: Add pin controller node for Samsung EXYNOS5440 SoC
Kukjin Kim (3):
ARM: EXYNOS: add support for EXYNOS5440 SoC
ARM: EXYNOS: add support uart for EXYNOS SoCs - WIP
ARM: dts: add initial dts file for EXYNOS5440, SSDK5440
Thomas Abraham (4):
clk: exynos5440: add common clock support for Samsung EXYNOS5440
ARM: dts: add clock controller node for Samsung EXYNOS5440
pinctrl: exynos5440: add pinctrl driver for Samsung EXYNOS5440 SoC
ARM: dts: Add pin controller node for Samsung EXYNOS5440 SoC
arch/arm/boot/dts/exynos5440-clock.dtsi | 143 ++++ arch/arm/boot/dts/exynos5440-ssdk5440.dts | 49 ++ arch/arm/boot/dts/exynos5440.dtsi | 159 +++++ arch/arm/mach-exynos/Kconfig | 20 + arch/arm/mach-exynos/Makefile | 3 +- arch/arm/mach-exynos/common.c | 85 +++- arch/arm/mach-exynos/common.h | 2 + arch/arm/mach-exynos/dev-uart.c | 14 + arch/arm/mach-exynos/include/mach/irqs.h | 5 + arch/arm/mach-exynos/include/mach/map.h | 8 + arch/arm/mach-exynos/include/mach/regs-pmu.h | 1 + arch/arm/mach-exynos/mach-exynos5-dt.c | 34 +- arch/arm/mach-exynos/mct.c | 15 + arch/arm/mach-exynos/setup-i2c0.c | 2 +- arch/arm/plat-samsung/include/plat/cpu.h | 8 + arch/arm/plat-samsung/include/plat/devs.h | 1 + drivers/clk/samsung/Makefile | 1 + drivers/clk/samsung/clk-exynos5440.c | 66 ++ drivers/pinctrl/Kconfig | 5 + drivers/pinctrl/Makefile | 1 + drivers/pinctrl/pinctrl-exynos5440.c | 919 ++++++++++++++++++++++++++ drivers/tty/serial/samsung.c | 3 +- 22 files changed, 1527 insertions(+), 17 deletions(-)
PATCH 1/7 ARM: EXYNOS: add support for EXYNOS5440 SoC
This patch adds support for EXYNOS5440 SoC which is including Cortex-A15 Quad cores.
--- arch/arm/mach-exynos/Kconfig | 20 ++++++ arch/arm/mach-exynos/Makefile | 3 +- arch/arm/mach-exynos/common.c | 85 ++++++++++++++++++++++++-- arch/arm/mach-exynos/common.h | 2 + arch/arm/mach-exynos/dev-uart.c | 14 ++++ arch/arm/mach-exynos/include/mach/irqs.h | 5 ++ arch/arm/mach-exynos/include/mach/map.h | 8 +++ arch/arm/mach-exynos/include/mach/regs-pmu.h | 1 + arch/arm/mach-exynos/mach-exynos5-dt.c | 34 ++++++++--- arch/arm/mach-exynos/mct.c | 15 +++++ arch/arm/mach-exynos/setup-i2c0.c | 2 +- arch/arm/plat-samsung/include/plat/cpu.h | 8 +++ arch/arm/plat-samsung/include/plat/devs.h | 1 + drivers/tty/serial/samsung.c | 3 +- 14 files changed, 184 insertions(+), 17 deletions(-)
arch/arm/mach-exynos/Kconfig +20 -0
@@ -68,6 +68,16 @@ config SOC_EXYNOS5250 help Enable EXYNOS5250 SoC support +config SOC_EXYNOS5440 + bool "SAMSUNG EXYNOS5440" + default y + depends on ARCH_EXYNOS5 + select ARM_ARCH_TIMER + select AUTO_ZRELADDR + select COMMON_CLK + help + Enable EXYNOS5440 SoC support + config EXYNOS4_MCT bool default y
@@ -426,6 +436,16 @@ config MACH_EXYNOS5_DT Machine support for Samsung EXYNOS5 machine with device tree enabled. Select this if a fdt blob is available for the EXYNOS5 SoC based board. +config MACH_EXYNOS5440_DT + bool "SAMSUNG EXYNOS5440 Machine using device tree" + depends on ARCH_EXYNOS5 + select ARM_AMBA + select SOC_EXYNOS5440 + select USE_OF + help + Machine support for Samsung EXYNOS5440 machine with device tree enabled. + Select this if a fdt blob is available for the EXYNOS5440 SoC based board. + if ARCH_EXYNOS4 comment "Configuration for HSMMC 8-bit bus width"
arch/arm/mach-exynos/Makefile +2 -1
@@ -13,7 +13,7 @@ obj- := # Core obj-$(CONFIG_ARCH_EXYNOS) += common.o -obj-$(CONFIG_ARCH_EXYNOS5) += clock-exynos5.o +obj-$(CONFIG_SOC_EXYNOS5250) += clock-exynos5.o obj-$(CONFIG_PM) += pm.o obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
@@ -41,6 +41,7 @@ obj-$(CONFIG_MACH_SMDK4412) += mach-smdk4x12.o obj-$(CONFIG_MACH_EXYNOS4_DT) += mach-exynos4-dt.o obj-$(CONFIG_MACH_EXYNOS5_DT) += mach-exynos5-dt.o +obj-$(CONFIG_MACH_EXYNOS5440_DT) += mach-exynos5-dt.o # device support
arch/arm/mach-exynos/common.c +80 -5
164 lines not on this page · raw message
arch/arm/mach-exynos/common.h +2 -0
@@ -13,9 +13,11 @@#define __ARCH_ARM_MACH_EXYNOS_COMMON_Hextern struct sys_timer exynos4_timer; +extern struct sys_timer exynos5_timer;struct map_desc ;void exynos_init_io (struct map_desc *mach_desc,int size); +void exynos5440_init_io (struct map_desc *mach_desc,int size);void exynos4_init_irq (void );void exynos5_init_irq (void );void exynos4_restart (char mode,const char *cmd);
arch/arm/mach-exynos/dev-uart.c +14 -0
@@ -76,3 +76,17 @@ struct s3c24xx_uart_resources exynos5_uart_resources[] __initdata = { .nr_resources = ARRAY_SIZE(exynos5_uart3_resource), }, }; + +EXYNOS_UART_RESOURCE(5440, 0) +EXYNOS_UART_RESOURCE(5440, 1) + +struct s3c24xx_uart_resources exynos5440_uart_resources[]__initdata = { + [0 ] = { + .resources = exynos5440_uart0_resource, + .nr_resources =ARRAY_SIZE (exynos5440_uart0_resource), + }, + [1 ] = { + .resources = exynos5440_uart1_resource, + .nr_resources =ARRAY_SIZE (exynos5440_uart0_resource), + }, +};
arch/arm/mach-exynos/include/mach/irqs.h +5 -0
@@ -333,6 +333,11 @@#define EXYNOS5_IRQ_FIMC_LITE1 IRQ_SPI(126)#define EXYNOS5_IRQ_RP_TIMER IRQ_SPI(127) +/* EXYNOS5440 */ + +#define EXYNOS5440_IRQ_UART0 IRQ_SPI(2) +#define EXYNOS5440_IRQ_UART1 IRQ_SPI(3) +#define EXYNOS5_IRQ_PMU COMBINER_IRQ(1, 2)#define EXYNOS5_IRQ_SYSMMU_GSC0_0 COMBINER_IRQ(2, 0)
arch/arm/mach-exynos/include/mach/map.h +8 -0
@@ -53,12 +53,14 @@#define EXYNOS4_PA_ONENAND_DMA 0x0C600000#define EXYNOS_PA_CHIPID 0x10000000 +#define EXYNOS5440_PA_CHIPID 0x00160000#define EXYNOS4_PA_SYSCON 0x10010000#define EXYNOS5_PA_SYSCON 0x10050100#define EXYNOS4_PA_PMU 0x10020000#define EXYNOS5_PA_PMU 0x10040000 +#define EXYNOS5440_PA_PMU 0x00160000#define EXYNOS4_PA_CMU 0x10030000#define EXYNOS5_PA_CMU 0x10010000
@@ -83,6 +85,8 @@#define EXYNOS4_PA_GIC_DIST 0x10490000#define EXYNOS5_PA_GIC_CPU 0x10482000#define EXYNOS5_PA_GIC_DIST 0x10481000 +#define EXYNOS5440_PA_GIC_CPU 0x002E2000 +#define EXYNOS5440_PA_GIC_DIST 0x002E1000#define EXYNOS4_PA_COREPERI 0x10500000#define EXYNOS4_PA_TWD 0x10500600
@@ -281,6 +285,10 @@#define EXYNOS5_PA_UART3 0x12C30000#define EXYNOS5_SZ_UART SZ_256 +#define EXYNOS5440_PA_UART0 0x000B0000 +#define EXYNOS5440_PA_UART1 0x000C0000 +#define EXYNOS5440_SZ_UART SZ_256 +#define S3C_VA_UARTx (x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET))#endif /* __ASM_ARCH_MAP_H */
arch/arm/mach-exynos/include/mach/regs-pmu.h +1 -0
@@ -31,6 +31,7 @@#define S5P_SWRESET S5P_PMUREG(0x0400)#define EXYNOS_SWRESET S5P_PMUREG(0x0400) +#define EXYNOS5440_SWRESET S5P_PMUREG(0x00C4)#define S5P_WAKEUP_STAT S5P_PMUREG(0x0600)#define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604)
arch/arm/mach-exynos/mach-exynos5-dt.c +25 -9
@@ -75,20 +75,24 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = { {}, }; -static void __init exynos5250_dt_map_io (void ) +static void __init exynos5_dt_map_io (void ) {exynos_init_io (NULL ,0 ); -s3c24xx_init_clocks (24000000 ); + +if (of_machine_is_compatible ("samsung,exynos5250" )) +s3c24xx_init_clocks (24000000 ); } -static void __init exynos5250_dt_machine_init (void ) +static void __init exynos5_dt_machine_init (void ) { -of_platform_populate (NULL , of_default_bus_match_table, - exynos5250_auxdata_lookup,NULL ); +if (of_machine_is_compatible ("samsung,exynos5250" )) +of_platform_populate (NULL , of_default_bus_match_table, + exynos5250_auxdata_lookup,NULL ); } -static char const *exynos5250_dt_compat[]__initdata = { +static char const *exynos5_dt_compat[]__initdata = {"samsung,exynos5250" , +"samsung,exynos5440" ,NULL };
@@ -96,11 +100,23 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")/* Maintainer: Kukjin Kim <[email protected]> */ .init_irq = exynos5_init_irq, .smp = smp_ops(exynos_smp_ops), - .map_io = exynos5250_dt_map_io, + .map_io = exynos5_dt_map_io, .handle_irq = gic_handle_irq, - .init_machine = exynos5250_dt_machine_init, + .init_machine = exynos5_dt_machine_init, .init_late = exynos_init_late, .timer = &exynos4_timer, - .dt_compat = exynos5250_dt_compat, + .dt_compat = exynos5_dt_compat, + .restart = exynos5_restart, +MACHINE_END + +DT_MACHINE_START (EXYNOS5440_DT ,"SAMSUNG EXYNOS5440 (Flattened Device Tree)" ) +/* Maintainer: Kukjin Kim <[email protected]> */ + .init_irq = exynos5_init_irq, + .smp = smp_ops(exynos_smp_ops), + .map_io = exynos5_dt_map_io, + .handle_irq = gic_handle_irq, + .init_machine = exynos5_dt_machine_init, + .timer = &exynos5_timer, + .dt_compat = exynos5_dt_compat, .restart = exynos5_restart,MACHINE_END
arch/arm/mach-exynos/mct.c +15 -0
@@ -19,7 +19,9 @@#include <linux/platform_device.h> #include <linux/delay.h> #include <linux/percpu.h> +#include <linux/of.h> +#include <asm/arch_timer.h> #include <asm/hardware/gic.h> #include <asm/localtimer.h>
@@ -487,6 +489,9 @@ static void __init exynos4_timer_init(void)exynos4x12_clk_init ();#endif +if (of_machine_is_compatible ("samsung,exynos5440" )) +arch_timer_of_register (); +if ((soc_is_exynos4210 ()) || (soc_is_exynos5250 ())) mct_int_type =MCT_INT_SPI ;else
@@ -500,3 +505,13 @@ static void __init exynos4_timer_init(void)struct sys_timer exynos4_timer = { .init = exynos4_timer_init, }; + +static void __init exynos5_timer_init (void ) +{ +if (of_machine_is_compatible ("samsung,exynos5440" )) +arch_timer_of_register (); +} + +struct sys_timer exynos5_timer = { + .init = exynos5_timer_init, +};
arch/arm/mach-exynos/setup-i2c0.c +1 -1
@@ -20,7 +20,7 @@ struct platform_device; /* don't need the contents */void s3c_i2c0_cfg_gpio (struct platform_device *dev) { -if (soc_is_exynos5250 ()) +if (soc_is_exynos5250 () ||soc_is_exynos5440 ())/* will be implemented with gpio function */ return ;
arch/arm/plat-samsung/include/plat/cpu.h +8 -0
@@ -43,6 +43,7 @@ extern unsigned long samsung_cpu_id;#define EXYNOS4_CPU_MASK 0xFFFE0000#define EXYNOS5250_SOC_ID 0x43520000 +#define EXYNOS5440_SOC_ID 0x54400000#define EXYNOS5_SOC_MASK 0xFFFFF000#define IS_SAMSUNG_CPU (name, id, mask) \
@@ -62,6 +63,7 @@ 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(exynos5440, EXYNOS5440_SOC_ID, EXYNOS5_SOC_MASK) #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2412) || \ defined(CONFIG_CPU_S3C2416) || defined(CONFIG_CPU_S3C2440) || \
@@ -130,6 +132,12 @@ IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK)# define soc_is_exynos5250 () 0#endif +#if defined(CONFIG_SOC_EXYNOS5440 ) +# define soc_is_exynos5440 () is_samsung_exynos5440() +#else +# define soc_is_exynos5440 () 0 +#endif +#define IODESC_ENT (x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }#ifndef KHZ
arch/arm/plat-samsung/include/plat/devs.h +1 -0
@@ -28,6 +28,7 @@ extern struct s3c24xx_uart_resources s3c64xx_uart_resources[];extern struct s3c24xx_uart_resources s5p_uart_resources[];extern struct s3c24xx_uart_resources exynos4_uart_resources[];extern struct s3c24xx_uart_resources exynos5_uart_resources[]; +extern struct s3c24xx_uart_resources exynos5440_uart_resources[];extern struct platform_device *s3c24xx_uart_devs[];extern struct platform_device *s3c24xx_uart_src[];
drivers/tty/serial/samsung.c +2 -1
@@ -1646,7 +1646,8 @@ static struct s3c24xx_serial_drv_data s5pv210_serial_drv_data = {#endif #if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS4212) || \ - defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250) + defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250) || \ + defined(CONFIG_SOC_EXYNOS5440) static struct s3c24xx_serial_drv_data exynos4210_serial_drv_data = { .info = &(struct s3c24xx_uart_info) { .name = "Samsung Exynos4 UART",
Signature · 1 line
1.7.4.4
PATCH 1/7 ARM: EXYNOS: add support for EXYNOS5440 SoC
Hi Kgene,
Please see my comments inline.
Quoted 162 lines · On Saturday 27 of October 2012 02:55:48 Kukjin Kim wrote:
This patch adds support for EXYNOS5440 SoC which is including Cortex-A15 Quad cores.
Signed-off-by Kukjin Kim <[email protected]>--- arch/arm/mach-exynos/Kconfig | 20 ++++++ arch/arm/mach-exynos/Makefile | 3 +- arch/arm/mach-exynos/common.c | 85 ++++++++++++++++++++++++-- arch/arm/mach-exynos/common.h | 2 + arch/arm/mach-exynos/dev-uart.c | 14 ++++ arch/arm/mach-exynos/include/mach/irqs.h | 5 ++ arch/arm/mach-exynos/include/mach/map.h | 8 +++ arch/arm/mach-exynos/include/mach/regs-pmu.h | 1 + arch/arm/mach-exynos/mach-exynos5-dt.c | 34 ++++++++--- arch/arm/mach-exynos/mct.c | 15 +++++ arch/arm/mach-exynos/setup-i2c0.c | 2 +- arch/arm/plat-samsung/include/plat/cpu.h | 8 +++ arch/arm/plat-samsung/include/plat/devs.h | 1 + drivers/tty/serial/samsung.c | 3 +- 14 files changed, 184 insertions(+), 17 deletions(-)arch/arm/mach-exynos/Kconfig +10
-0@@ -68,6 +68,16 @@ config SOC_EXYNOS5250 help Enable EXYNOS5250 SoC support +config SOC_EXYNOS5440 + bool "SAMSUNG EXYNOS5440" + default y + depends on ARCH_EXYNOS5 + select ARM_ARCH_TIMER + select AUTO_ZRELADDR + select COMMON_CLK + help + Enable EXYNOS5440 SoC support + config EXYNOS4_MCT bool default y@@ -426,6 +436,16 @@ config MACH_EXYNOS5_DT Machine support for Samsung EXYNOS5 machine with device treeenabled. Select this if a fdt blob is available for the EXYNOS5 SoC based board.
arch/arm/mach-exynos/Kconfig +8
-0+config MACH_EXYNOS5440_DT + bool "SAMSUNG EXYNOS5440 Machine using device tree" + depends on ARCH_EXYNOS5 + select ARM_AMBA + select SOC_EXYNOS5440 + select USE_OF + help + Machine support for Samsung EXYNOS5440 machine with device treeenabled. + Select this if a fdt blob is available for the EXYNOS5440
SoC based board. +
ifARCH_EXYNOS4comment "Configuration for HSMMC 8-bit bus width"
(quoted diff) +0
-0b/arch/arm/mach-exynos/Makefile index ad66c9f4..92df758 100644
arch/arm/mach-exynos/Makefile +2
-1@@ -13,7 +13,7 @@ obj- := # Core obj-$(CONFIG_ARCH_EXYNOS) += common.o -obj-$(CONFIG_ARCH_EXYNOS5) += clock-exynos5.o +obj-$(CONFIG_SOC_EXYNOS5250) += clock-exynos5.o obj-$(CONFIG_PM) += pm.o obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o@@ -41,6 +41,7 @@ obj-$(CONFIG_MACH_SMDK4412) += mach-smdk4x12.o obj-$(CONFIG_MACH_EXYNOS4_DT) += mach-exynos4-dt.o obj-$(CONFIG_MACH_EXYNOS5_DT) += mach-exynos5-dt.o +obj-$(CONFIG_MACH_EXYNOS5440_DT) += mach-exynos5-dt.o # device support(quoted diff) +0
-0
b/arch/arm/mach-exynos/common.cindex fea1542..786d8f4 100644arch/arm/mach-exynos/common.c +40
-1@@ -57,9 +57,11 @@ static const char name_exynos4210[] = "EXYNOS4210";static const char name_exynos4212[] ="EXYNOS4212" ;static const char name_exynos4412[] ="EXYNOS4412" ;static const char name_exynos5250[] ="EXYNOS5250" ; +static const char name_exynos5440[] ="EXYNOS5440" ;static void exynos4_map_io (void );static void exynos5_map_io (void ); +static void exynos5440_map_io (void );static void exynos5_init_clocks (int xtal);static void exynos_init_uarts (struct s3c2410_uartcfg *cfg,int no);static int exynos_init (void );@@ -94,6 +96,13 @@ static struct cpu_table cpu_ids[] __initdata = { .init_uarts = exynos_init_uarts, .init = exynos_init, .name = name_exynos5250, + }, { + .idcode = EXYNOS5440_SOC_ID, + .idmask = EXYNOS5_SOC_MASK, + .map_io = exynos5440_map_io, + .init_uarts = exynos_init_uarts, + .init = exynos_init, + .name = name_exynos5440, }, };@@ -108,6 +117,15 @@ static struct map_desc exynos_iodesc[] __initdata = { }, }; +static struct map_desc exynos5440_iodesc[]__initdata = { + { + .virtual = (unsigned long )S5P_VA_CHIPID , + .pfn =__phys_to_pfn (EXYNOS5440_PA_CHIPID ), + .length =SZ_4K , + .type =MT_DEVICE , + }, +}; +static struct map_desc exynos4_iodesc[]__initdata = { { .virtual = (unsigned long )S3C_VA_SYS ,@@ -274,6 +292,25 @@ static struct map_desc exynos5_iodesc[] __initdata = { }, }; +static struct map_desc exynos5440_iodesc0[]__initdata = { + { + .virtual = (unsigned long )S3C_VA_UART , + .pfn =__phys_to_pfn (EXYNOS5440_PA_UART0 ), + .length =SZ_512K , + .type =MT_DEVICE , + }, { + .virtual = (unsigned long )S5P_VA_GIC_CPU , + .pfn =__phys_to_pfn (EXYNOS5440_PA_GIC_CPU ), + .length =SZ_64K , + .type =MT_DEVICE , + }, { + .virtual = (unsigned long )S5P_VA_GIC_DIST , + .pfn =__phys_to_pfn (EXYNOS5440_PA_GIC_DIST ), + .length =SZ_64K , + .type =MT_DEVICE , + }, +}; +void exynos4_restart (char mode,const char *cmd) {__raw_writel (0x1 ,S5P_SWRESET );@@ -281,11 +318,29 @@ void exynos4_restart(char mode, const char *cmd)void exynos5_restart (char mode,const char *cmd) { -__raw_writel (0x1 ,EXYNOS_SWRESET ); +u32 val; +void __iomem *addr; +
arch/arm/mach-exynos/common.c void exynos4_restart(char mode, const char *cmd) · line 333
Quoted 10 lines
arch/arm/mach-exynos/common.c +10
-0+if (of_machine_is_compatible ("samsung,exynos5250" )) { + val =0x1 ; + addr =EXYNOS_SWRESET ; + }else if (of_machine_is_compatible ("samsung,exynos5440" )) { + val = (0x10 <<20 ) | (0x1 <<16 ); + addr =EXYNOS5440_SWRESET ; + }else { +pr_err ("%s: cannot support non-DT\n" , __func__); +return ; + }
Why soc_is_XXX isn't used here? It should be faster and more correct than of_machine_is_compatible.
I can imagine the same board available with two different SoCs, for which of_machine_is_compatible wouldn't work.
arch/arm/mach-exynos/common.c void exynos4_restart(char mode, const char *cmd) · line 342
Quoted 9 lines
arch/arm/mach-exynos/common.c +5
-0+ +__raw_writel (val, addr); }void __init exynos_init_late (void ) { +if (of_machine_is_compatible ("samsung,exynos5440" )) +/* to be supported later */ +return ;
Same here.
arch/arm/mach-exynos/common.c void __init exynos_init_late(void) · line 360
Quoted 13 lines
arch/arm/mach-exynos/common.c +5
-1exynos_pm_late_initcall (); }@@ -298,7 +353,11 @@ void __init exynos_init_late(void)void __init exynos_init_io (struct map_desc *mach_desc,int size) {/* initialize the io descriptors we need for initialization */ -iotable_init (exynos_iodesc,ARRAY_SIZE (exynos_iodesc)); +if (of_machine_is_compatible ("samsung,exynos5440" )) +iotable_init (exynos5440_iodesc,ARRAY_SIZE (exynos5440_iodesc)); +else +iotable_init (exynos_iodesc,ARRAY_SIZE (exynos_iodesc)); +
Same here.
Quoted 28 lines
arch/arm/mach-exynos/common.c +10
-0if (mach_desc)iotable_init (mach_desc, size);@@ -364,6 +423,11 @@ static void __init exynos5_map_io(void)s3c_i2c2_setname ("s3c2440-i2c" ); } +static void __init exynos5440_map_io (void ) +{ +iotable_init (exynos5440_iodesc0,ARRAY_SIZE (exynos5440_iodesc0)); +} +static void __init exynos5_init_clocks (int xtal) {printk (KERN_DEBUG "%s: initializing clocks\n" , __func__);@@ -587,6 +651,11 @@ static const struct of_device_id exynos4_dt_irq_match[] = { .data = combiner_of_init, }, {}, }; + +static const struct of_device_id exynos5440_dt_irq_match[] = { + { .compatible ="arm,cortex-a15-gic" , .data = gic_of_init, }, + {}, +};#endif void __init exynos4_init_irq (void )
arch/arm/mach-exynos/common.c void __init exynos4_init_irq(void) · line 691
Quoted 8 lines
arch/arm/mach-exynos/common.c +4
-1@@ -616,14 +685,18 @@ void __init exynos4_init_irq(void)void __init exynos5_init_irq (void ) {#ifdef CONFIG_OF -of_irq_init (exynos4_dt_irq_match); +if (soc_is_exynos5440 ()) +of_irq_init (exynos5440_dt_irq_match); +else +of_irq_init (exynos4_dt_irq_match);
This looks much better.
Quoted 145 lines
arch/arm/mach-exynos/common.c +4
-2#endif /* * 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 ); +if (!soc_is_exynos5440 ()) +s5p_init_irq (NULL ,0 ); }struct bus_type exynos_subsys = {@@ -646,7 +719,7 @@ static int __init exynos4_l2x0_cache_init(void) {int ret; -if (soc_is_exynos5250 ()) +if (soc_is_exynos5250 () ||soc_is_exynos5440 ())return 0 ; ret =l2x0_of_init (L2_AUX_VAL ,L2_AUX_MASK );@@ -714,6 +787,8 @@ static void __init exynos_init_uarts(struct s3c2410_uartcfg *cfg, int no) if (soc_is_exynos5250()) s3c24xx_init_uartdevs("exynos4210-uart", exynos5_uart_resources, cfg, no); + else if (soc_is_exynos5440()) + s3c24xx_init_uartdevs("exynos4210-uart", exynos5440_uart_resources,cfg, no); else
s3c24xx_init_uartdevs("exynos4210-uart",exynos4_uart_resources, cfg,
no); }(quoted diff) +0
-0
b/arch/arm/mach-exynos/common.hindex 7a4e0ea..99b88f8 100644arch/arm/mach-exynos/common.h +2
-0@@ -13,9 +13,11 @@#define __ARCH_ARM_MACH_EXYNOS_COMMON_Hextern struct sys_timer exynos4_timer; +extern struct sys_timer exynos5_timer;struct map_desc ;void exynos_init_io (struct map_desc *mach_desc,int size); +void exynos5440_init_io (struct map_desc *mach_desc,int size);void exynos4_init_irq (void );void exynos5_init_irq (void );void exynos4_restart (char mode,const char *cmd);(quoted diff) +0
-0
b/arch/arm/mach-exynos/dev-uart.cindex 2e85c02..95b887f 100644arch/arm/mach-exynos/dev-uart.c +0
-0@@ -76,3 +76,17 @@ struct s3c24xx_uart_resourcesexynos5_uart_resources[]
__initdata= { .nr_resources =ARRAY_SIZE(exynos5_uart3_resource),arch/arm/mach-exynos/dev-uart.c +5
-0}, }; + +EXYNOS_UART_RESOURCE(5440, 0) +EXYNOS_UART_RESOURCE(5440, 1) + +struct s3c24xx_uart_resources exynos5440_uart_resources[] __initdata ={ + [0] = {
arch/arm/mach-exynos/dev-uart.c +8
-0+ .resources = exynos5440_uart0_resource, + .nr_resources = ARRAY_SIZE(exynos5440_uart0_resource), + }, + [1] = { + .resources = exynos5440_uart1_resource, + .nr_resources = ARRAY_SIZE(exynos5440_uart0_resource), + }, +};(quoted diff) +0
-0
b/arch/arm/mach-exynos/include/mach/irqs.hindex 35bced6..f43a96c 100644arch/arm/mach-exynos/include/mach/irqs.h +5
-0@@ -333,6 +333,11 @@#define EXYNOS5_IRQ_FIMC_LITE1 IRQ_SPI(126)#define EXYNOS5_IRQ_RP_TIMER IRQ_SPI(127) +/* EXYNOS5440 */ + +#define EXYNOS5440_IRQ_UART0 IRQ_SPI(2) +#define EXYNOS5440_IRQ_UART1 IRQ_SPI(3) +#define EXYNOS5_IRQ_PMU COMBINER_IRQ(1, 2)#define EXYNOS5_IRQ_SYSMMU_GSC0_0 COMBINER_IRQ(2, 0)(quoted diff) +0
-0
b/arch/arm/mach-exynos/include/mach/map.hindex 8480849..d0602d3 100644arch/arm/mach-exynos/include/mach/map.h +8
-0@@ -53,12 +53,14 @@#define EXYNOS4_PA_ONENAND_DMA 0x0C600000#define EXYNOS_PA_CHIPID 0x10000000 +#define EXYNOS5440_PA_CHIPID 0x00160000#define EXYNOS4_PA_SYSCON 0x10010000#define EXYNOS5_PA_SYSCON 0x10050100#define EXYNOS4_PA_PMU 0x10020000#define EXYNOS5_PA_PMU 0x10040000 +#define EXYNOS5440_PA_PMU 0x00160000#define EXYNOS4_PA_CMU 0x10030000#define EXYNOS5_PA_CMU 0x10010000@@ -83,6 +85,8 @@#define EXYNOS4_PA_GIC_DIST 0x10490000#define EXYNOS5_PA_GIC_CPU 0x10482000#define EXYNOS5_PA_GIC_DIST 0x10481000 +#define EXYNOS5440_PA_GIC_CPU 0x002E2000 +#define EXYNOS5440_PA_GIC_DIST 0x002E1000#define EXYNOS4_PA_COREPERI 0x10500000#define EXYNOS4_PA_TWD 0x10500600@@ -281,6 +285,10 @@#define EXYNOS5_PA_UART3 0x12C30000#define EXYNOS5_SZ_UART SZ_256 +#define EXYNOS5440_PA_UART0 0x000B0000 +#define EXYNOS5440_PA_UART1 0x000C0000 +#define EXYNOS5440_SZ_UART SZ_256 +#define S3C_VA_UARTx (x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET))#endif /* __ASM_ARCH_MAP_H */ (quoted diff) +0
-0
b/arch/arm/mach-exynos/include/mach/regs-pmu.hindex d4e392b..c0b74f3 100644arch/arm/mach-exynos/include/mach/regs-pmu.h +1
-0@@ -31,6 +31,7 @@#define S5P_SWRESET S5P_PMUREG(0x0400)#define EXYNOS_SWRESET S5P_PMUREG(0x0400) +#define EXYNOS5440_SWRESET S5P_PMUREG(0x00C4)#define S5P_WAKEUP_STAT S5P_PMUREG(0x0600)#define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604)(quoted diff) +0
-0
b/arch/arm/mach-exynos/mach-exynos5-dt.cindex db1cd8e..7052f80 100644arch/arm/mach-exynos/mach-exynos5-dt.c +0
-0@@ -75,20 +75,24 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = { {},
arch/arm/mach-exynos/mach-exynos5-dt.c static const struct of_dev_auxdata · line 83
Quoted 10 lines
arch/arm/mach-exynos/mach-exynos5-dt.c +4
-2}; -static void __init exynos5250_dt_map_io (void ) +static void __init exynos5_dt_map_io (void ) {exynos_init_io (NULL ,0 ); -s3c24xx_init_clocks (24000000 ); + +if (of_machine_is_compatible ("samsung,exynos5250" )) +s3c24xx_init_clocks (24000000 );
Again soc_is_XXX().
Quoted 8 lines
arch/arm/mach-exynos/mach-exynos5-dt.c +2
-3} -static void __init exynos5250_dt_machine_init (void ) +static void __init exynos5_dt_machine_init (void ) { -of_platform_populate (NULL , of_default_bus_match_table, - exynos5250_auxdata_lookup,NULL ); +if (of_machine_is_compatible ("samsung,exynos5250" ))
arch/arm/mach-exynos/mach-exynos5-dt.c static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = { · line 97
Quoted 10 lines
arch/arm/mach-exynos/mach-exynos5-dt.c +4
-1+of_platform_populate (NULL , of_default_bus_match_table, + exynos5250_auxdata_lookup,NULL ); } -static char const *exynos5250_dt_compat[]__initdata = { +static char const *exynos5_dt_compat[]__initdata = {"samsung,exynos5250" , +"samsung,exynos5440" ,NULL };
Something doesn't seem right here. How do you distinguish between MACH_EXYNOS5_DT and MACH_EXYNOS5440_DT if both have the same compatible matches?
Those machines doesn't seem to share much definitions, so maybe a separate mach-exynos5440-dt.c file would be a better approach?
Quoted 19 lines
arch/arm/mach-exynos/mach-exynos5-dt.c +0
-0@@ -96,11 +100,23 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5(Flattened Device Tree)") /* Maintainer: Kukjin Kim <[email protected]> */
arch/arm/mach-exynos/mach-exynos5-dt.c +7
-3.init_irq = exynos5_init_irq, .smp = smp_ops(exynos_smp_ops), - .map_io = exynos5250_dt_map_io, + .map_io = exynos5_dt_map_io, .handle_irq = gic_handle_irq, - .init_machine = exynos5250_dt_machine_init, + .init_machine = exynos5_dt_machine_init, .init_late = exynos_init_late, .timer = &exynos4_timer, - .dt_compat = exynos5250_dt_compat, + .dt_compat = exynos5_dt_compat, + .restart = exynos5_restart, +MACHINE_END + +DT_MACHINE_START(EXYNOS5440_DT, "SAMSUNG EXYNOS5440 (Flattened DeviceTree)") + /* Maintainer: Kukjin Kim <[email protected]> */
arch/arm/mach-exynos/mach-exynos5-dt.c DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)") · line 121
Quoted 8 lines
arch/arm/mach-exynos/mach-exynos5-dt.c +7
-0+ .init_irq = exynos5_init_irq, + .smp = smp_ops(exynos_smp_ops), + .map_io = exynos5_dt_map_io, + .handle_irq = gic_handle_irq, + .init_machine = exynos5_dt_machine_init, + .timer = &exynos5_timer, + .dt_compat = exynos5_dt_compat, .restart = exynos5_restart,
Since restarts for both differ, why not to add separate exynos5440 restart and use it here?
Quoted 16 lines
MACHINE_ENDarch/arm/mach-exynos/mct.c +2
-0@@ -19,7 +19,9 @@#include <linux/platform_device.h> #include <linux/delay.h> #include <linux/percpu.h> +#include <linux/of.h> +#include <asm/arch_timer.h> #include <asm/hardware/gic.h> #include <asm/localtimer.h>
arch/arm/mach-exynos/mct.c static void __init exynos4_timer_init(void) · line 494
Quoted 6 lines
arch/arm/mach-exynos/mct.c +3
-0@@ -487,6 +489,9 @@ static void __init exynos4_timer_init(void)exynos4x12_clk_init ();#endif +if (of_machine_is_compatible ("samsung,exynos5440" )) +arch_timer_of_register (); +
Why exynos4_timer_init is being touched here, if exynos5_timer_init is being added?
I would rather keep exynos4_timer (which is used for all Exynos4 SoCs and for Exynos5250) as is and define new exynos5250_timer if it needs completely different initialization...
arch/arm/mach-exynos/mct.c static void __init exynos4_timer_init(void) · line 513
Quoted 13 lines
arch/arm/mach-exynos/mct.c +6
-0if ((soc_is_exynos4210 ()) || (soc_is_exynos5250 ())) mct_int_type =MCT_INT_SPI ;else @@ -500,3 +505,13 @@ static void __init exynos4_timer_init(void)struct sys_timer exynos4_timer = { .init = exynos4_timer_init, }; + +static void __init exynos5_timer_init (void ) +{ +if (of_machine_is_compatible ("samsung,exynos5440" )) +arch_timer_of_register (); +}
Also again this of_machine_is_compatible().
Best regards,
Tomasz Figa
PATCH 1/7 ARM: EXYNOS: add support for EXYNOS5440 SoC
Quoted 3 lines · Tomasz Figa
Hi Kgene,
Hi,
[...]
Quoted 11 lines
Quoted 11 lines
void
exynos5_restart(char mode, const char *cmd)
{arch/arm/mach-exynos/common.c +8
-1-__raw_writel (0x1 ,EXYNOS_SWRESET ); +u32 val; +void __iomem *addr; + +if (of_machine_is_compatible ("samsung,exynos5250" )) { + val =0x1 ; + addr =EXYNOS_SWRESET ; + }else if (of_machine_is_compatible ("samsung,exynos5440" )) { + val = (0x10 <<20 ) | (0x1 <<16 );
Quoted 9 lines
arch/arm/mach-exynos/common.c void exynos4_restart(char mode, const char *cmd) · line 333
Quoted 5 lines
arch/arm/mach-exynos/common.c +5
-0+ addr =EXYNOS5440_SWRESET ; + }else { +pr_err ("%s: cannot support non-DT\n" , __func__); +return ; + }Why
soc_is_XXXisn't used here? It should be faster and more correct thanof_machine_is_compatible.
Well...let me check again.
Quoted 3 lines
I can imagine the same board available with two different SoCs, for which
of_machine_is_compatiblewouldn't work.
I don't think so. Basically, the restart() depends on SoC not board in addition, each board is supposed to have its own SoC not different SoCs.
[...]
Quoted 11 lines
arch/arm/mach-exynos/mach-exynos5-dt.c static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = { · line 97
Quoted 6 lines
arch/arm/mach-exynos/mach-exynos5-dt.c +2
-1-static char const *exynos5250_dt_compat[]__initdata = { +static char const *exynos5_dt_compat[]__initdata = {"samsung,exynos5250" , +"samsung,exynos5440" ,NULL };Something doesn't seem right here. How do you distinguish between
MACH_EXYNOS5_DTandMACH_EXYNOS5440_DTif both have the same compatible matches?
I updated to support MACH_EXYNOS5440_DT with MACH_EXYNOS5_DT.
Quoted 3 lines
Those machines doesn't seem to share much definitions, so maybe a separate
mach-exynos5440-dt.cfile would be a better approach?
See my updated patch.
Quoted 22 lines
Quoted 22 lines
(quoted diff) +0
-0@@ -96,11 +100,23 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5(Flattened Device Tree)") /* Maintainer: Kukjin Kim <[email protected]> */
arch/arm/mach-exynos/mach-exynos5-dt.c +7
-3.init_irq = exynos5_init_irq, .smp = smp_ops(exynos_smp_ops), - .map_io = exynos5250_dt_map_io, + .map_io = exynos5_dt_map_io, .handle_irq = gic_handle_irq, - .init_machine = exynos5250_dt_machine_init, + .init_machine = exynos5_dt_machine_init, .init_late = exynos_init_late, .timer = &exynos4_timer, - .dt_compat = exynos5250_dt_compat, + .dt_compat = exynos5_dt_compat, + .restart = exynos5_restart, +MACHINE_END + +DT_MACHINE_START(EXYNOS5440_DT, "SAMSUNG EXYNOS5440 (Flattened DeviceTree)") + /* Maintainer: Kukjin Kim <[email protected]> */
arch/arm/mach-exynos/mach-exynos5-dt.c +3
-0+ .init_irq = exynos5_init_irq, + .smp = smp_ops(exynos_smp_ops), + .map_io = exynos5_dt_map_io,
Quoted 9 lines
arch/arm/mach-exynos/mach-exynos5-dt.c DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)") · line 121
Quoted 5 lines
arch/arm/mach-exynos/mach-exynos5-dt.c +4
-0+ .handle_irq = gic_handle_irq, + .init_machine = exynos5_dt_machine_init, + .timer = &exynos5_timer, + .dt_compat = exynos5_dt_compat, .restart = exynos5_restart,Since restarts for both differ, why not to add separate exynos5440 restart and use it here?
As I said above, I don't think so.
[...]
Quoted 11 lines
arch/arm/mach-exynos/mct.c static void __init exynos4_timer_init(void) · line 494
Quoted 7 lines
arch/arm/mach-exynos/mct.c +3
-0@@ -487,6 +489,9 @@ static void __init exynos4_timer_init(void)exynos4x12_clk_init ();#endif +if (of_machine_is_compatible ("samsung,exynos5440" )) +arch_timer_of_register (); +Why
exynos4_timer_initis being touched here, ifexynos5_timer_initis being added?
Quoted 4 lines
I would rather keep
exynos4_timer(which is used for all Exynos4 SoCs and for Exynos5250) as is and define newexynos5250_timerif it needs completely different initialization...
See updated patch.
[...]
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.
PATCH v2 1/7 ARM: EXYNOS: add support for EXYNOS5440 SoC
In reply to Kukjin KimThis patch adds support for EXYNOS5440 SoC which is including ARM Cortex-A15 Quad cores.
---
Changes since v1:
- Removed MACH_EXYNOS5440_DT because we can support it with MACH_EXYNOS5_DT
- Removed exynos_init_uarts() calling because it is not required for DT
- Removed GIC io-mapping entry because DT can support for runtime io-remapping
- Removed exynos5440_dt_irq_match[] table because of exynos5_dt_irq_match[]
- Removed UART resource because it is not required for DT
Note, this is based on Samsun COMMON CLK stuff submitted by Thomas Abraham.
arch/arm/mach-exynos/Kconfig | 12 ++++- arch/arm/mach-exynos/Makefile | 2 +- arch/arm/mach-exynos/common.c | 68 +++++++++++++++++++++++-- arch/arm/mach-exynos/include/mach/irqs.h | 5 ++ arch/arm/mach-exynos/include/mach/map.h | 5 ++ arch/arm/mach-exynos/include/mach/regs-pmu.h | 1 + arch/arm/mach-exynos/mach-exynos5-dt.c | 22 +++++--- arch/arm/mach-exynos/mct.c | 11 +++- arch/arm/mach-exynos/setup-i2c0.c | 2 +- arch/arm/plat-samsung/include/plat/cpu.h | 8 +++ drivers/tty/serial/samsung.c | 3 +- 11 files changed, 118 insertions(+), 21 deletions(-)
arch/arm/mach-exynos/Kconfig +11 -1
@@ -68,6 +68,16 @@ config SOC_EXYNOS5250 help Enable EXYNOS5250 SoC support +config SOC_EXYNOS5440 + bool "SAMSUNG EXYNOS5440" + default y + depends on ARCH_EXYNOS5 + select ARM_ARCH_TIMER + select AUTO_ZRELADDR + select COMMON_CLK + help + Enable EXYNOS5440 SoC support + config EXYNOS4_MCT bool default y
@@ -418,9 +428,9 @@ config MACH_EXYNOS4_DT config MACH_EXYNOS5_DT bool "SAMSUNG EXYNOS5 Machine using device tree" + default y depends on ARCH_EXYNOS5 select ARM_AMBA - select SOC_EXYNOS5250 select USE_OF help Machine support for Samsung EXYNOS5 machine with device tree enabled.
arch/arm/mach-exynos/Makefile +1 -1
@@ -13,7 +13,7 @@ obj- := # Core obj-$(CONFIG_ARCH_EXYNOS) += common.o -obj-$(CONFIG_ARCH_EXYNOS5) += clock-exynos5.o +obj-$(CONFIG_SOC_EXYNOS5250) += clock-exynos5.o obj-$(CONFIG_PM) += pm.o obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
arch/arm/mach-exynos/common.c +62 -6
148 lines not on this page · raw message
arch/arm/mach-exynos/include/mach/irqs.h +5 -0
@@ -333,6 +333,11 @@#define EXYNOS5_IRQ_FIMC_LITE1 IRQ_SPI(126)#define EXYNOS5_IRQ_RP_TIMER IRQ_SPI(127) +/* EXYNOS5440 */ + +#define EXYNOS5440_IRQ_UART0 IRQ_SPI(2) +#define EXYNOS5440_IRQ_UART1 IRQ_SPI(3) +#define EXYNOS5_IRQ_PMU COMBINER_IRQ(1, 2)#define EXYNOS5_IRQ_SYSMMU_GSC0_0 COMBINER_IRQ(2, 0)
arch/arm/mach-exynos/include/mach/map.h +5 -0
@@ -53,6 +53,7 @@#define EXYNOS4_PA_ONENAND_DMA 0x0C600000#define EXYNOS_PA_CHIPID 0x10000000 +#define EXYNOS5440_PA_CHIPID 0x00160000#define EXYNOS4_PA_SYSCON 0x10010000#define EXYNOS5_PA_SYSCON 0x10050100
@@ -281,6 +282,10 @@#define EXYNOS5_PA_UART3 0x12C30000#define EXYNOS5_SZ_UART SZ_256 +#define EXYNOS5440_PA_UART0 0x000B0000 +#define EXYNOS5440_PA_UART1 0x000C0000 +#define EXYNOS5440_SZ_UART SZ_256 +#define S3C_VA_UARTx (x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET))#endif /* __ASM_ARCH_MAP_H */
arch/arm/mach-exynos/include/mach/regs-pmu.h +1 -0
@@ -31,6 +31,7 @@#define S5P_SWRESET S5P_PMUREG(0x0400)#define EXYNOS_SWRESET S5P_PMUREG(0x0400) +#define EXYNOS5440_SWRESET S5P_PMUREG(0x00C4)#define S5P_WAKEUP_STAT S5P_PMUREG(0x0600)#define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604)
arch/arm/mach-exynos/mach-exynos5-dt.c +13 -9
@@ -75,20 +75,24 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = { {}, }; -static void __init exynos5250_dt_map_io (void ) +static void __init exynos5_dt_map_io (void ) {exynos_init_io (NULL ,0 ); -s3c24xx_init_clocks (24000000 ); + +if (of_machine_is_compatible ("samsung,exynos5250" )) +s3c24xx_init_clocks (24000000 ); } -static void __init exynos5250_dt_machine_init (void ) +static void __init exynos5_dt_machine_init (void ) { -of_platform_populate (NULL , of_default_bus_match_table, - exynos5250_auxdata_lookup,NULL ); +if (of_machine_is_compatible ("samsung,exynos5250" )) +of_platform_populate (NULL , of_default_bus_match_table, + exynos5250_auxdata_lookup,NULL ); } -static char const *exynos5250_dt_compat[]__initdata = { +static char const *exynos5_dt_compat[]__initdata = {"samsung,exynos5250" , +"samsung,exynos5440" ,NULL };
@@ -96,11 +100,11 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")/* Maintainer: Kukjin Kim <[email protected]> */ .init_irq = exynos5_init_irq, .smp = smp_ops(exynos_smp_ops), - .map_io = exynos5250_dt_map_io, + .map_io = exynos5_dt_map_io, .handle_irq = gic_handle_irq, - .init_machine = exynos5250_dt_machine_init, + .init_machine = exynos5_dt_machine_init, .init_late = exynos_init_late, .timer = &exynos4_timer, - .dt_compat = exynos5250_dt_compat, + .dt_compat = exynos5_dt_compat, .restart = exynos5_restart,MACHINE_END
arch/arm/mach-exynos/mct.c +9 -2
@@ -19,7 +19,9 @@#include <linux/platform_device.h> #include <linux/delay.h> #include <linux/percpu.h> +#include <linux/of.h> +#include <asm/arch_timer.h> #include <asm/hardware/gic.h> #include <asm/localtimer.h>
@@ -478,7 +480,7 @@ static void __init exynos4_timer_resources(void)#endif /* CONFIG_LOCAL_TIMERS */ } -static void __init exynos4_timer_init (void ) +static void __init exynos_timer_init (void ) {#ifdef CONFIG_COMMON_CLK if (soc_is_exynos4210 ())
@@ -487,6 +489,11 @@ static void __init exynos4_timer_init(void)exynos4x12_clk_init ();#endif +if (soc_is_exynos5440 ()) { +arch_timer_of_register (); +return ; + } +if ((soc_is_exynos4210 ()) || (soc_is_exynos5250 ())) mct_int_type =MCT_INT_SPI ;else
@@ -498,5 +505,5 @@ static void __init exynos4_timer_init(void) }struct sys_timer exynos4_timer = { - .init = exynos4_timer_init, + .init = exynos_timer_init, };
arch/arm/mach-exynos/setup-i2c0.c +1 -1
@@ -20,7 +20,7 @@ struct platform_device; /* don't need the contents */void s3c_i2c0_cfg_gpio (struct platform_device *dev) { -if (soc_is_exynos5250 ()) +if (soc_is_exynos5250 () ||soc_is_exynos5440 ())/* will be implemented with gpio function */ return ;
arch/arm/plat-samsung/include/plat/cpu.h +8 -0
@@ -43,6 +43,7 @@ extern unsigned long samsung_cpu_id;#define EXYNOS4_CPU_MASK 0xFFFE0000#define EXYNOS5250_SOC_ID 0x43520000 +#define EXYNOS5440_SOC_ID 0x54400000#define EXYNOS5_SOC_MASK 0xFFFFF000#define IS_SAMSUNG_CPU (name, id, mask) \
@@ -62,6 +63,7 @@ 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(exynos5440, EXYNOS5440_SOC_ID, EXYNOS5_SOC_MASK) #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2412) || \ defined(CONFIG_CPU_S3C2416) || defined(CONFIG_CPU_S3C2440) || \
@@ -130,6 +132,12 @@ IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK)# define soc_is_exynos5250 () 0#endif +#if defined(CONFIG_SOC_EXYNOS5440 ) +# define soc_is_exynos5440 () is_samsung_exynos5440() +#else +# define soc_is_exynos5440 () 0 +#endif +#define IODESC_ENT (x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }#ifndef KHZ
drivers/tty/serial/samsung.c +2 -1
@@ -1646,7 +1646,8 @@ static struct s3c24xx_serial_drv_data s5pv210_serial_drv_data = {#endif #if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS4212) || \ - defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250) + defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250) || \ + defined(CONFIG_SOC_EXYNOS5440) static struct s3c24xx_serial_drv_data exynos4210_serial_drv_data = { .info = &(struct s3c24xx_uart_info) { .name = "Samsung Exynos4 UART",
Signature · 1 line
1.7.4.1
PATCH 2/7 clk: exynos5440: add common clock support for Samsung EXYNOS5440
In reply to Kukjin KimFrom: Thomas Abraham <[email protected]>
This patch adds clock controller configuration support based on common clock framework for Samsung EXYNOS5440.
--- drivers/clk/samsung/Makefile | 1 + drivers/clk/samsung/clk-exynos5440.c | 66 ++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 0 deletions(-) create mode 100644 drivers/clk/samsung/clk-exynos5440.c
drivers/clk/samsung/Makefile +1 -0
@@ -4,3 +4,4 @@ obj-$(CONFIG_PLAT_SAMSUNG) += clk.o obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o +obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o
drivers/clk/samsung/clk-exynos5440.c new file +66 -0
66 lines not on this page · raw message
Signature · 1 line
1.7.4.4
PATCH 4/7 ARM: dts: add initial dts file for EXYNOS5440, SSDK5440
In reply to Kukjin KimThis patch adds initial dts file for EXYNOS5440 SoC and adds the dts file for SSDK5440 board which is a kind of reference board. More properties will be added later.
--- arch/arm/boot/dts/exynos5440-ssdk5440.dts | 49 ++++++++++ arch/arm/boot/dts/exynos5440.dtsi | 142 +++++++++++++++++++++++++++++ 2 files changed, 191 insertions(+), 0 deletions(-) create mode 100644 arch/arm/boot/dts/exynos5440-ssdk5440.dts create mode 100644 arch/arm/boot/dts/exynos5440.dtsi
arch/arm/boot/dts/exynos5440-ssdk5440.dts new file +49 -0
@@ -0,0 +1,49 @@ +/* + * SAMSUNG SSDK5440 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/ "exynos5440.dtsi" + +/ { + model = "SAMSUNG SSDK5440 board based on EXYNOS5440"; + compatible = "samsung,ssdk5440", "samsung,exynos5440"; + + memory { + reg = <0x80000000 0x80000000>; + }; + + chosen { + bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x81000000,8M console=ttySAC2,115200 init=/linuxrc"; + }; + + spi { + status = "disabled"; + }; + + i2c at F0000 { + samsung,i2c-sda-delay = <100>; + samsung,i2c-max-bus-freq = <20000>; + gpios = <&gpb3 0 2 3 0>, + <&gpb3 1 2 3 0>; + }; + + i2c at 100000 { + status = "disabled"; + }; + + watchdog { + status = "disabled"; + }; + + rtc { + status = "disabled"; + }; +};
arch/arm/boot/dts/exynos5440.dtsi new file +142 -0
142 lines not on this page · raw message
Signature · 1 line
1.7.4.4
PATCH 5/7 ARM: dts: add clock controller node for Samsung EXYNOS5440
In reply to Kukjin KimFrom: Thomas Abraham <[email protected]>
This patch add device tree nodes for representing the clock controller module in Samsung EXYNOS5440 SoC.
--- arch/arm/boot/dts/exynos5440-clock.dtsi | 143 +++++++++++++++++++++++++++++++ 1 files changed, 143 insertions(+), 0 deletions(-) create mode 100644 arch/arm/boot/dts/exynos5440-clock.dtsi
arch/arm/boot/dts/exynos5440-clock.dtsi new file +143 -0
@@ -0,0 +1,143 @@ +/* + * Samsung's EXYNOS5440 SoC clock nodes + * + * 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. +*/ + +/ { + xmu { + compatible = "samsung,exynos5440-xmu"; + reg = <0x160000 0x1000>; + + xtal: xtal { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-output-names = "xtal"; + clock-frequency = <50000000>; + }; + + peri_pll: peri-pll { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-output-names = "xusbxti"; + clock-frequency = <1000000000>; + }; + + peri_250mhz: peri-250mhz { + compatible = "samsung,fixed-factor-clock"; + #clock-cells = <0>; + clock-output-names = "peri-250mhz"; + clocks = <&peri_pll>; + clock-fixed-factor-div = <4>; + }; + + peri_200mhz: peri-200mhz { + compatible = "samsung,fixed-factor-clock"; + #clock-cells = <0>; + clock-output-names = "peri-200mhz"; + clocks = <&peri_pll>; + clock-fixed-factor-div = <5>; + }; + + peri_125mhz: peri-125mhz { + compatible = "samsung,fixed-factor-clock"; + #clock-cells = <0>; + clock-output-names = "peri-125mhz"; + clocks = <&peri_250mhz>; + clock-fixed-factor-div = <2>; + }; + + b250_clk: b250-clk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "b250-clk"; + clocks = <&peri_250mhz>; + reg-info = <0xf4 0>; + }; + + pb0250_clk: pb0250-clk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "pb0250-clk"; + clocks = <&peri_250mhz>; + reg-info = <0xf4 1>; + }; + + pr0250_clk: pr0250-clk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "pr0250-clk"; + clocks = <&peri_250mhz>; + reg-info = <0xf4 2>; + }; + + pr1250_clk: pr1250-clk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "pr1250-clk"; + clocks = <&peri_250mhz>; + reg-info = <0xf4 3>; + }; + + cs250_clk: cs250-clk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "cs250-clk"; + clocks = <&peri_250mhz>; + reg-info = <0xf4 4>; + }; + + drex_pclk: drex-pclk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "drex-pclk"; + clocks = <&peri_125mhz>; + reg-info = <0xf4 5>; + }; + + b125_pclk: b125-pclk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "b125-pclk"; + clocks = <&peri_125mhz>; + reg-info = <0xf4 6>; + }; + + b200_clk: b200-clk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "b200-clk"; + clocks = <&peri_200mhz>; + reg-info = <0xf4 7>; + }; + + sata_clk: sata-clk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "sata-clk"; + clocks = <&peri_200mhz>; + reg-info = <0xf4 8>; + }; + + usb_clk: usb-clk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "usb-clk"; + clocks = <&peri_200mhz>; + reg-info = <0xf4 9>; + }; + + gmac0_clk: gmac0-clk { + compatible = "samsung,clock-gate"; + #clock-cells = <0>; + clock-output-names = "gmac0-clk"; + clocks = <&peri_200mhz>; + reg-info = <0xf4 10>; + }; + }; +};
Signature · 1 line
1.7.4.4
PATCH 6/7 pinctrl: exynos5440: add pinctrl driver for Samsung EXYNOS5440 SoC
In reply to Kukjin KimFrom: Thomas Abraham <[email protected]>
Add a new pinctrl driver for Samsung EXYNOS5440 SoC. The pin controller module in EXYNOS5440 is different from the pin controller found on other Samsung SoC. Hence, the pin controller driver for EXYNOS5440 SoC is independent of the Samsung pinctrl framework.
--- drivers/pinctrl/Kconfig | 5 + drivers/pinctrl/Makefile | 1 + drivers/pinctrl/pinctrl-exynos5440.c | 919 ++++++++++++++++++++++++++++++++++ 3 files changed, 925 insertions(+), 0 deletions(-) create mode 100644 drivers/pinctrl/pinctrl-exynos5440.c
drivers/pinctrl/Kconfig +5 -0
@@ -186,6 +186,11 @@ config PINCTRL_EXYNOS4 bool "Pinctrl driver data for Exynos4 SoC" select PINCTRL_SAMSUNG +config PINCTRL_EXYNOS5440 + bool "Samsung EXYNOS5440 SoC pinctrl driver" + select PINMUX + select PINCONF + config PINCTRL_MVEBU bool depends on ARCH_MVEBU
drivers/pinctrl/Makefile +1 -0
@@ -36,6 +36,7 @@ obj-$(CONFIG_PINCTRL_U300) += pinctrl-u300.o obj-$(CONFIG_PINCTRL_COH901) += pinctrl-coh901.o obj-$(CONFIG_PINCTRL_SAMSUNG) += pinctrl-samsung.o obj-$(CONFIG_PINCTRL_EXYNOS4) += pinctrl-exynos.o +obj-$(CONFIG_PINCTRL_EXYNOS5440) += pinctrl-exynos5440.o obj-$(CONFIG_PINCTRL_MVEBU) += pinctrl-mvebu.o obj-$(CONFIG_PINCTRL_DOVE) += pinctrl-dove.o obj-$(CONFIG_PINCTRL_KIRKWOOD) += pinctrl-kirkwood.o
drivers/pinctrl/pinctrl-exynos5440.c new file +919 -0
919 lines not on this page · raw message
Signature · 1 line
1.7.4.4
PATCH 6/7 pinctrl: exynos5440: add pinctrl driver for Samsung EXYNOS5440 SoC
Quoted 10 lines · Kukjin Kim
From: Thomas Abraham <[email protected]>
Add a new pinctrl driver for Samsung EXYNOS5440 SoC. The pin controller module in EXYNOS5440 is different from the pin controller found on other Samsung SoC. Hence, the pin controller driver for EXYNOS5440 SoC is independent of the Samsung pinctrl framework.
Signed-off-by Thomas Abraham <[email protected]>Cc Linus Walleij <[email protected]>Signed-off-by Kukjin Kim <[email protected]>
If I haven't ACK:ed this before here's an
I expect this to go through the Samsung tree?
Yours,
Linus Walleij
PATCH 6/7 pinctrl: exynos5440: add pinctrl driver for Samsung EXYNOS5440 SoC
Quoted 10 lines · Linus Walleij
Quoted 7 lines · Kukjin Kim
From: Thomas Abraham <[email protected]>
Add a new pinctrl driver for Samsung EXYNOS5440 SoC. The pin controller module in EXYNOS5440 is different from the pin controller found on other Samsung SoC. Hence, the pin controller driver for EXYNOS5440 SoC is independent of the Samsung pinctrl framework.
Quoted 7 lines
Quoted 3 lines
Signed-off-by Thomas Abraham <[email protected]>Cc Linus Walleij <[email protected]>Signed-off-by Kukjin Kim <[email protected]>If I haven't ACK:ed this before here's an
Acked-by Linus Walleij <[email protected]>
Thanks for your ack.
Quoted 2 lines
I expect this to go through the Samsung tree?
Yeah, this would be sent to upstream via Samsung tree.
Let me pick this up in my tree with your ack.
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.
PATCH 7/7 ARM: dts: Add pin controller node for Samsung EXYNOS5440 SoC
In reply to Kukjin KimFrom: Thomas Abraham <[email protected]>
Add a pin controller node for Samsung Exynos5440 (EXYNOS5440) SoC.
--- arch/arm/boot/dts/exynos5440.dtsi | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-)
arch/arm/boot/dts/exynos5440.dtsi +17 -0
@@ -90,6 +90,23 @@ reg = <0xE0000 0x1000>; interrupt-controller; #interrupt-cells = <2>; + #gpio-cells = <2>; + + fan: fan { + samsung,exynos5440-pin-function = <1>; + }; + + hdd_led0: hdd_led0 { + samsung,exynos5440-pin-function = <2>; + }; + + hdd_led1: hdd_led1 { + samsung,exynos5440-pin-function = <3>; + }; + + uart1: uart1 { + samsung,exynos5440-pin-function = <4>; + }; }; i2c at F0000 {
Signature · 1 line
1.7.4.4