xref: /openbmc/linux/arch/arm/mach-omap1/io.c (revision 3098cb65)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * linux/arch/arm/mach-omap1/io.c
4  *
5  * OMAP1 I/O mapping code
6  */
7 
8 #include <linux/module.h>
9 #include <linux/kernel.h>
10 #include <linux/init.h>
11 #include <linux/io.h>
12 #include <linux/omap-dma.h>
13 
14 #include <asm/tlb.h>
15 #include <asm/mach/map.h>
16 
17 #include "tc.h"
18 #include "iomap.h"
19 #include "common.h"
20 
21 /*
22  * The machine specific code may provide the extra mapping besides the
23  * default mapping provided here.
24  */
25 #if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
26 static struct map_desc omap7xx_io_desc[] __initdata = {
27 	{
28 		.virtual	= OMAP1_IO_VIRT,
29 		.pfn		= __phys_to_pfn(OMAP1_IO_PHYS),
30 		.length		= OMAP1_IO_SIZE,
31 		.type		= MT_DEVICE
32 	},
33 	{
34 		.virtual	= OMAP7XX_DSP_BASE,
35 		.pfn		= __phys_to_pfn(OMAP7XX_DSP_START),
36 		.length		= OMAP7XX_DSP_SIZE,
37 		.type		= MT_DEVICE
38 	}, {
39 		.virtual	= OMAP7XX_DSPREG_BASE,
40 		.pfn		= __phys_to_pfn(OMAP7XX_DSPREG_START),
41 		.length		= OMAP7XX_DSPREG_SIZE,
42 		.type		= MT_DEVICE
43 	}
44 };
45 #endif
46 
47 #ifdef CONFIG_ARCH_OMAP15XX
48 static struct map_desc omap1510_io_desc[] __initdata = {
49 	{
50 		.virtual	= OMAP1_IO_VIRT,
51 		.pfn		= __phys_to_pfn(OMAP1_IO_PHYS),
52 		.length		= OMAP1_IO_SIZE,
53 		.type		= MT_DEVICE
54 	},
55 	{
56 		.virtual	= OMAP1510_DSP_BASE,
57 		.pfn		= __phys_to_pfn(OMAP1510_DSP_START),
58 		.length		= OMAP1510_DSP_SIZE,
59 		.type		= MT_DEVICE
60 	}, {
61 		.virtual	= OMAP1510_DSPREG_BASE,
62 		.pfn		= __phys_to_pfn(OMAP1510_DSPREG_START),
63 		.length		= OMAP1510_DSPREG_SIZE,
64 		.type		= MT_DEVICE
65 	}
66 };
67 #endif
68 
69 #if defined(CONFIG_ARCH_OMAP16XX)
70 static struct map_desc omap16xx_io_desc[] __initdata = {
71 	{
72 		.virtual	= OMAP1_IO_VIRT,
73 		.pfn		= __phys_to_pfn(OMAP1_IO_PHYS),
74 		.length		= OMAP1_IO_SIZE,
75 		.type		= MT_DEVICE
76 	},
77 	{
78 		.virtual	= OMAP16XX_DSP_BASE,
79 		.pfn		= __phys_to_pfn(OMAP16XX_DSP_START),
80 		.length		= OMAP16XX_DSP_SIZE,
81 		.type		= MT_DEVICE
82 	}, {
83 		.virtual	= OMAP16XX_DSPREG_BASE,
84 		.pfn		= __phys_to_pfn(OMAP16XX_DSPREG_START),
85 		.length		= OMAP16XX_DSPREG_SIZE,
86 		.type		= MT_DEVICE
87 	}
88 };
89 #endif
90 
91 #if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
92 void __init omap7xx_map_io(void)
93 {
94 	iotable_init(omap7xx_io_desc, ARRAY_SIZE(omap7xx_io_desc));
95 }
96 #endif
97 
98 #ifdef CONFIG_ARCH_OMAP15XX
99 void __init omap15xx_map_io(void)
100 {
101 	iotable_init(omap1510_io_desc, ARRAY_SIZE(omap1510_io_desc));
102 }
103 #endif
104 
105 #if defined(CONFIG_ARCH_OMAP16XX)
106 void __init omap16xx_map_io(void)
107 {
108 	iotable_init(omap16xx_io_desc, ARRAY_SIZE(omap16xx_io_desc));
109 }
110 #endif
111 
112 /*
113  * Common low-level hardware init for omap1.
114  */
115 void __init omap1_init_early(void)
116 {
117 	omap_check_revision();
118 
119 	/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
120 	 * on a Posted Write in the TIPB Bridge".
121 	 */
122 	omap_writew(0x0, MPU_PUBLIC_TIPB_CNTL);
123 	omap_writew(0x0, MPU_PRIVATE_TIPB_CNTL);
124 }
125 
126 void __init omap1_init_late(void)
127 {
128 	omap_serial_wakeup_init();
129 }
130 
131 /*
132  * NOTE: Please use ioremap + __raw_read/write where possible instead of these
133  */
134 
135 u8 omap_readb(u32 pa)
136 {
137 	return __raw_readb(OMAP1_IO_ADDRESS(pa));
138 }
139 EXPORT_SYMBOL(omap_readb);
140 
141 u16 omap_readw(u32 pa)
142 {
143 	return __raw_readw(OMAP1_IO_ADDRESS(pa));
144 }
145 EXPORT_SYMBOL(omap_readw);
146 
147 u32 omap_readl(u32 pa)
148 {
149 	return __raw_readl(OMAP1_IO_ADDRESS(pa));
150 }
151 EXPORT_SYMBOL(omap_readl);
152 
153 void omap_writeb(u8 v, u32 pa)
154 {
155 	__raw_writeb(v, OMAP1_IO_ADDRESS(pa));
156 }
157 EXPORT_SYMBOL(omap_writeb);
158 
159 void omap_writew(u16 v, u32 pa)
160 {
161 	__raw_writew(v, OMAP1_IO_ADDRESS(pa));
162 }
163 EXPORT_SYMBOL(omap_writew);
164 
165 void omap_writel(u32 v, u32 pa)
166 {
167 	__raw_writel(v, OMAP1_IO_ADDRESS(pa));
168 }
169 EXPORT_SYMBOL(omap_writel);
170