ARM: EXYNOS: add support new EXYNOS5250
v3 cover ARM: EXYNOS: add support new EXYNOS5250
This patch adds support EXYNOS5250 SoC which has two A15 cores can be used on mobile and tablet devices.
Changes since v2:
- update interrupt number declaration for single zImage of exynos4 and exynos5
- allow to select for exynos4 and exynos5 together
- add support EINT for exynos4 and exynos5
- add l2 cache initializer for exynos5250
Changes since v1:
- address comments from mailing list
- update the option accordingly common.[ch]
- update clock part
- get rid of static mapping for uart
- add device tree enabled board file(mach-exynos5-dt.c)
- add initial dts file for EXYNOS5250(SoC), SMDK5250(Board)
[PATCH v3 01/12] ARM: EXYNOS: to declare static for mach-exynos/common.c [PATCH v3 02/12] ARM: EXYNOS: use exynos_init_uarts() instead of exynos4_init_uarts() [PATCH v3 03/12] ARM: EXYNOS: add clock part for EXYNOS5250 SoC
[PATCH v3 04/12] ARM: EXYNOS: add initial setup-i2c0 for EXYNOS5
[PATCH v3 05/12] ARM: EXYNOS: add support uart for EXYNOS4 and EXYNOS5 [PATCH v3 06/12] ARM: EXYNOS: add support for EXYNOS5250 SoC
[PATCH v3 07/12] ARM: EXYNOS: add interrupt definitions for EXYNOS5250 [PATCH v3 08/12] ARM: EXYNOS: support EINT for EXYNOS4 and EXYNOS5 [PATCH v3 09/12] ARM: EXYNOS: add support get_core_count() for EXYNOS5250 [PATCH v3 10/12] ARM: EXYNOS: add support ARCH_EXYNOS5 for EXYNOS5 SoCs [PATCH v3 11/12] ARM: EXYNOS: add support device tree enabled board file for EXYNOS5 [PATCH v3 12/12] ARM: dts: add initial dts file for EXYNOS5250, SMDK5250
PATCH v3 1/12 ARM: EXYNOS: to declare static for mach-exynos/common.c
According to commit cc511b8d84d8 ("ARM: 7257/1: EXYNOS: introduce arch/arm/mach-exynos/common.[ch]"), we don't need to declare extern for exynos4_map_io(), exynos4_init_clocks(), exynos4_init_uarts(), and exynos_init(). And the exynos4210_register_clocks() and exynos4212_register_clocks depend on each SoC not ARCH_EXYNOS4. So this patch fixed above.
--- arch/arm/mach-exynos/common.c | 13 +++++++++---- arch/arm/mach-exynos/common.h | 28 +++++++++++----------------- 2 files changed, 20 insertions(+), 21 deletions(-)
arch/arm/mach-exynos/common.c +9 -4
@@ -50,6 +50,11 @@ static const char name_exynos4210[] = "EXYNOS4210";static const char name_exynos4212[] ="EXYNOS4212" ;static const char name_exynos4412[] ="EXYNOS4412" ; +static void exynos4_map_io (void ); +static void exynos4_init_clocks (int xtal); +static void exynos4_init_uarts (struct s3c2410_uartcfg *cfg,int no); +static int exynos_init (void ); +static struct cpu_table cpu_ids[]__initdata = { { .idcode =EXYNOS4210_CPU_ID ,
@@ -225,7 +230,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)); } -void __init exynos4_map_io (void ) +static void __init exynos4_map_io (void ) {iotable_init (exynos4_iodesc,ARRAY_SIZE (exynos4_iodesc));
@@ -256,7 +261,7 @@ void __init exynos4_map_io(void)s5p_hdmi_setname ("exynos4-hdmi" ); } -void __init exynos4_init_clocks (int xtal) +static void __init exynos4_init_clocks (int xtal) {printk (KERN_DEBUG "%s: initializing clocks\n" , __func__);
@@ -456,7 +461,7 @@ static int __init exynos4_l2x0_cache_init(void)early_initcall (exynos4_l2x0_cache_init);#endif -int __init exynos_init (void ) +static int __init exynos_init (void ) {printk (KERN_INFO "EXYNOS: Initializing architecture\n" );return device_register (&exynos4_dev);
@@ -464,7 +469,7 @@ int __init exynos_init(void)/* uart registration process */ -void __init exynos4_init_uarts (struct s3c2410_uartcfg *cfg,int no) +static void __init exynos4_init_uarts (struct s3c2410_uartcfg *cfg,int no) {struct s3c2410_uartcfg *tcfg = cfg;u32 ucnt;
arch/arm/mach-exynos/common.h +11 -17
@@ -12,39 +12,33 @@#ifndef __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 exynos4_init_irq (void ); +void exynos4_restart (char mode,const char *cmd);#ifdef CONFIG_ARCH_EXYNOS4 void exynos4_register_clocks (void );void exynos4_setup_clocks (void ); -void exynos4210_register_clocks (void ); -void exynos4212_register_clocks (void ); -#else #define exynos4_register_clocks ()#define exynos4_setup_clocks () - -#define exynos4210_register_clocks () -#define exynos4212_register_clocks ()#endif -void exynos4_restart (char mode,const char *cmd); +#ifdef CONFIG_CPU_EXYNOS4210 +void exynos4210_register_clocks (void ); -extern struct sys_timer exynos4_timer; +#else +#define exynos4210_register_clocks () +#endif -#ifdef CONFIG_ARCH_EXYNOS -extern int exynos_init (void ); -extern void exynos4_map_io (void ); -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 -#define exynos4_init_clocks NULL -#define exynos4_init_uarts NULL -#define exynos4_map_io NULL -#define exynos_init NULL +#define exynos4212_register_clocks ()#endif #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */
Signature · 1 line
1.7.4.4
PATCH v3 2/12 ARM: EXYNOS: use exynos_init_uarts() instead of exynos4_init_uarts()
In reply to Kukjin KimSince exynos4_init_uarts() can be used for EXYNOS5 SoCs, this patch changes the name of function to exynos_init_uarts().
--- arch/arm/mach-exynos/common.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)
arch/arm/mach-exynos/common.c +5 -5
@@ -52,7 +52,7 @@ static const char name_exynos4412[] = "EXYNOS4412";static void exynos4_map_io (void );static void exynos4_init_clocks (int xtal); -static void exynos4_init_uarts (struct s3c2410_uartcfg *cfg,int no); +static void exynos_init_uarts (struct s3c2410_uartcfg *cfg,int no);static int exynos_init (void );static struct cpu_table cpu_ids[]__initdata = {
@@ -61,7 +61,7 @@ static struct cpu_table cpu_ids[] __initdata = { .idmask = EXYNOS4_CPU_MASK, .map_io = exynos4_map_io, .init_clocks = exynos4_init_clocks, - .init_uarts = exynos4_init_uarts, + .init_uarts = exynos_init_uarts, .init = exynos_init, .name = name_exynos4210, }, {
@@ -69,7 +69,7 @@ static struct cpu_table cpu_ids[] __initdata = { .idmask = EXYNOS4_CPU_MASK, .map_io = exynos4_map_io, .init_clocks = exynos4_init_clocks, - .init_uarts = exynos4_init_uarts, + .init_uarts = exynos_init_uarts, .init = exynos_init, .name = name_exynos4212, }, {
@@ -77,7 +77,7 @@ static struct cpu_table cpu_ids[] __initdata = { .idmask = EXYNOS4_CPU_MASK, .map_io = exynos4_map_io, .init_clocks = exynos4_init_clocks, - .init_uarts = exynos4_init_uarts, + .init_uarts = exynos_init_uarts, .init = exynos_init, .name = name_exynos4412, },
@@ -469,7 +469,7 @@ static int __init exynos_init(void)/* uart registration process */ -static 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;u32 ucnt;
Signature · 1 line
1.7.4.4
PATCH v3 3/12 ARM: EXYNOS: add clock part for EXYNOS5250 SoC
In reply to Kukjin KimThis patch adds clock-exynos5.c for EXYNOS5250 now and that can be used for other EXYNOS5 SoCs later.
--- arch/arm/mach-exynos/clock-exynos5.c | 1247 ++++++++++++++++++++++++ arch/arm/mach-exynos/include/mach/regs-clock.h | 62 ++ arch/arm/plat-s5p/clock.c | 36 + arch/arm/plat-samsung/include/plat/s5p-clock.h | 6 + 4 files changed, 1351 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-exynos/clock-exynos5.c
arch/arm/mach-exynos/clock-exynos5.c new file +1247 -0
@@ -0,0 +1,1247 @@ +/* +* Copyright (c) 2012 Samsung Electronics Co., Ltd. +* http://www.samsung.com +* +* Clock support for EXYNOS5 SoCs +* +* 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/err.h> +#include <linux/io.h> +#include <linux/syscore_ops.h> + +#include <plat/cpu-freq.h> +#include <plat/clock.h> +#include <plat/cpu.h> +#include <plat/pll.h> +#include <plat/s5p-clock.h> +#include <plat/clock-clksrc.h> +#include <plat/pm.h> + +#include <mach/map.h> +#include <mach/regs-clock.h> +#include <mach/sysmmu.h> + +#include "common.h" + +#ifdef CONFIG_PM_SLEEP +static struct sleep_save exynos5_clock_save[] = { +/* will be implemented */ +}; +#endif + +static struct clk exynos5_clk_sclk_dptxphy = { + .name ="sclk_dptx" , +}; + +static struct clk exynos5_clk_sclk_hdmi24m = { + .name ="sclk_hdmi24m" , + .rate =24000000 , +}; + +static struct clk exynos5_clk_sclk_hdmi27m = { + .name ="sclk_hdmi27m" , + .rate =27000000 , +}; + +static struct clk exynos5_clk_sclk_hdmiphy = { + .name ="sclk_hdmiphy" , +}; + +static struct clk exynos5_clk_sclk_usbphy = { + .name ="sclk_usbphy" , + .rate =48000000 , +}; + +static int exynos5_clksrc_mask_top_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKSRC_MASK_TOP , clk, enable); +} + +static int exynos5_clksrc_mask_disp1_0_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKSRC_MASK_DISP1_0 , clk, enable); +} + +static int exynos5_clksrc_mask_fsys_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKSRC_MASK_FSYS , clk, enable); +} + +static int exynos5_clksrc_mask_gscl_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKSRC_MASK_GSCL , clk, enable); +} + +static int exynos5_clksrc_mask_peric0_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKSRC_MASK_PERIC0 , clk, enable); +} + +static int exynos5_clk_ip_core_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKGATE_IP_CORE , clk, enable); +} + +static int exynos5_clk_ip_disp1_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKGATE_IP_DISP1 , clk, enable); +} + +static int exynos5_clk_ip_fsys_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKGATE_IP_FSYS , clk, enable); +} + +static int exynos5_clk_block_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKGATE_BLOCK , clk, enable); +} + +static int exynos5_clk_ip_gen_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKGATE_IP_GEN , clk, enable); +} + +static int exynos5_clk_ip_gps_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKGATE_IP_GPS , clk, enable); +} + +static int exynos5_clk_ip_mfc_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKGATE_IP_MFC , clk, enable); +} + +static int exynos5_clk_ip_peric_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKGATE_IP_PERIC , clk, enable); +} + +static int exynos5_clk_ip_peris_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (EXYNOS5_CLKGATE_IP_PERIS , clk, enable); +} + +/* Core list of CMU_CPU side */ + +static struct clksrc_clk exynos5_clk_mout_apll = { + .clk = { + .name ="mout_apll" , + }, + .sources = &clk_src_apll, + .reg_src = { .reg =EXYNOS5_CLKSRC_CPU , .shift =0 , .size =1 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_apll = { + .clk = { + .name ="sclk_apll" , + .parent = &exynos5_clk_mout_apll.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_CPU0 , .shift =24 , .size =3 }, +}; + +static struct clksrc_clk exynos5_clk_mout_bpll = { + .clk = { + .name ="mout_bpll" , + }, + .sources = &clk_src_bpll, + .reg_src = { .reg =EXYNOS5_CLKSRC_CDREX , .shift =0 , .size =1 }, +}; + +static struct clk *exynos5_clk_src_bpll_user_list[] = { + [0 ] = &clk_fin_mpll, + [1 ] = &exynos5_clk_mout_bpll.clk, +}; + +static struct clksrc_sources exynos5_clk_src_bpll_user = { + .sources = exynos5_clk_src_bpll_user_list, + .nr_sources =ARRAY_SIZE (exynos5_clk_src_bpll_user_list), +}; + +static struct clksrc_clk exynos5_clk_mout_bpll_user = { + .clk = { + .name ="mout_bpll_user" , + }, + .sources = &exynos5_clk_src_bpll_user, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP2 , .shift =24 , .size =1 }, +}; + +static struct clksrc_clk exynos5_clk_mout_cpll = { + .clk = { + .name ="mout_cpll" , + }, + .sources = &clk_src_cpll, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP2 , .shift =8 , .size =1 }, +}; + +static struct clksrc_clk exynos5_clk_mout_epll = { + .clk = { + .name ="mout_epll" , + }, + .sources = &clk_src_epll, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP2 , .shift =12 , .size =1 }, +}; + +struct clksrc_clk exynos5_clk_mout_mpll = { + .clk = { + .name ="mout_mpll" , + }, + .sources = &clk_src_mpll, + .reg_src = { .reg =EXYNOS5_CLKSRC_CORE1 , .shift =8 , .size =1 }, +}; + +static struct clk *exynos_clkset_vpllsrc_list[] = { + [0 ] = &clk_fin_vpll, + [1 ] = &exynos5_clk_sclk_hdmi27m, +}; + +static struct clksrc_sources exynos5_clkset_vpllsrc = { + .sources = exynos_clkset_vpllsrc_list, + .nr_sources =ARRAY_SIZE (exynos_clkset_vpllsrc_list), +}; + +static struct clksrc_clk exynos5_clk_vpllsrc = { + .clk = { + .name ="vpll_src" , + .enable = exynos5_clksrc_mask_top_ctrl, + .ctrlbit = (1 <<0 ), + }, + .sources = &exynos5_clkset_vpllsrc, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP2 , .shift =0 , .size =1 }, +}; + +static struct clk *exynos5_clkset_sclk_vpll_list[] = { + [0 ] = &exynos5_clk_vpllsrc.clk, + [1 ] = &clk_fout_vpll, +}; + +static struct clksrc_sources exynos5_clkset_sclk_vpll = { + .sources = exynos5_clkset_sclk_vpll_list, + .nr_sources =ARRAY_SIZE (exynos5_clkset_sclk_vpll_list), +}; + +static struct clksrc_clk exynos5_clk_sclk_vpll = { + .clk = { + .name ="sclk_vpll" , + }, + .sources = &exynos5_clkset_sclk_vpll, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP2 , .shift =16 , .size =1 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_pixel = { + .clk = { + .name ="sclk_pixel" , + .parent = &exynos5_clk_sclk_vpll.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_DISP1_0 , .shift =28 , .size =4 }, +}; + +static struct clk *exynos5_clkset_sclk_hdmi_list[] = { + [0 ] = &exynos5_clk_sclk_pixel.clk, + [1 ] = &exynos5_clk_sclk_hdmiphy, +}; + +static struct clksrc_sources exynos5_clkset_sclk_hdmi = { + .sources = exynos5_clkset_sclk_hdmi_list, + .nr_sources =ARRAY_SIZE (exynos5_clkset_sclk_hdmi_list), +}; + +static struct clksrc_clk exynos5_clk_sclk_hdmi = { + .clk = { + .name ="sclk_hdmi" , + .enable = exynos5_clksrc_mask_disp1_0_ctrl, + .ctrlbit = (1 <<20 ), + }, + .sources = &exynos5_clkset_sclk_hdmi, + .reg_src = { .reg =EXYNOS5_CLKSRC_DISP1_0 , .shift =20 , .size =1 }, +}; + +static struct clksrc_clk *exynos5_sclk_tv[] = { + &exynos5_clk_sclk_pixel, + &exynos5_clk_sclk_hdmi, +}; + +static struct clk *exynos5_clk_src_mpll_user_list[] = { + [0 ] = &clk_fin_mpll, + [1 ] = &exynos5_clk_mout_mpll.clk, +}; + +static struct clksrc_sources exynos5_clk_src_mpll_user = { + .sources = exynos5_clk_src_mpll_user_list, + .nr_sources =ARRAY_SIZE (exynos5_clk_src_mpll_user_list), +}; + +static struct clksrc_clk exynos5_clk_mout_mpll_user = { + .clk = { + .name ="mout_mpll_user" , + }, + .sources = &exynos5_clk_src_mpll_user, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP2 , .shift =20 , .size =1 }, +}; + +static struct clk *exynos5_clkset_mout_cpu_list[] = { + [0 ] = &exynos5_clk_mout_apll.clk, + [1 ] = &exynos5_clk_mout_mpll.clk, +}; + +static struct clksrc_sources exynos5_clkset_mout_cpu = { + .sources = exynos5_clkset_mout_cpu_list, + .nr_sources =ARRAY_SIZE (exynos5_clkset_mout_cpu_list), +}; + +static struct clksrc_clk exynos5_clk_mout_cpu = { + .clk = { + .name ="mout_cpu" , + }, + .sources = &exynos5_clkset_mout_cpu, + .reg_src = { .reg =EXYNOS5_CLKSRC_CPU , .shift =16 , .size =1 }, +}; + +static struct clksrc_clk exynos5_clk_dout_armclk = { + .clk = { + .name ="dout_armclk" , + .parent = &exynos5_clk_mout_cpu.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_CPU0 , .shift =0 , .size =3 }, +}; + +static struct clksrc_clk exynos5_clk_dout_arm2clk = { + .clk = { + .name ="dout_arm2clk" , + .parent = &exynos5_clk_dout_armclk.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_CPU0 , .shift =28 , .size =3 }, +}; + +static struct clk exynos5_clk_armclk = { + .name ="armclk" , + .parent = &exynos5_clk_dout_arm2clk.clk, +}; + +/* Core list of CMU_CDREX side */ + +static struct clk *exynos5_clkset_cdrex_list[] = { + [0 ] = &exynos5_clk_mout_mpll.clk, + [1 ] = &exynos5_clk_mout_bpll.clk, +}; + +static struct clksrc_sources exynos5_clkset_cdrex = { + .sources = exynos5_clkset_cdrex_list, + .nr_sources =ARRAY_SIZE (exynos5_clkset_cdrex_list), +}; + +static struct clksrc_clk exynos5_clk_cdrex = { + .clk = { + .name ="clk_cdrex" , + }, + .sources = &exynos5_clkset_cdrex, + .reg_src = { .reg =EXYNOS5_CLKSRC_CDREX , .shift =4 , .size =1 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_CDREX , .shift =16 , .size =3 }, +}; + +static struct clksrc_clk exynos5_clk_aclk_acp = { + .clk = { + .name ="aclk_acp" , + .parent = &exynos5_clk_mout_mpll.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_ACP , .shift =0 , .size =3 }, +}; + +static struct clksrc_clk exynos5_clk_pclk_acp = { + .clk = { + .name ="pclk_acp" , + .parent = &exynos5_clk_aclk_acp.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_ACP , .shift =4 , .size =3 }, +}; + +/* Core list of CMU_TOP side */ + +struct clk *exynos5_clkset_aclk_top_list[] = { + [0 ] = &exynos5_clk_mout_mpll_user.clk, + [1 ] = &exynos5_clk_mout_bpll_user.clk, +}; + +struct clksrc_sources exynos5_clkset_aclk = { + .sources = exynos5_clkset_aclk_top_list, + .nr_sources =ARRAY_SIZE (exynos5_clkset_aclk_top_list), +}; + +static struct clksrc_clk exynos5_clk_aclk_400 = { + .clk = { + .name ="aclk_400" , + }, + .sources = &exynos5_clkset_aclk, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP0 , .shift =20 , .size =1 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_TOP0 , .shift =24 , .size =3 }, +}; + +struct clk *exynos5_clkset_aclk_333_166_list[] = { + [0 ] = &exynos5_clk_mout_cpll.clk, + [1 ] = &exynos5_clk_mout_mpll_user.clk, +}; + +struct clksrc_sources exynos5_clkset_aclk_333_166 = { + .sources = exynos5_clkset_aclk_333_166_list, + .nr_sources =ARRAY_SIZE (exynos5_clkset_aclk_333_166_list), +}; + +static struct clksrc_clk exynos5_clk_aclk_333 = { + .clk = { + .name ="aclk_333" , + }, + .sources = &exynos5_clkset_aclk_333_166, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP0 , .shift =16 , .size =1 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_TOP0 , .shift =20 , .size =3 }, +}; + +static struct clksrc_clk exynos5_clk_aclk_166 = { + .clk = { + .name ="aclk_166" , + }, + .sources = &exynos5_clkset_aclk_333_166, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP0 , .shift =8 , .size =1 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_TOP0 , .shift =8 , .size =3 }, +}; + +static struct clksrc_clk exynos5_clk_aclk_266 = { + .clk = { + .name ="aclk_266" , + .parent = &exynos5_clk_mout_mpll_user.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_TOP0 , .shift =16 , .size =3 }, +}; + +static struct clksrc_clk exynos5_clk_aclk_200 = { + .clk = { + .name ="aclk_200" , + }, + .sources = &exynos5_clkset_aclk, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP0 , .shift =12 , .size =1 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_TOP0 , .shift =12 , .size =3 }, +}; + +static struct clksrc_clk exynos5_clk_aclk_66_pre = { + .clk = { + .name ="aclk_66_pre" , + .parent = &exynos5_clk_mout_mpll_user.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_TOP1 , .shift =24 , .size =3 }, +}; + +static struct clksrc_clk exynos5_clk_aclk_66 = { + .clk = { + .name ="aclk_66" , + .parent = &exynos5_clk_aclk_66_pre.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_TOP0 , .shift =0 , .size =3 }, +}; + +static struct clk exynos5_init_clocks_off[] = { + { + .name ="timers" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<24 ), + }, { + .name ="rtc" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peris_ctrl, + .ctrlbit = (1 <<20 ), + }, { + .name ="hsmmc" , + .devname ="s3c-sdhci.0" , + .parent = &exynos5_clk_aclk_200.clk, + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<12 ), + }, { + .name ="hsmmc" , + .devname ="s3c-sdhci.1" , + .parent = &exynos5_clk_aclk_200.clk, + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<13 ), + }, { + .name ="hsmmc" , + .devname ="s3c-sdhci.2" , + .parent = &exynos5_clk_aclk_200.clk, + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<14 ), + }, { + .name ="hsmmc" , + .devname ="s3c-sdhci.3" , + .parent = &exynos5_clk_aclk_200.clk, + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<15 ), + }, { + .name ="dwmci" , + .parent = &exynos5_clk_aclk_200.clk, + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<16 ), + }, { + .name ="sata" , + .devname ="ahci" , + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<6 ), + }, { + .name ="sata_phy" , + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<24 ), + }, { + .name ="sata_phy_i2c" , + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<25 ), + }, { + .name ="mfc" , + .devname ="s5p-mfc" , + .enable = exynos5_clk_ip_mfc_ctrl, + .ctrlbit = (1 <<0 ), + }, { + .name ="hdmi" , + .devname ="exynos4-hdmi" , + .enable = exynos5_clk_ip_disp1_ctrl, + .ctrlbit = (1 <<6 ), + }, { + .name ="mixer" , + .devname ="s5p-mixer" , + .enable = exynos5_clk_ip_disp1_ctrl, + .ctrlbit = (1 <<5 ), + }, { + .name ="jpeg" , + .enable = exynos5_clk_ip_gen_ctrl, + .ctrlbit = (1 <<2 ), + }, { + .name ="dsim0" , + .enable = exynos5_clk_ip_disp1_ctrl, + .ctrlbit = (1 <<3 ), + }, { + .name ="iis" , + .devname ="samsung-i2s.1" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<20 ), + }, { + .name ="iis" , + .devname ="samsung-i2s.2" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<21 ), + }, { + .name ="pcm" , + .devname ="samsung-pcm.1" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<22 ), + }, { + .name ="pcm" , + .devname ="samsung-pcm.2" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<23 ), + }, { + .name ="spdif" , + .devname ="samsung-spdif" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<26 ), + }, { + .name ="ac97" , + .devname ="samsung-ac97" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<27 ), + }, { + .name ="usbhost" , + .enable = exynos5_clk_ip_fsys_ctrl , + .ctrlbit = (1 <<18 ), + }, { + .name ="usbotg" , + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<7 ), + }, { + .name ="gps" , + .enable = exynos5_clk_ip_gps_ctrl, + .ctrlbit = ((1 <<3 ) | (1 <<2 ) | (1 <<0 )), + }, { + .name ="nfcon" , + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<22 ), + }, { + .name ="iop" , + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = ((1 <<30 ) | (1 <<26 ) | (1 <<23 )), + }, { + .name ="core_iop" , + .enable = exynos5_clk_ip_core_ctrl, + .ctrlbit = ((1 <<21 ) | (1 <<3 )), + }, { + .name ="mcu_iop" , + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<0 ), + }, { + .name ="i2c" , + .devname ="s3c2440-i2c.0" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<6 ), + }, { + .name ="i2c" , + .devname ="s3c2440-i2c.1" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<7 ), + }, { + .name ="i2c" , + .devname ="s3c2440-i2c.2" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<8 ), + }, { + .name ="i2c" , + .devname ="s3c2440-i2c.3" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<9 ), + }, { + .name ="i2c" , + .devname ="s3c2440-i2c.4" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<10 ), + }, { + .name ="i2c" , + .devname ="s3c2440-i2c.5" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<11 ), + }, { + .name ="i2c" , + .devname ="s3c2440-i2c.6" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<12 ), + }, { + .name ="i2c" , + .devname ="s3c2440-i2c.7" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<13 ), + }, { + .name ="i2c" , + .devname ="s3c2440-hdmiphy-i2c" , + .parent = &exynos5_clk_aclk_66.clk, + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<14 ), + } +}; + +static struct clk exynos5_init_clocks_on[] = { + { + .name ="uart" , + .devname ="s5pv210-uart.0" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<0 ), + }, { + .name ="uart" , + .devname ="s5pv210-uart.1" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<1 ), + }, { + .name ="uart" , + .devname ="s5pv210-uart.2" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<2 ), + }, { + .name ="uart" , + .devname ="s5pv210-uart.3" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<3 ), + }, { + .name ="uart" , + .devname ="s5pv210-uart.4" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<4 ), + }, { + .name ="uart" , + .devname ="s5pv210-uart.5" , + .enable = exynos5_clk_ip_peric_ctrl, + .ctrlbit = (1 <<5 ), + } +}; + +static struct clk exynos5_clk_pdma0 = { + .name ="dma" , + .devname ="dma-pl330.0" , + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<1 ), +}; + +static struct clk exynos5_clk_pdma1 = { + .name ="dma" , + .devname ="dma-pl330.1" , + .enable = exynos5_clk_ip_fsys_ctrl, + .ctrlbit = (1 <<1 ), +}; + +static struct clk exynos5_clk_mdma1 = { + .name ="dma" , + .devname ="dma-pl330.2" , + .enable = exynos5_clk_ip_gen_ctrl, + .ctrlbit = (1 <<4 ), +}; + +struct clk *exynos5_clkset_group_list[] = { + [0 ] = &clk_ext_xtal_mux, + [1 ] =NULL , + [2 ] = &exynos5_clk_sclk_hdmi24m, + [3 ] = &exynos5_clk_sclk_dptxphy, + [4 ] = &exynos5_clk_sclk_usbphy, + [5 ] = &exynos5_clk_sclk_hdmiphy, + [6 ] = &exynos5_clk_mout_mpll_user.clk, + [7 ] = &exynos5_clk_mout_epll.clk, + [8 ] = &exynos5_clk_sclk_vpll.clk, + [9 ] = &exynos5_clk_mout_cpll.clk, +}; + +struct clksrc_sources exynos5_clkset_group = { + .sources = exynos5_clkset_group_list, + .nr_sources =ARRAY_SIZE (exynos5_clkset_group_list), +}; + +/* Possible clock sources for aclk_266_gscl_sub Mux */ +static struct clk *clk_src_gscl_266_list[] = { + [0 ] = &clk_ext_xtal_mux, + [1 ] = &exynos5_clk_aclk_266.clk, +}; + +static struct clksrc_sources clk_src_gscl_266 = { + .sources = clk_src_gscl_266_list, + .nr_sources =ARRAY_SIZE (clk_src_gscl_266_list), +}; + +static struct clksrc_clk exynos5_clk_dout_mmc0 = { + .clk = { + .name ="dout_mmc0" , + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_FSYS , .shift =0 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS1 , .shift =0 , .size =4 }, +}; + +static struct clksrc_clk exynos5_clk_dout_mmc1 = { + .clk = { + .name ="dout_mmc1" , + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_FSYS , .shift =4 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS1 , .shift =16 , .size =4 }, +}; + +static struct clksrc_clk exynos5_clk_dout_mmc2 = { + .clk = { + .name ="dout_mmc2" , + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_FSYS , .shift =8 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS2 , .shift =0 , .size =4 }, +}; + +static struct clksrc_clk exynos5_clk_dout_mmc3 = { + .clk = { + .name ="dout_mmc3" , + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_FSYS , .shift =12 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS2 , .shift =16 , .size =4 }, +}; + +static struct clksrc_clk exynos5_clk_dout_mmc4 = { + .clk = { + .name ="dout_mmc4" , + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_FSYS , .shift =16 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS3 , .shift =0 , .size =4 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_uart0 = { + .clk = { + .name ="uclk1" , + .devname ="exynos4210-uart.0" , + .enable = exynos5_clksrc_mask_peric0_ctrl, + .ctrlbit = (1 <<0 ), + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_PERIC0 , .shift =0 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_PERIC0 , .shift =0 , .size =4 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_uart1 = { + .clk = { + .name ="uclk1" , + .devname ="exynos4210-uart.1" , + .enable = exynos5_clksrc_mask_peric0_ctrl, + .ctrlbit = (1 <<4 ), + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_PERIC0 , .shift =4 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_PERIC0 , .shift =4 , .size =4 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_uart2 = { + .clk = { + .name ="uclk1" , + .devname ="exynos4210-uart.2" , + .enable = exynos5_clksrc_mask_peric0_ctrl, + .ctrlbit = (1 <<8 ), + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_PERIC0 , .shift =8 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_PERIC0 , .shift =8 , .size =4 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_uart3 = { + .clk = { + .name ="uclk1" , + .devname ="exynos4210-uart.3" , + .enable = exynos5_clksrc_mask_peric0_ctrl, + .ctrlbit = (1 <<12 ), + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_PERIC0 , .shift =12 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_PERIC0 , .shift =12 , .size =4 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_mmc0 = { + .clk = { + .name ="sclk_mmc" , + .devname ="s3c-sdhci.0" , + .parent = &exynos5_clk_dout_mmc0.clk, + .enable = exynos5_clksrc_mask_fsys_ctrl, + .ctrlbit = (1 <<0 ), + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS1 , .shift =8 , .size =8 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_mmc1 = { + .clk = { + .name ="sclk_mmc" , + .devname ="s3c-sdhci.1" , + .parent = &exynos5_clk_dout_mmc1.clk, + .enable = exynos5_clksrc_mask_fsys_ctrl, + .ctrlbit = (1 <<4 ), + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS1 , .shift =24 , .size =8 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_mmc2 = { + .clk = { + .name ="sclk_mmc" , + .devname ="s3c-sdhci.2" , + .parent = &exynos5_clk_dout_mmc2.clk, + .enable = exynos5_clksrc_mask_fsys_ctrl, + .ctrlbit = (1 <<8 ), + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS2 , .shift =8 , .size =8 }, +}; + +static struct clksrc_clk exynos5_clk_sclk_mmc3 = { + .clk = { + .name ="sclk_mmc" , + .devname ="s3c-sdhci.3" , + .parent = &exynos5_clk_dout_mmc3.clk, + .enable = exynos5_clksrc_mask_fsys_ctrl, + .ctrlbit = (1 <<12 ), + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS2 , .shift =24 , .size =8 }, +}; + +static struct clksrc_clk exynos5_clksrcs[] = { + { + .clk = { + .name ="sclk_dwmci" , + .parent = &exynos5_clk_dout_mmc4.clk, + .enable = exynos5_clksrc_mask_fsys_ctrl, + .ctrlbit = (1 <<16 ), + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_FSYS3 , .shift =8 , .size =8 }, + }, { + .clk = { + .name ="sclk_fimd" , + .devname ="s3cfb.1" , + .enable = exynos5_clksrc_mask_disp1_0_ctrl, + .ctrlbit = (1 <<0 ), + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_DISP1_0 , .shift =0 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_DISP1_0 , .shift =0 , .size =4 }, + }, { + .clk = { + .name ="aclk_266_gscl" , + }, + .sources = &clk_src_gscl_266, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP3 , .shift =8 , .size =1 }, + }, { + .clk = { + .name ="sclk_g3d" , + .devname ="mali-t604.0" , + .enable = exynos5_clk_block_ctrl, + .ctrlbit = (1 <<1 ), + }, + .sources = &exynos5_clkset_aclk, + .reg_src = { .reg =EXYNOS5_CLKSRC_TOP0 , .shift =20 , .size =1 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_TOP0 , .shift =24 , .size =3 }, + }, { + .clk = { + .name ="sclk_gscl_wrap" , + .devname ="s5p-mipi-csis.0" , + .enable = exynos5_clksrc_mask_gscl_ctrl, + .ctrlbit = (1 <<24 ), + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_GSCL , .shift =24 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_GSCL , .shift =24 , .size =4 }, + }, { + .clk = { + .name ="sclk_gscl_wrap" , + .devname ="s5p-mipi-csis.1" , + .enable = exynos5_clksrc_mask_gscl_ctrl, + .ctrlbit = (1 <<28 ), + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_GSCL , .shift =28 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_GSCL , .shift =28 , .size =4 }, + }, { + .clk = { + .name ="sclk_cam0" , + .enable = exynos5_clksrc_mask_gscl_ctrl, + .ctrlbit = (1 <<16 ), + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_GSCL , .shift =16 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_GSCL , .shift =16 , .size =4 }, + }, { + .clk = { + .name ="sclk_cam1" , + .enable = exynos5_clksrc_mask_gscl_ctrl, + .ctrlbit = (1 <<20 ), + }, + .sources = &exynos5_clkset_group, + .reg_src = { .reg =EXYNOS5_CLKSRC_GSCL , .shift =20 , .size =4 }, + .reg_div = { .reg =EXYNOS5_CLKDIV_GSCL , .shift =20 , .size =4 }, + }, { + .clk = { + .name ="sclk_jpeg" , + .parent = &exynos5_clk_mout_cpll.clk, + }, + .reg_div = { .reg =EXYNOS5_CLKDIV_GEN , .shift =4 , .size =3 }, + }, +}; + +/* Clock initialization code */ +static struct clksrc_clk *exynos5_sysclks[] = { + &exynos5_clk_mout_apll, + &exynos5_clk_sclk_apll, + &exynos5_clk_mout_bpll, + &exynos5_clk_mout_bpll_user, + &exynos5_clk_mout_cpll, + &exynos5_clk_mout_epll, + &exynos5_clk_mout_mpll, + &exynos5_clk_mout_mpll_user, + &exynos5_clk_vpllsrc, + &exynos5_clk_sclk_vpll, + &exynos5_clk_mout_cpu, + &exynos5_clk_dout_armclk, + &exynos5_clk_dout_arm2clk, + &exynos5_clk_cdrex, + &exynos5_clk_aclk_400, + &exynos5_clk_aclk_333, + &exynos5_clk_aclk_266, + &exynos5_clk_aclk_200, + &exynos5_clk_aclk_166, + &exynos5_clk_aclk_66_pre, + &exynos5_clk_aclk_66, + &exynos5_clk_dout_mmc0, + &exynos5_clk_dout_mmc1, + &exynos5_clk_dout_mmc2, + &exynos5_clk_dout_mmc3, + &exynos5_clk_dout_mmc4, + &exynos5_clk_aclk_acp, + &exynos5_clk_pclk_acp, +}; + +static struct clk *exynos5_clk_cdev[] = { + &exynos5_clk_pdma0, + &exynos5_clk_pdma1, + &exynos5_clk_mdma1, +}; + +static struct clksrc_clk *exynos5_clksrc_cdev[] = { + &exynos5_clk_sclk_uart0, + &exynos5_clk_sclk_uart1, + &exynos5_clk_sclk_uart2, + &exynos5_clk_sclk_uart3, + &exynos5_clk_sclk_mmc0, + &exynos5_clk_sclk_mmc1, + &exynos5_clk_sclk_mmc2, + &exynos5_clk_sclk_mmc3, +}; + +static struct clk_lookup exynos5_clk_lookup[] = { +CLKDEV_INIT ("exynos4210-uart.0" ,"clk_uart_baud0" , &exynos5_clk_sclk_uart0.clk), +CLKDEV_INIT ("exynos4210-uart.1" ,"clk_uart_baud0" , &exynos5_clk_sclk_uart1.clk), +CLKDEV_INIT ("exynos4210-uart.2" ,"clk_uart_baud0" , &exynos5_clk_sclk_uart2.clk), +CLKDEV_INIT ("exynos4210-uart.3" ,"clk_uart_baud0" , &exynos5_clk_sclk_uart3.clk), +CLKDEV_INIT ("s3c-sdhci.0" ,"mmc_busclk.2" , &exynos5_clk_sclk_mmc0.clk), +CLKDEV_INIT ("s3c-sdhci.1" ,"mmc_busclk.2" , &exynos5_clk_sclk_mmc1.clk), +CLKDEV_INIT ("s3c-sdhci.2" ,"mmc_busclk.2" , &exynos5_clk_sclk_mmc2.clk), +CLKDEV_INIT ("s3c-sdhci.3" ,"mmc_busclk.2" , &exynos5_clk_sclk_mmc3.clk), +CLKDEV_INIT ("dma-pl330.0" ,"apb_pclk" , &exynos5_clk_pdma0), +CLKDEV_INIT ("dma-pl330.1" ,"apb_pclk" , &exynos5_clk_pdma1), +CLKDEV_INIT ("dma-pl330.2" ,"apb_pclk" , &exynos5_clk_mdma1), +}; + +static unsigned long exynos5_epll_get_rate (struct clk *clk) +{ +return clk->rate; +} + +static struct clk *exynos5_clks[]__initdata = { + &exynos5_clk_sclk_hdmi27m, + &exynos5_clk_sclk_hdmiphy, + &clk_fout_bpll, + &clk_fout_cpll, + &exynos5_clk_armclk, +}; + +static u32 epll_div[][6 ] = { + {192000000 ,0 ,48 ,3 ,1 ,0 }, + {180000000 ,0 ,45 ,3 ,1 ,0 }, + {73728000 ,1 ,73 ,3 ,3 ,47710 }, + {67737600 ,1 ,90 ,4 ,3 ,20762 }, + {49152000 ,0 ,49 ,3 ,3 ,9961 }, + {45158400 ,0 ,45 ,3 ,3 ,10381 }, + {180633600 ,0 ,45 ,3 ,1 ,10381 }, +}; + +static int exynos5_epll_set_rate (struct clk *clk,unsigned long rate) +{ +unsigned int epll_con, epll_con_k; +unsigned int i; +unsigned int tmp; +unsigned int epll_rate; +unsigned int locktime; +unsigned int lockcnt; + +/* Return if nothing changed */ +if (clk->rate == rate) +return 0 ; + +if (clk->parent) + epll_rate =clk_get_rate (clk->parent); +else + epll_rate = clk_ext_xtal_mux.rate; + +if (epll_rate !=24000000 ) { +pr_err ("Invalid Clock : recommended clock is 24MHz.\n" ); +return -EINVAL ; + } + + epll_con =__raw_readl (EXYNOS5_EPLL_CON0 ); + epll_con &= ~(0x1 <<27 | \ +PLL46XX_MDIV_MASK <<PLL46XX_MDIV_SHIFT | \ +PLL46XX_PDIV_MASK <<PLL46XX_PDIV_SHIFT | \ +PLL46XX_SDIV_MASK <<PLL46XX_SDIV_SHIFT ); + +for (i =0 ; i <ARRAY_SIZE (epll_div); i++) { +if (epll_div[i][0 ] == rate) { + epll_con_k = epll_div[i][5 ] <<0 ; + epll_con |= epll_div[i][1 ] <<27 ; + epll_con |= epll_div[i][2 ] <<PLL46XX_MDIV_SHIFT ; + epll_con |= epll_div[i][3 ] <<PLL46XX_PDIV_SHIFT ; + epll_con |= epll_div[i][4 ] <<PLL46XX_SDIV_SHIFT ; +break ; + } + } + +if (i ==ARRAY_SIZE (epll_div)) { +printk (KERN_ERR "%s: Invalid Clock EPLL Frequency\n" , + __func__); +return -EINVAL ; + } + + epll_rate /=1000000 ; + +/* 3000 max_cycls : specification data */ + locktime =3000 / epll_rate * epll_div[i][3 ]; + lockcnt = locktime *10000 / (10000 / epll_rate); + +__raw_writel (lockcnt,EXYNOS5_EPLL_LOCK ); + +__raw_writel (epll_con,EXYNOS5_EPLL_CON0 ); +__raw_writel (epll_con_k,EXYNOS5_EPLL_CON1 ); + +do { + tmp =__raw_readl (EXYNOS5_EPLL_CON0 ); + }while (!(tmp &0x1 <<EXYNOS5_EPLLCON0_LOCKED_SHIFT )); + + clk->rate = rate; + +return 0 ; +} + +static struct clk_ops exynos5_epll_ops = { + .get_rate = exynos5_epll_get_rate, + .set_rate = exynos5_epll_set_rate, +}; + +static int xtal_rate; + +static unsigned long exynos5_fout_apll_get_rate (struct clk *clk) +{ +return s5p_get_pll35xx (xtal_rate,__raw_readl (EXYNOS5_APLL_CON0 )); +} + +static struct clk_ops exynos5_fout_apll_ops = { + .get_rate = exynos5_fout_apll_get_rate, +}; + +#ifdef CONFIG_PM +static int exynos5_clock_suspend (void ) +{ +s3c_pm_do_save (exynos5_clock_save,ARRAY_SIZE (exynos5_clock_save)); + +return 0 ; +} + +static void exynos5_clock_resume (void ) +{ +s3c_pm_do_restore_core (exynos5_clock_save,ARRAY_SIZE (exynos5_clock_save)); +} +#else +#define exynos5_clock_suspend NULL +#define exynos5_clock_resume NULL +#endif + +struct syscore_ops exynos5_clock_syscore_ops = { + .suspend = exynos5_clock_suspend, + .resume = exynos5_clock_resume, +}; + +void __init_or_cpufreq exynos5_setup_clocks(void) +{ +struct clk *xtal_clk; +unsigned long apll; +unsigned long bpll; +unsigned long cpll; +unsigned long mpll; +unsigned long epll; +unsigned long vpll; +unsigned long vpllsrc; +unsigned long xtal; +unsigned long armclk; +unsigned long mout_cdrex; +unsigned long aclk_400; +unsigned long aclk_333; +unsigned long aclk_266; +unsigned long aclk_200; +unsigned long aclk_166; +unsigned long aclk_66; +unsigned int ptr; + +printk (KERN_DEBUG "%s: registering clocks\n" , __func__); + + xtal_clk =clk_get (NULL ,"xtal" ); +BUG_ON (IS_ERR (xtal_clk)); + + xtal =clk_get_rate (xtal_clk); + + xtal_rate = xtal; + +clk_put (xtal_clk); + +printk (KERN_DEBUG "%s: xtal is %ld\n" , __func__, xtal); + + apll =s5p_get_pll35xx (xtal,__raw_readl (EXYNOS5_APLL_CON0 )); + bpll =s5p_get_pll35xx (xtal,__raw_readl (EXYNOS5_BPLL_CON0 )); + cpll =s5p_get_pll35xx (xtal,__raw_readl (EXYNOS5_CPLL_CON0 )); + mpll =s5p_get_pll35xx (xtal,__raw_readl (EXYNOS5_MPLL_CON0 )); + epll =s5p_get_pll36xx (xtal,__raw_readl (EXYNOS5_EPLL_CON0 ), +__raw_readl (EXYNOS5_EPLL_CON1 )); + + vpllsrc =clk_get_rate (&exynos5_clk_vpllsrc.clk); + vpll =s5p_get_pll36xx (vpllsrc,__raw_readl (EXYNOS5_VPLL_CON0 ), +__raw_readl (EXYNOS5_VPLL_CON1 )); + + clk_fout_apll.ops = &exynos5_fout_apll_ops; + clk_fout_bpll.rate = bpll; + clk_fout_cpll.rate = cpll; + clk_fout_mpll.rate = mpll; + clk_fout_epll.rate = epll; + clk_fout_vpll.rate = vpll; + +printk (KERN_INFO "EXYNOS5: PLL settings, A=%ld, B=%ld, C=%ld\n" +"M=%ld, E=%ld V=%ld" , + apll, bpll, cpll, mpll, epll, vpll); + + armclk =clk_get_rate (&exynos5_clk_armclk); + mout_cdrex =clk_get_rate (&exynos5_clk_cdrex.clk); + + aclk_400 =clk_get_rate (&exynos5_clk_aclk_400.clk); + aclk_333 =clk_get_rate (&exynos5_clk_aclk_333.clk); + aclk_266 =clk_get_rate (&exynos5_clk_aclk_266.clk); + aclk_200 =clk_get_rate (&exynos5_clk_aclk_200.clk); + aclk_166 =clk_get_rate (&exynos5_clk_aclk_166.clk); + aclk_66 =clk_get_rate (&exynos5_clk_aclk_66.clk); + +printk (KERN_INFO "EXYNOS5: ARMCLK=%ld, CDREX=%ld, ACLK400=%ld\n" +"ACLK333=%ld, ACLK266=%ld, ACLK200=%ld\n" +"ACLK166=%ld, ACLK66=%ld\n" , + armclk, mout_cdrex, aclk_400, + aclk_333, aclk_266, aclk_200, + aclk_166, aclk_66); + + + clk_fout_epll.ops = &exynos5_epll_ops; + +if (clk_set_parent (&exynos5_clk_mout_epll.clk, &clk_fout_epll)) +printk (KERN_ERR "Unable to set parent %s of clock %s.\n" , + clk_fout_epll.name, exynos5_clk_mout_epll.clk.name); + +clk_set_rate (&exynos5_clk_sclk_apll.clk,100000000 ); +clk_set_rate (&exynos5_clk_aclk_266.clk,300000000 ); + +clk_set_rate (&exynos5_clk_aclk_acp.clk,267000000 ); +clk_set_rate (&exynos5_clk_pclk_acp.clk,134000000 ); + +for (ptr =0 ; ptr <ARRAY_SIZE (exynos5_clksrcs); ptr++) +s3c_set_clksrc (&exynos5_clksrcs[ptr], true); +} + +void __init exynos5_register_clocks (void ) +{ +int ptr; + +s3c24xx_register_clocks (exynos5_clks,ARRAY_SIZE (exynos5_clks)); + +for (ptr =0 ; ptr <ARRAY_SIZE (exynos5_sysclks); ptr++) +s3c_register_clksrc (exynos5_sysclks[ptr],1 ); + +for (ptr =0 ; ptr <ARRAY_SIZE (exynos5_sclk_tv); ptr++) +s3c_register_clksrc (exynos5_sclk_tv[ptr],1 ); + +for (ptr =0 ; ptr <ARRAY_SIZE (exynos5_clksrc_cdev); ptr++) +s3c_register_clksrc (exynos5_clksrc_cdev[ptr],1 ); + +s3c_register_clksrc (exynos5_clksrcs,ARRAY_SIZE (exynos5_clksrcs)); +s3c_register_clocks (exynos5_init_clocks_on,ARRAY_SIZE (exynos5_init_clocks_on)); + +s3c24xx_register_clocks (exynos5_clk_cdev,ARRAY_SIZE (exynos5_clk_cdev)); +for (ptr =0 ; ptr <ARRAY_SIZE (exynos5_clk_cdev); ptr++) +s3c_disable_clocks (exynos5_clk_cdev[ptr],1 ); + +s3c_register_clocks (exynos5_init_clocks_off,ARRAY_SIZE (exynos5_init_clocks_off)); +s3c_disable_clocks (exynos5_init_clocks_off,ARRAY_SIZE (exynos5_init_clocks_off)); +clkdev_add_table (exynos5_clk_lookup,ARRAY_SIZE (exynos5_clk_lookup)); + +register_syscore_ops (&exynos5_clock_syscore_ops); +s3c_pwmclk_init (); +}
arch/arm/mach-exynos/include/mach/regs-clock.h +62 -0
68 lines not on this page · raw message
arch/arm/plat-s5p/clock.c +36 -0
@@ -61,6 +61,20 @@ struct clk clk_fout_apll = { .id = -1, }; +/* BPLL clock output */ + +struct clk clk_fout_bpll = { + .name ="fout_bpll" , + .id =-1 , +}; + +/* CPLL clock output */ + +struct clk clk_fout_cpll = { + .name ="fout_cpll" , + .id =-1 , +}; +/* MPLL clock output * No need .ctrlbit, this is always on */
@@ -101,6 +115,28 @@ struct clksrc_sources clk_src_apll = { .nr_sources = ARRAY_SIZE(clk_src_apll_list), }; +/* Possible clock sources for BPLL Mux */ +static struct clk *clk_src_bpll_list[] = { + [0 ] = &clk_fin_bpll, + [1 ] = &clk_fout_bpll, +}; + +struct clksrc_sources clk_src_bpll = { + .sources = clk_src_bpll_list, + .nr_sources =ARRAY_SIZE (clk_src_bpll_list), +}; + +/* Possible clock sources for CPLL Mux */ +static struct clk *clk_src_cpll_list[] = { + [0 ] = &clk_fin_cpll, + [1 ] = &clk_fout_cpll, +}; + +struct clksrc_sources clk_src_cpll = { + .sources = clk_src_cpll_list, + .nr_sources =ARRAY_SIZE (clk_src_cpll_list), +}; +/* Possible clock sources for MPLL Mux */ static struct clk *clk_src_mpll_list[] = { [0 ] = &clk_fin_mpll,
arch/arm/plat-samsung/include/plat/s5p-clock.h +6 -0
@@ -18,6 +18,8 @@#define GET_DIV (clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1)#define clk_fin_apll clk_ext_xtal_mux +#define clk_fin_bpll clk_ext_xtal_mux +#define clk_fin_cpll clk_ext_xtal_mux#define clk_fin_mpll clk_ext_xtal_mux#define clk_fin_epll clk_ext_xtal_mux#define clk_fin_dpll clk_ext_xtal_mux
@@ -29,6 +31,8 @@ extern struct clk clk_xusbxti;extern struct clk clk_48m;extern struct clk s5p_clk_27m;extern struct clk clk_fout_apll; +extern struct clk clk_fout_bpll; +extern struct clk clk_fout_cpll;extern struct clk clk_fout_mpll;extern struct clk clk_fout_epll;extern struct clk clk_fout_dpll;
@@ -37,6 +41,8 @@ extern struct clk clk_arm;extern struct clk clk_vpll;extern struct clksrc_sources clk_src_apll; +extern struct clksrc_sources clk_src_bpll; +extern struct clksrc_sources clk_src_cpll;extern struct clksrc_sources clk_src_mpll;extern struct clksrc_sources clk_src_epll;extern struct clksrc_sources clk_src_dpll;
Signature · 1 line
1.7.4.4
PATCH v3 4/12 ARM: EXYNOS: add initial setup-i2c0 for EXYNOS5
In reply to Kukjin KimIn all of Samsung platform, the setup-i2c0.c file for I2C channel 0 is always compiled. So when supporting new SoC,it should be updated for it. Since EXYNOS5 GPIO will be supported after this, there is no setup gpio in there now. It will be implemented with that, of course.
--- arch/arm/mach-exynos/Makefile | 2 +- arch/arm/mach-exynos/setup-i2c0.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-)
arch/arm/mach-exynos/Makefile +1 -1
@@ -52,7 +52,7 @@ obj-$(CONFIG_EXYNOS4_DEV_DWMCI) += dev-dwmci.o obj-$(CONFIG_EXYNOS4_DEV_DMA) += dma.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_FIMD0) += setup-fimd0.o obj-$(CONFIG_EXYNOS4_SETUP_I2C1) += setup-i2c1.o
arch/arm/mach-exynos/setup-i2c0.c +6 -3
@@ -1,7 +1,5 @@/* -* linux/arch/arm/mach-exynos4/setup-i2c0.c -* -* Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. +* Copyright (c) 2009-2012 Samsung Electronics Co., Ltd. * http://www.samsung.com/ * * I2C0 GPIO configuration.
@@ -18,9 +16,14 @@ struct platform_device; /* don't need the contents */#include <linux/gpio.h> #include <plat/iic.h> #include <plat/gpio-cfg.h> +#include <plat/cpu.h> void s3c_i2c0_cfg_gpio (struct platform_device *dev) { +if (soc_is_exynos5250 ()) +/* will be implemented with gpio function */ +return ; +s3c_gpio_cfgall_range (EXYNOS4_GPD1 (0 ),2 ,S3C_GPIO_SFN (2 ),S3C_GPIO_PULL_UP ); }
Signature · 1 line
1.7.4.4
PATCH v3 5/12 ARM: EXYNOS: add support uart for EXYNOS4 and EXYNOS5
In reply to Kukjin KimActually, the base address of uart is different between EXYNOS4 and EXYNOS5 and this patch enables to support uart for EXYNOS4 and EXYNOS5 SoCs at runtime.
--- arch/arm/mach-exynos/Makefile | 1 + arch/arm/mach-exynos/common.c | 5 +- arch/arm/mach-exynos/dev-uart.c | 78 +++++++++++++++++++++++ arch/arm/mach-exynos/include/mach/debug-macro.S | 9 ++- arch/arm/mach-exynos/include/mach/irqs.h | 12 ++++ arch/arm/mach-exynos/include/mach/map.h | 20 +++--- arch/arm/mach-exynos/include/mach/uncompress.h | 17 ++++-- arch/arm/plat-s5p/Kconfig | 4 + arch/arm/plat-s5p/Makefile | 3 +- arch/arm/plat-samsung/include/plat/devs.h | 2 + arch/arm/plat-samsung/include/plat/uncompress.h | 2 + 11 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 arch/arm/mach-exynos/dev-uart.c
arch/arm/mach-exynos/Makefile +1 -0
@@ -44,6 +44,7 @@ obj-$(CONFIG_MACH_EXYNOS4_DT) += mach-exynos4-dt.o # device support +obj-y += dev-uart.o obj-$(CONFIG_ARCH_EXYNOS4) += dev-audio.o obj-$(CONFIG_EXYNOS4_DEV_AHCI) += dev-ahci.o obj-$(CONFIG_EXYNOS4_DEV_PD) += dev-pd.o
arch/arm/mach-exynos/common.c +4 -1
@@ -477,7 +477,10 @@ static void __init exynos_init_uarts(struct s3c2410_uartcfg *cfg, int no)for (ucnt =0 ; ucnt < no; ucnt++, tcfg++) 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 DEFINE_SPINLOCK (eint_lock);
arch/arm/mach-exynos/dev-uart.c new file +78 -0
78 lines not on this page · raw message
arch/arm/mach-exynos/include/mach/debug-macro.S +7 -2
@@ -21,8 +21,13 @@ */ .macro addruart, rp, rv, tmp - ldr \rp, = S3C_PA_UART - ldr \rv, = S3C_VA_UART + mov \rp, #0x10000000 + 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 add \rp, \rp, #(0x10000 * CONFIG_DEBUG_S3C_UART) add \rv, \rv, #(0x10000 * CONFIG_DEBUG_S3C_UART)
arch/arm/mach-exynos/include/mach/irqs.h +12 -0
@@ -171,4 +171,16 @@/* Set the default NR_IRQS */ #define NR_IRQS (IRQ_TIMER_BASE + IRQ_TIMER_COUNT) +#define EXYNOS4_IRQ_UART0 IRQ_SPI(52) +#define EXYNOS4_IRQ_UART1 IRQ_SPI(53) +#define EXYNOS4_IRQ_UART2 IRQ_SPI(54) +#define EXYNOS4_IRQ_UART3 IRQ_SPI(55) +#define EXYNOS4_IRQ_UART4 IRQ_SPI(56) + +#define EXYNOS5_IRQ_UART0 IRQ_SPI(51) +#define EXYNOS5_IRQ_UART1 IRQ_SPI(52) +#define EXYNOS5_IRQ_UART2 IRQ_SPI(53) +#define EXYNOS5_IRQ_UART3 IRQ_SPI(54) +#define EXYNOS5_IRQ_UART4 IRQ_SPI(55) +#endif /* __ASM_ARCH_IRQS_H */
arch/arm/mach-exynos/include/mach/map.h +11 -9
@@ -152,7 +152,6 @@#define S3C_PA_IIC7 EXYNOS4_PA_IIC(7)#define S3C_PA_RTC EXYNOS4_PA_RTC#define S3C_PA_WDT EXYNOS4_PA_WATCHDOG -#define S3C_PA_UART EXYNOS4_PA_UART#define S3C_PA_SPI0 EXYNOS4_PA_SPI0#define S3C_PA_SPI1 EXYNOS4_PA_SPI1#define S3C_PA_SPI2 EXYNOS4_PA_SPI2
@@ -181,15 +180,18 @@/* 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 S5P_PA_UART0 S5P_PA_UART(0) -#define S5P_PA_UART1 S5P_PA_UART(1) -#define S5P_PA_UART2 S5P_PA_UART(2) -#define S5P_PA_UART3 S5P_PA_UART(3) -#define S5P_PA_UART4 S5P_PA_UART(4) +#define EXYNOS5_PA_UART0 0x12C00000 +#define EXYNOS5_PA_UART1 0x12C10000 +#define EXYNOS5_PA_UART2 0x12C20000 +#define EXYNOS5_PA_UART3 0x12C30000 +#define EXYNOS5_SZ_UART SZ_256 -#define S5P_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/uncompress.h +12 -5
@@ -1,9 +1,8 @@ -/* linux/arch/arm/mach-exynos4/include/mach/uncompress.h -* -* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. +/* +* Copyright (c) 2010-2012 Samsung Electronics Co., Ltd. * http://www.samsung.com * -* EXYNOS4 - uncompress code +* EXYNOS - uncompress code * * 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
@@ -13,12 +12,20 @@#ifndef __ASM_ARCH_UNCOMPRESS_H#define __ASM_ARCH_UNCOMPRESS_H __FILE__ +#include <asm/mach-types.h> +#include <mach/map.h> + +volatile u8 *uart_base; +#include <plat/uncompress.h> static void arch_detect_cpu (void ) { -/* we do not need to do any cpu detection here at the moment. */ +if (machine_is_smdk5250 ()) + uart_base = (volatile u8 *)EXYNOS5_PA_UART + (S3C_UART_OFFSET *CONFIG_S3C_LOWLEVEL_UART_PORT ); +else + uart_base = (volatile u8 *)EXYNOS4_PA_UART + (S3C_UART_OFFSET *CONFIG_S3C_LOWLEVEL_UART_PORT );/* * For preventing FIFO overrun or infinite loop of UART console,
arch/arm/plat-s5p/Kconfig +4 -0
@@ -40,6 +40,10 @@ config S5P_HRT help Use the High Resolution timer support +config S5P_DEV_UART + def_bool y + depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210) + config S5P_PM bool help
arch/arm/plat-s5p/Makefile +2 -1
@@ -12,7 +12,6 @@ obj- := # Core files -obj-y += dev-uart.o obj-y += clock.o obj-y += irq.o obj-$(CONFIG_S5P_EXT_INT) += irq-eint.o
@@ -23,5 +22,7 @@ obj-$(CONFIG_S5P_SLEEP) += sleep.o obj-$(CONFIG_S5P_HRT) += s5p-time.o # devices + +obj-$(CONFIG_S5P_DEV_UART) += dev-uart.o obj-$(CONFIG_S5P_DEV_MFC) += dev-mfc.o obj-$(CONFIG_S5P_SETUP_MIPIPHY) += setup-mipiphy.o
arch/arm/plat-samsung/include/plat/devs.h +2 -0
@@ -26,6 +26,8 @@ struct s3c24xx_uart_resources {extern struct s3c24xx_uart_resources s3c2410_uart_resources[];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 platform_device *s3c24xx_uart_devs[];extern struct platform_device *s3c24xx_uart_src[];
arch/arm/plat-samsung/include/plat/uncompress.h +2 -0
@@ -37,7 +37,9 @@ static void arch_detect_cpu(void);/* how many bytes we allow into the FIFO at a time in FIFO mode */ #define FIFO_MAX (14) +#ifdef S3C_PA_UART #define uart_base S3C_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT) +#endif static __inline__void uart_wr (unsigned int reg,unsigned int val)
Signature · 1 line
1.7.4.4
PATCH v3 5/12 ARM: EXYNOS: add support uart for EXYNOS4 and EXYNOS5
Quoted 3 lines · Kukjin Kim
Actually, the base address of uart is different between EXYNOS4 and EXYNOS5 and this patch enables to support uart for EXYNOS4 and EXYNOS5 SoCs at runtime.
Can you explain why this patch is still needed? The exynos5250_dt_map_io function does not call s3c24xx_init_uarts() at all, so it seems that most of this patch just adds dead code that would only be needed for the non-dt case.
Arnd
PATCH v3 5/12 ARM: EXYNOS: add support uart for EXYNOS4 and EXYNOS5
Quoted 10 lines · Arnd Bergmann
Quoted 3 lines · Kukjin Kim
Actually, the base address of uart is different between EXYNOS4 and EXYNOS5 and this patch enables to support uart for EXYNOS4 and EXYNOS5 SoCs at runtime.
Can you explain why this patch is still needed? The
exynos5250_dt_map_iofunction does not calls3c24xx_init_uarts()at all, so it seems that most of this patch just adds dead code that would only be needed for the non-dt case.
Yes, as you said, dt can support uart without most of this changes so we can drop adding/setup platform devices for uart here. But I thought non-dt exynos4 supporting is still available in mach-exynos/ and actually it is used for many product now and exynos5 can be selected for single zImage without CONFIG_OF. Even though we will move to only supporting dt world in mach-exynos/ for all of EXYNOS SoCs in the near future. So would be removed it when non-dt exynos4 does not support.
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.
PATCH v3 6/12 ARM: EXYNOS: add support for EXYNOS5250 SoC
In reply to Kukjin KimThis patch add support for EXYNOS5250 SoC has two Cortex-A15 cores. Since actually, most codes in mach-exynos/ are used commonly for EXYNOS4 and EXYNOS5 the EXYNOS5/EXYNOS5250 has been implemented in mach-exynos/.
--- arch/arm/Makefile | 1 + arch/arm/mach-exynos/common.c | 191 ++++++++++++++++++++++++-- arch/arm/mach-exynos/common.h | 11 ++ arch/arm/mach-exynos/include/mach/map.h | 21 +++- arch/arm/mach-exynos/include/mach/regs-pmu.h | 1 + arch/arm/plat-s5p/Kconfig | 4 +- arch/arm/plat-samsung/include/plat/cpu.h | 10 ++ 7 files changed, 223 insertions(+), 16 deletions(-)
arch/arm/Makefile +1 -0
@@ -180,6 +180,7 @@ machine-$(CONFIG_ARCH_S5P64X0) := s5p64x0 machine-$(CONFIG_ARCH_S5PC100) := s5pc100 machine-$(CONFIG_ARCH_S5PV210) := s5pv210 machine-$(CONFIG_ARCH_EXYNOS4) := exynos +machine-$(CONFIG_ARCH_EXYNOS5) := exynos machine-$(CONFIG_ARCH_SA1100) := sa1100 machine-$(CONFIG_ARCH_SHARK) := shark machine-$(CONFIG_ARCH_SHMOBILE) := shmobile
arch/arm/mach-exynos/common.c +179 -12
282 lines not on this page · raw message
arch/arm/mach-exynos/common.h +11 -0
@@ -16,7 +16,9 @@ extern struct sys_timer exynos4_timer;void exynos_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); +void exynos5_restart (char mode,const char *cmd);#ifdef CONFIG_ARCH_EXYNOS4 void exynos4_register_clocks (void );
@@ -27,6 +29,15 @@ void exynos4_setup_clocks(void);#define exynos4_setup_clocks ()#endif +#ifdef CONFIG_ARCH_EXYNOS5 +void exynos5_register_clocks (void ); +void exynos5_setup_clocks (void ); + +#else +#define exynos5_register_clocks () +#define exynos5_setup_clocks () +#endif +#ifdef CONFIG_CPU_EXYNOS4210 void exynos4210_register_clocks (void );
arch/arm/mach-exynos/include/mach/map.h +19 -2
@@ -25,6 +25,7 @@#define EXYNOS4_PA_SYSRAM0 0x02025000#define EXYNOS4_PA_SYSRAM1 0x02020000 +#define EXYNOS5_PA_SYSRAM 0x02020000#define EXYNOS4_PA_FIMC0 0x11800000#define EXYNOS4_PA_FIMC1 0x11810000
@@ -44,14 +45,23 @@#define EXYNOS4_PA_ONENAND 0x0C000000#define EXYNOS4_PA_ONENAND_DMA 0x0C600000 -#define EXYNOS4_PA_CHIPID 0x10000000 +#define EXYNOS_PA_CHIPID 0x10000000#define EXYNOS4_PA_SYSCON 0x10010000 +#define EXYNOS5_PA_SYSCON 0x10050100 +#define EXYNOS4_PA_PMU 0x10020000 +#define EXYNOS5_PA_PMU 0x10040000 +#define EXYNOS4_PA_CMU 0x10030000 +#define EXYNOS5_PA_CMU 0x10010000#define EXYNOS4_PA_SYSTIMER 0x10050000 +#define EXYNOS5_PA_SYSTIMER 0x101C0000 +#define EXYNOS4_PA_WATCHDOG 0x10060000 +#define EXYNOS5_PA_WATCHDOG 0x101D0000 +#define EXYNOS4_PA_RTC 0x10070000#define EXYNOS4_PA_KEYPAD 0x100A0000
@@ -59,9 +69,12 @@#define EXYNOS4_PA_DMC0 0x10400000#define EXYNOS4_PA_COMBINER 0x10440000 +#define EXYNOS5_PA_COMBINER 0x10440000#define EXYNOS4_PA_GIC_CPU 0x10480000#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_TWD 0x10500600
@@ -91,7 +104,6 @@#define EXYNOS4_PA_SPI1 0x13930000#define EXYNOS4_PA_SPI2 0x13940000 -#define EXYNOS4_PA_GPIO1 0x11400000#define EXYNOS4_PA_GPIO2 0x11000000#define EXYNOS4_PA_GPIO3 0x03860000
@@ -109,6 +121,7 @@#define EXYNOS4_PA_SATAPHY_CTRL 0x126B0000#define EXYNOS4_PA_SROMC 0x12570000 +#define EXYNOS5_PA_SROMC 0x12250000#define EXYNOS4_PA_EHCI 0x12580000#define EXYNOS4_PA_OHCI 0x12590000
@@ -116,6 +129,7 @@#define EXYNOS4_PA_MFC 0x13400000#define EXYNOS4_PA_UART 0x13800000 +#define EXYNOS5_PA_UART 0x12C00000#define EXYNOS4_PA_VP 0x12C00000#define EXYNOS4_PA_MIXER 0x12C10000
@@ -124,6 +138,7 @@#define EXYNOS4_PA_IIC_HDMIPHY 0x138E0000#define EXYNOS4_PA_IIC (x) (0x13860000 + ((x) * 0x10000)) +#define EXYNOS5_PA_IIC (x) (0x12C60000 + ((x) * 0x10000))#define EXYNOS4_PA_ADC 0x13910000#define EXYNOS4_PA_ADC1 0x13911000
@@ -133,8 +148,10 @@#define EXYNOS4_PA_SPDIF 0x139B0000#define EXYNOS4_PA_TIMER 0x139D0000 +#define EXYNOS5_PA_TIMER 0x12DD0000#define EXYNOS4_PA_SDRAM 0x40000000 +#define EXYNOS5_PA_SDRAM 0x40000000/* Compatibiltiy Defines */
arch/arm/mach-exynos/include/mach/regs-pmu.h +1 -0
@@ -31,6 +31,7 @@#define S5P_USE_STANDBYWFE_ISP_ARM (1 << 26)#define S5P_SWRESET S5P_PMUREG(0x0400) +#define EXYNOS_SWRESET S5P_PMUREG(0x0400)#define S5P_WAKEUP_STAT S5P_PMUREG(0x0600)#define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604)
arch/arm/plat-s5p/Kconfig +2 -2
@@ -9,8 +9,8 @@ config PLAT_S5P bool depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS) default y - select ARM_VIC if !ARCH_EXYNOS4 - select ARM_GIC if ARCH_EXYNOS4 + select ARM_VIC if !ARCH_EXYNOS + select ARM_GIC if ARCH_EXYNOS select GIC_NON_BANKED if ARCH_EXYNOS4 select NO_IOPORT select ARCH_REQUIRE_GPIOLIB
arch/arm/plat-samsung/include/plat/cpu.h +10 -0
@@ -42,6 +42,9 @@ extern unsigned long samsung_cpu_id;#define EXYNOS4412_CPU_ID 0xE4412200#define EXYNOS4_CPU_MASK 0xFFFE0000 +#define EXYNOS5250_SOC_ID 0x43520000 +#define EXYNOS5_SOC_MASK 0xFFFFF000 +#define IS_SAMSUNG_CPU (name, id, mask) \ static inline int is_samsung_##name(void) \ { \
@@ -58,6 +61,7 @@ IS_SAMSUNG_CPU(s5pv210, S5PV210_CPU_ID, S5PV210_CPU_MASK) IS_SAMSUNG_CPU(exynos4210, EXYNOS4210_CPU_ID, EXYNOS4_CPU_MASK) IS_SAMSUNG_CPU(exynos4212, EXYNOS4212_CPU_ID, EXYNOS4_CPU_MASK) IS_SAMSUNG_CPU(exynos4412, EXYNOS4412_CPU_ID, EXYNOS4_CPU_MASK) +IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK) #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2412) || \ defined(CONFIG_CPU_S3C2416) || defined(CONFIG_CPU_S3C2440) || \
@@ -120,6 +124,12 @@ IS_SAMSUNG_CPU(exynos4412, EXYNOS4412_CPU_ID, EXYNOS4_CPU_MASK)#define EXYNOS4210_REV_1_0 (0x10)#define EXYNOS4210_REV_1_1 (0x11) +#if defined(CONFIG_SOC_EXYNOS5250 ) +# define soc_is_exynos5250 () is_samsung_exynos5250() +#else +# define soc_is_exynos5250 () 0 +#endif +#define IODESC_ENT (x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }#ifndef MHZ
Signature · 1 line
1.7.4.4
PATCH v3 7/12 ARM: EXYNOS: add interrupt definitions for EXYNOS5250
In reply to Kukjin KimARM: EXYNOS: irqs.h for exynos4 and exynos5 - WIP This patch adds the interrupt definitions for EXYNOS5250 at <mach/irqs.h> file. Basically, now it is needed for EXYNOS5250 interrupt and will be updated for single zImage next time.
--- arch/arm/mach-exynos/common.c | 97 ++++-- arch/arm/mach-exynos/dev-ahci.c | 4 +- arch/arm/mach-exynos/dev-audio.c | 4 +- arch/arm/mach-exynos/include/mach/irqs.h | 580 ++++++++++++++++++++++-------- arch/arm/mach-exynos/mct.c | 23 +- arch/arm/plat-s5p/irq-pm.c | 25 +- arch/arm/plat-samsung/irq-vic-timer.c | 16 + 7 files changed, 548 insertions(+), 201 deletions(-)
arch/arm/mach-exynos/common.c +69 -28
@@ -345,6 +345,11 @@ 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" );
@@ -451,7 +456,14 @@ static struct irq_chip combiner_chip = {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 ();if (irq_set_handler_data (irq, &combiner_data[combiner_nr]) !=0 )BUG ();
@@ -462,8 +474,14 @@ static void __init combiner_init(unsigned int combiner_nr, void __iomem *base, unsigned int irq_start) {unsigned int i; +unsigned int max_nr; -if (combiner_nr >=MAX_COMBINER_NR ) +if (soc_is_exynos5250 ()) + max_nr =EXYNOS5_MAX_COMBINER_NR ; +else + max_nr =EXYNOS4_MAX_COMBINER_NR ; + +if (combiner_nr >= max_nr)BUG (); combiner_data[combiner_nr].base = base;
@@ -506,7 +524,7 @@ void __init exynos4_init_irq(void)of_irq_init (exynos4_dt_irq_match);#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 ));
@@ -527,7 +545,7 @@ void __init exynos5_init_irq(void)gic_init (0 ,IRQ_PPI (0 ),S5P_VA_GIC_DIST ,S5P_VA_GIC_CPU ); -for (irq =0 ; irq <MAX_COMBINER_NR ; irq++) { +for (irq =0 ; irq <EXYNOS5_MAX_COMBINER_NR ; irq++) {combiner_init (irq, (void __iomem *)S5P_VA_COMBINER (irq),COMBINER_IRQ (irq,0 ));combiner_cascade_irq (irq,IRQ_SPI (irq));
@@ -651,27 +669,43 @@ static DEFINE_SPINLOCK(eint_lock);static unsigned int eint0_15_data[16 ]; -static unsigned int exynos4_get_irq_nr (unsigned int number) -{ -u32 ret =0 ; - -switch (number) { - case 0 ... 3: - ret = (number +IRQ_EINT0 ); -break ; - case 4 ... 7: - ret = (number + (IRQ_EINT4 -4 )); -break ; - case 8 ... 15: - ret = (number + (IRQ_EINT8 -8 )); -break ; -default : -printk (KERN_ERR "number available : %d\n" , number); - } - -return ret; -} +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 exynos4_irq_eint_mask (struct irq_data *data) {u32 mask;
@@ -846,15 +880,22 @@ static int __init exynos4_init_irq_eint(void)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 , exynos4_irq_demux_eint16_31);for (irq =0 ; irq <=15 ; irq++) { eint0_15_data[irq] =IRQ_EINT (irq); -irq_set_handler_data (exynos4_get_irq_nr (irq), - &eint0_15_data[irq]); -irq_set_chained_handler (exynos4_get_irq_nr (irq), +if (soc_is_exynos5250 ()) { +irq_set_handler_data (exynos4_eint0_15_src_int[irq], + &eint0_15_data[irq]); +irq_set_chained_handler (exynos4_eint0_15_src_int[irq], + exynos4_irq_eint0_15); + }else { +irq_set_handler_data (exynos5_eint0_15_src_int[irq], + &eint0_15_data[irq]); +irq_set_chained_handler (exynos5_eint0_15_src_int[irq], exynos4_irq_eint0_15); + } }return 0 ;
arch/arm/mach-exynos/dev-ahci.c +2 -2
@@ -242,8 +242,8 @@ static struct resource exynos4_ahci_resource[] = { .flags = IORESOURCE_MEM, }, [1] = { - .start = IRQ_SATA, - .end = IRQ_SATA, + .start = EXYNOS4_IRQ_SATA, + .end = EXYNOS4_IRQ_SATA, .flags = IORESOURCE_IRQ, }, };
arch/arm/mach-exynos/dev-audio.c +2 -2
@@ -304,8 +304,8 @@ static struct resource exynos4_ac97_resource[] = { .flags = IORESOURCE_DMA, }, [4] = { - .start = IRQ_AC97, - .end = IRQ_AC97, + .start = EXYNOS4_IRQ_AC97, + .end = EXYNOS4_IRQ_AC97, .flags = IORESOURCE_IRQ, }, };
arch/arm/mach-exynos/include/mach/irqs.h +427 -153
606 lines not on this page · raw message
arch/arm/mach-exynos/mct.c +13 -10
@@ -258,7 +258,10 @@ static void exynos4_clockevent_init(void) mct_comp_device.cpumask =cpumask_of (0 );clockevents_register_device (&mct_comp_device); -setup_irq (IRQ_MCT_G0 , &mct_comp_event_irq); +if (soc_is_exynos5250 ()) +setup_irq (EXYNOS5_IRQ_MCT_G0 , &mct_comp_event_irq); +else +setup_irq (EXYNOS4_IRQ_MCT_G0 , &mct_comp_event_irq); }#ifdef CONFIG_LOCAL_TIMERS
@@ -406,16 +409,16 @@ static void exynos4_mct_tick_init(struct clock_event_device *evt)if (mct_int_type ==MCT_INT_SPI ) {if (cpu ==0 ) { mct_tick0_event_irq.dev_id = mevt; - evt->irq =IRQ_MCT_L0 ; -setup_irq (IRQ_MCT_L0 , &mct_tick0_event_irq); + evt->irq =EXYNOS4_IRQ_MCT_L0 ; +setup_irq (EXYNOS4_IRQ_MCT_L0 , &mct_tick0_event_irq); }else { mct_tick1_event_irq.dev_id = mevt; - evt->irq =IRQ_MCT_L1 ; -setup_irq (IRQ_MCT_L1 , &mct_tick1_event_irq); -irq_set_affinity (IRQ_MCT_L1 ,cpumask_of (1 )); + evt->irq =EXYNOS4_IRQ_MCT_L1 ; +setup_irq (EXYNOS4_IRQ_MCT_L1 , &mct_tick1_event_irq); +irq_set_affinity (EXYNOS4_IRQ_MCT_L1 ,cpumask_of (1 )); } }else { -enable_percpu_irq (IRQ_MCT_LOCALTIMER ,0 ); +enable_percpu_irq (EXYNOS_IRQ_MCT_LOCALTIMER ,0 ); } }
@@ -437,7 +440,7 @@ void local_timer_stop(struct clock_event_device *evt) else remove_irq(evt->irq, &mct_tick1_event_irq); else - disable_percpu_irq(IRQ_MCT_LOCALTIMER); + disable_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER); }#endif /* CONFIG_LOCAL_TIMERS */
@@ -452,11 +455,11 @@ static void __init exynos4_timer_resources(void)if (mct_int_type ==MCT_INT_PPI ) {int err; - err =request_percpu_irq (IRQ_MCT_LOCALTIMER , + err =request_percpu_irq (EXYNOS_IRQ_MCT_LOCALTIMER , exynos4_mct_tick_isr,"MCT" , &percpu_mct_tick);WARN (err,"MCT: can't request IRQ %d (%d)\n" , -IRQ_MCT_LOCALTIMER , err); +EXYNOS_IRQ_MCT_LOCALTIMER , err); }#endif /* CONFIG_LOCAL_TIMERS */ }
arch/arm/plat-s5p/irq-pm.c +19 -6
@@ -39,19 +39,32 @@ unsigned long s3c_irqwake_eintallow = 0xffffffffL;int s3c_irq_wake (struct irq_data *data,unsigned int state) {unsigned long irqbit; +unsigned int irq_rtc_tic, irq_rtc_alarm; + +#ifdef CONFIG_ARCH_EXYNOS +if (soc_is_exynos5250 ()) { + irq_rtc_tic =EXYNOS5_IRQ_RTC_TIC ; + irq_rtc_alarm =EXYNOS5_IRQ_RTC_ALARM ; + }else { + irq_rtc_tic =EXYNOS4_IRQ_RTC_TIC ; + irq_rtc_alarm =EXYNOS4_IRQ_RTC_ALARM ; + } +#else + irq_rtc_tic =IRQ_RTC_TIC ; + irq_rtc_alarm =IRQ_RTC_ALARM ; +#endif + +if (data->irq == irq_rtc_tic || data->irq == irq_rtc_alarm) { + irqbit =1 << (data->irq +1 - irq_rtc_alarm); -switch (data->irq) { -case IRQ_RTC_TIC : -case IRQ_RTC_ALARM : - irqbit =1 << (data->irq +1 -IRQ_RTC_ALARM );if (!state) s3c_irqwake_intmask |= irqbit;else s3c_irqwake_intmask &= ~irqbit; -break ; -default : + }else {return -ENOENT ; } +return 0 ; }
arch/arm/plat-samsung/irq-vic-timer.c +16 -0
@@ -19,6 +19,7 @@#include <linux/io.h> #include <mach/map.h> +#include <plat/cpu.h> #include <plat/irq-vic-timer.h> #include <plat/regs-timer.h>
@@ -57,6 +58,21 @@ void __init s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq)struct irq_chip_type *ct;unsigned int i; +#ifdef CONFIG_ARCH_EXYNOS +if (soc_is_exynos5250 ()) { + pirq[0 ] =EXYNOS5_IRQ_TIMER0_VIC ; + pirq[1 ] =EXYNOS5_IRQ_TIMER1_VIC ; + pirq[2 ] =EXYNOS5_IRQ_TIMER2_VIC ; + pirq[3 ] =EXYNOS5_IRQ_TIMER3_VIC ; + pirq[4 ] =EXYNOS5_IRQ_TIMER4_VIC ; + }else { + pirq[0 ] =EXYNOS4_IRQ_TIMER0_VIC ; + pirq[1 ] =EXYNOS4_IRQ_TIMER1_VIC ; + pirq[2 ] =EXYNOS4_IRQ_TIMER2_VIC ; + pirq[3 ] =EXYNOS4_IRQ_TIMER3_VIC ; + pirq[4 ] =EXYNOS4_IRQ_TIMER4_VIC ; + } +#endif s3c_tgc =irq_alloc_generic_chip ("s3c-timer" ,1 , timer_irq,S3C64XX_TINT_CSTAT , handle_level_irq);
Signature · 1 line
1.7.4.4
PATCH v3 7/12 ARM: EXYNOS: add interrupt definitions for EXYNOS5250
Hi
Quoted 4 lines · Kukjin Kim
ARM: EXYNOS:
irqs.hfor exynos4 and exynos5 - WIP This patch adds the interrupt definitions for EXYNOS5250 at <mach/irqs.h> file. Basically, now it is needed for EXYNOS5250 interrupt and will be updated for single zImage next time.
Nit for when you stage the branch: Update the commit message a bit, I think?
-Olof
PATCH v3 7/12 ARM: EXYNOS: add interrupt definitions for EXYNOS5250
Quoted 10 lines · Olof Johansson
Hi
Quoted 4 lines · Kukjin Kim
ARM: EXYNOS:
irqs.hfor exynos4 and exynos5 - WIP This patch adds the interrupt definitions for EXYNOS5250 at <mach/irqs.h> file. Basically, now it is needed for EXYNOS5250 interrupt and will be updated for single zImage next time.Nit for when you stage the branch: Update the commit message a bit, I think?
Oops, what's happened :( Let me update it.
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.
PATCH v3 7/12 ARM: EXYNOS: add interrupt definitions for EXYNOS5250
In reply to Kukjin KimQuoted 19 lines · Kukjin Kim
ARM: EXYNOS:
irqs.hfor exynos4 and exynos5 - WIP This patch adds the interrupt definitions for EXYNOS5250 at <mach/irqs.h> file. Basically, now it is needed for EXYNOS5250 interrupt and will be updated for single zImage next time.Signed-off-by Kukjin Kim <[email protected]>---
?arch/arm/mach-exynos/common.c ? ? ? ? ? ?| ? 97 ++++-- ?arch/arm/mach-exynos/dev-ahci.c ? ? ? ? ?| ? ?4 +- ?arch/arm/mach-exynos/dev-audio.c ? ? ? ? | ? ?4 +- ?arch/arm/mach-exynos/include/mach/irqs.h | ?580 ++++++++++++++++++++++-------- ?arch/arm/mach-exynos/mct.c ? ? ? ? ? ? ? | ? 23 +- ?arch/arm/plat-s5p/irq-pm.c ? ? ? ? ? ? ? | ? 25 +- ?arch/arm/plat-samsung/irq-vic-timer.c ? ?| ? 16 +?7 files changed, 548 insertions(+), 201 deletions(-)
arch/arm/mach-exynos/common.c +0
-1--- a/arch/arm/mach-exynos/common.c
[...]
Quoted 18 lines
? ? ? ?for (irq = 0 ; irq <= 15 ; irq++) { ? ? ? ? ? ? ? ?eint0_15_data[irq] =
IRQ_EINT(irq);- ? ? ? ? ? ? ? irq_set_handler_data(exynos4_get_irq_nr(irq),
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&eint0_15_data[irq]);
- ? ? ? ? ? ? ? irq_set_chained_handler(exynos4_get_irq_nr(irq),
+ ? ? ? ? ? ? ? if (soc_is_exynos5250()) {
+ ? ? ? ? ? ? ? ? ? ? ? irq_set_handler_data(exynos4_eint0_15_src_int[irq],
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&eint0_15_data[irq]);
+ ? ? ? ? ? ? ? ? ? ? ? irq_set_chained_handler(exynos4_eint0_15_src_int[irq],
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?exynos4_irq_eint0_15);
+ ? ? ? ? ? ? ? } else {
+ ? ? ? ? ? ? ? ? ? ? ? irq_set_handler_data(exynos5_eint0_15_src_int[irq],
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&eint0_15_data[irq]);
+ ? ? ? ? ? ? ? ? ? ? ?irq_set_chained_handler(exynos5_eint0_15_src_int[irq], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?exynos4_irq_eint0_15);
+ ? ? ? ? ? ? ? }
? ? ? ?}
The external interrupt numbers for Exynos4 and Exynos5 have been swapped. This needs to be fixed.
Thanks,
Thomas.
PATCH v3 7/12 ARM: EXYNOS: add interrupt definitions for EXYNOS5250
Quoted 43 lines · Thomas Abraham
Quoted 19 lines · Kukjin Kim
ARM: EXYNOS:
irqs.hfor exynos4 and exynos5 - WIP This patch adds the interrupt definitions for EXYNOS5250 at <mach/irqs.h> file. Basically, now it is needed for EXYNOS5250 interrupt and will be updated for single zImage next time.Signed-off-by Kukjin Kim<[email protected]>--- arch/arm/mach-exynos/common.c | 97 ++++-- arch/arm/mach-exynos/dev-ahci.c | 4 +- arch/arm/mach-exynos/dev-audio.c | 4 +- arch/arm/mach-exynos/include/mach/irqs.h | 580 ++++++++++++++++++++++-------- arch/arm/mach-exynos/mct.c | 23 +- arch/arm/plat-s5p/irq-pm.c | 25 +- arch/arm/plat-samsung/irq-vic-timer.c | 16 + 7 files changed, 548 insertions(+), 201 deletions(-)arch/arm/mach-exynos/common.c +0
-1--- a/arch/arm/mach-exynos/common.c[...]
Quoted 8 lines
for (irq = 0 ; irq<= 15 ; irq++) { eint0_15_data[irq] = IRQ_EINT(irq);arch/arm/mach-exynos/common.c +2
-3-irq_set_handler_data (exynos4_get_irq_nr (irq), -&eint0_15_data[irq]); - irq_set_chained_handler(exynos4_get_irq_nr(irq), +if (soc_is_exynos5250 ()) { + irq_set_handler_data(exynos4_eint0_15_src_int[irq],arch/arm/mach-exynos/common.c static int __init exynos4_init_irq_eint(void) · line 899
Quoted 10 lines
arch/arm/mach-exynos/common.c +8
-0+&eint0_15_data[irq]); +irq_set_chained_handler (exynos4_eint0_15_src_int[irq], + exynos4_irq_eint0_15); + }else { +irq_set_handler_data (exynos5_eint0_15_src_int[irq], +&eint0_15_data[irq]); +irq_set_chained_handler (exynos5_eint0_15_src_int[irq], exynos4_irq_eint0_15); + } }
Quoted 3 lines
The external interrupt numbers for Exynos4 and Exynos5 have been swapped. This needs to be fixed.
Oops again :-( let me fix it.
Thanks, Thomas.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.
PATCH v3 8/12 ARM: EXYNOS: support EINT for EXYNOS4 and EXYNOS5
In reply to Kukjin KimFrom: Eunki Kim <[email protected]>
The GPIOs of EXYNOS4 and EXYNOS5 are changed to use ioremap instead of static mapping. It alse causes the change of external interrupt IO mapping. This patch changes EXYNOS4 to EXYNOS for common use and changes EINT_x macros for supporting dynamic IO mapping.
--- arch/arm/mach-exynos/common.c | 102 ++++++++++++------------- arch/arm/mach-exynos/include/mach/gpio.h | 29 +++++++ arch/arm/mach-exynos/include/mach/regs-gpio.h | 20 ++--- 3 files changed, 86 insertions(+), 65 deletions(-)
arch/arm/mach-exynos/common.c +48 -54
@@ -665,6 +665,8 @@ static void __init exynos_init_uarts(struct s3c2410_uartcfg *cfg, int no)s3c24xx_init_uartdevs ("exynos4210-uart" , exynos4_uart_resources, cfg, no); } +static void __iomem *exynos_eint_base; +static DEFINE_SPINLOCK (eint_lock);static unsigned int eint0_15_data[16 ];
@@ -706,41 +708,41 @@ static unsigned int exynos5_eint0_15_src_int[16] = {EXYNOS5_IRQ_EINT14 , EXYNOS5_IRQ_EINT15, }; -static inline void exynos4_irq_eint_mask (struct irq_data *data) +static inline void exynos_irq_eint_mask (struct irq_data *data) {u32 mask;spin_lock (&eint_lock); - mask =__raw_readl (S5P_EINT_MASK (EINT_REG_NR (data->irq))); - mask |=eint_irq_to_bit (data->irq); -__raw_writel (mask,S5P_EINT_MASK (EINT_REG_NR (data->irq))); + mask =__raw_readl (EINT_MASK (exynos_eint_base, data->irq)); + mask |=EINT_OFFSET_BIT (data->irq); +__raw_writel (mask,EINT_MASK (exynos_eint_base, data->irq));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;spin_lock (&eint_lock); - mask =__raw_readl (S5P_EINT_MASK (EINT_REG_NR (data->irq))); - mask &= ~(eint_irq_to_bit (data->irq)); -__raw_writel (mask,S5P_EINT_MASK (EINT_REG_NR (data->irq))); + mask =__raw_readl (EINT_MASK (exynos_eint_base, data->irq)); + mask &= ~(EINT_OFFSET_BIT (data->irq)); +__raw_writel (mask,EINT_MASK (exynos_eint_base, data->irq));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), -S5P_EINT_PEND (EINT_REG_NR (data->irq))); +__raw_writel (EINT_OFFSET_BIT (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); -exynos4_irq_eint_ack (data); +exynos_irq_eint_mask (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 shift;
@@ -777,39 +779,24 @@ static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) mask =0x7 << shift;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 |= 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); -switch (offs) { - case 0 ... 7: -s3c_gpio_cfgpin (EINT_GPIO_0 (offs &0x7 ),EINT_MODE ); -break ; - 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); - } +s3c_gpio_cfgpin (irq_to_gpio (data->irq),S3C_GPIO_SFN (0xf ));return 0 ; } -static struct irq_chip exynos4_irq_eint = { - .name ="exynos4-eint" , - .irq_mask = exynos4_irq_eint_mask, - .irq_unmask = exynos4_irq_eint_unmask, - .irq_mask_ack = exynos4_irq_eint_maskack, - .irq_ack = exynos4_irq_eint_ack, - .irq_set_type = exynos4_irq_eint_set_type, +static struct irq_chip exynos_irq_eint = { + .name ="exynos-eint" , + .irq_mask = exynos_irq_eint_mask, + .irq_unmask = exynos_irq_eint_unmask, + .irq_mask_ack = exynos_irq_eint_maskack, + .irq_ack = exynos_irq_eint_ack, + .irq_set_type = exynos_irq_eint_set_type, #ifdef CONFIG_PM .irq_set_wake = s3c_irqext_wake, #endif
@@ -824,12 +811,12 @@ static struct irq_chip exynos4_irq_eint = {* * 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; -u32 status =__raw_readl (S5P_EINT_PEND (EINT_REG_NR (start))); -u32 mask =__raw_readl (S5P_EINT_MASK (EINT_REG_NR (start))); +u32 status =__raw_readl (EINT_PEND (exynos_eint_base, start)); +u32 mask =__raw_readl (EINT_MASK (exynos_eint_base, start)); status &= ~mask; status &=0xff ;
@@ -841,16 +828,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);chained_irq_enter (chip, desc); -exynos4_irq_demux_eint (IRQ_EINT (16 )); -exynos4_irq_demux_eint (IRQ_EINT (24 )); +exynos_irq_demux_eint (IRQ_EINT (16 )); +exynos_irq_demux_eint (IRQ_EINT (24 ));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);struct irq_chip *chip =irq_get_chip (irq);
@@ -867,20 +854,27 @@ static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc)chained_irq_exit (chip, desc); } -static int __init exynos4_init_irq_eint (void ) +static int __init exynos_init_irq_eint (void ) {int irq;if (soc_is_exynos5250 ()) -return 0 ; + 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++) { -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);set_irq_flags (IRQ_EINT (irq),IRQF_VALID ); } -irq_set_chained_handler (EXYNOS_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++) { eint0_15_data[irq] =IRQ_EINT (irq);
@@ -889,15 +883,15 @@ static int __init exynos4_init_irq_eint(void)irq_set_handler_data (exynos4_eint0_15_src_int[irq], &eint0_15_data[irq]);irq_set_chained_handler (exynos4_eint0_15_src_int[irq], - exynos4_irq_eint0_15); + exynos_irq_eint0_15); }else {irq_set_handler_data (exynos5_eint0_15_src_int[irq], &eint0_15_data[irq]);irq_set_chained_handler (exynos5_eint0_15_src_int[irq], - exynos4_irq_eint0_15); + exynos_irq_eint0_15); } }return 0 ; } -arch_initcall (exynos4_init_irq_eint); +arch_initcall (exynos_init_irq_eint);
arch/arm/mach-exynos/include/mach/gpio.h +29 -0
@@ -146,4 +146,33 @@ enum s5p_gpio_number {#define ARCH_NR_GPIOS (EXYNOS4_GPZ(EXYNOS4_GPIO_Z_NR) + \ CONFIG_SAMSUNG_GPIO_EXTRA + 1) +#include <linux/types.h> +#include <linux/err.h> +#include <mach/irqs.h> +#include <plat/cpu.h> + +static inline int irq_to_gpio (unsigned int irq) +{ +if (irq <IRQ_EINT (0 )) +return -EINVAL ; + + irq -=IRQ_EINT (0 ); +if (irq <8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX0 (irq) : +EXYNOS4_GPX0 (irq); + irq -=8 ; +if (irq <8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX1 (irq) : +EXYNOS4_GPX1 (irq); + irq -=8 ; +if (irq <8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX2 (irq) : +EXYNOS4_GPX2 (irq); + irq -=8 ; +if (irq <8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX3 (irq) : +EXYNOS4_GPX3 (irq); +return -EINVAL ; +} +#endif /* __ASM_ARCH_GPIO_H */
arch/arm/mach-exynos/include/mach/regs-gpio.h +9 -11
@@ -16,6 +16,15 @@#include <mach/map.h> #include <mach/irqs.h> +#define EINT_REG_NR (x) (EINT_OFFSET(x) >> 3) +#define EINT_CON (b, x) (b + 0xE00 + (EINT_REG_NR(x) * 4)) +#define EINT_FLTCON (b, x) (b + 0xE80 + (EINT_REG_NR(x) * 4)) +#define EINT_MASK (b, x) (b + 0xF00 + (EINT_REG_NR(x) * 4)) +#define EINT_PEND (b, x) (b + 0xF40 + (EINT_REG_NR(x) * 4)) + +#define EINT_OFFSET_BIT (x) (1 << (EINT_OFFSET(x) & 0x7)) + +/* compatibility for plat-s5p/irq-pm.c */ #define EXYNOS4_EINT40CON (S5P_VA_GPIO2 + 0xE00)#define S5P_EINT_CON (x) (EXYNOS4_EINT40CON + ((x) * 0x4))
@@ -28,15 +37,4 @@#define EXYNOS4_EINT40PEND (S5P_VA_GPIO2 + 0xF40)#define S5P_EINT_PEND (x) (EXYNOS4_EINT40PEND + ((x) * 0x4)) -#define EINT_REG_NR (x) (EINT_OFFSET(x) >> 3) - -#define eint_irq_to_bit (irq) (1 << (EINT_OFFSET(irq) & 0x7)) - -#define EINT_MODE S3C_GPIO_SFN(0xf) - -#define EINT_GPIO_0 (x) EXYNOS4_GPX0(x) -#define EINT_GPIO_1 (x) EXYNOS4_GPX1(x) -#define EINT_GPIO_2 (x) EXYNOS4_GPX2(x) -#define EINT_GPIO_3 (x) EXYNOS4_GPX3(x) -#endif /* __ASM_ARCH_REGS_GPIO_H */
Signature · 1 line
1.7.4.4
PATCH v3 8/12 ARM: EXYNOS: support EINT for EXYNOS4 and EXYNOS5
Hi,
A couple of comments below.
Quoted 23 lines · Kukjin Kim
arch/arm/mach-exynos/common.c +2
-9@@ -777,39 +779,24 @@ static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) mask =0x7 << shift;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 |= 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); -switch (offs) { - case 0 ... 7: -s3c_gpio_cfgpin (EINT_GPIO_0 (offs &0x7 ),EINT_MODE ); -break ; - case 8 ... 15: -s3c_gpio_cfgpin (EINT_GPIO_1 (offs &0x7 ),EINT_MODE ); -break ;
arch/arm/mach-exynos/common.c static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) · line 788
Quoted 10 lines
arch/arm/mach-exynos/common.c +1
-9- 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); - } +s3c_gpio_cfgpin (irq_to_gpio (data->irq),S3C_GPIO_SFN (0xf ));
irq_to_gpio is going away, so it's not a good idea to add it under that name.
Add a local function locally at the top of this file instead. and call it something else.
Quoted 26 lines
arch/arm/mach-exynos/include/mach/gpio.h +18
-0@@ -146,4 +146,33 @@ enum s5p_gpio_number {#define ARCH_NR_GPIOS (EXYNOS4_GPZ(EXYNOS4_GPIO_Z_NR) + \ CONFIG_SAMSUNG_GPIO_EXTRA + 1) +#include <linux/types.h> +#include <linux/err.h> +#include <mach/irqs.h> +#include <plat/cpu.h> + +static inline int irq_to_gpio (unsigned int irq) +{ +if (irq <IRQ_EINT (0 )) +return -EINVAL ; + + irq -=IRQ_EINT (0 ); +if (irq <8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX0 (irq) : +EXYNOS4_GPX0 (irq); + irq -=8 ; +if (irq <8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX1 (irq) : +EXYNOS4_GPX1 (irq);
arch/arm/mach-exynos/include/mach/gpio.h enum s5p_gpio_number { · line 176
Quoted 10 lines
arch/arm/mach-exynos/include/mach/gpio.h +10
-0+ irq -=8 ; +if (irq <8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX2 (irq) : +EXYNOS4_GPX2 (irq); + irq -=8 ; +if (irq <8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX3 (irq) : +EXYNOS4_GPX3 (irq); +return -EINVAL ; +}
I think this would be cleaner as two small helpers and one check for SoC version instead.
-Olof
PATCH v3 8/12 ARM: EXYNOS: support EINT for EXYNOS4 and EXYNOS5
Quoted 4 lines · Olof Johansson
Hi,
A couple of comments below.
I agree, and will address comments from you.
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.
Quoted 80 lines · Kukjin Kim
Quoted 23 lines
arch/arm/mach-exynos/common.c +2
-9@@ -777,39 +779,24 @@ static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) mask =0x7 << shift;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 |= 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); -switch (offs) { - case 0 ... 7: -s3c_gpio_cfgpin (EINT_GPIO_0 (offs&0x7 ),EINT_MODE ); -break ; - case 8 ... 15: -s3c_gpio_cfgpin (EINT_GPIO_1 (offs&0x7 ),EINT_MODE ); -break ;arch/arm/mach-exynos/common.c static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) · line 788
Quoted 10 lines
arch/arm/mach-exynos/common.c +1
-9- 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); - } +s3c_gpio_cfgpin (irq_to_gpio (data->irq),S3C_GPIO_SFN (0xf ));
irq_to_gpiois going away, so it's not a good idea to add it under that name.Add a local function locally at the top of this file instead. and call it something else.
Quoted 26 lines
arch/arm/mach-exynos/include/mach/gpio.h +18
-0@@ -146,4 +146,33 @@ enum s5p_gpio_number {#define ARCH_NR_GPIOS (EXYNOS4_GPZ(EXYNOS4_GPIO_Z_NR) + \ CONFIG_SAMSUNG_GPIO_EXTRA + 1) +#include <linux/types.h> +#include <linux/err.h> +#include <mach/irqs.h> +#include <plat/cpu.h> + +static inline int irq_to_gpio (unsigned int irq) +{ +if (irq<IRQ_EINT (0 )) +return -EINVAL ; + + irq -=IRQ_EINT (0 ); +if (irq<8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX0 (irq) : +EXYNOS4_GPX0 (irq); + irq -=8 ; +if (irq<8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX1 (irq) : +EXYNOS4_GPX1 (irq);arch/arm/mach-exynos/include/mach/gpio.h enum s5p_gpio_number { · line 176
Quoted 10 lines
arch/arm/mach-exynos/include/mach/gpio.h +10
-0+ irq -=8 ; +if (irq<8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX2 (irq) : +EXYNOS4_GPX2 (irq); + irq -=8 ; +if (irq<8 ) +return soc_is_exynos5250 () ?EXYNOS5_GPX3 (irq) : +EXYNOS4_GPX3 (irq); +return -EINVAL ; +}I think this would be cleaner as two small helpers and one check for SoC version instead.
PATCH v3 9/12 ARM: EXYNOS: add support get_core_count() for EXYNOS5250
In reply to Kukjin KimThe EXYNOS5250 has two Cortex-A15 cores and there's no need to call scu_enable() in platform_smp_prepare_cpus().
--- arch/arm/mach-exynos/platsmp.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)
arch/arm/mach-exynos/platsmp.c +6 -3
@@ -166,7 +166,10 @@ void __init smp_init_cpus(void)void __iomem *scu_base =scu_base_addr ();unsigned int i, ncores; - ncores = scu_base ?scu_get_core_count (scu_base) :1 ; +if (soc_is_exynos5250 ()) + ncores =2 ; +else + ncores = scu_base ?scu_get_core_count (scu_base) :1 ;/* sanity check */ if (ncores > nr_cpu_ids) {
@@ -183,8 +186,8 @@ void __init smp_init_cpus(void)void __init platform_smp_prepare_cpus (unsigned int max_cpus) { - -scu_enable (scu_base_addr ()); +if (!soc_is_exynos5250 ()) +scu_enable (scu_base_addr ());/* * Write the address of secondary startup into the
Signature · 1 line
1.7.4.4
PATCH v3 9/12 ARM: EXYNOS: add support get_core_count() for EXYNOS5250
Quoted 4 lines · Kukjin Kim
The EXYNOS5250 has two Cortex-A15 cores and there's no need to call
scu_enable()inplatform_smp_prepare_cpus().Signed-off-by Kukjin Kim <[email protected]>
Can you explain this patch more? It only seems to make the code less generic, but there is no indication if calling the scu_get_core_count() function is actually wrong on exynos5.
Arnd
Quoted 27 lines
arch/arm/mach-exynos/platsmp.c +6
-3@@ -166,7 +166,10 @@ void __init smp_init_cpus(void)void __iomem *scu_base =scu_base_addr ();unsigned int i, ncores; - ncores = scu_base ?scu_get_core_count (scu_base) :1 ; +if (soc_is_exynos5250 ()) + ncores =2 ; +else + ncores = scu_base ?scu_get_core_count (scu_base) :1 ;/* sanity check */ if (ncores > nr_cpu_ids) {@@ -183,8 +186,8 @@ void __init smp_init_cpus(void)void __init platform_smp_prepare_cpus (unsigned int max_cpus) { - -scu_enable (scu_base_addr ()); +if (!soc_is_exynos5250 ()) +scu_enable (scu_base_addr ());/* * Write the address of secondary startup into the
PATCH v3 9/12 ARM: EXYNOS: add support get_core_count() for EXYNOS5250
Quoted 11 lines · Arnd Bergmann
Quoted 4 lines · Kukjin Kim
The EXYNOS5250 has two Cortex-A15 cores and there's no need to call
scu_enable()inplatform_smp_prepare_cpus().Signed-off-by Kukjin Kim<[email protected]>Can you explain this patch more? It only seems to make the code less generic, but there is no indication if calling the
scu_get_core_count()function is actually wrong on exynos5.
Contrary to Cortex-A9, Cortex-A15 has no regarding scu register so EXYNO5250 can not get the number of core from that like EXYNOS4 SoCs.
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.
PATCH v3 10/12 ARM: EXYNOS: add support ARCH_EXYNOS5 for EXYNOS5 SoCs
In reply to Kukjin KimThis patch adds CONFIG_ARCH_EXYNOS5 and CONFIG_SOC_EXYNOS5250 for supporting EXYNOS5250 SoC and allows supporting EXYNOS4 and EXYNOS5 together.
--- arch/arm/mach-exynos/Kconfig | 17 ++++++++++++----- arch/arm/mach-exynos/Makefile | 1 + 2 files changed, 13 insertions(+), 5 deletions(-)
arch/arm/mach-exynos/Kconfig +12 -5
@@ -11,10 +11,6 @@ if ARCH_EXYNOS menu "SAMSUNG EXYNOS SoCs Support" -choice - prompt "EXYNOS System Type" - default ARCH_EXYNOS4 - config ARCH_EXYNOS4 bool "SAMSUNG EXYNOS4" select HAVE_SMP
@@ -22,7 +18,11 @@ config ARCH_EXYNOS4 help 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"
@@ -53,6 +53,13 @@ config SOC_EXYNOS4412 help Enable EXYNOS4412 SoC support +config SOC_EXYNOS5250 + bool "SAMSUNG EXYNOS5250" + default y + depends on ARCH_EXYNOS5 + help + Enable EXYNOS5250 SoC support + config EXYNOS4_MCT bool default y
arch/arm/mach-exynos/Makefile +1 -0
@@ -14,6 +14,7 @@ obj- := 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_SOC_EXYNOS4212) += clock-exynos4212.o
Signature · 1 line
1.7.4.4
PATCH v3 11/12 ARM: EXYNOS: add support device tree enabled board file for EXYNOS5
In reply to Kukjin KimThis patch adds a new EXYNOS5 compatible device tree enabled board When using this, a corresponding device tree blob which describes the board's properties should be supplied at boot time to the kernel.
--- arch/arm/mach-exynos/Kconfig | 22 +++++++++- arch/arm/mach-exynos/Makefile | 1 + arch/arm/mach-exynos/mach-exynos5-dt.c | 78 ++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletions(-) create mode 100644 arch/arm/mach-exynos/mach-exynos5-dt.c
arch/arm/mach-exynos/Kconfig +21 -1
@@ -358,7 +358,18 @@ config MACH_SMDK4412 Machine support for Samsung SMDK4412 endif -comment "Flattened Device Tree based board for Exynos4 based SoC" +if ARCH_EXYNOS5 + +comment "EXYNOS5250 Boards" + +config MACH_SMDK5250 + bool "SMDK5250" + select SOC_EXYNOS5250 + help + Machine support for Samsung SMDK5250 +endif + +comment "Flattened Device Tree based board for EXYNOS SoCs" config MACH_EXYNOS4_DT bool "Samsung Exynos4 Machine using device tree"
@@ -372,6 +383,15 @@ config MACH_EXYNOS4_DT Note: This is under development and not all peripherals can be supported 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 comment "Configuration for HSMMC 8-bit bus width"
arch/arm/mach-exynos/Makefile +1 -0
@@ -42,6 +42,7 @@ obj-$(CONFIG_MACH_SMDK4212) += mach-smdk4x12.o 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 # device support
arch/arm/mach-exynos/mach-exynos5-dt.c new file +78 -0
78 lines not on this page · raw message
Signature · 1 line
1.7.4.4
PATCH v3 12/12 ARM: dts: add initial dts file for EXYNOS5250, SMDK5250
In reply to Kukjin KimThis patch adds initial dts file for EXYNOS5250 SoC. This dts file is including the SoC specific devices and properties. And adds the dts file for SMDK5250 board which uses the EXYNOS5250 dts file. Its board specific properites will be added later.
--- arch/arm/boot/dts/exynos5250-smdk5250.dts | 26 ++ arch/arm/boot/dts/exynos5250.dtsi | 413 +++++++++++++++++++++++++++++ 2 files changed, 439 insertions(+), 0 deletions(-) create mode 100644 arch/arm/boot/dts/exynos5250-smdk5250.dts create mode 100644 arch/arm/boot/dts/exynos5250.dtsi
arch/arm/boot/dts/exynos5250-smdk5250.dts new file +26 -0
@@ -0,0 +1,26 @@ +/* + * 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 rootfstype=squashfs initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc"; + }; +};
arch/arm/boot/dts/exynos5250.dtsi new file +413 -0
413 lines not on this page · raw message
Signature · 1 line
1.7.4.4
PATCH v3 12/12 ARM: dts: add initial dts file for EXYNOS5250, SMDK5250
Quoted 35 lines · Kukjin Kim
This patch adds initial dts file for EXYNOS5250 SoC. This dts file is including the SoC specific devices and properties. And adds the dts file for SMDK5250 board which uses the EXYNOS5250 dts file. Its board specific properites will be added later.
Cc Thomas Abraham <[email protected]>Cc Grant Likely <[email protected]>Signed-off-by Kukjin Kim <[email protected]>--- arch/arm/boot/dts/exynos5250-smdk5250.dts | 26 ++ arch/arm/boot/dts/exynos5250.dtsi | 413 +++++++++++++++++++++++++++++ 2 files changed, 439 insertions(+), 0 deletions(-) create mode 100644 arch/arm/boot/dts/exynos5250-smdk5250.dts create mode 100644 arch/arm/boot/dts/exynos5250.dtsiarch/arm/boot/dts/exynos5250-smdk5250.dts new file +14
-0@@ -0,0 +1,26 @@ +/* + * 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" +
arch/arm/boot/dts/exynos5250-smdk5250.dts line 24
Quoted 10 lines
arch/arm/boot/dts/exynos5250-smdk5250.dts new file +10
-0+/ { + model = "SAMSUNG SMDK5250 board based on EXYNOS5250"; + compatible = "samsung,smdk5250", "samsung,exynos5250"; + + memory { + reg = <0x40000000 0x80000000>; + }; + + chosen { + bootargs = "root=/dev/ram0 rw ramdisk=8192 rootfstype=squashfs initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc";
Having these specific bootargs in the include file rarely makes sense, it's better to have firmware update from the settings in firmware and just have a very simple fallback here.
In particular initrd is quite custom to hardcode like that.
Quoted 26 lines
arch/arm/boot/dts/exynos5250.dtsi new file +23
-0@@ -0,0 +1,413 @@ +/* + * 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";
arch/arm/boot/dts/exynos5250.dtsi line 33
Quoted 10 lines
arch/arm/boot/dts/exynos5250.dtsi new file +10
-0+ interrupt-parent = <&gic>; + + gic:interrupt-controller@10490000 { + compatible = "arm,cortex-a9-gic"; + #interrupt-cells = <3>; + interrupt-controller; + reg = <0x10490000 0x1000>, <0x10480000 0x100>; + }; + + watchdog@101D0000 {
lowercase hex here and elsewhere in these files, please.
Also, technically no need to specify a unit address (@<foo>) in the device node name unless you need it to tell more than one entry apart, but it's become customary to always add them on ARM for some reason.
-Olof
PATCH v3 12/12 ARM: dts: add initial dts file for EXYNOS5250, SMDK5250
Quoted 21 lines · Olof Johansson
Quoted 20 lines · Kukjin Kim
This patch adds initial dts file for EXYNOS5250 SoC. This dts file is including the SoC specific devices and properties. And adds the dts file for SMDK5250 board which uses the EXYNOS5250 dts file. Its board specific properites will be added later.
Cc Thomas Abraham<[email protected]>Cc Grant Likely<[email protected]>Signed-off-by Kukjin Kim<[email protected]>--- arch/arm/boot/dts/exynos5250-smdk5250.dts | 26 ++ arch/arm/boot/dts/exynos5250.dtsi | 413 +++++++++++++++++++++++++++++ 2 files changed, 439 insertions(+), 0 deletions(-)create mode 100644
arch/arm/boot/dts/exynos5250-smdk5250.dtscreate mode 100644arch/arm/boot/dts/exynos5250.dtsiarch/arm/boot/dts/exynos5250-smdk5250.dts new file +0
-0
[...]
Quoted 9 lines
arch/arm/boot/dts/exynos5250-smdk5250.dts line 24
Quoted 2 lines
arch/arm/boot/dts/exynos5250-smdk5250.dts new file +2
-0+ chosen { + bootargs = "root=/dev/ram0 rw ramdisk=8192 rootfstype=squashfs initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc";Having these specific bootargs in the include file rarely makes sense, it's better to have firmware update from the settings in firmware and just have a very simple fallback here.
In particular initrd is quite custom to hardcode like that.
Yes, the bootargs is no mandatory in dts file and u-boot bootargs can be set. OK, we can simplify it here like following.
bootargs = "root=/dev/ram0 rw ramdisk=8192 console=ttySAC1,115200"
[...]
Quoted 4 lines
arch/arm/boot/dts/exynos5250-smdk5250.dts
Quoted 1 line
arch/arm/boot/dts/exynos5250-smdk5250.dts new file +1
-0+ watchdog at 101D0000 {lowercase hex here and elsewhere in these files, please.
OK, I see.
Quoted 4 lines
Also, technically no need to specify a unit address (@<foo>) in the device node name unless you need it to tell more than one entry apart, but it's become customary to always add them on ARM for some reason.
OK, just to be consistent in writing device nodes, prefer to add address to the names for all device nodes.
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.
v3 cover ARM: EXYNOS: add support new EXYNOS5250
In reply to Kukjin KimQuoted 3 lines · Kukjin Kim
This patch adds support EXYNOS5250 SoC which has two A15 cores can be used on mobile and tablet devices.
Looks basically ok to me. I've commented on patches 5 and 9 and in both cases, I would either like to see the patch get dropped or the changeset description expanded to give a good explanation why the change is actually needed.
Arnd
v3 cover ARM: EXYNOS: add support new EXYNOS5250
Quoted 9 lines · Arnd Bergmann
Quoted 3 lines · Kukjin Kim
This patch adds support EXYNOS5250 SoC which has two A15 cores can be used on mobile and tablet devices.
Looks basically ok to me. I've commented on patches 5 and 9 and in both cases, I would either like to see the patch get dropped or the changeset description expanded to give a good explanation why the change is actually needed.
Agree, looks quite reasonable. I had a few nits as well but nothing major.
Thanks,
-Olof
v3 cover ARM: EXYNOS: add support new EXYNOS5250
Quoted 6 lines · Olof Johansson
Quoted 5 lines · Arnd Bergmann
Quoted 3 lines · Kukjin Kim
This patch adds support EXYNOS5250 SoC which has two A15 cores can be used on mobile and tablet devices.
Quoted 8 lines
Quoted 4 lines
Looks basically ok to me. I've commented on patches 5 and 9 and in both cases, I would either like to see the patch get dropped or the changeset description expanded to give a good explanation why the change is actually needed.
Agree, looks quite reasonable. I had a few nits as well but nothing major.
Hi Arnd, Olof,
Thank you for kindly comments on this.
Let me address comments from you and re-submit in a couple of hours.
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.