xref: /openbmc/linux/arch/arm/mach-exynos/common.h (revision e318b36e)
1347863d4SKrzysztof Kozlowski /* SPDX-License-Identifier: GPL-2.0 */
2cc511b8dSKukjin Kim /*
3cc511b8dSKukjin Kim  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4cc511b8dSKukjin Kim  *		http://www.samsung.com
5cc511b8dSKukjin Kim  *
645984f0cSKrzysztof Kozlowski  * Common Header for Exynos machines
7cc511b8dSKukjin Kim  */
8cc511b8dSKukjin Kim 
9cc511b8dSKukjin Kim #ifndef __ARCH_ARM_MACH_EXYNOS_COMMON_H
10cc511b8dSKukjin Kim #define __ARCH_ARM_MACH_EXYNOS_COMMON_H
11cc511b8dSKukjin Kim 
12712eddf7SBartlomiej Zolnierkiewicz #include <linux/platform_data/cpuidle-exynos.h>
136e6aac75SThomas Abraham 
14940bc58dSChanwoo Choi #define EXYNOS3250_SOC_ID	0xE3472000
15940bc58dSChanwoo Choi #define EXYNOS3_SOC_MASK	0xFFFFF000
16940bc58dSChanwoo Choi 
177cb2ded1SSachin Kamat #define EXYNOS4210_CPU_ID	0x43210000
187cb2ded1SSachin Kamat #define EXYNOS4212_CPU_ID	0x43220000
197cb2ded1SSachin Kamat #define EXYNOS4412_CPU_ID	0xE4412200
207cb2ded1SSachin Kamat #define EXYNOS4_CPU_MASK	0xFFFE0000
217cb2ded1SSachin Kamat 
22723c9c7eSTarek Dakhran #define EXYNOS5250_SOC_ID	0x43520000
237cb2ded1SSachin Kamat #define EXYNOS5410_SOC_ID	0xE5410000
2486c6f148SArun Kumar K #define EXYNOS5420_SOC_ID	0xE5420000
257cb2ded1SSachin Kamat #define EXYNOS5800_SOC_ID	0xE5422000
267cb2ded1SSachin Kamat #define EXYNOS5_SOC_MASK	0xFFFFF000
27edaff7e1SArnd Bergmann 
287cb2ded1SSachin Kamat extern unsigned long exynos_cpu_id;
297cb2ded1SSachin Kamat 
307cb2ded1SSachin Kamat #define IS_SAMSUNG_CPU(name, id, mask)		\
317cb2ded1SSachin Kamat static inline int is_samsung_##name(void)	\
32edaff7e1SArnd Bergmann {						\
337cb2ded1SSachin Kamat 	return ((exynos_cpu_id & mask) == (id & mask));	\
347cb2ded1SSachin Kamat }
35940bc58dSChanwoo Choi 
367cb2ded1SSachin Kamat IS_SAMSUNG_CPU(exynos3250, EXYNOS3250_SOC_ID, EXYNOS3_SOC_MASK)
377cb2ded1SSachin Kamat IS_SAMSUNG_CPU(exynos4210, EXYNOS4210_CPU_ID, EXYNOS4_CPU_MASK)
387cb2ded1SSachin Kamat IS_SAMSUNG_CPU(exynos4212, EXYNOS4212_CPU_ID, EXYNOS4_CPU_MASK)
39723c9c7eSTarek Dakhran IS_SAMSUNG_CPU(exynos4412, EXYNOS4412_CPU_ID, EXYNOS4_CPU_MASK)
407cb2ded1SSachin Kamat IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK)
4186c6f148SArun Kumar K IS_SAMSUNG_CPU(exynos5410, EXYNOS5410_SOC_ID, EXYNOS5_SOC_MASK)
427cb2ded1SSachin Kamat IS_SAMSUNG_CPU(exynos5420, EXYNOS5420_SOC_ID, EXYNOS5_SOC_MASK)
43940bc58dSChanwoo Choi IS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS5_SOC_MASK)
44940bc58dSChanwoo Choi 
45940bc58dSChanwoo Choi #if defined(CONFIG_SOC_EXYNOS3250)
46940bc58dSChanwoo Choi # define soc_is_exynos3250()	is_samsung_exynos3250()
47940bc58dSChanwoo Choi #else
48940bc58dSChanwoo Choi # define soc_is_exynos3250()	0
497cb2ded1SSachin Kamat #endif
507cb2ded1SSachin Kamat 
517cb2ded1SSachin Kamat #if defined(CONFIG_CPU_EXYNOS4210)
527cb2ded1SSachin Kamat # define soc_is_exynos4210()	is_samsung_exynos4210()
537cb2ded1SSachin Kamat #else
547cb2ded1SSachin Kamat # define soc_is_exynos4210()	0
557cb2ded1SSachin Kamat #endif
567cb2ded1SSachin Kamat 
577cb2ded1SSachin Kamat #if defined(CONFIG_SOC_EXYNOS4212)
587cb2ded1SSachin Kamat # define soc_is_exynos4212()	is_samsung_exynos4212()
597cb2ded1SSachin Kamat #else
607cb2ded1SSachin Kamat # define soc_is_exynos4212()	0
617cb2ded1SSachin Kamat #endif
627cb2ded1SSachin Kamat 
637cb2ded1SSachin Kamat #if defined(CONFIG_SOC_EXYNOS4412)
647cb2ded1SSachin Kamat # define soc_is_exynos4412()	is_samsung_exynos4412()
657cb2ded1SSachin Kamat #else
667cb2ded1SSachin Kamat # define soc_is_exynos4412()	0
677cb2ded1SSachin Kamat #endif
687cb2ded1SSachin Kamat 
697cb2ded1SSachin Kamat #define EXYNOS4210_REV_0	(0x0)
707cb2ded1SSachin Kamat #define EXYNOS4210_REV_1_0	(0x10)
71723c9c7eSTarek Dakhran #define EXYNOS4210_REV_1_1	(0x11)
72723c9c7eSTarek Dakhran 
73723c9c7eSTarek Dakhran #if defined(CONFIG_SOC_EXYNOS5250)
74723c9c7eSTarek Dakhran # define soc_is_exynos5250()	is_samsung_exynos5250()
75723c9c7eSTarek Dakhran #else
76723c9c7eSTarek Dakhran # define soc_is_exynos5250()	0
777cb2ded1SSachin Kamat #endif
787cb2ded1SSachin Kamat 
797cb2ded1SSachin Kamat #if defined(CONFIG_SOC_EXYNOS5410)
807cb2ded1SSachin Kamat # define soc_is_exynos5410()	is_samsung_exynos5410()
817cb2ded1SSachin Kamat #else
827cb2ded1SSachin Kamat # define soc_is_exynos5410()	0
8386c6f148SArun Kumar K #endif
8486c6f148SArun Kumar K 
8586c6f148SArun Kumar K #if defined(CONFIG_SOC_EXYNOS5420)
8686c6f148SArun Kumar K # define soc_is_exynos5420()	is_samsung_exynos5420()
8786c6f148SArun Kumar K #else
8886c6f148SArun Kumar K # define soc_is_exynos5420()	0
892b9d9c32STomasz Figa #endif
902b9d9c32STomasz Figa 
912b9d9c32STomasz Figa #if defined(CONFIG_SOC_EXYNOS5800)
92b3205deaSSachin Kamat # define soc_is_exynos5800()	is_samsung_exynos5800()
93cd245f59SDaniel Lezcano #else
943a1f2f38SJoonyoung Shim # define soc_is_exynos5800()	0
95fce9e5bbSPankaj Dubey #endif
961754c42eSOlof Johansson 
97bb13fabcSShawn Guo extern u32 cp15_save_diag;
980b7778a8SBartlomiej Zolnierkiewicz extern u32 cp15_save_power;
990b7778a8SBartlomiej Zolnierkiewicz 
1000b7778a8SBartlomiej Zolnierkiewicz extern void __iomem *sysram_ns_base_addr;
1010b7778a8SBartlomiej Zolnierkiewicz extern void __iomem *sysram_base_addr;
1020b7778a8SBartlomiej Zolnierkiewicz extern phys_addr_t sysram_base_phys;
103bca28f8fSTomasz Figa extern void __iomem *pmu_base_addr;
104bca28f8fSTomasz Figa void exynos_sysram_init(void);
105dc1b9448SBartlomiej Zolnierkiewicz 
106dc1b9448SBartlomiej Zolnierkiewicz enum {
107054e6aa1SKrzysztof Kozlowski 	FW_DO_IDLE_SLEEP,
108054e6aa1SKrzysztof Kozlowski 	FW_DO_IDLE_AFTR,
109*e318b36eSJonathan Corbet };
110054e6aa1SKrzysztof Kozlowski 
111054e6aa1SKrzysztof Kozlowski void exynos_firmware_init(void);
112054e6aa1SKrzysztof Kozlowski 
113dc1b9448SBartlomiej Zolnierkiewicz /* CPU BOOT mode flag for Exynos3250 SoC bootloader */
114e0b35c1aSKrzysztof Kozlowski #define C2_STATE	(1 << 3)
115dc1b9448SBartlomiej Zolnierkiewicz /*
116dc1b9448SBartlomiej Zolnierkiewicz  * Magic values for bootloader indicating chosen low power mode.
117dc1b9448SBartlomiej Zolnierkiewicz  * See also Documentation/arch/arm/samsung/bootloader-interface.rst
118559ba237STomasz Figa  */
119559ba237STomasz Figa #define EXYNOS_SLEEP_MAGIC	0x00000bad
120559ba237STomasz Figa #define EXYNOS_AFTR_MAGIC	0xfcba0d10
121559ba237STomasz Figa 
122559ba237STomasz Figa bool __init exynos_secure_firmware_available(void);
123559ba237STomasz Figa void exynos_set_boot_flag(unsigned int cpu, unsigned int mode);
124d710aa31STomasz Figa void exynos_clear_boot_flag(unsigned int cpu, unsigned int mode);
1252b9d9c32STomasz Figa 
126d710aa31STomasz Figa #ifdef CONFIG_PM_SLEEP
12775305275SMasahiro Yamada extern void __init exynos_pm_init(void);
12806853ae4SMarc Zyngier #else
exynos_pm_init(void)129d3af6976SLeela Krishna Amudala static inline void exynos_pm_init(void) {}
130d3af6976SLeela Krishna Amudala #endif
131d3af6976SLeela Krishna Amudala 
132096d21c6SAbhilash Kesavan extern void exynos_cpu_resume(void);
133096d21c6SAbhilash Kesavan extern void exynos_cpu_resume_ns(void);
134096d21c6SAbhilash Kesavan 
1350d713cf1SBartlomiej Zolnierkiewicz extern const struct smp_operations exynos_smp_ops;
1360d713cf1SBartlomiej Zolnierkiewicz 
1370d713cf1SBartlomiej Zolnierkiewicz extern void exynos_cpu_power_down(int cpu);
1380d713cf1SBartlomiej Zolnierkiewicz extern void exynos_cpu_power_up(int cpu);
1393681bafeSDaniel Lezcano extern int  exynos_cpu_power_state(int cpu);
1403c33710bSPankaj Dubey extern void exynos_cluster_power_down(int cluster);
1413c33710bSPankaj Dubey extern void exynos_cluster_power_up(int cluster);
1423c33710bSPankaj Dubey extern int  exynos_cluster_power_state(int cluster);
1433c33710bSPankaj Dubey extern void exynos_cpu_save_register(void);
1443c33710bSPankaj Dubey extern void exynos_cpu_restore_register(void);
145ccd458c1SKukjin Kim extern void exynos_pm_central_suspend(void);
146712eddf7SBartlomiej Zolnierkiewicz extern int exynos_pm_central_resume(void);
147712eddf7SBartlomiej Zolnierkiewicz extern void exynos_enter_aftr(void);
1486f024978SKrzysztof Kozlowski #ifdef CONFIG_SMP
1496f024978SKrzysztof Kozlowski extern void exynos_scu_enable(void);
150edaff7e1SArnd Bergmann #else
exynos_scu_enable(void)151af997114SBartlomiej Zolnierkiewicz static inline void exynos_scu_enable(void) { }
152af997114SBartlomiej Zolnierkiewicz #endif
153af997114SBartlomiej Zolnierkiewicz 
1547cb2ded1SSachin Kamat extern struct cpuidle_exynos_data cpuidle_coupled_exynos_data;
1552e94ac42SPankaj Dubey 
1562e94ac42SPankaj Dubey extern void exynos_set_delayed_reset_assertion(bool enable);
157d0ceee0bSBen Dooks 
1582e94ac42SPankaj Dubey extern unsigned int exynos_rev(void);
1592e94ac42SPankaj Dubey extern void exynos_core_restart(u32 core_id);
1602e94ac42SPankaj Dubey extern int exynos_set_boot_addr(u32 core_id, unsigned long boot_addr);
1612e94ac42SPankaj Dubey extern int exynos_get_boot_addr(u32 core_id, unsigned long *boot_addr);
162d0ceee0bSBen Dooks 
pmu_raw_writel(u32 val,u32 offset)1632e94ac42SPankaj Dubey static inline void pmu_raw_writel(u32 val, u32 offset)
1642e94ac42SPankaj Dubey {
165cc511b8dSKukjin Kim 	writel_relaxed(val, pmu_base_addr + offset);
166 }
167 
pmu_raw_readl(u32 offset)168 static inline u32 pmu_raw_readl(u32 offset)
169 {
170 	return readl_relaxed(pmu_base_addr + offset);
171 }
172 
173 #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */
174