162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Header for code common to all OMAP2+ machines.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or modify it
562306a36Sopenharmony_ci * under the terms of the GNU General Public License as published by the
662306a36Sopenharmony_ci * Free Software Foundation; either version 2 of the License, or (at your
762306a36Sopenharmony_ci * option) any later version.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
1062306a36Sopenharmony_ci * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1162306a36Sopenharmony_ci * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
1262306a36Sopenharmony_ci * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1362306a36Sopenharmony_ci * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1462306a36Sopenharmony_ci * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
1562306a36Sopenharmony_ci * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
1662306a36Sopenharmony_ci * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1762306a36Sopenharmony_ci * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
1862306a36Sopenharmony_ci * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci * You should have received a copy of the  GNU General Public License along
2162306a36Sopenharmony_ci * with this program; if not, write  to the Free Software Foundation, Inc.,
2262306a36Sopenharmony_ci * 675 Mass Ave, Cambridge, MA 02139, USA.
2362306a36Sopenharmony_ci */
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#ifndef __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H
2662306a36Sopenharmony_ci#define __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H
2762306a36Sopenharmony_ci#ifndef __ASSEMBLER__
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#include <linux/irq.h>
3062306a36Sopenharmony_ci#include <linux/delay.h>
3162306a36Sopenharmony_ci#include <linux/i2c.h>
3262306a36Sopenharmony_ci#include <linux/mfd/twl.h>
3362306a36Sopenharmony_ci#include <linux/platform_data/i2c-omap.h>
3462306a36Sopenharmony_ci#include <linux/reboot.h>
3562306a36Sopenharmony_ci#include <linux/irqchip/irq-omap-intc.h>
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#include <asm/proc-fns.h>
3862306a36Sopenharmony_ci#include <asm/hardware/cache-l2x0.h>
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#include "i2c.h"
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define OMAP_INTC_START		NR_IRQS
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciextern int (*omap_pm_soc_init)(void);
4562306a36Sopenharmony_ciint omap_pm_nop_init(void);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3)
4862306a36Sopenharmony_ciint omap3_pm_init(void);
4962306a36Sopenharmony_ci#else
5062306a36Sopenharmony_cistatic inline int omap3_pm_init(void)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	return 0;
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci#endif
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#if defined(CONFIG_PM) && (defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX))
5762306a36Sopenharmony_ciint omap4_pm_init(void);
5862306a36Sopenharmony_ciint omap4_pm_init_early(void);
5962306a36Sopenharmony_ci#else
6062306a36Sopenharmony_cistatic inline int omap4_pm_init(void)
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	return 0;
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic inline int omap4_pm_init_early(void)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	return 0;
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci#endif
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#if defined(CONFIG_PM) && (defined(CONFIG_SOC_AM33XX) || \
7262306a36Sopenharmony_ci	defined(CONFIG_SOC_AM43XX))
7362306a36Sopenharmony_ciint amx3_common_pm_init(void);
7462306a36Sopenharmony_ci#else
7562306a36Sopenharmony_cistatic inline int amx3_common_pm_init(void)
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	return 0;
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci#endif
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#ifdef CONFIG_CACHE_L2X0
8262306a36Sopenharmony_ciint omap_l2_cache_init(void);
8362306a36Sopenharmony_ci#define OMAP_L2C_AUX_CTRL	(L2C_AUX_CTRL_SHARED_OVERRIDE | \
8462306a36Sopenharmony_ci				 L310_AUX_CTRL_DATA_PREFETCH | \
8562306a36Sopenharmony_ci				 L310_AUX_CTRL_INSTR_PREFETCH)
8662306a36Sopenharmony_civoid omap4_l2c310_write_sec(unsigned long val, unsigned reg);
8762306a36Sopenharmony_ci#else
8862306a36Sopenharmony_cistatic inline int omap_l2_cache_init(void)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	return 0;
9162306a36Sopenharmony_ci}
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci#define OMAP_L2C_AUX_CTRL	0
9462306a36Sopenharmony_ci#define omap4_l2c310_write_sec	NULL
9562306a36Sopenharmony_ci#endif
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
9862306a36Sopenharmony_ciextern void omap5_realtime_timer_init(void);
9962306a36Sopenharmony_ci#else
10062306a36Sopenharmony_cistatic inline void omap5_realtime_timer_init(void)
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci#endif
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_civoid omap2420_init_early(void);
10662306a36Sopenharmony_civoid omap2430_init_early(void);
10762306a36Sopenharmony_civoid omap3430_init_early(void);
10862306a36Sopenharmony_civoid omap3630_init_early(void);
10962306a36Sopenharmony_civoid am33xx_init_early(void);
11062306a36Sopenharmony_civoid am35xx_init_early(void);
11162306a36Sopenharmony_civoid ti814x_init_early(void);
11262306a36Sopenharmony_civoid ti816x_init_early(void);
11362306a36Sopenharmony_civoid am43xx_init_early(void);
11462306a36Sopenharmony_civoid am43xx_init_late(void);
11562306a36Sopenharmony_civoid omap4430_init_early(void);
11662306a36Sopenharmony_civoid omap5_init_early(void);
11762306a36Sopenharmony_civoid omap3_init_late(void);
11862306a36Sopenharmony_civoid omap4430_init_late(void);
11962306a36Sopenharmony_civoid ti81xx_init_late(void);
12062306a36Sopenharmony_civoid am33xx_init_late(void);
12162306a36Sopenharmony_civoid omap5_init_late(void);
12262306a36Sopenharmony_civoid dra7xx_init_early(void);
12362306a36Sopenharmony_civoid dra7xx_init_late(void);
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci#ifdef CONFIG_SOC_BUS
12662306a36Sopenharmony_civoid omap_soc_device_init(void);
12762306a36Sopenharmony_ci#else
12862306a36Sopenharmony_cistatic inline void omap_soc_device_init(void)
12962306a36Sopenharmony_ci{
13062306a36Sopenharmony_ci}
13162306a36Sopenharmony_ci#endif
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci#if defined(CONFIG_SOC_OMAP2420) || defined(CONFIG_SOC_OMAP2430)
13462306a36Sopenharmony_civoid omap2xxx_restart(enum reboot_mode mode, const char *cmd);
13562306a36Sopenharmony_ci#else
13662306a36Sopenharmony_cistatic inline void omap2xxx_restart(enum reboot_mode mode, const char *cmd)
13762306a36Sopenharmony_ci{
13862306a36Sopenharmony_ci}
13962306a36Sopenharmony_ci#endif
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci#ifdef CONFIG_SOC_AM33XX
14262306a36Sopenharmony_civoid am33xx_restart(enum reboot_mode mode, const char *cmd);
14362306a36Sopenharmony_ci#else
14462306a36Sopenharmony_cistatic inline void am33xx_restart(enum reboot_mode mode, const char *cmd)
14562306a36Sopenharmony_ci{
14662306a36Sopenharmony_ci}
14762306a36Sopenharmony_ci#endif
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3
15062306a36Sopenharmony_civoid omap3xxx_restart(enum reboot_mode mode, const char *cmd);
15162306a36Sopenharmony_ci#else
15262306a36Sopenharmony_cistatic inline void omap3xxx_restart(enum reboot_mode mode, const char *cmd)
15362306a36Sopenharmony_ci{
15462306a36Sopenharmony_ci}
15562306a36Sopenharmony_ci#endif
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci#ifdef CONFIG_SOC_TI81XX
15862306a36Sopenharmony_civoid ti81xx_restart(enum reboot_mode mode, const char *cmd);
15962306a36Sopenharmony_ci#else
16062306a36Sopenharmony_cistatic inline void ti81xx_restart(enum reboot_mode mode, const char *cmd)
16162306a36Sopenharmony_ci{
16262306a36Sopenharmony_ci}
16362306a36Sopenharmony_ci#endif
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \
16662306a36Sopenharmony_ci	defined(CONFIG_SOC_DRA7XX) || defined(CONFIG_SOC_AM43XX)
16762306a36Sopenharmony_civoid omap44xx_restart(enum reboot_mode mode, const char *cmd);
16862306a36Sopenharmony_ci#else
16962306a36Sopenharmony_cistatic inline void omap44xx_restart(enum reboot_mode mode, const char *cmd)
17062306a36Sopenharmony_ci{
17162306a36Sopenharmony_ci}
17262306a36Sopenharmony_ci#endif
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci#ifdef CONFIG_OMAP_INTERCONNECT_BARRIER
17562306a36Sopenharmony_civoid omap_barrier_reserve_memblock(void);
17662306a36Sopenharmony_civoid omap_barriers_init(void);
17762306a36Sopenharmony_ci#else
17862306a36Sopenharmony_cistatic inline void omap_barrier_reserve_memblock(void)
17962306a36Sopenharmony_ci{
18062306a36Sopenharmony_ci}
18162306a36Sopenharmony_ci#endif
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci/* This gets called from mach-omap2/io.c, do not call this */
18462306a36Sopenharmony_civoid __init omap2_set_globals_tap(u32 class, void __iomem *tap);
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_civoid __init omap242x_map_io(void);
18762306a36Sopenharmony_civoid __init omap243x_map_io(void);
18862306a36Sopenharmony_civoid __init omap3_map_io(void);
18962306a36Sopenharmony_civoid __init am33xx_map_io(void);
19062306a36Sopenharmony_civoid __init omap4_map_io(void);
19162306a36Sopenharmony_civoid __init omap5_map_io(void);
19262306a36Sopenharmony_civoid __init dra7xx_map_io(void);
19362306a36Sopenharmony_civoid __init ti81xx_map_io(void);
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci/**
19662306a36Sopenharmony_ci * omap_test_timeout - busy-loop, testing a condition
19762306a36Sopenharmony_ci * @cond: condition to test until it evaluates to true
19862306a36Sopenharmony_ci * @timeout: maximum number of microseconds in the timeout
19962306a36Sopenharmony_ci * @index: loop index (integer)
20062306a36Sopenharmony_ci *
20162306a36Sopenharmony_ci * Loop waiting for @cond to become true or until at least @timeout
20262306a36Sopenharmony_ci * microseconds have passed.  To use, define some integer @index in the
20362306a36Sopenharmony_ci * calling code.  After running, if @index == @timeout, then the loop has
20462306a36Sopenharmony_ci * timed out.
20562306a36Sopenharmony_ci */
20662306a36Sopenharmony_ci#define omap_test_timeout(cond, timeout, index)			\
20762306a36Sopenharmony_ci({								\
20862306a36Sopenharmony_ci	for (index = 0; index < timeout; index++) {		\
20962306a36Sopenharmony_ci		if (cond)					\
21062306a36Sopenharmony_ci			break;					\
21162306a36Sopenharmony_ci		udelay(1);					\
21262306a36Sopenharmony_ci	}							\
21362306a36Sopenharmony_ci})
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_civoid omap_gic_of_init(void);
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci#ifdef CONFIG_CACHE_L2X0
21862306a36Sopenharmony_ciextern void __iomem *omap4_get_l2cache_base(void);
21962306a36Sopenharmony_ci#endif
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_cistruct device_node;
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci#ifdef CONFIG_SMP
22462306a36Sopenharmony_ciextern void __iomem *omap4_get_scu_base(void);
22562306a36Sopenharmony_ci#else
22662306a36Sopenharmony_cistatic inline void __iomem *omap4_get_scu_base(void)
22762306a36Sopenharmony_ci{
22862306a36Sopenharmony_ci	return NULL;
22962306a36Sopenharmony_ci}
23062306a36Sopenharmony_ci#endif
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ciextern void gic_dist_disable(void);
23362306a36Sopenharmony_ciextern void gic_dist_enable(void);
23462306a36Sopenharmony_ciextern bool gic_dist_disabled(void);
23562306a36Sopenharmony_ciextern void gic_timer_retrigger(void);
23662306a36Sopenharmony_ciextern void _omap_smc1(u32 fn, u32 arg);
23762306a36Sopenharmony_ciextern void omap4_sar_ram_init(void);
23862306a36Sopenharmony_ciextern void __iomem *omap4_get_sar_ram_base(void);
23962306a36Sopenharmony_ciextern void omap4_mpuss_early_init(void);
24062306a36Sopenharmony_ciextern void omap_do_wfi(void);
24162306a36Sopenharmony_ciextern void omap_interconnect_sync(void);
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci#ifdef CONFIG_SMP
24462306a36Sopenharmony_ci/* Needed for secondary core boot */
24562306a36Sopenharmony_ciextern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask);
24662306a36Sopenharmony_ciextern void omap_auxcoreboot_addr(u32 cpu_addr);
24762306a36Sopenharmony_ciextern u32 omap_read_auxcoreboot0(void);
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ciextern void omap4_cpu_die(unsigned int cpu);
25062306a36Sopenharmony_ciextern int omap4_cpu_kill(unsigned int cpu);
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ciextern const struct smp_operations omap4_smp_ops;
25362306a36Sopenharmony_ci#endif
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ciextern u32 omap4_get_cpu1_ns_pa_addr(void);
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci#if defined(CONFIG_SMP) && defined(CONFIG_PM)
25862306a36Sopenharmony_ciextern int omap4_mpuss_init(void);
25962306a36Sopenharmony_ciextern int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state,
26062306a36Sopenharmony_ci				bool rcuidle);
26162306a36Sopenharmony_ciextern int omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state);
26262306a36Sopenharmony_ci#else
26362306a36Sopenharmony_cistatic inline int omap4_enter_lowpower(unsigned int cpu,
26462306a36Sopenharmony_ci					unsigned int power_state,
26562306a36Sopenharmony_ci					bool rcuidle)
26662306a36Sopenharmony_ci{
26762306a36Sopenharmony_ci	cpu_do_idle();
26862306a36Sopenharmony_ci	return 0;
26962306a36Sopenharmony_ci}
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_cistatic inline int omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state)
27262306a36Sopenharmony_ci{
27362306a36Sopenharmony_ci	cpu_do_idle();
27462306a36Sopenharmony_ci	return 0;
27562306a36Sopenharmony_ci}
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cistatic inline int omap4_mpuss_init(void)
27862306a36Sopenharmony_ci{
27962306a36Sopenharmony_ci	return 0;
28062306a36Sopenharmony_ci}
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci#endif
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP4
28562306a36Sopenharmony_civoid omap4_secondary_startup(void);
28662306a36Sopenharmony_civoid omap4460_secondary_startup(void);
28762306a36Sopenharmony_ciint omap4_finish_suspend(unsigned long cpu_state);
28862306a36Sopenharmony_civoid omap4_cpu_resume(void);
28962306a36Sopenharmony_ci#else
29062306a36Sopenharmony_cistatic inline void omap4_secondary_startup(void)
29162306a36Sopenharmony_ci{
29262306a36Sopenharmony_ci}
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_cistatic inline void omap4460_secondary_startup(void)
29562306a36Sopenharmony_ci{
29662306a36Sopenharmony_ci}
29762306a36Sopenharmony_cistatic inline int omap4_finish_suspend(unsigned long cpu_state)
29862306a36Sopenharmony_ci{
29962306a36Sopenharmony_ci	return 0;
30062306a36Sopenharmony_ci}
30162306a36Sopenharmony_cistatic inline void omap4_cpu_resume(void)
30262306a36Sopenharmony_ci{
30362306a36Sopenharmony_ci}
30462306a36Sopenharmony_ci#endif
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci#if defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX)
30762306a36Sopenharmony_civoid omap5_secondary_startup(void);
30862306a36Sopenharmony_civoid omap5_secondary_hyp_startup(void);
30962306a36Sopenharmony_ci#else
31062306a36Sopenharmony_cistatic inline void omap5_secondary_startup(void)
31162306a36Sopenharmony_ci{
31262306a36Sopenharmony_ci}
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_cistatic inline void omap5_secondary_hyp_startup(void)
31562306a36Sopenharmony_ci{
31662306a36Sopenharmony_ci}
31762306a36Sopenharmony_ci#endif
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_cistruct omap_system_dma_plat_info;
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_civoid pdata_quirks_init(const struct of_device_id *);
32262306a36Sopenharmony_civoid omap_auxdata_legacy_init(struct device *dev);
32362306a36Sopenharmony_civoid omap_pcs_legacy_init(int irq, void (*rearm)(void));
32462306a36Sopenharmony_ciextern struct omap_system_dma_plat_info dma_plat_info;
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_cistruct omap_sdrc_params;
32762306a36Sopenharmony_ciextern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
32862306a36Sopenharmony_ci				      struct omap_sdrc_params *sdrc_cs1);
32962306a36Sopenharmony_ciextern void omap_reserve(void);
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_cistruct omap_hwmod;
33262306a36Sopenharmony_ciextern int omap_dss_reset(struct omap_hwmod *);
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci/* SoC specific clock initializer */
33562306a36Sopenharmony_ciint omap_clk_init(void);
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_OMAP_IOMMU)
33862306a36Sopenharmony_ciint omap_iommu_set_pwrdm_constraint(struct platform_device *pdev, bool request,
33962306a36Sopenharmony_ci				    u8 *pwrst);
34062306a36Sopenharmony_ci#else
34162306a36Sopenharmony_cistatic inline int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev,
34262306a36Sopenharmony_ci						  bool request, u8 *pwrst)
34362306a36Sopenharmony_ci{
34462306a36Sopenharmony_ci	return 0;
34562306a36Sopenharmony_ci}
34662306a36Sopenharmony_ci#endif
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci#endif /* __ASSEMBLER__ */
34962306a36Sopenharmony_ci#endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */
350