1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2f577ffd7STony Lindgren /*
3f577ffd7STony Lindgren * linux/arch/arm/mach-omap1/io.c
4f577ffd7STony Lindgren *
5f577ffd7STony Lindgren * OMAP1 I/O mapping code
6f577ffd7STony Lindgren */
7f577ffd7STony Lindgren
8f577ffd7STony Lindgren #include <linux/module.h>
9f577ffd7STony Lindgren #include <linux/kernel.h>
10f577ffd7STony Lindgren #include <linux/init.h>
11fced80c7SRussell King #include <linux/io.h>
127e0a9e62SArnd Bergmann #include <linux/omap-dma.h>
13f577ffd7STony Lindgren
1453d9cc73STony Lindgren #include <asm/tlb.h>
15f577ffd7STony Lindgren #include <asm/mach/map.h>
162e3ee9f4STony Lindgren
177e0a9e62SArnd Bergmann #include "tc.h"
182e3ee9f4STony Lindgren #include "iomap.h"
192e3ee9f4STony Lindgren #include "common.h"
2052650505SPaul Walmsley
21f577ffd7STony Lindgren /*
22f577ffd7STony Lindgren * The machine specific code may provide the extra mapping besides the
23f577ffd7STony Lindgren * default mapping provided here.
24f577ffd7STony Lindgren */
25*9a99b142SArnd Bergmann static struct map_desc omap1_io_desc[] __initdata = {
269fe133b1SDeepak Saxena {
27980a637dSArnd Bergmann .virtual = OMAP1_IO_VIRT,
28980a637dSArnd Bergmann .pfn = __phys_to_pfn(OMAP1_IO_PHYS),
29980a637dSArnd Bergmann .length = OMAP1_IO_SIZE,
30980a637dSArnd Bergmann .type = MT_DEVICE
31*9a99b142SArnd Bergmann }, {
32*9a99b142SArnd Bergmann .virtual = OMAP1_DSP_BASE,
33*9a99b142SArnd Bergmann .pfn = __phys_to_pfn(OMAP1_DSP_START),
34*9a99b142SArnd Bergmann .length = OMAP1_DSP_SIZE,
359fe133b1SDeepak Saxena .type = MT_DEVICE
369fe133b1SDeepak Saxena }, {
37*9a99b142SArnd Bergmann .virtual = OMAP1_DSPREG_BASE,
38*9a99b142SArnd Bergmann .pfn = __phys_to_pfn(OMAP1_DSPREG_START),
39*9a99b142SArnd Bergmann .length = OMAP1_DSPREG_SIZE,
409fe133b1SDeepak Saxena .type = MT_DEVICE
419fe133b1SDeepak Saxena }
42f577ffd7STony Lindgren };
43f577ffd7STony Lindgren
44*9a99b142SArnd Bergmann /*
45*9a99b142SArnd Bergmann * Maps common IO regions for omap1
46*9a99b142SArnd Bergmann */
omap1_map_io(void)47*9a99b142SArnd Bergmann void __init omap1_map_io(void)
489fe133b1SDeepak Saxena {
49*9a99b142SArnd Bergmann iotable_init(omap1_io_desc, ARRAY_SIZE(omap1_io_desc));
509fe133b1SDeepak Saxena }
51f577ffd7STony Lindgren
5253d9cc73STony Lindgren /*
537b88e62fSTony Lindgren * Common low-level hardware init for omap1.
5453d9cc73STony Lindgren */
omap1_init_early(void)558eaa7bb0STony Lindgren void __init omap1_init_early(void)
5653d9cc73STony Lindgren {
577b88e62fSTony Lindgren omap_check_revision();
587b88e62fSTony Lindgren
59f577ffd7STony Lindgren /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
60f577ffd7STony Lindgren * on a Posted Write in the TIPB Bridge".
61f577ffd7STony Lindgren */
62f577ffd7STony Lindgren omap_writew(0x0, MPU_PUBLIC_TIPB_CNTL);
63f577ffd7STony Lindgren omap_writew(0x0, MPU_PRIVATE_TIPB_CNTL);
643179a019STony Lindgren }
657c38cf02STony Lindgren
omap1_init_late(void)6682c3bd03SShawn Guo void __init omap1_init_late(void)
6782c3bd03SShawn Guo {
6882c3bd03SShawn Guo omap_serial_wakeup_init();
6982c3bd03SShawn Guo }
7082c3bd03SShawn Guo
71df1e9d1cSTony Lindgren /*
72df1e9d1cSTony Lindgren * NOTE: Please use ioremap + __raw_read/write where possible instead of these
73df1e9d1cSTony Lindgren */
74df1e9d1cSTony Lindgren
omap_readb(u32 pa)75df1e9d1cSTony Lindgren u8 omap_readb(u32 pa)
76df1e9d1cSTony Lindgren {
77df1e9d1cSTony Lindgren return __raw_readb(OMAP1_IO_ADDRESS(pa));
78df1e9d1cSTony Lindgren }
79df1e9d1cSTony Lindgren EXPORT_SYMBOL(omap_readb);
80df1e9d1cSTony Lindgren
omap_readw(u32 pa)81df1e9d1cSTony Lindgren u16 omap_readw(u32 pa)
82df1e9d1cSTony Lindgren {
83df1e9d1cSTony Lindgren return __raw_readw(OMAP1_IO_ADDRESS(pa));
84df1e9d1cSTony Lindgren }
85df1e9d1cSTony Lindgren EXPORT_SYMBOL(omap_readw);
86df1e9d1cSTony Lindgren
omap_readl(u32 pa)87df1e9d1cSTony Lindgren u32 omap_readl(u32 pa)
88df1e9d1cSTony Lindgren {
89df1e9d1cSTony Lindgren return __raw_readl(OMAP1_IO_ADDRESS(pa));
90df1e9d1cSTony Lindgren }
91df1e9d1cSTony Lindgren EXPORT_SYMBOL(omap_readl);
92df1e9d1cSTony Lindgren
omap_writeb(u8 v,u32 pa)93df1e9d1cSTony Lindgren void omap_writeb(u8 v, u32 pa)
94df1e9d1cSTony Lindgren {
95df1e9d1cSTony Lindgren __raw_writeb(v, OMAP1_IO_ADDRESS(pa));
96df1e9d1cSTony Lindgren }
97df1e9d1cSTony Lindgren EXPORT_SYMBOL(omap_writeb);
98df1e9d1cSTony Lindgren
omap_writew(u16 v,u32 pa)99df1e9d1cSTony Lindgren void omap_writew(u16 v, u32 pa)
100df1e9d1cSTony Lindgren {
101df1e9d1cSTony Lindgren __raw_writew(v, OMAP1_IO_ADDRESS(pa));
102df1e9d1cSTony Lindgren }
103df1e9d1cSTony Lindgren EXPORT_SYMBOL(omap_writew);
104df1e9d1cSTony Lindgren
omap_writel(u32 v,u32 pa)105df1e9d1cSTony Lindgren void omap_writel(u32 v, u32 pa)
106df1e9d1cSTony Lindgren {
107df1e9d1cSTony Lindgren __raw_writel(v, OMAP1_IO_ADDRESS(pa));
108df1e9d1cSTony Lindgren }
109df1e9d1cSTony Lindgren EXPORT_SYMBOL(omap_writel);
110