io.c 3.54 KB
Newer Older
1 2 3 4 5 6 7
/*
 * linux/arch/arm/mach-omap2/io.c
 *
 * OMAP2 I/O mapping code
 *
 * Copyright (C) 2005 Nokia Corporation
 * Author: Juha Yrjl <juha.yrjola@nokia.com>
8
 * Updated map desc to add 2430 support : <x0khasim@ti.com>
9 10 11 12 13 14 15 16 17 18
 *
 * 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/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

19
#include <asm/tlb.h>
20
#include <asm/io.h>
21 22 23

#include <asm/mach/map.h>

24
#include <asm/arch/mux.h>
25
#include <asm/arch/omapfb.h>
26 27 28 29

extern void omap_sram_init(void);
extern int omap2_clk_init(void);
extern void omap2_check_revision(void);
30
extern void omap2_init_memory(void);
31
extern void gpmc_init(void);
32
extern void omapfb_reserve_sdram(void);
33 34 35 36 37 38 39 40 41 42 43 44

/*
 * The machine specific code may provide the extra mapping besides the
 * default mapping provided here.
 */
static struct map_desc omap2_io_desc[] __initdata = {
	{
		.virtual	= L3_24XX_VIRT,
		.pfn		= __phys_to_pfn(L3_24XX_PHYS),
		.length		= L3_24XX_SIZE,
		.type		= MT_DEVICE
	},
45 46 47 48 49 50 51 52 53 54 55 56 57
#ifdef CONFIG_ARCH_OMAP2430
	{
		.virtual	= L4_WK_243X_VIRT,
		.pfn		= __phys_to_pfn(L4_WK_243X_PHYS),
		.length		= L4_WK_243X_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= OMAP243X_GPMC_VIRT,
		.pfn		= __phys_to_pfn(OMAP243X_GPMC_PHYS),
		.length		= OMAP243X_GPMC_SIZE,
		.type		= MT_DEVICE
	},
58 59 60 61 62 63 64 65 66 67 68 69
	{
		.virtual	= OMAP243X_SDRC_VIRT,
		.pfn		= __phys_to_pfn(OMAP243X_SDRC_PHYS),
		.length		= OMAP243X_SDRC_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= OMAP243X_SMS_VIRT,
		.pfn		= __phys_to_pfn(OMAP243X_SMS_PHYS),
		.length		= OMAP243X_SMS_SIZE,
		.type		= MT_DEVICE
	},
70
#endif
71
	{
72 73 74 75 76 77 78 79 80 81 82
		.virtual	= DSP_MEM_24XX_VIRT,
		.pfn		= __phys_to_pfn(DSP_MEM_24XX_PHYS),
		.length		= DSP_MEM_24XX_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= DSP_IPI_24XX_VIRT,
		.pfn		= __phys_to_pfn(DSP_IPI_24XX_PHYS),
		.length		= DSP_IPI_24XX_SIZE,
		.type		= MT_DEVICE
	},
Tony Lindgren's avatar
Tony Lindgren committed
83
	{
84 85 86
		.virtual	= DSP_MMU_24XX_VIRT,
		.pfn		= __phys_to_pfn(DSP_MMU_24XX_PHYS),
		.length		= DSP_MMU_24XX_SIZE,
Tony Lindgren's avatar
Tony Lindgren committed
87 88
		.type		= MT_DEVICE
	},
Tony Lindgren's avatar
Tony Lindgren committed
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
#ifdef CONFIG_ARCH_OMAP2430
	{
		.virtual	= L4_WK_243X_VIRT,
		.pfn		= __phys_to_pfn(L4_WK_243X_PHYS),
		.length		= L4_WK_243X_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= OMAP243X_GPMC_VIRT,
		.pfn		= __phys_to_pfn(OMAP243X_GPMC_PHYS),
		.length		= OMAP243X_GPMC_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= OMAP243X_SDRC_VIRT,
		.pfn		= __phys_to_pfn(OMAP243X_SDRC_PHYS),
		.length		= OMAP243X_SDRC_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= OMAP243X_SMS_VIRT,
		.pfn		= __phys_to_pfn(OMAP243X_SMS_PHYS),
		.length		= OMAP243X_SMS_SIZE,
		.type		= MT_DEVICE
	},
#endif
	{
		.virtual	= DSP_MEM_24XX_VIRT,
		.pfn		= __phys_to_pfn(DSP_MEM_24XX_PHYS),
		.length		= DSP_MEM_24XX_SIZE,
		.type		= MT_DEVICE
	},
121
#ifdef CONFIG_ARCH_OMAP2420
Tony Lindgren's avatar
Tony Lindgren committed
122 123 124 125 126 127
	{
		.virtual	= DSP_IPI_24XX_VIRT,
		.pfn		= __phys_to_pfn(DSP_IPI_24XX_PHYS),
		.length		= DSP_IPI_24XX_SIZE,
		.type		= MT_DEVICE
	},
128
#endif
129
	{
Tony Lindgren's avatar
Tony Lindgren committed
130 131 132
		.virtual	= DSP_MMU_24XX_VIRT,
		.pfn		= __phys_to_pfn(DSP_MMU_24XX_PHYS),
		.length		= DSP_MMU_24XX_SIZE,
133 134
		.type		= MT_DEVICE
	},
135 136
};

137
void __init omap2_map_common_io(void)
138 139
{
	iotable_init(omap2_io_desc, ARRAY_SIZE(omap2_io_desc));
140 141 142 143 144 145 146 147

	/* Normally devicemaps_init() would flush caches and tlb after
	 * mdesc->map_io(), but we must also do it here because of the CPU
	 * revision check below.
	 */
	local_flush_tlb_all();
	flush_cache_all();

148 149
	omap2_check_revision();
	omap_sram_init();
150
	omapfb_reserve_sdram();
151 152 153 154
}

void __init omap2_init_common_hw(void)
{
155 156
	omap2_mux_init();
	omap2_clk_init();
157
	omap2_init_memory();
158
	gpmc_init();
159
}