1 /* 2 * linux/arch/arm/mach-omap1/io.c 3 * 4 * OMAP1 I/O mapping code 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11 #include <linux/config.h> 12 #include <linux/module.h> 13 #include <linux/kernel.h> 14 #include <linux/init.h> 15 16 #include <asm/mach/map.h> 17 #include <asm/io.h> 18 #include <asm/arch/tc.h> 19 20 extern int clk_init(void); 21 extern void omap_check_revision(void); 22 23 /* 24 * The machine specific code may provide the extra mapping besides the 25 * default mapping provided here. 26 */ 27 static struct map_desc omap_io_desc[] __initdata = { 28 { IO_VIRT, IO_PHYS, IO_SIZE, MT_DEVICE }, 29 }; 30 31 #ifdef CONFIG_ARCH_OMAP730 32 static struct map_desc omap730_io_desc[] __initdata = { 33 { OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_SIZE, MT_DEVICE }, 34 { OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE }, 35 { OMAP730_SRAM_BASE, OMAP730_SRAM_START, OMAP730_SRAM_SIZE, MT_DEVICE } 36 }; 37 #endif 38 39 #ifdef CONFIG_ARCH_OMAP1510 40 static struct map_desc omap1510_io_desc[] __initdata = { 41 { OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_SIZE, MT_DEVICE }, 42 { OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE }, 43 { OMAP1510_SRAM_BASE, OMAP1510_SRAM_START, OMAP1510_SRAM_SIZE, MT_DEVICE } 44 }; 45 #endif 46 47 #if defined(CONFIG_ARCH_OMAP16XX) 48 static struct map_desc omap1610_io_desc[] __initdata = { 49 { OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE }, 50 { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE }, 51 { OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP1610_SRAM_SIZE, MT_DEVICE } 52 }; 53 54 static struct map_desc omap5912_io_desc[] __initdata = { 55 { OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE }, 56 { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE }, 57 /* 58 * The OMAP5912 has 250kByte internal SRAM. Because the mapping is baseed on page 59 * size (4kByte), it seems that the last 2kByte (=0x800) of the 250kByte are not mapped. 60 * Add additional 2kByte (0x800) so that the last page is mapped and the last 2kByte 61 * can be used. 62 */ 63 { OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP5912_SRAM_SIZE + 0x800, MT_DEVICE } 64 }; 65 #endif 66 67 static int initialized = 0; 68 69 static void __init _omap_map_io(void) 70 { 71 initialized = 1; 72 73 /* We have to initialize the IO space mapping before we can run 74 * cpu_is_omapxxx() macros. */ 75 iotable_init(omap_io_desc, ARRAY_SIZE(omap_io_desc)); 76 omap_check_revision(); 77 78 #ifdef CONFIG_ARCH_OMAP730 79 if (cpu_is_omap730()) { 80 iotable_init(omap730_io_desc, ARRAY_SIZE(omap730_io_desc)); 81 } 82 #endif 83 #ifdef CONFIG_ARCH_OMAP1510 84 if (cpu_is_omap1510()) { 85 iotable_init(omap1510_io_desc, ARRAY_SIZE(omap1510_io_desc)); 86 } 87 #endif 88 #if defined(CONFIG_ARCH_OMAP16XX) 89 if (cpu_is_omap1610() || cpu_is_omap1710()) { 90 iotable_init(omap1610_io_desc, ARRAY_SIZE(omap1610_io_desc)); 91 } 92 if (cpu_is_omap5912()) { 93 iotable_init(omap5912_io_desc, ARRAY_SIZE(omap5912_io_desc)); 94 } 95 #endif 96 97 /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort 98 * on a Posted Write in the TIPB Bridge". 99 */ 100 omap_writew(0x0, MPU_PUBLIC_TIPB_CNTL); 101 omap_writew(0x0, MPU_PRIVATE_TIPB_CNTL); 102 103 /* Must init clocks early to assure that timer interrupt works 104 */ 105 clk_init(); 106 } 107 108 /* 109 * This should only get called from board specific init 110 */ 111 void omap_map_common_io(void) 112 { 113 if (!initialized) 114 _omap_map_io(); 115 } 116