GNU Linux-libre 6.1.90-gnu
[releases.git] / arch / arm / mach-omap1 / io.c
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);