aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-omap
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/plat-omap')
-rw-r--r--arch/arm/plat-omap/Kconfig116
-rw-r--r--arch/arm/plat-omap/clock.c100
-rw-r--r--arch/arm/plat-omap/common.c140
-rw-r--r--arch/arm/plat-omap/cpu-omap.c3
-rw-r--r--arch/arm/plat-omap/debug-devices.c12
-rw-r--r--arch/arm/plat-omap/debug-leds.c4
-rw-r--r--arch/arm/plat-omap/devices.c144
-rw-r--r--arch/arm/plat-omap/dma.c492
-rw-r--r--arch/arm/plat-omap/dmtimer.c153
-rw-r--r--arch/arm/plat-omap/fb.c53
-rw-r--r--arch/arm/plat-omap/gpio.c906
-rw-r--r--arch/arm/plat-omap/i2c.c56
-rw-r--r--arch/arm/plat-omap/include/mach/clock.h163
-rw-r--r--arch/arm/plat-omap/include/mach/clockdomain.h111
-rw-r--r--arch/arm/plat-omap/include/mach/debug-macro.S70
-rw-r--r--arch/arm/plat-omap/include/mach/entry-macro.S172
-rw-r--r--arch/arm/plat-omap/include/mach/irqs.h568
-rw-r--r--arch/arm/plat-omap/include/mach/mtd-xip.h61
-rw-r--r--arch/arm/plat-omap/include/mach/omapfb.h398
-rw-r--r--arch/arm/plat-omap/include/mach/serial.h68
-rw-r--r--arch/arm/plat-omap/include/mach/uncompress.h83
-rw-r--r--arch/arm/plat-omap/include/mach/vmalloc.h21
-rw-r--r--arch/arm/plat-omap/include/plat/blizzard.h (renamed from arch/arm/plat-omap/include/mach/blizzard.h)2
-rw-r--r--arch/arm/plat-omap/include/plat/board-ams-delta.h (renamed from arch/arm/plat-omap/include/mach/board-ams-delta.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/board-sx1.h (renamed from arch/arm/plat-omap/include/mach/board-sx1.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/board-voiceblue.h (renamed from arch/arm/plat-omap/include/mach/board-voiceblue.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/board.h (renamed from arch/arm/plat-omap/include/mach/board.h)30
-rw-r--r--arch/arm/plat-omap/include/plat/clkdev.h (renamed from arch/arm/plat-omap/include/mach/clkdev.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/clkdev_omap.h49
-rw-r--r--arch/arm/plat-omap/include/plat/clock.h210
-rw-r--r--arch/arm/plat-omap/include/plat/clockdomain.h141
-rw-r--r--arch/arm/plat-omap/include/plat/common.h (renamed from arch/arm/plat-omap/include/mach/common.h)60
-rw-r--r--arch/arm/plat-omap/include/plat/control.h (renamed from arch/arm/plat-omap/include/mach/control.h)154
-rw-r--r--arch/arm/plat-omap/include/plat/cpu.h (renamed from arch/arm/plat-omap/include/mach/cpu.h)195
-rw-r--r--arch/arm/plat-omap/include/plat/display.h590
-rw-r--r--arch/arm/plat-omap/include/plat/dma-44xx.h147
-rw-r--r--arch/arm/plat-omap/include/plat/dma.h (renamed from arch/arm/plat-omap/include/mach/dma.h)151
-rw-r--r--arch/arm/plat-omap/include/plat/dmtimer.h (renamed from arch/arm/plat-omap/include/mach/dmtimer.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/dsp_common.h (renamed from arch/arm/plat-omap/include/mach/dsp_common.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/flash.h16
-rw-r--r--arch/arm/plat-omap/include/plat/fpga.h (renamed from arch/arm/plat-omap/include/mach/fpga.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/gpio-switch.h (renamed from arch/arm/plat-omap/include/mach/gpio-switch.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/gpio.h (renamed from arch/arm/plat-omap/include/mach/gpio.h)3
-rw-r--r--arch/arm/plat-omap/include/plat/gpmc-smc91x.h (renamed from arch/arm/plat-omap/include/mach/gpmc-smc91x.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/gpmc.h (renamed from arch/arm/plat-omap/include/mach/gpmc.h)9
-rw-r--r--arch/arm/plat-omap/include/plat/hardware.h (renamed from arch/arm/plat-omap/include/mach/hardware.h)16
-rw-r--r--arch/arm/plat-omap/include/plat/hwa742.h (renamed from arch/arm/plat-omap/include/mach/hwa742.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/i2c.h38
-rw-r--r--arch/arm/plat-omap/include/plat/io.h (renamed from arch/arm/plat-omap/include/mach/io.h)194
-rw-r--r--arch/arm/plat-omap/include/plat/iommu.h (renamed from arch/arm/plat-omap/include/mach/iommu.h)2
-rw-r--r--arch/arm/plat-omap/include/plat/iommu2.h (renamed from arch/arm/plat-omap/include/mach/iommu2.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/iovmm.h (renamed from arch/arm/plat-omap/include/mach/iovmm.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/irda.h (renamed from arch/arm/plat-omap/include/mach/irda.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/irqs-44xx.h144
-rw-r--r--arch/arm/plat-omap/include/plat/irqs.h431
-rw-r--r--arch/arm/plat-omap/include/plat/keypad.h (renamed from arch/arm/plat-omap/include/mach/keypad.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/lcd_mipid.h (renamed from arch/arm/plat-omap/include/mach/lcd_mipid.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/led.h (renamed from arch/arm/plat-omap/include/mach/led.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/mailbox.h (renamed from arch/arm/plat-omap/include/mach/mailbox.h)23
-rw-r--r--arch/arm/plat-omap/include/plat/mcbsp.h (renamed from arch/arm/plat-omap/include/mach/mcbsp.h)82
-rw-r--r--arch/arm/plat-omap/include/plat/mcspi.h (renamed from arch/arm/plat-omap/include/mach/mcspi.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/memory.h (renamed from arch/arm/plat-omap/include/mach/memory.h)10
-rw-r--r--arch/arm/plat-omap/include/plat/menelaus.h (renamed from arch/arm/plat-omap/include/mach/menelaus.h)2
-rw-r--r--arch/arm/plat-omap/include/plat/mmc.h (renamed from arch/arm/plat-omap/include/mach/mmc.h)37
-rw-r--r--arch/arm/plat-omap/include/plat/multi.h94
-rw-r--r--arch/arm/plat-omap/include/plat/mux.h (renamed from arch/arm/plat-omap/include/mach/mux.h)338
-rw-r--r--arch/arm/plat-omap/include/plat/nand.h (renamed from arch/arm/plat-omap/include/mach/nand.h)17
-rw-r--r--arch/arm/plat-omap/include/plat/omap-alsa.h (renamed from arch/arm/plat-omap/include/mach/omap-alsa.h)4
-rw-r--r--arch/arm/plat-omap/include/plat/omap-pm.h (renamed from arch/arm/plat-omap/include/mach/omap-pm.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/omap1510.h (renamed from arch/arm/plat-omap/include/mach/omap1510.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/omap16xx.h (renamed from arch/arm/plat-omap/include/mach/omap16xx.h)76
-rw-r--r--arch/arm/plat-omap/include/plat/omap24xx.h (renamed from arch/arm/plat-omap/include/mach/omap24xx.h)6
-rw-r--r--arch/arm/plat-omap/include/plat/omap34xx.h (renamed from arch/arm/plat-omap/include/mach/omap34xx.h)17
-rw-r--r--arch/arm/plat-omap/include/plat/omap44xx.h (renamed from arch/arm/plat-omap/include/mach/omap44xx.h)22
-rw-r--r--arch/arm/plat-omap/include/plat/omap730.h (renamed from arch/arm/plat-omap/include/mach/omap730.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/omap7xx.h107
-rw-r--r--arch/arm/plat-omap/include/plat/omap850.h (renamed from arch/arm/plat-omap/include/mach/omap850.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/omap_device.h (renamed from arch/arm/plat-omap/include/mach/omap_device.h)21
-rw-r--r--arch/arm/plat-omap/include/plat/omap_hwmod.h (renamed from arch/arm/plat-omap/include/mach/omap_hwmod.h)163
-rw-r--r--arch/arm/plat-omap/include/plat/onenand.h (renamed from arch/arm/plat-omap/include/mach/onenand.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/param.h (renamed from arch/arm/plat-omap/include/mach/param.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/powerdomain.h (renamed from arch/arm/plat-omap/include/mach/powerdomain.h)108
-rw-r--r--arch/arm/plat-omap/include/plat/prcm.h (renamed from arch/arm/plat-omap/include/mach/prcm.h)19
-rw-r--r--arch/arm/plat-omap/include/plat/sdrc.h (renamed from arch/arm/plat-omap/include/mach/sdrc.h)23
-rw-r--r--arch/arm/plat-omap/include/plat/serial.h93
-rw-r--r--arch/arm/plat-omap/include/plat/smp.h (renamed from arch/arm/plat-omap/include/mach/smp.h)2
-rw-r--r--arch/arm/plat-omap/include/plat/sram.h (renamed from arch/arm/plat-omap/include/mach/sram.h)7
-rw-r--r--arch/arm/plat-omap/include/plat/system.h (renamed from arch/arm/plat-omap/include/mach/system.h)8
-rw-r--r--arch/arm/plat-omap/include/plat/tc.h (renamed from arch/arm/plat-omap/include/mach/tc.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/timer-gp.h (renamed from arch/arm/plat-omap/include/mach/timer-gp.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/timex.h (renamed from arch/arm/plat-omap/include/mach/timex.h)0
-rw-r--r--arch/arm/plat-omap/include/plat/uncompress.h173
-rw-r--r--arch/arm/plat-omap/include/plat/usb.h (renamed from arch/arm/plat-omap/include/mach/usb.h)30
-rw-r--r--arch/arm/plat-omap/include/plat/vram.h62
-rw-r--r--arch/arm/plat-omap/include/plat/vrfb.h50
-rw-r--r--arch/arm/plat-omap/io.c62
-rw-r--r--arch/arm/plat-omap/iommu-debug.c5
-rw-r--r--arch/arm/plat-omap/iommu.c11
-rw-r--r--arch/arm/plat-omap/iopgtable.h50
-rw-r--r--arch/arm/plat-omap/iovmm.c20
-rw-r--r--arch/arm/plat-omap/mailbox.c291
-rw-r--r--arch/arm/plat-omap/mcbsp.c791
-rw-r--r--arch/arm/plat-omap/mux.c10
-rw-r--r--arch/arm/plat-omap/omap-pm-noop.c4
-rw-r--r--arch/arm/plat-omap/omap_device.c163
-rw-r--r--arch/arm/plat-omap/sram.c60
-rw-r--r--arch/arm/plat-omap/usb.c46
107 files changed, 5335 insertions, 4248 deletions
diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig
index 64b3f52bd9b2..6da796ef82bd 100644
--- a/arch/arm/plat-omap/Kconfig
+++ b/arch/arm/plat-omap/Kconfig
@@ -7,24 +7,35 @@ config ARCH_OMAP_OTG
7 7
8choice 8choice
9 prompt "OMAP System Type" 9 prompt "OMAP System Type"
10 default ARCH_OMAP1 10 default ARCH_OMAP2PLUS
11 11
12config ARCH_OMAP1 12config ARCH_OMAP1
13 bool "TI OMAP1" 13 bool "TI OMAP1"
14 select COMMON_CLKDEV 14 select COMMON_CLKDEV
15 help
16 "Systems based on omap7xx, omap15xx or omap16xx"
17
18config ARCH_OMAP2PLUS
19 bool "TI OMAP2/3/4"
20 select COMMON_CLKDEV
21 help
22 "Systems based on omap24xx, omap34xx or omap44xx"
15 23
16config ARCH_OMAP2 24config ARCH_OMAP2
17 bool "TI OMAP2" 25 bool "TI OMAP2"
26 depends on ARCH_OMAP2PLUS
18 select CPU_V6 27 select CPU_V6
19 select COMMON_CLKDEV
20 28
21config ARCH_OMAP3 29config ARCH_OMAP3
22 bool "TI OMAP3" 30 bool "TI OMAP3"
31 depends on ARCH_OMAP2PLUS
23 select CPU_V7 32 select CPU_V7
24 select COMMON_CLKDEV 33 select USB_ARCH_HAS_EHCI
34 select ARM_L1_CACHE_SHIFT_6
25 35
26config ARCH_OMAP4 36config ARCH_OMAP4
27 bool "TI OMAP4" 37 bool "TI OMAP4"
38 depends on ARCH_OMAP2PLUS
28 select CPU_V7 39 select CPU_V7
29 select ARM_GIC 40 select ARM_GIC
30 41
@@ -42,28 +53,6 @@ config OMAP_DEBUG_LEDS
42 depends on OMAP_DEBUG_DEVICES 53 depends on OMAP_DEBUG_DEVICES
43 default y if LEDS || LEDS_OMAP_DEBUG 54 default y if LEDS || LEDS_OMAP_DEBUG
44 55
45config OMAP_DEBUG_POWERDOMAIN
46 bool "Emit debug messages from powerdomain layer"
47 depends on ARCH_OMAP2 || ARCH_OMAP3
48 help
49 Say Y here if you want to compile in powerdomain layer
50 debugging messages for OMAP2/3. These messages can
51 provide more detail as to why some powerdomain calls
52 may be failing, and will also emit a descriptive message
53 for every powerdomain register write. However, the
54 extra detail costs some memory.
55
56config OMAP_DEBUG_CLOCKDOMAIN
57 bool "Emit debug messages from clockdomain layer"
58 depends on ARCH_OMAP2 || ARCH_OMAP3
59 help
60 Say Y here if you want to compile in clockdomain layer
61 debugging messages for OMAP2/3. These messages can
62 provide more detail as to why some clockdomain calls
63 may be failing, and will also emit a descriptive message
64 for every clockdomain register write. However, the
65 extra detail costs some memory.
66
67config OMAP_RESET_CLOCKS 56config OMAP_RESET_CLOCKS
68 bool "Reset unused clocks during boot" 57 bool "Reset unused clocks during boot"
69 depends on ARCH_OMAP 58 depends on ARCH_OMAP
@@ -78,28 +67,28 @@ config OMAP_RESET_CLOCKS
78 67
79config OMAP_MUX 68config OMAP_MUX
80 bool "OMAP multiplexing support" 69 bool "OMAP multiplexing support"
81 depends on ARCH_OMAP 70 depends on ARCH_OMAP
82 default y 71 default y
83 help 72 help
84 Pin multiplexing support for OMAP boards. If your bootloader 73 Pin multiplexing support for OMAP boards. If your bootloader
85 sets the multiplexing correctly, say N. Otherwise, or if unsure, 74 sets the multiplexing correctly, say N. Otherwise, or if unsure,
86 say Y. 75 say Y.
87 76
88config OMAP_MUX_DEBUG 77config OMAP_MUX_DEBUG
89 bool "Multiplexing debug output" 78 bool "Multiplexing debug output"
90 depends on OMAP_MUX 79 depends on OMAP_MUX
91 help 80 help
92 Makes the multiplexing functions print out a lot of debug info. 81 Makes the multiplexing functions print out a lot of debug info.
93 This is useful if you want to find out the correct values of the 82 This is useful if you want to find out the correct values of the
94 multiplexing registers. 83 multiplexing registers.
95 84
96config OMAP_MUX_WARNINGS 85config OMAP_MUX_WARNINGS
97 bool "Warn about pins the bootloader didn't set up" 86 bool "Warn about pins the bootloader didn't set up"
98 depends on OMAP_MUX 87 depends on OMAP_MUX
99 default y 88 default y
100 help 89 help
101 Choose Y here to warn whenever driver initialization logic needs 90 Choose Y here to warn whenever driver initialization logic needs
102 to change the pin multiplexing setup. When there are no warnings 91 to change the pin multiplexing setup. When there are no warnings
103 printed, it's safe to deselect OMAP_MUX for your product. 92 printed, it's safe to deselect OMAP_MUX for your product.
104 93
105config OMAP_MCBSP 94config OMAP_MCBSP
@@ -125,7 +114,7 @@ config OMAP_IOMMU_DEBUG
125 tristate 114 tristate
126 115
127choice 116choice
128 prompt "System timer" 117 prompt "System timer"
129 default OMAP_MPU_TIMER 118 default OMAP_MPU_TIMER
130 119
131config OMAP_MPU_TIMER 120config OMAP_MPU_TIMER
@@ -137,7 +126,7 @@ config OMAP_MPU_TIMER
137 126
138config OMAP_32K_TIMER 127config OMAP_32K_TIMER
139 bool "Use 32KHz timer" 128 bool "Use 32KHz timer"
140 depends on ARCH_OMAP16XX || ARCH_OMAP24XX || ARCH_OMAP34XX || ARCH_OMAP4 129 depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS
141 help 130 help
142 Select this option if you want to enable the OMAP 32KHz timer. 131 Select this option if you want to enable the OMAP 32KHz timer.
143 This timer saves power compared to the OMAP_MPU_TIMER, and has 132 This timer saves power compared to the OMAP_MPU_TIMER, and has
@@ -147,37 +136,38 @@ config OMAP_32K_TIMER
147 136
148endchoice 137endchoice
149 138
139config OMAP3_L2_AUX_SECURE_SAVE_RESTORE
140 bool "OMAP3 HS/EMU save and restore for L2 AUX control register"
141 depends on ARCH_OMAP3 && PM
142 default n
143 help
144 Without this option, L2 Auxiliary control register contents are
145 lost during off-mode entry on HS/EMU devices. This feature
146 requires support from PPA / boot-loader in HS/EMU devices, which
147 currently does not exist by default.
148
149config OMAP3_L2_AUX_SECURE_SERVICE_SET_ID
150 int "Service ID for the support routine to set L2 AUX control"
151 depends on OMAP3_L2_AUX_SECURE_SAVE_RESTORE
152 default 43
153 help
154 PPA routine service ID for setting L2 auxiliary control register.
155
150config OMAP_32K_TIMER_HZ 156config OMAP_32K_TIMER_HZ
151 int "Kernel internal timer frequency for 32KHz timer" 157 int "Kernel internal timer frequency for 32KHz timer"
152 range 32 1024 158 range 32 1024
153 depends on OMAP_32K_TIMER 159 depends on OMAP_32K_TIMER
154 default "128" 160 default "128"
155 help 161 help
156 Kernel internal timer frequency should be a divisor of 32768, 162 Kernel internal timer frequency should be a divisor of 32768,
157 such as 64 or 128. 163 such as 64 or 128.
158 164
159config OMAP_DM_TIMER 165config OMAP_DM_TIMER
160 bool "Use dual-mode timer" 166 bool "Use dual-mode timer"
161 depends on ARCH_OMAP16XX || ARCH_OMAP24XX || ARCH_OMAP34XX || ARCH_OMAP4 167 depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS
162 help 168 help
163 Select this option if you want to use OMAP Dual-Mode timers. 169 Select this option if you want to use OMAP Dual-Mode timers.
164 170
165choice
166 prompt "Low-level debug console UART"
167 depends on ARCH_OMAP
168 default OMAP_LL_DEBUG_UART1
169
170config OMAP_LL_DEBUG_UART1
171 bool "UART1"
172
173config OMAP_LL_DEBUG_UART2
174 bool "UART2"
175
176config OMAP_LL_DEBUG_UART3
177 bool "UART3"
178
179endchoice
180
181config OMAP_SERIAL_WAKE 171config OMAP_SERIAL_WAKE
182 bool "Enable wake-up events for serial ports" 172 bool "Enable wake-up events for serial ports"
183 depends on ARCH_OMAP1 && OMAP_MUX 173 depends on ARCH_OMAP1 && OMAP_MUX
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c
index bf880e966d3b..5261a0923691 100644
--- a/arch/arm/plat-omap/clock.c
+++ b/arch/arm/plat-omap/clock.c
@@ -24,7 +24,7 @@
24#include <linux/debugfs.h> 24#include <linux/debugfs.h>
25#include <linux/io.h> 25#include <linux/io.h>
26 26
27#include <mach/clock.h> 27#include <plat/clock.h>
28 28
29static LIST_HEAD(clocks); 29static LIST_HEAD(clocks);
30static DEFINE_MUTEX(clocks_mutex); 30static DEFINE_MUTEX(clocks_mutex);
@@ -36,40 +36,10 @@ static struct clk_functions *arch_clock;
36 * Standard clock functions defined in include/linux/clk.h 36 * Standard clock functions defined in include/linux/clk.h
37 *-------------------------------------------------------------------------*/ 37 *-------------------------------------------------------------------------*/
38 38
39/* This functions is moved to arch/arm/common/clkdev.c. For OMAP4 since
40 * clock framework is not up , it is defined here to avoid rework in
41 * every driver. Also dummy prcm reset function is added */
42
43/* Dummy hooks only for OMAP4.For rest OMAPs, common clkdev is used */
44#if defined(CONFIG_ARCH_OMAP4)
45struct clk *clk_get(struct device *dev, const char *id)
46{
47 return NULL;
48}
49EXPORT_SYMBOL(clk_get);
50
51void clk_put(struct clk *clk)
52{
53}
54EXPORT_SYMBOL(clk_put);
55
56void omap2_clk_prepare_for_reboot(void)
57{
58}
59EXPORT_SYMBOL(omap2_clk_prepare_for_reboot);
60
61void omap_prcm_arch_reset(char mode)
62{
63}
64EXPORT_SYMBOL(omap_prcm_arch_reset);
65#endif
66int clk_enable(struct clk *clk) 39int clk_enable(struct clk *clk)
67{ 40{
68 unsigned long flags; 41 unsigned long flags;
69 int ret = 0; 42 int ret = 0;
70 if (cpu_is_omap44xx())
71 /* OMAP4 clk framework not supported yet */
72 return 0;
73 43
74 if (clk == NULL || IS_ERR(clk)) 44 if (clk == NULL || IS_ERR(clk))
75 return -EINVAL; 45 return -EINVAL;
@@ -203,7 +173,7 @@ EXPORT_SYMBOL(clk_get_parent);
203 * OMAP specific clock functions shared between omap1 and omap2 173 * OMAP specific clock functions shared between omap1 and omap2
204 *-------------------------------------------------------------------------*/ 174 *-------------------------------------------------------------------------*/
205 175
206unsigned int __initdata mpurate; 176int __initdata mpurate;
207 177
208/* 178/*
209 * By default we use the rate set by the bootloader. 179 * By default we use the rate set by the bootloader.
@@ -229,6 +199,17 @@ unsigned long followparent_recalc(struct clk *clk)
229 return clk->parent->rate; 199 return clk->parent->rate;
230} 200}
231 201
202/*
203 * Used for clocks that have the same value as the parent clock,
204 * divided by some factor
205 */
206unsigned long omap_fixed_divisor_recalc(struct clk *clk)
207{
208 WARN_ON(!clk->fixed_div);
209
210 return clk->parent->rate / clk->fixed_div;
211}
212
232void clk_reparent(struct clk *child, struct clk *parent) 213void clk_reparent(struct clk *child, struct clk *parent)
233{ 214{
234 list_del_init(&child->sibling); 215 list_del_init(&child->sibling);
@@ -331,7 +312,33 @@ void clk_enable_init_clocks(void)
331 clk_enable(clkp); 312 clk_enable(clkp);
332 } 313 }
333} 314}
334EXPORT_SYMBOL(clk_enable_init_clocks); 315
316/**
317 * omap_clk_get_by_name - locate OMAP struct clk by its name
318 * @name: name of the struct clk to locate
319 *
320 * Locate an OMAP struct clk by its name. Assumes that struct clk
321 * names are unique. Returns NULL if not found or a pointer to the
322 * struct clk if found.
323 */
324struct clk *omap_clk_get_by_name(const char *name)
325{
326 struct clk *c;
327 struct clk *ret = NULL;
328
329 mutex_lock(&clocks_mutex);
330
331 list_for_each_entry(c, &clocks, node) {
332 if (!strcmp(c->name, name)) {
333 ret = c;
334 break;
335 }
336 }
337
338 mutex_unlock(&clocks_mutex);
339
340 return ret;
341}
335 342
336/* 343/*
337 * Low level helpers 344 * Low level helpers
@@ -350,6 +357,16 @@ const struct clkops clkops_null = {
350 .disable = clkll_disable_null, 357 .disable = clkll_disable_null,
351}; 358};
352 359
360/*
361 * Dummy clock
362 *
363 * Used for clock aliases that are needed on some OMAPs, but not others
364 */
365struct clk dummy_ck = {
366 .name = "dummy",
367 .ops = &clkops_null,
368};
369
353#ifdef CONFIG_CPU_FREQ 370#ifdef CONFIG_CPU_FREQ
354void clk_init_cpufreq_table(struct cpufreq_frequency_table **table) 371void clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
355{ 372{
@@ -360,7 +377,16 @@ void clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
360 arch_clock->clk_init_cpufreq_table(table); 377 arch_clock->clk_init_cpufreq_table(table);
361 spin_unlock_irqrestore(&clockfw_lock, flags); 378 spin_unlock_irqrestore(&clockfw_lock, flags);
362} 379}
363EXPORT_SYMBOL(clk_init_cpufreq_table); 380
381void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table)
382{
383 unsigned long flags;
384
385 spin_lock_irqsave(&clockfw_lock, flags);
386 if (arch_clock->clk_exit_cpufreq_table)
387 arch_clock->clk_exit_cpufreq_table(table);
388 spin_unlock_irqrestore(&clockfw_lock, flags);
389}
364#endif 390#endif
365 391
366/*-------------------------------------------------------------------------*/ 392/*-------------------------------------------------------------------------*/
@@ -413,14 +439,12 @@ static struct dentry *clk_debugfs_root;
413static int clk_debugfs_register_one(struct clk *c) 439static int clk_debugfs_register_one(struct clk *c)
414{ 440{
415 int err; 441 int err;
416 struct dentry *d, *child; 442 struct dentry *d, *child, *child_tmp;
417 struct clk *pa = c->parent; 443 struct clk *pa = c->parent;
418 char s[255]; 444 char s[255];
419 char *p = s; 445 char *p = s;
420 446
421 p += sprintf(p, "%s", c->name); 447 p += sprintf(p, "%s", c->name);
422 if (c->id != 0)
423 sprintf(p, ":%d", c->id);
424 d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root); 448 d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root);
425 if (!d) 449 if (!d)
426 return -ENOMEM; 450 return -ENOMEM;
@@ -445,7 +469,7 @@ static int clk_debugfs_register_one(struct clk *c)
445 469
446err_out: 470err_out:
447 d = c->dent; 471 d = c->dent;
448 list_for_each_entry(child, &d->d_subdirs, d_u.d_child) 472 list_for_each_entry_safe(child, child_tmp, &d->d_subdirs, d_u.d_child)
449 debugfs_remove(child); 473 debugfs_remove(child);
450 debugfs_remove(c->dent); 474 debugfs_remove(c->dent);
451 return err; 475 return err;
diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c
index 3a4768d55895..f12f0e39ddf2 100644
--- a/arch/arm/plat-omap/common.c
+++ b/arch/arm/plat-omap/common.c
@@ -29,13 +29,14 @@
29#include <asm/mach/map.h> 29#include <asm/mach/map.h>
30#include <asm/setup.h> 30#include <asm/setup.h>
31 31
32#include <mach/common.h> 32#include <plat/common.h>
33#include <mach/board.h> 33#include <plat/board.h>
34#include <mach/control.h> 34#include <plat/control.h>
35#include <mach/mux.h> 35#include <plat/mux.h>
36#include <mach/fpga.h> 36#include <plat/fpga.h>
37#include <plat/serial.h>
37 38
38#include <mach/clock.h> 39#include <plat/clock.h>
39 40
40#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) 41#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
41# include "../mach-omap2/sdrc.h" 42# include "../mach-omap2/sdrc.h"
@@ -43,12 +44,12 @@
43 44
44#define NO_LENGTH_CHECK 0xffffffff 45#define NO_LENGTH_CHECK 0xffffffff
45 46
46unsigned char omap_bootloader_tag[512];
47int omap_bootloader_tag_len;
48
49struct omap_board_config_kernel *omap_board_config; 47struct omap_board_config_kernel *omap_board_config;
50int omap_board_config_size; 48int omap_board_config_size;
51 49
50/* used by omap-smp.c and board-4430sdp.c */
51void __iomem *gic_cpu_base_addr;
52
52static const void *get_config(u16 tag, size_t len, int skip, size_t *len_out) 53static const void *get_config(u16 tag, size_t len, int skip, size_t *len_out)
53{ 54{
54 struct omap_board_config_kernel *kinfo = NULL; 55 struct omap_board_config_kernel *kinfo = NULL;
@@ -96,10 +97,17 @@ EXPORT_SYMBOL(omap_get_var_config);
96 97
97#include <linux/clocksource.h> 98#include <linux/clocksource.h>
98 99
100/*
101 * offset_32k holds the init time counter value. It is then subtracted
102 * from every counter read to achieve a counter that counts time from the
103 * kernel boot (needed for sched_clock()).
104 */
105static u32 offset_32k __read_mostly;
106
99#ifdef CONFIG_ARCH_OMAP16XX 107#ifdef CONFIG_ARCH_OMAP16XX
100static cycle_t omap16xx_32k_read(struct clocksource *cs) 108static cycle_t omap16xx_32k_read(struct clocksource *cs)
101{ 109{
102 return omap_readl(OMAP16XX_TIMER_32K_SYNCHRONIZED); 110 return omap_readl(OMAP16XX_TIMER_32K_SYNCHRONIZED) - offset_32k;
103} 111}
104#else 112#else
105#define omap16xx_32k_read NULL 113#define omap16xx_32k_read NULL
@@ -108,7 +116,7 @@ static cycle_t omap16xx_32k_read(struct clocksource *cs)
108#ifdef CONFIG_ARCH_OMAP2420 116#ifdef CONFIG_ARCH_OMAP2420
109static cycle_t omap2420_32k_read(struct clocksource *cs) 117static cycle_t omap2420_32k_read(struct clocksource *cs)
110{ 118{
111 return omap_readl(OMAP2420_32KSYNCT_BASE + 0x10); 119 return omap_readl(OMAP2420_32KSYNCT_BASE + 0x10) - offset_32k;
112} 120}
113#else 121#else
114#define omap2420_32k_read NULL 122#define omap2420_32k_read NULL
@@ -117,16 +125,16 @@ static cycle_t omap2420_32k_read(struct clocksource *cs)
117#ifdef CONFIG_ARCH_OMAP2430 125#ifdef CONFIG_ARCH_OMAP2430
118static cycle_t omap2430_32k_read(struct clocksource *cs) 126static cycle_t omap2430_32k_read(struct clocksource *cs)
119{ 127{
120 return omap_readl(OMAP2430_32KSYNCT_BASE + 0x10); 128 return omap_readl(OMAP2430_32KSYNCT_BASE + 0x10) - offset_32k;
121} 129}
122#else 130#else
123#define omap2430_32k_read NULL 131#define omap2430_32k_read NULL
124#endif 132#endif
125 133
126#ifdef CONFIG_ARCH_OMAP34XX 134#ifdef CONFIG_ARCH_OMAP3
127static cycle_t omap34xx_32k_read(struct clocksource *cs) 135static cycle_t omap34xx_32k_read(struct clocksource *cs)
128{ 136{
129 return omap_readl(OMAP3430_32KSYNCT_BASE + 0x10); 137 return omap_readl(OMAP3430_32KSYNCT_BASE + 0x10) - offset_32k;
130} 138}
131#else 139#else
132#define omap34xx_32k_read NULL 140#define omap34xx_32k_read NULL
@@ -135,7 +143,7 @@ static cycle_t omap34xx_32k_read(struct clocksource *cs)
135#ifdef CONFIG_ARCH_OMAP4 143#ifdef CONFIG_ARCH_OMAP4
136static cycle_t omap44xx_32k_read(struct clocksource *cs) 144static cycle_t omap44xx_32k_read(struct clocksource *cs)
137{ 145{
138 return omap_readl(OMAP4430_32KSYNCT_BASE + 0x10); 146 return omap_readl(OMAP4430_32KSYNCT_BASE + 0x10) - offset_32k;
139} 147}
140#else 148#else
141#define omap44xx_32k_read NULL 149#define omap44xx_32k_read NULL
@@ -169,6 +177,32 @@ unsigned long long sched_clock(void)
169 clocksource_32k.mult, clocksource_32k.shift); 177 clocksource_32k.mult, clocksource_32k.shift);
170} 178}
171 179
180/**
181 * read_persistent_clock - Return time from a persistent clock.
182 *
183 * Reads the time from a source which isn't disabled during PM, the
184 * 32k sync timer. Convert the cycles elapsed since last read into
185 * nsecs and adds to a monotonically increasing timespec.
186 */
187static struct timespec persistent_ts;
188static cycles_t cycles, last_cycles;
189void read_persistent_clock(struct timespec *ts)
190{
191 unsigned long long nsecs;
192 cycles_t delta;
193 struct timespec *tsp = &persistent_ts;
194
195 last_cycles = cycles;
196 cycles = clocksource_32k.read(&clocksource_32k);
197 delta = cycles - last_cycles;
198
199 nsecs = clocksource_cyc2ns(delta,
200 clocksource_32k.mult, clocksource_32k.shift);
201
202 timespec_add_ns(tsp, nsecs);
203 *ts = *tsp;
204}
205
172static int __init omap_init_clocksource_32k(void) 206static int __init omap_init_clocksource_32k(void)
173{ 207{
174 static char err[] __initdata = KERN_ERR 208 static char err[] __initdata = KERN_ERR
@@ -197,6 +231,8 @@ static int __init omap_init_clocksource_32k(void)
197 clocksource_32k.mult = clocksource_hz2mult(32768, 231 clocksource_32k.mult = clocksource_hz2mult(32768,
198 clocksource_32k.shift); 232 clocksource_32k.shift);
199 233
234 offset_32k = clocksource_32k.read(&clocksource_32k);
235
200 if (clocksource_register(&clocksource_32k)) 236 if (clocksource_register(&clocksource_32k))
201 printk(err, clocksource_32k.name); 237 printk(err, clocksource_32k.name);
202 } 238 }
@@ -216,6 +252,7 @@ static void __init __omap2_set_globals(struct omap_globals *omap2_globals)
216 omap2_set_globals_sdrc(omap2_globals); 252 omap2_set_globals_sdrc(omap2_globals);
217 omap2_set_globals_control(omap2_globals); 253 omap2_set_globals_control(omap2_globals);
218 omap2_set_globals_prcm(omap2_globals); 254 omap2_set_globals_prcm(omap2_globals);
255 omap2_set_globals_uart(omap2_globals);
219} 256}
220 257
221#endif 258#endif
@@ -224,12 +261,15 @@ static void __init __omap2_set_globals(struct omap_globals *omap2_globals)
224 261
225static struct omap_globals omap242x_globals = { 262static struct omap_globals omap242x_globals = {
226 .class = OMAP242X_CLASS, 263 .class = OMAP242X_CLASS,
227 .tap = OMAP2_IO_ADDRESS(0x48014000), 264 .tap = OMAP2_L4_IO_ADDRESS(0x48014000),
228 .sdrc = OMAP2_IO_ADDRESS(OMAP2420_SDRC_BASE), 265 .sdrc = OMAP2420_SDRC_BASE,
229 .sms = OMAP2_IO_ADDRESS(OMAP2420_SMS_BASE), 266 .sms = OMAP2420_SMS_BASE,
230 .ctrl = OMAP2_IO_ADDRESS(OMAP2420_CTRL_BASE), 267 .ctrl = OMAP2420_CTRL_BASE,
231 .prm = OMAP2_IO_ADDRESS(OMAP2420_PRM_BASE), 268 .prm = OMAP2420_PRM_BASE,
232 .cm = OMAP2_IO_ADDRESS(OMAP2420_CM_BASE), 269 .cm = OMAP2420_CM_BASE,
270 .uart1_phys = OMAP2_UART1_BASE,
271 .uart2_phys = OMAP2_UART2_BASE,
272 .uart3_phys = OMAP2_UART3_BASE,
233}; 273};
234 274
235void __init omap2_set_globals_242x(void) 275void __init omap2_set_globals_242x(void)
@@ -242,12 +282,15 @@ void __init omap2_set_globals_242x(void)
242 282
243static struct omap_globals omap243x_globals = { 283static struct omap_globals omap243x_globals = {
244 .class = OMAP243X_CLASS, 284 .class = OMAP243X_CLASS,
245 .tap = OMAP2_IO_ADDRESS(0x4900a000), 285 .tap = OMAP2_L4_IO_ADDRESS(0x4900a000),
246 .sdrc = OMAP2_IO_ADDRESS(OMAP243X_SDRC_BASE), 286 .sdrc = OMAP243X_SDRC_BASE,
247 .sms = OMAP2_IO_ADDRESS(OMAP243X_SMS_BASE), 287 .sms = OMAP243X_SMS_BASE,
248 .ctrl = OMAP2_IO_ADDRESS(OMAP243X_CTRL_BASE), 288 .ctrl = OMAP243X_CTRL_BASE,
249 .prm = OMAP2_IO_ADDRESS(OMAP2430_PRM_BASE), 289 .prm = OMAP2430_PRM_BASE,
250 .cm = OMAP2_IO_ADDRESS(OMAP2430_CM_BASE), 290 .cm = OMAP2430_CM_BASE,
291 .uart1_phys = OMAP2_UART1_BASE,
292 .uart2_phys = OMAP2_UART2_BASE,
293 .uart3_phys = OMAP2_UART3_BASE,
251}; 294};
252 295
253void __init omap2_set_globals_243x(void) 296void __init omap2_set_globals_243x(void)
@@ -256,37 +299,54 @@ void __init omap2_set_globals_243x(void)
256} 299}
257#endif 300#endif
258 301
259#if defined(CONFIG_ARCH_OMAP3430) 302#if defined(CONFIG_ARCH_OMAP3)
260 303
261static struct omap_globals omap343x_globals = { 304static struct omap_globals omap3_globals = {
262 .class = OMAP343X_CLASS, 305 .class = OMAP343X_CLASS,
263 .tap = OMAP2_IO_ADDRESS(0x4830A000), 306 .tap = OMAP2_L4_IO_ADDRESS(0x4830A000),
264 .sdrc = OMAP2_IO_ADDRESS(OMAP343X_SDRC_BASE), 307 .sdrc = OMAP343X_SDRC_BASE,
265 .sms = OMAP2_IO_ADDRESS(OMAP343X_SMS_BASE), 308 .sms = OMAP343X_SMS_BASE,
266 .ctrl = OMAP2_IO_ADDRESS(OMAP343X_CTRL_BASE), 309 .ctrl = OMAP343X_CTRL_BASE,
267 .prm = OMAP2_IO_ADDRESS(OMAP3430_PRM_BASE), 310 .prm = OMAP3430_PRM_BASE,
268 .cm = OMAP2_IO_ADDRESS(OMAP3430_CM_BASE), 311 .cm = OMAP3430_CM_BASE,
312 .uart1_phys = OMAP3_UART1_BASE,
313 .uart2_phys = OMAP3_UART2_BASE,
314 .uart3_phys = OMAP3_UART3_BASE,
269}; 315};
270 316
271void __init omap2_set_globals_343x(void) 317void __init omap2_set_globals_343x(void)
272{ 318{
273 __omap2_set_globals(&omap343x_globals); 319 __omap2_set_globals(&omap3_globals);
320}
321
322void __init omap2_set_globals_36xx(void)
323{
324 omap3_globals.uart4_phys = OMAP3_UART4_BASE;
325
326 __omap2_set_globals(&omap3_globals);
274} 327}
275#endif 328#endif
276 329
277#if defined(CONFIG_ARCH_OMAP4) 330#if defined(CONFIG_ARCH_OMAP4)
278static struct omap_globals omap4_globals = { 331static struct omap_globals omap4_globals = {
279 .class = OMAP443X_CLASS, 332 .class = OMAP443X_CLASS,
280 .tap = OMAP2_IO_ADDRESS(0x4830a000), 333 .tap = OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE),
281 .ctrl = OMAP2_IO_ADDRESS(OMAP443X_CTRL_BASE), 334 .ctrl = OMAP443X_CTRL_BASE,
282 .prm = OMAP2_IO_ADDRESS(OMAP4430_PRM_BASE), 335 .prm = OMAP4430_PRM_BASE,
283 .cm = OMAP2_IO_ADDRESS(OMAP4430_CM_BASE), 336 .cm = OMAP4430_CM_BASE,
337 .cm2 = OMAP4430_CM2_BASE,
338 .uart1_phys = OMAP4_UART1_BASE,
339 .uart2_phys = OMAP4_UART2_BASE,
340 .uart3_phys = OMAP4_UART3_BASE,
341 .uart4_phys = OMAP4_UART4_BASE,
284}; 342};
285 343
286void __init omap2_set_globals_443x(void) 344void __init omap2_set_globals_443x(void)
287{ 345{
288 omap2_set_globals_tap(&omap4_globals); 346 omap2_set_globals_tap(&omap4_globals);
289 omap2_set_globals_control(&omap4_globals); 347 omap2_set_globals_control(&omap4_globals);
348 omap2_set_globals_prcm(&omap4_globals);
349 omap2_set_globals_uart(&omap4_globals);
290} 350}
291#endif 351#endif
292 352
diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c
index 341235c278ac..6d3d33360056 100644
--- a/arch/arm/plat-omap/cpu-omap.c
+++ b/arch/arm/plat-omap/cpu-omap.c
@@ -23,7 +23,7 @@
23#include <linux/io.h> 23#include <linux/io.h>
24 24
25#include <mach/hardware.h> 25#include <mach/hardware.h>
26#include <mach/clock.h> 26#include <plat/clock.h>
27#include <asm/system.h> 27#include <asm/system.h>
28 28
29#define VERY_HI_RATE 900000000 29#define VERY_HI_RATE 900000000
@@ -134,6 +134,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy)
134 134
135static int omap_cpu_exit(struct cpufreq_policy *policy) 135static int omap_cpu_exit(struct cpufreq_policy *policy)
136{ 136{
137 clk_exit_cpufreq_table(&freq_table);
137 clk_put(mpu_clk); 138 clk_put(mpu_clk);
138 return 0; 139 return 0;
139} 140}
diff --git a/arch/arm/plat-omap/debug-devices.c b/arch/arm/plat-omap/debug-devices.c
index f6684832ca8f..923c9621096b 100644
--- a/arch/arm/plat-omap/debug-devices.c
+++ b/arch/arm/plat-omap/debug-devices.c
@@ -13,10 +13,11 @@
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/platform_device.h> 14#include <linux/platform_device.h>
15#include <linux/io.h> 15#include <linux/io.h>
16#include <linux/smc91x.h>
16 17
17#include <mach/hardware.h> 18#include <mach/hardware.h>
18 19
19#include <mach/board.h> 20#include <plat/board.h>
20#include <mach/gpio.h> 21#include <mach/gpio.h>
21 22
22 23
@@ -24,6 +25,12 @@
24 * platforms include H2, H3, H4, and Perseus2. 25 * platforms include H2, H3, H4, and Perseus2.
25 */ 26 */
26 27
28static struct smc91x_platdata smc91x_info = {
29 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
30 .leda = RPC_LED_100_10,
31 .ledb = RPC_LED_TX_RX,
32};
33
27static struct resource smc91x_resources[] = { 34static struct resource smc91x_resources[] = {
28 [0] = { 35 [0] = {
29 .flags = IORESOURCE_MEM, 36 .flags = IORESOURCE_MEM,
@@ -36,6 +43,9 @@ static struct resource smc91x_resources[] = {
36static struct platform_device smc91x_device = { 43static struct platform_device smc91x_device = {
37 .name = "smc91x", 44 .name = "smc91x",
38 .id = -1, 45 .id = -1,
46 .dev = {
47 .platform_data = &smc91x_info,
48 },
39 .num_resources = ARRAY_SIZE(smc91x_resources), 49 .num_resources = ARRAY_SIZE(smc91x_resources),
40 .resource = smc91x_resources, 50 .resource = smc91x_resources,
41}; 51};
diff --git a/arch/arm/plat-omap/debug-leds.c b/arch/arm/plat-omap/debug-leds.c
index 9395898dd49a..53fcef7c5201 100644
--- a/arch/arm/plat-omap/debug-leds.c
+++ b/arch/arm/plat-omap/debug-leds.c
@@ -18,7 +18,7 @@
18#include <asm/system.h> 18#include <asm/system.h>
19#include <asm/mach-types.h> 19#include <asm/mach-types.h>
20 20
21#include <mach/fpga.h> 21#include <plat/fpga.h>
22#include <mach/gpio.h> 22#include <mach/gpio.h>
23 23
24 24
@@ -293,7 +293,7 @@ static int fpga_resume_noirq(struct device *dev)
293 return 0; 293 return 0;
294} 294}
295 295
296static struct dev_pm_ops fpga_dev_pm_ops = { 296static const struct dev_pm_ops fpga_dev_pm_ops = {
297 .suspend_noirq = fpga_suspend_noirq, 297 .suspend_noirq = fpga_suspend_noirq,
298 .resume_noirq = fpga_resume_noirq, 298 .resume_noirq = fpga_resume_noirq,
299}; 299};
diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c
index a64b692a1bfe..95677d17cd1c 100644
--- a/arch/arm/plat-omap/devices.c
+++ b/arch/arm/plat-omap/devices.c
@@ -14,20 +14,22 @@
14#include <linux/init.h> 14#include <linux/init.h>
15#include <linux/platform_device.h> 15#include <linux/platform_device.h>
16#include <linux/io.h> 16#include <linux/io.h>
17#include <linux/slab.h>
17 18
18#include <mach/hardware.h> 19#include <mach/hardware.h>
19#include <asm/mach-types.h> 20#include <asm/mach-types.h>
20#include <asm/mach/map.h> 21#include <asm/mach/map.h>
21 22
22#include <mach/tc.h> 23#include <plat/tc.h>
23#include <mach/control.h> 24#include <plat/control.h>
24#include <mach/board.h> 25#include <plat/board.h>
25#include <mach/mmc.h> 26#include <plat/mmc.h>
26#include <mach/mux.h> 27#include <plat/mux.h>
27#include <mach/gpio.h> 28#include <mach/gpio.h>
28#include <mach/menelaus.h> 29#include <plat/menelaus.h>
29#include <mach/mcbsp.h> 30#include <plat/mcbsp.h>
30#include <mach/dsp_common.h> 31#include <plat/dsp_common.h>
32#include <plat/omap44xx.h>
31 33
32#if defined(CONFIG_OMAP_DSP) || defined(CONFIG_OMAP_DSP_MODULE) 34#if defined(CONFIG_OMAP_DSP) || defined(CONFIG_OMAP_DSP_MODULE)
33 35
@@ -113,17 +115,17 @@ static void omap_init_kp(void)
113 omap_cfg_reg(E19_1610_KBR4); 115 omap_cfg_reg(E19_1610_KBR4);
114 omap_cfg_reg(N19_1610_KBR5); 116 omap_cfg_reg(N19_1610_KBR5);
115 } else if (machine_is_omap_perseus2() || machine_is_omap_fsample()) { 117 } else if (machine_is_omap_perseus2() || machine_is_omap_fsample()) {
116 omap_cfg_reg(E2_730_KBR0); 118 omap_cfg_reg(E2_7XX_KBR0);
117 omap_cfg_reg(J7_730_KBR1); 119 omap_cfg_reg(J7_7XX_KBR1);
118 omap_cfg_reg(E1_730_KBR2); 120 omap_cfg_reg(E1_7XX_KBR2);
119 omap_cfg_reg(F3_730_KBR3); 121 omap_cfg_reg(F3_7XX_KBR3);
120 omap_cfg_reg(D2_730_KBR4); 122 omap_cfg_reg(D2_7XX_KBR4);
121 123
122 omap_cfg_reg(C2_730_KBC0); 124 omap_cfg_reg(C2_7XX_KBC0);
123 omap_cfg_reg(D3_730_KBC1); 125 omap_cfg_reg(D3_7XX_KBC1);
124 omap_cfg_reg(E4_730_KBC2); 126 omap_cfg_reg(E4_7XX_KBC2);
125 omap_cfg_reg(F4_730_KBC3); 127 omap_cfg_reg(F4_7XX_KBC3);
126 omap_cfg_reg(E3_730_KBC4); 128 omap_cfg_reg(E3_7XX_KBC4);
127 } else if (machine_is_omap_h4()) { 129 } else if (machine_is_omap_h4()) {
128 omap_cfg_reg(T19_24XX_KBR0); 130 omap_cfg_reg(T19_24XX_KBR0);
129 omap_cfg_reg(R19_24XX_KBR1); 131 omap_cfg_reg(R19_24XX_KBR1);
@@ -192,6 +194,41 @@ void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config,
192 194
193/*-------------------------------------------------------------------------*/ 195/*-------------------------------------------------------------------------*/
194 196
197#if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
198 defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE)
199
200static struct resource mcpdm_resources[] = {
201 {
202 .name = "mcpdm_mem",
203 .start = OMAP44XX_MCPDM_BASE,
204 .end = OMAP44XX_MCPDM_BASE + SZ_4K,
205 .flags = IORESOURCE_MEM,
206 },
207 {
208 .name = "mcpdm_irq",
209 .start = OMAP44XX_IRQ_MCPDM,
210 .end = OMAP44XX_IRQ_MCPDM,
211 .flags = IORESOURCE_IRQ,
212 },
213};
214
215static struct platform_device omap_mcpdm_device = {
216 .name = "omap-mcpdm",
217 .id = -1,
218 .num_resources = ARRAY_SIZE(mcpdm_resources),
219 .resource = mcpdm_resources,
220};
221
222static void omap_init_mcpdm(void)
223{
224 (void) platform_device_register(&omap_mcpdm_device);
225}
226#else
227static inline void omap_init_mcpdm(void) {}
228#endif
229
230/*-------------------------------------------------------------------------*/
231
195#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ 232#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
196 defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) 233 defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
197 234
@@ -242,6 +279,39 @@ fail:
242 279
243/*-------------------------------------------------------------------------*/ 280/*-------------------------------------------------------------------------*/
244 281
282#if defined(CONFIG_HW_RANDOM_OMAP) || defined(CONFIG_HW_RANDOM_OMAP_MODULE)
283
284#ifdef CONFIG_ARCH_OMAP2
285#define OMAP_RNG_BASE 0x480A0000
286#else
287#define OMAP_RNG_BASE 0xfffe5000
288#endif
289
290static struct resource rng_resources[] = {
291 {
292 .start = OMAP_RNG_BASE,
293 .end = OMAP_RNG_BASE + 0x4f,
294 .flags = IORESOURCE_MEM,
295 },
296};
297
298static struct platform_device omap_rng_device = {
299 .name = "omap_rng",
300 .id = -1,
301 .num_resources = ARRAY_SIZE(rng_resources),
302 .resource = rng_resources,
303};
304
305static void omap_init_rng(void)
306{
307 (void) platform_device_register(&omap_rng_device);
308}
309#else
310static inline void omap_init_rng(void) {}
311#endif
312
313/*-------------------------------------------------------------------------*/
314
245/* Numbering for the SPI-capable controllers when used for SPI: 315/* Numbering for the SPI-capable controllers when used for SPI:
246 * spi = 1 316 * spi = 1
247 * uwire = 2 317 * uwire = 2
@@ -324,39 +394,6 @@ static void omap_init_wdt(void)
324static inline void omap_init_wdt(void) {} 394static inline void omap_init_wdt(void) {}
325#endif 395#endif
326 396
327/*-------------------------------------------------------------------------*/
328
329#if defined(CONFIG_HW_RANDOM_OMAP) || defined(CONFIG_HW_RANDOM_OMAP_MODULE)
330
331#ifdef CONFIG_ARCH_OMAP24XX
332#define OMAP_RNG_BASE 0x480A0000
333#else
334#define OMAP_RNG_BASE 0xfffe5000
335#endif
336
337static struct resource rng_resources[] = {
338 {
339 .start = OMAP_RNG_BASE,
340 .end = OMAP_RNG_BASE + 0x4f,
341 .flags = IORESOURCE_MEM,
342 },
343};
344
345static struct platform_device omap_rng_device = {
346 .name = "omap_rng",
347 .id = -1,
348 .num_resources = ARRAY_SIZE(rng_resources),
349 .resource = rng_resources,
350};
351
352static void omap_init_rng(void)
353{
354 (void) platform_device_register(&omap_rng_device);
355}
356#else
357static inline void omap_init_rng(void) {}
358#endif
359
360/* 397/*
361 * This gets called after board-specific INIT_MACHINE, and initializes most 398 * This gets called after board-specific INIT_MACHINE, and initializes most
362 * on-chip peripherals accessible on this board (except for few like USB): 399 * on-chip peripherals accessible on this board (except for few like USB):
@@ -384,9 +421,10 @@ static int __init omap_init_devices(void)
384 */ 421 */
385 omap_init_dsp(); 422 omap_init_dsp();
386 omap_init_kp(); 423 omap_init_kp();
424 omap_init_rng();
425 omap_init_mcpdm();
387 omap_init_uwire(); 426 omap_init_uwire();
388 omap_init_wdt(); 427 omap_init_wdt();
389 omap_init_rng();
390 return 0; 428 return 0;
391} 429}
392arch_initcall(omap_init_devices); 430arch_initcall(omap_init_devices);
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
index 68eaae324b6a..1d959965ff52 100644
--- a/arch/arm/plat-omap/dma.c
+++ b/arch/arm/plat-omap/dma.c
@@ -29,12 +29,13 @@
29#include <linux/interrupt.h> 29#include <linux/interrupt.h>
30#include <linux/irq.h> 30#include <linux/irq.h>
31#include <linux/io.h> 31#include <linux/io.h>
32#include <linux/slab.h>
32 33
33#include <asm/system.h> 34#include <asm/system.h>
34#include <mach/hardware.h> 35#include <mach/hardware.h>
35#include <mach/dma.h> 36#include <plat/dma.h>
36 37
37#include <mach/tc.h> 38#include <plat/tc.h>
38 39
39#undef DEBUG 40#undef DEBUG
40 41
@@ -47,13 +48,18 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
47#endif 48#endif
48 49
49#define OMAP_DMA_ACTIVE 0x01 50#define OMAP_DMA_ACTIVE 0x01
50#define OMAP_DMA_CCR_EN (1 << 7)
51#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe 51#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe
52 52
53#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec) 53#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
54 54
55static int enable_1510_mode; 55static int enable_1510_mode;
56 56
57static struct omap_dma_global_context_registers {
58 u32 dma_irqenable_l0;
59 u32 dma_ocp_sysconfig;
60 u32 dma_gcr;
61} omap_dma_global_context;
62
57struct omap_dma_lch { 63struct omap_dma_lch {
58 int next_lch; 64 int next_lch;
59 int dev_id; 65 int dev_id;
@@ -931,6 +937,15 @@ void omap_start_dma(int lch)
931{ 937{
932 u32 l; 938 u32 l;
933 939
940 /*
941 * The CPC/CDAC register needs to be initialized to zero
942 * before starting dma transfer.
943 */
944 if (cpu_is_omap15xx())
945 dma_write(0, CPC(lch));
946 else
947 dma_write(0, CDAC(lch));
948
934 if (!omap_dma_in_1510_mode() && dma_chan[lch].next_lch != -1) { 949 if (!omap_dma_in_1510_mode() && dma_chan[lch].next_lch != -1) {
935 int next_lch, cur_lch; 950 int next_lch, cur_lch;
936 char dma_chan_link_map[OMAP_DMA4_LOGICAL_DMA_CH_COUNT]; 951 char dma_chan_link_map[OMAP_DMA4_LOGICAL_DMA_CH_COUNT];
@@ -1114,17 +1129,8 @@ int omap_dma_running(void)
1114{ 1129{
1115 int lch; 1130 int lch;
1116 1131
1117 /* 1132 if (cpu_class_is_omap1())
1118 * On OMAP1510, internal LCD controller will start the transfer 1133 if (omap_lcd_dma_running())
1119 * when it gets enabled, so assume DMA running if LCD enabled.
1120 */
1121 if (cpu_is_omap1510())
1122 if (omap_readw(0xfffec000 + 0x00) & (1 << 0))
1123 return 1;
1124
1125 /* Check if LCD DMA is running */
1126 if (cpu_is_omap16xx())
1127 if (omap_readw(OMAP1610_DMA_LCD_CCR) & OMAP_DMA_CCR_EN)
1128 return 1; 1134 return 1;
1129 1135
1130 for (lch = 0; lch < dma_chan_count; lch++) 1136 for (lch = 0; lch < dma_chan_count; lch++)
@@ -1187,7 +1193,7 @@ void omap_dma_unlink_lch(int lch_head, int lch_queue)
1187 } 1193 }
1188 1194
1189 if ((dma_chan[lch_head].flags & OMAP_DMA_ACTIVE) || 1195 if ((dma_chan[lch_head].flags & OMAP_DMA_ACTIVE) ||
1190 (dma_chan[lch_head].flags & OMAP_DMA_ACTIVE)) { 1196 (dma_chan[lch_queue].flags & OMAP_DMA_ACTIVE)) {
1191 printk(KERN_ERR "omap_dma: You need to stop the DMA channels " 1197 printk(KERN_ERR "omap_dma: You need to stop the DMA channels "
1192 "before unlinking\n"); 1198 "before unlinking\n");
1193 dump_stack(); 1199 dump_stack();
@@ -1246,7 +1252,7 @@ static void create_dma_lch_chain(int lch_head, int lch_queue)
1246 * OMAP_DMA_DYNAMIC_CHAIN 1252 * OMAP_DMA_DYNAMIC_CHAIN
1247 * @params - Channel parameters 1253 * @params - Channel parameters
1248 * 1254 *
1249 * @return - Succes : 0 1255 * @return - Success : 0
1250 * Failure: -EINVAL/-ENOMEM 1256 * Failure: -EINVAL/-ENOMEM
1251 */ 1257 */
1252int omap_request_dma_chain(int dev_id, const char *dev_name, 1258int omap_request_dma_chain(int dev_id, const char *dev_name,
@@ -1874,8 +1880,7 @@ static irqreturn_t omap1_dma_irq_handler(int irq, void *dev_id)
1874#define omap1_dma_irq_handler NULL 1880#define omap1_dma_irq_handler NULL
1875#endif 1881#endif
1876 1882
1877#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ 1883#ifdef CONFIG_ARCH_OMAP2PLUS
1878 defined(CONFIG_ARCH_OMAP4)
1879 1884
1880static int omap2_dma_handle_ch(int ch) 1885static int omap2_dma_handle_ch(int ch)
1881{ 1886{
@@ -1984,415 +1989,83 @@ static struct irqaction omap24xx_dma_irq;
1984 1989
1985/*----------------------------------------------------------------------------*/ 1990/*----------------------------------------------------------------------------*/
1986 1991
1987static struct lcd_dma_info { 1992void omap_dma_global_context_save(void)
1988 spinlock_t lock;
1989 int reserved;
1990 void (*callback)(u16 status, void *data);
1991 void *cb_data;
1992
1993 int active;
1994 unsigned long addr, size;
1995 int rotate, data_type, xres, yres;
1996 int vxres;
1997 int mirror;
1998 int xscale, yscale;
1999 int ext_ctrl;
2000 int src_port;
2001 int single_transfer;
2002} lcd_dma;
2003
2004void omap_set_lcd_dma_b1(unsigned long addr, u16 fb_xres, u16 fb_yres,
2005 int data_type)
2006{
2007 lcd_dma.addr = addr;
2008 lcd_dma.data_type = data_type;
2009 lcd_dma.xres = fb_xres;
2010 lcd_dma.yres = fb_yres;
2011}
2012EXPORT_SYMBOL(omap_set_lcd_dma_b1);
2013
2014void omap_set_lcd_dma_src_port(int port)
2015{
2016 lcd_dma.src_port = port;
2017}
2018
2019void omap_set_lcd_dma_ext_controller(int external)
2020{ 1993{
2021 lcd_dma.ext_ctrl = external; 1994 omap_dma_global_context.dma_irqenable_l0 =
1995 dma_read(IRQENABLE_L0);
1996 omap_dma_global_context.dma_ocp_sysconfig =
1997 dma_read(OCP_SYSCONFIG);
1998 omap_dma_global_context.dma_gcr = dma_read(GCR);
2022} 1999}
2023EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller);
2024 2000
2025void omap_set_lcd_dma_single_transfer(int single) 2001void omap_dma_global_context_restore(void)
2026{ 2002{
2027 lcd_dma.single_transfer = single; 2003 int ch;
2028}
2029EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer);
2030 2004
2031void omap_set_lcd_dma_b1_rotation(int rotate) 2005 dma_write(omap_dma_global_context.dma_gcr, GCR);
2032{ 2006 dma_write(omap_dma_global_context.dma_ocp_sysconfig,
2033 if (omap_dma_in_1510_mode()) { 2007 OCP_SYSCONFIG);
2034 printk(KERN_ERR "DMA rotation is not supported in 1510 mode\n"); 2008 dma_write(omap_dma_global_context.dma_irqenable_l0,
2035 BUG(); 2009 IRQENABLE_L0);
2036 return;
2037 }
2038 lcd_dma.rotate = rotate;
2039}
2040EXPORT_SYMBOL(omap_set_lcd_dma_b1_rotation);
2041
2042void omap_set_lcd_dma_b1_mirror(int mirror)
2043{
2044 if (omap_dma_in_1510_mode()) {
2045 printk(KERN_ERR "DMA mirror is not supported in 1510 mode\n");
2046 BUG();
2047 }
2048 lcd_dma.mirror = mirror;
2049}
2050EXPORT_SYMBOL(omap_set_lcd_dma_b1_mirror);
2051
2052void omap_set_lcd_dma_b1_vxres(unsigned long vxres)
2053{
2054 if (omap_dma_in_1510_mode()) {
2055 printk(KERN_ERR "DMA virtual resulotion is not supported "
2056 "in 1510 mode\n");
2057 BUG();
2058 }
2059 lcd_dma.vxres = vxres;
2060}
2061EXPORT_SYMBOL(omap_set_lcd_dma_b1_vxres);
2062
2063void omap_set_lcd_dma_b1_scale(unsigned int xscale, unsigned int yscale)
2064{
2065 if (omap_dma_in_1510_mode()) {
2066 printk(KERN_ERR "DMA scale is not supported in 1510 mode\n");
2067 BUG();
2068 }
2069 lcd_dma.xscale = xscale;
2070 lcd_dma.yscale = yscale;
2071}
2072EXPORT_SYMBOL(omap_set_lcd_dma_b1_scale);
2073
2074static void set_b1_regs(void)
2075{
2076 unsigned long top, bottom;
2077 int es;
2078 u16 w;
2079 unsigned long en, fn;
2080 long ei, fi;
2081 unsigned long vxres;
2082 unsigned int xscale, yscale;
2083
2084 switch (lcd_dma.data_type) {
2085 case OMAP_DMA_DATA_TYPE_S8:
2086 es = 1;
2087 break;
2088 case OMAP_DMA_DATA_TYPE_S16:
2089 es = 2;
2090 break;
2091 case OMAP_DMA_DATA_TYPE_S32:
2092 es = 4;
2093 break;
2094 default:
2095 BUG();
2096 return;
2097 }
2098
2099 vxres = lcd_dma.vxres ? lcd_dma.vxres : lcd_dma.xres;
2100 xscale = lcd_dma.xscale ? lcd_dma.xscale : 1;
2101 yscale = lcd_dma.yscale ? lcd_dma.yscale : 1;
2102 BUG_ON(vxres < lcd_dma.xres);
2103
2104#define PIXADDR(x, y) (lcd_dma.addr + \
2105 ((y) * vxres * yscale + (x) * xscale) * es)
2106#define PIXSTEP(sx, sy, dx, dy) (PIXADDR(dx, dy) - PIXADDR(sx, sy) - es + 1)
2107
2108 switch (lcd_dma.rotate) {
2109 case 0:
2110 if (!lcd_dma.mirror) {
2111 top = PIXADDR(0, 0);
2112 bottom = PIXADDR(lcd_dma.xres - 1, lcd_dma.yres - 1);
2113 /* 1510 DMA requires the bottom address to be 2 more
2114 * than the actual last memory access location. */
2115 if (omap_dma_in_1510_mode() &&
2116 lcd_dma.data_type == OMAP_DMA_DATA_TYPE_S32)
2117 bottom += 2;
2118 ei = PIXSTEP(0, 0, 1, 0);
2119 fi = PIXSTEP(lcd_dma.xres - 1, 0, 0, 1);
2120 } else {
2121 top = PIXADDR(lcd_dma.xres - 1, 0);
2122 bottom = PIXADDR(0, lcd_dma.yres - 1);
2123 ei = PIXSTEP(1, 0, 0, 0);
2124 fi = PIXSTEP(0, 0, lcd_dma.xres - 1, 1);
2125 }
2126 en = lcd_dma.xres;
2127 fn = lcd_dma.yres;
2128 break;
2129 case 90:
2130 if (!lcd_dma.mirror) {
2131 top = PIXADDR(0, lcd_dma.yres - 1);
2132 bottom = PIXADDR(lcd_dma.xres - 1, 0);
2133 ei = PIXSTEP(0, 1, 0, 0);
2134 fi = PIXSTEP(0, 0, 1, lcd_dma.yres - 1);
2135 } else {
2136 top = PIXADDR(lcd_dma.xres - 1, lcd_dma.yres - 1);
2137 bottom = PIXADDR(0, 0);
2138 ei = PIXSTEP(0, 1, 0, 0);
2139 fi = PIXSTEP(1, 0, 0, lcd_dma.yres - 1);
2140 }
2141 en = lcd_dma.yres;
2142 fn = lcd_dma.xres;
2143 break;
2144 case 180:
2145 if (!lcd_dma.mirror) {
2146 top = PIXADDR(lcd_dma.xres - 1, lcd_dma.yres - 1);
2147 bottom = PIXADDR(0, 0);
2148 ei = PIXSTEP(1, 0, 0, 0);
2149 fi = PIXSTEP(0, 1, lcd_dma.xres - 1, 0);
2150 } else {
2151 top = PIXADDR(0, lcd_dma.yres - 1);
2152 bottom = PIXADDR(lcd_dma.xres - 1, 0);
2153 ei = PIXSTEP(0, 0, 1, 0);
2154 fi = PIXSTEP(lcd_dma.xres - 1, 1, 0, 0);
2155 }
2156 en = lcd_dma.xres;
2157 fn = lcd_dma.yres;
2158 break;
2159 case 270:
2160 if (!lcd_dma.mirror) {
2161 top = PIXADDR(lcd_dma.xres - 1, 0);
2162 bottom = PIXADDR(0, lcd_dma.yres - 1);
2163 ei = PIXSTEP(0, 0, 0, 1);
2164 fi = PIXSTEP(1, lcd_dma.yres - 1, 0, 0);
2165 } else {
2166 top = PIXADDR(0, 0);
2167 bottom = PIXADDR(lcd_dma.xres - 1, lcd_dma.yres - 1);
2168 ei = PIXSTEP(0, 0, 0, 1);
2169 fi = PIXSTEP(0, lcd_dma.yres - 1, 1, 0);
2170 }
2171 en = lcd_dma.yres;
2172 fn = lcd_dma.xres;
2173 break;
2174 default:
2175 BUG();
2176 return; /* Suppress warning about uninitialized vars */
2177 }
2178
2179 if (omap_dma_in_1510_mode()) {
2180 omap_writew(top >> 16, OMAP1510_DMA_LCD_TOP_F1_U);
2181 omap_writew(top, OMAP1510_DMA_LCD_TOP_F1_L);
2182 omap_writew(bottom >> 16, OMAP1510_DMA_LCD_BOT_F1_U);
2183 omap_writew(bottom, OMAP1510_DMA_LCD_BOT_F1_L);
2184
2185 return;
2186 }
2187
2188 /* 1610 regs */
2189 omap_writew(top >> 16, OMAP1610_DMA_LCD_TOP_B1_U);
2190 omap_writew(top, OMAP1610_DMA_LCD_TOP_B1_L);
2191 omap_writew(bottom >> 16, OMAP1610_DMA_LCD_BOT_B1_U);
2192 omap_writew(bottom, OMAP1610_DMA_LCD_BOT_B1_L);
2193
2194 omap_writew(en, OMAP1610_DMA_LCD_SRC_EN_B1);
2195 omap_writew(fn, OMAP1610_DMA_LCD_SRC_FN_B1);
2196
2197 w = omap_readw(OMAP1610_DMA_LCD_CSDP);
2198 w &= ~0x03;
2199 w |= lcd_dma.data_type;
2200 omap_writew(w, OMAP1610_DMA_LCD_CSDP);
2201
2202 w = omap_readw(OMAP1610_DMA_LCD_CTRL);
2203 /* Always set the source port as SDRAM for now*/
2204 w &= ~(0x03 << 6);
2205 if (lcd_dma.callback != NULL)
2206 w |= 1 << 1; /* Block interrupt enable */
2207 else
2208 w &= ~(1 << 1);
2209 omap_writew(w, OMAP1610_DMA_LCD_CTRL);
2210
2211 if (!(lcd_dma.rotate || lcd_dma.mirror ||
2212 lcd_dma.vxres || lcd_dma.xscale || lcd_dma.yscale))
2213 return;
2214
2215 w = omap_readw(OMAP1610_DMA_LCD_CCR);
2216 /* Set the double-indexed addressing mode */
2217 w |= (0x03 << 12);
2218 omap_writew(w, OMAP1610_DMA_LCD_CCR);
2219
2220 omap_writew(ei, OMAP1610_DMA_LCD_SRC_EI_B1);
2221 omap_writew(fi >> 16, OMAP1610_DMA_LCD_SRC_FI_B1_U);
2222 omap_writew(fi, OMAP1610_DMA_LCD_SRC_FI_B1_L);
2223}
2224
2225static irqreturn_t lcd_dma_irq_handler(int irq, void *dev_id)
2226{
2227 u16 w;
2228
2229 w = omap_readw(OMAP1610_DMA_LCD_CTRL);
2230 if (unlikely(!(w & (1 << 3)))) {
2231 printk(KERN_WARNING "Spurious LCD DMA IRQ\n");
2232 return IRQ_NONE;
2233 }
2234 /* Ack the IRQ */
2235 w |= (1 << 3);
2236 omap_writew(w, OMAP1610_DMA_LCD_CTRL);
2237 lcd_dma.active = 0;
2238 if (lcd_dma.callback != NULL)
2239 lcd_dma.callback(w, lcd_dma.cb_data);
2240
2241 return IRQ_HANDLED;
2242}
2243
2244int omap_request_lcd_dma(void (*callback)(u16 status, void *data),
2245 void *data)
2246{
2247 spin_lock_irq(&lcd_dma.lock);
2248 if (lcd_dma.reserved) {
2249 spin_unlock_irq(&lcd_dma.lock);
2250 printk(KERN_ERR "LCD DMA channel already reserved\n");
2251 BUG();
2252 return -EBUSY;
2253 }
2254 lcd_dma.reserved = 1;
2255 spin_unlock_irq(&lcd_dma.lock);
2256 lcd_dma.callback = callback;
2257 lcd_dma.cb_data = data;
2258 lcd_dma.active = 0;
2259 lcd_dma.single_transfer = 0;
2260 lcd_dma.rotate = 0;
2261 lcd_dma.vxres = 0;
2262 lcd_dma.mirror = 0;
2263 lcd_dma.xscale = 0;
2264 lcd_dma.yscale = 0;
2265 lcd_dma.ext_ctrl = 0;
2266 lcd_dma.src_port = 0;
2267
2268 return 0;
2269}
2270EXPORT_SYMBOL(omap_request_lcd_dma);
2271
2272void omap_free_lcd_dma(void)
2273{
2274 spin_lock(&lcd_dma.lock);
2275 if (!lcd_dma.reserved) {
2276 spin_unlock(&lcd_dma.lock);
2277 printk(KERN_ERR "LCD DMA is not reserved\n");
2278 BUG();
2279 return;
2280 }
2281 if (!enable_1510_mode)
2282 omap_writew(omap_readw(OMAP1610_DMA_LCD_CCR) & ~1,
2283 OMAP1610_DMA_LCD_CCR);
2284 lcd_dma.reserved = 0;
2285 spin_unlock(&lcd_dma.lock);
2286}
2287EXPORT_SYMBOL(omap_free_lcd_dma);
2288
2289void omap_enable_lcd_dma(void)
2290{
2291 u16 w;
2292 2010
2293 /* 2011 /*
2294 * Set the Enable bit only if an external controller is 2012 * A bug in ROM code leaves IRQ status for channels 0 and 1 uncleared
2295 * connected. Otherwise the OMAP internal controller will 2013 * after secure sram context save and restore. Hence we need to
2296 * start the transfer when it gets enabled. 2014 * manually clear those IRQs to avoid spurious interrupts. This
2015 * affects only secure devices.
2297 */ 2016 */
2298 if (enable_1510_mode || !lcd_dma.ext_ctrl) 2017 if (cpu_is_omap34xx() && (omap_type() != OMAP2_DEVICE_TYPE_GP))
2299 return; 2018 dma_write(0x3 , IRQSTATUS_L0);
2300
2301 w = omap_readw(OMAP1610_DMA_LCD_CTRL);
2302 w |= 1 << 8;
2303 omap_writew(w, OMAP1610_DMA_LCD_CTRL);
2304
2305 lcd_dma.active = 1;
2306 2019
2307 w = omap_readw(OMAP1610_DMA_LCD_CCR); 2020 for (ch = 0; ch < dma_chan_count; ch++)
2308 w |= 1 << 7; 2021 if (dma_chan[ch].dev_id != -1)
2309 omap_writew(w, OMAP1610_DMA_LCD_CCR); 2022 omap_clear_dma(ch);
2310} 2023}
2311EXPORT_SYMBOL(omap_enable_lcd_dma);
2312
2313void omap_setup_lcd_dma(void)
2314{
2315 BUG_ON(lcd_dma.active);
2316 if (!enable_1510_mode) {
2317 /* Set some reasonable defaults */
2318 omap_writew(0x5440, OMAP1610_DMA_LCD_CCR);
2319 omap_writew(0x9102, OMAP1610_DMA_LCD_CSDP);
2320 omap_writew(0x0004, OMAP1610_DMA_LCD_LCH_CTRL);
2321 }
2322 set_b1_regs();
2323 if (!enable_1510_mode) {
2324 u16 w;
2325
2326 w = omap_readw(OMAP1610_DMA_LCD_CCR);
2327 /*
2328 * If DMA was already active set the end_prog bit to have
2329 * the programmed register set loaded into the active
2330 * register set.
2331 */
2332 w |= 1 << 11; /* End_prog */
2333 if (!lcd_dma.single_transfer)
2334 w |= (3 << 8); /* Auto_init, repeat */
2335 omap_writew(w, OMAP1610_DMA_LCD_CCR);
2336 }
2337}
2338EXPORT_SYMBOL(omap_setup_lcd_dma);
2339
2340void omap_stop_lcd_dma(void)
2341{
2342 u16 w;
2343
2344 lcd_dma.active = 0;
2345 if (enable_1510_mode || !lcd_dma.ext_ctrl)
2346 return;
2347
2348 w = omap_readw(OMAP1610_DMA_LCD_CCR);
2349 w &= ~(1 << 7);
2350 omap_writew(w, OMAP1610_DMA_LCD_CCR);
2351
2352 w = omap_readw(OMAP1610_DMA_LCD_CTRL);
2353 w &= ~(1 << 8);
2354 omap_writew(w, OMAP1610_DMA_LCD_CTRL);
2355}
2356EXPORT_SYMBOL(omap_stop_lcd_dma);
2357 2024
2358/*----------------------------------------------------------------------------*/ 2025/*----------------------------------------------------------------------------*/
2359 2026
2360static int __init omap_init_dma(void) 2027static int __init omap_init_dma(void)
2361{ 2028{
2029 unsigned long base;
2362 int ch, r; 2030 int ch, r;
2363 2031
2364 if (cpu_class_is_omap1()) { 2032 if (cpu_class_is_omap1()) {
2365 omap_dma_base = OMAP1_IO_ADDRESS(OMAP1_DMA_BASE); 2033 base = OMAP1_DMA_BASE;
2366 dma_lch_count = OMAP1_LOGICAL_DMA_CH_COUNT; 2034 dma_lch_count = OMAP1_LOGICAL_DMA_CH_COUNT;
2367 } else if (cpu_is_omap24xx()) { 2035 } else if (cpu_is_omap24xx()) {
2368 omap_dma_base = OMAP2_IO_ADDRESS(OMAP24XX_DMA4_BASE); 2036 base = OMAP24XX_DMA4_BASE;
2369 dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT; 2037 dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT;
2370 } else if (cpu_is_omap34xx()) { 2038 } else if (cpu_is_omap34xx()) {
2371 omap_dma_base = OMAP2_IO_ADDRESS(OMAP34XX_DMA4_BASE); 2039 base = OMAP34XX_DMA4_BASE;
2372 dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT; 2040 dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT;
2373 } else if (cpu_is_omap44xx()) { 2041 } else if (cpu_is_omap44xx()) {
2374 omap_dma_base = OMAP2_IO_ADDRESS(OMAP44XX_DMA4_BASE); 2042 base = OMAP44XX_DMA4_BASE;
2375 dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT; 2043 dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT;
2376 } else { 2044 } else {
2377 pr_err("DMA init failed for unsupported omap\n"); 2045 pr_err("DMA init failed for unsupported omap\n");
2378 return -ENODEV; 2046 return -ENODEV;
2379 } 2047 }
2380 2048
2049 omap_dma_base = ioremap(base, SZ_4K);
2050 BUG_ON(!omap_dma_base);
2051
2381 if (cpu_class_is_omap2() && omap_dma_reserve_channels 2052 if (cpu_class_is_omap2() && omap_dma_reserve_channels
2382 && (omap_dma_reserve_channels <= dma_lch_count)) 2053 && (omap_dma_reserve_channels <= dma_lch_count))
2383 dma_lch_count = omap_dma_reserve_channels; 2054 dma_lch_count = omap_dma_reserve_channels;
2384 2055
2385 dma_chan = kzalloc(sizeof(struct omap_dma_lch) * dma_lch_count, 2056 dma_chan = kzalloc(sizeof(struct omap_dma_lch) * dma_lch_count,
2386 GFP_KERNEL); 2057 GFP_KERNEL);
2387 if (!dma_chan) 2058 if (!dma_chan) {
2388 return -ENOMEM; 2059 r = -ENOMEM;
2060 goto out_unmap;
2061 }
2389 2062
2390 if (cpu_class_is_omap2()) { 2063 if (cpu_class_is_omap2()) {
2391 dma_linked_lch = kzalloc(sizeof(struct dma_link_info) * 2064 dma_linked_lch = kzalloc(sizeof(struct dma_link_info) *
2392 dma_lch_count, GFP_KERNEL); 2065 dma_lch_count, GFP_KERNEL);
2393 if (!dma_linked_lch) { 2066 if (!dma_linked_lch) {
2394 kfree(dma_chan); 2067 r = -ENOMEM;
2395 return -ENOMEM; 2068 goto out_free;
2396 } 2069 }
2397 } 2070 }
2398 2071
@@ -2420,14 +2093,6 @@ static int __init omap_init_dma(void)
2420 dma_chan_count = 16; 2093 dma_chan_count = 16;
2421 } else 2094 } else
2422 dma_chan_count = 9; 2095 dma_chan_count = 9;
2423 if (cpu_is_omap16xx()) {
2424 u16 w;
2425
2426 /* this would prevent OMAP sleep */
2427 w = omap_readw(OMAP1610_DMA_LCD_CTRL);
2428 w &= ~(1 << 8);
2429 omap_writew(w, OMAP1610_DMA_LCD_CTRL);
2430 }
2431 } else if (cpu_class_is_omap2()) { 2096 } else if (cpu_class_is_omap2()) {
2432 u8 revision = dma_read(REVISION) & 0xff; 2097 u8 revision = dma_read(REVISION) & 0xff;
2433 printk(KERN_INFO "OMAP DMA hardware revision %d.%d\n", 2098 printk(KERN_INFO "OMAP DMA hardware revision %d.%d\n",
@@ -2438,7 +2103,6 @@ static int __init omap_init_dma(void)
2438 return 0; 2103 return 0;
2439 } 2104 }
2440 2105
2441 spin_lock_init(&lcd_dma.lock);
2442 spin_lock_init(&dma_chan_lock); 2106 spin_lock_init(&dma_chan_lock);
2443 2107
2444 for (ch = 0; ch < dma_chan_count; ch++) { 2108 for (ch = 0; ch < dma_chan_count; ch++) {
@@ -2466,7 +2130,7 @@ static int __init omap_init_dma(void)
2466 for (i = 0; i < ch; i++) 2130 for (i = 0; i < ch; i++)
2467 free_irq(omap1_dma_irq[i], 2131 free_irq(omap1_dma_irq[i],
2468 (void *) (i + 1)); 2132 (void *) (i + 1));
2469 return r; 2133 goto out_free;
2470 } 2134 }
2471 } 2135 }
2472 } 2136 }
@@ -2478,14 +2142,14 @@ static int __init omap_init_dma(void)
2478 if (cpu_class_is_omap2()) { 2142 if (cpu_class_is_omap2()) {
2479 int irq; 2143 int irq;
2480 if (cpu_is_omap44xx()) 2144 if (cpu_is_omap44xx())
2481 irq = INT_44XX_SDMA_IRQ0; 2145 irq = OMAP44XX_IRQ_SDMA_0;
2482 else 2146 else
2483 irq = INT_24XX_SDMA_IRQ0; 2147 irq = INT_24XX_SDMA_IRQ0;
2484 setup_irq(irq, &omap24xx_dma_irq); 2148 setup_irq(irq, &omap24xx_dma_irq);
2485 } 2149 }
2486 2150
2487 /* Enable smartidle idlemodes and autoidle */ 2151 if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
2488 if (cpu_is_omap34xx()) { 2152 /* Enable smartidle idlemodes and autoidle */
2489 u32 v = dma_read(OCP_SYSCONFIG); 2153 u32 v = dma_read(OCP_SYSCONFIG);
2490 v &= ~(DMA_SYSCONFIG_MIDLEMODE_MASK | 2154 v &= ~(DMA_SYSCONFIG_MIDLEMODE_MASK |
2491 DMA_SYSCONFIG_SIDLEMODE_MASK | 2155 DMA_SYSCONFIG_SIDLEMODE_MASK |
@@ -2494,25 +2158,25 @@ static int __init omap_init_dma(void)
2494 DMA_SYSCONFIG_SIDLEMODE(DMA_IDLEMODE_SMARTIDLE) | 2158 DMA_SYSCONFIG_SIDLEMODE(DMA_IDLEMODE_SMARTIDLE) |
2495 DMA_SYSCONFIG_AUTOIDLE); 2159 DMA_SYSCONFIG_AUTOIDLE);
2496 dma_write(v , OCP_SYSCONFIG); 2160 dma_write(v , OCP_SYSCONFIG);
2497 } 2161 /* reserve dma channels 0 and 1 in high security devices */
2498 2162 if (cpu_is_omap34xx() &&
2499 2163 (omap_type() != OMAP2_DEVICE_TYPE_GP)) {
2500 /* FIXME: Update LCD DMA to work on 24xx */ 2164 printk(KERN_INFO "Reserving DMA channels 0 and 1 for "
2501 if (cpu_class_is_omap1()) { 2165 "HS ROM code\n");
2502 r = request_irq(INT_DMA_LCD, lcd_dma_irq_handler, 0, 2166 dma_chan[0].dev_id = 0;
2503 "LCD DMA", NULL); 2167 dma_chan[1].dev_id = 1;
2504 if (r != 0) {
2505 int i;
2506
2507 printk(KERN_ERR "unable to request IRQ for LCD DMA "
2508 "(error %d)\n", r);
2509 for (i = 0; i < dma_chan_count; i++)
2510 free_irq(omap1_dma_irq[i], (void *) (i + 1));
2511 return r;
2512 } 2168 }
2513 } 2169 }
2514 2170
2515 return 0; 2171 return 0;
2172
2173out_free:
2174 kfree(dma_chan);
2175
2176out_unmap:
2177 iounmap(omap_dma_base);
2178
2179 return r;
2516} 2180}
2517 2181
2518arch_initcall(omap_init_dma); 2182arch_initcall(omap_init_dma);
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c
index d325b54daeb5..4d99dfbc8bef 100644
--- a/arch/arm/plat-omap/dmtimer.c
+++ b/arch/arm/plat-omap/dmtimer.c
@@ -38,7 +38,7 @@
38#include <linux/io.h> 38#include <linux/io.h>
39#include <linux/module.h> 39#include <linux/module.h>
40#include <mach/hardware.h> 40#include <mach/hardware.h>
41#include <mach/dmtimer.h> 41#include <plat/dmtimer.h>
42#include <mach/irqs.h> 42#include <mach/irqs.h>
43 43
44/* register offsets */ 44/* register offsets */
@@ -153,8 +153,7 @@
153struct omap_dm_timer { 153struct omap_dm_timer {
154 unsigned long phys_base; 154 unsigned long phys_base;
155 int irq; 155 int irq;
156#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ 156#ifdef CONFIG_ARCH_OMAP2PLUS
157 defined(CONFIG_ARCH_OMAP4)
158 struct clk *iclk, *fclk; 157 struct clk *iclk, *fclk;
159#endif 158#endif
160 void __iomem *io_base; 159 void __iomem *io_base;
@@ -163,20 +162,9 @@ struct omap_dm_timer {
163 unsigned posted:1; 162 unsigned posted:1;
164}; 163};
165 164
166#ifdef CONFIG_ARCH_OMAP1 165static int dm_timer_count;
167
168#define omap_dm_clk_enable(x)
169#define omap_dm_clk_disable(x)
170#define omap2_dm_timers NULL
171#define omap2_dm_source_names NULL
172#define omap2_dm_source_clocks NULL
173#define omap3_dm_timers NULL
174#define omap3_dm_source_names NULL
175#define omap3_dm_source_clocks NULL
176#define omap4_dm_timers NULL
177#define omap4_dm_source_names NULL
178#define omap4_dm_source_clocks NULL
179 166
167#ifdef CONFIG_ARCH_OMAP1
180static struct omap_dm_timer omap1_dm_timers[] = { 168static struct omap_dm_timer omap1_dm_timers[] = {
181 { .phys_base = 0xfffb1400, .irq = INT_1610_GPTIMER1 }, 169 { .phys_base = 0xfffb1400, .irq = INT_1610_GPTIMER1 },
182 { .phys_base = 0xfffb1c00, .irq = INT_1610_GPTIMER2 }, 170 { .phys_base = 0xfffb1c00, .irq = INT_1610_GPTIMER2 },
@@ -188,20 +176,14 @@ static struct omap_dm_timer omap1_dm_timers[] = {
188 { .phys_base = 0xfffbd400, .irq = INT_1610_GPTIMER8 }, 176 { .phys_base = 0xfffbd400, .irq = INT_1610_GPTIMER8 },
189}; 177};
190 178
191static const int dm_timer_count = ARRAY_SIZE(omap1_dm_timers); 179static const int omap1_dm_timer_count = ARRAY_SIZE(omap1_dm_timers);
192 180
193#elif defined(CONFIG_ARCH_OMAP2) 181#else
194
195#define omap_dm_clk_enable(x) clk_enable(x)
196#define omap_dm_clk_disable(x) clk_disable(x)
197#define omap1_dm_timers NULL 182#define omap1_dm_timers NULL
198#define omap3_dm_timers NULL 183#define omap1_dm_timer_count 0
199#define omap3_dm_source_names NULL 184#endif /* CONFIG_ARCH_OMAP1 */
200#define omap3_dm_source_clocks NULL
201#define omap4_dm_timers NULL
202#define omap4_dm_source_names NULL
203#define omap4_dm_source_clocks NULL
204 185
186#ifdef CONFIG_ARCH_OMAP2
205static struct omap_dm_timer omap2_dm_timers[] = { 187static struct omap_dm_timer omap2_dm_timers[] = {
206 { .phys_base = 0x48028000, .irq = INT_24XX_GPTIMER1 }, 188 { .phys_base = 0x48028000, .irq = INT_24XX_GPTIMER1 },
207 { .phys_base = 0x4802a000, .irq = INT_24XX_GPTIMER2 }, 189 { .phys_base = 0x4802a000, .irq = INT_24XX_GPTIMER2 },
@@ -225,20 +207,16 @@ static const char *omap2_dm_source_names[] __initdata = {
225}; 207};
226 208
227static struct clk *omap2_dm_source_clocks[3]; 209static struct clk *omap2_dm_source_clocks[3];
228static const int dm_timer_count = ARRAY_SIZE(omap2_dm_timers); 210static const int omap2_dm_timer_count = ARRAY_SIZE(omap2_dm_timers);
229
230#elif defined(CONFIG_ARCH_OMAP3)
231 211
232#define omap_dm_clk_enable(x) clk_enable(x) 212#else
233#define omap_dm_clk_disable(x) clk_disable(x)
234#define omap1_dm_timers NULL
235#define omap2_dm_timers NULL 213#define omap2_dm_timers NULL
214#define omap2_dm_timer_count 0
236#define omap2_dm_source_names NULL 215#define omap2_dm_source_names NULL
237#define omap2_dm_source_clocks NULL 216#define omap2_dm_source_clocks NULL
238#define omap4_dm_timers NULL 217#endif /* CONFIG_ARCH_OMAP2 */
239#define omap4_dm_source_names NULL
240#define omap4_dm_source_clocks NULL
241 218
219#ifdef CONFIG_ARCH_OMAP3
242static struct omap_dm_timer omap3_dm_timers[] = { 220static struct omap_dm_timer omap3_dm_timers[] = {
243 { .phys_base = 0x48318000, .irq = INT_24XX_GPTIMER1 }, 221 { .phys_base = 0x48318000, .irq = INT_24XX_GPTIMER1 },
244 { .phys_base = 0x49032000, .irq = INT_24XX_GPTIMER2 }, 222 { .phys_base = 0x49032000, .irq = INT_24XX_GPTIMER2 },
@@ -261,33 +239,29 @@ static const char *omap3_dm_source_names[] __initdata = {
261}; 239};
262 240
263static struct clk *omap3_dm_source_clocks[2]; 241static struct clk *omap3_dm_source_clocks[2];
264static const int dm_timer_count = ARRAY_SIZE(omap3_dm_timers); 242static const int omap3_dm_timer_count = ARRAY_SIZE(omap3_dm_timers);
265
266#elif defined(CONFIG_ARCH_OMAP4)
267 243
268#define omap_dm_clk_enable(x) clk_enable(x) 244#else
269#define omap_dm_clk_disable(x) clk_disable(x)
270#define omap1_dm_timers NULL
271#define omap2_dm_timers NULL
272#define omap2_dm_source_names NULL
273#define omap2_dm_source_clocks NULL
274#define omap3_dm_timers NULL 245#define omap3_dm_timers NULL
246#define omap3_dm_timer_count 0
275#define omap3_dm_source_names NULL 247#define omap3_dm_source_names NULL
276#define omap3_dm_source_clocks NULL 248#define omap3_dm_source_clocks NULL
249#endif /* CONFIG_ARCH_OMAP3 */
277 250
251#ifdef CONFIG_ARCH_OMAP4
278static struct omap_dm_timer omap4_dm_timers[] = { 252static struct omap_dm_timer omap4_dm_timers[] = {
279 { .phys_base = 0x4a318000, .irq = INT_44XX_GPTIMER1 }, 253 { .phys_base = 0x4a318000, .irq = OMAP44XX_IRQ_GPT1 },
280 { .phys_base = 0x48032000, .irq = INT_44XX_GPTIMER2 }, 254 { .phys_base = 0x48032000, .irq = OMAP44XX_IRQ_GPT2 },
281 { .phys_base = 0x48034000, .irq = INT_44XX_GPTIMER3 }, 255 { .phys_base = 0x48034000, .irq = OMAP44XX_IRQ_GPT3 },
282 { .phys_base = 0x48036000, .irq = INT_44XX_GPTIMER4 }, 256 { .phys_base = 0x48036000, .irq = OMAP44XX_IRQ_GPT4 },
283 { .phys_base = 0x40138000, .irq = INT_44XX_GPTIMER5 }, 257 { .phys_base = 0x40138000, .irq = OMAP44XX_IRQ_GPT5 },
284 { .phys_base = 0x4013a000, .irq = INT_44XX_GPTIMER6 }, 258 { .phys_base = 0x4013a000, .irq = OMAP44XX_IRQ_GPT6 },
285 { .phys_base = 0x4013a000, .irq = INT_44XX_GPTIMER7 }, 259 { .phys_base = 0x4013a000, .irq = OMAP44XX_IRQ_GPT7 },
286 { .phys_base = 0x4013e000, .irq = INT_44XX_GPTIMER8 }, 260 { .phys_base = 0x4013e000, .irq = OMAP44XX_IRQ_GPT8 },
287 { .phys_base = 0x4803e000, .irq = INT_44XX_GPTIMER9 }, 261 { .phys_base = 0x4803e000, .irq = OMAP44XX_IRQ_GPT9 },
288 { .phys_base = 0x48086000, .irq = INT_44XX_GPTIMER10 }, 262 { .phys_base = 0x48086000, .irq = OMAP44XX_IRQ_GPT10 },
289 { .phys_base = 0x48088000, .irq = INT_44XX_GPTIMER11 }, 263 { .phys_base = 0x48088000, .irq = OMAP44XX_IRQ_GPT11 },
290 { .phys_base = 0x4a320000, .irq = INT_44XX_GPTIMER12 }, 264 { .phys_base = 0x4a320000, .irq = OMAP44XX_IRQ_GPT12 },
291}; 265};
292static const char *omap4_dm_source_names[] __initdata = { 266static const char *omap4_dm_source_names[] __initdata = {
293 "sys_ck", 267 "sys_ck",
@@ -295,13 +269,14 @@ static const char *omap4_dm_source_names[] __initdata = {
295 NULL 269 NULL
296}; 270};
297static struct clk *omap4_dm_source_clocks[2]; 271static struct clk *omap4_dm_source_clocks[2];
298static const int dm_timer_count = ARRAY_SIZE(omap4_dm_timers); 272static const int omap4_dm_timer_count = ARRAY_SIZE(omap4_dm_timers);
299 273
300#else 274#else
301 275#define omap4_dm_timers NULL
302#error OMAP architecture not supported! 276#define omap4_dm_timer_count 0
303 277#define omap4_dm_source_names NULL
304#endif 278#define omap4_dm_source_clocks NULL
279#endif /* CONFIG_ARCH_OMAP4 */
305 280
306static struct omap_dm_timer *dm_timers; 281static struct omap_dm_timer *dm_timers;
307static const char **dm_source_names; 282static const char **dm_source_names;
@@ -450,8 +425,12 @@ void omap_dm_timer_enable(struct omap_dm_timer *timer)
450 if (timer->enabled) 425 if (timer->enabled)
451 return; 426 return;
452 427
453 omap_dm_clk_enable(timer->fclk); 428#ifdef CONFIG_ARCH_OMAP2PLUS
454 omap_dm_clk_enable(timer->iclk); 429 if (cpu_class_is_omap2()) {
430 clk_enable(timer->fclk);
431 clk_enable(timer->iclk);
432 }
433#endif
455 434
456 timer->enabled = 1; 435 timer->enabled = 1;
457} 436}
@@ -462,8 +441,12 @@ void omap_dm_timer_disable(struct omap_dm_timer *timer)
462 if (!timer->enabled) 441 if (!timer->enabled)
463 return; 442 return;
464 443
465 omap_dm_clk_disable(timer->iclk); 444#ifdef CONFIG_ARCH_OMAP2PLUS
466 omap_dm_clk_disable(timer->fclk); 445 if (cpu_class_is_omap2()) {
446 clk_disable(timer->iclk);
447 clk_disable(timer->fclk);
448 }
449#endif
467 450
468 timer->enabled = 0; 451 timer->enabled = 0;
469} 452}
@@ -506,8 +489,7 @@ __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
506} 489}
507EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask); 490EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask);
508 491
509#elif defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ 492#else
510 defined(CONFIG_ARCH_OMAP4)
511 493
512struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) 494struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer)
513{ 495{
@@ -551,6 +533,18 @@ void omap_dm_timer_stop(struct omap_dm_timer *timer)
551 if (l & OMAP_TIMER_CTRL_ST) { 533 if (l & OMAP_TIMER_CTRL_ST) {
552 l &= ~0x1; 534 l &= ~0x1;
553 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); 535 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);
536#ifdef CONFIG_ARCH_OMAP2PLUS
537 /* Readback to make sure write has completed */
538 omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
539 /*
540 * Wait for functional clock period x 3.5 to make sure that
541 * timer is stopped
542 */
543 udelay(3500000 / clk_get_rate(timer->fclk) + 1);
544 /* Ack possibly pending interrupt */
545 omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG,
546 OMAP_TIMER_INT_OVERFLOW);
547#endif
554 } 548 }
555} 549}
556EXPORT_SYMBOL_GPL(omap_dm_timer_stop); 550EXPORT_SYMBOL_GPL(omap_dm_timer_stop);
@@ -742,25 +736,30 @@ EXPORT_SYMBOL_GPL(omap_dm_timers_active);
742int __init omap_dm_timer_init(void) 736int __init omap_dm_timer_init(void)
743{ 737{
744 struct omap_dm_timer *timer; 738 struct omap_dm_timer *timer;
745 int i; 739 int i, map_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */
746 740
747 if (!(cpu_is_omap16xx() || cpu_class_is_omap2())) 741 if (!(cpu_is_omap16xx() || cpu_class_is_omap2()))
748 return -ENODEV; 742 return -ENODEV;
749 743
750 spin_lock_init(&dm_timer_lock); 744 spin_lock_init(&dm_timer_lock);
751 745
752 if (cpu_class_is_omap1()) 746 if (cpu_class_is_omap1()) {
753 dm_timers = omap1_dm_timers; 747 dm_timers = omap1_dm_timers;
754 else if (cpu_is_omap24xx()) { 748 dm_timer_count = omap1_dm_timer_count;
749 map_size = SZ_2K;
750 } else if (cpu_is_omap24xx()) {
755 dm_timers = omap2_dm_timers; 751 dm_timers = omap2_dm_timers;
752 dm_timer_count = omap2_dm_timer_count;
756 dm_source_names = omap2_dm_source_names; 753 dm_source_names = omap2_dm_source_names;
757 dm_source_clocks = omap2_dm_source_clocks; 754 dm_source_clocks = omap2_dm_source_clocks;
758 } else if (cpu_is_omap34xx()) { 755 } else if (cpu_is_omap34xx()) {
759 dm_timers = omap3_dm_timers; 756 dm_timers = omap3_dm_timers;
757 dm_timer_count = omap3_dm_timer_count;
760 dm_source_names = omap3_dm_source_names; 758 dm_source_names = omap3_dm_source_names;
761 dm_source_clocks = omap3_dm_source_clocks; 759 dm_source_clocks = omap3_dm_source_clocks;
762 } else if (cpu_is_omap44xx()) { 760 } else if (cpu_is_omap44xx()) {
763 dm_timers = omap4_dm_timers; 761 dm_timers = omap4_dm_timers;
762 dm_timer_count = omap4_dm_timer_count;
764 dm_source_names = omap4_dm_source_names; 763 dm_source_names = omap4_dm_source_names;
765 dm_source_clocks = omap4_dm_source_clocks; 764 dm_source_clocks = omap4_dm_source_clocks;
766 } 765 }
@@ -774,12 +773,12 @@ int __init omap_dm_timer_init(void)
774 773
775 for (i = 0; i < dm_timer_count; i++) { 774 for (i = 0; i < dm_timer_count; i++) {
776 timer = &dm_timers[i]; 775 timer = &dm_timers[i];
777 if (cpu_class_is_omap1()) 776
778 timer->io_base = OMAP1_IO_ADDRESS(timer->phys_base); 777 /* Static mapping, never released */
779 else 778 timer->io_base = ioremap(timer->phys_base, map_size);
780 timer->io_base = OMAP2_IO_ADDRESS(timer->phys_base); 779 BUG_ON(!timer->io_base);
781#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ 780
782 defined(CONFIG_ARCH_OMAP4) 781#ifdef CONFIG_ARCH_OMAP2PLUS
783 if (cpu_class_is_omap2()) { 782 if (cpu_class_is_omap2()) {
784 char clk_name[16]; 783 char clk_name[16];
785 sprintf(clk_name, "gpt%d_ick", i + 1); 784 sprintf(clk_name, "gpt%d_ick", i + 1);
diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c
index 3746222bed10..d3eea4f47533 100644
--- a/arch/arm/plat-omap/fb.c
+++ b/arch/arm/plat-omap/fb.c
@@ -28,13 +28,13 @@
28#include <linux/platform_device.h> 28#include <linux/platform_device.h>
29#include <linux/bootmem.h> 29#include <linux/bootmem.h>
30#include <linux/io.h> 30#include <linux/io.h>
31#include <linux/omapfb.h>
31 32
32#include <mach/hardware.h> 33#include <mach/hardware.h>
33#include <asm/mach/map.h> 34#include <asm/mach/map.h>
34 35
35#include <mach/board.h> 36#include <plat/board.h>
36#include <mach/sram.h> 37#include <plat/sram.h>
37#include <mach/omapfb.h>
38 38
39#if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE) 39#if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE)
40 40
@@ -55,6 +55,10 @@ static struct platform_device omap_fb_device = {
55 .num_resources = 0, 55 .num_resources = 0,
56}; 56};
57 57
58void omapfb_set_platform_data(struct omapfb_platform_data *data)
59{
60}
61
58static inline int ranges_overlap(unsigned long start1, unsigned long size1, 62static inline int ranges_overlap(unsigned long start1, unsigned long size1,
59 unsigned long start2, unsigned long size2) 63 unsigned long start2, unsigned long size2)
60{ 64{
@@ -327,7 +331,33 @@ static inline int omap_init_fb(void)
327 331
328arch_initcall(omap_init_fb); 332arch_initcall(omap_init_fb);
329 333
330#else 334#elif defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
335
336static u64 omap_fb_dma_mask = ~(u32)0;
337static struct omapfb_platform_data omapfb_config;
338
339static struct platform_device omap_fb_device = {
340 .name = "omapfb",
341 .id = -1,
342 .dev = {
343 .dma_mask = &omap_fb_dma_mask,
344 .coherent_dma_mask = ~(u32)0,
345 .platform_data = &omapfb_config,
346 },
347 .num_resources = 0,
348};
349
350void omapfb_set_platform_data(struct omapfb_platform_data *data)
351{
352 omapfb_config = *data;
353}
354
355static inline int omap_init_fb(void)
356{
357 return platform_device_register(&omap_fb_device);
358}
359
360arch_initcall(omap_init_fb);
331 361
332void omapfb_reserve_sdram(void) {} 362void omapfb_reserve_sdram(void) {}
333unsigned long omapfb_reserve_sram(unsigned long sram_pstart, 363unsigned long omapfb_reserve_sram(unsigned long sram_pstart,
@@ -339,5 +369,20 @@ unsigned long omapfb_reserve_sram(unsigned long sram_pstart,
339 return 0; 369 return 0;
340} 370}
341 371
372#else
373
374void omapfb_set_platform_data(struct omapfb_platform_data *data)
375{
376}
377
378void omapfb_reserve_sdram(void) {}
379unsigned long omapfb_reserve_sram(unsigned long sram_pstart,
380 unsigned long sram_vstart,
381 unsigned long sram_size,
382 unsigned long start_avail,
383 unsigned long size_avail)
384{
385 return 0;
386}
342 387
343#endif 388#endif
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c
index 7c345b757df1..45a225d09125 100644
--- a/arch/arm/plat-omap/gpio.c
+++ b/arch/arm/plat-omap/gpio.c
@@ -31,7 +31,7 @@
31/* 31/*
32 * OMAP1510 GPIO registers 32 * OMAP1510 GPIO registers
33 */ 33 */
34#define OMAP1510_GPIO_BASE OMAP1_IO_ADDRESS(0xfffce000) 34#define OMAP1510_GPIO_BASE 0xfffce000
35#define OMAP1510_GPIO_DATA_INPUT 0x00 35#define OMAP1510_GPIO_DATA_INPUT 0x00
36#define OMAP1510_GPIO_DATA_OUTPUT 0x04 36#define OMAP1510_GPIO_DATA_OUTPUT 0x04
37#define OMAP1510_GPIO_DIR_CONTROL 0x08 37#define OMAP1510_GPIO_DIR_CONTROL 0x08
@@ -45,10 +45,10 @@
45/* 45/*
46 * OMAP1610 specific GPIO registers 46 * OMAP1610 specific GPIO registers
47 */ 47 */
48#define OMAP1610_GPIO1_BASE OMAP1_IO_ADDRESS(0xfffbe400) 48#define OMAP1610_GPIO1_BASE 0xfffbe400
49#define OMAP1610_GPIO2_BASE OMAP1_IO_ADDRESS(0xfffbec00) 49#define OMAP1610_GPIO2_BASE 0xfffbec00
50#define OMAP1610_GPIO3_BASE OMAP1_IO_ADDRESS(0xfffbb400) 50#define OMAP1610_GPIO3_BASE 0xfffbb400
51#define OMAP1610_GPIO4_BASE OMAP1_IO_ADDRESS(0xfffbbc00) 51#define OMAP1610_GPIO4_BASE 0xfffbbc00
52#define OMAP1610_GPIO_REVISION 0x0000 52#define OMAP1610_GPIO_REVISION 0x0000
53#define OMAP1610_GPIO_SYSCONFIG 0x0010 53#define OMAP1610_GPIO_SYSCONFIG 0x0010
54#define OMAP1610_GPIO_SYSSTATUS 0x0014 54#define OMAP1610_GPIO_SYSSTATUS 0x0014
@@ -68,52 +68,36 @@
68#define OMAP1610_GPIO_SET_DATAOUT 0x00f0 68#define OMAP1610_GPIO_SET_DATAOUT 0x00f0
69 69
70/* 70/*
71 * OMAP730 specific GPIO registers 71 * OMAP7XX specific GPIO registers
72 */ 72 */
73#define OMAP730_GPIO1_BASE OMAP1_IO_ADDRESS(0xfffbc000) 73#define OMAP7XX_GPIO1_BASE 0xfffbc000
74#define OMAP730_GPIO2_BASE OMAP1_IO_ADDRESS(0xfffbc800) 74#define OMAP7XX_GPIO2_BASE 0xfffbc800
75#define OMAP730_GPIO3_BASE OMAP1_IO_ADDRESS(0xfffbd000) 75#define OMAP7XX_GPIO3_BASE 0xfffbd000
76#define OMAP730_GPIO4_BASE OMAP1_IO_ADDRESS(0xfffbd800) 76#define OMAP7XX_GPIO4_BASE 0xfffbd800
77#define OMAP730_GPIO5_BASE OMAP1_IO_ADDRESS(0xfffbe000) 77#define OMAP7XX_GPIO5_BASE 0xfffbe000
78#define OMAP730_GPIO6_BASE OMAP1_IO_ADDRESS(0xfffbe800) 78#define OMAP7XX_GPIO6_BASE 0xfffbe800
79#define OMAP730_GPIO_DATA_INPUT 0x00 79#define OMAP7XX_GPIO_DATA_INPUT 0x00
80#define OMAP730_GPIO_DATA_OUTPUT 0x04 80#define OMAP7XX_GPIO_DATA_OUTPUT 0x04
81#define OMAP730_GPIO_DIR_CONTROL 0x08 81#define OMAP7XX_GPIO_DIR_CONTROL 0x08
82#define OMAP730_GPIO_INT_CONTROL 0x0c 82#define OMAP7XX_GPIO_INT_CONTROL 0x0c
83#define OMAP730_GPIO_INT_MASK 0x10 83#define OMAP7XX_GPIO_INT_MASK 0x10
84#define OMAP730_GPIO_INT_STATUS 0x14 84#define OMAP7XX_GPIO_INT_STATUS 0x14
85 85
86/* 86#define OMAP1_MPUIO_VBASE OMAP1_MPUIO_BASE
87 * OMAP850 specific GPIO registers
88 */
89#define OMAP850_GPIO1_BASE OMAP1_IO_ADDRESS(0xfffbc000)
90#define OMAP850_GPIO2_BASE OMAP1_IO_ADDRESS(0xfffbc800)
91#define OMAP850_GPIO3_BASE OMAP1_IO_ADDRESS(0xfffbd000)
92#define OMAP850_GPIO4_BASE OMAP1_IO_ADDRESS(0xfffbd800)
93#define OMAP850_GPIO5_BASE OMAP1_IO_ADDRESS(0xfffbe000)
94#define OMAP850_GPIO6_BASE OMAP1_IO_ADDRESS(0xfffbe800)
95#define OMAP850_GPIO_DATA_INPUT 0x00
96#define OMAP850_GPIO_DATA_OUTPUT 0x04
97#define OMAP850_GPIO_DIR_CONTROL 0x08
98#define OMAP850_GPIO_INT_CONTROL 0x0c
99#define OMAP850_GPIO_INT_MASK 0x10
100#define OMAP850_GPIO_INT_STATUS 0x14
101
102#define OMAP1_MPUIO_VBASE OMAP1_IO_ADDRESS(OMAP1_MPUIO_BASE)
103 87
104/* 88/*
105 * omap24xx specific GPIO registers 89 * omap24xx specific GPIO registers
106 */ 90 */
107#define OMAP242X_GPIO1_BASE OMAP2_IO_ADDRESS(0x48018000) 91#define OMAP242X_GPIO1_BASE 0x48018000
108#define OMAP242X_GPIO2_BASE OMAP2_IO_ADDRESS(0x4801a000) 92#define OMAP242X_GPIO2_BASE 0x4801a000
109#define OMAP242X_GPIO3_BASE OMAP2_IO_ADDRESS(0x4801c000) 93#define OMAP242X_GPIO3_BASE 0x4801c000
110#define OMAP242X_GPIO4_BASE OMAP2_IO_ADDRESS(0x4801e000) 94#define OMAP242X_GPIO4_BASE 0x4801e000
111 95
112#define OMAP243X_GPIO1_BASE OMAP2_IO_ADDRESS(0x4900C000) 96#define OMAP243X_GPIO1_BASE 0x4900C000
113#define OMAP243X_GPIO2_BASE OMAP2_IO_ADDRESS(0x4900E000) 97#define OMAP243X_GPIO2_BASE 0x4900E000
114#define OMAP243X_GPIO3_BASE OMAP2_IO_ADDRESS(0x49010000) 98#define OMAP243X_GPIO3_BASE 0x49010000
115#define OMAP243X_GPIO4_BASE OMAP2_IO_ADDRESS(0x49012000) 99#define OMAP243X_GPIO4_BASE 0x49012000
116#define OMAP243X_GPIO5_BASE OMAP2_IO_ADDRESS(0x480B6000) 100#define OMAP243X_GPIO5_BASE 0x480B6000
117 101
118#define OMAP24XX_GPIO_REVISION 0x0000 102#define OMAP24XX_GPIO_REVISION 0x0000
119#define OMAP24XX_GPIO_SYSCONFIG 0x0010 103#define OMAP24XX_GPIO_SYSCONFIG 0x0010
@@ -170,35 +154,34 @@
170 * omap34xx specific GPIO registers 154 * omap34xx specific GPIO registers
171 */ 155 */
172 156
173#define OMAP34XX_GPIO1_BASE OMAP2_IO_ADDRESS(0x48310000) 157#define OMAP34XX_GPIO1_BASE 0x48310000
174#define OMAP34XX_GPIO2_BASE OMAP2_IO_ADDRESS(0x49050000) 158#define OMAP34XX_GPIO2_BASE 0x49050000
175#define OMAP34XX_GPIO3_BASE OMAP2_IO_ADDRESS(0x49052000) 159#define OMAP34XX_GPIO3_BASE 0x49052000
176#define OMAP34XX_GPIO4_BASE OMAP2_IO_ADDRESS(0x49054000) 160#define OMAP34XX_GPIO4_BASE 0x49054000
177#define OMAP34XX_GPIO5_BASE OMAP2_IO_ADDRESS(0x49056000) 161#define OMAP34XX_GPIO5_BASE 0x49056000
178#define OMAP34XX_GPIO6_BASE OMAP2_IO_ADDRESS(0x49058000) 162#define OMAP34XX_GPIO6_BASE 0x49058000
179 163
180/* 164/*
181 * OMAP44XX specific GPIO registers 165 * OMAP44XX specific GPIO registers
182 */ 166 */
183#define OMAP44XX_GPIO1_BASE OMAP2_IO_ADDRESS(0x4a310000) 167#define OMAP44XX_GPIO1_BASE 0x4a310000
184#define OMAP44XX_GPIO2_BASE OMAP2_IO_ADDRESS(0x48055000) 168#define OMAP44XX_GPIO2_BASE 0x48055000
185#define OMAP44XX_GPIO3_BASE OMAP2_IO_ADDRESS(0x48057000) 169#define OMAP44XX_GPIO3_BASE 0x48057000
186#define OMAP44XX_GPIO4_BASE OMAP2_IO_ADDRESS(0x48059000) 170#define OMAP44XX_GPIO4_BASE 0x48059000
187#define OMAP44XX_GPIO5_BASE OMAP2_IO_ADDRESS(0x4805B000) 171#define OMAP44XX_GPIO5_BASE 0x4805B000
188#define OMAP44XX_GPIO6_BASE OMAP2_IO_ADDRESS(0x4805D000) 172#define OMAP44XX_GPIO6_BASE 0x4805D000
189 173
190struct gpio_bank { 174struct gpio_bank {
175 unsigned long pbase;
191 void __iomem *base; 176 void __iomem *base;
192 u16 irq; 177 u16 irq;
193 u16 virtual_irq_start; 178 u16 virtual_irq_start;
194 int method; 179 int method;
195#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || \ 180#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
196 defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP4)
197 u32 suspend_wakeup; 181 u32 suspend_wakeup;
198 u32 saved_wakeup; 182 u32 saved_wakeup;
199#endif 183#endif
200#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ 184#ifdef CONFIG_ARCH_OMAP2PLUS
201 defined(CONFIG_ARCH_OMAP4)
202 u32 non_wakeup_gpios; 185 u32 non_wakeup_gpios;
203 u32 enabled_non_wakeup_gpios; 186 u32 enabled_non_wakeup_gpios;
204 187
@@ -207,107 +190,142 @@ struct gpio_bank {
207 u32 saved_risingdetect; 190 u32 saved_risingdetect;
208#endif 191#endif
209 u32 level_mask; 192 u32 level_mask;
193 u32 toggle_mask;
210 spinlock_t lock; 194 spinlock_t lock;
211 struct gpio_chip chip; 195 struct gpio_chip chip;
212 struct clk *dbck; 196 struct clk *dbck;
197 u32 mod_usage;
213}; 198};
214 199
215#define METHOD_MPUIO 0 200#define METHOD_MPUIO 0
216#define METHOD_GPIO_1510 1 201#define METHOD_GPIO_1510 1
217#define METHOD_GPIO_1610 2 202#define METHOD_GPIO_1610 2
218#define METHOD_GPIO_730 3 203#define METHOD_GPIO_7XX 3
219#define METHOD_GPIO_850 4
220#define METHOD_GPIO_24XX 5 204#define METHOD_GPIO_24XX 5
205#define METHOD_GPIO_44XX 6
221 206
222#ifdef CONFIG_ARCH_OMAP16XX 207#ifdef CONFIG_ARCH_OMAP16XX
223static struct gpio_bank gpio_bank_1610[5] = { 208static struct gpio_bank gpio_bank_1610[5] = {
224 { OMAP1_MPUIO_VBASE, INT_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO}, 209 { OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE,
225 { OMAP1610_GPIO1_BASE, INT_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_1610 }, 210 METHOD_MPUIO },
226 { OMAP1610_GPIO2_BASE, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16, METHOD_GPIO_1610 }, 211 { OMAP1610_GPIO1_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE,
227 { OMAP1610_GPIO3_BASE, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32, METHOD_GPIO_1610 }, 212 METHOD_GPIO_1610 },
228 { OMAP1610_GPIO4_BASE, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48, METHOD_GPIO_1610 }, 213 { OMAP1610_GPIO2_BASE, NULL, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16,
214 METHOD_GPIO_1610 },
215 { OMAP1610_GPIO3_BASE, NULL, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32,
216 METHOD_GPIO_1610 },
217 { OMAP1610_GPIO4_BASE, NULL, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48,
218 METHOD_GPIO_1610 },
229}; 219};
230#endif 220#endif
231 221
232#ifdef CONFIG_ARCH_OMAP15XX 222#ifdef CONFIG_ARCH_OMAP15XX
233static struct gpio_bank gpio_bank_1510[2] = { 223static struct gpio_bank gpio_bank_1510[2] = {
234 { OMAP1_MPUIO_VBASE, INT_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO }, 224 { OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE,
235 { OMAP1510_GPIO_BASE, INT_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_1510 } 225 METHOD_MPUIO },
236}; 226 { OMAP1510_GPIO_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE,
237#endif 227 METHOD_GPIO_1510 }
238
239#ifdef CONFIG_ARCH_OMAP730
240static struct gpio_bank gpio_bank_730[7] = {
241 { OMAP1_MPUIO_VBASE, INT_730_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO },
242 { OMAP730_GPIO1_BASE, INT_730_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_730 },
243 { OMAP730_GPIO2_BASE, INT_730_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_730 },
244 { OMAP730_GPIO3_BASE, INT_730_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_730 },
245 { OMAP730_GPIO4_BASE, INT_730_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_730 },
246 { OMAP730_GPIO5_BASE, INT_730_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_730 },
247 { OMAP730_GPIO6_BASE, INT_730_GPIO_BANK6, IH_GPIO_BASE + 160, METHOD_GPIO_730 },
248}; 228};
249#endif 229#endif
250 230
251#ifdef CONFIG_ARCH_OMAP850 231#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
252static struct gpio_bank gpio_bank_850[7] = { 232static struct gpio_bank gpio_bank_7xx[7] = {
253 { OMAP1_MPUIO_VBASE, INT_850_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO }, 233 { OMAP1_MPUIO_VBASE, NULL, INT_7XX_MPUIO, IH_MPUIO_BASE,
254 { OMAP850_GPIO1_BASE, INT_850_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_850 }, 234 METHOD_MPUIO },
255 { OMAP850_GPIO2_BASE, INT_850_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_850 }, 235 { OMAP7XX_GPIO1_BASE, NULL, INT_7XX_GPIO_BANK1, IH_GPIO_BASE,
256 { OMAP850_GPIO3_BASE, INT_850_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_850 }, 236 METHOD_GPIO_7XX },
257 { OMAP850_GPIO4_BASE, INT_850_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_850 }, 237 { OMAP7XX_GPIO2_BASE, NULL, INT_7XX_GPIO_BANK2, IH_GPIO_BASE + 32,
258 { OMAP850_GPIO5_BASE, INT_850_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_850 }, 238 METHOD_GPIO_7XX },
259 { OMAP850_GPIO6_BASE, INT_850_GPIO_BANK6, IH_GPIO_BASE + 160, METHOD_GPIO_850 }, 239 { OMAP7XX_GPIO3_BASE, NULL, INT_7XX_GPIO_BANK3, IH_GPIO_BASE + 64,
240 METHOD_GPIO_7XX },
241 { OMAP7XX_GPIO4_BASE, NULL, INT_7XX_GPIO_BANK4, IH_GPIO_BASE + 96,
242 METHOD_GPIO_7XX },
243 { OMAP7XX_GPIO5_BASE, NULL, INT_7XX_GPIO_BANK5, IH_GPIO_BASE + 128,
244 METHOD_GPIO_7XX },
245 { OMAP7XX_GPIO6_BASE, NULL, INT_7XX_GPIO_BANK6, IH_GPIO_BASE + 160,
246 METHOD_GPIO_7XX },
260}; 247};
261#endif 248#endif
262 249
263 250#ifdef CONFIG_ARCH_OMAP2
264#ifdef CONFIG_ARCH_OMAP24XX
265 251
266static struct gpio_bank gpio_bank_242x[4] = { 252static struct gpio_bank gpio_bank_242x[4] = {
267 { OMAP242X_GPIO1_BASE, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_24XX }, 253 { OMAP242X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE,
268 { OMAP242X_GPIO2_BASE, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_24XX }, 254 METHOD_GPIO_24XX },
269 { OMAP242X_GPIO3_BASE, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_24XX }, 255 { OMAP242X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32,
270 { OMAP242X_GPIO4_BASE, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_24XX }, 256 METHOD_GPIO_24XX },
257 { OMAP242X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64,
258 METHOD_GPIO_24XX },
259 { OMAP242X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96,
260 METHOD_GPIO_24XX },
271}; 261};
272 262
273static struct gpio_bank gpio_bank_243x[5] = { 263static struct gpio_bank gpio_bank_243x[5] = {
274 { OMAP243X_GPIO1_BASE, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_24XX }, 264 { OMAP243X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE,
275 { OMAP243X_GPIO2_BASE, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_24XX }, 265 METHOD_GPIO_24XX },
276 { OMAP243X_GPIO3_BASE, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_24XX }, 266 { OMAP243X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32,
277 { OMAP243X_GPIO4_BASE, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_24XX }, 267 METHOD_GPIO_24XX },
278 { OMAP243X_GPIO5_BASE, INT_24XX_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_24XX }, 268 { OMAP243X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64,
269 METHOD_GPIO_24XX },
270 { OMAP243X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96,
271 METHOD_GPIO_24XX },
272 { OMAP243X_GPIO5_BASE, NULL, INT_24XX_GPIO_BANK5, IH_GPIO_BASE + 128,
273 METHOD_GPIO_24XX },
279}; 274};
280 275
281#endif 276#endif
282 277
283#ifdef CONFIG_ARCH_OMAP34XX 278#ifdef CONFIG_ARCH_OMAP3
284static struct gpio_bank gpio_bank_34xx[6] = { 279static struct gpio_bank gpio_bank_34xx[6] = {
285 { OMAP34XX_GPIO1_BASE, INT_34XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_24XX }, 280 { OMAP34XX_GPIO1_BASE, NULL, INT_34XX_GPIO_BANK1, IH_GPIO_BASE,
286 { OMAP34XX_GPIO2_BASE, INT_34XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_24XX },
287 { OMAP34XX_GPIO3_BASE, INT_34XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_24XX },
288 { OMAP34XX_GPIO4_BASE, INT_34XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_24XX },
289 { OMAP34XX_GPIO5_BASE, INT_34XX_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_24XX },
290 { OMAP34XX_GPIO6_BASE, INT_34XX_GPIO_BANK6, IH_GPIO_BASE + 160, METHOD_GPIO_24XX },
291};
292
293#endif
294
295#ifdef CONFIG_ARCH_OMAP4
296static struct gpio_bank gpio_bank_44xx[6] = {
297 { OMAP44XX_GPIO1_BASE, INT_44XX_GPIO_BANK1, IH_GPIO_BASE, \
298 METHOD_GPIO_24XX }, 281 METHOD_GPIO_24XX },
299 { OMAP44XX_GPIO2_BASE, INT_44XX_GPIO_BANK2, IH_GPIO_BASE + 32, \ 282 { OMAP34XX_GPIO2_BASE, NULL, INT_34XX_GPIO_BANK2, IH_GPIO_BASE + 32,
300 METHOD_GPIO_24XX }, 283 METHOD_GPIO_24XX },
301 { OMAP44XX_GPIO3_BASE, INT_44XX_GPIO_BANK3, IH_GPIO_BASE + 64, \ 284 { OMAP34XX_GPIO3_BASE, NULL, INT_34XX_GPIO_BANK3, IH_GPIO_BASE + 64,
302 METHOD_GPIO_24XX }, 285 METHOD_GPIO_24XX },
303 { OMAP44XX_GPIO4_BASE, INT_44XX_GPIO_BANK4, IH_GPIO_BASE + 96, \ 286 { OMAP34XX_GPIO4_BASE, NULL, INT_34XX_GPIO_BANK4, IH_GPIO_BASE + 96,
304 METHOD_GPIO_24XX }, 287 METHOD_GPIO_24XX },
305 { OMAP44XX_GPIO5_BASE, INT_44XX_GPIO_BANK5, IH_GPIO_BASE + 128, \ 288 { OMAP34XX_GPIO5_BASE, NULL, INT_34XX_GPIO_BANK5, IH_GPIO_BASE + 128,
306 METHOD_GPIO_24XX }, 289 METHOD_GPIO_24XX },
307 { OMAP44XX_GPIO6_BASE, INT_44XX_GPIO_BANK6, IH_GPIO_BASE + 160, \ 290 { OMAP34XX_GPIO6_BASE, NULL, INT_34XX_GPIO_BANK6, IH_GPIO_BASE + 160,
308 METHOD_GPIO_24XX }, 291 METHOD_GPIO_24XX },
309}; 292};
310 293
294struct omap3_gpio_regs {
295 u32 sysconfig;
296 u32 irqenable1;
297 u32 irqenable2;
298 u32 wake_en;
299 u32 ctrl;
300 u32 oe;
301 u32 leveldetect0;
302 u32 leveldetect1;
303 u32 risingdetect;
304 u32 fallingdetect;
305 u32 dataout;
306 u32 setwkuena;
307 u32 setdataout;
308};
309
310static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS];
311#endif
312
313#ifdef CONFIG_ARCH_OMAP4
314static struct gpio_bank gpio_bank_44xx[6] = {
315 { OMAP44XX_GPIO1_BASE, NULL, OMAP44XX_IRQ_GPIO1, IH_GPIO_BASE,
316 METHOD_GPIO_44XX },
317 { OMAP44XX_GPIO2_BASE, NULL, OMAP44XX_IRQ_GPIO2, IH_GPIO_BASE + 32,
318 METHOD_GPIO_44XX },
319 { OMAP44XX_GPIO3_BASE, NULL, OMAP44XX_IRQ_GPIO3, IH_GPIO_BASE + 64,
320 METHOD_GPIO_44XX },
321 { OMAP44XX_GPIO4_BASE, NULL, OMAP44XX_IRQ_GPIO4, IH_GPIO_BASE + 96,
322 METHOD_GPIO_44XX },
323 { OMAP44XX_GPIO5_BASE, NULL, OMAP44XX_IRQ_GPIO5, IH_GPIO_BASE + 128,
324 METHOD_GPIO_44XX },
325 { OMAP44XX_GPIO6_BASE, NULL, OMAP44XX_IRQ_GPIO6, IH_GPIO_BASE + 160,
326 METHOD_GPIO_44XX },
327};
328
311#endif 329#endif
312 330
313static struct gpio_bank *gpio_bank; 331static struct gpio_bank *gpio_bank;
@@ -402,23 +420,18 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
402 reg += OMAP1610_GPIO_DIRECTION; 420 reg += OMAP1610_GPIO_DIRECTION;
403 break; 421 break;
404#endif 422#endif
405#ifdef CONFIG_ARCH_OMAP730 423#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
406 case METHOD_GPIO_730: 424 case METHOD_GPIO_7XX:
407 reg += OMAP730_GPIO_DIR_CONTROL; 425 reg += OMAP7XX_GPIO_DIR_CONTROL;
408 break;
409#endif
410#ifdef CONFIG_ARCH_OMAP850
411 case METHOD_GPIO_850:
412 reg += OMAP850_GPIO_DIR_CONTROL;
413 break; 426 break;
414#endif 427#endif
415#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 428#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
416 case METHOD_GPIO_24XX: 429 case METHOD_GPIO_24XX:
417 reg += OMAP24XX_GPIO_OE; 430 reg += OMAP24XX_GPIO_OE;
418 break; 431 break;
419#endif 432#endif
420#if defined(CONFIG_ARCH_OMAP4) 433#if defined(CONFIG_ARCH_OMAP4)
421 case METHOD_GPIO_24XX: 434 case METHOD_GPIO_44XX:
422 reg += OMAP4_GPIO_OE; 435 reg += OMAP4_GPIO_OE;
423 break; 436 break;
424#endif 437#endif
@@ -469,9 +482,9 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)
469 l = 1 << gpio; 482 l = 1 << gpio;
470 break; 483 break;
471#endif 484#endif
472#ifdef CONFIG_ARCH_OMAP730 485#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
473 case METHOD_GPIO_730: 486 case METHOD_GPIO_7XX:
474 reg += OMAP730_GPIO_DATA_OUTPUT; 487 reg += OMAP7XX_GPIO_DATA_OUTPUT;
475 l = __raw_readl(reg); 488 l = __raw_readl(reg);
476 if (enable) 489 if (enable)
477 l |= 1 << gpio; 490 l |= 1 << gpio;
@@ -479,17 +492,7 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)
479 l &= ~(1 << gpio); 492 l &= ~(1 << gpio);
480 break; 493 break;
481#endif 494#endif
482#ifdef CONFIG_ARCH_OMAP850 495#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
483 case METHOD_GPIO_850:
484 reg += OMAP850_GPIO_DATA_OUTPUT;
485 l = __raw_readl(reg);
486 if (enable)
487 l |= 1 << gpio;
488 else
489 l &= ~(1 << gpio);
490 break;
491#endif
492#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
493 case METHOD_GPIO_24XX: 496 case METHOD_GPIO_24XX:
494 if (enable) 497 if (enable)
495 reg += OMAP24XX_GPIO_SETDATAOUT; 498 reg += OMAP24XX_GPIO_SETDATAOUT;
@@ -499,7 +502,7 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)
499 break; 502 break;
500#endif 503#endif
501#ifdef CONFIG_ARCH_OMAP4 504#ifdef CONFIG_ARCH_OMAP4
502 case METHOD_GPIO_24XX: 505 case METHOD_GPIO_44XX:
503 if (enable) 506 if (enable)
504 reg += OMAP4_GPIO_SETDATAOUT; 507 reg += OMAP4_GPIO_SETDATAOUT;
505 else 508 else
@@ -537,23 +540,18 @@ static int _get_gpio_datain(struct gpio_bank *bank, int gpio)
537 reg += OMAP1610_GPIO_DATAIN; 540 reg += OMAP1610_GPIO_DATAIN;
538 break; 541 break;
539#endif 542#endif
540#ifdef CONFIG_ARCH_OMAP730 543#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
541 case METHOD_GPIO_730: 544 case METHOD_GPIO_7XX:
542 reg += OMAP730_GPIO_DATA_INPUT; 545 reg += OMAP7XX_GPIO_DATA_INPUT;
543 break; 546 break;
544#endif 547#endif
545#ifdef CONFIG_ARCH_OMAP850 548#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
546 case METHOD_GPIO_850:
547 reg += OMAP850_GPIO_DATA_INPUT;
548 break;
549#endif
550#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
551 case METHOD_GPIO_24XX: 549 case METHOD_GPIO_24XX:
552 reg += OMAP24XX_GPIO_DATAIN; 550 reg += OMAP24XX_GPIO_DATAIN;
553 break; 551 break;
554#endif 552#endif
555#ifdef CONFIG_ARCH_OMAP4 553#ifdef CONFIG_ARCH_OMAP4
556 case METHOD_GPIO_24XX: 554 case METHOD_GPIO_44XX:
557 reg += OMAP4_GPIO_DATAIN; 555 reg += OMAP4_GPIO_DATAIN;
558 break; 556 break;
559#endif 557#endif
@@ -588,19 +586,14 @@ static int _get_gpio_dataout(struct gpio_bank *bank, int gpio)
588 reg += OMAP1610_GPIO_DATAOUT; 586 reg += OMAP1610_GPIO_DATAOUT;
589 break; 587 break;
590#endif 588#endif
591#ifdef CONFIG_ARCH_OMAP730 589#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
592 case METHOD_GPIO_730: 590 case METHOD_GPIO_7XX:
593 reg += OMAP730_GPIO_DATA_OUTPUT; 591 reg += OMAP7XX_GPIO_DATA_OUTPUT;
594 break; 592 break;
595#endif 593#endif
596#ifdef CONFIG_ARCH_OMAP850 594#ifdef CONFIG_ARCH_OMAP2PLUS
597 case METHOD_GPIO_850:
598 reg += OMAP850_GPIO_DATA_OUTPUT;
599 break;
600#endif
601#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \
602 defined(CONFIG_ARCH_OMAP4)
603 case METHOD_GPIO_24XX: 595 case METHOD_GPIO_24XX:
596 case METHOD_GPIO_44XX:
604 reg += OMAP24XX_GPIO_DATAOUT; 597 reg += OMAP24XX_GPIO_DATAOUT;
605 break; 598 break;
606#endif 599#endif
@@ -631,11 +624,16 @@ void omap_set_gpio_debounce(int gpio, int enable)
631 624
632 bank = get_gpio_bank(gpio); 625 bank = get_gpio_bank(gpio);
633 reg = bank->base; 626 reg = bank->base;
634#ifdef CONFIG_ARCH_OMAP4 627
635 reg += OMAP4_GPIO_DEBOUNCENABLE; 628 if (cpu_is_omap44xx())
636#else 629 reg += OMAP4_GPIO_DEBOUNCENABLE;
637 reg += OMAP24XX_GPIO_DEBOUNCE_EN; 630 else
638#endif 631 reg += OMAP24XX_GPIO_DEBOUNCE_EN;
632
633 if (!(bank->mod_usage & l)) {
634 printk(KERN_ERR "GPIO %d not requested\n", gpio);
635 return;
636 }
639 637
640 spin_lock_irqsave(&bank->lock, flags); 638 spin_lock_irqsave(&bank->lock, flags);
641 val = __raw_readl(reg); 639 val = __raw_readl(reg);
@@ -671,18 +669,23 @@ void omap_set_gpio_debounce_time(int gpio, int enc_time)
671 bank = get_gpio_bank(gpio); 669 bank = get_gpio_bank(gpio);
672 reg = bank->base; 670 reg = bank->base;
673 671
672 if (!bank->mod_usage) {
673 printk(KERN_ERR "GPIO not requested\n");
674 return;
675 }
676
674 enc_time &= 0xff; 677 enc_time &= 0xff;
675#ifdef CONFIG_ARCH_OMAP4 678
676 reg += OMAP4_GPIO_DEBOUNCINGTIME; 679 if (cpu_is_omap44xx())
677#else 680 reg += OMAP4_GPIO_DEBOUNCINGTIME;
678 reg += OMAP24XX_GPIO_DEBOUNCE_VAL; 681 else
679#endif 682 reg += OMAP24XX_GPIO_DEBOUNCE_VAL;
683
680 __raw_writel(enc_time, reg); 684 __raw_writel(enc_time, reg);
681} 685}
682EXPORT_SYMBOL(omap_set_gpio_debounce_time); 686EXPORT_SYMBOL(omap_set_gpio_debounce_time);
683 687
684#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ 688#ifdef CONFIG_ARCH_OMAP2PLUS
685 defined(CONFIG_ARCH_OMAP4)
686static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, 689static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
687 int trigger) 690 int trigger)
688{ 691{
@@ -747,6 +750,44 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
747} 750}
748#endif 751#endif
749 752
753#ifdef CONFIG_ARCH_OMAP1
754/*
755 * This only applies to chips that can't do both rising and falling edge
756 * detection at once. For all other chips, this function is a noop.
757 */
758static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
759{
760 void __iomem *reg = bank->base;
761 u32 l = 0;
762
763 switch (bank->method) {
764 case METHOD_MPUIO:
765 reg += OMAP_MPUIO_GPIO_INT_EDGE;
766 break;
767#ifdef CONFIG_ARCH_OMAP15XX
768 case METHOD_GPIO_1510:
769 reg += OMAP1510_GPIO_INT_CONTROL;
770 break;
771#endif
772#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
773 case METHOD_GPIO_7XX:
774 reg += OMAP7XX_GPIO_INT_CONTROL;
775 break;
776#endif
777 default:
778 return;
779 }
780
781 l = __raw_readl(reg);
782 if ((l >> gpio) & 1)
783 l &= ~(1 << gpio);
784 else
785 l |= 1 << gpio;
786
787 __raw_writel(l, reg);
788}
789#endif
790
750static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) 791static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
751{ 792{
752 void __iomem *reg = bank->base; 793 void __iomem *reg = bank->base;
@@ -757,6 +798,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
757 case METHOD_MPUIO: 798 case METHOD_MPUIO:
758 reg += OMAP_MPUIO_GPIO_INT_EDGE; 799 reg += OMAP_MPUIO_GPIO_INT_EDGE;
759 l = __raw_readl(reg); 800 l = __raw_readl(reg);
801 if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
802 bank->toggle_mask |= 1 << gpio;
760 if (trigger & IRQ_TYPE_EDGE_RISING) 803 if (trigger & IRQ_TYPE_EDGE_RISING)
761 l |= 1 << gpio; 804 l |= 1 << gpio;
762 else if (trigger & IRQ_TYPE_EDGE_FALLING) 805 else if (trigger & IRQ_TYPE_EDGE_FALLING)
@@ -769,6 +812,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
769 case METHOD_GPIO_1510: 812 case METHOD_GPIO_1510:
770 reg += OMAP1510_GPIO_INT_CONTROL; 813 reg += OMAP1510_GPIO_INT_CONTROL;
771 l = __raw_readl(reg); 814 l = __raw_readl(reg);
815 if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
816 bank->toggle_mask |= 1 << gpio;
772 if (trigger & IRQ_TYPE_EDGE_RISING) 817 if (trigger & IRQ_TYPE_EDGE_RISING)
773 l |= 1 << gpio; 818 l |= 1 << gpio;
774 else if (trigger & IRQ_TYPE_EDGE_FALLING) 819 else if (trigger & IRQ_TYPE_EDGE_FALLING)
@@ -797,22 +842,12 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
797 __raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA); 842 __raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA);
798 break; 843 break;
799#endif 844#endif
800#ifdef CONFIG_ARCH_OMAP730 845#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
801 case METHOD_GPIO_730: 846 case METHOD_GPIO_7XX:
802 reg += OMAP730_GPIO_INT_CONTROL; 847 reg += OMAP7XX_GPIO_INT_CONTROL;
803 l = __raw_readl(reg);
804 if (trigger & IRQ_TYPE_EDGE_RISING)
805 l |= 1 << gpio;
806 else if (trigger & IRQ_TYPE_EDGE_FALLING)
807 l &= ~(1 << gpio);
808 else
809 goto bad;
810 break;
811#endif
812#ifdef CONFIG_ARCH_OMAP850
813 case METHOD_GPIO_850:
814 reg += OMAP850_GPIO_INT_CONTROL;
815 l = __raw_readl(reg); 848 l = __raw_readl(reg);
849 if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
850 bank->toggle_mask |= 1 << gpio;
816 if (trigger & IRQ_TYPE_EDGE_RISING) 851 if (trigger & IRQ_TYPE_EDGE_RISING)
817 l |= 1 << gpio; 852 l |= 1 << gpio;
818 else if (trigger & IRQ_TYPE_EDGE_FALLING) 853 else if (trigger & IRQ_TYPE_EDGE_FALLING)
@@ -821,9 +856,9 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
821 goto bad; 856 goto bad;
822 break; 857 break;
823#endif 858#endif
824#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ 859#ifdef CONFIG_ARCH_OMAP2PLUS
825 defined(CONFIG_ARCH_OMAP4)
826 case METHOD_GPIO_24XX: 860 case METHOD_GPIO_24XX:
861 case METHOD_GPIO_44XX:
827 set_24xx_gpio_triggering(bank, gpio, trigger); 862 set_24xx_gpio_triggering(bank, gpio, trigger);
828 break; 863 break;
829#endif 864#endif
@@ -897,23 +932,18 @@ static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
897 reg += OMAP1610_GPIO_IRQSTATUS1; 932 reg += OMAP1610_GPIO_IRQSTATUS1;
898 break; 933 break;
899#endif 934#endif
900#ifdef CONFIG_ARCH_OMAP730 935#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
901 case METHOD_GPIO_730: 936 case METHOD_GPIO_7XX:
902 reg += OMAP730_GPIO_INT_STATUS; 937 reg += OMAP7XX_GPIO_INT_STATUS;
903 break;
904#endif
905#ifdef CONFIG_ARCH_OMAP850
906 case METHOD_GPIO_850:
907 reg += OMAP850_GPIO_INT_STATUS;
908 break; 938 break;
909#endif 939#endif
910#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 940#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
911 case METHOD_GPIO_24XX: 941 case METHOD_GPIO_24XX:
912 reg += OMAP24XX_GPIO_IRQSTATUS1; 942 reg += OMAP24XX_GPIO_IRQSTATUS1;
913 break; 943 break;
914#endif 944#endif
915#if defined(CONFIG_ARCH_OMAP4) 945#if defined(CONFIG_ARCH_OMAP4)
916 case METHOD_GPIO_24XX: 946 case METHOD_GPIO_44XX:
917 reg += OMAP4_GPIO_IRQSTATUS0; 947 reg += OMAP4_GPIO_IRQSTATUS0;
918 break; 948 break;
919#endif 949#endif
@@ -924,12 +954,11 @@ static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
924 __raw_writel(gpio_mask, reg); 954 __raw_writel(gpio_mask, reg);
925 955
926 /* Workaround for clearing DSP GPIO interrupts to allow retention */ 956 /* Workaround for clearing DSP GPIO interrupts to allow retention */
927#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 957 if (cpu_is_omap24xx() || cpu_is_omap34xx())
928 reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2; 958 reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2;
929#endif 959 else if (cpu_is_omap44xx())
930#if defined(CONFIG_ARCH_OMAP4) 960 reg = bank->base + OMAP4_GPIO_IRQSTATUS1;
931 reg = bank->base + OMAP4_GPIO_IRQSTATUS1; 961
932#endif
933 if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { 962 if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) {
934 __raw_writel(gpio_mask, reg); 963 __raw_writel(gpio_mask, reg);
935 964
@@ -971,28 +1000,21 @@ static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
971 mask = 0xffff; 1000 mask = 0xffff;
972 break; 1001 break;
973#endif 1002#endif
974#ifdef CONFIG_ARCH_OMAP730 1003#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
975 case METHOD_GPIO_730: 1004 case METHOD_GPIO_7XX:
976 reg += OMAP730_GPIO_INT_MASK; 1005 reg += OMAP7XX_GPIO_INT_MASK;
977 mask = 0xffffffff; 1006 mask = 0xffffffff;
978 inv = 1; 1007 inv = 1;
979 break; 1008 break;
980#endif 1009#endif
981#ifdef CONFIG_ARCH_OMAP850 1010#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
982 case METHOD_GPIO_850:
983 reg += OMAP850_GPIO_INT_MASK;
984 mask = 0xffffffff;
985 inv = 1;
986 break;
987#endif
988#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
989 case METHOD_GPIO_24XX: 1011 case METHOD_GPIO_24XX:
990 reg += OMAP24XX_GPIO_IRQENABLE1; 1012 reg += OMAP24XX_GPIO_IRQENABLE1;
991 mask = 0xffffffff; 1013 mask = 0xffffffff;
992 break; 1014 break;
993#endif 1015#endif
994#if defined(CONFIG_ARCH_OMAP4) 1016#if defined(CONFIG_ARCH_OMAP4)
995 case METHOD_GPIO_24XX: 1017 case METHOD_GPIO_44XX:
996 reg += OMAP4_GPIO_IRQSTATUSSET0; 1018 reg += OMAP4_GPIO_IRQSTATUSSET0;
997 mask = 0xffffffff; 1019 mask = 0xffffffff;
998 break; 1020 break;
@@ -1044,9 +1066,9 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab
1044 l = gpio_mask; 1066 l = gpio_mask;
1045 break; 1067 break;
1046#endif 1068#endif
1047#ifdef CONFIG_ARCH_OMAP730 1069#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
1048 case METHOD_GPIO_730: 1070 case METHOD_GPIO_7XX:
1049 reg += OMAP730_GPIO_INT_MASK; 1071 reg += OMAP7XX_GPIO_INT_MASK;
1050 l = __raw_readl(reg); 1072 l = __raw_readl(reg);
1051 if (enable) 1073 if (enable)
1052 l &= ~(gpio_mask); 1074 l &= ~(gpio_mask);
@@ -1054,17 +1076,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab
1054 l |= gpio_mask; 1076 l |= gpio_mask;
1055 break; 1077 break;
1056#endif 1078#endif
1057#ifdef CONFIG_ARCH_OMAP850 1079#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1058 case METHOD_GPIO_850:
1059 reg += OMAP850_GPIO_INT_MASK;
1060 l = __raw_readl(reg);
1061 if (enable)
1062 l &= ~(gpio_mask);
1063 else
1064 l |= gpio_mask;
1065 break;
1066#endif
1067#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
1068 case METHOD_GPIO_24XX: 1080 case METHOD_GPIO_24XX:
1069 if (enable) 1081 if (enable)
1070 reg += OMAP24XX_GPIO_SETIRQENABLE1; 1082 reg += OMAP24XX_GPIO_SETIRQENABLE1;
@@ -1074,7 +1086,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab
1074 break; 1086 break;
1075#endif 1087#endif
1076#ifdef CONFIG_ARCH_OMAP4 1088#ifdef CONFIG_ARCH_OMAP4
1077 case METHOD_GPIO_24XX: 1089 case METHOD_GPIO_44XX:
1078 if (enable) 1090 if (enable)
1079 reg += OMAP4_GPIO_IRQSTATUSSET0; 1091 reg += OMAP4_GPIO_IRQSTATUSSET0;
1080 else 1092 else
@@ -1104,7 +1116,7 @@ static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int ena
1104 */ 1116 */
1105static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) 1117static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
1106{ 1118{
1107 unsigned long flags; 1119 unsigned long uninitialized_var(flags);
1108 1120
1109 switch (bank->method) { 1121 switch (bank->method) {
1110#ifdef CONFIG_ARCH_OMAP16XX 1122#ifdef CONFIG_ARCH_OMAP16XX
@@ -1118,9 +1130,9 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
1118 spin_unlock_irqrestore(&bank->lock, flags); 1130 spin_unlock_irqrestore(&bank->lock, flags);
1119 return 0; 1131 return 0;
1120#endif 1132#endif
1121#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ 1133#ifdef CONFIG_ARCH_OMAP2PLUS
1122 defined(CONFIG_ARCH_OMAP4)
1123 case METHOD_GPIO_24XX: 1134 case METHOD_GPIO_24XX:
1135 case METHOD_GPIO_44XX:
1124 if (bank->non_wakeup_gpios & (1 << gpio)) { 1136 if (bank->non_wakeup_gpios & (1 << gpio)) {
1125 printk(KERN_ERR "Unable to modify wakeup on " 1137 printk(KERN_ERR "Unable to modify wakeup on "
1126 "non-wakeup GPIO%d\n", 1138 "non-wakeup GPIO%d\n",
@@ -1186,6 +1198,16 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
1186 __raw_writel(__raw_readl(reg) | (1 << offset), reg); 1198 __raw_writel(__raw_readl(reg) | (1 << offset), reg);
1187 } 1199 }
1188#endif 1200#endif
1201 if (!cpu_class_is_omap1()) {
1202 if (!bank->mod_usage) {
1203 u32 ctrl;
1204 ctrl = __raw_readl(bank->base + OMAP24XX_GPIO_CTRL);
1205 ctrl &= 0xFFFFFFFE;
1206 /* Module is enabled, clocks are not gated */
1207 __raw_writel(ctrl, bank->base + OMAP24XX_GPIO_CTRL);
1208 }
1209 bank->mod_usage |= 1 << offset;
1210 }
1189 spin_unlock_irqrestore(&bank->lock, flags); 1211 spin_unlock_irqrestore(&bank->lock, flags);
1190 1212
1191 return 0; 1213 return 0;
@@ -1204,14 +1226,24 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
1204 __raw_writel(1 << offset, reg); 1226 __raw_writel(1 << offset, reg);
1205 } 1227 }
1206#endif 1228#endif
1207#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ 1229#ifdef CONFIG_ARCH_OMAP2PLUS
1208 defined(CONFIG_ARCH_OMAP4) 1230 if ((bank->method == METHOD_GPIO_24XX) ||
1209 if (bank->method == METHOD_GPIO_24XX) { 1231 (bank->method == METHOD_GPIO_44XX)) {
1210 /* Disable wake-up during idle for dynamic tick */ 1232 /* Disable wake-up during idle for dynamic tick */
1211 void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA; 1233 void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
1212 __raw_writel(1 << offset, reg); 1234 __raw_writel(1 << offset, reg);
1213 } 1235 }
1214#endif 1236#endif
1237 if (!cpu_class_is_omap1()) {
1238 bank->mod_usage &= ~(1 << offset);
1239 if (!bank->mod_usage) {
1240 u32 ctrl;
1241 ctrl = __raw_readl(bank->base + OMAP24XX_GPIO_CTRL);
1242 /* Module is disabled, clocks are gated */
1243 ctrl |= 1;
1244 __raw_writel(ctrl, bank->base + OMAP24XX_GPIO_CTRL);
1245 }
1246 }
1215 _reset_gpio(bank, bank->chip.base + offset); 1247 _reset_gpio(bank, bank->chip.base + offset);
1216 spin_unlock_irqrestore(&bank->lock, flags); 1248 spin_unlock_irqrestore(&bank->lock, flags);
1217} 1249}
@@ -1229,7 +1261,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
1229{ 1261{
1230 void __iomem *isr_reg = NULL; 1262 void __iomem *isr_reg = NULL;
1231 u32 isr; 1263 u32 isr;
1232 unsigned int gpio_irq; 1264 unsigned int gpio_irq, gpio_index;
1233 struct gpio_bank *bank; 1265 struct gpio_bank *bank;
1234 u32 retrigger = 0; 1266 u32 retrigger = 0;
1235 int unmasked = 0; 1267 int unmasked = 0;
@@ -1249,20 +1281,16 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
1249 if (bank->method == METHOD_GPIO_1610) 1281 if (bank->method == METHOD_GPIO_1610)
1250 isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1; 1282 isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1;
1251#endif 1283#endif
1252#ifdef CONFIG_ARCH_OMAP730 1284#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
1253 if (bank->method == METHOD_GPIO_730) 1285 if (bank->method == METHOD_GPIO_7XX)
1254 isr_reg = bank->base + OMAP730_GPIO_INT_STATUS; 1286 isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS;
1255#endif
1256#ifdef CONFIG_ARCH_OMAP850
1257 if (bank->method == METHOD_GPIO_850)
1258 isr_reg = bank->base + OMAP850_GPIO_INT_STATUS;
1259#endif 1287#endif
1260#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 1288#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1261 if (bank->method == METHOD_GPIO_24XX) 1289 if (bank->method == METHOD_GPIO_24XX)
1262 isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; 1290 isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1;
1263#endif 1291#endif
1264#if defined(CONFIG_ARCH_OMAP4) 1292#if defined(CONFIG_ARCH_OMAP4)
1265 if (bank->method == METHOD_GPIO_24XX) 1293 if (bank->method == METHOD_GPIO_44XX)
1266 isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0; 1294 isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0;
1267#endif 1295#endif
1268 while(1) { 1296 while(1) {
@@ -1300,9 +1328,23 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
1300 1328
1301 gpio_irq = bank->virtual_irq_start; 1329 gpio_irq = bank->virtual_irq_start;
1302 for (; isr != 0; isr >>= 1, gpio_irq++) { 1330 for (; isr != 0; isr >>= 1, gpio_irq++) {
1331 gpio_index = get_gpio_index(irq_to_gpio(gpio_irq));
1332
1303 if (!(isr & 1)) 1333 if (!(isr & 1))
1304 continue; 1334 continue;
1305 1335
1336#ifdef CONFIG_ARCH_OMAP1
1337 /*
1338 * Some chips can't respond to both rising and falling
1339 * at the same time. If this irq was requested with
1340 * both flags, we need to flip the ICR data for the IRQ
1341 * to respond to the IRQ for the opposite direction.
1342 * This will be indicated in the bank toggle_mask.
1343 */
1344 if (bank->toggle_mask & (1 << gpio_index))
1345 _toggle_gpio_edge_triggering(bank, gpio_index);
1346#endif
1347
1306 generic_handle_irq(gpio_irq); 1348 generic_handle_irq(gpio_irq);
1307 } 1349 }
1308 } 1350 }
@@ -1447,7 +1489,7 @@ static int omap_mpuio_resume_noirq(struct device *dev)
1447 return 0; 1489 return 0;
1448} 1490}
1449 1491
1450static struct dev_pm_ops omap_mpuio_dev_pm_ops = { 1492static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
1451 .suspend_noirq = omap_mpuio_suspend_noirq, 1493 .suspend_noirq = omap_mpuio_suspend_noirq,
1452 .resume_noirq = omap_mpuio_resume_noirq, 1494 .resume_noirq = omap_mpuio_resume_noirq,
1453}; 1495};
@@ -1524,13 +1566,11 @@ static int gpio_is_input(struct gpio_bank *bank, int mask)
1524 case METHOD_GPIO_1610: 1566 case METHOD_GPIO_1610:
1525 reg += OMAP1610_GPIO_DIRECTION; 1567 reg += OMAP1610_GPIO_DIRECTION;
1526 break; 1568 break;
1527 case METHOD_GPIO_730: 1569 case METHOD_GPIO_7XX:
1528 reg += OMAP730_GPIO_DIR_CONTROL; 1570 reg += OMAP7XX_GPIO_DIR_CONTROL;
1529 break;
1530 case METHOD_GPIO_850:
1531 reg += OMAP850_GPIO_DIR_CONTROL;
1532 break; 1571 break;
1533 case METHOD_GPIO_24XX: 1572 case METHOD_GPIO_24XX:
1573 case METHOD_GPIO_44XX:
1534 reg += OMAP24XX_GPIO_OE; 1574 reg += OMAP24XX_GPIO_OE;
1535 break; 1575 break;
1536 } 1576 }
@@ -1590,7 +1630,7 @@ static int gpio_2irq(struct gpio_chip *chip, unsigned offset)
1590/*---------------------------------------------------------------------*/ 1630/*---------------------------------------------------------------------*/
1591 1631
1592static int initialized; 1632static int initialized;
1593#if !(defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)) 1633#if defined(CONFIG_ARCH_OMAP1) || defined(CONFIG_ARCH_OMAP2)
1594static struct clk * gpio_ick; 1634static struct clk * gpio_ick;
1595#endif 1635#endif
1596 1636
@@ -1607,6 +1647,23 @@ static struct clk * gpio5_fck;
1607static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; 1647static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS];
1608#endif 1648#endif
1609 1649
1650static void __init omap_gpio_show_rev(void)
1651{
1652 u32 rev;
1653
1654 if (cpu_is_omap16xx())
1655 rev = __raw_readw(gpio_bank[1].base + OMAP1610_GPIO_REVISION);
1656 else if (cpu_is_omap24xx() || cpu_is_omap34xx())
1657 rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION);
1658 else if (cpu_is_omap44xx())
1659 rev = __raw_readl(gpio_bank[0].base + OMAP4_GPIO_REVISION);
1660 else
1661 return;
1662
1663 printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n",
1664 (rev >> 4) & 0x0f, rev & 0x0f);
1665}
1666
1610/* This lock class tells lockdep that GPIO irqs are in a different 1667/* This lock class tells lockdep that GPIO irqs are in a different
1611 * category than their parents, so it won't report false recursion. 1668 * category than their parents, so it won't report false recursion.
1612 */ 1669 */
@@ -1617,6 +1674,7 @@ static int __init _omap_gpio_init(void)
1617 int i; 1674 int i;
1618 int gpio = 0; 1675 int gpio = 0;
1619 struct gpio_bank *bank; 1676 struct gpio_bank *bank;
1677 int bank_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */
1620 char clk_name[11]; 1678 char clk_name[11];
1621 1679
1622 initialized = 1; 1680 initialized = 1;
@@ -1679,77 +1737,45 @@ static int __init _omap_gpio_init(void)
1679 1737
1680#ifdef CONFIG_ARCH_OMAP15XX 1738#ifdef CONFIG_ARCH_OMAP15XX
1681 if (cpu_is_omap15xx()) { 1739 if (cpu_is_omap15xx()) {
1682 printk(KERN_INFO "OMAP1510 GPIO hardware\n");
1683 gpio_bank_count = 2; 1740 gpio_bank_count = 2;
1684 gpio_bank = gpio_bank_1510; 1741 gpio_bank = gpio_bank_1510;
1742 bank_size = SZ_2K;
1685 } 1743 }
1686#endif 1744#endif
1687#if defined(CONFIG_ARCH_OMAP16XX) 1745#if defined(CONFIG_ARCH_OMAP16XX)
1688 if (cpu_is_omap16xx()) { 1746 if (cpu_is_omap16xx()) {
1689 u32 rev;
1690
1691 gpio_bank_count = 5; 1747 gpio_bank_count = 5;
1692 gpio_bank = gpio_bank_1610; 1748 gpio_bank = gpio_bank_1610;
1693 rev = __raw_readw(gpio_bank[1].base + OMAP1610_GPIO_REVISION); 1749 bank_size = SZ_2K;
1694 printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n",
1695 (rev >> 4) & 0x0f, rev & 0x0f);
1696 }
1697#endif
1698#ifdef CONFIG_ARCH_OMAP730
1699 if (cpu_is_omap730()) {
1700 printk(KERN_INFO "OMAP730 GPIO hardware\n");
1701 gpio_bank_count = 7;
1702 gpio_bank = gpio_bank_730;
1703 } 1750 }
1704#endif 1751#endif
1705#ifdef CONFIG_ARCH_OMAP850 1752#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
1706 if (cpu_is_omap850()) { 1753 if (cpu_is_omap7xx()) {
1707 printk(KERN_INFO "OMAP850 GPIO hardware\n");
1708 gpio_bank_count = 7; 1754 gpio_bank_count = 7;
1709 gpio_bank = gpio_bank_850; 1755 gpio_bank = gpio_bank_7xx;
1756 bank_size = SZ_2K;
1710 } 1757 }
1711#endif 1758#endif
1712 1759#ifdef CONFIG_ARCH_OMAP2
1713#ifdef CONFIG_ARCH_OMAP24XX
1714 if (cpu_is_omap242x()) { 1760 if (cpu_is_omap242x()) {
1715 int rev;
1716
1717 gpio_bank_count = 4; 1761 gpio_bank_count = 4;
1718 gpio_bank = gpio_bank_242x; 1762 gpio_bank = gpio_bank_242x;
1719 rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION);
1720 printk(KERN_INFO "OMAP242x GPIO hardware version %d.%d\n",
1721 (rev >> 4) & 0x0f, rev & 0x0f);
1722 } 1763 }
1723 if (cpu_is_omap243x()) { 1764 if (cpu_is_omap243x()) {
1724 int rev;
1725
1726 gpio_bank_count = 5; 1765 gpio_bank_count = 5;
1727 gpio_bank = gpio_bank_243x; 1766 gpio_bank = gpio_bank_243x;
1728 rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION);
1729 printk(KERN_INFO "OMAP243x GPIO hardware version %d.%d\n",
1730 (rev >> 4) & 0x0f, rev & 0x0f);
1731 } 1767 }
1732#endif 1768#endif
1733#ifdef CONFIG_ARCH_OMAP34XX 1769#ifdef CONFIG_ARCH_OMAP3
1734 if (cpu_is_omap34xx()) { 1770 if (cpu_is_omap34xx()) {
1735 int rev;
1736
1737 gpio_bank_count = OMAP34XX_NR_GPIOS; 1771 gpio_bank_count = OMAP34XX_NR_GPIOS;
1738 gpio_bank = gpio_bank_34xx; 1772 gpio_bank = gpio_bank_34xx;
1739 rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION);
1740 printk(KERN_INFO "OMAP34xx GPIO hardware version %d.%d\n",
1741 (rev >> 4) & 0x0f, rev & 0x0f);
1742 } 1773 }
1743#endif 1774#endif
1744#ifdef CONFIG_ARCH_OMAP4 1775#ifdef CONFIG_ARCH_OMAP4
1745 if (cpu_is_omap44xx()) { 1776 if (cpu_is_omap44xx()) {
1746 int rev;
1747
1748 gpio_bank_count = OMAP34XX_NR_GPIOS; 1777 gpio_bank_count = OMAP34XX_NR_GPIOS;
1749 gpio_bank = gpio_bank_44xx; 1778 gpio_bank = gpio_bank_44xx;
1750 rev = __raw_readl(gpio_bank[0].base + OMAP4_GPIO_REVISION);
1751 printk(KERN_INFO "OMAP44xx GPIO hardware version %d.%d\n",
1752 (rev >> 4) & 0x0f, rev & 0x0f);
1753 } 1779 }
1754#endif 1780#endif
1755 for (i = 0; i < gpio_bank_count; i++) { 1781 for (i = 0; i < gpio_bank_count; i++) {
@@ -1757,6 +1783,14 @@ static int __init _omap_gpio_init(void)
1757 1783
1758 bank = &gpio_bank[i]; 1784 bank = &gpio_bank[i];
1759 spin_lock_init(&bank->lock); 1785 spin_lock_init(&bank->lock);
1786
1787 /* Static mapping, never released */
1788 bank->base = ioremap(bank->pbase, bank_size);
1789 if (!bank->base) {
1790 printk(KERN_ERR "Could not ioremap gpio bank%i\n", i);
1791 continue;
1792 }
1793
1760 if (bank_is_mpuio(bank)) 1794 if (bank_is_mpuio(bank))
1761 __raw_writew(0xffff, bank->base + OMAP_MPUIO_GPIO_MASKIT); 1795 __raw_writew(0xffff, bank->base + OMAP_MPUIO_GPIO_MASKIT);
1762 if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) { 1796 if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) {
@@ -1768,42 +1802,56 @@ static int __init _omap_gpio_init(void)
1768 __raw_writew(0xffff, bank->base + OMAP1610_GPIO_IRQSTATUS1); 1802 __raw_writew(0xffff, bank->base + OMAP1610_GPIO_IRQSTATUS1);
1769 __raw_writew(0x0014, bank->base + OMAP1610_GPIO_SYSCONFIG); 1803 __raw_writew(0x0014, bank->base + OMAP1610_GPIO_SYSCONFIG);
1770 } 1804 }
1771 if (cpu_is_omap7xx() && bank->method == METHOD_GPIO_730) { 1805 if (cpu_is_omap7xx() && bank->method == METHOD_GPIO_7XX) {
1772 __raw_writel(0xffffffff, bank->base + OMAP730_GPIO_INT_MASK); 1806 __raw_writel(0xffffffff, bank->base + OMAP7XX_GPIO_INT_MASK);
1773 __raw_writel(0x00000000, bank->base + OMAP730_GPIO_INT_STATUS); 1807 __raw_writel(0x00000000, bank->base + OMAP7XX_GPIO_INT_STATUS);
1774 1808
1775 gpio_count = 32; /* 730 has 32-bit GPIOs */ 1809 gpio_count = 32; /* 7xx has 32-bit GPIOs */
1776 } 1810 }
1777 1811
1778#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ 1812#ifdef CONFIG_ARCH_OMAP2PLUS
1779 defined(CONFIG_ARCH_OMAP4) 1813 if ((bank->method == METHOD_GPIO_24XX) ||
1780 if (bank->method == METHOD_GPIO_24XX) { 1814 (bank->method == METHOD_GPIO_44XX)) {
1781 static const u32 non_wakeup_gpios[] = { 1815 static const u32 non_wakeup_gpios[] = {
1782 0xe203ffc0, 0x08700040 1816 0xe203ffc0, 0x08700040
1783 }; 1817 };
1784 if (cpu_is_omap44xx()) { 1818
1785 __raw_writel(0xffffffff, bank->base + 1819 if (cpu_is_omap44xx()) {
1820 __raw_writel(0xffffffff, bank->base +
1786 OMAP4_GPIO_IRQSTATUSCLR0); 1821 OMAP4_GPIO_IRQSTATUSCLR0);
1787 __raw_writew(0x0015, bank->base + 1822 __raw_writew(0x0015, bank->base +
1788 OMAP4_GPIO_SYSCONFIG); 1823 OMAP4_GPIO_SYSCONFIG);
1789 __raw_writel(0x00000000, bank->base + 1824 __raw_writel(0x00000000, bank->base +
1790 OMAP4_GPIO_DEBOUNCENABLE); 1825 OMAP4_GPIO_DEBOUNCENABLE);
1791 /* Initialize interface clock ungated, module enabled */ 1826 /*
1792 __raw_writel(0, bank->base + OMAP4_GPIO_CTRL); 1827 * Initialize interface clock ungated,
1793 } else { 1828 * module enabled
1794 __raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_IRQENABLE1); 1829 */
1795 __raw_writel(0xffffffff, bank->base + OMAP24XX_GPIO_IRQSTATUS1); 1830 __raw_writel(0, bank->base + OMAP4_GPIO_CTRL);
1796 __raw_writew(0x0015, bank->base + OMAP24XX_GPIO_SYSCONFIG); 1831 } else {
1797 __raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_DEBOUNCE_EN); 1832 __raw_writel(0x00000000, bank->base +
1798 1833 OMAP24XX_GPIO_IRQENABLE1);
1799 /* Initialize interface clock ungated, module enabled */ 1834 __raw_writel(0xffffffff, bank->base +
1800 __raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL); 1835 OMAP24XX_GPIO_IRQSTATUS1);
1801 } 1836 __raw_writew(0x0015, bank->base +
1837 OMAP24XX_GPIO_SYSCONFIG);
1838 __raw_writel(0x00000000, bank->base +
1839 OMAP24XX_GPIO_DEBOUNCE_EN);
1840
1841 /*
1842 * Initialize interface clock ungated,
1843 * module enabled
1844 */
1845 __raw_writel(0, bank->base +
1846 OMAP24XX_GPIO_CTRL);
1847 }
1802 if (i < ARRAY_SIZE(non_wakeup_gpios)) 1848 if (i < ARRAY_SIZE(non_wakeup_gpios))
1803 bank->non_wakeup_gpios = non_wakeup_gpios[i]; 1849 bank->non_wakeup_gpios = non_wakeup_gpios[i];
1804 gpio_count = 32; 1850 gpio_count = 32;
1805 } 1851 }
1806#endif 1852#endif
1853
1854 bank->mod_usage = 0;
1807 /* REVISIT eventually switch from OMAP-specific gpio structs 1855 /* REVISIT eventually switch from OMAP-specific gpio structs
1808 * over to the generic ones 1856 * over to the generic ones
1809 */ 1857 */
@@ -1862,11 +1910,12 @@ static int __init _omap_gpio_init(void)
1862 if (cpu_is_omap34xx()) 1910 if (cpu_is_omap34xx())
1863 omap_writel(1 << 0, 0x48306814); 1911 omap_writel(1 << 0, 0x48306814);
1864 1912
1913 omap_gpio_show_rev();
1914
1865 return 0; 1915 return 0;
1866} 1916}
1867 1917
1868#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || \ 1918#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
1869 defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP4)
1870static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) 1919static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
1871{ 1920{
1872 int i; 1921 int i;
@@ -1889,7 +1938,7 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
1889 wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; 1938 wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA;
1890 break; 1939 break;
1891#endif 1940#endif
1892#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 1941#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1893 case METHOD_GPIO_24XX: 1942 case METHOD_GPIO_24XX:
1894 wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN; 1943 wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN;
1895 wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; 1944 wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
@@ -1897,7 +1946,7 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
1897 break; 1946 break;
1898#endif 1947#endif
1899#ifdef CONFIG_ARCH_OMAP4 1948#ifdef CONFIG_ARCH_OMAP4
1900 case METHOD_GPIO_24XX: 1949 case METHOD_GPIO_44XX:
1901 wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0; 1950 wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0;
1902 wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; 1951 wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
1903 wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; 1952 wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
@@ -1937,14 +1986,14 @@ static int omap_gpio_resume(struct sys_device *dev)
1937 wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; 1986 wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA;
1938 break; 1987 break;
1939#endif 1988#endif
1940#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 1989#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1941 case METHOD_GPIO_24XX: 1990 case METHOD_GPIO_24XX:
1942 wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; 1991 wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
1943 wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; 1992 wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA;
1944 break; 1993 break;
1945#endif 1994#endif
1946#ifdef CONFIG_ARCH_OMAP4 1995#ifdef CONFIG_ARCH_OMAP4
1947 case METHOD_GPIO_24XX: 1996 case METHOD_GPIO_44XX:
1948 wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; 1997 wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
1949 wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; 1998 wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
1950 break; 1999 break;
@@ -1975,8 +2024,7 @@ static struct sys_device omap_gpio_device = {
1975 2024
1976#endif 2025#endif
1977 2026
1978#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ 2027#ifdef CONFIG_ARCH_OMAP2PLUS
1979 defined(CONFIG_ARCH_OMAP4)
1980 2028
1981static int workaround_enabled; 2029static int workaround_enabled;
1982 2030
@@ -1992,29 +2040,42 @@ void omap2_gpio_prepare_for_retention(void)
1992 2040
1993 if (!(bank->enabled_non_wakeup_gpios)) 2041 if (!(bank->enabled_non_wakeup_gpios))
1994 continue; 2042 continue;
1995#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 2043
1996 bank->saved_datain = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); 2044 if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1997 l1 = __raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT); 2045 bank->saved_datain = __raw_readl(bank->base +
1998 l2 = __raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT); 2046 OMAP24XX_GPIO_DATAIN);
1999#endif 2047 l1 = __raw_readl(bank->base +
2000#ifdef CONFIG_ARCH_OMAP4 2048 OMAP24XX_GPIO_FALLINGDETECT);
2001 bank->saved_datain = __raw_readl(bank->base + 2049 l2 = __raw_readl(bank->base +
2002 OMAP4_GPIO_DATAIN); 2050 OMAP24XX_GPIO_RISINGDETECT);
2003 l1 = __raw_readl(bank->base + OMAP4_GPIO_FALLINGDETECT); 2051 }
2004 l2 = __raw_readl(bank->base + OMAP4_GPIO_RISINGDETECT); 2052
2005#endif 2053 if (cpu_is_omap44xx()) {
2054 bank->saved_datain = __raw_readl(bank->base +
2055 OMAP4_GPIO_DATAIN);
2056 l1 = __raw_readl(bank->base +
2057 OMAP4_GPIO_FALLINGDETECT);
2058 l2 = __raw_readl(bank->base +
2059 OMAP4_GPIO_RISINGDETECT);
2060 }
2061
2006 bank->saved_fallingdetect = l1; 2062 bank->saved_fallingdetect = l1;
2007 bank->saved_risingdetect = l2; 2063 bank->saved_risingdetect = l2;
2008 l1 &= ~bank->enabled_non_wakeup_gpios; 2064 l1 &= ~bank->enabled_non_wakeup_gpios;
2009 l2 &= ~bank->enabled_non_wakeup_gpios; 2065 l2 &= ~bank->enabled_non_wakeup_gpios;
2010#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 2066
2011 __raw_writel(l1, bank->base + OMAP24XX_GPIO_FALLINGDETECT); 2067 if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
2012 __raw_writel(l2, bank->base + OMAP24XX_GPIO_RISINGDETECT); 2068 __raw_writel(l1, bank->base +
2013#endif 2069 OMAP24XX_GPIO_FALLINGDETECT);
2014#ifdef CONFIG_ARCH_OMAP4 2070 __raw_writel(l2, bank->base +
2015 __raw_writel(l1, bank->base + OMAP4_GPIO_FALLINGDETECT); 2071 OMAP24XX_GPIO_RISINGDETECT);
2016 __raw_writel(l2, bank->base + OMAP4_GPIO_RISINGDETECT); 2072 }
2017#endif 2073
2074 if (cpu_is_omap44xx()) {
2075 __raw_writel(l1, bank->base + OMAP4_GPIO_FALLINGDETECT);
2076 __raw_writel(l2, bank->base + OMAP4_GPIO_RISINGDETECT);
2077 }
2078
2018 c++; 2079 c++;
2019 } 2080 }
2020 if (!c) { 2081 if (!c) {
@@ -2036,20 +2097,23 @@ void omap2_gpio_resume_after_retention(void)
2036 2097
2037 if (!(bank->enabled_non_wakeup_gpios)) 2098 if (!(bank->enabled_non_wakeup_gpios))
2038 continue; 2099 continue;
2039#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 2100
2040 __raw_writel(bank->saved_fallingdetect, 2101 if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
2102 __raw_writel(bank->saved_fallingdetect,
2041 bank->base + OMAP24XX_GPIO_FALLINGDETECT); 2103 bank->base + OMAP24XX_GPIO_FALLINGDETECT);
2042 __raw_writel(bank->saved_risingdetect, 2104 __raw_writel(bank->saved_risingdetect,
2043 bank->base + OMAP24XX_GPIO_RISINGDETECT); 2105 bank->base + OMAP24XX_GPIO_RISINGDETECT);
2044 l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); 2106 l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN);
2045#endif 2107 }
2046#ifdef CONFIG_ARCH_OMAP4 2108
2047 __raw_writel(bank->saved_fallingdetect, 2109 if (cpu_is_omap44xx()) {
2110 __raw_writel(bank->saved_fallingdetect,
2048 bank->base + OMAP4_GPIO_FALLINGDETECT); 2111 bank->base + OMAP4_GPIO_FALLINGDETECT);
2049 __raw_writel(bank->saved_risingdetect, 2112 __raw_writel(bank->saved_risingdetect,
2050 bank->base + OMAP4_GPIO_RISINGDETECT); 2113 bank->base + OMAP4_GPIO_RISINGDETECT);
2051 l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN); 2114 l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN);
2052#endif 2115 }
2116
2053 /* Check if any of the non-wakeup interrupt GPIOs have changed 2117 /* Check if any of the non-wakeup interrupt GPIOs have changed
2054 * state. If so, generate an IRQ by software. This is 2118 * state. If so, generate an IRQ by software. This is
2055 * horribly racy, but it's the best we can do to work around 2119 * horribly racy, but it's the best we can do to work around
@@ -2075,30 +2139,36 @@ void omap2_gpio_resume_after_retention(void)
2075 2139
2076 if (gen) { 2140 if (gen) {
2077 u32 old0, old1; 2141 u32 old0, old1;
2078#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 2142
2079 old0 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0); 2143 if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
2080 old1 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); 2144 old0 = __raw_readl(bank->base +
2081 __raw_writel(old0 | gen, bank->base +
2082 OMAP24XX_GPIO_LEVELDETECT0); 2145 OMAP24XX_GPIO_LEVELDETECT0);
2083 __raw_writel(old1 | gen, bank->base + 2146 old1 = __raw_readl(bank->base +
2084 OMAP24XX_GPIO_LEVELDETECT1); 2147 OMAP24XX_GPIO_LEVELDETECT1);
2085 __raw_writel(old0, bank->base + OMAP24XX_GPIO_LEVELDETECT0); 2148 __raw_writel(old0 | gen, bank->base +
2086 __raw_writel(old1, bank->base + OMAP24XX_GPIO_LEVELDETECT1); 2149 OMAP24XX_GPIO_LEVELDETECT0);
2087#endif 2150 __raw_writel(old1 | gen, bank->base +
2088#ifdef CONFIG_ARCH_OMAP4 2151 OMAP24XX_GPIO_LEVELDETECT1);
2089 old0 = __raw_readl(bank->base + 2152 __raw_writel(old0, bank->base +
2153 OMAP24XX_GPIO_LEVELDETECT0);
2154 __raw_writel(old1, bank->base +
2155 OMAP24XX_GPIO_LEVELDETECT1);
2156 }
2157
2158 if (cpu_is_omap44xx()) {
2159 old0 = __raw_readl(bank->base +
2090 OMAP4_GPIO_LEVELDETECT0); 2160 OMAP4_GPIO_LEVELDETECT0);
2091 old1 = __raw_readl(bank->base + 2161 old1 = __raw_readl(bank->base +
2092 OMAP4_GPIO_LEVELDETECT1); 2162 OMAP4_GPIO_LEVELDETECT1);
2093 __raw_writel(old0 | l, bank->base + 2163 __raw_writel(old0 | l, bank->base +
2094 OMAP4_GPIO_LEVELDETECT0); 2164 OMAP4_GPIO_LEVELDETECT0);
2095 __raw_writel(old1 | l, bank->base + 2165 __raw_writel(old1 | l, bank->base +
2096 OMAP4_GPIO_LEVELDETECT1); 2166 OMAP4_GPIO_LEVELDETECT1);
2097 __raw_writel(old0, bank->base + 2167 __raw_writel(old0, bank->base +
2098 OMAP4_GPIO_LEVELDETECT0); 2168 OMAP4_GPIO_LEVELDETECT0);
2099 __raw_writel(old1, bank->base + 2169 __raw_writel(old1, bank->base +
2100 OMAP4_GPIO_LEVELDETECT1); 2170 OMAP4_GPIO_LEVELDETECT1);
2101#endif 2171 }
2102 } 2172 }
2103 } 2173 }
2104 2174
@@ -2106,6 +2176,81 @@ void omap2_gpio_resume_after_retention(void)
2106 2176
2107#endif 2177#endif
2108 2178
2179#ifdef CONFIG_ARCH_OMAP3
2180/* save the registers of bank 2-6 */
2181void omap_gpio_save_context(void)
2182{
2183 int i;
2184
2185 /* saving banks from 2-6 only since GPIO1 is in WKUP */
2186 for (i = 1; i < gpio_bank_count; i++) {
2187 struct gpio_bank *bank = &gpio_bank[i];
2188 gpio_context[i].sysconfig =
2189 __raw_readl(bank->base + OMAP24XX_GPIO_SYSCONFIG);
2190 gpio_context[i].irqenable1 =
2191 __raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE1);
2192 gpio_context[i].irqenable2 =
2193 __raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE2);
2194 gpio_context[i].wake_en =
2195 __raw_readl(bank->base + OMAP24XX_GPIO_WAKE_EN);
2196 gpio_context[i].ctrl =
2197 __raw_readl(bank->base + OMAP24XX_GPIO_CTRL);
2198 gpio_context[i].oe =
2199 __raw_readl(bank->base + OMAP24XX_GPIO_OE);
2200 gpio_context[i].leveldetect0 =
2201 __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0);
2202 gpio_context[i].leveldetect1 =
2203 __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1);
2204 gpio_context[i].risingdetect =
2205 __raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT);
2206 gpio_context[i].fallingdetect =
2207 __raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT);
2208 gpio_context[i].dataout =
2209 __raw_readl(bank->base + OMAP24XX_GPIO_DATAOUT);
2210 gpio_context[i].setwkuena =
2211 __raw_readl(bank->base + OMAP24XX_GPIO_SETWKUENA);
2212 gpio_context[i].setdataout =
2213 __raw_readl(bank->base + OMAP24XX_GPIO_SETDATAOUT);
2214 }
2215}
2216
2217/* restore the required registers of bank 2-6 */
2218void omap_gpio_restore_context(void)
2219{
2220 int i;
2221
2222 for (i = 1; i < gpio_bank_count; i++) {
2223 struct gpio_bank *bank = &gpio_bank[i];
2224 __raw_writel(gpio_context[i].sysconfig,
2225 bank->base + OMAP24XX_GPIO_SYSCONFIG);
2226 __raw_writel(gpio_context[i].irqenable1,
2227 bank->base + OMAP24XX_GPIO_IRQENABLE1);
2228 __raw_writel(gpio_context[i].irqenable2,
2229 bank->base + OMAP24XX_GPIO_IRQENABLE2);
2230 __raw_writel(gpio_context[i].wake_en,
2231 bank->base + OMAP24XX_GPIO_WAKE_EN);
2232 __raw_writel(gpio_context[i].ctrl,
2233 bank->base + OMAP24XX_GPIO_CTRL);
2234 __raw_writel(gpio_context[i].oe,
2235 bank->base + OMAP24XX_GPIO_OE);
2236 __raw_writel(gpio_context[i].leveldetect0,
2237 bank->base + OMAP24XX_GPIO_LEVELDETECT0);
2238 __raw_writel(gpio_context[i].leveldetect1,
2239 bank->base + OMAP24XX_GPIO_LEVELDETECT1);
2240 __raw_writel(gpio_context[i].risingdetect,
2241 bank->base + OMAP24XX_GPIO_RISINGDETECT);
2242 __raw_writel(gpio_context[i].fallingdetect,
2243 bank->base + OMAP24XX_GPIO_FALLINGDETECT);
2244 __raw_writel(gpio_context[i].dataout,
2245 bank->base + OMAP24XX_GPIO_DATAOUT);
2246 __raw_writel(gpio_context[i].setwkuena,
2247 bank->base + OMAP24XX_GPIO_SETWKUENA);
2248 __raw_writel(gpio_context[i].setdataout,
2249 bank->base + OMAP24XX_GPIO_SETDATAOUT);
2250 }
2251}
2252#endif
2253
2109/* 2254/*
2110 * This may get called early from board specific init 2255 * This may get called early from board specific init
2111 * for boards that have interrupts routed via FPGA. 2256 * for boards that have interrupts routed via FPGA.
@@ -2127,8 +2272,7 @@ static int __init omap_gpio_sysinit(void)
2127 2272
2128 mpuio_init(); 2273 mpuio_init();
2129 2274
2130#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || \ 2275#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
2131 defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP4)
2132 if (cpu_is_omap16xx() || cpu_class_is_omap2()) { 2276 if (cpu_is_omap16xx() || cpu_class_is_omap2()) {
2133 if (ret == 0) { 2277 if (ret == 0) {
2134 ret = sysdev_class_register(&omap_gpio_sysclass); 2278 ret = sysdev_class_register(&omap_gpio_sysclass);
@@ -2160,8 +2304,7 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
2160 2304
2161 if (bank_is_mpuio(bank)) 2305 if (bank_is_mpuio(bank))
2162 gpio = OMAP_MPUIO(0); 2306 gpio = OMAP_MPUIO(0);
2163 else if (cpu_class_is_omap2() || cpu_is_omap730() || 2307 else if (cpu_class_is_omap2() || cpu_is_omap7xx())
2164 cpu_is_omap850())
2165 bankwidth = 32; 2308 bankwidth = 32;
2166 2309
2167 for (j = 0; j < bankwidth; j++, gpio++, mask <<= 1) { 2310 for (j = 0; j < bankwidth; j++, gpio++, mask <<= 1) {
@@ -2188,8 +2331,7 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
2188/* FIXME for at least omap2, show pullup/pulldown state */ 2331/* FIXME for at least omap2, show pullup/pulldown state */
2189 2332
2190 irqstat = irq_desc[irq].status; 2333 irqstat = irq_desc[irq].status;
2191#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || \ 2334#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
2192 defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP4)
2193 if (is_in && ((bank->suspend_wakeup & mask) 2335 if (is_in && ((bank->suspend_wakeup & mask)
2194 || irqstat & IRQ_TYPE_SENSE_MASK)) { 2336 || irqstat & IRQ_TYPE_SENSE_MASK)) {
2195 char *trigger = NULL; 2337 char *trigger = NULL;
diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c
index 8b848391f0c8..624e26298faa 100644
--- a/arch/arm/plat-omap/i2c.c
+++ b/arch/arm/plat-omap/i2c.c
@@ -27,7 +27,8 @@
27#include <linux/platform_device.h> 27#include <linux/platform_device.h>
28#include <linux/i2c.h> 28#include <linux/i2c.h>
29#include <mach/irqs.h> 29#include <mach/irqs.h>
30#include <mach/mux.h> 30#include <plat/mux.h>
31#include <plat/i2c.h>
31 32
32#define OMAP_I2C_SIZE 0x3f 33#define OMAP_I2C_SIZE 0x3f
33#define OMAP1_I2C_BASE 0xfffb3800 34#define OMAP1_I2C_BASE 0xfffb3800
@@ -50,10 +51,10 @@ static const char name[] = "i2c_omap";
50 51
51static struct resource i2c_resources[][2] = { 52static struct resource i2c_resources[][2] = {
52 { I2C_RESOURCE_BUILDER(0, 0) }, 53 { I2C_RESOURCE_BUILDER(0, 0) },
53#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 54#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
54 { I2C_RESOURCE_BUILDER(OMAP2_I2C_BASE2, INT_24XX_I2C2_IRQ) }, 55 { I2C_RESOURCE_BUILDER(OMAP2_I2C_BASE2, INT_24XX_I2C2_IRQ) },
55#endif 56#endif
56#if defined(CONFIG_ARCH_OMAP34XX) 57#if defined(CONFIG_ARCH_OMAP3)
57 { I2C_RESOURCE_BUILDER(OMAP2_I2C_BASE3, INT_34XX_I2C3_IRQ) }, 58 { I2C_RESOURCE_BUILDER(OMAP2_I2C_BASE3, INT_34XX_I2C3_IRQ) },
58#endif 59#endif
59}; 60};
@@ -72,55 +73,16 @@ static struct resource i2c_resources[][2] = {
72static u32 i2c_rate[ARRAY_SIZE(i2c_resources)]; 73static u32 i2c_rate[ARRAY_SIZE(i2c_resources)];
73static struct platform_device omap_i2c_devices[] = { 74static struct platform_device omap_i2c_devices[] = {
74 I2C_DEV_BUILDER(1, i2c_resources[0], &i2c_rate[0]), 75 I2C_DEV_BUILDER(1, i2c_resources[0], &i2c_rate[0]),
75#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 76#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
76 I2C_DEV_BUILDER(2, i2c_resources[1], &i2c_rate[1]), 77 I2C_DEV_BUILDER(2, i2c_resources[1], &i2c_rate[1]),
77#endif 78#endif
78#if defined(CONFIG_ARCH_OMAP34XX) 79#if defined(CONFIG_ARCH_OMAP3)
79 I2C_DEV_BUILDER(3, i2c_resources[2], &i2c_rate[2]), 80 I2C_DEV_BUILDER(3, i2c_resources[2], &i2c_rate[2]),
80#endif 81#endif
81}; 82};
82 83
83#if defined(CONFIG_ARCH_OMAP24XX)
84static const int omap24xx_pins[][2] = {
85 { M19_24XX_I2C1_SCL, L15_24XX_I2C1_SDA },
86 { J15_24XX_I2C2_SCL, H19_24XX_I2C2_SDA },
87};
88#else
89static const int omap24xx_pins[][2] = {};
90#endif
91#if defined(CONFIG_ARCH_OMAP34XX)
92static const int omap34xx_pins[][2] = {
93 { K21_34XX_I2C1_SCL, J21_34XX_I2C1_SDA},
94 { AF15_34XX_I2C2_SCL, AE15_34XX_I2C2_SDA},
95 { AF14_34XX_I2C3_SCL, AG14_34XX_I2C3_SDA},
96};
97#else
98static const int omap34xx_pins[][2] = {};
99#endif
100
101#define OMAP_I2C_CMDLINE_SETUP (BIT(31)) 84#define OMAP_I2C_CMDLINE_SETUP (BIT(31))
102 85
103static void __init omap_i2c_mux_pins(int bus)
104{
105 int scl, sda;
106
107 if (cpu_class_is_omap1()) {
108 scl = I2C_SCL;
109 sda = I2C_SDA;
110 } else if (cpu_is_omap24xx()) {
111 scl = omap24xx_pins[bus][0];
112 sda = omap24xx_pins[bus][1];
113 } else if (cpu_is_omap34xx()) {
114 scl = omap34xx_pins[bus][0];
115 sda = omap34xx_pins[bus][1];
116 } else {
117 return;
118 }
119
120 omap_cfg_reg(sda);
121 omap_cfg_reg(scl);
122}
123
124static int __init omap_i2c_nr_ports(void) 86static int __init omap_i2c_nr_ports(void)
125{ 87{
126 int ports = 0; 88 int ports = 0;
@@ -156,7 +118,11 @@ static int __init omap_i2c_add_bus(int bus_id)
156 res[1].start = irq; 118 res[1].start = irq;
157 } 119 }
158 120
159 omap_i2c_mux_pins(bus_id - 1); 121 if (cpu_class_is_omap1())
122 omap1_i2c_mux_pins(bus_id);
123 if (cpu_class_is_omap2())
124 omap2_i2c_mux_pins(bus_id);
125
160 return platform_device_register(pdev); 126 return platform_device_register(pdev);
161} 127}
162 128
diff --git a/arch/arm/plat-omap/include/mach/clock.h b/arch/arm/plat-omap/include/mach/clock.h
deleted file mode 100644
index 4b8b0d65cbf2..000000000000
--- a/arch/arm/plat-omap/include/mach/clock.h
+++ /dev/null
@@ -1,163 +0,0 @@
1/*
2 * arch/arm/plat-omap/include/mach/clock.h
3 *
4 * Copyright (C) 2004 - 2005 Nokia corporation
5 * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
6 * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#ifndef __ARCH_ARM_OMAP_CLOCK_H
14#define __ARCH_ARM_OMAP_CLOCK_H
15
16struct module;
17struct clk;
18struct clockdomain;
19
20struct clkops {
21 int (*enable)(struct clk *);
22 void (*disable)(struct clk *);
23 void (*find_idlest)(struct clk *, void __iomem **, u8 *);
24 void (*find_companion)(struct clk *, void __iomem **, u8 *);
25};
26
27#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \
28 defined(CONFIG_ARCH_OMAP4)
29
30struct clksel_rate {
31 u32 val;
32 u8 div;
33 u8 flags;
34};
35
36struct clksel {
37 struct clk *parent;
38 const struct clksel_rate *rates;
39};
40
41struct dpll_data {
42 void __iomem *mult_div1_reg;
43 u32 mult_mask;
44 u32 div1_mask;
45 struct clk *clk_bypass;
46 struct clk *clk_ref;
47 void __iomem *control_reg;
48 u32 enable_mask;
49 unsigned int rate_tolerance;
50 unsigned long last_rounded_rate;
51 u16 last_rounded_m;
52 u8 last_rounded_n;
53 u8 min_divider;
54 u8 max_divider;
55 u32 max_tolerance;
56 u16 max_multiplier;
57#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
58 u8 modes;
59 void __iomem *autoidle_reg;
60 void __iomem *idlest_reg;
61 u32 autoidle_mask;
62 u32 freqsel_mask;
63 u32 idlest_mask;
64 u8 auto_recal_bit;
65 u8 recal_en_bit;
66 u8 recal_st_bit;
67# endif
68};
69
70#endif
71
72struct clk {
73 struct list_head node;
74 const struct clkops *ops;
75 const char *name;
76 int id;
77 struct clk *parent;
78 struct list_head children;
79 struct list_head sibling; /* node for children */
80 unsigned long rate;
81 __u32 flags;
82 void __iomem *enable_reg;
83 unsigned long (*recalc)(struct clk *);
84 int (*set_rate)(struct clk *, unsigned long);
85 long (*round_rate)(struct clk *, unsigned long);
86 void (*init)(struct clk *);
87 __u8 enable_bit;
88 __s8 usecount;
89#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \
90 defined(CONFIG_ARCH_OMAP4)
91 u8 fixed_div;
92 void __iomem *clksel_reg;
93 u32 clksel_mask;
94 const struct clksel *clksel;
95 struct dpll_data *dpll_data;
96 const char *clkdm_name;
97 struct clockdomain *clkdm;
98#else
99 __u8 rate_offset;
100 __u8 src_offset;
101#endif
102#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
103 struct dentry *dent; /* For visible tree hierarchy */
104#endif
105};
106
107struct cpufreq_frequency_table;
108
109struct clk_functions {
110 int (*clk_enable)(struct clk *clk);
111 void (*clk_disable)(struct clk *clk);
112 long (*clk_round_rate)(struct clk *clk, unsigned long rate);
113 int (*clk_set_rate)(struct clk *clk, unsigned long rate);
114 int (*clk_set_parent)(struct clk *clk, struct clk *parent);
115 void (*clk_allow_idle)(struct clk *clk);
116 void (*clk_deny_idle)(struct clk *clk);
117 void (*clk_disable_unused)(struct clk *clk);
118#ifdef CONFIG_CPU_FREQ
119 void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **);
120#endif
121};
122
123extern unsigned int mpurate;
124
125extern int clk_init(struct clk_functions *custom_clocks);
126extern void clk_preinit(struct clk *clk);
127extern int clk_register(struct clk *clk);
128extern void clk_reparent(struct clk *child, struct clk *parent);
129extern void clk_unregister(struct clk *clk);
130extern void propagate_rate(struct clk *clk);
131extern void recalculate_root_clocks(void);
132extern unsigned long followparent_recalc(struct clk *clk);
133extern void clk_enable_init_clocks(void);
134#ifdef CONFIG_CPU_FREQ
135extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table);
136#endif
137
138extern const struct clkops clkops_null;
139
140/* Clock flags */
141/* bit 0 is free */
142#define RATE_FIXED (1 << 1) /* Fixed clock rate */
143/* bits 2-4 are free */
144#define ENABLE_REG_32BIT (1 << 5) /* Use 32-bit access */
145#define CLOCK_IDLE_CONTROL (1 << 7)
146#define CLOCK_NO_IDLE_PARENT (1 << 8)
147#define DELAYED_APP (1 << 9) /* Delay application of clock */
148#define CONFIG_PARTICIPANT (1 << 10) /* Fundamental clock */
149#define ENABLE_ON_INIT (1 << 11) /* Enable upon framework init */
150#define INVERT_ENABLE (1 << 12) /* 0 enables, 1 disables */
151/* bits 13-31 are currently free */
152
153/* Clksel_rate flags */
154#define DEFAULT_RATE (1 << 0)
155#define RATE_IN_242X (1 << 1)
156#define RATE_IN_243X (1 << 2)
157#define RATE_IN_343X (1 << 3) /* rates common to all 343X */
158#define RATE_IN_3430ES2 (1 << 4) /* 3430ES2 rates only */
159
160#define RATE_IN_24XX (RATE_IN_242X | RATE_IN_243X)
161
162
163#endif
diff --git a/arch/arm/plat-omap/include/mach/clockdomain.h b/arch/arm/plat-omap/include/mach/clockdomain.h
deleted file mode 100644
index 99ebd886f134..000000000000
--- a/arch/arm/plat-omap/include/mach/clockdomain.h
+++ /dev/null
@@ -1,111 +0,0 @@
1/*
2 * arch/arm/plat-omap/include/mach/clockdomain.h
3 *
4 * OMAP2/3 clockdomain framework functions
5 *
6 * Copyright (C) 2008 Texas Instruments, Inc.
7 * Copyright (C) 2008 Nokia Corporation
8 *
9 * Written by Paul Walmsley
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15
16#ifndef __ASM_ARM_ARCH_OMAP_CLOCKDOMAIN_H
17#define __ASM_ARM_ARCH_OMAP_CLOCKDOMAIN_H
18
19#include <mach/powerdomain.h>
20#include <mach/clock.h>
21#include <mach/cpu.h>
22
23/* Clockdomain capability flags */
24#define CLKDM_CAN_FORCE_SLEEP (1 << 0)
25#define CLKDM_CAN_FORCE_WAKEUP (1 << 1)
26#define CLKDM_CAN_ENABLE_AUTO (1 << 2)
27#define CLKDM_CAN_DISABLE_AUTO (1 << 3)
28
29#define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO)
30#define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP)
31#define CLKDM_CAN_HWSUP_SWSUP (CLKDM_CAN_SWSUP | CLKDM_CAN_HWSUP)
32
33/* OMAP24XX CM_CLKSTCTRL_*.AUTOSTATE_* register bit values */
34#define OMAP24XX_CLKSTCTRL_DISABLE_AUTO 0x0
35#define OMAP24XX_CLKSTCTRL_ENABLE_AUTO 0x1
36
37/* OMAP3XXX CM_CLKSTCTRL_*.CLKTRCTRL_* register bit values */
38#define OMAP34XX_CLKSTCTRL_DISABLE_AUTO 0x0
39#define OMAP34XX_CLKSTCTRL_FORCE_SLEEP 0x1
40#define OMAP34XX_CLKSTCTRL_FORCE_WAKEUP 0x2
41#define OMAP34XX_CLKSTCTRL_ENABLE_AUTO 0x3
42
43/*
44 * struct clkdm_pwrdm_autodep - a powerdomain that should have wkdeps
45 * and sleepdeps added when a powerdomain should stay active in hwsup mode;
46 * and conversely, removed when the powerdomain should be allowed to go
47 * inactive in hwsup mode.
48 */
49struct clkdm_pwrdm_autodep {
50
51 union {
52 /* Name of the powerdomain to add a wkdep/sleepdep on */
53 const char *name;
54
55 /* Powerdomain pointer (looked up at clkdm_init() time) */
56 struct powerdomain *ptr;
57 } pwrdm;
58
59 /* OMAP chip types that this clockdomain dep is valid on */
60 const struct omap_chip_id omap_chip;
61
62};
63
64struct clockdomain {
65
66 /* Clockdomain name */
67 const char *name;
68
69 union {
70 /* Powerdomain enclosing this clockdomain */
71 const char *name;
72
73 /* Powerdomain pointer assigned at clkdm_register() */
74 struct powerdomain *ptr;
75 } pwrdm;
76
77 /* CLKTRCTRL/AUTOSTATE field mask in CM_CLKSTCTRL reg */
78 const u16 clktrctrl_mask;
79
80 /* Clockdomain capability flags */
81 const u8 flags;
82
83 /* OMAP chip types that this clockdomain is valid on */
84 const struct omap_chip_id omap_chip;
85
86 /* Usecount tracking */
87 atomic_t usecount;
88
89 struct list_head node;
90
91};
92
93void clkdm_init(struct clockdomain **clkdms, struct clkdm_pwrdm_autodep *autodeps);
94int clkdm_register(struct clockdomain *clkdm);
95int clkdm_unregister(struct clockdomain *clkdm);
96struct clockdomain *clkdm_lookup(const char *name);
97
98int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
99 void *user);
100struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm);
101
102void omap2_clkdm_allow_idle(struct clockdomain *clkdm);
103void omap2_clkdm_deny_idle(struct clockdomain *clkdm);
104
105int omap2_clkdm_wakeup(struct clockdomain *clkdm);
106int omap2_clkdm_sleep(struct clockdomain *clkdm);
107
108int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk);
109int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk);
110
111#endif
diff --git a/arch/arm/plat-omap/include/mach/debug-macro.S b/arch/arm/plat-omap/include/mach/debug-macro.S
deleted file mode 100644
index ac24050e3416..000000000000
--- a/arch/arm/plat-omap/include/mach/debug-macro.S
+++ /dev/null
@@ -1,70 +0,0 @@
1/* arch/arm/plat-omap/include/mach/debug-macro.S
2 *
3 * Debugging macro include header
4 *
5 * Copyright (C) 1994-1999 Russell King
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12*/
13
14 .macro addruart,rx
15 mrc p15, 0, \rx, c1, c0
16 tst \rx, #1 @ MMU enabled?
17#ifdef CONFIG_ARCH_OMAP1
18 moveq \rx, #0xff000000 @ physical base address
19 movne \rx, #0xfe000000 @ virtual base
20 orr \rx, \rx, #0x00fb0000
21#ifdef CONFIG_OMAP_LL_DEBUG_UART3
22 orr \rx, \rx, #0x00009000 @ UART 3
23#endif
24#if defined(CONFIG_OMAP_LL_DEBUG_UART2) || defined(CONFIG_OMAP_LL_DEBUG_UART3)
25 orr \rx, \rx, #0x00000800 @ UART 2 & 3
26#endif
27
28#elif CONFIG_ARCH_OMAP2
29 moveq \rx, #0x48000000 @ physical base address
30 movne \rx, #0xd8000000 @ virtual base
31 orr \rx, \rx, #0x0006a000
32#ifdef CONFIG_OMAP_LL_DEBUG_UART2
33 add \rx, \rx, #0x00002000 @ UART 2
34#endif
35#ifdef CONFIG_OMAP_LL_DEBUG_UART3
36 add \rx, \rx, #0x00004000 @ UART 3
37#endif
38
39#elif defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
40 moveq \rx, #0x48000000 @ physical base address
41 movne \rx, #0xd8000000 @ virtual base
42 orr \rx, \rx, #0x0006a000
43#ifdef CONFIG_OMAP_LL_DEBUG_UART2
44 add \rx, \rx, #0x00002000 @ UART 2
45#endif
46#ifdef CONFIG_OMAP_LL_DEBUG_UART3
47 add \rx, \rx, #0x00fb0000 @ UART 3
48 add \rx, \rx, #0x00006000
49#endif
50#endif
51 .endm
52
53 .macro senduart,rd,rx
54 strb \rd, [\rx]
55 .endm
56
57 .macro busyuart,rd,rx
581001: ldrb \rd, [\rx, #(0x5 << 2)] @ OMAP-1510 and friends
59 and \rd, \rd, #0x60
60 teq \rd, #0x60
61 beq 1002f
62 ldrb \rd, [\rx, #(0x5 << 0)] @ OMAP-730 only
63 and \rd, \rd, #0x60
64 teq \rd, #0x60
65 bne 1001b
661002:
67 .endm
68
69 .macro waituart,rd,rx
70 .endm
diff --git a/arch/arm/plat-omap/include/mach/entry-macro.S b/arch/arm/plat-omap/include/mach/entry-macro.S
deleted file mode 100644
index a5592991634d..000000000000
--- a/arch/arm/plat-omap/include/mach/entry-macro.S
+++ /dev/null
@@ -1,172 +0,0 @@
1/*
2 * arch/arm/plat-omap/include/mach/entry-macro.S
3 *
4 * Low-level IRQ helper macros for OMAP-based platforms
5 *
6 * Copyright (C) 2009 Texas Instruments
7 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
8 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 */
13#include <mach/hardware.h>
14#include <mach/io.h>
15#include <mach/irqs.h>
16#include <asm/hardware/gic.h>
17
18#if defined(CONFIG_ARCH_OMAP1)
19
20#if defined(CONFIG_ARCH_OMAP730) && \
21 (defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX))
22#error "FIXME: OMAP730 doesn't support multiple-OMAP"
23#elif defined(CONFIG_ARCH_OMAP730)
24#define INT_IH2_IRQ INT_730_IH2_IRQ
25#elif defined(CONFIG_ARCH_OMAP15XX)
26#define INT_IH2_IRQ INT_1510_IH2_IRQ
27#elif defined(CONFIG_ARCH_OMAP16XX)
28#define INT_IH2_IRQ INT_1610_IH2_IRQ
29#else
30#warning "IH2 IRQ defaulted"
31#define INT_IH2_IRQ INT_1510_IH2_IRQ
32#endif
33
34 .macro disable_fiq
35 .endm
36
37 .macro get_irqnr_preamble, base, tmp
38 .endm
39
40 .macro arch_ret_to_user, tmp1, tmp2
41 .endm
42
43 .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
44 ldr \base, =OMAP1_IO_ADDRESS(OMAP_IH1_BASE)
45 ldr \irqnr, [\base, #IRQ_ITR_REG_OFFSET]
46 ldr \tmp, [\base, #IRQ_MIR_REG_OFFSET]
47 mov \irqstat, #0xffffffff
48 bic \tmp, \irqstat, \tmp
49 tst \irqnr, \tmp
50 beq 1510f
51
52 ldr \irqnr, [\base, #IRQ_SIR_FIQ_REG_OFFSET]
53 cmp \irqnr, #0
54 ldreq \irqnr, [\base, #IRQ_SIR_IRQ_REG_OFFSET]
55 cmpeq \irqnr, #INT_IH2_IRQ
56 ldreq \base, =OMAP1_IO_ADDRESS(OMAP_IH2_BASE)
57 ldreq \irqnr, [\base, #IRQ_SIR_IRQ_REG_OFFSET]
58 addeqs \irqnr, \irqnr, #32
591510:
60 .endm
61
62#endif
63#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \
64 defined(CONFIG_ARCH_OMAP4)
65
66#include <mach/omap24xx.h>
67#include <mach/omap34xx.h>
68
69/* REVISIT: This should be set dynamically if CONFIG_MULTI_OMAP2 is selected */
70#if defined(CONFIG_ARCH_OMAP2420) || defined(CONFIG_ARCH_OMAP2430)
71#define OMAP2_VA_IC_BASE OMAP2_IO_ADDRESS(OMAP24XX_IC_BASE)
72#elif defined(CONFIG_ARCH_OMAP34XX)
73#define OMAP2_VA_IC_BASE OMAP2_IO_ADDRESS(OMAP34XX_IC_BASE)
74#endif
75#if defined(CONFIG_ARCH_OMAP4)
76#include <mach/omap44xx.h>
77#endif
78#define INTCPS_SIR_IRQ_OFFSET 0x0040 /* Active interrupt offset */
79#define ACTIVEIRQ_MASK 0x7f /* Active interrupt bits */
80
81 .macro disable_fiq
82 .endm
83
84 .macro get_irqnr_preamble, base, tmp
85 .endm
86
87 .macro arch_ret_to_user, tmp1, tmp2
88 .endm
89
90#ifndef CONFIG_ARCH_OMAP4
91 .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
92 ldr \base, =OMAP2_VA_IC_BASE
93 ldr \irqnr, [\base, #0x98] /* IRQ pending reg 1 */
94 cmp \irqnr, #0x0
95 bne 2222f
96 ldr \irqnr, [\base, #0xb8] /* IRQ pending reg 2 */
97 cmp \irqnr, #0x0
98 bne 2222f
99 ldr \irqnr, [\base, #0xd8] /* IRQ pending reg 3 */
100 cmp \irqnr, #0x0
1012222:
102 ldrne \irqnr, [\base, #INTCPS_SIR_IRQ_OFFSET]
103 and \irqnr, \irqnr, #ACTIVEIRQ_MASK /* Clear spurious bits */
104
105 .endm
106#else
107 /*
108 * The interrupt numbering scheme is defined in the
109 * interrupt controller spec. To wit:
110 *
111 * Interrupts 0-15 are IPI
112 * 16-28 are reserved
113 * 29-31 are local. We allow 30 to be used for the watchdog.
114 * 32-1020 are global
115 * 1021-1022 are reserved
116 * 1023 is "spurious" (no interrupt)
117 *
118 * For now, we ignore all local interrupts so only return an
119 * interrupt if it's between 30 and 1020. The test_for_ipi
120 * routine below will pick up on IPIs.
121 * A simple read from the controller will tell us the number
122 * of the highest priority enabled interrupt.
123 * We then just need to check whether it is in the
124 * valid range for an IRQ (30-1020 inclusive).
125 */
126 .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
127 ldr \base, =OMAP44XX_VA_GIC_CPU_BASE
128 ldr \irqstat, [\base, #GIC_CPU_INTACK]
129
130 ldr \tmp, =1021
131
132 bic \irqnr, \irqstat, #0x1c00
133
134 cmp \irqnr, #29
135 cmpcc \irqnr, \irqnr
136 cmpne \irqnr, \tmp
137 cmpcs \irqnr, \irqnr
138 .endm
139
140 /* We assume that irqstat (the raw value of the IRQ acknowledge
141 * register) is preserved from the macro above.
142 * If there is an IPI, we immediately signal end of interrupt
143 * on the controller, since this requires the original irqstat
144 * value which we won't easily be able to recreate later.
145 */
146
147 .macro test_for_ipi, irqnr, irqstat, base, tmp
148 bic \irqnr, \irqstat, #0x1c00
149 cmp \irqnr, #16
150 it cc
151 strcc \irqstat, [\base, #GIC_CPU_EOI]
152 it cs
153 cmpcs \irqnr, \irqnr
154 .endm
155
156 /* As above, this assumes that irqstat and base are preserved */
157
158 .macro test_for_ltirq, irqnr, irqstat, base, tmp
159 bic \irqnr, \irqstat, #0x1c00
160 mov \tmp, #0
161 cmp \irqnr, #29
162 itt eq
163 moveq \tmp, #1
164 streq \irqstat, [\base, #GIC_CPU_EOI]
165 cmp \tmp, #0
166 .endm
167#endif
168
169 .macro irq_prio_table
170 .endm
171
172#endif
diff --git a/arch/arm/plat-omap/include/mach/irqs.h b/arch/arm/plat-omap/include/mach/irqs.h
deleted file mode 100644
index 28a165058b61..000000000000
--- a/arch/arm/plat-omap/include/mach/irqs.h
+++ /dev/null
@@ -1,568 +0,0 @@
1/*
2 * arch/arm/plat-omap/include/mach/irqs.h
3 *
4 * Copyright (C) Greg Lonnon 2001
5 * Updated for OMAP-1610 by Tony Lindgren <tony@atomide.com>
6 *
7 * Copyright (C) 2009 Texas Instruments
8 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 *
24 * NOTE: The interrupt vectors for the OMAP-1509, OMAP-1510, and OMAP-1610
25 * are different.
26 */
27
28#ifndef __ASM_ARCH_OMAP15XX_IRQS_H
29#define __ASM_ARCH_OMAP15XX_IRQS_H
30
31/*
32 * IRQ numbers for interrupt handler 1
33 *
34 * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
35 *
36 */
37#define INT_CAMERA 1
38#define INT_FIQ 3
39#define INT_RTDX 6
40#define INT_DSP_MMU_ABORT 7
41#define INT_HOST 8
42#define INT_ABORT 9
43#define INT_BRIDGE_PRIV 13
44#define INT_GPIO_BANK1 14
45#define INT_UART3 15
46#define INT_TIMER3 16
47#define INT_DMA_CH0_6 19
48#define INT_DMA_CH1_7 20
49#define INT_DMA_CH2_8 21
50#define INT_DMA_CH3 22
51#define INT_DMA_CH4 23
52#define INT_DMA_CH5 24
53#define INT_DMA_LCD 25
54#define INT_TIMER1 26
55#define INT_WD_TIMER 27
56#define INT_BRIDGE_PUB 28
57#define INT_TIMER2 30
58#define INT_LCD_CTRL 31
59
60/*
61 * OMAP-1510 specific IRQ numbers for interrupt handler 1
62 */
63#define INT_1510_IH2_IRQ 0
64#define INT_1510_RES2 2
65#define INT_1510_SPI_TX 4
66#define INT_1510_SPI_RX 5
67#define INT_1510_DSP_MAILBOX1 10
68#define INT_1510_DSP_MAILBOX2 11
69#define INT_1510_RES12 12
70#define INT_1510_LB_MMU 17
71#define INT_1510_RES18 18
72#define INT_1510_LOCAL_BUS 29
73
74/*
75 * OMAP-1610 specific IRQ numbers for interrupt handler 1
76 */
77#define INT_1610_IH2_IRQ 0
78#define INT_1610_IH2_FIQ 2
79#define INT_1610_McBSP2_TX 4
80#define INT_1610_McBSP2_RX 5
81#define INT_1610_DSP_MAILBOX1 10
82#define INT_1610_DSP_MAILBOX2 11
83#define INT_1610_LCD_LINE 12
84#define INT_1610_GPTIMER1 17
85#define INT_1610_GPTIMER2 18
86#define INT_1610_SSR_FIFO_0 29
87
88/*
89 * OMAP-730 specific IRQ numbers for interrupt handler 1
90 */
91#define INT_730_IH2_FIQ 0
92#define INT_730_IH2_IRQ 1
93#define INT_730_USB_NON_ISO 2
94#define INT_730_USB_ISO 3
95#define INT_730_ICR 4
96#define INT_730_EAC 5
97#define INT_730_GPIO_BANK1 6
98#define INT_730_GPIO_BANK2 7
99#define INT_730_GPIO_BANK3 8
100#define INT_730_McBSP2TX 10
101#define INT_730_McBSP2RX 11
102#define INT_730_McBSP2RX_OVF 12
103#define INT_730_LCD_LINE 14
104#define INT_730_GSM_PROTECT 15
105#define INT_730_TIMER3 16
106#define INT_730_GPIO_BANK5 17
107#define INT_730_GPIO_BANK6 18
108#define INT_730_SPGIO_WR 29
109
110/*
111 * OMAP-850 specific IRQ numbers for interrupt handler 1
112 */
113#define INT_850_IH2_FIQ 0
114#define INT_850_IH2_IRQ 1
115#define INT_850_USB_NON_ISO 2
116#define INT_850_USB_ISO 3
117#define INT_850_ICR 4
118#define INT_850_EAC 5
119#define INT_850_GPIO_BANK1 6
120#define INT_850_GPIO_BANK2 7
121#define INT_850_GPIO_BANK3 8
122#define INT_850_McBSP2TX 10
123#define INT_850_McBSP2RX 11
124#define INT_850_McBSP2RX_OVF 12
125#define INT_850_LCD_LINE 14
126#define INT_850_GSM_PROTECT 15
127#define INT_850_TIMER3 16
128#define INT_850_GPIO_BANK5 17
129#define INT_850_GPIO_BANK6 18
130#define INT_850_SPGIO_WR 29
131
132
133/*
134 * IRQ numbers for interrupt handler 2
135 *
136 * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
137 */
138#define IH2_BASE 32
139
140#define INT_KEYBOARD (1 + IH2_BASE)
141#define INT_uWireTX (2 + IH2_BASE)
142#define INT_uWireRX (3 + IH2_BASE)
143#define INT_I2C (4 + IH2_BASE)
144#define INT_MPUIO (5 + IH2_BASE)
145#define INT_USB_HHC_1 (6 + IH2_BASE)
146#define INT_McBSP3TX (10 + IH2_BASE)
147#define INT_McBSP3RX (11 + IH2_BASE)
148#define INT_McBSP1TX (12 + IH2_BASE)
149#define INT_McBSP1RX (13 + IH2_BASE)
150#define INT_UART1 (14 + IH2_BASE)
151#define INT_UART2 (15 + IH2_BASE)
152#define INT_BT_MCSI1TX (16 + IH2_BASE)
153#define INT_BT_MCSI1RX (17 + IH2_BASE)
154#define INT_SOSSI_MATCH (19 + IH2_BASE)
155#define INT_USB_W2FC (20 + IH2_BASE)
156#define INT_1WIRE (21 + IH2_BASE)
157#define INT_OS_TIMER (22 + IH2_BASE)
158#define INT_MMC (23 + IH2_BASE)
159#define INT_GAUGE_32K (24 + IH2_BASE)
160#define INT_RTC_TIMER (25 + IH2_BASE)
161#define INT_RTC_ALARM (26 + IH2_BASE)
162#define INT_MEM_STICK (27 + IH2_BASE)
163
164/*
165 * OMAP-1510 specific IRQ numbers for interrupt handler 2
166 */
167#define INT_1510_DSP_MMU (28 + IH2_BASE)
168#define INT_1510_COM_SPI_RO (31 + IH2_BASE)
169
170/*
171 * OMAP-1610 specific IRQ numbers for interrupt handler 2
172 */
173#define INT_1610_FAC (0 + IH2_BASE)
174#define INT_1610_USB_HHC_2 (7 + IH2_BASE)
175#define INT_1610_USB_OTG (8 + IH2_BASE)
176#define INT_1610_SoSSI (9 + IH2_BASE)
177#define INT_1610_SoSSI_MATCH (19 + IH2_BASE)
178#define INT_1610_DSP_MMU (28 + IH2_BASE)
179#define INT_1610_McBSP2RX_OF (31 + IH2_BASE)
180#define INT_1610_STI (32 + IH2_BASE)
181#define INT_1610_STI_WAKEUP (33 + IH2_BASE)
182#define INT_1610_GPTIMER3 (34 + IH2_BASE)
183#define INT_1610_GPTIMER4 (35 + IH2_BASE)
184#define INT_1610_GPTIMER5 (36 + IH2_BASE)
185#define INT_1610_GPTIMER6 (37 + IH2_BASE)
186#define INT_1610_GPTIMER7 (38 + IH2_BASE)
187#define INT_1610_GPTIMER8 (39 + IH2_BASE)
188#define INT_1610_GPIO_BANK2 (40 + IH2_BASE)
189#define INT_1610_GPIO_BANK3 (41 + IH2_BASE)
190#define INT_1610_MMC2 (42 + IH2_BASE)
191#define INT_1610_CF (43 + IH2_BASE)
192#define INT_1610_WAKE_UP_REQ (46 + IH2_BASE)
193#define INT_1610_GPIO_BANK4 (48 + IH2_BASE)
194#define INT_1610_SPI (49 + IH2_BASE)
195#define INT_1610_DMA_CH6 (53 + IH2_BASE)
196#define INT_1610_DMA_CH7 (54 + IH2_BASE)
197#define INT_1610_DMA_CH8 (55 + IH2_BASE)
198#define INT_1610_DMA_CH9 (56 + IH2_BASE)
199#define INT_1610_DMA_CH10 (57 + IH2_BASE)
200#define INT_1610_DMA_CH11 (58 + IH2_BASE)
201#define INT_1610_DMA_CH12 (59 + IH2_BASE)
202#define INT_1610_DMA_CH13 (60 + IH2_BASE)
203#define INT_1610_DMA_CH14 (61 + IH2_BASE)
204#define INT_1610_DMA_CH15 (62 + IH2_BASE)
205#define INT_1610_NAND (63 + IH2_BASE)
206#define INT_1610_SHA1MD5 (91 + IH2_BASE)
207
208/*
209 * OMAP-730 specific IRQ numbers for interrupt handler 2
210 */
211#define INT_730_HW_ERRORS (0 + IH2_BASE)
212#define INT_730_NFIQ_PWR_FAIL (1 + IH2_BASE)
213#define INT_730_CFCD (2 + IH2_BASE)
214#define INT_730_CFIREQ (3 + IH2_BASE)
215#define INT_730_I2C (4 + IH2_BASE)
216#define INT_730_PCC (5 + IH2_BASE)
217#define INT_730_MPU_EXT_NIRQ (6 + IH2_BASE)
218#define INT_730_SPI_100K_1 (7 + IH2_BASE)
219#define INT_730_SYREN_SPI (8 + IH2_BASE)
220#define INT_730_VLYNQ (9 + IH2_BASE)
221#define INT_730_GPIO_BANK4 (10 + IH2_BASE)
222#define INT_730_McBSP1TX (11 + IH2_BASE)
223#define INT_730_McBSP1RX (12 + IH2_BASE)
224#define INT_730_McBSP1RX_OF (13 + IH2_BASE)
225#define INT_730_UART_MODEM_IRDA_2 (14 + IH2_BASE)
226#define INT_730_UART_MODEM_1 (15 + IH2_BASE)
227#define INT_730_MCSI (16 + IH2_BASE)
228#define INT_730_uWireTX (17 + IH2_BASE)
229#define INT_730_uWireRX (18 + IH2_BASE)
230#define INT_730_SMC_CD (19 + IH2_BASE)
231#define INT_730_SMC_IREQ (20 + IH2_BASE)
232#define INT_730_HDQ_1WIRE (21 + IH2_BASE)
233#define INT_730_TIMER32K (22 + IH2_BASE)
234#define INT_730_MMC_SDIO (23 + IH2_BASE)
235#define INT_730_UPLD (24 + IH2_BASE)
236#define INT_730_USB_HHC_1 (27 + IH2_BASE)
237#define INT_730_USB_HHC_2 (28 + IH2_BASE)
238#define INT_730_USB_GENI (29 + IH2_BASE)
239#define INT_730_USB_OTG (30 + IH2_BASE)
240#define INT_730_CAMERA_IF (31 + IH2_BASE)
241#define INT_730_RNG (32 + IH2_BASE)
242#define INT_730_DUAL_MODE_TIMER (33 + IH2_BASE)
243#define INT_730_DBB_RF_EN (34 + IH2_BASE)
244#define INT_730_MPUIO_KEYPAD (35 + IH2_BASE)
245#define INT_730_SHA1_MD5 (36 + IH2_BASE)
246#define INT_730_SPI_100K_2 (37 + IH2_BASE)
247#define INT_730_RNG_IDLE (38 + IH2_BASE)
248#define INT_730_MPUIO (39 + IH2_BASE)
249#define INT_730_LLPC_LCD_CTRL_CAN_BE_OFF (40 + IH2_BASE)
250#define INT_730_LLPC_OE_FALLING (41 + IH2_BASE)
251#define INT_730_LLPC_OE_RISING (42 + IH2_BASE)
252#define INT_730_LLPC_VSYNC (43 + IH2_BASE)
253#define INT_730_WAKE_UP_REQ (46 + IH2_BASE)
254#define INT_730_DMA_CH6 (53 + IH2_BASE)
255#define INT_730_DMA_CH7 (54 + IH2_BASE)
256#define INT_730_DMA_CH8 (55 + IH2_BASE)
257#define INT_730_DMA_CH9 (56 + IH2_BASE)
258#define INT_730_DMA_CH10 (57 + IH2_BASE)
259#define INT_730_DMA_CH11 (58 + IH2_BASE)
260#define INT_730_DMA_CH12 (59 + IH2_BASE)
261#define INT_730_DMA_CH13 (60 + IH2_BASE)
262#define INT_730_DMA_CH14 (61 + IH2_BASE)
263#define INT_730_DMA_CH15 (62 + IH2_BASE)
264#define INT_730_NAND (63 + IH2_BASE)
265
266/*
267 * OMAP-850 specific IRQ numbers for interrupt handler 2
268 */
269#define INT_850_HW_ERRORS (0 + IH2_BASE)
270#define INT_850_NFIQ_PWR_FAIL (1 + IH2_BASE)
271#define INT_850_CFCD (2 + IH2_BASE)
272#define INT_850_CFIREQ (3 + IH2_BASE)
273#define INT_850_I2C (4 + IH2_BASE)
274#define INT_850_PCC (5 + IH2_BASE)
275#define INT_850_MPU_EXT_NIRQ (6 + IH2_BASE)
276#define INT_850_SPI_100K_1 (7 + IH2_BASE)
277#define INT_850_SYREN_SPI (8 + IH2_BASE)
278#define INT_850_VLYNQ (9 + IH2_BASE)
279#define INT_850_GPIO_BANK4 (10 + IH2_BASE)
280#define INT_850_McBSP1TX (11 + IH2_BASE)
281#define INT_850_McBSP1RX (12 + IH2_BASE)
282#define INT_850_McBSP1RX_OF (13 + IH2_BASE)
283#define INT_850_UART_MODEM_IRDA_2 (14 + IH2_BASE)
284#define INT_850_UART_MODEM_1 (15 + IH2_BASE)
285#define INT_850_MCSI (16 + IH2_BASE)
286#define INT_850_uWireTX (17 + IH2_BASE)
287#define INT_850_uWireRX (18 + IH2_BASE)
288#define INT_850_SMC_CD (19 + IH2_BASE)
289#define INT_850_SMC_IREQ (20 + IH2_BASE)
290#define INT_850_HDQ_1WIRE (21 + IH2_BASE)
291#define INT_850_TIMER32K (22 + IH2_BASE)
292#define INT_850_MMC_SDIO (23 + IH2_BASE)
293#define INT_850_UPLD (24 + IH2_BASE)
294#define INT_850_USB_HHC_1 (27 + IH2_BASE)
295#define INT_850_USB_HHC_2 (28 + IH2_BASE)
296#define INT_850_USB_GENI (29 + IH2_BASE)
297#define INT_850_USB_OTG (30 + IH2_BASE)
298#define INT_850_CAMERA_IF (31 + IH2_BASE)
299#define INT_850_RNG (32 + IH2_BASE)
300#define INT_850_DUAL_MODE_TIMER (33 + IH2_BASE)
301#define INT_850_DBB_RF_EN (34 + IH2_BASE)
302#define INT_850_MPUIO_KEYPAD (35 + IH2_BASE)
303#define INT_850_SHA1_MD5 (36 + IH2_BASE)
304#define INT_850_SPI_100K_2 (37 + IH2_BASE)
305#define INT_850_RNG_IDLE (38 + IH2_BASE)
306#define INT_850_MPUIO (39 + IH2_BASE)
307#define INT_850_LLPC_LCD_CTRL_CAN_BE_OFF (40 + IH2_BASE)
308#define INT_850_LLPC_OE_FALLING (41 + IH2_BASE)
309#define INT_850_LLPC_OE_RISING (42 + IH2_BASE)
310#define INT_850_LLPC_VSYNC (43 + IH2_BASE)
311#define INT_850_WAKE_UP_REQ (46 + IH2_BASE)
312#define INT_850_DMA_CH6 (53 + IH2_BASE)
313#define INT_850_DMA_CH7 (54 + IH2_BASE)
314#define INT_850_DMA_CH8 (55 + IH2_BASE)
315#define INT_850_DMA_CH9 (56 + IH2_BASE)
316#define INT_850_DMA_CH10 (57 + IH2_BASE)
317#define INT_850_DMA_CH11 (58 + IH2_BASE)
318#define INT_850_DMA_CH12 (59 + IH2_BASE)
319#define INT_850_DMA_CH13 (60 + IH2_BASE)
320#define INT_850_DMA_CH14 (61 + IH2_BASE)
321#define INT_850_DMA_CH15 (62 + IH2_BASE)
322#define INT_850_NAND (63 + IH2_BASE)
323
324#define INT_24XX_SYS_NIRQ 7
325#define INT_24XX_SDMA_IRQ0 12
326#define INT_24XX_SDMA_IRQ1 13
327#define INT_24XX_SDMA_IRQ2 14
328#define INT_24XX_SDMA_IRQ3 15
329#define INT_24XX_CAM_IRQ 24
330#define INT_24XX_DSS_IRQ 25
331#define INT_24XX_MAIL_U0_MPU 26
332#define INT_24XX_DSP_UMA 27
333#define INT_24XX_DSP_MMU 28
334#define INT_24XX_GPIO_BANK1 29
335#define INT_24XX_GPIO_BANK2 30
336#define INT_24XX_GPIO_BANK3 31
337#define INT_24XX_GPIO_BANK4 32
338#define INT_24XX_GPIO_BANK5 33
339#define INT_24XX_MAIL_U3_MPU 34
340#define INT_24XX_GPTIMER1 37
341#define INT_24XX_GPTIMER2 38
342#define INT_24XX_GPTIMER3 39
343#define INT_24XX_GPTIMER4 40
344#define INT_24XX_GPTIMER5 41
345#define INT_24XX_GPTIMER6 42
346#define INT_24XX_GPTIMER7 43
347#define INT_24XX_GPTIMER8 44
348#define INT_24XX_GPTIMER9 45
349#define INT_24XX_GPTIMER10 46
350#define INT_24XX_GPTIMER11 47
351#define INT_24XX_GPTIMER12 48
352#define INT_24XX_SHA1MD5 51
353#define INT_24XX_MCBSP4_IRQ_TX 54
354#define INT_24XX_MCBSP4_IRQ_RX 55
355#define INT_24XX_I2C1_IRQ 56
356#define INT_24XX_I2C2_IRQ 57
357#define INT_24XX_HDQ_IRQ 58
358#define INT_24XX_MCBSP1_IRQ_TX 59
359#define INT_24XX_MCBSP1_IRQ_RX 60
360#define INT_24XX_MCBSP2_IRQ_TX 62
361#define INT_24XX_MCBSP2_IRQ_RX 63
362#define INT_24XX_SPI1_IRQ 65
363#define INT_24XX_SPI2_IRQ 66
364#define INT_24XX_UART1_IRQ 72
365#define INT_24XX_UART2_IRQ 73
366#define INT_24XX_UART3_IRQ 74
367#define INT_24XX_USB_IRQ_GEN 75
368#define INT_24XX_USB_IRQ_NISO 76
369#define INT_24XX_USB_IRQ_ISO 77
370#define INT_24XX_USB_IRQ_HGEN 78
371#define INT_24XX_USB_IRQ_HSOF 79
372#define INT_24XX_USB_IRQ_OTG 80
373#define INT_24XX_MCBSP5_IRQ_TX 81
374#define INT_24XX_MCBSP5_IRQ_RX 82
375#define INT_24XX_MMC_IRQ 83
376#define INT_24XX_MMC2_IRQ 86
377#define INT_24XX_MCBSP3_IRQ_TX 89
378#define INT_24XX_MCBSP3_IRQ_RX 90
379#define INT_24XX_SPI3_IRQ 91
380
381#define INT_243X_MCBSP2_IRQ 16
382#define INT_243X_MCBSP3_IRQ 17
383#define INT_243X_MCBSP4_IRQ 18
384#define INT_243X_MCBSP5_IRQ 19
385#define INT_243X_MCBSP1_IRQ 64
386#define INT_243X_HS_USB_MC 92
387#define INT_243X_HS_USB_DMA 93
388#define INT_243X_CARKIT_IRQ 94
389
390#define INT_34XX_BENCH_MPU_EMUL 3
391#define INT_34XX_ST_MCBSP2_IRQ 4
392#define INT_34XX_ST_MCBSP3_IRQ 5
393#define INT_34XX_SSM_ABORT_IRQ 6
394#define INT_34XX_SYS_NIRQ 7
395#define INT_34XX_D2D_FW_IRQ 8
396#define INT_34XX_PRCM_MPU_IRQ 11
397#define INT_34XX_MCBSP1_IRQ 16
398#define INT_34XX_MCBSP2_IRQ 17
399#define INT_34XX_MCBSP3_IRQ 22
400#define INT_34XX_MCBSP4_IRQ 23
401#define INT_34XX_CAM_IRQ 24
402#define INT_34XX_MCBSP5_IRQ 27
403#define INT_34XX_GPIO_BANK1 29
404#define INT_34XX_GPIO_BANK2 30
405#define INT_34XX_GPIO_BANK3 31
406#define INT_34XX_GPIO_BANK4 32
407#define INT_34XX_GPIO_BANK5 33
408#define INT_34XX_GPIO_BANK6 34
409#define INT_34XX_USIM_IRQ 35
410#define INT_34XX_WDT3_IRQ 36
411#define INT_34XX_SPI4_IRQ 48
412#define INT_34XX_SHA1MD52_IRQ 49
413#define INT_34XX_FPKA_READY_IRQ 50
414#define INT_34XX_SHA1MD51_IRQ 51
415#define INT_34XX_RNG_IRQ 52
416#define INT_34XX_I2C3_IRQ 61
417#define INT_34XX_FPKA_ERROR_IRQ 64
418#define INT_34XX_PBIAS_IRQ 75
419#define INT_34XX_OHCI_IRQ 76
420#define INT_34XX_EHCI_IRQ 77
421#define INT_34XX_TLL_IRQ 78
422#define INT_34XX_PARTHASH_IRQ 79
423#define INT_34XX_MMC3_IRQ 94
424#define INT_34XX_GPT12_IRQ 95
425
426#define INT_34XX_BENCH_MPU_EMUL 3
427
428
429#define IRQ_GIC_START 32
430#define INT_44XX_LOCALTIMER_IRQ 29
431#define INT_44XX_LOCALWDT_IRQ 30
432
433#define INT_44XX_BENCH_MPU_EMUL (3 + IRQ_GIC_START)
434#define INT_44XX_SSM_ABORT_IRQ (6 + IRQ_GIC_START)
435#define INT_44XX_SYS_NIRQ (7 + IRQ_GIC_START)
436#define INT_44XX_D2D_FW_IRQ (8 + IRQ_GIC_START)
437#define INT_44XX_PRCM_MPU_IRQ (11 + IRQ_GIC_START)
438#define INT_44XX_SDMA_IRQ0 (12 + IRQ_GIC_START)
439#define INT_44XX_SDMA_IRQ1 (13 + IRQ_GIC_START)
440#define INT_44XX_SDMA_IRQ2 (14 + IRQ_GIC_START)
441#define INT_44XX_SDMA_IRQ3 (15 + IRQ_GIC_START)
442#define INT_44XX_ISS_IRQ (24 + IRQ_GIC_START)
443#define INT_44XX_DSS_IRQ (25 + IRQ_GIC_START)
444#define INT_44XX_MAIL_U0_MPU (26 + IRQ_GIC_START)
445#define INT_44XX_DSP_MMU (28 + IRQ_GIC_START)
446#define INT_44XX_GPTIMER1 (37 + IRQ_GIC_START)
447#define INT_44XX_GPTIMER2 (38 + IRQ_GIC_START)
448#define INT_44XX_GPTIMER3 (39 + IRQ_GIC_START)
449#define INT_44XX_GPTIMER4 (40 + IRQ_GIC_START)
450#define INT_44XX_GPTIMER5 (41 + IRQ_GIC_START)
451#define INT_44XX_GPTIMER6 (42 + IRQ_GIC_START)
452#define INT_44XX_GPTIMER7 (43 + IRQ_GIC_START)
453#define INT_44XX_GPTIMER8 (44 + IRQ_GIC_START)
454#define INT_44XX_GPTIMER9 (45 + IRQ_GIC_START)
455#define INT_44XX_GPTIMER10 (46 + IRQ_GIC_START)
456#define INT_44XX_GPTIMER11 (47 + IRQ_GIC_START)
457#define INT_44XX_GPTIMER12 (95 + IRQ_GIC_START)
458#define INT_44XX_SHA1MD5 (51 + IRQ_GIC_START)
459#define INT_44XX_I2C1_IRQ (56 + IRQ_GIC_START)
460#define INT_44XX_I2C2_IRQ (57 + IRQ_GIC_START)
461#define INT_44XX_HDQ_IRQ (58 + IRQ_GIC_START)
462#define INT_44XX_SPI1_IRQ (65 + IRQ_GIC_START)
463#define INT_44XX_SPI2_IRQ (66 + IRQ_GIC_START)
464#define INT_44XX_HSI_1_IRQ0 (67 + IRQ_GIC_START)
465#define INT_44XX_HSI_2_IRQ1 (68 + IRQ_GIC_START)
466#define INT_44XX_HSI_1_DMAIRQ (71 + IRQ_GIC_START)
467#define INT_44XX_UART1_IRQ (72 + IRQ_GIC_START)
468#define INT_44XX_UART2_IRQ (73 + IRQ_GIC_START)
469#define INT_44XX_UART3_IRQ (74 + IRQ_GIC_START)
470#define INT_44XX_UART4_IRQ (70 + IRQ_GIC_START)
471#define INT_44XX_USB_IRQ_NISO (76 + IRQ_GIC_START)
472#define INT_44XX_USB_IRQ_ISO (77 + IRQ_GIC_START)
473#define INT_44XX_USB_IRQ_HGEN (78 + IRQ_GIC_START)
474#define INT_44XX_USB_IRQ_HSOF (79 + IRQ_GIC_START)
475#define INT_44XX_USB_IRQ_OTG (80 + IRQ_GIC_START)
476#define INT_44XX_MCBSP4_IRQ_TX (81 + IRQ_GIC_START)
477#define INT_44XX_MCBSP4_IRQ_RX (82 + IRQ_GIC_START)
478#define INT_44XX_MMC_IRQ (83 + IRQ_GIC_START)
479#define INT_44XX_MMC2_IRQ (86 + IRQ_GIC_START)
480#define INT_44XX_MCBSP2_IRQ_TX (89 + IRQ_GIC_START)
481#define INT_44XX_MCBSP2_IRQ_RX (90 + IRQ_GIC_START)
482#define INT_44XX_SPI3_IRQ (91 + IRQ_GIC_START)
483#define INT_44XX_SPI5_IRQ (69 + IRQ_GIC_START)
484
485#define INT_44XX_MCBSP5_IRQ (16 + IRQ_GIC_START)
486#define INT_44xX_MCBSP1_IRQ (17 + IRQ_GIC_START)
487#define INT_44XX_MCBSP2_IRQ (22 + IRQ_GIC_START)
488#define INT_44XX_MCBSP3_IRQ (23 + IRQ_GIC_START)
489#define INT_44XX_MCBSP4_IRQ (27 + IRQ_GIC_START)
490#define INT_44XX_HS_USB_MC (92 + IRQ_GIC_START)
491#define INT_44XX_HS_USB_DMA (93 + IRQ_GIC_START)
492
493#define INT_44XX_GPIO_BANK1 (29 + IRQ_GIC_START)
494#define INT_44XX_GPIO_BANK2 (30 + IRQ_GIC_START)
495#define INT_44XX_GPIO_BANK3 (31 + IRQ_GIC_START)
496#define INT_44XX_GPIO_BANK4 (32 + IRQ_GIC_START)
497#define INT_44XX_GPIO_BANK5 (33 + IRQ_GIC_START)
498#define INT_44XX_GPIO_BANK6 (34 + IRQ_GIC_START)
499#define INT_44XX_USIM_IRQ (35 + IRQ_GIC_START)
500#define INT_44XX_WDT3_IRQ (36 + IRQ_GIC_START)
501#define INT_44XX_SPI4_IRQ (48 + IRQ_GIC_START)
502#define INT_44XX_SHA1MD52_IRQ (49 + IRQ_GIC_START)
503#define INT_44XX_FPKA_READY_IRQ (50 + IRQ_GIC_START)
504#define INT_44XX_SHA1MD51_IRQ (51 + IRQ_GIC_START)
505#define INT_44XX_RNG_IRQ (52 + IRQ_GIC_START)
506#define INT_44XX_MMC5_IRQ (59 + IRQ_GIC_START)
507#define INT_44XX_I2C3_IRQ (61 + IRQ_GIC_START)
508#define INT_44XX_FPKA_ERROR_IRQ (64 + IRQ_GIC_START)
509#define INT_44XX_PBIAS_IRQ (75 + IRQ_GIC_START)
510#define INT_44XX_OHCI_IRQ (76 + IRQ_GIC_START)
511#define INT_44XX_EHCI_IRQ (77 + IRQ_GIC_START)
512#define INT_44XX_TLL_IRQ (78 + IRQ_GIC_START)
513#define INT_44XX_PARTHASH_IRQ (79 + IRQ_GIC_START)
514#define INT_44XX_MMC3_IRQ (94 + IRQ_GIC_START)
515#define INT_44XX_MMC4_IRQ (96 + IRQ_GIC_START)
516
517
518/* Max. 128 level 2 IRQs (OMAP1610), 192 GPIOs (OMAP730/850) and
519 * 16 MPUIO lines */
520#define OMAP_MAX_GPIO_LINES 192
521#define IH_GPIO_BASE (128 + IH2_BASE)
522#define IH_MPUIO_BASE (OMAP_MAX_GPIO_LINES + IH_GPIO_BASE)
523#define OMAP_IRQ_END (IH_MPUIO_BASE + 16)
524
525/* External FPGA handles interrupts on Innovator boards */
526#define OMAP_FPGA_IRQ_BASE (OMAP_IRQ_END)
527#ifdef CONFIG_MACH_OMAP_INNOVATOR
528#define OMAP_FPGA_NR_IRQS 24
529#else
530#define OMAP_FPGA_NR_IRQS 0
531#endif
532#define OMAP_FPGA_IRQ_END (OMAP_FPGA_IRQ_BASE + OMAP_FPGA_NR_IRQS)
533
534/* External TWL4030 can handle interrupts on 2430 and 34xx boards */
535#define TWL4030_IRQ_BASE (OMAP_FPGA_IRQ_END)
536#ifdef CONFIG_TWL4030_CORE
537#define TWL4030_BASE_NR_IRQS 8
538#define TWL4030_PWR_NR_IRQS 8
539#else
540#define TWL4030_BASE_NR_IRQS 0
541#define TWL4030_PWR_NR_IRQS 0
542#endif
543#define TWL4030_IRQ_END (TWL4030_IRQ_BASE + TWL4030_BASE_NR_IRQS)
544#define TWL4030_PWR_IRQ_BASE TWL4030_IRQ_END
545#define TWL4030_PWR_IRQ_END (TWL4030_PWR_IRQ_BASE + TWL4030_PWR_NR_IRQS)
546
547/* External TWL4030 gpio interrupts are optional */
548#define TWL4030_GPIO_IRQ_BASE TWL4030_PWR_IRQ_END
549#ifdef CONFIG_GPIO_TWL4030
550#define TWL4030_GPIO_NR_IRQS 18
551#else
552#define TWL4030_GPIO_NR_IRQS 0
553#endif
554#define TWL4030_GPIO_IRQ_END (TWL4030_GPIO_IRQ_BASE + TWL4030_GPIO_NR_IRQS)
555
556/* Total number of interrupts depends on the enabled blocks above */
557#define NR_IRQS TWL4030_GPIO_IRQ_END
558
559#define OMAP_IRQ_BIT(irq) (1 << ((irq) % 32))
560
561#ifndef __ASSEMBLY__
562extern void omap_init_irq(void);
563extern int omap_irq_pending(void);
564#endif
565
566#include <mach/hardware.h>
567
568#endif
diff --git a/arch/arm/plat-omap/include/mach/mtd-xip.h b/arch/arm/plat-omap/include/mach/mtd-xip.h
deleted file mode 100644
index f82a8dcaad94..000000000000
--- a/arch/arm/plat-omap/include/mach/mtd-xip.h
+++ /dev/null
@@ -1,61 +0,0 @@
1/*
2 * MTD primitives for XIP support. Architecture specific functions.
3 *
4 * Do not include this file directly. It's included from linux/mtd/xip.h
5 *
6 * Author: Vladimir Barinov <vbarinov@embeddedalley.com>
7 *
8 * (c) 2005 MontaVista Software, Inc. This file is licensed under the
9 * terms of the GNU General Public License version 2. This program is
10 * licensed "as is" without any warranty of any kind, whether express or
11 * implied.
12 */
13
14#ifndef __ARCH_OMAP_MTD_XIP_H__
15#define __ARCH_OMAP_MTD_XIP_H__
16
17#include <mach/hardware.h>
18#define OMAP_MPU_TIMER_BASE (0xfffec500)
19#define OMAP_MPU_TIMER_OFFSET 0x100
20
21typedef struct {
22 u32 cntl; /* CNTL_TIMER, R/W */
23 u32 load_tim; /* LOAD_TIM, W */
24 u32 read_tim; /* READ_TIM, R */
25} xip_omap_mpu_timer_regs_t;
26
27#define xip_omap_mpu_timer_base(n) \
28((volatile xip_omap_mpu_timer_regs_t*)OMAP1_IO_ADDRESS(OMAP_MPU_TIMER_BASE + \
29 (n)*OMAP_MPU_TIMER_OFFSET))
30
31static inline unsigned long xip_omap_mpu_timer_read(int nr)
32{
33 volatile xip_omap_mpu_timer_regs_t* timer = xip_omap_mpu_timer_base(nr);
34 return timer->read_tim;
35}
36
37#define xip_irqpending() \
38 (omap_readl(OMAP_IH1_ITR) & ~omap_readl(OMAP_IH1_MIR))
39#define xip_currtime() (~xip_omap_mpu_timer_read(0))
40
41/*
42 * It's permitted to do approxmation for xip_elapsed_since macro
43 * (see linux/mtd/xip.h)
44 */
45
46#ifdef CONFIG_MACH_OMAP_PERSEUS2
47#define xip_elapsed_since(x) (signed)((~xip_omap_mpu_timer_read(0) - (x)) / 7)
48#else
49#define xip_elapsed_since(x) (signed)((~xip_omap_mpu_timer_read(0) - (x)) / 6)
50#endif
51
52/*
53 * xip_cpu_idle() is used when waiting for a delay equal or larger than
54 * the system timer tick period. This should put the CPU into idle mode
55 * to save power and to be woken up only when some interrupts are pending.
56 * As above, this should not rely upon standard kernel code.
57 */
58
59#define xip_cpu_idle() asm volatile ("mcr p15, 0, %0, c7, c0, 4" :: "r" (1))
60
61#endif /* __ARCH_OMAP_MTD_XIP_H__ */
diff --git a/arch/arm/plat-omap/include/mach/omapfb.h b/arch/arm/plat-omap/include/mach/omapfb.h
deleted file mode 100644
index b226bdf45739..000000000000
--- a/arch/arm/plat-omap/include/mach/omapfb.h
+++ /dev/null
@@ -1,398 +0,0 @@
1/*
2 * File: arch/arm/plat-omap/include/mach/omapfb.h
3 *
4 * Framebuffer driver for TI OMAP boards
5 *
6 * Copyright (C) 2004 Nokia Corporation
7 * Author: Imre Deak <imre.deak@nokia.com>
8 *
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation; either version 2 of the License, or (at your
12 * option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 */
23
24#ifndef __OMAPFB_H
25#define __OMAPFB_H
26
27#include <asm/ioctl.h>
28#include <asm/types.h>
29
30/* IOCTL commands. */
31
32#define OMAP_IOW(num, dtype) _IOW('O', num, dtype)
33#define OMAP_IOR(num, dtype) _IOR('O', num, dtype)
34#define OMAP_IOWR(num, dtype) _IOWR('O', num, dtype)
35#define OMAP_IO(num) _IO('O', num)
36
37#define OMAPFB_MIRROR OMAP_IOW(31, int)
38#define OMAPFB_SYNC_GFX OMAP_IO(37)
39#define OMAPFB_VSYNC OMAP_IO(38)
40#define OMAPFB_SET_UPDATE_MODE OMAP_IOW(40, int)
41#define OMAPFB_GET_CAPS OMAP_IOR(42, struct omapfb_caps)
42#define OMAPFB_GET_UPDATE_MODE OMAP_IOW(43, int)
43#define OMAPFB_LCD_TEST OMAP_IOW(45, int)
44#define OMAPFB_CTRL_TEST OMAP_IOW(46, int)
45#define OMAPFB_UPDATE_WINDOW_OLD OMAP_IOW(47, struct omapfb_update_window_old)
46#define OMAPFB_SET_COLOR_KEY OMAP_IOW(50, struct omapfb_color_key)
47#define OMAPFB_GET_COLOR_KEY OMAP_IOW(51, struct omapfb_color_key)
48#define OMAPFB_SETUP_PLANE OMAP_IOW(52, struct omapfb_plane_info)
49#define OMAPFB_QUERY_PLANE OMAP_IOW(53, struct omapfb_plane_info)
50#define OMAPFB_UPDATE_WINDOW OMAP_IOW(54, struct omapfb_update_window)
51#define OMAPFB_SETUP_MEM OMAP_IOW(55, struct omapfb_mem_info)
52#define OMAPFB_QUERY_MEM OMAP_IOW(56, struct omapfb_mem_info)
53
54#define OMAPFB_CAPS_GENERIC_MASK 0x00000fff
55#define OMAPFB_CAPS_LCDC_MASK 0x00fff000
56#define OMAPFB_CAPS_PANEL_MASK 0xff000000
57
58#define OMAPFB_CAPS_MANUAL_UPDATE 0x00001000
59#define OMAPFB_CAPS_TEARSYNC 0x00002000
60#define OMAPFB_CAPS_PLANE_RELOCATE_MEM 0x00004000
61#define OMAPFB_CAPS_PLANE_SCALE 0x00008000
62#define OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE 0x00010000
63#define OMAPFB_CAPS_WINDOW_SCALE 0x00020000
64#define OMAPFB_CAPS_WINDOW_OVERLAY 0x00040000
65#define OMAPFB_CAPS_WINDOW_ROTATE 0x00080000
66#define OMAPFB_CAPS_SET_BACKLIGHT 0x01000000
67
68/* Values from DSP must map to lower 16-bits */
69#define OMAPFB_FORMAT_MASK 0x00ff
70#define OMAPFB_FORMAT_FLAG_DOUBLE 0x0100
71#define OMAPFB_FORMAT_FLAG_TEARSYNC 0x0200
72#define OMAPFB_FORMAT_FLAG_FORCE_VSYNC 0x0400
73#define OMAPFB_FORMAT_FLAG_ENABLE_OVERLAY 0x0800
74#define OMAPFB_FORMAT_FLAG_DISABLE_OVERLAY 0x1000
75
76#define OMAPFB_EVENT_READY 1
77#define OMAPFB_EVENT_DISABLED 2
78
79#define OMAPFB_MEMTYPE_SDRAM 0
80#define OMAPFB_MEMTYPE_SRAM 1
81#define OMAPFB_MEMTYPE_MAX 1
82
83enum omapfb_color_format {
84 OMAPFB_COLOR_RGB565 = 0,
85 OMAPFB_COLOR_YUV422,
86 OMAPFB_COLOR_YUV420,
87 OMAPFB_COLOR_CLUT_8BPP,
88 OMAPFB_COLOR_CLUT_4BPP,
89 OMAPFB_COLOR_CLUT_2BPP,
90 OMAPFB_COLOR_CLUT_1BPP,
91 OMAPFB_COLOR_RGB444,
92 OMAPFB_COLOR_YUY422,
93};
94
95struct omapfb_update_window {
96 __u32 x, y;
97 __u32 width, height;
98 __u32 format;
99 __u32 out_x, out_y;
100 __u32 out_width, out_height;
101 __u32 reserved[8];
102};
103
104struct omapfb_update_window_old {
105 __u32 x, y;
106 __u32 width, height;
107 __u32 format;
108};
109
110enum omapfb_plane {
111 OMAPFB_PLANE_GFX = 0,
112 OMAPFB_PLANE_VID1,
113 OMAPFB_PLANE_VID2,
114};
115
116enum omapfb_channel_out {
117 OMAPFB_CHANNEL_OUT_LCD = 0,
118 OMAPFB_CHANNEL_OUT_DIGIT,
119};
120
121struct omapfb_plane_info {
122 __u32 pos_x;
123 __u32 pos_y;
124 __u8 enabled;
125 __u8 channel_out;
126 __u8 mirror;
127 __u8 reserved1;
128 __u32 out_width;
129 __u32 out_height;
130 __u32 reserved2[12];
131};
132
133struct omapfb_mem_info {
134 __u32 size;
135 __u8 type;
136 __u8 reserved[3];
137};
138
139struct omapfb_caps {
140 __u32 ctrl;
141 __u32 plane_color;
142 __u32 wnd_color;
143};
144
145enum omapfb_color_key_type {
146 OMAPFB_COLOR_KEY_DISABLED = 0,
147 OMAPFB_COLOR_KEY_GFX_DST,
148 OMAPFB_COLOR_KEY_VID_SRC,
149};
150
151struct omapfb_color_key {
152 __u8 channel_out;
153 __u32 background;
154 __u32 trans_key;
155 __u8 key_type;
156};
157
158enum omapfb_update_mode {
159 OMAPFB_UPDATE_DISABLED = 0,
160 OMAPFB_AUTO_UPDATE,
161 OMAPFB_MANUAL_UPDATE
162};
163
164#ifdef __KERNEL__
165
166#include <linux/completion.h>
167#include <linux/interrupt.h>
168#include <linux/fb.h>
169#include <linux/mutex.h>
170
171#include <mach/board.h>
172
173#define OMAP_LCDC_INV_VSYNC 0x0001
174#define OMAP_LCDC_INV_HSYNC 0x0002
175#define OMAP_LCDC_INV_PIX_CLOCK 0x0004
176#define OMAP_LCDC_INV_OUTPUT_EN 0x0008
177#define OMAP_LCDC_HSVS_RISING_EDGE 0x0010
178#define OMAP_LCDC_HSVS_OPPOSITE 0x0020
179
180#define OMAP_LCDC_SIGNAL_MASK 0x003f
181
182#define OMAP_LCDC_PANEL_TFT 0x0100
183
184#define OMAPFB_PLANE_XRES_MIN 8
185#define OMAPFB_PLANE_YRES_MIN 8
186
187#ifdef CONFIG_ARCH_OMAP1
188#define OMAPFB_PLANE_NUM 1
189#else
190#define OMAPFB_PLANE_NUM 3
191#endif
192
193struct omapfb_device;
194
195struct lcd_panel {
196 const char *name;
197 int config; /* TFT/STN, signal inversion */
198 int bpp; /* Pixel format in fb mem */
199 int data_lines; /* Lines on LCD HW interface */
200
201 int x_res, y_res;
202 int pixel_clock; /* In kHz */
203 int hsw; /* Horizontal synchronization
204 pulse width */
205 int hfp; /* Horizontal front porch */
206 int hbp; /* Horizontal back porch */
207 int vsw; /* Vertical synchronization
208 pulse width */
209 int vfp; /* Vertical front porch */
210 int vbp; /* Vertical back porch */
211 int acb; /* ac-bias pin frequency */
212 int pcd; /* pixel clock divider.
213 Obsolete use pixel_clock instead */
214
215 int (*init) (struct lcd_panel *panel,
216 struct omapfb_device *fbdev);
217 void (*cleanup) (struct lcd_panel *panel);
218 int (*enable) (struct lcd_panel *panel);
219 void (*disable) (struct lcd_panel *panel);
220 unsigned long (*get_caps) (struct lcd_panel *panel);
221 int (*set_bklight_level)(struct lcd_panel *panel,
222 unsigned int level);
223 unsigned int (*get_bklight_level)(struct lcd_panel *panel);
224 unsigned int (*get_bklight_max) (struct lcd_panel *panel);
225 int (*run_test) (struct lcd_panel *panel, int test_num);
226};
227
228struct extif_timings {
229 int cs_on_time;
230 int cs_off_time;
231 int we_on_time;
232 int we_off_time;
233 int re_on_time;
234 int re_off_time;
235 int we_cycle_time;
236 int re_cycle_time;
237 int cs_pulse_width;
238 int access_time;
239
240 int clk_div;
241
242 u32 tim[5]; /* set by extif->convert_timings */
243
244 int converted;
245};
246
247struct lcd_ctrl_extif {
248 int (*init) (struct omapfb_device *fbdev);
249 void (*cleanup) (void);
250 void (*get_clk_info) (u32 *clk_period, u32 *max_clk_div);
251 unsigned long (*get_max_tx_rate)(void);
252 int (*convert_timings) (struct extif_timings *timings);
253 void (*set_timings) (const struct extif_timings *timings);
254 void (*set_bits_per_cycle)(int bpc);
255 void (*write_command) (const void *buf, unsigned int len);
256 void (*read_data) (void *buf, unsigned int len);
257 void (*write_data) (const void *buf, unsigned int len);
258 void (*transfer_area) (int width, int height,
259 void (callback)(void * data), void *data);
260 int (*setup_tearsync) (unsigned pin_cnt,
261 unsigned hs_pulse_time, unsigned vs_pulse_time,
262 int hs_pol_inv, int vs_pol_inv, int div);
263 int (*enable_tearsync) (int enable, unsigned line);
264
265 unsigned long max_transmit_size;
266};
267
268struct omapfb_notifier_block {
269 struct notifier_block nb;
270 void *data;
271 int plane_idx;
272};
273
274typedef int (*omapfb_notifier_callback_t)(struct notifier_block *,
275 unsigned long event,
276 void *fbi);
277
278struct omapfb_mem_region {
279 u32 paddr;
280 void __iomem *vaddr;
281 unsigned long size;
282 u8 type; /* OMAPFB_PLANE_MEM_* */
283 unsigned alloc:1; /* allocated by the driver */
284 unsigned map:1; /* kernel mapped by the driver */
285};
286
287struct omapfb_mem_desc {
288 int region_cnt;
289 struct omapfb_mem_region region[OMAPFB_PLANE_NUM];
290};
291
292struct lcd_ctrl {
293 const char *name;
294 void *data;
295
296 int (*init) (struct omapfb_device *fbdev,
297 int ext_mode,
298 struct omapfb_mem_desc *req_md);
299 void (*cleanup) (void);
300 void (*bind_client) (struct omapfb_notifier_block *nb);
301 void (*get_caps) (int plane, struct omapfb_caps *caps);
302 int (*set_update_mode)(enum omapfb_update_mode mode);
303 enum omapfb_update_mode (*get_update_mode)(void);
304 int (*setup_plane) (int plane, int channel_out,
305 unsigned long offset,
306 int screen_width,
307 int pos_x, int pos_y, int width,
308 int height, int color_mode);
309 int (*set_rotate) (int angle);
310 int (*setup_mem) (int plane, size_t size,
311 int mem_type, unsigned long *paddr);
312 int (*mmap) (struct fb_info *info,
313 struct vm_area_struct *vma);
314 int (*set_scale) (int plane,
315 int orig_width, int orig_height,
316 int out_width, int out_height);
317 int (*enable_plane) (int plane, int enable);
318 int (*update_window) (struct fb_info *fbi,
319 struct omapfb_update_window *win,
320 void (*callback)(void *),
321 void *callback_data);
322 void (*sync) (void);
323 void (*suspend) (void);
324 void (*resume) (void);
325 int (*run_test) (int test_num);
326 int (*setcolreg) (u_int regno, u16 red, u16 green,
327 u16 blue, u16 transp,
328 int update_hw_mem);
329 int (*set_color_key) (struct omapfb_color_key *ck);
330 int (*get_color_key) (struct omapfb_color_key *ck);
331};
332
333enum omapfb_state {
334 OMAPFB_DISABLED = 0,
335 OMAPFB_SUSPENDED= 99,
336 OMAPFB_ACTIVE = 100
337};
338
339struct omapfb_plane_struct {
340 int idx;
341 struct omapfb_plane_info info;
342 enum omapfb_color_format color_mode;
343 struct omapfb_device *fbdev;
344};
345
346struct omapfb_device {
347 int state;
348 int ext_lcdc; /* Using external
349 LCD controller */
350 struct mutex rqueue_mutex;
351
352 int palette_size;
353 u32 pseudo_palette[17];
354
355 struct lcd_panel *panel; /* LCD panel */
356 const struct lcd_ctrl *ctrl; /* LCD controller */
357 const struct lcd_ctrl *int_ctrl; /* internal LCD ctrl */
358 struct lcd_ctrl_extif *ext_if; /* LCD ctrl external
359 interface */
360 struct device *dev;
361 struct fb_var_screeninfo new_var; /* for mode changes */
362
363 struct omapfb_mem_desc mem_desc;
364 struct fb_info *fb_info[OMAPFB_PLANE_NUM];
365};
366
367struct omapfb_platform_data {
368 struct omap_lcd_config lcd;
369 struct omapfb_mem_desc mem_desc;
370 void *ctrl_platform_data;
371};
372
373#ifdef CONFIG_ARCH_OMAP1
374extern struct lcd_ctrl omap1_lcd_ctrl;
375#else
376extern struct lcd_ctrl omap2_disp_ctrl;
377#endif
378
379extern void omapfb_reserve_sdram(void);
380extern void omapfb_register_panel(struct lcd_panel *panel);
381extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval);
382extern void omapfb_notify_clients(struct omapfb_device *fbdev,
383 unsigned long event);
384extern int omapfb_register_client(struct omapfb_notifier_block *nb,
385 omapfb_notifier_callback_t callback,
386 void *callback_data);
387extern int omapfb_unregister_client(struct omapfb_notifier_block *nb);
388extern int omapfb_update_window_async(struct fb_info *fbi,
389 struct omapfb_update_window *win,
390 void (*callback)(void *),
391 void *callback_data);
392
393/* in arch/arm/plat-omap/fb.c */
394extern void omapfb_set_ctrl_platform_data(void *pdata);
395
396#endif /* __KERNEL__ */
397
398#endif /* __OMAPFB_H */
diff --git a/arch/arm/plat-omap/include/mach/serial.h b/arch/arm/plat-omap/include/mach/serial.h
deleted file mode 100644
index e249186d26e2..000000000000
--- a/arch/arm/plat-omap/include/mach/serial.h
+++ /dev/null
@@ -1,68 +0,0 @@
1/*
2 * arch/arm/plat-omap/include/mach/serial.h
3 *
4 * Copyright (C) 2009 Texas Instruments
5 * Addded OMAP4 support- Santosh Shilimkar <santosh.shilimkar@ti.com>
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef __ASM_ARCH_SERIAL_H
14#define __ASM_ARCH_SERIAL_H
15
16#include <linux/init.h>
17
18#if defined(CONFIG_ARCH_OMAP1)
19/* OMAP1 serial ports */
20#define OMAP_UART1_BASE 0xfffb0000
21#define OMAP_UART2_BASE 0xfffb0800
22#define OMAP_UART3_BASE 0xfffb9800
23#define OMAP_MAX_NR_PORTS 3
24#elif defined(CONFIG_ARCH_OMAP2)
25/* OMAP2 serial ports */
26#define OMAP_UART1_BASE 0x4806a000
27#define OMAP_UART2_BASE 0x4806c000
28#define OMAP_UART3_BASE 0x4806e000
29#define OMAP_MAX_NR_PORTS 3
30#elif defined(CONFIG_ARCH_OMAP3)
31/* OMAP3 serial ports */
32#define OMAP_UART1_BASE 0x4806a000
33#define OMAP_UART2_BASE 0x4806c000
34#define OMAP_UART3_BASE 0x49020000
35#define OMAP_MAX_NR_PORTS 3
36#elif defined(CONFIG_ARCH_OMAP4)
37/* OMAP4 serial ports */
38#define OMAP_UART1_BASE 0x4806a000
39#define OMAP_UART2_BASE 0x4806c000
40#define OMAP_UART3_BASE 0x48020000
41#define OMAP_UART4_BASE 0x4806e000
42#define OMAP_MAX_NR_PORTS 4
43#endif
44
45#define OMAP1510_BASE_BAUD (12000000/16)
46#define OMAP16XX_BASE_BAUD (48000000/16)
47#define OMAP24XX_BASE_BAUD (48000000/16)
48
49#define is_omap_port(pt) ({int __ret = 0; \
50 if ((pt)->port.mapbase == OMAP_UART1_BASE || \
51 (pt)->port.mapbase == OMAP_UART2_BASE || \
52 (pt)->port.mapbase == OMAP_UART3_BASE) \
53 __ret = 1; \
54 __ret; \
55 })
56
57#ifndef __ASSEMBLER__
58extern void __init omap_serial_early_init(void);
59extern void omap_serial_init(void);
60extern int omap_uart_can_sleep(void);
61extern void omap_uart_check_wakeup(void);
62extern void omap_uart_prepare_suspend(void);
63extern void omap_uart_prepare_idle(int num);
64extern void omap_uart_resume_idle(int num);
65extern void omap_uart_enable_irqs(int enable);
66#endif
67
68#endif
diff --git a/arch/arm/plat-omap/include/mach/uncompress.h b/arch/arm/plat-omap/include/mach/uncompress.h
deleted file mode 100644
index 0814c5f210c3..000000000000
--- a/arch/arm/plat-omap/include/mach/uncompress.h
+++ /dev/null
@@ -1,83 +0,0 @@
1/*
2 * arch/arm/plat-omap/include/mach/uncompress.h
3 *
4 * Serial port stubs for kernel decompress status messages
5 *
6 * Initially based on:
7 * linux-2.4.15-rmk1-dsplinux1.6/arch/arm/plat-omap/include/mach1510/uncompress.h
8 * Copyright (C) 2000 RidgeRun, Inc.
9 * Author: Greg Lonnon <glonnon@ridgerun.com>
10 *
11 * Rewritten by:
12 * Author: <source@mvista.com>
13 * 2004 (c) MontaVista Software, Inc.
14 *
15 * This file is licensed under the terms of the GNU General Public License
16 * version 2. This program is licensed "as is" without any warranty of any
17 * kind, whether express or implied.
18 */
19
20#include <linux/types.h>
21#include <linux/serial_reg.h>
22#include <mach/serial.h>
23
24unsigned int system_rev;
25
26#define UART_OMAP_MDR1 0x08 /* mode definition register */
27#define OMAP_ID_730 0x355F
28#define ID_MASK 0x7fff
29#define check_port(base, shift) ((base[UART_OMAP_MDR1 << shift] & 7) == 0)
30#define omap_get_id() ((*(volatile unsigned int *)(0xfffed404)) >> 12) & ID_MASK
31
32static void putc(int c)
33{
34 volatile u8 * uart = 0;
35 int shift = 2;
36
37#ifdef CONFIG_MACH_OMAP_PALMTE
38 return;
39#endif
40
41#ifdef CONFIG_ARCH_OMAP
42#ifdef CONFIG_OMAP_LL_DEBUG_UART3
43 uart = (volatile u8 *)(OMAP_UART3_BASE);
44#elif defined(CONFIG_OMAP_LL_DEBUG_UART2)
45 uart = (volatile u8 *)(OMAP_UART2_BASE);
46#else
47 uart = (volatile u8 *)(OMAP_UART1_BASE);
48#endif
49
50#ifdef CONFIG_ARCH_OMAP1
51 /* Determine which serial port to use */
52 do {
53 /* MMU is not on, so cpu_is_omapXXXX() won't work here */
54 unsigned int omap_id = omap_get_id();
55
56 if (omap_id == OMAP_ID_730)
57 shift = 0;
58
59 if (check_port(uart, shift))
60 break;
61 /* Silent boot if no serial ports are enabled. */
62 return;
63 } while (0);
64#endif /* CONFIG_ARCH_OMAP1 */
65#endif
66
67 /*
68 * Now, xmit each character
69 */
70 while (!(uart[UART_LSR << shift] & UART_LSR_THRE))
71 barrier();
72 uart[UART_TX << shift] = c;
73}
74
75static inline void flush(void)
76{
77}
78
79/*
80 * nothing to do
81 */
82#define arch_decomp_setup()
83#define arch_decomp_wdog()
diff --git a/arch/arm/plat-omap/include/mach/vmalloc.h b/arch/arm/plat-omap/include/mach/vmalloc.h
deleted file mode 100644
index b97dfafeebda..000000000000
--- a/arch/arm/plat-omap/include/mach/vmalloc.h
+++ /dev/null
@@ -1,21 +0,0 @@
1/*
2 * arch/arm/plat-omap/include/mach/vmalloc.h
3 *
4 * Copyright (C) 2000 Russell King.
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 as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20#define VMALLOC_END (PAGE_OFFSET + 0x18000000)
21
diff --git a/arch/arm/plat-omap/include/mach/blizzard.h b/arch/arm/plat-omap/include/plat/blizzard.h
index 8d160f171372..56e7f2e7d12f 100644
--- a/arch/arm/plat-omap/include/mach/blizzard.h
+++ b/arch/arm/plat-omap/include/plat/blizzard.h
@@ -6,7 +6,7 @@ struct blizzard_platform_data {
6 void (*power_down)(struct device *dev); 6 void (*power_down)(struct device *dev);
7 unsigned long (*get_clock_rate)(struct device *dev); 7 unsigned long (*get_clock_rate)(struct device *dev);
8 8
9 unsigned te_connected : 1; 9 unsigned te_connected:1;
10}; 10};
11 11
12#endif 12#endif
diff --git a/arch/arm/plat-omap/include/mach/board-ams-delta.h b/arch/arm/plat-omap/include/plat/board-ams-delta.h
index 51b102dc906b..51b102dc906b 100644
--- a/arch/arm/plat-omap/include/mach/board-ams-delta.h
+++ b/arch/arm/plat-omap/include/plat/board-ams-delta.h
diff --git a/arch/arm/plat-omap/include/mach/board-sx1.h b/arch/arm/plat-omap/include/plat/board-sx1.h
index 355adbdaae33..355adbdaae33 100644
--- a/arch/arm/plat-omap/include/mach/board-sx1.h
+++ b/arch/arm/plat-omap/include/plat/board-sx1.h
diff --git a/arch/arm/plat-omap/include/mach/board-voiceblue.h b/arch/arm/plat-omap/include/plat/board-voiceblue.h
index 27916b210f57..27916b210f57 100644
--- a/arch/arm/plat-omap/include/mach/board-voiceblue.h
+++ b/arch/arm/plat-omap/include/plat/board-voiceblue.h
diff --git a/arch/arm/plat-omap/include/mach/board.h b/arch/arm/plat-omap/include/plat/board.h
index 8e913c322810..5cd622039da0 100644
--- a/arch/arm/plat-omap/include/mach/board.h
+++ b/arch/arm/plat-omap/include/plat/board.h
@@ -12,7 +12,19 @@
12 12
13#include <linux/types.h> 13#include <linux/types.h>
14 14
15#include <mach/gpio-switch.h> 15#include <plat/gpio-switch.h>
16
17/*
18 * OMAP35x EVM revision
19 * Run time detection of EVM revision is done by reading Ethernet
20 * PHY ID -
21 * GEN_1 = 0x01150000
22 * GEN_2 = 0x92200000
23 */
24enum {
25 OMAP3EVM_BOARD_GEN_1 = 0, /* EVM Rev between A - D */
26 OMAP3EVM_BOARD_GEN_2, /* EVM Rev >= Rev E */
27};
16 28
17/* Different peripheral ids */ 29/* Different peripheral ids */
18#define OMAP_TAG_CLOCK 0x4f01 30#define OMAP_TAG_CLOCK 0x4f01
@@ -87,7 +99,6 @@ struct fb_info;
87struct omap_backlight_config { 99struct omap_backlight_config {
88 int default_intensity; 100 int default_intensity;
89 int (*set_power)(struct device *dev, int state); 101 int (*set_power)(struct device *dev, int state);
90 int (*check_fb)(struct fb_info *fb);
91}; 102};
92 103
93struct omap_fbmem_config { 104struct omap_fbmem_config {
@@ -102,15 +113,6 @@ struct omap_pwm_led_platform_data {
102 void (*set_power)(struct omap_pwm_led_platform_data *self, int on_off); 113 void (*set_power)(struct omap_pwm_led_platform_data *self, int on_off);
103}; 114};
104 115
105/* See arch/arm/plat-omap/include/mach/gpio-switch.h for definitions */
106struct omap_gpio_switch_config {
107 char name[12];
108 u16 gpio;
109 int flags:4;
110 int type:4;
111 int key_code:24; /* Linux key code */
112};
113
114struct omap_uart_config { 116struct omap_uart_config {
115 /* Bit field of UARTs present; bit 0 --> UART1 */ 117 /* Bit field of UARTs present; bit 0 --> UART1 */
116 unsigned int enabled_uarts; 118 unsigned int enabled_uarts;
@@ -157,4 +159,10 @@ extern int omap_board_config_size;
157/* for TI reference platforms sharing the same debug card */ 159/* for TI reference platforms sharing the same debug card */
158extern int debug_card_init(u32 addr, unsigned gpio); 160extern int debug_card_init(u32 addr, unsigned gpio);
159 161
162/* OMAP3EVM revision */
163#if defined(CONFIG_MACH_OMAP3EVM)
164u8 get_omap3_evm_rev(void);
165#else
166#define get_omap3_evm_rev() (-EINVAL)
167#endif
160#endif 168#endif
diff --git a/arch/arm/plat-omap/include/mach/clkdev.h b/arch/arm/plat-omap/include/plat/clkdev.h
index 730c49d1ebd8..730c49d1ebd8 100644
--- a/arch/arm/plat-omap/include/mach/clkdev.h
+++ b/arch/arm/plat-omap/include/plat/clkdev.h
diff --git a/arch/arm/plat-omap/include/plat/clkdev_omap.h b/arch/arm/plat-omap/include/plat/clkdev_omap.h
new file mode 100644
index 000000000000..bb937f3fabed
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/clkdev_omap.h
@@ -0,0 +1,49 @@
1/*
2 * clkdev <-> OMAP integration
3 *
4 * Russell King <linux@arm.linux.org.uk>
5 *
6 */
7
8#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_PLAT_CLKDEV_OMAP_H
9#define __ARCH_ARM_PLAT_OMAP_INCLUDE_PLAT_CLKDEV_OMAP_H
10
11#include <asm/clkdev.h>
12
13struct omap_clk {
14 u16 cpu;
15 struct clk_lookup lk;
16};
17
18#define CLK(dev, con, ck, cp) \
19 { \
20 .cpu = cp, \
21 .lk = { \
22 .dev_id = dev, \
23 .con_id = con, \
24 .clk = ck, \
25 }, \
26 }
27
28/* Platform flags for the clkdev-OMAP integration code */
29#define CK_310 (1 << 0)
30#define CK_7XX (1 << 1) /* 7xx, 850 */
31#define CK_1510 (1 << 2)
32#define CK_16XX (1 << 3) /* 16xx, 17xx, 5912 */
33#define CK_242X (1 << 4)
34#define CK_243X (1 << 5)
35#define CK_3XXX (1 << 6) /* OMAP3 + AM3 common clocks*/
36#define CK_343X (1 << 7) /* OMAP34xx common clocks */
37#define CK_3430ES1 (1 << 8) /* 34xxES1 only */
38#define CK_3430ES2 (1 << 9) /* 34xxES2, ES3, non-Sitara 35xx only */
39#define CK_3505 (1 << 10)
40#define CK_3517 (1 << 11)
41#define CK_36XX (1 << 12) /* OMAP36xx/37xx-specific clocks */
42#define CK_443X (1 << 13)
43
44#define CK_AM35XX (CK_3505 | CK_3517) /* all Sitara AM35xx */
45
46
47
48#endif
49
diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h
new file mode 100644
index 000000000000..34f7fa9ad4c0
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/clock.h
@@ -0,0 +1,210 @@
1/*
2 * OMAP clock: data structure definitions, function prototypes, shared macros
3 *
4 * Copyright (C) 2004-2005, 2008-2010 Nokia Corporation
5 * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
6 * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#ifndef __ARCH_ARM_OMAP_CLOCK_H
14#define __ARCH_ARM_OMAP_CLOCK_H
15
16#include <linux/list.h>
17
18struct module;
19struct clk;
20struct clockdomain;
21
22struct clkops {
23 int (*enable)(struct clk *);
24 void (*disable)(struct clk *);
25 void (*find_idlest)(struct clk *, void __iomem **,
26 u8 *, u8 *);
27 void (*find_companion)(struct clk *, void __iomem **,
28 u8 *);
29};
30
31#ifdef CONFIG_ARCH_OMAP2PLUS
32
33struct clksel_rate {
34 u32 val;
35 u8 div;
36 u8 flags;
37};
38
39struct clksel {
40 struct clk *parent;
41 const struct clksel_rate *rates;
42};
43
44/**
45 * struct dpll_data - DPLL registers and integration data
46 * @mult_div1_reg: register containing the DPLL M and N bitfields
47 * @mult_mask: mask of the DPLL M bitfield in @mult_div1_reg
48 * @div1_mask: mask of the DPLL N bitfield in @mult_div1_reg
49 * @clk_bypass: struct clk pointer to the clock's bypass clock input
50 * @clk_ref: struct clk pointer to the clock's reference clock input
51 * @control_reg: register containing the DPLL mode bitfield
52 * @enable_mask: mask of the DPLL mode bitfield in @control_reg
53 * @rate_tolerance: maximum variance allowed from target rate (in Hz)
54 * @last_rounded_rate: cache of the last rate result of omap2_dpll_round_rate()
55 * @last_rounded_m: cache of the last M result of omap2_dpll_round_rate()
56 * @max_multiplier: maximum valid non-bypass multiplier value (actual)
57 * @last_rounded_n: cache of the last N result of omap2_dpll_round_rate()
58 * @min_divider: minimum valid non-bypass divider value (actual)
59 * @max_divider: maximum valid non-bypass divider value (actual)
60 * @modes: possible values of @enable_mask
61 * @autoidle_reg: register containing the DPLL autoidle mode bitfield
62 * @idlest_reg: register containing the DPLL idle status bitfield
63 * @autoidle_mask: mask of the DPLL autoidle mode bitfield in @autoidle_reg
64 * @freqsel_mask: mask of the DPLL jitter correction bitfield in @control_reg
65 * @idlest_mask: mask of the DPLL idle status bitfield in @idlest_reg
66 * @auto_recal_bit: bitshift of the driftguard enable bit in @control_reg
67 * @recal_en_bit: bitshift of the PRM_IRQENABLE_* bit for recalibration IRQs
68 * @recal_st_bit: bitshift of the PRM_IRQSTATUS_* bit for recalibration IRQs
69 * @flags: DPLL type/features (see below)
70 *
71 * Possible values for @flags:
72 * DPLL_J_TYPE: "J-type DPLL" (only some 36xx, 4xxx DPLLs)
73 * NO_DCO_SEL: don't program DCO (only for some J-type DPLLs)
74
75 * @freqsel_mask is only used on the OMAP34xx family and AM35xx.
76 *
77 * XXX Some DPLLs have multiple bypass inputs, so it's not technically
78 * correct to only have one @clk_bypass pointer.
79 *
80 * XXX @rate_tolerance should probably be deprecated - currently there
81 * don't seem to be any usecases for DPLL rounding that is not exact.
82 *
83 * XXX The runtime-variable fields (@last_rounded_rate, @last_rounded_m,
84 * @last_rounded_n) should be separated from the runtime-fixed fields
85 * and placed into a differenct structure, so that the runtime-fixed data
86 * can be placed into read-only space.
87 */
88struct dpll_data {
89 void __iomem *mult_div1_reg;
90 u32 mult_mask;
91 u32 div1_mask;
92 struct clk *clk_bypass;
93 struct clk *clk_ref;
94 void __iomem *control_reg;
95 u32 enable_mask;
96 unsigned int rate_tolerance;
97 unsigned long last_rounded_rate;
98 u16 last_rounded_m;
99 u16 max_multiplier;
100 u8 last_rounded_n;
101 u8 min_divider;
102 u8 max_divider;
103 u8 modes;
104#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
105 void __iomem *autoidle_reg;
106 void __iomem *idlest_reg;
107 u32 autoidle_mask;
108 u32 freqsel_mask;
109 u32 idlest_mask;
110 u8 auto_recal_bit;
111 u8 recal_en_bit;
112 u8 recal_st_bit;
113 u8 flags;
114# endif
115};
116
117#endif
118
119struct clk {
120 struct list_head node;
121 const struct clkops *ops;
122 const char *name;
123 struct clk *parent;
124 struct list_head children;
125 struct list_head sibling; /* node for children */
126 unsigned long rate;
127 void __iomem *enable_reg;
128 unsigned long (*recalc)(struct clk *);
129 int (*set_rate)(struct clk *, unsigned long);
130 long (*round_rate)(struct clk *, unsigned long);
131 void (*init)(struct clk *);
132 __u8 enable_bit;
133 __s8 usecount;
134 u8 fixed_div;
135 u8 flags;
136#ifdef CONFIG_ARCH_OMAP2PLUS
137 void __iomem *clksel_reg;
138 u32 clksel_mask;
139 const struct clksel *clksel;
140 struct dpll_data *dpll_data;
141 const char *clkdm_name;
142 struct clockdomain *clkdm;
143#else
144 __u8 rate_offset;
145 __u8 src_offset;
146#endif
147#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
148 struct dentry *dent; /* For visible tree hierarchy */
149#endif
150};
151
152struct cpufreq_frequency_table;
153
154struct clk_functions {
155 int (*clk_enable)(struct clk *clk);
156 void (*clk_disable)(struct clk *clk);
157 long (*clk_round_rate)(struct clk *clk, unsigned long rate);
158 int (*clk_set_rate)(struct clk *clk, unsigned long rate);
159 int (*clk_set_parent)(struct clk *clk, struct clk *parent);
160 void (*clk_allow_idle)(struct clk *clk);
161 void (*clk_deny_idle)(struct clk *clk);
162 void (*clk_disable_unused)(struct clk *clk);
163#ifdef CONFIG_CPU_FREQ
164 void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **);
165 void (*clk_exit_cpufreq_table)(struct cpufreq_frequency_table **);
166#endif
167};
168
169extern int mpurate;
170
171extern int clk_init(struct clk_functions *custom_clocks);
172extern void clk_preinit(struct clk *clk);
173extern int clk_register(struct clk *clk);
174extern void clk_reparent(struct clk *child, struct clk *parent);
175extern void clk_unregister(struct clk *clk);
176extern void propagate_rate(struct clk *clk);
177extern void recalculate_root_clocks(void);
178extern unsigned long followparent_recalc(struct clk *clk);
179extern void clk_enable_init_clocks(void);
180unsigned long omap_fixed_divisor_recalc(struct clk *clk);
181#ifdef CONFIG_CPU_FREQ
182extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table);
183extern void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table);
184#endif
185extern struct clk *omap_clk_get_by_name(const char *name);
186
187extern const struct clkops clkops_null;
188
189extern struct clk dummy_ck;
190
191/* Clock flags */
192#define ENABLE_REG_32BIT (1 << 0) /* Use 32-bit access */
193#define CLOCK_IDLE_CONTROL (1 << 1)
194#define CLOCK_NO_IDLE_PARENT (1 << 2)
195#define ENABLE_ON_INIT (1 << 3) /* Enable upon framework init */
196#define INVERT_ENABLE (1 << 4) /* 0 enables, 1 disables */
197
198/* Clksel_rate flags */
199#define DEFAULT_RATE (1 << 0)
200#define RATE_IN_242X (1 << 1)
201#define RATE_IN_243X (1 << 2)
202#define RATE_IN_343X (1 << 3) /* rates common to all 343X */
203#define RATE_IN_3430ES2 (1 << 4) /* 3430ES2 rates only */
204#define RATE_IN_36XX (1 << 5)
205#define RATE_IN_4430 (1 << 6)
206
207#define RATE_IN_24XX (RATE_IN_242X | RATE_IN_243X)
208
209
210#endif
diff --git a/arch/arm/plat-omap/include/plat/clockdomain.h b/arch/arm/plat-omap/include/plat/clockdomain.h
new file mode 100644
index 000000000000..ba0a6c07c0fe
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/clockdomain.h
@@ -0,0 +1,141 @@
1/*
2 * arch/arm/plat-omap/include/mach/clockdomain.h
3 *
4 * OMAP2/3 clockdomain framework functions
5 *
6 * Copyright (C) 2008 Texas Instruments, Inc.
7 * Copyright (C) 2008-2009 Nokia Corporation
8 *
9 * Written by Paul Walmsley
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15
16#ifndef __ASM_ARM_ARCH_OMAP_CLOCKDOMAIN_H
17#define __ASM_ARM_ARCH_OMAP_CLOCKDOMAIN_H
18
19#include <plat/powerdomain.h>
20#include <plat/clock.h>
21#include <plat/cpu.h>
22
23/* Clockdomain capability flags */
24#define CLKDM_CAN_FORCE_SLEEP (1 << 0)
25#define CLKDM_CAN_FORCE_WAKEUP (1 << 1)
26#define CLKDM_CAN_ENABLE_AUTO (1 << 2)
27#define CLKDM_CAN_DISABLE_AUTO (1 << 3)
28
29#define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO)
30#define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP)
31#define CLKDM_CAN_HWSUP_SWSUP (CLKDM_CAN_SWSUP | CLKDM_CAN_HWSUP)
32
33/* OMAP24XX CM_CLKSTCTRL_*.AUTOSTATE_* register bit values */
34#define OMAP24XX_CLKSTCTRL_DISABLE_AUTO 0x0
35#define OMAP24XX_CLKSTCTRL_ENABLE_AUTO 0x1
36
37/* OMAP3XXX CM_CLKSTCTRL_*.CLKTRCTRL_* register bit values */
38#define OMAP34XX_CLKSTCTRL_DISABLE_AUTO 0x0
39#define OMAP34XX_CLKSTCTRL_FORCE_SLEEP 0x1
40#define OMAP34XX_CLKSTCTRL_FORCE_WAKEUP 0x2
41#define OMAP34XX_CLKSTCTRL_ENABLE_AUTO 0x3
42
43/**
44 * struct clkdm_autodep - clkdm deps to add when entering/exiting hwsup mode
45 * @clkdm: clockdomain to add wkdep+sleepdep on - set name member only
46 * @omap_chip: OMAP chip types that this autodep is valid on
47 *
48 * A clockdomain that should have wkdeps and sleepdeps added when a
49 * clockdomain should stay active in hwsup mode; and conversely,
50 * removed when the clockdomain should be allowed to go inactive in
51 * hwsup mode.
52 *
53 * Autodeps are deprecated and should be removed after
54 * omap_hwmod-based fine-grained module idle control is added.
55 */
56struct clkdm_autodep {
57 union {
58 const char *name;
59 struct clockdomain *ptr;
60 } clkdm;
61 const struct omap_chip_id omap_chip;
62};
63
64/**
65 * struct clkdm_dep - encode dependencies between clockdomains
66 * @clkdm_name: clockdomain name
67 * @clkdm: pointer to the struct clockdomain of @clkdm_name
68 * @omap_chip: OMAP chip types that this dependency is valid on
69 * @wkdep_usecount: Number of wakeup dependencies causing this clkdm to wake
70 * @sleepdep_usecount: Number of sleep deps that could prevent clkdm from idle
71 *
72 * Statically defined. @clkdm is resolved from @clkdm_name at runtime and
73 * should not be pre-initialized.
74 *
75 * XXX Should also include hardware (fixed) dependencies.
76 */
77struct clkdm_dep {
78 const char *clkdm_name;
79 struct clockdomain *clkdm;
80 atomic_t wkdep_usecount;
81 atomic_t sleepdep_usecount;
82 const struct omap_chip_id omap_chip;
83};
84
85/**
86 * struct clockdomain - OMAP clockdomain
87 * @name: clockdomain name
88 * @pwrdm: powerdomain containing this clockdomain
89 * @clktrctrl_reg: CLKSTCTRL reg for the given clock domain
90 * @clktrctrl_mask: CLKTRCTRL/AUTOSTATE field mask in CM_CLKSTCTRL reg
91 * @flags: Clockdomain capability flags
92 * @dep_bit: Bit shift of this clockdomain's PM_WKDEP/CM_SLEEPDEP bit
93 * @wkdep_srcs: Clockdomains that can be told to wake this powerdomain up
94 * @sleepdep_srcs: Clockdomains that can be told to keep this clkdm from inact
95 * @omap_chip: OMAP chip types that this clockdomain is valid on
96 * @usecount: Usecount tracking
97 * @node: list_head to link all clockdomains together
98 */
99struct clockdomain {
100 const char *name;
101 union {
102 const char *name;
103 struct powerdomain *ptr;
104 } pwrdm;
105 void __iomem *clkstctrl_reg;
106 const u16 clktrctrl_mask;
107 const u8 flags;
108 const u8 dep_bit;
109 struct clkdm_dep *wkdep_srcs;
110 struct clkdm_dep *sleepdep_srcs;
111 const struct omap_chip_id omap_chip;
112 atomic_t usecount;
113 struct list_head node;
114};
115
116void clkdm_init(struct clockdomain **clkdms, struct clkdm_autodep *autodeps);
117struct clockdomain *clkdm_lookup(const char *name);
118
119int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
120 void *user);
121struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm);
122
123int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
124int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
125int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
126int clkdm_clear_all_wkdeps(struct clockdomain *clkdm);
127int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
128int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
129int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
130int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm);
131
132void omap2_clkdm_allow_idle(struct clockdomain *clkdm);
133void omap2_clkdm_deny_idle(struct clockdomain *clkdm);
134
135int omap2_clkdm_wakeup(struct clockdomain *clkdm);
136int omap2_clkdm_sleep(struct clockdomain *clkdm);
137
138int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk);
139int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk);
140
141#endif
diff --git a/arch/arm/plat-omap/include/mach/common.h b/arch/arm/plat-omap/include/plat/common.h
index fdeab421b4dc..7556e271942e 100644
--- a/arch/arm/plat-omap/include/mach/common.h
+++ b/arch/arm/plat-omap/include/plat/common.h
@@ -27,39 +27,40 @@
27#ifndef __ARCH_ARM_MACH_OMAP_COMMON_H 27#ifndef __ARCH_ARM_MACH_OMAP_COMMON_H
28#define __ARCH_ARM_MACH_OMAP_COMMON_H 28#define __ARCH_ARM_MACH_OMAP_COMMON_H
29 29
30#include <linux/i2c.h> 30#include <plat/i2c.h>
31 31
32struct sys_timer; 32struct sys_timer;
33 33
34/* used by omap-smp.c and board-4430sdp.c */
35extern void __iomem *gic_cpu_base_addr;
36
34extern void omap_map_common_io(void); 37extern void omap_map_common_io(void);
35extern struct sys_timer omap_timer; 38extern struct sys_timer omap_timer;
36#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
37extern int omap_register_i2c_bus(int bus_id, u32 clkrate,
38 struct i2c_board_info const *info,
39 unsigned len);
40#else
41static inline int omap_register_i2c_bus(int bus_id, u32 clkrate,
42 struct i2c_board_info const *info,
43 unsigned len)
44{
45 return 0;
46}
47#endif
48 39
49/* IO bases for various OMAP processors */ 40/*
41 * IO bases for various OMAP processors
42 * Except the tap base, rest all the io bases
43 * listed are physical addresses.
44 */
50struct omap_globals { 45struct omap_globals {
51 u32 class; /* OMAP class to detect */ 46 u32 class; /* OMAP class to detect */
52 void __iomem *tap; /* Control module ID code */ 47 void __iomem *tap; /* Control module ID code */
53 void __iomem *sdrc; /* SDRAM Controller */ 48 unsigned long sdrc; /* SDRAM Controller */
54 void __iomem *sms; /* SDRAM Memory Scheduler */ 49 unsigned long sms; /* SDRAM Memory Scheduler */
55 void __iomem *ctrl; /* System Control Module */ 50 unsigned long ctrl; /* System Control Module */
56 void __iomem *prm; /* Power and Reset Management */ 51 unsigned long prm; /* Power and Reset Management */
57 void __iomem *cm; /* Clock Management */ 52 unsigned long cm; /* Clock Management */
53 unsigned long cm2;
54 unsigned long uart1_phys;
55 unsigned long uart2_phys;
56 unsigned long uart3_phys;
57 unsigned long uart4_phys;
58}; 58};
59 59
60void omap2_set_globals_242x(void); 60void omap2_set_globals_242x(void);
61void omap2_set_globals_243x(void); 61void omap2_set_globals_243x(void);
62void omap2_set_globals_343x(void); 62void omap2_set_globals_343x(void);
63void omap2_set_globals_36xx(void);
63void omap2_set_globals_443x(void); 64void omap2_set_globals_443x(void);
64 65
65/* These get called from omap2_set_globals_xxxx(), do not call these */ 66/* These get called from omap2_set_globals_xxxx(), do not call these */
@@ -67,5 +68,26 @@ void omap2_set_globals_tap(struct omap_globals *);
67void omap2_set_globals_sdrc(struct omap_globals *); 68void omap2_set_globals_sdrc(struct omap_globals *);
68void omap2_set_globals_control(struct omap_globals *); 69void omap2_set_globals_control(struct omap_globals *);
69void omap2_set_globals_prcm(struct omap_globals *); 70void omap2_set_globals_prcm(struct omap_globals *);
71void omap2_set_globals_uart(struct omap_globals *);
72
73/**
74 * omap_test_timeout - busy-loop, testing a condition
75 * @cond: condition to test until it evaluates to true
76 * @timeout: maximum number of microseconds in the timeout
77 * @index: loop index (integer)
78 *
79 * Loop waiting for @cond to become true or until at least @timeout
80 * microseconds have passed. To use, define some integer @index in the
81 * calling code. After running, if @index == @timeout, then the loop has
82 * timed out.
83 */
84#define omap_test_timeout(cond, timeout, index) \
85({ \
86 for (index = 0; index < timeout; index++) { \
87 if (cond) \
88 break; \
89 udelay(1); \
90 } \
91})
70 92
71#endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ 93#endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */
diff --git a/arch/arm/plat-omap/include/mach/control.h b/arch/arm/plat-omap/include/plat/control.h
index 826d317cdbec..a56deee97676 100644
--- a/arch/arm/plat-omap/include/mach/control.h
+++ b/arch/arm/plat-omap/include/plat/control.h
@@ -20,15 +20,18 @@
20 20
21#ifndef __ASSEMBLY__ 21#ifndef __ASSEMBLY__
22#define OMAP242X_CTRL_REGADDR(reg) \ 22#define OMAP242X_CTRL_REGADDR(reg) \
23 OMAP2_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg)) 23 OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg))
24#define OMAP243X_CTRL_REGADDR(reg) \ 24#define OMAP243X_CTRL_REGADDR(reg) \
25 OMAP2_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg)) 25 OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg))
26#define OMAP343X_CTRL_REGADDR(reg) \ 26#define OMAP343X_CTRL_REGADDR(reg) \
27 OMAP2_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg)) 27 OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg))
28#else 28#else
29#define OMAP242X_CTRL_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg)) 29#define OMAP242X_CTRL_REGADDR(reg) \
30#define OMAP243X_CTRL_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg)) 30 OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg))
31#define OMAP343X_CTRL_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg)) 31#define OMAP243X_CTRL_REGADDR(reg) \
32 OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg))
33#define OMAP343X_CTRL_REGADDR(reg) \
34 OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg))
32#endif /* __ASSEMBLY__ */ 35#endif /* __ASSEMBLY__ */
33 36
34/* 37/*
@@ -109,6 +112,8 @@
109#define OMAP24XX_CONTROL_TEST_KEY_8 (OMAP2_CONTROL_GENERAL + 0x00e0) 112#define OMAP24XX_CONTROL_TEST_KEY_8 (OMAP2_CONTROL_GENERAL + 0x00e0)
110#define OMAP24XX_CONTROL_TEST_KEY_9 (OMAP2_CONTROL_GENERAL + 0x00e4) 113#define OMAP24XX_CONTROL_TEST_KEY_9 (OMAP2_CONTROL_GENERAL + 0x00e4)
111 114
115#define OMAP343X_CONTROL_PADCONF_SYSNIRQ (OMAP2_CONTROL_INTERFACE + 0x01b0)
116
112/* 34xx-only CONTROL_GENERAL register offsets */ 117/* 34xx-only CONTROL_GENERAL register offsets */
113#define OMAP343X_CONTROL_PADCONF_OFF (OMAP2_CONTROL_GENERAL + 0x0000) 118#define OMAP343X_CONTROL_PADCONF_OFF (OMAP2_CONTROL_GENERAL + 0x0000)
114#define OMAP343X_CONTROL_MEM_DFTRW0 (OMAP2_CONTROL_GENERAL + 0x0008) 119#define OMAP343X_CONTROL_MEM_DFTRW0 (OMAP2_CONTROL_GENERAL + 0x0008)
@@ -141,13 +146,67 @@
141#define OMAP343X_CONTROL_TEST_KEY_13 (OMAP2_CONTROL_GENERAL + 0x00fc) 146#define OMAP343X_CONTROL_TEST_KEY_13 (OMAP2_CONTROL_GENERAL + 0x00fc)
142#define OMAP343X_CONTROL_IVA2_BOOTADDR (OMAP2_CONTROL_GENERAL + 0x0190) 147#define OMAP343X_CONTROL_IVA2_BOOTADDR (OMAP2_CONTROL_GENERAL + 0x0190)
143#define OMAP343X_CONTROL_IVA2_BOOTMOD (OMAP2_CONTROL_GENERAL + 0x0194) 148#define OMAP343X_CONTROL_IVA2_BOOTMOD (OMAP2_CONTROL_GENERAL + 0x0194)
144#define OMAP343X_CONTROL_PBIAS_LITE (OMAP2_CONTROL_GENERAL + 0x02b0) 149#define OMAP343X_CONTROL_DEBOBS(i) (OMAP2_CONTROL_GENERAL + 0x01B0 \
145#define OMAP343X_CONTROL_TEMP_SENSOR (OMAP2_CONTROL_GENERAL + 0x02b4) 150 + ((i) >> 1) * 4 + (!((i) & 1)) * 2)
151#define OMAP343X_CONTROL_PROG_IO0 (OMAP2_CONTROL_GENERAL + 0x01D4)
152#define OMAP343X_CONTROL_PROG_IO1 (OMAP2_CONTROL_GENERAL + 0x01D8)
153#define OMAP343X_CONTROL_DSS_DPLL_SPREADING (OMAP2_CONTROL_GENERAL + 0x01E0)
154#define OMAP343X_CONTROL_CORE_DPLL_SPREADING (OMAP2_CONTROL_GENERAL + 0x01E4)
155#define OMAP343X_CONTROL_PER_DPLL_SPREADING (OMAP2_CONTROL_GENERAL + 0x01E8)
156#define OMAP343X_CONTROL_USBHOST_DPLL_SPREADING (OMAP2_CONTROL_GENERAL + 0x01EC)
157#define OMAP343X_CONTROL_PBIAS_LITE (OMAP2_CONTROL_GENERAL + 0x02B0)
158#define OMAP343X_CONTROL_TEMP_SENSOR (OMAP2_CONTROL_GENERAL + 0x02B4)
159#define OMAP343X_CONTROL_SRAMLDO4 (OMAP2_CONTROL_GENERAL + 0x02B8)
160#define OMAP343X_CONTROL_SRAMLDO5 (OMAP2_CONTROL_GENERAL + 0x02C0)
161#define OMAP343X_CONTROL_CSI (OMAP2_CONTROL_GENERAL + 0x02C4)
162
163/* AM35XX only CONTROL_GENERAL register offsets */
164#define AM35XX_CONTROL_MSUSPENDMUX_6 (OMAP2_CONTROL_GENERAL + 0x0038)
165#define AM35XX_CONTROL_DEVCONF2 (OMAP2_CONTROL_GENERAL + 0x0310)
166#define AM35XX_CONTROL_DEVCONF3 (OMAP2_CONTROL_GENERAL + 0x0314)
167#define AM35XX_CONTROL_CBA_PRIORITY (OMAP2_CONTROL_GENERAL + 0x0320)
168#define AM35XX_CONTROL_LVL_INTR_CLEAR (OMAP2_CONTROL_GENERAL + 0x0324)
169#define AM35XX_CONTROL_IP_SW_RESET (OMAP2_CONTROL_GENERAL + 0x0328)
170#define AM35XX_CONTROL_IPSS_CLK_CTRL (OMAP2_CONTROL_GENERAL + 0x032C)
171
172/* 34xx PADCONF register offsets */
173#define OMAP343X_PADCONF_ETK(i) (OMAP2_CONTROL_PADCONFS + 0x5a8 + \
174 (i)*2)
175#define OMAP343X_PADCONF_ETK_CLK OMAP343X_PADCONF_ETK(0)
176#define OMAP343X_PADCONF_ETK_CTL OMAP343X_PADCONF_ETK(1)
177#define OMAP343X_PADCONF_ETK_D0 OMAP343X_PADCONF_ETK(2)
178#define OMAP343X_PADCONF_ETK_D1 OMAP343X_PADCONF_ETK(3)
179#define OMAP343X_PADCONF_ETK_D2 OMAP343X_PADCONF_ETK(4)
180#define OMAP343X_PADCONF_ETK_D3 OMAP343X_PADCONF_ETK(5)
181#define OMAP343X_PADCONF_ETK_D4 OMAP343X_PADCONF_ETK(6)
182#define OMAP343X_PADCONF_ETK_D5 OMAP343X_PADCONF_ETK(7)
183#define OMAP343X_PADCONF_ETK_D6 OMAP343X_PADCONF_ETK(8)
184#define OMAP343X_PADCONF_ETK_D7 OMAP343X_PADCONF_ETK(9)
185#define OMAP343X_PADCONF_ETK_D8 OMAP343X_PADCONF_ETK(10)
186#define OMAP343X_PADCONF_ETK_D9 OMAP343X_PADCONF_ETK(11)
187#define OMAP343X_PADCONF_ETK_D10 OMAP343X_PADCONF_ETK(12)
188#define OMAP343X_PADCONF_ETK_D11 OMAP343X_PADCONF_ETK(13)
189#define OMAP343X_PADCONF_ETK_D12 OMAP343X_PADCONF_ETK(14)
190#define OMAP343X_PADCONF_ETK_D13 OMAP343X_PADCONF_ETK(15)
191#define OMAP343X_PADCONF_ETK_D14 OMAP343X_PADCONF_ETK(16)
192#define OMAP343X_PADCONF_ETK_D15 OMAP343X_PADCONF_ETK(17)
193
194/* 34xx GENERAL_WKUP regist offsets */
195#define OMAP343X_CONTROL_WKUP_DEBOBSMUX(i) (OMAP343X_CONTROL_GENERAL_WKUP + \
196 0x008 + (i))
197#define OMAP343X_CONTROL_WKUP_DEBOBS0 (OMAP343X_CONTROL_GENERAL_WKUP + 0x008)
198#define OMAP343X_CONTROL_WKUP_DEBOBS1 (OMAP343X_CONTROL_GENERAL_WKUP + 0x00C)
199#define OMAP343X_CONTROL_WKUP_DEBOBS2 (OMAP343X_CONTROL_GENERAL_WKUP + 0x010)
200#define OMAP343X_CONTROL_WKUP_DEBOBS3 (OMAP343X_CONTROL_GENERAL_WKUP + 0x014)
201#define OMAP343X_CONTROL_WKUP_DEBOBS4 (OMAP343X_CONTROL_GENERAL_WKUP + 0x018)
146 202
147/* 34xx D2D idle-related pins, handled by PM core */ 203/* 34xx D2D idle-related pins, handled by PM core */
148#define OMAP3_PADCONF_SAD2D_MSTANDBY 0x250 204#define OMAP3_PADCONF_SAD2D_MSTANDBY 0x250
149#define OMAP3_PADCONF_SAD2D_IDLEACK 0x254 205#define OMAP3_PADCONF_SAD2D_IDLEACK 0x254
150 206
207/* 44xx control status register offset */
208#define OMAP44XX_CONTROL_STATUS 0x2c4
209
151/* 210/*
152 * REVISIT: This list of registers is not comprehensive - there are more 211 * REVISIT: This list of registers is not comprehensive - there are more
153 * that should be added. 212 * that should be added.
@@ -193,6 +252,9 @@
193#define OMAP2_PBIASLITEPWRDNZ0 (1 << 1) 252#define OMAP2_PBIASLITEPWRDNZ0 (1 << 1)
194#define OMAP2_PBIASLITEVMODE0 (1 << 0) 253#define OMAP2_PBIASLITEVMODE0 (1 << 0)
195 254
255/* CONTROL_PROG_IO1 bits */
256#define OMAP3630_PRG_SDMMC1_SPEEDCTRL (1 << 20)
257
196/* CONTROL_IVA2_BOOTMOD bits */ 258/* CONTROL_IVA2_BOOTMOD bits */
197#define OMAP3_IVA2_BOOTMOD_SHIFT 0 259#define OMAP3_IVA2_BOOTMOD_SHIFT 0
198#define OMAP3_IVA2_BOOTMOD_MASK (0xf << 0) 260#define OMAP3_IVA2_BOOTMOD_MASK (0xf << 0)
@@ -202,9 +264,72 @@
202#define OMAP3_PADCONF_WAKEUPEVENT0 (1 << 15) 264#define OMAP3_PADCONF_WAKEUPEVENT0 (1 << 15)
203#define OMAP3_PADCONF_WAKEUPENABLE0 (1 << 14) 265#define OMAP3_PADCONF_WAKEUPENABLE0 (1 << 14)
204 266
267#define OMAP343X_SCRATCHPAD_ROM (OMAP343X_CTRL_BASE + 0x860)
268#define OMAP343X_SCRATCHPAD (OMAP343X_CTRL_BASE + 0x910)
269#define OMAP343X_SCRATCHPAD_ROM_OFFSET 0x19C
270
271/* AM35XX_CONTROL_IPSS_CLK_CTRL bits */
272#define AM35XX_USBOTG_VBUSP_CLK_SHIFT 0
273#define AM35XX_CPGMAC_VBUSP_CLK_SHIFT 1
274#define AM35XX_VPFE_VBUSP_CLK_SHIFT 2
275#define AM35XX_HECC_VBUSP_CLK_SHIFT 3
276#define AM35XX_USBOTG_FCLK_SHIFT 8
277#define AM35XX_CPGMAC_FCLK_SHIFT 9
278#define AM35XX_VPFE_FCLK_SHIFT 10
279
280/*AM35XX CONTROL_LVL_INTR_CLEAR bits*/
281#define AM35XX_CPGMAC_C0_MISC_PULSE_CLR BIT(0)
282#define AM35XX_CPGMAC_C0_RX_PULSE_CLR BIT(1)
283#define AM35XX_CPGMAC_C0_RX_THRESH_CLR BIT(2)
284#define AM35XX_CPGMAC_C0_TX_PULSE_CLR BIT(3)
285#define AM35XX_USBOTGSS_INT_CLR BIT(4)
286#define AM35XX_VPFE_CCDC_VD0_INT_CLR BIT(5)
287#define AM35XX_VPFE_CCDC_VD1_INT_CLR BIT(6)
288#define AM35XX_VPFE_CCDC_VD2_INT_CLR BIT(7)
289
290/*AM35XX CONTROL_IP_SW_RESET bits*/
291#define AM35XX_USBOTGSS_SW_RST BIT(0)
292#define AM35XX_CPGMACSS_SW_RST BIT(1)
293#define AM35XX_VPFE_VBUSP_SW_RST BIT(2)
294#define AM35XX_HECC_SW_RST BIT(3)
295#define AM35XX_VPFE_PCLK_SW_RST BIT(4)
296
297/*
298 * CONTROL OMAP STATUS register to identify OMAP3 features
299 */
300#define OMAP3_CONTROL_OMAP_STATUS 0x044c
301
302#define OMAP3_SGX_SHIFT 13
303#define OMAP3_SGX_MASK (3 << OMAP3_SGX_SHIFT)
304#define FEAT_SGX_FULL 0
305#define FEAT_SGX_HALF 1
306#define FEAT_SGX_NONE 2
307
308#define OMAP3_IVA_SHIFT 12
309#define OMAP3_IVA_MASK (1 << OMAP3_SGX_SHIFT)
310#define FEAT_IVA 0
311#define FEAT_IVA_NONE 1
312
313#define OMAP3_L2CACHE_SHIFT 10
314#define OMAP3_L2CACHE_MASK (3 << OMAP3_L2CACHE_SHIFT)
315#define FEAT_L2CACHE_NONE 0
316#define FEAT_L2CACHE_64KB 1
317#define FEAT_L2CACHE_128KB 2
318#define FEAT_L2CACHE_256KB 3
319
320#define OMAP3_ISP_SHIFT 5
321#define OMAP3_ISP_MASK (1<< OMAP3_ISP_SHIFT)
322#define FEAT_ISP 0
323#define FEAT_ISP_NONE 1
324
325#define OMAP3_NEON_SHIFT 4
326#define OMAP3_NEON_MASK (1<< OMAP3_NEON_SHIFT)
327#define FEAT_NEON 0
328#define FEAT_NEON_NONE 1
329
330
205#ifndef __ASSEMBLY__ 331#ifndef __ASSEMBLY__
206#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ 332#ifdef CONFIG_ARCH_OMAP2PLUS
207 defined(CONFIG_ARCH_OMAP4)
208extern void __iomem *omap_ctrl_base_get(void); 333extern void __iomem *omap_ctrl_base_get(void);
209extern u8 omap_ctrl_readb(u16 offset); 334extern u8 omap_ctrl_readb(u16 offset);
210extern u16 omap_ctrl_readw(u16 offset); 335extern u16 omap_ctrl_readw(u16 offset);
@@ -212,6 +337,15 @@ extern u32 omap_ctrl_readl(u16 offset);
212extern void omap_ctrl_writeb(u8 val, u16 offset); 337extern void omap_ctrl_writeb(u8 val, u16 offset);
213extern void omap_ctrl_writew(u16 val, u16 offset); 338extern void omap_ctrl_writew(u16 val, u16 offset);
214extern void omap_ctrl_writel(u32 val, u16 offset); 339extern void omap_ctrl_writel(u32 val, u16 offset);
340
341extern void omap3_save_scratchpad_contents(void);
342extern void omap3_clear_scratchpad_contents(void);
343extern u32 *get_restore_pointer(void);
344extern u32 *get_es3_restore_pointer(void);
345extern u32 omap3_arm_context[128];
346extern void omap3_control_save_context(void);
347extern void omap3_control_restore_context(void);
348
215#else 349#else
216#define omap_ctrl_base_get() 0 350#define omap_ctrl_base_get() 0
217#define omap_ctrl_readb(x) 0 351#define omap_ctrl_readb(x) 0
diff --git a/arch/arm/plat-omap/include/mach/cpu.h b/arch/arm/plat-omap/include/plat/cpu.h
index f129efb3075e..75141742300c 100644
--- a/arch/arm/plat-omap/include/mach/cpu.h
+++ b/arch/arm/plat-omap/include/plat/cpu.h
@@ -30,6 +30,9 @@
30#ifndef __ASM_ARCH_OMAP_CPU_H 30#ifndef __ASM_ARCH_OMAP_CPU_H
31#define __ASM_ARCH_OMAP_CPU_H 31#define __ASM_ARCH_OMAP_CPU_H
32 32
33#include <linux/bitops.h>
34#include <plat/multi.h>
35
33/* 36/*
34 * Omap device type i.e. EMU/HS/TST/GP/BAD 37 * Omap device type i.e. EMU/HS/TST/GP/BAD
35 */ 38 */
@@ -42,7 +45,7 @@
42int omap_type(void); 45int omap_type(void);
43 46
44struct omap_chip_id { 47struct omap_chip_id {
45 u8 oc; 48 u16 oc;
46 u8 type; 49 u8 type;
47}; 50};
48 51
@@ -57,73 +60,21 @@ struct omap_chip_id {
57unsigned int omap_rev(void); 60unsigned int omap_rev(void);
58 61
59/* 62/*
60 * Test if multicore OMAP support is needed 63 * Define CPU revision bits
64 *
65 * Verbose meaning of the revision bits may be different for a silicon
66 * family. This difference can be handled separately.
61 */ 67 */
62#undef MULTI_OMAP1 68#define OMAP_REVBITS_00 0x00
63#undef MULTI_OMAP2 69#define OMAP_REVBITS_10 0x10
64#undef OMAP_NAME 70#define OMAP_REVBITS_20 0x20
65 71#define OMAP_REVBITS_30 0x30
66#ifdef CONFIG_ARCH_OMAP730 72#define OMAP_REVBITS_40 0x40
67# ifdef OMAP_NAME 73
68# undef MULTI_OMAP1 74/*
69# define MULTI_OMAP1 75 * Get the CPU revision for OMAP devices
70# else 76 */
71# define OMAP_NAME omap730 77#define GET_OMAP_REVISION() ((omap_rev() >> 8) & 0xff)
72# endif
73#endif
74#ifdef CONFIG_ARCH_OMAP850
75# ifdef OMAP_NAME
76# undef MULTI_OMAP1
77# define MULTI_OMAP1
78# else
79# define OMAP_NAME omap850
80# endif
81#endif
82#ifdef CONFIG_ARCH_OMAP15XX
83# ifdef OMAP_NAME
84# undef MULTI_OMAP1
85# define MULTI_OMAP1
86# else
87# define OMAP_NAME omap1510
88# endif
89#endif
90#ifdef CONFIG_ARCH_OMAP16XX
91# ifdef OMAP_NAME
92# undef MULTI_OMAP1
93# define MULTI_OMAP1
94# else
95# define OMAP_NAME omap16xx
96# endif
97#endif
98#if (defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX))
99# if (defined(OMAP_NAME) || defined(MULTI_OMAP1))
100# error "OMAP1 and OMAP2 can't be selected at the same time"
101# endif
102#endif
103#ifdef CONFIG_ARCH_OMAP2420
104# ifdef OMAP_NAME
105# undef MULTI_OMAP2
106# define MULTI_OMAP2
107# else
108# define OMAP_NAME omap2420
109# endif
110#endif
111#ifdef CONFIG_ARCH_OMAP2430
112# ifdef OMAP_NAME
113# undef MULTI_OMAP2
114# define MULTI_OMAP2
115# else
116# define OMAP_NAME omap2430
117# endif
118#endif
119#ifdef CONFIG_ARCH_OMAP3430
120# ifdef OMAP_NAME
121# undef MULTI_OMAP2
122# define MULTI_OMAP2
123# else
124# define OMAP_NAME omap3430
125# endif
126#endif
127 78
128/* 79/*
129 * Macros to group OMAP into cpu classes. 80 * Macros to group OMAP into cpu classes.
@@ -135,6 +86,7 @@ unsigned int omap_rev(void);
135 * cpu_is_omap242x(): True for OMAP2420, OMAP2422, OMAP2423 86 * cpu_is_omap242x(): True for OMAP2420, OMAP2422, OMAP2423
136 * cpu_is_omap243x(): True for OMAP2430 87 * cpu_is_omap243x(): True for OMAP2430
137 * cpu_is_omap343x(): True for OMAP3430 88 * cpu_is_omap343x(): True for OMAP3430
89 * cpu_is_omap443x(): True for OMAP4430
138 */ 90 */
139#define GET_OMAP_CLASS (omap_rev() & 0xff) 91#define GET_OMAP_CLASS (omap_rev() & 0xff)
140 92
@@ -157,10 +109,13 @@ IS_OMAP_CLASS(15xx, 0x15)
157IS_OMAP_CLASS(16xx, 0x16) 109IS_OMAP_CLASS(16xx, 0x16)
158IS_OMAP_CLASS(24xx, 0x24) 110IS_OMAP_CLASS(24xx, 0x24)
159IS_OMAP_CLASS(34xx, 0x34) 111IS_OMAP_CLASS(34xx, 0x34)
112IS_OMAP_CLASS(44xx, 0x44)
160 113
161IS_OMAP_SUBCLASS(242x, 0x242) 114IS_OMAP_SUBCLASS(242x, 0x242)
162IS_OMAP_SUBCLASS(243x, 0x243) 115IS_OMAP_SUBCLASS(243x, 0x243)
163IS_OMAP_SUBCLASS(343x, 0x343) 116IS_OMAP_SUBCLASS(343x, 0x343)
117IS_OMAP_SUBCLASS(363x, 0x363)
118IS_OMAP_SUBCLASS(443x, 0x443)
164 119
165#define cpu_is_omap7xx() 0 120#define cpu_is_omap7xx() 0
166#define cpu_is_omap15xx() 0 121#define cpu_is_omap15xx() 0
@@ -210,22 +165,26 @@ IS_OMAP_SUBCLASS(343x, 0x343)
210#endif 165#endif
211 166
212#if defined(MULTI_OMAP2) 167#if defined(MULTI_OMAP2)
213# if defined(CONFIG_ARCH_OMAP24XX) 168# if defined(CONFIG_ARCH_OMAP2)
214# undef cpu_is_omap24xx 169# undef cpu_is_omap24xx
215# undef cpu_is_omap242x
216# undef cpu_is_omap243x
217# define cpu_is_omap24xx() is_omap24xx() 170# define cpu_is_omap24xx() is_omap24xx()
171# endif
172# if defined (CONFIG_ARCH_OMAP2420)
173# undef cpu_is_omap242x
218# define cpu_is_omap242x() is_omap242x() 174# define cpu_is_omap242x() is_omap242x()
175# endif
176# if defined (CONFIG_ARCH_OMAP2430)
177# undef cpu_is_omap243x
219# define cpu_is_omap243x() is_omap243x() 178# define cpu_is_omap243x() is_omap243x()
220# endif 179# endif
221# if defined(CONFIG_ARCH_OMAP34XX) 180# if defined(CONFIG_ARCH_OMAP3)
222# undef cpu_is_omap34xx 181# undef cpu_is_omap34xx
223# undef cpu_is_omap343x 182# undef cpu_is_omap343x
224# define cpu_is_omap34xx() is_omap34xx() 183# define cpu_is_omap34xx() is_omap34xx()
225# define cpu_is_omap343x() is_omap343x() 184# define cpu_is_omap343x() is_omap343x()
226# endif 185# endif
227#else 186#else
228# if defined(CONFIG_ARCH_OMAP24XX) 187# if defined(CONFIG_ARCH_OMAP2)
229# undef cpu_is_omap24xx 188# undef cpu_is_omap24xx
230# define cpu_is_omap24xx() 1 189# define cpu_is_omap24xx() 1
231# endif 190# endif
@@ -237,7 +196,7 @@ IS_OMAP_SUBCLASS(343x, 0x343)
237# undef cpu_is_omap243x 196# undef cpu_is_omap243x
238# define cpu_is_omap243x() 1 197# define cpu_is_omap243x() 1
239# endif 198# endif
240# if defined(CONFIG_ARCH_OMAP34XX) 199# if defined(CONFIG_ARCH_OMAP3)
241# undef cpu_is_omap34xx 200# undef cpu_is_omap34xx
242# define cpu_is_omap34xx() 1 201# define cpu_is_omap34xx() 1
243# endif 202# endif
@@ -264,6 +223,9 @@ IS_OMAP_SUBCLASS(343x, 0x343)
264 * cpu_is_omap2423(): True for OMAP2423 223 * cpu_is_omap2423(): True for OMAP2423
265 * cpu_is_omap2430(): True for OMAP2430 224 * cpu_is_omap2430(): True for OMAP2430
266 * cpu_is_omap3430(): True for OMAP3430 225 * cpu_is_omap3430(): True for OMAP3430
226 * cpu_is_omap4430(): True for OMAP4430
227 * cpu_is_omap3505(): True for OMAP3505
228 * cpu_is_omap3517(): True for OMAP3517
267 */ 229 */
268#define GET_OMAP_TYPE ((omap_rev() >> 16) & 0xffff) 230#define GET_OMAP_TYPE ((omap_rev() >> 16) & 0xffff)
269 231
@@ -287,6 +249,8 @@ IS_OMAP_TYPE(2422, 0x2422)
287IS_OMAP_TYPE(2423, 0x2423) 249IS_OMAP_TYPE(2423, 0x2423)
288IS_OMAP_TYPE(2430, 0x2430) 250IS_OMAP_TYPE(2430, 0x2430)
289IS_OMAP_TYPE(3430, 0x3430) 251IS_OMAP_TYPE(3430, 0x3430)
252IS_OMAP_TYPE(3505, 0x3505)
253IS_OMAP_TYPE(3517, 0x3517)
290 254
291#define cpu_is_omap310() 0 255#define cpu_is_omap310() 0
292#define cpu_is_omap730() 0 256#define cpu_is_omap730() 0
@@ -301,7 +265,15 @@ IS_OMAP_TYPE(3430, 0x3430)
301#define cpu_is_omap2422() 0 265#define cpu_is_omap2422() 0
302#define cpu_is_omap2423() 0 266#define cpu_is_omap2423() 0
303#define cpu_is_omap2430() 0 267#define cpu_is_omap2430() 0
268#define cpu_is_omap3503() 0
269#define cpu_is_omap3515() 0
270#define cpu_is_omap3525() 0
271#define cpu_is_omap3530() 0
272#define cpu_is_omap3505() 0
273#define cpu_is_omap3517() 0
304#define cpu_is_omap3430() 0 274#define cpu_is_omap3430() 0
275#define cpu_is_omap4430() 0
276#define cpu_is_omap3630() 0
305 277
306/* 278/*
307 * Whether we have MULTI_OMAP1 or not, we still need to distinguish 279 * Whether we have MULTI_OMAP1 or not, we still need to distinguish
@@ -338,7 +310,7 @@ IS_OMAP_TYPE(3430, 0x3430)
338# define cpu_is_omap1710() is_omap1710() 310# define cpu_is_omap1710() is_omap1710()
339#endif 311#endif
340 312
341#if defined(CONFIG_ARCH_OMAP24XX) 313#if defined(CONFIG_ARCH_OMAP2)
342# undef cpu_is_omap2420 314# undef cpu_is_omap2420
343# undef cpu_is_omap2422 315# undef cpu_is_omap2422
344# undef cpu_is_omap2423 316# undef cpu_is_omap2423
@@ -349,16 +321,36 @@ IS_OMAP_TYPE(3430, 0x3430)
349# define cpu_is_omap2430() is_omap2430() 321# define cpu_is_omap2430() is_omap2430()
350#endif 322#endif
351 323
352#if defined(CONFIG_ARCH_OMAP34XX) 324#if defined(CONFIG_ARCH_OMAP3)
353# undef cpu_is_omap3430 325# undef cpu_is_omap3430
326# undef cpu_is_omap3503
327# undef cpu_is_omap3515
328# undef cpu_is_omap3525
329# undef cpu_is_omap3530
330# undef cpu_is_omap3505
331# undef cpu_is_omap3517
354# define cpu_is_omap3430() is_omap3430() 332# define cpu_is_omap3430() is_omap3430()
333# define cpu_is_omap3503() (cpu_is_omap3430() && \
334 (!omap3_has_iva()) && \
335 (!omap3_has_sgx()))
336# define cpu_is_omap3515() (cpu_is_omap3430() && \
337 (!omap3_has_iva()) && \
338 (omap3_has_sgx()))
339# define cpu_is_omap3525() (cpu_is_omap3430() && \
340 (!omap3_has_sgx()) && \
341 (omap3_has_iva()))
342# define cpu_is_omap3530() (cpu_is_omap3430())
343# define cpu_is_omap3505() is_omap3505()
344# define cpu_is_omap3517() is_omap3517()
345# undef cpu_is_omap3630
346# define cpu_is_omap3630() is_omap363x()
355#endif 347#endif
356 348
357# if defined(CONFIG_ARCH_OMAP4) 349# if defined(CONFIG_ARCH_OMAP4)
358# undef cpu_is_omap44xx 350# undef cpu_is_omap44xx
359# undef cpu_is_omap443x 351# undef cpu_is_omap443x
360# define cpu_is_omap44xx() 1 352# define cpu_is_omap44xx() is_omap44xx()
361# define cpu_is_omap443x() 1 353# define cpu_is_omap443x() is_omap443x()
362# endif 354# endif
363 355
364/* Macros to detect if we have OMAP1 or OMAP2 */ 356/* Macros to detect if we have OMAP1 or OMAP2 */
@@ -381,8 +373,20 @@ IS_OMAP_TYPE(3430, 0x3430)
381#define OMAP3430_REV_ES2_1 0x34302034 373#define OMAP3430_REV_ES2_1 0x34302034
382#define OMAP3430_REV_ES3_0 0x34303034 374#define OMAP3430_REV_ES3_0 0x34303034
383#define OMAP3430_REV_ES3_1 0x34304034 375#define OMAP3430_REV_ES3_1 0x34304034
376#define OMAP3430_REV_ES3_1_2 0x34305034
384 377
385#define OMAP443X_CLASS 0x44300034 378#define OMAP3630_REV_ES1_0 0x36300034
379
380#define OMAP35XX_CLASS 0x35000034
381#define OMAP3503_REV(v) (OMAP35XX_CLASS | (0x3503 << 16) | (v << 8))
382#define OMAP3515_REV(v) (OMAP35XX_CLASS | (0x3515 << 16) | (v << 8))
383#define OMAP3525_REV(v) (OMAP35XX_CLASS | (0x3525 << 16) | (v << 8))
384#define OMAP3530_REV(v) (OMAP35XX_CLASS | (0x3530 << 16) | (v << 8))
385#define OMAP3505_REV(v) (OMAP35XX_CLASS | (0x3505 << 16) | (v << 8))
386#define OMAP3517_REV(v) (OMAP35XX_CLASS | (0x3517 << 16) | (v << 8))
387
388#define OMAP443X_CLASS 0x44300044
389#define OMAP4430_REV_ES1_0 0x44300044
386 390
387/* 391/*
388 * omap_chip bits 392 * omap_chip bits
@@ -405,9 +409,13 @@ IS_OMAP_TYPE(3430, 0x3430)
405#define CHIP_IS_OMAP3430ES2 (1 << 4) 409#define CHIP_IS_OMAP3430ES2 (1 << 4)
406#define CHIP_IS_OMAP3430ES3_0 (1 << 5) 410#define CHIP_IS_OMAP3430ES3_0 (1 << 5)
407#define CHIP_IS_OMAP3430ES3_1 (1 << 6) 411#define CHIP_IS_OMAP3430ES3_1 (1 << 6)
412#define CHIP_IS_OMAP3630ES1 (1 << 7)
413#define CHIP_IS_OMAP4430ES1 (1 << 8)
408 414
409#define CHIP_IS_OMAP24XX (CHIP_IS_OMAP2420 | CHIP_IS_OMAP2430) 415#define CHIP_IS_OMAP24XX (CHIP_IS_OMAP2420 | CHIP_IS_OMAP2430)
410 416
417#define CHIP_IS_OMAP4430 (CHIP_IS_OMAP4430ES1)
418
411/* 419/*
412 * "GE" here represents "greater than or equal to" in terms of ES 420 * "GE" here represents "greater than or equal to" in terms of ES
413 * levels. So CHIP_GE_OMAP3430ES2 is intended to match all OMAP3430 421 * levels. So CHIP_GE_OMAP3430ES2 is intended to match all OMAP3430
@@ -416,11 +424,38 @@ IS_OMAP_TYPE(3430, 0x3430)
416 */ 424 */
417#define CHIP_GE_OMAP3430ES2 (CHIP_IS_OMAP3430ES2 | \ 425#define CHIP_GE_OMAP3430ES2 (CHIP_IS_OMAP3430ES2 | \
418 CHIP_IS_OMAP3430ES3_0 | \ 426 CHIP_IS_OMAP3430ES3_0 | \
419 CHIP_IS_OMAP3430ES3_1) 427 CHIP_IS_OMAP3430ES3_1 | \
420#define CHIP_GE_OMAP3430ES3_1 (CHIP_IS_OMAP3430ES3_1) 428 CHIP_IS_OMAP3630ES1)
429#define CHIP_GE_OMAP3430ES3_1 (CHIP_IS_OMAP3430ES3_1 | \
430 CHIP_IS_OMAP3630ES1)
421 431
422 432
423int omap_chip_is(struct omap_chip_id oci); 433int omap_chip_is(struct omap_chip_id oci);
424void omap2_check_revision(void); 434void omap2_check_revision(void);
425 435
436/*
437 * Runtime detection of OMAP3 features
438 */
439extern u32 omap3_features;
440
441#define OMAP3_HAS_L2CACHE BIT(0)
442#define OMAP3_HAS_IVA BIT(1)
443#define OMAP3_HAS_SGX BIT(2)
444#define OMAP3_HAS_NEON BIT(3)
445#define OMAP3_HAS_ISP BIT(4)
446#define OMAP3_HAS_192MHZ_CLK BIT(5)
447
448#define OMAP3_HAS_FEATURE(feat,flag) \
449static inline unsigned int omap3_has_ ##feat(void) \
450{ \
451 return (omap3_features & OMAP3_HAS_ ##flag); \
452} \
453
454OMAP3_HAS_FEATURE(l2cache, L2CACHE)
455OMAP3_HAS_FEATURE(sgx, SGX)
456OMAP3_HAS_FEATURE(iva, IVA)
457OMAP3_HAS_FEATURE(neon, NEON)
458OMAP3_HAS_FEATURE(isp, ISP)
459OMAP3_HAS_FEATURE(192mhz_clk, 192MHZ_CLK)
460
426#endif 461#endif
diff --git a/arch/arm/plat-omap/include/plat/display.h b/arch/arm/plat-omap/include/plat/display.h
new file mode 100644
index 000000000000..1c529ce9dc11
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/display.h
@@ -0,0 +1,590 @@
1/*
2 * linux/include/asm-arm/arch-omap/display.h
3 *
4 * Copyright (C) 2008 Nokia Corporation
5 * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published by
9 * the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef __ASM_ARCH_OMAP_DISPLAY_H
21#define __ASM_ARCH_OMAP_DISPLAY_H
22
23#include <linux/list.h>
24#include <linux/kobject.h>
25#include <linux/device.h>
26#include <asm/atomic.h>
27
28#define DISPC_IRQ_FRAMEDONE (1 << 0)
29#define DISPC_IRQ_VSYNC (1 << 1)
30#define DISPC_IRQ_EVSYNC_EVEN (1 << 2)
31#define DISPC_IRQ_EVSYNC_ODD (1 << 3)
32#define DISPC_IRQ_ACBIAS_COUNT_STAT (1 << 4)
33#define DISPC_IRQ_PROG_LINE_NUM (1 << 5)
34#define DISPC_IRQ_GFX_FIFO_UNDERFLOW (1 << 6)
35#define DISPC_IRQ_GFX_END_WIN (1 << 7)
36#define DISPC_IRQ_PAL_GAMMA_MASK (1 << 8)
37#define DISPC_IRQ_OCP_ERR (1 << 9)
38#define DISPC_IRQ_VID1_FIFO_UNDERFLOW (1 << 10)
39#define DISPC_IRQ_VID1_END_WIN (1 << 11)
40#define DISPC_IRQ_VID2_FIFO_UNDERFLOW (1 << 12)
41#define DISPC_IRQ_VID2_END_WIN (1 << 13)
42#define DISPC_IRQ_SYNC_LOST (1 << 14)
43#define DISPC_IRQ_SYNC_LOST_DIGIT (1 << 15)
44#define DISPC_IRQ_WAKEUP (1 << 16)
45
46struct omap_dss_device;
47struct omap_overlay_manager;
48
49enum omap_display_type {
50 OMAP_DISPLAY_TYPE_NONE = 0,
51 OMAP_DISPLAY_TYPE_DPI = 1 << 0,
52 OMAP_DISPLAY_TYPE_DBI = 1 << 1,
53 OMAP_DISPLAY_TYPE_SDI = 1 << 2,
54 OMAP_DISPLAY_TYPE_DSI = 1 << 3,
55 OMAP_DISPLAY_TYPE_VENC = 1 << 4,
56};
57
58enum omap_plane {
59 OMAP_DSS_GFX = 0,
60 OMAP_DSS_VIDEO1 = 1,
61 OMAP_DSS_VIDEO2 = 2
62};
63
64enum omap_channel {
65 OMAP_DSS_CHANNEL_LCD = 0,
66 OMAP_DSS_CHANNEL_DIGIT = 1,
67};
68
69enum omap_color_mode {
70 OMAP_DSS_COLOR_CLUT1 = 1 << 0, /* BITMAP 1 */
71 OMAP_DSS_COLOR_CLUT2 = 1 << 1, /* BITMAP 2 */
72 OMAP_DSS_COLOR_CLUT4 = 1 << 2, /* BITMAP 4 */
73 OMAP_DSS_COLOR_CLUT8 = 1 << 3, /* BITMAP 8 */
74 OMAP_DSS_COLOR_RGB12U = 1 << 4, /* RGB12, 16-bit container */
75 OMAP_DSS_COLOR_ARGB16 = 1 << 5, /* ARGB16 */
76 OMAP_DSS_COLOR_RGB16 = 1 << 6, /* RGB16 */
77 OMAP_DSS_COLOR_RGB24U = 1 << 7, /* RGB24, 32-bit container */
78 OMAP_DSS_COLOR_RGB24P = 1 << 8, /* RGB24, 24-bit container */
79 OMAP_DSS_COLOR_YUV2 = 1 << 9, /* YUV2 4:2:2 co-sited */
80 OMAP_DSS_COLOR_UYVY = 1 << 10, /* UYVY 4:2:2 co-sited */
81 OMAP_DSS_COLOR_ARGB32 = 1 << 11, /* ARGB32 */
82 OMAP_DSS_COLOR_RGBA32 = 1 << 12, /* RGBA32 */
83 OMAP_DSS_COLOR_RGBX32 = 1 << 13, /* RGBx32 */
84
85 OMAP_DSS_COLOR_GFX_OMAP2 =
86 OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
87 OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
88 OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
89 OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P,
90
91 OMAP_DSS_COLOR_VID_OMAP2 =
92 OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
93 OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
94 OMAP_DSS_COLOR_UYVY,
95
96 OMAP_DSS_COLOR_GFX_OMAP3 =
97 OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
98 OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
99 OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
100 OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
101 OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |
102 OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
103
104 OMAP_DSS_COLOR_VID1_OMAP3 =
105 OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
106 OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P |
107 OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY,
108
109 OMAP_DSS_COLOR_VID2_OMAP3 =
110 OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
111 OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
112 OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
113 OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 |
114 OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
115};
116
117enum omap_lcd_display_type {
118 OMAP_DSS_LCD_DISPLAY_STN,
119 OMAP_DSS_LCD_DISPLAY_TFT,
120};
121
122enum omap_dss_load_mode {
123 OMAP_DSS_LOAD_CLUT_AND_FRAME = 0,
124 OMAP_DSS_LOAD_CLUT_ONLY = 1,
125 OMAP_DSS_LOAD_FRAME_ONLY = 2,
126 OMAP_DSS_LOAD_CLUT_ONCE_FRAME = 3,
127};
128
129enum omap_dss_trans_key_type {
130 OMAP_DSS_COLOR_KEY_GFX_DST = 0,
131 OMAP_DSS_COLOR_KEY_VID_SRC = 1,
132};
133
134enum omap_rfbi_te_mode {
135 OMAP_DSS_RFBI_TE_MODE_1 = 1,
136 OMAP_DSS_RFBI_TE_MODE_2 = 2,
137};
138
139enum omap_panel_config {
140 OMAP_DSS_LCD_IVS = 1<<0,
141 OMAP_DSS_LCD_IHS = 1<<1,
142 OMAP_DSS_LCD_IPC = 1<<2,
143 OMAP_DSS_LCD_IEO = 1<<3,
144 OMAP_DSS_LCD_RF = 1<<4,
145 OMAP_DSS_LCD_ONOFF = 1<<5,
146
147 OMAP_DSS_LCD_TFT = 1<<20,
148};
149
150enum omap_dss_venc_type {
151 OMAP_DSS_VENC_TYPE_COMPOSITE,
152 OMAP_DSS_VENC_TYPE_SVIDEO,
153};
154
155enum omap_display_caps {
156 OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE = 1 << 0,
157 OMAP_DSS_DISPLAY_CAP_TEAR_ELIM = 1 << 1,
158};
159
160enum omap_dss_update_mode {
161 OMAP_DSS_UPDATE_DISABLED = 0,
162 OMAP_DSS_UPDATE_AUTO,
163 OMAP_DSS_UPDATE_MANUAL,
164};
165
166enum omap_dss_display_state {
167 OMAP_DSS_DISPLAY_DISABLED = 0,
168 OMAP_DSS_DISPLAY_ACTIVE,
169 OMAP_DSS_DISPLAY_SUSPENDED,
170};
171
172/* XXX perhaps this should be removed */
173enum omap_dss_overlay_managers {
174 OMAP_DSS_OVL_MGR_LCD,
175 OMAP_DSS_OVL_MGR_TV,
176};
177
178enum omap_dss_rotation_type {
179 OMAP_DSS_ROT_DMA = 0,
180 OMAP_DSS_ROT_VRFB = 1,
181};
182
183/* clockwise rotation angle */
184enum omap_dss_rotation_angle {
185 OMAP_DSS_ROT_0 = 0,
186 OMAP_DSS_ROT_90 = 1,
187 OMAP_DSS_ROT_180 = 2,
188 OMAP_DSS_ROT_270 = 3,
189};
190
191enum omap_overlay_caps {
192 OMAP_DSS_OVL_CAP_SCALE = 1 << 0,
193 OMAP_DSS_OVL_CAP_DISPC = 1 << 1,
194};
195
196enum omap_overlay_manager_caps {
197 OMAP_DSS_OVL_MGR_CAP_DISPC = 1 << 0,
198};
199
200/* RFBI */
201
202struct rfbi_timings {
203 int cs_on_time;
204 int cs_off_time;
205 int we_on_time;
206 int we_off_time;
207 int re_on_time;
208 int re_off_time;
209 int we_cycle_time;
210 int re_cycle_time;
211 int cs_pulse_width;
212 int access_time;
213
214 int clk_div;
215
216 u32 tim[5]; /* set by rfbi_convert_timings() */
217
218 int converted;
219};
220
221void omap_rfbi_write_command(const void *buf, u32 len);
222void omap_rfbi_read_data(void *buf, u32 len);
223void omap_rfbi_write_data(const void *buf, u32 len);
224void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width,
225 u16 x, u16 y,
226 u16 w, u16 h);
227int omap_rfbi_enable_te(bool enable, unsigned line);
228int omap_rfbi_setup_te(enum omap_rfbi_te_mode mode,
229 unsigned hs_pulse_time, unsigned vs_pulse_time,
230 int hs_pol_inv, int vs_pol_inv, int extif_div);
231
232/* DSI */
233void dsi_bus_lock(void);
234void dsi_bus_unlock(void);
235int dsi_vc_dcs_write(int channel, u8 *data, int len);
236int dsi_vc_dcs_write_0(int channel, u8 dcs_cmd);
237int dsi_vc_dcs_write_1(int channel, u8 dcs_cmd, u8 param);
238int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len);
239int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen);
240int dsi_vc_dcs_read_1(int channel, u8 dcs_cmd, u8 *data);
241int dsi_vc_dcs_read_2(int channel, u8 dcs_cmd, u16 *data);
242int dsi_vc_set_max_rx_packet_size(int channel, u16 len);
243int dsi_vc_send_null(int channel);
244int dsi_vc_send_bta_sync(int channel);
245
246/* Board specific data */
247struct omap_dss_board_info {
248 int (*get_last_off_on_transaction_id)(struct device *dev);
249 int num_devices;
250 struct omap_dss_device **devices;
251 struct omap_dss_device *default_device;
252};
253
254struct omap_video_timings {
255 /* Unit: pixels */
256 u16 x_res;
257 /* Unit: pixels */
258 u16 y_res;
259 /* Unit: KHz */
260 u32 pixel_clock;
261 /* Unit: pixel clocks */
262 u16 hsw; /* Horizontal synchronization pulse width */
263 /* Unit: pixel clocks */
264 u16 hfp; /* Horizontal front porch */
265 /* Unit: pixel clocks */
266 u16 hbp; /* Horizontal back porch */
267 /* Unit: line clocks */
268 u16 vsw; /* Vertical synchronization pulse width */
269 /* Unit: line clocks */
270 u16 vfp; /* Vertical front porch */
271 /* Unit: line clocks */
272 u16 vbp; /* Vertical back porch */
273};
274
275#ifdef CONFIG_OMAP2_DSS_VENC
276/* Hardcoded timings for tv modes. Venc only uses these to
277 * identify the mode, and does not actually use the configs
278 * itself. However, the configs should be something that
279 * a normal monitor can also show */
280const extern struct omap_video_timings omap_dss_pal_timings;
281const extern struct omap_video_timings omap_dss_ntsc_timings;
282#endif
283
284struct omap_overlay_info {
285 bool enabled;
286
287 u32 paddr;
288 void __iomem *vaddr;
289 u16 screen_width;
290 u16 width;
291 u16 height;
292 enum omap_color_mode color_mode;
293 u8 rotation;
294 enum omap_dss_rotation_type rotation_type;
295 bool mirror;
296
297 u16 pos_x;
298 u16 pos_y;
299 u16 out_width; /* if 0, out_width == width */
300 u16 out_height; /* if 0, out_height == height */
301 u8 global_alpha;
302};
303
304struct omap_overlay {
305 struct kobject kobj;
306 struct list_head list;
307
308 /* static fields */
309 const char *name;
310 int id;
311 enum omap_color_mode supported_modes;
312 enum omap_overlay_caps caps;
313
314 /* dynamic fields */
315 struct omap_overlay_manager *manager;
316 struct omap_overlay_info info;
317
318 /* if true, info has been changed, but not applied() yet */
319 bool info_dirty;
320
321 int (*set_manager)(struct omap_overlay *ovl,
322 struct omap_overlay_manager *mgr);
323 int (*unset_manager)(struct omap_overlay *ovl);
324
325 int (*set_overlay_info)(struct omap_overlay *ovl,
326 struct omap_overlay_info *info);
327 void (*get_overlay_info)(struct omap_overlay *ovl,
328 struct omap_overlay_info *info);
329
330 int (*wait_for_go)(struct omap_overlay *ovl);
331};
332
333struct omap_overlay_manager_info {
334 u32 default_color;
335
336 enum omap_dss_trans_key_type trans_key_type;
337 u32 trans_key;
338 bool trans_enabled;
339
340 bool alpha_enabled;
341};
342
343struct omap_overlay_manager {
344 struct kobject kobj;
345 struct list_head list;
346
347 /* static fields */
348 const char *name;
349 int id;
350 enum omap_overlay_manager_caps caps;
351 int num_overlays;
352 struct omap_overlay **overlays;
353 enum omap_display_type supported_displays;
354
355 /* dynamic fields */
356 struct omap_dss_device *device;
357 struct omap_overlay_manager_info info;
358
359 bool device_changed;
360 /* if true, info has been changed but not applied() yet */
361 bool info_dirty;
362
363 int (*set_device)(struct omap_overlay_manager *mgr,
364 struct omap_dss_device *dssdev);
365 int (*unset_device)(struct omap_overlay_manager *mgr);
366
367 int (*set_manager_info)(struct omap_overlay_manager *mgr,
368 struct omap_overlay_manager_info *info);
369 void (*get_manager_info)(struct omap_overlay_manager *mgr,
370 struct omap_overlay_manager_info *info);
371
372 int (*apply)(struct omap_overlay_manager *mgr);
373 int (*wait_for_go)(struct omap_overlay_manager *mgr);
374 int (*wait_for_vsync)(struct omap_overlay_manager *mgr);
375
376 int (*enable)(struct omap_overlay_manager *mgr);
377 int (*disable)(struct omap_overlay_manager *mgr);
378};
379
380struct omap_dss_device {
381 struct device dev;
382
383 enum omap_display_type type;
384
385 union {
386 struct {
387 u8 data_lines;
388 } dpi;
389
390 struct {
391 u8 channel;
392 u8 data_lines;
393 } rfbi;
394
395 struct {
396 u8 datapairs;
397 } sdi;
398
399 struct {
400 u8 clk_lane;
401 u8 clk_pol;
402 u8 data1_lane;
403 u8 data1_pol;
404 u8 data2_lane;
405 u8 data2_pol;
406
407 struct {
408 u16 regn;
409 u16 regm;
410 u16 regm3;
411 u16 regm4;
412
413 u16 lp_clk_div;
414
415 u16 lck_div;
416 u16 pck_div;
417 } div;
418
419 bool ext_te;
420 u8 ext_te_gpio;
421 } dsi;
422
423 struct {
424 enum omap_dss_venc_type type;
425 bool invert_polarity;
426 } venc;
427 } phy;
428
429 struct {
430 struct omap_video_timings timings;
431
432 int acbi; /* ac-bias pin transitions per interrupt */
433 /* Unit: line clocks */
434 int acb; /* ac-bias pin frequency */
435
436 enum omap_panel_config config;
437 } panel;
438
439 struct {
440 u8 pixel_size;
441 struct rfbi_timings rfbi_timings;
442 } ctrl;
443
444 int reset_gpio;
445
446 int max_backlight_level;
447
448 const char *name;
449
450 /* used to match device to driver */
451 const char *driver_name;
452
453 void *data;
454
455 struct omap_dss_driver *driver;
456
457 /* helper variable for driver suspend/resume */
458 bool activate_after_resume;
459
460 enum omap_display_caps caps;
461
462 struct omap_overlay_manager *manager;
463
464 enum omap_dss_display_state state;
465
466 /* platform specific */
467 int (*platform_enable)(struct omap_dss_device *dssdev);
468 void (*platform_disable)(struct omap_dss_device *dssdev);
469 int (*set_backlight)(struct omap_dss_device *dssdev, int level);
470 int (*get_backlight)(struct omap_dss_device *dssdev);
471};
472
473struct omap_dss_driver {
474 struct device_driver driver;
475
476 int (*probe)(struct omap_dss_device *);
477 void (*remove)(struct omap_dss_device *);
478
479 int (*enable)(struct omap_dss_device *display);
480 void (*disable)(struct omap_dss_device *display);
481 int (*suspend)(struct omap_dss_device *display);
482 int (*resume)(struct omap_dss_device *display);
483 int (*run_test)(struct omap_dss_device *display, int test);
484
485 int (*set_update_mode)(struct omap_dss_device *dssdev,
486 enum omap_dss_update_mode);
487 enum omap_dss_update_mode (*get_update_mode)(
488 struct omap_dss_device *dssdev);
489
490 int (*update)(struct omap_dss_device *dssdev,
491 u16 x, u16 y, u16 w, u16 h);
492 int (*sync)(struct omap_dss_device *dssdev);
493
494 int (*enable_te)(struct omap_dss_device *dssdev, bool enable);
495 int (*get_te)(struct omap_dss_device *dssdev);
496
497 u8 (*get_rotate)(struct omap_dss_device *dssdev);
498 int (*set_rotate)(struct omap_dss_device *dssdev, u8 rotate);
499
500 bool (*get_mirror)(struct omap_dss_device *dssdev);
501 int (*set_mirror)(struct omap_dss_device *dssdev, bool enable);
502
503 int (*memory_read)(struct omap_dss_device *dssdev,
504 void *buf, size_t size,
505 u16 x, u16 y, u16 w, u16 h);
506
507 void (*get_resolution)(struct omap_dss_device *dssdev,
508 u16 *xres, u16 *yres);
509 int (*get_recommended_bpp)(struct omap_dss_device *dssdev);
510
511 int (*check_timings)(struct omap_dss_device *dssdev,
512 struct omap_video_timings *timings);
513 void (*set_timings)(struct omap_dss_device *dssdev,
514 struct omap_video_timings *timings);
515 void (*get_timings)(struct omap_dss_device *dssdev,
516 struct omap_video_timings *timings);
517
518 int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);
519 u32 (*get_wss)(struct omap_dss_device *dssdev);
520};
521
522int omap_dss_register_driver(struct omap_dss_driver *);
523void omap_dss_unregister_driver(struct omap_dss_driver *);
524
525int omap_dss_register_device(struct omap_dss_device *);
526void omap_dss_unregister_device(struct omap_dss_device *);
527
528void omap_dss_get_device(struct omap_dss_device *dssdev);
529void omap_dss_put_device(struct omap_dss_device *dssdev);
530#define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL)
531struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from);
532struct omap_dss_device *omap_dss_find_device(void *data,
533 int (*match)(struct omap_dss_device *dssdev, void *data));
534
535int omap_dss_start_device(struct omap_dss_device *dssdev);
536void omap_dss_stop_device(struct omap_dss_device *dssdev);
537
538int omap_dss_get_num_overlay_managers(void);
539struct omap_overlay_manager *omap_dss_get_overlay_manager(int num);
540
541int omap_dss_get_num_overlays(void);
542struct omap_overlay *omap_dss_get_overlay(int num);
543
544void omapdss_default_get_resolution(struct omap_dss_device *dssdev,
545 u16 *xres, u16 *yres);
546int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev);
547
548typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
549int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
550int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
551
552int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout);
553int omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask,
554 unsigned long timeout);
555
556#define to_dss_driver(x) container_of((x), struct omap_dss_driver, driver)
557#define to_dss_device(x) container_of((x), struct omap_dss_device, dev)
558
559void omapdss_dsi_vc_enable_hs(int channel, bool enable);
560int omapdss_dsi_enable_te(struct omap_dss_device *dssdev, bool enable);
561
562int omap_dsi_prepare_update(struct omap_dss_device *dssdev,
563 u16 *x, u16 *y, u16 *w, u16 *h);
564int omap_dsi_update(struct omap_dss_device *dssdev,
565 int channel,
566 u16 x, u16 y, u16 w, u16 h,
567 void (*callback)(int, void *), void *data);
568
569int omapdss_dsi_display_enable(struct omap_dss_device *dssdev);
570void omapdss_dsi_display_disable(struct omap_dss_device *dssdev);
571
572int omapdss_dpi_display_enable(struct omap_dss_device *dssdev);
573void omapdss_dpi_display_disable(struct omap_dss_device *dssdev);
574void dpi_set_timings(struct omap_dss_device *dssdev,
575 struct omap_video_timings *timings);
576int dpi_check_timings(struct omap_dss_device *dssdev,
577 struct omap_video_timings *timings);
578
579int omapdss_sdi_display_enable(struct omap_dss_device *dssdev);
580void omapdss_sdi_display_disable(struct omap_dss_device *dssdev);
581
582int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev);
583void omapdss_rfbi_display_disable(struct omap_dss_device *dssdev);
584int omap_rfbi_prepare_update(struct omap_dss_device *dssdev,
585 u16 *x, u16 *y, u16 *w, u16 *h);
586int omap_rfbi_update(struct omap_dss_device *dssdev,
587 u16 x, u16 y, u16 w, u16 h,
588 void (*callback)(void *), void *data);
589
590#endif
diff --git a/arch/arm/plat-omap/include/plat/dma-44xx.h b/arch/arm/plat-omap/include/plat/dma-44xx.h
new file mode 100644
index 000000000000..1f767cb2f38a
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/dma-44xx.h
@@ -0,0 +1,147 @@
1/*
2 * OMAP4 SDMA channel definitions
3 *
4 * Copyright (C) 2009-2010 Texas Instruments, Inc.
5 * Copyright (C) 2009-2010 Nokia Corporation
6 *
7 * Santosh Shilimkar (santosh.shilimkar@ti.com)
8 * Benoit Cousson (b-cousson@ti.com)
9 * Paul Walmsley (paul@pwsan.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_OMAP44XX_DMA_H
23#define __ARCH_ARM_MACH_OMAP2_OMAP44XX_DMA_H
24
25#define OMAP44XX_DMA_SYS_REQ0 2
26#define OMAP44XX_DMA_SYS_REQ1 3
27#define OMAP44XX_DMA_GPMC 4
28#define OMAP44XX_DMA_DSS_DISPC_REQ 6
29#define OMAP44XX_DMA_SYS_REQ2 7
30#define OMAP44XX_DMA_MCASP1_AXEVT 8
31#define OMAP44XX_DMA_ISS_REQ1 9
32#define OMAP44XX_DMA_ISS_REQ2 10
33#define OMAP44XX_DMA_MCASP1_AREVT 11
34#define OMAP44XX_DMA_ISS_REQ3 12
35#define OMAP44XX_DMA_ISS_REQ4 13
36#define OMAP44XX_DMA_DSS_RFBI_REQ 14
37#define OMAP44XX_DMA_SPI3_TX0 15
38#define OMAP44XX_DMA_SPI3_RX0 16
39#define OMAP44XX_DMA_MCBSP2_TX 17
40#define OMAP44XX_DMA_MCBSP2_RX 18
41#define OMAP44XX_DMA_MCBSP3_TX 19
42#define OMAP44XX_DMA_MCBSP3_RX 20
43#define OMAP44XX_DMA_C2C_SSCM_GPO0 21
44#define OMAP44XX_DMA_C2C_SSCM_GPO1 22
45#define OMAP44XX_DMA_SPI3_TX1 23
46#define OMAP44XX_DMA_SPI3_RX1 24
47#define OMAP44XX_DMA_I2C3_TX 25
48#define OMAP44XX_DMA_I2C3_RX 26
49#define OMAP44XX_DMA_I2C1_TX 27
50#define OMAP44XX_DMA_I2C1_RX 28
51#define OMAP44XX_DMA_I2C2_TX 29
52#define OMAP44XX_DMA_I2C2_RX 30
53#define OMAP44XX_DMA_MCBSP4_TX 31
54#define OMAP44XX_DMA_MCBSP4_RX 32
55#define OMAP44XX_DMA_MCBSP1_TX 33
56#define OMAP44XX_DMA_MCBSP1_RX 34
57#define OMAP44XX_DMA_SPI1_TX0 35
58#define OMAP44XX_DMA_SPI1_RX0 36
59#define OMAP44XX_DMA_SPI1_TX1 37
60#define OMAP44XX_DMA_SPI1_RX1 38
61#define OMAP44XX_DMA_SPI1_TX2 39
62#define OMAP44XX_DMA_SPI1_RX2 40
63#define OMAP44XX_DMA_SPI1_TX3 41
64#define OMAP44XX_DMA_SPI1_RX3 42
65#define OMAP44XX_DMA_SPI2_TX0 43
66#define OMAP44XX_DMA_SPI2_RX0 44
67#define OMAP44XX_DMA_SPI2_TX1 45
68#define OMAP44XX_DMA_SPI2_RX1 46
69#define OMAP44XX_DMA_MMC2_TX 47
70#define OMAP44XX_DMA_MMC2_RX 48
71#define OMAP44XX_DMA_UART1_TX 49
72#define OMAP44XX_DMA_UART1_RX 50
73#define OMAP44XX_DMA_UART2_TX 51
74#define OMAP44XX_DMA_UART2_RX 52
75#define OMAP44XX_DMA_UART3_TX 53
76#define OMAP44XX_DMA_UART3_RX 54
77#define OMAP44XX_DMA_UART4_TX 55
78#define OMAP44XX_DMA_UART4_RX 56
79#define OMAP44XX_DMA_MMC4_TX 57
80#define OMAP44XX_DMA_MMC4_RX 58
81#define OMAP44XX_DMA_MMC5_TX 59
82#define OMAP44XX_DMA_MMC5_RX 60
83#define OMAP44XX_DMA_MMC1_TX 61
84#define OMAP44XX_DMA_MMC1_RX 62
85#define OMAP44XX_DMA_SYS_REQ3 64
86#define OMAP44XX_DMA_MCPDM_UP 65
87#define OMAP44XX_DMA_MCPDM_DL 66
88#define OMAP44XX_DMA_DMIC_REQ 67
89#define OMAP44XX_DMA_C2C_SSCM_GPO2 68
90#define OMAP44XX_DMA_C2C_SSCM_GPO3 69
91#define OMAP44XX_DMA_SPI4_TX0 70
92#define OMAP44XX_DMA_SPI4_RX0 71
93#define OMAP44XX_DMA_DSS_DSI1_REQ0 72
94#define OMAP44XX_DMA_DSS_DSI1_REQ1 73
95#define OMAP44XX_DMA_DSS_DSI1_REQ2 74
96#define OMAP44XX_DMA_DSS_DSI1_REQ3 75
97#define OMAP44XX_DMA_DSS_HDMI_REQ 76
98#define OMAP44XX_DMA_MMC3_TX 77
99#define OMAP44XX_DMA_MMC3_RX 78
100#define OMAP44XX_DMA_USIM_TX 79
101#define OMAP44XX_DMA_USIM_RX 80
102#define OMAP44XX_DMA_DSS_DSI2_REQ0 81
103#define OMAP44XX_DMA_DSS_DSI2_REQ1 82
104#define OMAP44XX_DMA_DSS_DSI2_REQ2 83
105#define OMAP44XX_DMA_DSS_DSI2_REQ3 84
106#define OMAP44XX_DMA_SLIMBUS1_TX0 85
107#define OMAP44XX_DMA_SLIMBUS1_TX1 86
108#define OMAP44XX_DMA_SLIMBUS1_TX2 87
109#define OMAP44XX_DMA_SLIMBUS1_TX3 88
110#define OMAP44XX_DMA_SLIMBUS1_RX0 89
111#define OMAP44XX_DMA_SLIMBUS1_RX1 90
112#define OMAP44XX_DMA_SLIMBUS1_RX2 91
113#define OMAP44XX_DMA_SLIMBUS1_RX3 92
114#define OMAP44XX_DMA_SLIMBUS2_TX0 93
115#define OMAP44XX_DMA_SLIMBUS2_TX1 94
116#define OMAP44XX_DMA_SLIMBUS2_TX2 95
117#define OMAP44XX_DMA_SLIMBUS2_TX3 96
118#define OMAP44XX_DMA_SLIMBUS2_RX0 97
119#define OMAP44XX_DMA_SLIMBUS2_RX1 98
120#define OMAP44XX_DMA_SLIMBUS2_RX2 99
121#define OMAP44XX_DMA_SLIMBUS2_RX3 100
122#define OMAP44XX_DMA_ABE_REQ_0 101
123#define OMAP44XX_DMA_ABE_REQ_1 102
124#define OMAP44XX_DMA_ABE_REQ_2 103
125#define OMAP44XX_DMA_ABE_REQ_3 104
126#define OMAP44XX_DMA_ABE_REQ_4 105
127#define OMAP44XX_DMA_ABE_REQ_5 106
128#define OMAP44XX_DMA_ABE_REQ_6 107
129#define OMAP44XX_DMA_ABE_REQ_7 108
130#define OMAP44XX_DMA_AES1_P_CTX_IN_REQ 109
131#define OMAP44XX_DMA_AES1_P_DATA_IN_REQ 110
132#define OMAP44XX_DMA_AES1_P_DATA_OUT_REQ 111
133#define OMAP44XX_DMA_AES2_P_CTX_IN_REQ 112
134#define OMAP44XX_DMA_AES2_P_DATA_IN_REQ 113
135#define OMAP44XX_DMA_AES2_P_DATA_OUT_REQ 114
136#define OMAP44XX_DMA_DES_P_CTX_IN_REQ 115
137#define OMAP44XX_DMA_DES_P_DATA_IN_REQ 116
138#define OMAP44XX_DMA_DES_P_DATA_OUT_REQ 117
139#define OMAP44XX_DMA_SHA2_CTXIN_P 118
140#define OMAP44XX_DMA_SHA2_DIN_P 119
141#define OMAP44XX_DMA_SHA2_CTXOUT_P 120
142#define OMAP44XX_DMA_AES1_P_CONTEXT_OUT_REQ 121
143#define OMAP44XX_DMA_AES2_P_CONTEXT_OUT_REQ 122
144#define OMAP44XX_DMA_I2C4_TX 124
145#define OMAP44XX_DMA_I2C4_RX 125
146
147#endif
diff --git a/arch/arm/plat-omap/include/mach/dma.h b/arch/arm/plat-omap/include/plat/dma.h
index 72f680b7180d..02232ca2c37f 100644
--- a/arch/arm/plat-omap/include/mach/dma.h
+++ b/arch/arm/plat-omap/include/plat/dma.h
@@ -21,6 +21,9 @@
21#ifndef __ASM_ARCH_DMA_H 21#ifndef __ASM_ARCH_DMA_H
22#define __ASM_ARCH_DMA_H 22#define __ASM_ARCH_DMA_H
23 23
24/* Move omap4 specific defines to dma-44xx.h */
25#include "dma-44xx.h"
26
24/* Hardware registers for omap1 */ 27/* Hardware registers for omap1 */
25#define OMAP1_DMA_BASE (0xfffed800) 28#define OMAP1_DMA_BASE (0xfffed800)
26 29
@@ -316,118 +319,8 @@
316#define OMAP34XX_DMA_USIM_TX 79 /* S_DMA_78 */ 319#define OMAP34XX_DMA_USIM_TX 79 /* S_DMA_78 */
317#define OMAP34XX_DMA_USIM_RX 80 /* S_DMA_79 */ 320#define OMAP34XX_DMA_USIM_RX 80 /* S_DMA_79 */
318 321
319/* DMA request lines for 44xx */
320#define OMAP44XX_DMA_DSS_DISPC_REQ 6 /* S_DMA_5 */
321#define OMAP44XX_DMA_SYS_REQ2 7 /* S_DMA_6 */
322#define OMAP44XX_DMA_ISS_REQ1 9 /* S_DMA_8 */
323#define OMAP44XX_DMA_ISS_REQ2 10 /* S_DMA_9 */
324#define OMAP44XX_DMA_ISS_REQ3 12 /* S_DMA_11 */
325#define OMAP44XX_DMA_ISS_REQ4 13 /* S_DMA_12 */
326#define OMAP44XX_DMA_DSS_RFBI_REQ 14 /* S_DMA_13 */
327#define OMAP44XX_DMA_SPI3_TX0 15 /* S_DMA_14 */
328#define OMAP44XX_DMA_SPI3_RX0 16 /* S_DMA_15 */
329#define OMAP44XX_DMA_MCBSP2_TX 17 /* S_DMA_16 */
330#define OMAP44XX_DMA_MCBSP2_RX 18 /* S_DMA_17 */
331#define OMAP44XX_DMA_MCBSP3_TX 19 /* S_DMA_18 */
332#define OMAP44XX_DMA_MCBSP3_RX 20 /* S_DMA_19 */
333#define OMAP44XX_DMA_SPI3_TX1 23 /* S_DMA_22 */
334#define OMAP44XX_DMA_SPI3_RX1 24 /* S_DMA_23 */
335#define OMAP44XX_DMA_I2C3_TX 25 /* S_DMA_24 */
336#define OMAP44XX_DMA_I2C3_RX 26 /* S_DMA_25 */
337#define OMAP44XX_DMA_I2C1_TX 27 /* S_DMA_26 */
338#define OMAP44XX_DMA_I2C1_RX 28 /* S_DMA_27 */
339#define OMAP44XX_DMA_I2C2_TX 29 /* S_DMA_28 */
340#define OMAP44XX_DMA_I2C2_RX 30 /* S_DMA_29 */
341#define OMAP44XX_DMA_MCBSP4_TX 31 /* S_DMA_30 */
342#define OMAP44XX_DMA_MCBSP4_RX 32 /* S_DMA_31 */
343#define OMAP44XX_DMA_MCBSP1_TX 33 /* S_DMA_32 */
344#define OMAP44XX_DMA_MCBSP1_RX 34 /* S_DMA_33 */
345#define OMAP44XX_DMA_SPI1_TX0 35 /* S_DMA_34 */
346#define OMAP44XX_DMA_SPI1_RX0 36 /* S_DMA_35 */
347#define OMAP44XX_DMA_SPI1_TX1 37 /* S_DMA_36 */
348#define OMAP44XX_DMA_SPI1_RX1 38 /* S_DMA_37 */
349#define OMAP44XX_DMA_SPI1_TX2 39 /* S_DMA_38 */
350#define OMAP44XX_DMA_SPI1_RX2 40 /* S_DMA_39 */
351#define OMAP44XX_DMA_SPI1_TX3 41 /* S_DMA_40 */
352#define OMAP44XX_DMA_SPI1_RX3 42 /* S_DMA_41 */
353#define OMAP44XX_DMA_SPI2_TX0 43 /* S_DMA_42 */
354#define OMAP44XX_DMA_SPI2_RX0 44 /* S_DMA_43 */
355#define OMAP44XX_DMA_SPI2_TX1 45 /* S_DMA_44 */
356#define OMAP44XX_DMA_SPI2_RX1 46 /* S_DMA_45 */
357#define OMAP44XX_DMA_MMC2_TX 47 /* S_DMA_46 */
358#define OMAP44XX_DMA_MMC2_RX 48 /* S_DMA_47 */
359#define OMAP44XX_DMA_UART1_TX 49 /* S_DMA_48 */
360#define OMAP44XX_DMA_UART1_RX 50 /* S_DMA_49 */
361#define OMAP44XX_DMA_UART2_TX 51 /* S_DMA_50 */
362#define OMAP44XX_DMA_UART2_RX 52 /* S_DMA_51 */
363#define OMAP44XX_DMA_UART3_TX 53 /* S_DMA_52 */
364#define OMAP44XX_DMA_UART3_RX 54 /* S_DMA_53 */
365#define OMAP44XX_DMA_UART4_TX 55 /* S_DMA_54 */
366#define OMAP44XX_DMA_UART4_RX 56 /* S_DMA_55 */
367#define OMAP44XX_DMA_MMC4_TX 57 /* S_DMA_56 */
368#define OMAP44XX_DMA_MMC4_RX 58 /* S_DMA_57 */
369#define OMAP44XX_DMA_MMC5_TX 59 /* S_DMA_58 */
370#define OMAP44XX_DMA_MMC5_RX 60 /* S_DMA_59 */
371#define OMAP44XX_DMA_MMC1_TX 61 /* S_DMA_60 */
372#define OMAP44XX_DMA_MMC1_RX 62 /* S_DMA_61 */
373#define OMAP44XX_DMA_SYS_REQ3 64 /* S_DMA_63 */
374#define OMAP44XX_DMA_MCPDM_UP 65 /* S_DMA_64 */
375#define OMAP44XX_DMA_MCPDM_DL 66 /* S_DMA_65 */
376#define OMAP44XX_DMA_SPI4_TX0 70 /* S_DMA_69 */
377#define OMAP44XX_DMA_SPI4_RX0 71 /* S_DMA_70 */
378#define OMAP44XX_DMA_DSS_DSI1_REQ0 72 /* S_DMA_71 */
379#define OMAP44XX_DMA_DSS_DSI1_REQ1 73 /* S_DMA_72 */
380#define OMAP44XX_DMA_DSS_DSI1_REQ2 74 /* S_DMA_73 */
381#define OMAP44XX_DMA_DSS_DSI1_REQ3 75 /* S_DMA_74 */
382#define OMAP44XX_DMA_DSS_HDMI_REQ 76 /* S_DMA_75 */
383#define OMAP44XX_DMA_MMC3_TX 77 /* S_DMA_76 */
384#define OMAP44XX_DMA_MMC3_RX 78 /* S_DMA_77 */
385#define OMAP44XX_DMA_USIM_TX 79 /* S_DMA_78 */
386#define OMAP44XX_DMA_USIM_RX 80 /* S_DMA_79 */
387#define OMAP44XX_DMA_DSS_DSI2_REQ0 81 /* S_DMA_80 */
388#define OMAP44XX_DMA_DSS_DSI2_REQ1 82 /* S_DMA_81 */
389#define OMAP44XX_DMA_DSS_DSI2_REQ2 83 /* S_DMA_82 */
390#define OMAP44XX_DMA_DSS_DSI2_REQ3 84 /* S_DMA_83 */
391#define OMAP44XX_DMA_ABE_REQ0 101 /* S_DMA_100 */
392#define OMAP44XX_DMA_ABE_REQ1 102 /* S_DMA_101 */
393#define OMAP44XX_DMA_ABE_REQ2 103 /* S_DMA_102 */
394#define OMAP44XX_DMA_ABE_REQ3 104 /* S_DMA_103 */
395#define OMAP44XX_DMA_ABE_REQ4 105 /* S_DMA_104 */
396#define OMAP44XX_DMA_ABE_REQ5 106 /* S_DMA_105 */
397#define OMAP44XX_DMA_ABE_REQ6 107 /* S_DMA_106 */
398#define OMAP44XX_DMA_ABE_REQ7 108 /* S_DMA_107 */
399#define OMAP44XX_DMA_I2C4_TX 124 /* S_DMA_123 */
400#define OMAP44XX_DMA_I2C4_RX 125 /* S_DMA_124 */
401
402/*----------------------------------------------------------------------------*/ 322/*----------------------------------------------------------------------------*/
403 323
404/* Hardware registers for LCD DMA */
405#define OMAP1510_DMA_LCD_BASE (0xfffedb00)
406#define OMAP1510_DMA_LCD_CTRL (OMAP1510_DMA_LCD_BASE + 0x00)
407#define OMAP1510_DMA_LCD_TOP_F1_L (OMAP1510_DMA_LCD_BASE + 0x02)
408#define OMAP1510_DMA_LCD_TOP_F1_U (OMAP1510_DMA_LCD_BASE + 0x04)
409#define OMAP1510_DMA_LCD_BOT_F1_L (OMAP1510_DMA_LCD_BASE + 0x06)
410#define OMAP1510_DMA_LCD_BOT_F1_U (OMAP1510_DMA_LCD_BASE + 0x08)
411
412#define OMAP1610_DMA_LCD_BASE (0xfffee300)
413#define OMAP1610_DMA_LCD_CSDP (OMAP1610_DMA_LCD_BASE + 0xc0)
414#define OMAP1610_DMA_LCD_CCR (OMAP1610_DMA_LCD_BASE + 0xc2)
415#define OMAP1610_DMA_LCD_CTRL (OMAP1610_DMA_LCD_BASE + 0xc4)
416#define OMAP1610_DMA_LCD_TOP_B1_L (OMAP1610_DMA_LCD_BASE + 0xc8)
417#define OMAP1610_DMA_LCD_TOP_B1_U (OMAP1610_DMA_LCD_BASE + 0xca)
418#define OMAP1610_DMA_LCD_BOT_B1_L (OMAP1610_DMA_LCD_BASE + 0xcc)
419#define OMAP1610_DMA_LCD_BOT_B1_U (OMAP1610_DMA_LCD_BASE + 0xce)
420#define OMAP1610_DMA_LCD_TOP_B2_L (OMAP1610_DMA_LCD_BASE + 0xd0)
421#define OMAP1610_DMA_LCD_TOP_B2_U (OMAP1610_DMA_LCD_BASE + 0xd2)
422#define OMAP1610_DMA_LCD_BOT_B2_L (OMAP1610_DMA_LCD_BASE + 0xd4)
423#define OMAP1610_DMA_LCD_BOT_B2_U (OMAP1610_DMA_LCD_BASE + 0xd6)
424#define OMAP1610_DMA_LCD_SRC_EI_B1 (OMAP1610_DMA_LCD_BASE + 0xd8)
425#define OMAP1610_DMA_LCD_SRC_FI_B1_L (OMAP1610_DMA_LCD_BASE + 0xda)
426#define OMAP1610_DMA_LCD_SRC_EN_B1 (OMAP1610_DMA_LCD_BASE + 0xe0)
427#define OMAP1610_DMA_LCD_SRC_FN_B1 (OMAP1610_DMA_LCD_BASE + 0xe4)
428#define OMAP1610_DMA_LCD_LCH_CTRL (OMAP1610_DMA_LCD_BASE + 0xea)
429#define OMAP1610_DMA_LCD_SRC_FI_B1_U (OMAP1610_DMA_LCD_BASE + 0xf4)
430
431#define OMAP1_DMA_TOUT_IRQ (1 << 0) 324#define OMAP1_DMA_TOUT_IRQ (1 << 0)
432#define OMAP_DMA_DROP_IRQ (1 << 1) 325#define OMAP_DMA_DROP_IRQ (1 << 1)
433#define OMAP_DMA_HALF_IRQ (1 << 2) 326#define OMAP_DMA_HALF_IRQ (1 << 2)
@@ -441,6 +334,8 @@
441#define OMAP2_DMA_SUPERVISOR_ERR_IRQ (1 << 10) 334#define OMAP2_DMA_SUPERVISOR_ERR_IRQ (1 << 10)
442#define OMAP2_DMA_MISALIGNED_ERR_IRQ (1 << 11) 335#define OMAP2_DMA_MISALIGNED_ERR_IRQ (1 << 11)
443 336
337#define OMAP_DMA_CCR_EN (1 << 7)
338
444#define OMAP_DMA_DATA_TYPE_S8 0x00 339#define OMAP_DMA_DATA_TYPE_S8 0x00
445#define OMAP_DMA_DATA_TYPE_S16 0x01 340#define OMAP_DMA_DATA_TYPE_S16 0x01
446#define OMAP_DMA_DATA_TYPE_S32 0x02 341#define OMAP_DMA_DATA_TYPE_S32 0x02
@@ -503,14 +398,6 @@
503#define DMA_CH_PRIO_HIGH 0x1 398#define DMA_CH_PRIO_HIGH 0x1
504#define DMA_CH_PRIO_LOW 0x0 /* Def */ 399#define DMA_CH_PRIO_LOW 0x0 /* Def */
505 400
506/* LCD DMA block numbers */
507enum {
508 OMAP_LCD_DMA_B1_TOP,
509 OMAP_LCD_DMA_B1_BOTTOM,
510 OMAP_LCD_DMA_B2_TOP,
511 OMAP_LCD_DMA_B2_BOTTOM
512};
513
514enum omap_dma_burst_mode { 401enum omap_dma_burst_mode {
515 OMAP_DMA_DATA_BURST_DIS = 0, 402 OMAP_DMA_DATA_BURST_DIS = 0,
516 OMAP_DMA_DATA_BURST_4, 403 OMAP_DMA_DATA_BURST_4,
@@ -633,6 +520,11 @@ extern void omap_set_dma_dst_endian_type(int lch, enum end_type etype);
633extern void omap_set_dma_src_endian_type(int lch, enum end_type etype); 520extern void omap_set_dma_src_endian_type(int lch, enum end_type etype);
634extern int omap_get_dma_index(int lch, int *ei, int *fi); 521extern int omap_get_dma_index(int lch, int *ei, int *fi);
635 522
523void omap_dma_global_context_save(void);
524void omap_dma_global_context_restore(void);
525
526extern void omap_dma_disable_irq(int lch);
527
636/* Chaining APIs */ 528/* Chaining APIs */
637#ifndef CONFIG_ARCH_OMAP1 529#ifndef CONFIG_ARCH_OMAP1
638extern int omap_request_dma_chain(int dev_id, const char *dev_name, 530extern int omap_request_dma_chain(int dev_id, const char *dev_name,
@@ -656,20 +548,13 @@ extern int omap_modify_dma_chain_params(int chain_id,
656extern int omap_dma_chain_status(int chain_id); 548extern int omap_dma_chain_status(int chain_id);
657#endif 549#endif
658 550
659/* LCD DMA functions */ 551#if defined(CONFIG_ARCH_OMAP1) && defined(CONFIG_FB_OMAP)
660extern int omap_request_lcd_dma(void (*callback)(u16 status, void *data), 552#include <mach/lcd_dma.h>
661 void *data); 553#else
662extern void omap_free_lcd_dma(void); 554static inline int omap_lcd_dma_running(void)
663extern void omap_setup_lcd_dma(void); 555{
664extern void omap_enable_lcd_dma(void); 556 return 0;
665extern void omap_stop_lcd_dma(void); 557}
666extern void omap_set_lcd_dma_ext_controller(int external); 558#endif
667extern void omap_set_lcd_dma_single_transfer(int single);
668extern void omap_set_lcd_dma_b1(unsigned long addr, u16 fb_xres, u16 fb_yres,
669 int data_type);
670extern void omap_set_lcd_dma_b1_rotation(int rotate);
671extern void omap_set_lcd_dma_b1_vxres(unsigned long vxres);
672extern void omap_set_lcd_dma_b1_mirror(int mirror);
673extern void omap_set_lcd_dma_b1_scale(unsigned int xscale, unsigned int yscale);
674 559
675#endif /* __ASM_ARCH_DMA_H */ 560#endif /* __ASM_ARCH_DMA_H */
diff --git a/arch/arm/plat-omap/include/mach/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h
index 20f1054c0a80..20f1054c0a80 100644
--- a/arch/arm/plat-omap/include/mach/dmtimer.h
+++ b/arch/arm/plat-omap/include/plat/dmtimer.h
diff --git a/arch/arm/plat-omap/include/mach/dsp_common.h b/arch/arm/plat-omap/include/plat/dsp_common.h
index da97736f3efa..da97736f3efa 100644
--- a/arch/arm/plat-omap/include/mach/dsp_common.h
+++ b/arch/arm/plat-omap/include/plat/dsp_common.h
diff --git a/arch/arm/plat-omap/include/plat/flash.h b/arch/arm/plat-omap/include/plat/flash.h
new file mode 100644
index 000000000000..3e6327016b40
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/flash.h
@@ -0,0 +1,16 @@
1/*
2 * Flash support for OMAP1
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#ifndef __OMAP_FLASH_H
10#define __OMAP_FLASH_H
11
12#include <linux/mtd/map.h>
13
14extern void omap1_set_vpp(struct map_info *map, int enable);
15
16#endif
diff --git a/arch/arm/plat-omap/include/mach/fpga.h b/arch/arm/plat-omap/include/plat/fpga.h
index f1864a652f7a..f1864a652f7a 100644
--- a/arch/arm/plat-omap/include/mach/fpga.h
+++ b/arch/arm/plat-omap/include/plat/fpga.h
diff --git a/arch/arm/plat-omap/include/mach/gpio-switch.h b/arch/arm/plat-omap/include/plat/gpio-switch.h
index 10da0e07c0cf..10da0e07c0cf 100644
--- a/arch/arm/plat-omap/include/mach/gpio-switch.h
+++ b/arch/arm/plat-omap/include/plat/gpio-switch.h
diff --git a/arch/arm/plat-omap/include/mach/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h
index 633ff688b928..de7c54731cbe 100644
--- a/arch/arm/plat-omap/include/mach/gpio.h
+++ b/arch/arm/plat-omap/include/plat/gpio.h
@@ -76,7 +76,8 @@ extern void omap2_gpio_prepare_for_retention(void);
76extern void omap2_gpio_resume_after_retention(void); 76extern void omap2_gpio_resume_after_retention(void);
77extern void omap_set_gpio_debounce(int gpio, int enable); 77extern void omap_set_gpio_debounce(int gpio, int enable);
78extern void omap_set_gpio_debounce_time(int gpio, int enable); 78extern void omap_set_gpio_debounce_time(int gpio, int enable);
79 79extern void omap_gpio_save_context(void);
80extern void omap_gpio_restore_context(void);
80/*-------------------------------------------------------------------------*/ 81/*-------------------------------------------------------------------------*/
81 82
82/* Wrappers for "new style" GPIO calls, using the new infrastructure 83/* Wrappers for "new style" GPIO calls, using the new infrastructure
diff --git a/arch/arm/plat-omap/include/mach/gpmc-smc91x.h b/arch/arm/plat-omap/include/plat/gpmc-smc91x.h
index b64fbee4d567..b64fbee4d567 100644
--- a/arch/arm/plat-omap/include/mach/gpmc-smc91x.h
+++ b/arch/arm/plat-omap/include/plat/gpmc-smc91x.h
diff --git a/arch/arm/plat-omap/include/mach/gpmc.h b/arch/arm/plat-omap/include/plat/gpmc.h
index 9c99cda77ba6..145838a81ef6 100644
--- a/arch/arm/plat-omap/include/mach/gpmc.h
+++ b/arch/arm/plat-omap/include/plat/gpmc.h
@@ -27,6 +27,8 @@
27 27
28#define GPMC_CONFIG 0x50 28#define GPMC_CONFIG 0x50
29#define GPMC_STATUS 0x54 29#define GPMC_STATUS 0x54
30#define GPMC_CS0_BASE 0x60
31#define GPMC_CS_SIZE 0x30
30 32
31#define GPMC_CONFIG1_WRAPBURST_SUPP (1 << 31) 33#define GPMC_CONFIG1_WRAPBURST_SUPP (1 << 31)
32#define GPMC_CONFIG1_READMULTIPLE_SUPP (1 << 30) 34#define GPMC_CONFIG1_READMULTIPLE_SUPP (1 << 30)
@@ -45,13 +47,14 @@
45#define GPMC_CONFIG1_DEVICESIZE_16 GPMC_CONFIG1_DEVICESIZE(1) 47#define GPMC_CONFIG1_DEVICESIZE_16 GPMC_CONFIG1_DEVICESIZE(1)
46#define GPMC_CONFIG1_DEVICETYPE(val) ((val & 3) << 10) 48#define GPMC_CONFIG1_DEVICETYPE(val) ((val & 3) << 10)
47#define GPMC_CONFIG1_DEVICETYPE_NOR GPMC_CONFIG1_DEVICETYPE(0) 49#define GPMC_CONFIG1_DEVICETYPE_NOR GPMC_CONFIG1_DEVICETYPE(0)
48#define GPMC_CONFIG1_DEVICETYPE_NAND GPMC_CONFIG1_DEVICETYPE(1) 50#define GPMC_CONFIG1_DEVICETYPE_NAND GPMC_CONFIG1_DEVICETYPE(2)
49#define GPMC_CONFIG1_MUXADDDATA (1 << 9) 51#define GPMC_CONFIG1_MUXADDDATA (1 << 9)
50#define GPMC_CONFIG1_TIME_PARA_GRAN (1 << 4) 52#define GPMC_CONFIG1_TIME_PARA_GRAN (1 << 4)
51#define GPMC_CONFIG1_FCLK_DIV(val) (val & 3) 53#define GPMC_CONFIG1_FCLK_DIV(val) (val & 3)
52#define GPMC_CONFIG1_FCLK_DIV2 (GPMC_CONFIG1_FCLK_DIV(1)) 54#define GPMC_CONFIG1_FCLK_DIV2 (GPMC_CONFIG1_FCLK_DIV(1))
53#define GPMC_CONFIG1_FCLK_DIV3 (GPMC_CONFIG1_FCLK_DIV(2)) 55#define GPMC_CONFIG1_FCLK_DIV3 (GPMC_CONFIG1_FCLK_DIV(2))
54#define GPMC_CONFIG1_FCLK_DIV4 (GPMC_CONFIG1_FCLK_DIV(3)) 56#define GPMC_CONFIG1_FCLK_DIV4 (GPMC_CONFIG1_FCLK_DIV(3))
57#define GPMC_CONFIG7_CSVALID (1 << 6)
55 58
56/* 59/*
57 * Note that all values in this struct are in nanoseconds, while 60 * Note that all values in this struct are in nanoseconds, while
@@ -107,6 +110,8 @@ extern int gpmc_prefetch_enable(int cs, int dma_mode,
107 unsigned int u32_count, int is_write); 110 unsigned int u32_count, int is_write);
108extern void gpmc_prefetch_reset(void); 111extern void gpmc_prefetch_reset(void);
109extern int gpmc_prefetch_status(void); 112extern int gpmc_prefetch_status(void);
110extern void __init gpmc_init(void); 113extern void omap3_gpmc_save_context(void);
114extern void omap3_gpmc_restore_context(void);
115extern void gpmc_init(void);
111 116
112#endif 117#endif
diff --git a/arch/arm/plat-omap/include/mach/hardware.h b/arch/arm/plat-omap/include/plat/hardware.h
index 26c1fbff08aa..d5b26adfb890 100644
--- a/arch/arm/plat-omap/include/mach/hardware.h
+++ b/arch/arm/plat-omap/include/plat/hardware.h
@@ -39,9 +39,9 @@
39#include <asm/sizes.h> 39#include <asm/sizes.h>
40#ifndef __ASSEMBLER__ 40#ifndef __ASSEMBLER__
41#include <asm/types.h> 41#include <asm/types.h>
42#include <mach/cpu.h> 42#include <plat/cpu.h>
43#endif 43#endif
44#include <mach/serial.h> 44#include <plat/serial.h>
45 45
46/* 46/*
47 * --------------------------------------------------------------------------- 47 * ---------------------------------------------------------------------------
@@ -280,11 +280,11 @@
280 * --------------------------------------------------------------------------- 280 * ---------------------------------------------------------------------------
281 */ 281 */
282 282
283#include "omap730.h" 283#include <plat/omap7xx.h>
284#include "omap1510.h" 284#include <plat/omap1510.h>
285#include "omap16xx.h" 285#include <plat/omap16xx.h>
286#include "omap24xx.h" 286#include <plat/omap24xx.h>
287#include "omap34xx.h" 287#include <plat/omap34xx.h>
288#include "omap44xx.h" 288#include <plat/omap44xx.h>
289 289
290#endif /* __ASM_ARCH_OMAP_HARDWARE_H */ 290#endif /* __ASM_ARCH_OMAP_HARDWARE_H */
diff --git a/arch/arm/plat-omap/include/mach/hwa742.h b/arch/arm/plat-omap/include/plat/hwa742.h
index 886248d32b49..886248d32b49 100644
--- a/arch/arm/plat-omap/include/mach/hwa742.h
+++ b/arch/arm/plat-omap/include/plat/hwa742.h
diff --git a/arch/arm/plat-omap/include/plat/i2c.h b/arch/arm/plat-omap/include/plat/i2c.h
new file mode 100644
index 000000000000..87f6bf2ea4fa
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/i2c.h
@@ -0,0 +1,38 @@
1/*
2 * Helper module for board specific I2C bus registration
3 *
4 * Copyright (C) 2009 Nokia Corporation.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18 * 02110-1301 USA
19 *
20 */
21
22#include <linux/i2c.h>
23
24#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
25extern int omap_register_i2c_bus(int bus_id, u32 clkrate,
26 struct i2c_board_info const *info,
27 unsigned len);
28#else
29static inline int omap_register_i2c_bus(int bus_id, u32 clkrate,
30 struct i2c_board_info const *info,
31 unsigned len)
32{
33 return 0;
34}
35#endif
36
37void __init omap1_i2c_mux_pins(int bus_id);
38void __init omap2_i2c_mux_pins(int bus_id);
diff --git a/arch/arm/plat-omap/include/mach/io.h b/arch/arm/plat-omap/include/plat/io.h
index 8d32df32b0b1..128b549c2796 100644
--- a/arch/arm/plat-omap/include/mach/io.h
+++ b/arch/arm/plat-omap/include/plat/io.h
@@ -63,8 +63,24 @@
63#define OMAP1_IO_OFFSET 0x01000000 /* Virtual IO = 0xfefb0000 */ 63#define OMAP1_IO_OFFSET 0x01000000 /* Virtual IO = 0xfefb0000 */
64#define OMAP1_IO_ADDRESS(pa) IOMEM((pa) - OMAP1_IO_OFFSET) 64#define OMAP1_IO_ADDRESS(pa) IOMEM((pa) - OMAP1_IO_OFFSET)
65 65
66#define OMAP2_IO_OFFSET 0x90000000 66#define OMAP2_L3_IO_OFFSET 0x90000000
67#define OMAP2_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_IO_OFFSET) /* L3 and L4 */ 67#define OMAP2_L3_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_L3_IO_OFFSET) /* L3 */
68
69
70#define OMAP2_L4_IO_OFFSET 0xb2000000
71#define OMAP2_L4_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_L4_IO_OFFSET) /* L4 */
72
73#define OMAP4_L3_IO_OFFSET 0xb4000000
74#define OMAP4_L3_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_L3_IO_OFFSET) /* L3 */
75
76#define OMAP4_L3_PER_IO_OFFSET 0xb1100000
77#define OMAP4_L3_PER_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_L3_PER_IO_OFFSET)
78
79#define OMAP4_GPMC_IO_OFFSET 0xa9000000
80#define OMAP4_GPMC_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_GPMC_IO_OFFSET)
81
82#define OMAP2_EMU_IO_OFFSET 0xaa800000 /* Emulation */
83#define OMAP2_EMU_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_EMU_IO_OFFSET)
68 84
69/* 85/*
70 * ---------------------------------------------------------------------------- 86 * ----------------------------------------------------------------------------
@@ -83,36 +99,44 @@
83 */ 99 */
84 100
85/* We map both L3 and L4 on OMAP2 */ 101/* We map both L3 and L4 on OMAP2 */
86#define L3_24XX_PHYS L3_24XX_BASE /* 0x68000000 */ 102#define L3_24XX_PHYS L3_24XX_BASE /* 0x68000000 --> 0xf8000000*/
87#define L3_24XX_VIRT 0xf8000000 103#define L3_24XX_VIRT (L3_24XX_PHYS + OMAP2_L3_IO_OFFSET)
88#define L3_24XX_SIZE SZ_1M /* 44kB of 128MB used, want 1MB sect */ 104#define L3_24XX_SIZE SZ_1M /* 44kB of 128MB used, want 1MB sect */
89#define L4_24XX_PHYS L4_24XX_BASE /* 0x48000000 */ 105#define L4_24XX_PHYS L4_24XX_BASE /* 0x48000000 --> 0xfa000000 */
90#define L4_24XX_VIRT 0xd8000000 106#define L4_24XX_VIRT (L4_24XX_PHYS + OMAP2_L4_IO_OFFSET)
91#define L4_24XX_SIZE SZ_1M /* 1MB of 128MB used, want 1MB sect */ 107#define L4_24XX_SIZE SZ_1M /* 1MB of 128MB used, want 1MB sect */
92 108
93#define L4_WK_243X_PHYS L4_WK_243X_BASE /* 0x49000000 */ 109#define L4_WK_243X_PHYS L4_WK_243X_BASE /* 0x49000000 --> 0xfb000000 */
94#define L4_WK_243X_VIRT 0xd9000000 110#define L4_WK_243X_VIRT (L4_WK_243X_PHYS + OMAP2_L4_IO_OFFSET)
95#define L4_WK_243X_SIZE SZ_1M 111#define L4_WK_243X_SIZE SZ_1M
96#define OMAP243X_GPMC_PHYS OMAP243X_GPMC_BASE /* 0x49000000 */ 112#define OMAP243X_GPMC_PHYS OMAP243X_GPMC_BASE
97#define OMAP243X_GPMC_VIRT 0xFE000000 113#define OMAP243X_GPMC_VIRT (OMAP243X_GPMC_PHYS + OMAP2_L3_IO_OFFSET)
114 /* 0x6e000000 --> 0xfe000000 */
98#define OMAP243X_GPMC_SIZE SZ_1M 115#define OMAP243X_GPMC_SIZE SZ_1M
99#define OMAP243X_SDRC_PHYS OMAP243X_SDRC_BASE 116#define OMAP243X_SDRC_PHYS OMAP243X_SDRC_BASE
100#define OMAP243X_SDRC_VIRT 0xFD000000 117 /* 0x6D000000 --> 0xfd000000 */
118#define OMAP243X_SDRC_VIRT (OMAP243X_SDRC_PHYS + OMAP2_L3_IO_OFFSET)
101#define OMAP243X_SDRC_SIZE SZ_1M 119#define OMAP243X_SDRC_SIZE SZ_1M
102#define OMAP243X_SMS_PHYS OMAP243X_SMS_BASE 120#define OMAP243X_SMS_PHYS OMAP243X_SMS_BASE
103#define OMAP243X_SMS_VIRT 0xFC000000 121 /* 0x6c000000 --> 0xfc000000 */
122#define OMAP243X_SMS_VIRT (OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET)
104#define OMAP243X_SMS_SIZE SZ_1M 123#define OMAP243X_SMS_SIZE SZ_1M
105 124
106/* DSP */ 125/* 2420 IVA */
107#define DSP_MEM_24XX_PHYS OMAP2420_DSP_MEM_BASE /* 0x58000000 */ 126#define DSP_MEM_2420_PHYS OMAP2420_DSP_MEM_BASE
108#define DSP_MEM_24XX_VIRT 0xe0000000 127 /* 0x58000000 --> 0xfc100000 */
109#define DSP_MEM_24XX_SIZE 0x28000 128#define DSP_MEM_2420_VIRT 0xfc100000
110#define DSP_IPI_24XX_PHYS OMAP2420_DSP_IPI_BASE /* 0x59000000 */ 129#define DSP_MEM_2420_SIZE 0x28000
111#define DSP_IPI_24XX_VIRT 0xe1000000 130#define DSP_IPI_2420_PHYS OMAP2420_DSP_IPI_BASE
112#define DSP_IPI_24XX_SIZE SZ_4K 131 /* 0x59000000 --> 0xfc128000 */
113#define DSP_MMU_24XX_PHYS OMAP2420_DSP_MMU_BASE /* 0x5a000000 */ 132#define DSP_IPI_2420_VIRT 0xfc128000
114#define DSP_MMU_24XX_VIRT 0xe2000000 133#define DSP_IPI_2420_SIZE SZ_4K
115#define DSP_MMU_24XX_SIZE SZ_4K 134#define DSP_MMU_2420_PHYS OMAP2420_DSP_MMU_BASE
135 /* 0x5a000000 --> 0xfc129000 */
136#define DSP_MMU_2420_VIRT 0xfc129000
137#define DSP_MMU_2420_SIZE SZ_4K
138
139/* 2430 IVA2.1 - currently unmapped */
116 140
117/* 141/*
118 * ---------------------------------------------------------------------------- 142 * ----------------------------------------------------------------------------
@@ -121,12 +145,12 @@
121 */ 145 */
122 146
123/* We map both L3 and L4 on OMAP3 */ 147/* We map both L3 and L4 on OMAP3 */
124#define L3_34XX_PHYS L3_34XX_BASE /* 0x68000000 */ 148#define L3_34XX_PHYS L3_34XX_BASE /* 0x68000000 --> 0xf8000000 */
125#define L3_34XX_VIRT 0xf8000000 149#define L3_34XX_VIRT (L3_34XX_PHYS + OMAP2_L3_IO_OFFSET)
126#define L3_34XX_SIZE SZ_1M /* 44kB of 128MB used, want 1MB sect */ 150#define L3_34XX_SIZE SZ_1M /* 44kB of 128MB used, want 1MB sect */
127 151
128#define L4_34XX_PHYS L4_34XX_BASE /* 0x48000000 */ 152#define L4_34XX_PHYS L4_34XX_BASE /* 0x48000000 --> 0xfa000000 */
129#define L4_34XX_VIRT 0xd8000000 153#define L4_34XX_VIRT (L4_34XX_PHYS + OMAP2_L4_IO_OFFSET)
130#define L4_34XX_SIZE SZ_4M /* 1MB of 128MB used, want 1MB sect */ 154#define L4_34XX_SIZE SZ_4M /* 1MB of 128MB used, want 1MB sect */
131 155
132/* 156/*
@@ -134,40 +158,32 @@
134 * VPOM3430 was not working for Int controller 158 * VPOM3430 was not working for Int controller
135 */ 159 */
136 160
137#define L4_WK_34XX_PHYS L4_WK_34XX_BASE /* 0x48300000 */ 161#define L4_PER_34XX_PHYS L4_PER_34XX_BASE
138#define L4_WK_34XX_VIRT 0xd8300000 162 /* 0x49000000 --> 0xfb000000 */
139#define L4_WK_34XX_SIZE SZ_1M 163#define L4_PER_34XX_VIRT (L4_PER_34XX_PHYS + OMAP2_L4_IO_OFFSET)
140
141#define L4_PER_34XX_PHYS L4_PER_34XX_BASE /* 0x49000000 */
142#define L4_PER_34XX_VIRT 0xd9000000
143#define L4_PER_34XX_SIZE SZ_1M 164#define L4_PER_34XX_SIZE SZ_1M
144 165
145#define L4_EMU_34XX_PHYS L4_EMU_34XX_BASE /* 0x54000000 */ 166#define L4_EMU_34XX_PHYS L4_EMU_34XX_BASE
146#define L4_EMU_34XX_VIRT 0xe4000000 167 /* 0x54000000 --> 0xfe800000 */
147#define L4_EMU_34XX_SIZE SZ_64M 168#define L4_EMU_34XX_VIRT (L4_EMU_34XX_PHYS + OMAP2_EMU_IO_OFFSET)
169#define L4_EMU_34XX_SIZE SZ_8M
148 170
149#define OMAP34XX_GPMC_PHYS OMAP34XX_GPMC_BASE /* 0x6E000000 */ 171#define OMAP34XX_GPMC_PHYS OMAP34XX_GPMC_BASE
150#define OMAP34XX_GPMC_VIRT 0xFE000000 172 /* 0x6e000000 --> 0xfe000000 */
173#define OMAP34XX_GPMC_VIRT (OMAP34XX_GPMC_PHYS + OMAP2_L3_IO_OFFSET)
151#define OMAP34XX_GPMC_SIZE SZ_1M 174#define OMAP34XX_GPMC_SIZE SZ_1M
152 175
153#define OMAP343X_SMS_PHYS OMAP343X_SMS_BASE /* 0x6C000000 */ 176#define OMAP343X_SMS_PHYS OMAP343X_SMS_BASE
154#define OMAP343X_SMS_VIRT 0xFC000000 177 /* 0x6c000000 --> 0xfc000000 */
178#define OMAP343X_SMS_VIRT (OMAP343X_SMS_PHYS + OMAP2_L3_IO_OFFSET)
155#define OMAP343X_SMS_SIZE SZ_1M 179#define OMAP343X_SMS_SIZE SZ_1M
156 180
157#define OMAP343X_SDRC_PHYS OMAP343X_SDRC_BASE /* 0x6D000000 */ 181#define OMAP343X_SDRC_PHYS OMAP343X_SDRC_BASE
158#define OMAP343X_SDRC_VIRT 0xFD000000 182 /* 0x6D000000 --> 0xfd000000 */
183#define OMAP343X_SDRC_VIRT (OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET)
159#define OMAP343X_SDRC_SIZE SZ_1M 184#define OMAP343X_SDRC_SIZE SZ_1M
160 185
161/* DSP */ 186/* 3430 IVA - currently unmapped */
162#define DSP_MEM_34XX_PHYS OMAP34XX_DSP_MEM_BASE /* 0x58000000 */
163#define DSP_MEM_34XX_VIRT 0xe0000000
164#define DSP_MEM_34XX_SIZE 0x28000
165#define DSP_IPI_34XX_PHYS OMAP34XX_DSP_IPI_BASE /* 0x59000000 */
166#define DSP_IPI_34XX_VIRT 0xe1000000
167#define DSP_IPI_34XX_SIZE SZ_4K
168#define DSP_MMU_34XX_PHYS OMAP34XX_DSP_MMU_BASE /* 0x5a000000 */
169#define DSP_MMU_34XX_VIRT 0xe2000000
170#define DSP_MMU_34XX_SIZE SZ_4K
171 187
172/* 188/*
173 * ---------------------------------------------------------------------------- 189 * ----------------------------------------------------------------------------
@@ -176,32 +192,49 @@
176 */ 192 */
177 193
178/* We map both L3 and L4 on OMAP4 */ 194/* We map both L3 and L4 on OMAP4 */
179#define L3_44XX_PHYS L3_44XX_BASE 195#define L3_44XX_PHYS L3_44XX_BASE /* 0x44000000 --> 0xf8000000 */
180#define L3_44XX_VIRT 0xd4000000 196#define L3_44XX_VIRT (L3_44XX_PHYS + OMAP4_L3_IO_OFFSET)
181#define L3_44XX_SIZE SZ_1M 197#define L3_44XX_SIZE SZ_1M
182 198
183#define L4_44XX_PHYS L4_44XX_BASE 199#define L4_44XX_PHYS L4_44XX_BASE /* 0x4a000000 --> 0xfc000000 */
184#define L4_44XX_VIRT 0xda000000 200#define L4_44XX_VIRT (L4_44XX_PHYS + OMAP2_L4_IO_OFFSET)
185#define L4_44XX_SIZE SZ_4M 201#define L4_44XX_SIZE SZ_4M
186 202
187
188#define L4_WK_44XX_PHYS L4_WK_44XX_BASE
189#define L4_WK_44XX_VIRT 0xda300000
190#define L4_WK_44XX_SIZE SZ_1M
191
192#define L4_PER_44XX_PHYS L4_PER_44XX_BASE 203#define L4_PER_44XX_PHYS L4_PER_44XX_BASE
193#define L4_PER_44XX_VIRT 0xd8000000 204 /* 0x48000000 --> 0xfa000000 */
205#define L4_PER_44XX_VIRT (L4_PER_44XX_PHYS + OMAP2_L4_IO_OFFSET)
194#define L4_PER_44XX_SIZE SZ_4M 206#define L4_PER_44XX_SIZE SZ_4M
195 207
208#define L4_ABE_44XX_PHYS L4_ABE_44XX_BASE
209 /* 0x49000000 --> 0xfb000000 */
210#define L4_ABE_44XX_VIRT (L4_ABE_44XX_PHYS + OMAP2_L4_IO_OFFSET)
211#define L4_ABE_44XX_SIZE SZ_1M
212
196#define L4_EMU_44XX_PHYS L4_EMU_44XX_BASE 213#define L4_EMU_44XX_PHYS L4_EMU_44XX_BASE
197#define L4_EMU_44XX_VIRT 0xe4000000 214 /* 0x54000000 --> 0xfe800000 */
198#define L4_EMU_44XX_SIZE SZ_64M 215#define L4_EMU_44XX_VIRT (L4_EMU_44XX_PHYS + OMAP2_EMU_IO_OFFSET)
216#define L4_EMU_44XX_SIZE SZ_8M
199 217
200#define OMAP44XX_GPMC_PHYS OMAP44XX_GPMC_BASE 218#define OMAP44XX_GPMC_PHYS OMAP44XX_GPMC_BASE
201#define OMAP44XX_GPMC_VIRT 0xe0000000 219 /* 0x50000000 --> 0xf9000000 */
220#define OMAP44XX_GPMC_VIRT (OMAP44XX_GPMC_PHYS + OMAP4_GPMC_IO_OFFSET)
202#define OMAP44XX_GPMC_SIZE SZ_1M 221#define OMAP44XX_GPMC_SIZE SZ_1M
203 222
204 223
224#define OMAP44XX_EMIF1_PHYS OMAP44XX_EMIF1_BASE
225 /* 0x4c000000 --> 0xfd100000 */
226#define OMAP44XX_EMIF1_VIRT (OMAP44XX_EMIF1_PHYS + OMAP4_L3_PER_IO_OFFSET)
227#define OMAP44XX_EMIF1_SIZE SZ_1M
228
229#define OMAP44XX_EMIF2_PHYS OMAP44XX_EMIF2_BASE
230 /* 0x4d000000 --> 0xfd200000 */
231#define OMAP44XX_EMIF2_VIRT (OMAP44XX_EMIF2_PHYS + OMAP4_L3_PER_IO_OFFSET)
232#define OMAP44XX_EMIF2_SIZE SZ_1M
233
234#define OMAP44XX_DMM_PHYS OMAP44XX_DMM_BASE
235 /* 0x4e000000 --> 0xfd300000 */
236#define OMAP44XX_DMM_VIRT (OMAP44XX_DMM_PHYS + OMAP4_L3_PER_IO_OFFSET)
237#define OMAP44XX_DMM_SIZE SZ_1M
205/* 238/*
206 * ---------------------------------------------------------------------------- 239 * ----------------------------------------------------------------------------
207 * Omap specific register access 240 * Omap specific register access
@@ -226,7 +259,38 @@ struct omap_sdrc_params;
226extern void omap1_map_common_io(void); 259extern void omap1_map_common_io(void);
227extern void omap1_init_common_hw(void); 260extern void omap1_init_common_hw(void);
228 261
229extern void omap2_map_common_io(void); 262#ifdef CONFIG_ARCH_OMAP2420
263extern void omap242x_map_common_io(void);
264#else
265static inline void omap242x_map_common_io(void)
266{
267}
268#endif
269
270#ifdef CONFIG_ARCH_OMAP2430
271extern void omap243x_map_common_io(void);
272#else
273static inline void omap243x_map_common_io(void)
274{
275}
276#endif
277
278#ifdef CONFIG_ARCH_OMAP3
279extern void omap34xx_map_common_io(void);
280#else
281static inline void omap34xx_map_common_io(void)
282{
283}
284#endif
285
286#ifdef CONFIG_ARCH_OMAP4
287extern void omap44xx_map_common_io(void);
288#else
289static inline void omap44xx_map_common_io(void)
290{
291}
292#endif
293
230extern void omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, 294extern void omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
231 struct omap_sdrc_params *sdrc_cs1); 295 struct omap_sdrc_params *sdrc_cs1);
232 296
diff --git a/arch/arm/plat-omap/include/mach/iommu.h b/arch/arm/plat-omap/include/plat/iommu.h
index 46d41ac83dbf..0752af9d099e 100644
--- a/arch/arm/plat-omap/include/mach/iommu.h
+++ b/arch/arm/plat-omap/include/plat/iommu.h
@@ -107,7 +107,7 @@ struct iommu_platform_data {
107#if defined(CONFIG_ARCH_OMAP1) 107#if defined(CONFIG_ARCH_OMAP1)
108#error "iommu for this processor not implemented yet" 108#error "iommu for this processor not implemented yet"
109#else 109#else
110#include <mach/iommu2.h> 110#include <plat/iommu2.h>
111#endif 111#endif
112 112
113/* 113/*
diff --git a/arch/arm/plat-omap/include/mach/iommu2.h b/arch/arm/plat-omap/include/plat/iommu2.h
index 10ad05f410e9..10ad05f410e9 100644
--- a/arch/arm/plat-omap/include/mach/iommu2.h
+++ b/arch/arm/plat-omap/include/plat/iommu2.h
diff --git a/arch/arm/plat-omap/include/mach/iovmm.h b/arch/arm/plat-omap/include/plat/iovmm.h
index bdc7ce5d7a4a..bdc7ce5d7a4a 100644
--- a/arch/arm/plat-omap/include/mach/iovmm.h
+++ b/arch/arm/plat-omap/include/plat/iovmm.h
diff --git a/arch/arm/plat-omap/include/mach/irda.h b/arch/arm/plat-omap/include/plat/irda.h
index 40f60339d1c6..40f60339d1c6 100644
--- a/arch/arm/plat-omap/include/mach/irda.h
+++ b/arch/arm/plat-omap/include/plat/irda.h
diff --git a/arch/arm/plat-omap/include/plat/irqs-44xx.h b/arch/arm/plat-omap/include/plat/irqs-44xx.h
new file mode 100644
index 000000000000..518322c80116
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/irqs-44xx.h
@@ -0,0 +1,144 @@
1/*
2 * OMAP4 Interrupt lines definitions
3 *
4 * Copyright (C) 2009-2010 Texas Instruments, Inc.
5 *
6 * Santosh Shilimkar (santosh.shilimkar@ti.com)
7 * Benoit Cousson (b-cousson@ti.com)
8 *
9 * This file is automatically generated from the OMAP hardware databases.
10 * We respectfully ask that any modifications to this file be coordinated
11 * with the public linux-omap@vger.kernel.org mailing list and the
12 * authors above to ensure that the autogeneration scripts are kept
13 * up-to-date with the file contents.
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License version 2 as
17 * published by the Free Software Foundation.
18 */
19
20#ifndef __ARCH_ARM_MACH_OMAP2_OMAP44XX_IRQS_H
21#define __ARCH_ARM_MACH_OMAP2_OMAP44XX_IRQS_H
22
23/* OMAP44XX IRQs numbers definitions */
24#define OMAP44XX_IRQ_LOCALTIMER 29
25#define OMAP44XX_IRQ_LOCALWDT 30
26
27#define OMAP44XX_IRQ_GIC_START 32
28
29#define OMAP44XX_IRQ_PL310 (0 + OMAP44XX_IRQ_GIC_START)
30#define OMAP44XX_IRQ_CTI0 (1 + OMAP44XX_IRQ_GIC_START)
31#define OMAP44XX_IRQ_CTI1 (2 + OMAP44XX_IRQ_GIC_START)
32#define OMAP44XX_IRQ_ELM (4 + OMAP44XX_IRQ_GIC_START)
33#define OMAP44XX_IRQ_SYS_1N (7 + OMAP44XX_IRQ_GIC_START)
34#define OMAP44XX_IRQ_SECURITY_EVENTS (8 + OMAP44XX_IRQ_GIC_START)
35#define OMAP44XX_IRQ_L3_DBG (9 + OMAP44XX_IRQ_GIC_START)
36#define OMAP44XX_IRQ_L3_APP (10 + OMAP44XX_IRQ_GIC_START)
37#define OMAP44XX_IRQ_PRCM (11 + OMAP44XX_IRQ_GIC_START)
38#define OMAP44XX_IRQ_SDMA_0 (12 + OMAP44XX_IRQ_GIC_START)
39#define OMAP44XX_IRQ_SDMA_1 (13 + OMAP44XX_IRQ_GIC_START)
40#define OMAP44XX_IRQ_SDMA_2 (14 + OMAP44XX_IRQ_GIC_START)
41#define OMAP44XX_IRQ_SDMA_3 (15 + OMAP44XX_IRQ_GIC_START)
42#define OMAP44XX_IRQ_MCBSP4 (16 + OMAP44XX_IRQ_GIC_START)
43#define OMAP44XX_IRQ_MCBSP1 (17 + OMAP44XX_IRQ_GIC_START)
44#define OMAP44XX_IRQ_SR_MCU (18 + OMAP44XX_IRQ_GIC_START)
45#define OMAP44XX_IRQ_SR_CORE (19 + OMAP44XX_IRQ_GIC_START)
46#define OMAP44XX_IRQ_GPMC (20 + OMAP44XX_IRQ_GIC_START)
47#define OMAP44XX_IRQ_GFX (21 + OMAP44XX_IRQ_GIC_START)
48#define OMAP44XX_IRQ_MCBSP2 (22 + OMAP44XX_IRQ_GIC_START)
49#define OMAP44XX_IRQ_MCBSP3 (23 + OMAP44XX_IRQ_GIC_START)
50#define OMAP44XX_IRQ_ISS_5 (24 + OMAP44XX_IRQ_GIC_START)
51#define OMAP44XX_IRQ_DSS_DISPC (25 + OMAP44XX_IRQ_GIC_START)
52#define OMAP44XX_IRQ_MAIL_U0 (26 + OMAP44XX_IRQ_GIC_START)
53#define OMAP44XX_IRQ_C2C_SSCM_0 (27 + OMAP44XX_IRQ_GIC_START)
54#define OMAP44XX_IRQ_TESLA_MMU (28 + OMAP44XX_IRQ_GIC_START)
55#define OMAP44XX_IRQ_GPIO1 (29 + OMAP44XX_IRQ_GIC_START)
56#define OMAP44XX_IRQ_GPIO2 (30 + OMAP44XX_IRQ_GIC_START)
57#define OMAP44XX_IRQ_GPIO3 (31 + OMAP44XX_IRQ_GIC_START)
58#define OMAP44XX_IRQ_GPIO4 (32 + OMAP44XX_IRQ_GIC_START)
59#define OMAP44XX_IRQ_GPIO5 (33 + OMAP44XX_IRQ_GIC_START)
60#define OMAP44XX_IRQ_GPIO6 (34 + OMAP44XX_IRQ_GIC_START)
61#define OMAP44XX_IRQ_USIM (35 + OMAP44XX_IRQ_GIC_START)
62#define OMAP44XX_IRQ_WDT3 (36 + OMAP44XX_IRQ_GIC_START)
63#define OMAP44XX_IRQ_GPT1 (37 + OMAP44XX_IRQ_GIC_START)
64#define OMAP44XX_IRQ_GPT2 (38 + OMAP44XX_IRQ_GIC_START)
65#define OMAP44XX_IRQ_GPT3 (39 + OMAP44XX_IRQ_GIC_START)
66#define OMAP44XX_IRQ_GPT4 (40 + OMAP44XX_IRQ_GIC_START)
67#define OMAP44XX_IRQ_GPT5 (41 + OMAP44XX_IRQ_GIC_START)
68#define OMAP44XX_IRQ_GPT6 (42 + OMAP44XX_IRQ_GIC_START)
69#define OMAP44XX_IRQ_GPT7 (43 + OMAP44XX_IRQ_GIC_START)
70#define OMAP44XX_IRQ_GPT8 (44 + OMAP44XX_IRQ_GIC_START)
71#define OMAP44XX_IRQ_GPT9 (45 + OMAP44XX_IRQ_GIC_START)
72#define OMAP44XX_IRQ_GPT10 (46 + OMAP44XX_IRQ_GIC_START)
73#define OMAP44XX_IRQ_GPT11 (47 + OMAP44XX_IRQ_GIC_START)
74#define OMAP44XX_IRQ_SPI4 (48 + OMAP44XX_IRQ_GIC_START)
75#define OMAP44XX_IRQ_SHA1_S (49 + OMAP44XX_IRQ_GIC_START)
76#define OMAP44XX_IRQ_FPKA_SINTREQUEST_S (50 + OMAP44XX_IRQ_GIC_START)
77#define OMAP44XX_IRQ_SHA1_P (51 + OMAP44XX_IRQ_GIC_START)
78#define OMAP44XX_IRQ_RNG (52 + OMAP44XX_IRQ_GIC_START)
79#define OMAP44XX_IRQ_DSS_DSI1 (53 + OMAP44XX_IRQ_GIC_START)
80#define OMAP44XX_IRQ_I2C1 (56 + OMAP44XX_IRQ_GIC_START)
81#define OMAP44XX_IRQ_I2C2 (57 + OMAP44XX_IRQ_GIC_START)
82#define OMAP44XX_IRQ_HDQ (58 + OMAP44XX_IRQ_GIC_START)
83#define OMAP44XX_IRQ_MMC5 (59 + OMAP44XX_IRQ_GIC_START)
84#define OMAP44XX_IRQ_I2C3 (61 + OMAP44XX_IRQ_GIC_START)
85#define OMAP44XX_IRQ_I2C4 (62 + OMAP44XX_IRQ_GIC_START)
86#define OMAP44XX_IRQ_AES2_S (63 + OMAP44XX_IRQ_GIC_START)
87#define OMAP44XX_IRQ_AES2_P (64 + OMAP44XX_IRQ_GIC_START)
88#define OMAP44XX_IRQ_SPI1 (65 + OMAP44XX_IRQ_GIC_START)
89#define OMAP44XX_IRQ_SPI2 (66 + OMAP44XX_IRQ_GIC_START)
90#define OMAP44XX_IRQ_HSI_P1 (67 + OMAP44XX_IRQ_GIC_START)
91#define OMAP44XX_IRQ_HSI_P2 (68 + OMAP44XX_IRQ_GIC_START)
92#define OMAP44XX_IRQ_FDIF_3 (69 + OMAP44XX_IRQ_GIC_START)
93#define OMAP44XX_IRQ_UART4 (70 + OMAP44XX_IRQ_GIC_START)
94#define OMAP44XX_IRQ_HSI_DMA (71 + OMAP44XX_IRQ_GIC_START)
95#define OMAP44XX_IRQ_UART1 (72 + OMAP44XX_IRQ_GIC_START)
96#define OMAP44XX_IRQ_UART2 (73 + OMAP44XX_IRQ_GIC_START)
97#define OMAP44XX_IRQ_UART3 (74 + OMAP44XX_IRQ_GIC_START)
98#define OMAP44XX_IRQ_PBIAS (75 + OMAP44XX_IRQ_GIC_START)
99#define OMAP44XX_IRQ_OHCI (76 + OMAP44XX_IRQ_GIC_START)
100#define OMAP44XX_IRQ_EHCI (77 + OMAP44XX_IRQ_GIC_START)
101#define OMAP44XX_IRQ_TLL (78 + OMAP44XX_IRQ_GIC_START)
102#define OMAP44XX_IRQ_AES1_S (79 + OMAP44XX_IRQ_GIC_START)
103#define OMAP44XX_IRQ_WDT2 (80 + OMAP44XX_IRQ_GIC_START)
104#define OMAP44XX_IRQ_DES_S (81 + OMAP44XX_IRQ_GIC_START)
105#define OMAP44XX_IRQ_DES_P (82 + OMAP44XX_IRQ_GIC_START)
106#define OMAP44XX_IRQ_MMC1 (83 + OMAP44XX_IRQ_GIC_START)
107#define OMAP44XX_IRQ_DSS_DSI2 (84 + OMAP44XX_IRQ_GIC_START)
108#define OMAP44XX_IRQ_AES1_P (85 + OMAP44XX_IRQ_GIC_START)
109#define OMAP44XX_IRQ_MMC2 (86 + OMAP44XX_IRQ_GIC_START)
110#define OMAP44XX_IRQ_MPU_ICR (87 + OMAP44XX_IRQ_GIC_START)
111#define OMAP44XX_IRQ_C2C_SSCM_1 (88 + OMAP44XX_IRQ_GIC_START)
112#define OMAP44XX_IRQ_FSUSB (89 + OMAP44XX_IRQ_GIC_START)
113#define OMAP44XX_IRQ_FSUSB_SMI (90 + OMAP44XX_IRQ_GIC_START)
114#define OMAP44XX_IRQ_SPI3 (91 + OMAP44XX_IRQ_GIC_START)
115#define OMAP44XX_IRQ_HS_USB_MC_N (92 + OMAP44XX_IRQ_GIC_START)
116#define OMAP44XX_IRQ_HS_USB_DMA_N (93 + OMAP44XX_IRQ_GIC_START)
117#define OMAP44XX_IRQ_MMC3 (94 + OMAP44XX_IRQ_GIC_START)
118#define OMAP44XX_IRQ_GPT12 (95 + OMAP44XX_IRQ_GIC_START)
119#define OMAP44XX_IRQ_MMC4 (96 + OMAP44XX_IRQ_GIC_START)
120#define OMAP44XX_IRQ_SLIMBUS1 (97 + OMAP44XX_IRQ_GIC_START)
121#define OMAP44XX_IRQ_SLIMBUS2 (98 + OMAP44XX_IRQ_GIC_START)
122#define OMAP44XX_IRQ_ABE (99 + OMAP44XX_IRQ_GIC_START)
123#define OMAP44XX_IRQ_DUCATI_MMU (100 + OMAP44XX_IRQ_GIC_START)
124#define OMAP44XX_IRQ_DSS_HDMI (101 + OMAP44XX_IRQ_GIC_START)
125#define OMAP44XX_IRQ_SR_IVA (102 + OMAP44XX_IRQ_GIC_START)
126#define OMAP44XX_IRQ_IVA_HD_POSYNCITRPEND_1 (103 + OMAP44XX_IRQ_GIC_START)
127#define OMAP44XX_IRQ_IVA_HD_POSYNCITRPEND_0 (104 + OMAP44XX_IRQ_GIC_START)
128#define OMAP44XX_IRQ_IVA_HD_POMBINTRPEND_0 (107 + OMAP44XX_IRQ_GIC_START)
129#define OMAP44XX_IRQ_MCASP1_AR (108 + OMAP44XX_IRQ_GIC_START)
130#define OMAP44XX_IRQ_MCASP1_AX (109 + OMAP44XX_IRQ_GIC_START)
131#define OMAP44XX_IRQ_EMIF4_1 (110 + OMAP44XX_IRQ_GIC_START)
132#define OMAP44XX_IRQ_EMIF4_2 (111 + OMAP44XX_IRQ_GIC_START)
133#define OMAP44XX_IRQ_MCPDM (112 + OMAP44XX_IRQ_GIC_START)
134#define OMAP44XX_IRQ_DMM (113 + OMAP44XX_IRQ_GIC_START)
135#define OMAP44XX_IRQ_DMIC (114 + OMAP44XX_IRQ_GIC_START)
136#define OMAP44XX_IRQ_CDMA_0 (115 + OMAP44XX_IRQ_GIC_START)
137#define OMAP44XX_IRQ_CDMA_1 (116 + OMAP44XX_IRQ_GIC_START)
138#define OMAP44XX_IRQ_CDMA_2 (117 + OMAP44XX_IRQ_GIC_START)
139#define OMAP44XX_IRQ_CDMA_3 (118 + OMAP44XX_IRQ_GIC_START)
140#define OMAP44XX_IRQ_SYS_2N (119 + OMAP44XX_IRQ_GIC_START)
141#define OMAP44XX_IRQ_KBD_CTL (120 + OMAP44XX_IRQ_GIC_START)
142#define OMAP44XX_IRQ_UNIPRO1 (124 + OMAP44XX_IRQ_GIC_START)
143
144#endif
diff --git a/arch/arm/plat-omap/include/plat/irqs.h b/arch/arm/plat-omap/include/plat/irqs.h
new file mode 100644
index 000000000000..401701977dbb
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/irqs.h
@@ -0,0 +1,431 @@
1/*
2 * arch/arm/plat-omap/include/mach/irqs.h
3 *
4 * Copyright (C) Greg Lonnon 2001
5 * Updated for OMAP-1610 by Tony Lindgren <tony@atomide.com>
6 *
7 * Copyright (C) 2009 Texas Instruments
8 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 *
24 * NOTE: The interrupt vectors for the OMAP-1509, OMAP-1510, and OMAP-1610
25 * are different.
26 */
27
28#ifndef __ASM_ARCH_OMAP15XX_IRQS_H
29#define __ASM_ARCH_OMAP15XX_IRQS_H
30
31/* All OMAP4 specific defines are moved to irqs-44xx.h */
32#include "irqs-44xx.h"
33
34/*
35 * IRQ numbers for interrupt handler 1
36 *
37 * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
38 *
39 */
40#define INT_CAMERA 1
41#define INT_FIQ 3
42#define INT_RTDX 6
43#define INT_DSP_MMU_ABORT 7
44#define INT_HOST 8
45#define INT_ABORT 9
46#define INT_BRIDGE_PRIV 13
47#define INT_GPIO_BANK1 14
48#define INT_UART3 15
49#define INT_TIMER3 16
50#define INT_DMA_CH0_6 19
51#define INT_DMA_CH1_7 20
52#define INT_DMA_CH2_8 21
53#define INT_DMA_CH3 22
54#define INT_DMA_CH4 23
55#define INT_DMA_CH5 24
56#define INT_DMA_LCD 25
57#define INT_TIMER1 26
58#define INT_WD_TIMER 27
59#define INT_BRIDGE_PUB 28
60#define INT_TIMER2 30
61#define INT_LCD_CTRL 31
62
63/*
64 * OMAP-1510 specific IRQ numbers for interrupt handler 1
65 */
66#define INT_1510_IH2_IRQ 0
67#define INT_1510_RES2 2
68#define INT_1510_SPI_TX 4
69#define INT_1510_SPI_RX 5
70#define INT_1510_DSP_MAILBOX1 10
71#define INT_1510_DSP_MAILBOX2 11
72#define INT_1510_RES12 12
73#define INT_1510_LB_MMU 17
74#define INT_1510_RES18 18
75#define INT_1510_LOCAL_BUS 29
76
77/*
78 * OMAP-1610 specific IRQ numbers for interrupt handler 1
79 */
80#define INT_1610_IH2_IRQ 0
81#define INT_1610_IH2_FIQ 2
82#define INT_1610_McBSP2_TX 4
83#define INT_1610_McBSP2_RX 5
84#define INT_1610_DSP_MAILBOX1 10
85#define INT_1610_DSP_MAILBOX2 11
86#define INT_1610_LCD_LINE 12
87#define INT_1610_GPTIMER1 17
88#define INT_1610_GPTIMER2 18
89#define INT_1610_SSR_FIFO_0 29
90
91/*
92 * OMAP-7xx specific IRQ numbers for interrupt handler 1
93 */
94#define INT_7XX_IH2_FIQ 0
95#define INT_7XX_IH2_IRQ 1
96#define INT_7XX_USB_NON_ISO 2
97#define INT_7XX_USB_ISO 3
98#define INT_7XX_ICR 4
99#define INT_7XX_EAC 5
100#define INT_7XX_GPIO_BANK1 6
101#define INT_7XX_GPIO_BANK2 7
102#define INT_7XX_GPIO_BANK3 8
103#define INT_7XX_McBSP2TX 10
104#define INT_7XX_McBSP2RX 11
105#define INT_7XX_McBSP2RX_OVF 12
106#define INT_7XX_LCD_LINE 14
107#define INT_7XX_GSM_PROTECT 15
108#define INT_7XX_TIMER3 16
109#define INT_7XX_GPIO_BANK5 17
110#define INT_7XX_GPIO_BANK6 18
111#define INT_7XX_SPGIO_WR 29
112
113/*
114 * IRQ numbers for interrupt handler 2
115 *
116 * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
117 */
118#define IH2_BASE 32
119
120#define INT_KEYBOARD (1 + IH2_BASE)
121#define INT_uWireTX (2 + IH2_BASE)
122#define INT_uWireRX (3 + IH2_BASE)
123#define INT_I2C (4 + IH2_BASE)
124#define INT_MPUIO (5 + IH2_BASE)
125#define INT_USB_HHC_1 (6 + IH2_BASE)
126#define INT_McBSP3TX (10 + IH2_BASE)
127#define INT_McBSP3RX (11 + IH2_BASE)
128#define INT_McBSP1TX (12 + IH2_BASE)
129#define INT_McBSP1RX (13 + IH2_BASE)
130#define INT_UART1 (14 + IH2_BASE)
131#define INT_UART2 (15 + IH2_BASE)
132#define INT_BT_MCSI1TX (16 + IH2_BASE)
133#define INT_BT_MCSI1RX (17 + IH2_BASE)
134#define INT_SOSSI_MATCH (19 + IH2_BASE)
135#define INT_USB_W2FC (20 + IH2_BASE)
136#define INT_1WIRE (21 + IH2_BASE)
137#define INT_OS_TIMER (22 + IH2_BASE)
138#define INT_MMC (23 + IH2_BASE)
139#define INT_GAUGE_32K (24 + IH2_BASE)
140#define INT_RTC_TIMER (25 + IH2_BASE)
141#define INT_RTC_ALARM (26 + IH2_BASE)
142#define INT_MEM_STICK (27 + IH2_BASE)
143
144/*
145 * OMAP-1510 specific IRQ numbers for interrupt handler 2
146 */
147#define INT_1510_DSP_MMU (28 + IH2_BASE)
148#define INT_1510_COM_SPI_RO (31 + IH2_BASE)
149
150/*
151 * OMAP-1610 specific IRQ numbers for interrupt handler 2
152 */
153#define INT_1610_FAC (0 + IH2_BASE)
154#define INT_1610_USB_HHC_2 (7 + IH2_BASE)
155#define INT_1610_USB_OTG (8 + IH2_BASE)
156#define INT_1610_SoSSI (9 + IH2_BASE)
157#define INT_1610_SoSSI_MATCH (19 + IH2_BASE)
158#define INT_1610_DSP_MMU (28 + IH2_BASE)
159#define INT_1610_McBSP2RX_OF (31 + IH2_BASE)
160#define INT_1610_STI (32 + IH2_BASE)
161#define INT_1610_STI_WAKEUP (33 + IH2_BASE)
162#define INT_1610_GPTIMER3 (34 + IH2_BASE)
163#define INT_1610_GPTIMER4 (35 + IH2_BASE)
164#define INT_1610_GPTIMER5 (36 + IH2_BASE)
165#define INT_1610_GPTIMER6 (37 + IH2_BASE)
166#define INT_1610_GPTIMER7 (38 + IH2_BASE)
167#define INT_1610_GPTIMER8 (39 + IH2_BASE)
168#define INT_1610_GPIO_BANK2 (40 + IH2_BASE)
169#define INT_1610_GPIO_BANK3 (41 + IH2_BASE)
170#define INT_1610_MMC2 (42 + IH2_BASE)
171#define INT_1610_CF (43 + IH2_BASE)
172#define INT_1610_WAKE_UP_REQ (46 + IH2_BASE)
173#define INT_1610_GPIO_BANK4 (48 + IH2_BASE)
174#define INT_1610_SPI (49 + IH2_BASE)
175#define INT_1610_DMA_CH6 (53 + IH2_BASE)
176#define INT_1610_DMA_CH7 (54 + IH2_BASE)
177#define INT_1610_DMA_CH8 (55 + IH2_BASE)
178#define INT_1610_DMA_CH9 (56 + IH2_BASE)
179#define INT_1610_DMA_CH10 (57 + IH2_BASE)
180#define INT_1610_DMA_CH11 (58 + IH2_BASE)
181#define INT_1610_DMA_CH12 (59 + IH2_BASE)
182#define INT_1610_DMA_CH13 (60 + IH2_BASE)
183#define INT_1610_DMA_CH14 (61 + IH2_BASE)
184#define INT_1610_DMA_CH15 (62 + IH2_BASE)
185#define INT_1610_NAND (63 + IH2_BASE)
186#define INT_1610_SHA1MD5 (91 + IH2_BASE)
187
188/*
189 * OMAP-7xx specific IRQ numbers for interrupt handler 2
190 */
191#define INT_7XX_HW_ERRORS (0 + IH2_BASE)
192#define INT_7XX_NFIQ_PWR_FAIL (1 + IH2_BASE)
193#define INT_7XX_CFCD (2 + IH2_BASE)
194#define INT_7XX_CFIREQ (3 + IH2_BASE)
195#define INT_7XX_I2C (4 + IH2_BASE)
196#define INT_7XX_PCC (5 + IH2_BASE)
197#define INT_7XX_MPU_EXT_NIRQ (6 + IH2_BASE)
198#define INT_7XX_SPI_100K_1 (7 + IH2_BASE)
199#define INT_7XX_SYREN_SPI (8 + IH2_BASE)
200#define INT_7XX_VLYNQ (9 + IH2_BASE)
201#define INT_7XX_GPIO_BANK4 (10 + IH2_BASE)
202#define INT_7XX_McBSP1TX (11 + IH2_BASE)
203#define INT_7XX_McBSP1RX (12 + IH2_BASE)
204#define INT_7XX_McBSP1RX_OF (13 + IH2_BASE)
205#define INT_7XX_UART_MODEM_IRDA_2 (14 + IH2_BASE)
206#define INT_7XX_UART_MODEM_1 (15 + IH2_BASE)
207#define INT_7XX_MCSI (16 + IH2_BASE)
208#define INT_7XX_uWireTX (17 + IH2_BASE)
209#define INT_7XX_uWireRX (18 + IH2_BASE)
210#define INT_7XX_SMC_CD (19 + IH2_BASE)
211#define INT_7XX_SMC_IREQ (20 + IH2_BASE)
212#define INT_7XX_HDQ_1WIRE (21 + IH2_BASE)
213#define INT_7XX_TIMER32K (22 + IH2_BASE)
214#define INT_7XX_MMC_SDIO (23 + IH2_BASE)
215#define INT_7XX_UPLD (24 + IH2_BASE)
216#define INT_7XX_USB_HHC_1 (27 + IH2_BASE)
217#define INT_7XX_USB_HHC_2 (28 + IH2_BASE)
218#define INT_7XX_USB_GENI (29 + IH2_BASE)
219#define INT_7XX_USB_OTG (30 + IH2_BASE)
220#define INT_7XX_CAMERA_IF (31 + IH2_BASE)
221#define INT_7XX_RNG (32 + IH2_BASE)
222#define INT_7XX_DUAL_MODE_TIMER (33 + IH2_BASE)
223#define INT_7XX_DBB_RF_EN (34 + IH2_BASE)
224#define INT_7XX_MPUIO_KEYPAD (35 + IH2_BASE)
225#define INT_7XX_SHA1_MD5 (36 + IH2_BASE)
226#define INT_7XX_SPI_100K_2 (37 + IH2_BASE)
227#define INT_7XX_RNG_IDLE (38 + IH2_BASE)
228#define INT_7XX_MPUIO (39 + IH2_BASE)
229#define INT_7XX_LLPC_LCD_CTRL_CAN_BE_OFF (40 + IH2_BASE)
230#define INT_7XX_LLPC_OE_FALLING (41 + IH2_BASE)
231#define INT_7XX_LLPC_OE_RISING (42 + IH2_BASE)
232#define INT_7XX_LLPC_VSYNC (43 + IH2_BASE)
233#define INT_7XX_WAKE_UP_REQ (46 + IH2_BASE)
234#define INT_7XX_DMA_CH6 (53 + IH2_BASE)
235#define INT_7XX_DMA_CH7 (54 + IH2_BASE)
236#define INT_7XX_DMA_CH8 (55 + IH2_BASE)
237#define INT_7XX_DMA_CH9 (56 + IH2_BASE)
238#define INT_7XX_DMA_CH10 (57 + IH2_BASE)
239#define INT_7XX_DMA_CH11 (58 + IH2_BASE)
240#define INT_7XX_DMA_CH12 (59 + IH2_BASE)
241#define INT_7XX_DMA_CH13 (60 + IH2_BASE)
242#define INT_7XX_DMA_CH14 (61 + IH2_BASE)
243#define INT_7XX_DMA_CH15 (62 + IH2_BASE)
244#define INT_7XX_NAND (63 + IH2_BASE)
245
246#define INT_24XX_SYS_NIRQ 7
247#define INT_24XX_SDMA_IRQ0 12
248#define INT_24XX_SDMA_IRQ1 13
249#define INT_24XX_SDMA_IRQ2 14
250#define INT_24XX_SDMA_IRQ3 15
251#define INT_24XX_CAM_IRQ 24
252#define INT_24XX_DSS_IRQ 25
253#define INT_24XX_MAIL_U0_MPU 26
254#define INT_24XX_DSP_UMA 27
255#define INT_24XX_DSP_MMU 28
256#define INT_24XX_GPIO_BANK1 29
257#define INT_24XX_GPIO_BANK2 30
258#define INT_24XX_GPIO_BANK3 31
259#define INT_24XX_GPIO_BANK4 32
260#define INT_24XX_GPIO_BANK5 33
261#define INT_24XX_MAIL_U3_MPU 34
262#define INT_24XX_GPTIMER1 37
263#define INT_24XX_GPTIMER2 38
264#define INT_24XX_GPTIMER3 39
265#define INT_24XX_GPTIMER4 40
266#define INT_24XX_GPTIMER5 41
267#define INT_24XX_GPTIMER6 42
268#define INT_24XX_GPTIMER7 43
269#define INT_24XX_GPTIMER8 44
270#define INT_24XX_GPTIMER9 45
271#define INT_24XX_GPTIMER10 46
272#define INT_24XX_GPTIMER11 47
273#define INT_24XX_GPTIMER12 48
274#define INT_24XX_SHA1MD5 51
275#define INT_24XX_MCBSP4_IRQ_TX 54
276#define INT_24XX_MCBSP4_IRQ_RX 55
277#define INT_24XX_I2C1_IRQ 56
278#define INT_24XX_I2C2_IRQ 57
279#define INT_24XX_HDQ_IRQ 58
280#define INT_24XX_MCBSP1_IRQ_TX 59
281#define INT_24XX_MCBSP1_IRQ_RX 60
282#define INT_24XX_MCBSP2_IRQ_TX 62
283#define INT_24XX_MCBSP2_IRQ_RX 63
284#define INT_24XX_SPI1_IRQ 65
285#define INT_24XX_SPI2_IRQ 66
286#define INT_24XX_UART1_IRQ 72
287#define INT_24XX_UART2_IRQ 73
288#define INT_24XX_UART3_IRQ 74
289#define INT_24XX_USB_IRQ_GEN 75
290#define INT_24XX_USB_IRQ_NISO 76
291#define INT_24XX_USB_IRQ_ISO 77
292#define INT_24XX_USB_IRQ_HGEN 78
293#define INT_24XX_USB_IRQ_HSOF 79
294#define INT_24XX_USB_IRQ_OTG 80
295#define INT_24XX_MCBSP5_IRQ_TX 81
296#define INT_24XX_MCBSP5_IRQ_RX 82
297#define INT_24XX_MMC_IRQ 83
298#define INT_24XX_MMC2_IRQ 86
299#define INT_24XX_MCBSP3_IRQ_TX 89
300#define INT_24XX_MCBSP3_IRQ_RX 90
301#define INT_24XX_SPI3_IRQ 91
302
303#define INT_243X_MCBSP2_IRQ 16
304#define INT_243X_MCBSP3_IRQ 17
305#define INT_243X_MCBSP4_IRQ 18
306#define INT_243X_MCBSP5_IRQ 19
307#define INT_243X_MCBSP1_IRQ 64
308#define INT_243X_HS_USB_MC 92
309#define INT_243X_HS_USB_DMA 93
310#define INT_243X_CARKIT_IRQ 94
311
312#define INT_34XX_BENCH_MPU_EMUL 3
313#define INT_34XX_ST_MCBSP2_IRQ 4
314#define INT_34XX_ST_MCBSP3_IRQ 5
315#define INT_34XX_SSM_ABORT_IRQ 6
316#define INT_34XX_SYS_NIRQ 7
317#define INT_34XX_D2D_FW_IRQ 8
318#define INT_34XX_PRCM_MPU_IRQ 11
319#define INT_34XX_MCBSP1_IRQ 16
320#define INT_34XX_MCBSP2_IRQ 17
321#define INT_34XX_MCBSP3_IRQ 22
322#define INT_34XX_MCBSP4_IRQ 23
323#define INT_34XX_CAM_IRQ 24
324#define INT_34XX_MCBSP5_IRQ 27
325#define INT_34XX_GPIO_BANK1 29
326#define INT_34XX_GPIO_BANK2 30
327#define INT_34XX_GPIO_BANK3 31
328#define INT_34XX_GPIO_BANK4 32
329#define INT_34XX_GPIO_BANK5 33
330#define INT_34XX_GPIO_BANK6 34
331#define INT_34XX_USIM_IRQ 35
332#define INT_34XX_WDT3_IRQ 36
333#define INT_34XX_SPI4_IRQ 48
334#define INT_34XX_SHA1MD52_IRQ 49
335#define INT_34XX_FPKA_READY_IRQ 50
336#define INT_34XX_SHA1MD51_IRQ 51
337#define INT_34XX_RNG_IRQ 52
338#define INT_34XX_I2C3_IRQ 61
339#define INT_34XX_FPKA_ERROR_IRQ 64
340#define INT_34XX_PBIAS_IRQ 75
341#define INT_34XX_OHCI_IRQ 76
342#define INT_34XX_EHCI_IRQ 77
343#define INT_34XX_TLL_IRQ 78
344#define INT_34XX_PARTHASH_IRQ 79
345#define INT_34XX_MMC3_IRQ 94
346#define INT_34XX_GPT12_IRQ 95
347
348#define INT_35XX_HECC0_IRQ 24
349#define INT_35XX_HECC1_IRQ 28
350#define INT_35XX_EMAC_C0_RXTHRESH_IRQ 67
351#define INT_35XX_EMAC_C0_RX_PULSE_IRQ 68
352#define INT_35XX_EMAC_C0_TX_PULSE_IRQ 69
353#define INT_35XX_EMAC_C0_MISC_PULSE_IRQ 70
354#define INT_35XX_USBOTG_IRQ 71
355#define INT_35XX_CCDC_VD0_IRQ 88
356#define INT_35XX_CCDC_VD1_IRQ 92
357#define INT_35XX_CCDC_VD2_IRQ 93
358
359/* Max. 128 level 2 IRQs (OMAP1610), 192 GPIOs (OMAP730/850) and
360 * 16 MPUIO lines */
361#define OMAP_MAX_GPIO_LINES 192
362#define IH_GPIO_BASE (128 + IH2_BASE)
363#define IH_MPUIO_BASE (OMAP_MAX_GPIO_LINES + IH_GPIO_BASE)
364#define OMAP_IRQ_END (IH_MPUIO_BASE + 16)
365
366/* External FPGA handles interrupts on Innovator boards */
367#define OMAP_FPGA_IRQ_BASE (OMAP_IRQ_END)
368#ifdef CONFIG_MACH_OMAP_INNOVATOR
369#define OMAP_FPGA_NR_IRQS 24
370#else
371#define OMAP_FPGA_NR_IRQS 0
372#endif
373#define OMAP_FPGA_IRQ_END (OMAP_FPGA_IRQ_BASE + OMAP_FPGA_NR_IRQS)
374
375/* External TWL4030 can handle interrupts on 2430 and 34xx boards */
376#define TWL4030_IRQ_BASE (OMAP_FPGA_IRQ_END)
377#ifdef CONFIG_TWL4030_CORE
378#define TWL4030_BASE_NR_IRQS 8
379#define TWL4030_PWR_NR_IRQS 8
380#else
381#define TWL4030_BASE_NR_IRQS 0
382#define TWL4030_PWR_NR_IRQS 0
383#endif
384#define TWL4030_IRQ_END (TWL4030_IRQ_BASE + TWL4030_BASE_NR_IRQS)
385#define TWL4030_PWR_IRQ_BASE TWL4030_IRQ_END
386#define TWL4030_PWR_IRQ_END (TWL4030_PWR_IRQ_BASE + TWL4030_PWR_NR_IRQS)
387
388/* External TWL4030 gpio interrupts are optional */
389#define TWL4030_GPIO_IRQ_BASE TWL4030_PWR_IRQ_END
390#ifdef CONFIG_GPIO_TWL4030
391#define TWL4030_GPIO_NR_IRQS 18
392#else
393#define TWL4030_GPIO_NR_IRQS 0
394#endif
395#define TWL4030_GPIO_IRQ_END (TWL4030_GPIO_IRQ_BASE + TWL4030_GPIO_NR_IRQS)
396
397#define TWL6030_IRQ_BASE (OMAP_FPGA_IRQ_END)
398#ifdef CONFIG_TWL4030_CORE
399#define TWL6030_BASE_NR_IRQS 20
400#else
401#define TWL6030_BASE_NR_IRQS 0
402#endif
403#define TWL6030_IRQ_END (TWL6030_IRQ_BASE + TWL6030_BASE_NR_IRQS)
404
405/* Total number of interrupts depends on the enabled blocks above */
406#if (TWL4030_GPIO_IRQ_END > TWL6030_IRQ_END)
407#define TWL_IRQ_END TWL4030_GPIO_IRQ_END
408#else
409#define TWL_IRQ_END TWL6030_IRQ_END
410#endif
411
412#define NR_IRQS TWL_IRQ_END
413
414#define OMAP_IRQ_BIT(irq) (1 << ((irq) % 32))
415
416#define INTCPS_NR_MIR_REGS 3
417#define INTCPS_NR_IRQS 96
418
419#ifndef __ASSEMBLY__
420extern void omap_init_irq(void);
421extern int omap_irq_pending(void);
422void omap_intc_save_context(void);
423void omap_intc_restore_context(void);
424void omap3_intc_suspend(void);
425void omap3_intc_prepare_idle(void);
426void omap3_intc_resume_idle(void);
427#endif
428
429#include <mach/hardware.h>
430
431#endif
diff --git a/arch/arm/plat-omap/include/mach/keypad.h b/arch/arm/plat-omap/include/plat/keypad.h
index 3ae52ccc793c..3ae52ccc793c 100644
--- a/arch/arm/plat-omap/include/mach/keypad.h
+++ b/arch/arm/plat-omap/include/plat/keypad.h
diff --git a/arch/arm/plat-omap/include/mach/lcd_mipid.h b/arch/arm/plat-omap/include/plat/lcd_mipid.h
index 8e52c6572281..8e52c6572281 100644
--- a/arch/arm/plat-omap/include/mach/lcd_mipid.h
+++ b/arch/arm/plat-omap/include/plat/lcd_mipid.h
diff --git a/arch/arm/plat-omap/include/mach/led.h b/arch/arm/plat-omap/include/plat/led.h
index 25e451e7e2fd..25e451e7e2fd 100644
--- a/arch/arm/plat-omap/include/mach/led.h
+++ b/arch/arm/plat-omap/include/plat/led.h
diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/plat/mailbox.h
index b7a6991814ec..729166b76a7c 100644
--- a/arch/arm/plat-omap/include/mach/mailbox.h
+++ b/arch/arm/plat-omap/include/plat/mailbox.h
@@ -6,9 +6,9 @@
6#include <linux/wait.h> 6#include <linux/wait.h>
7#include <linux/workqueue.h> 7#include <linux/workqueue.h>
8#include <linux/blkdev.h> 8#include <linux/blkdev.h>
9#include <linux/interrupt.h>
9 10
10typedef u32 mbox_msg_t; 11typedef u32 mbox_msg_t;
11typedef void (mbox_receiver_t)(mbox_msg_t msg);
12struct omap_mbox; 12struct omap_mbox;
13 13
14typedef int __bitwise omap_mbox_irq_t; 14typedef int __bitwise omap_mbox_irq_t;
@@ -29,8 +29,10 @@ struct omap_mbox_ops {
29 int (*fifo_empty)(struct omap_mbox *mbox); 29 int (*fifo_empty)(struct omap_mbox *mbox);
30 int (*fifo_full)(struct omap_mbox *mbox); 30 int (*fifo_full)(struct omap_mbox *mbox);
31 /* irq */ 31 /* irq */
32 void (*enable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); 32 void (*enable_irq)(struct omap_mbox *mbox,
33 void (*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); 33 omap_mbox_irq_t irq);
34 void (*disable_irq)(struct omap_mbox *mbox,
35 omap_mbox_irq_t irq);
34 void (*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); 36 void (*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
35 int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); 37 int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
36 /* ctx */ 38 /* ctx */
@@ -42,6 +44,7 @@ struct omap_mbox_queue {
42 spinlock_t lock; 44 spinlock_t lock;
43 struct request_queue *queue; 45 struct request_queue *queue;
44 struct work_struct work; 46 struct work_struct work;
47 struct tasklet_struct tasklet;
45 int (*callback)(void *); 48 int (*callback)(void *);
46 struct omap_mbox *mbox; 49 struct omap_mbox *mbox;
47}; 50};
@@ -64,7 +67,7 @@ struct omap_mbox {
64 void (*err_notify)(void); 67 void (*err_notify)(void);
65}; 68};
66 69
67int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg, void *); 70int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg);
68void omap_mbox_init_seq(struct omap_mbox *); 71void omap_mbox_init_seq(struct omap_mbox *);
69 72
70struct omap_mbox *omap_mbox_get(const char *); 73struct omap_mbox *omap_mbox_get(const char *);
@@ -93,4 +96,16 @@ static inline void omap_mbox_restore_ctx(struct omap_mbox *mbox)
93 mbox->ops->restore_ctx(mbox); 96 mbox->ops->restore_ctx(mbox);
94} 97}
95 98
99static inline void omap_mbox_enable_irq(struct omap_mbox *mbox,
100 omap_mbox_irq_t irq)
101{
102 mbox->ops->enable_irq(mbox, irq);
103}
104
105static inline void omap_mbox_disable_irq(struct omap_mbox *mbox,
106 omap_mbox_irq_t irq)
107{
108 mbox->ops->disable_irq(mbox, irq);
109}
110
96#endif /* MAILBOX_H */ 111#endif /* MAILBOX_H */
diff --git a/arch/arm/plat-omap/include/mach/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h
index e0d6eca222cc..7de903d7c1ce 100644
--- a/arch/arm/plat-omap/include/mach/mcbsp.h
+++ b/arch/arm/plat-omap/include/plat/mcbsp.h
@@ -28,10 +28,10 @@
28#include <linux/spinlock.h> 28#include <linux/spinlock.h>
29 29
30#include <mach/hardware.h> 30#include <mach/hardware.h>
31#include <mach/clock.h> 31#include <plat/clock.h>
32 32
33#define OMAP730_MCBSP1_BASE 0xfffb1000 33#define OMAP7XX_MCBSP1_BASE 0xfffb1000
34#define OMAP730_MCBSP2_BASE 0xfffb1800 34#define OMAP7XX_MCBSP2_BASE 0xfffb1800
35 35
36#define OMAP1510_MCBSP1_BASE 0xe1011800 36#define OMAP1510_MCBSP1_BASE 0xe1011800
37#define OMAP1510_MCBSP2_BASE 0xfffb1000 37#define OMAP1510_MCBSP2_BASE 0xfffb1000
@@ -49,6 +49,9 @@
49 49
50#define OMAP34XX_MCBSP1_BASE 0x48074000 50#define OMAP34XX_MCBSP1_BASE 0x48074000
51#define OMAP34XX_MCBSP2_BASE 0x49022000 51#define OMAP34XX_MCBSP2_BASE 0x49022000
52#define OMAP34XX_MCBSP2_ST_BASE 0x49028000
53#define OMAP34XX_MCBSP3_BASE 0x49024000
54#define OMAP34XX_MCBSP3_ST_BASE 0x4902A000
52#define OMAP34XX_MCBSP3_BASE 0x49024000 55#define OMAP34XX_MCBSP3_BASE 0x49024000
53#define OMAP34XX_MCBSP4_BASE 0x49026000 56#define OMAP34XX_MCBSP4_BASE 0x49026000
54#define OMAP34XX_MCBSP5_BASE 0x48096000 57#define OMAP34XX_MCBSP5_BASE 0x48096000
@@ -56,9 +59,9 @@
56#define OMAP44XX_MCBSP1_BASE 0x49022000 59#define OMAP44XX_MCBSP1_BASE 0x49022000
57#define OMAP44XX_MCBSP2_BASE 0x49024000 60#define OMAP44XX_MCBSP2_BASE 0x49024000
58#define OMAP44XX_MCBSP3_BASE 0x49026000 61#define OMAP44XX_MCBSP3_BASE 0x49026000
59#define OMAP44XX_MCBSP4_BASE 0x48074000 62#define OMAP44XX_MCBSP4_BASE 0x48096000
60 63
61#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP730) 64#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
62 65
63#define OMAP_MCBSP_REG_DRR2 0x00 66#define OMAP_MCBSP_REG_DRR2 0x00
64#define OMAP_MCBSP_REG_DRR1 0x02 67#define OMAP_MCBSP_REG_DRR1 0x02
@@ -103,8 +106,7 @@
103#define AUDIO_DMA_TX OMAP_DMA_MCBSP1_TX 106#define AUDIO_DMA_TX OMAP_DMA_MCBSP1_TX
104#define AUDIO_DMA_RX OMAP_DMA_MCBSP1_RX 107#define AUDIO_DMA_RX OMAP_DMA_MCBSP1_RX
105 108
106#elif defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ 109#else
107 defined(CONFIG_ARCH_OMAP4)
108 110
109#define OMAP_MCBSP_REG_DRR2 0x00 111#define OMAP_MCBSP_REG_DRR2 0x00
110#define OMAP_MCBSP_REG_DRR1 0x04 112#define OMAP_MCBSP_REG_DRR1 0x04
@@ -147,6 +149,15 @@
147#define OMAP_MCBSP_REG_WAKEUPEN 0xA8 149#define OMAP_MCBSP_REG_WAKEUPEN 0xA8
148#define OMAP_MCBSP_REG_XCCR 0xAC 150#define OMAP_MCBSP_REG_XCCR 0xAC
149#define OMAP_MCBSP_REG_RCCR 0xB0 151#define OMAP_MCBSP_REG_RCCR 0xB0
152#define OMAP_MCBSP_REG_SSELCR 0xBC
153
154#define OMAP_ST_REG_REV 0x00
155#define OMAP_ST_REG_SYSCONFIG 0x10
156#define OMAP_ST_REG_IRQSTATUS 0x18
157#define OMAP_ST_REG_IRQENABLE 0x1C
158#define OMAP_ST_REG_SGAINCR 0x24
159#define OMAP_ST_REG_SFIRCR 0x28
160#define OMAP_ST_REG_SSELCR 0x2C
150 161
151#define AUDIO_MCBSP_DATAWRITE (OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DXR1) 162#define AUDIO_MCBSP_DATAWRITE (OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DXR1)
152#define AUDIO_MCBSP_DATAREAD (OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DRR1) 163#define AUDIO_MCBSP_DATAREAD (OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DRR1)
@@ -265,6 +276,24 @@
265#define ENAWAKEUP 0x0004 276#define ENAWAKEUP 0x0004
266#define SOFTRST 0x0002 277#define SOFTRST 0x0002
267 278
279/********************** McBSP SSELCR bit definitions ***********************/
280#define SIDETONEEN 0x0400
281
282/********************** McBSP Sidetone SYSCONFIG bit definitions ***********/
283#define ST_AUTOIDLE 0x0001
284
285/********************** McBSP Sidetone SGAINCR bit definitions *************/
286#define ST_CH1GAIN(value) ((value<<16)) /* Bits 16:31 */
287#define ST_CH0GAIN(value) (value) /* Bits 0:15 */
288
289/********************** McBSP Sidetone SFIRCR bit definitions **************/
290#define ST_FIRCOEFF(value) (value) /* Bits 0:15 */
291
292/********************** McBSP Sidetone SSELCR bit definitions **************/
293#define ST_COEFFWRDONE 0x0004
294#define ST_COEFFWREN 0x0002
295#define ST_SIDETONEEN 0x0001
296
268/********************** McBSP DMA operating modes **************************/ 297/********************** McBSP DMA operating modes **************************/
269#define MCBSP_DMA_MODE_ELEMENT 0 298#define MCBSP_DMA_MODE_ELEMENT 0
270#define MCBSP_DMA_MODE_THRESHOLD 1 299#define MCBSP_DMA_MODE_THRESHOLD 1
@@ -374,11 +403,23 @@ struct omap_mcbsp_platform_data {
374 u8 dma_rx_sync, dma_tx_sync; 403 u8 dma_rx_sync, dma_tx_sync;
375 u16 rx_irq, tx_irq; 404 u16 rx_irq, tx_irq;
376 struct omap_mcbsp_ops *ops; 405 struct omap_mcbsp_ops *ops;
377#ifdef CONFIG_ARCH_OMAP34XX 406#ifdef CONFIG_ARCH_OMAP3
407 /* Sidetone block for McBSP 2 and 3 */
408 unsigned long phys_base_st;
378 u16 buffer_size; 409 u16 buffer_size;
379#endif 410#endif
380}; 411};
381 412
413struct omap_mcbsp_st_data {
414 void __iomem *io_base_st;
415 bool running;
416 bool enabled;
417 s16 taps[128]; /* Sidetone filter coefficients */
418 int nr_taps; /* Number of filter coefficients in use */
419 s16 ch0gain;
420 s16 ch1gain;
421};
422
382struct omap_mcbsp { 423struct omap_mcbsp {
383 struct device *dev; 424 struct device *dev;
384 unsigned long phys_base; 425 unsigned long phys_base;
@@ -410,20 +451,22 @@ struct omap_mcbsp {
410 struct omap_mcbsp_platform_data *pdata; 451 struct omap_mcbsp_platform_data *pdata;
411 struct clk *iclk; 452 struct clk *iclk;
412 struct clk *fclk; 453 struct clk *fclk;
413#ifdef CONFIG_ARCH_OMAP34XX 454#ifdef CONFIG_ARCH_OMAP3
455 struct omap_mcbsp_st_data *st_data;
414 int dma_op_mode; 456 int dma_op_mode;
415 u16 max_tx_thres; 457 u16 max_tx_thres;
416 u16 max_rx_thres; 458 u16 max_rx_thres;
417#endif 459#endif
460 void *reg_cache;
418}; 461};
419extern struct omap_mcbsp **mcbsp_ptr; 462extern struct omap_mcbsp **mcbsp_ptr;
420extern int omap_mcbsp_count; 463extern int omap_mcbsp_count, omap_mcbsp_cache_size;
421 464
422int omap_mcbsp_init(void); 465int omap_mcbsp_init(void);
423void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config, 466void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config,
424 int size); 467 int size);
425void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config); 468void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config);
426#ifdef CONFIG_ARCH_OMAP34XX 469#ifdef CONFIG_ARCH_OMAP3
427void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold); 470void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold);
428void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold); 471void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold);
429u16 omap_mcbsp_get_max_tx_threshold(unsigned int id); 472u16 omap_mcbsp_get_max_tx_threshold(unsigned int id);
@@ -459,4 +502,21 @@ int omap_mcbsp_pollread(unsigned int id, u16 * buf);
459int omap_mcbsp_pollwrite(unsigned int id, u16 buf); 502int omap_mcbsp_pollwrite(unsigned int id, u16 buf);
460int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type); 503int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type);
461 504
505#ifdef CONFIG_ARCH_OMAP3
506/* Sidetone specific API */
507int omap_st_set_chgain(unsigned int id, int channel, s16 chgain);
508int omap_st_get_chgain(unsigned int id, int channel, s16 *chgain);
509int omap_st_enable(unsigned int id);
510int omap_st_disable(unsigned int id);
511int omap_st_is_enabled(unsigned int id);
512#else
513static inline int omap_st_set_chgain(unsigned int id, int channel,
514 s16 chgain) { return 0; }
515static inline int omap_st_get_chgain(unsigned int id, int channel,
516 s16 *chgain) { return 0; }
517static inline int omap_st_enable(unsigned int id) { return 0; }
518static inline int omap_st_disable(unsigned int id) { return 0; }
519static inline int omap_st_is_enabled(unsigned int id) { return 0; }
520#endif
521
462#endif 522#endif
diff --git a/arch/arm/plat-omap/include/mach/mcspi.h b/arch/arm/plat-omap/include/plat/mcspi.h
index 1254e4945b6f..1254e4945b6f 100644
--- a/arch/arm/plat-omap/include/mach/mcspi.h
+++ b/arch/arm/plat-omap/include/plat/mcspi.h
diff --git a/arch/arm/plat-omap/include/mach/memory.h b/arch/arm/plat-omap/include/plat/memory.h
index 9ad41dc484c1..d5306bee44b2 100644
--- a/arch/arm/plat-omap/include/mach/memory.h
+++ b/arch/arm/plat-omap/include/plat/memory.h
@@ -38,8 +38,7 @@
38 */ 38 */
39#if defined(CONFIG_ARCH_OMAP1) 39#if defined(CONFIG_ARCH_OMAP1)
40#define PHYS_OFFSET UL(0x10000000) 40#define PHYS_OFFSET UL(0x10000000)
41#elif defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ 41#else
42 defined(CONFIG_ARCH_OMAP4)
43#define PHYS_OFFSET UL(0x80000000) 42#define PHYS_OFFSET UL(0x80000000)
44#endif 43#endif
45 44
@@ -68,6 +67,13 @@
68 __dma = __dma - PHYS_OFFSET + OMAP1510_LB_OFFSET; \ 67 __dma = __dma - PHYS_OFFSET + OMAP1510_LB_OFFSET; \
69 __dma; }) 68 __dma; })
70 69
70#define __arch_dma_to_page(dev, addr) \
71 ({ dma_addr_t __dma = addr; \
72 if (is_lbus_device(dev)) \
73 __dma += PHYS_OFFSET - OMAP1510_LB_OFFSET; \
74 phys_to_page(__dma); \
75 })
76
71#define __arch_dma_to_virt(dev, addr) ({ (void *) (is_lbus_device(dev) ? \ 77#define __arch_dma_to_virt(dev, addr) ({ (void *) (is_lbus_device(dev) ? \
72 lbus_to_virt(addr) : \ 78 lbus_to_virt(addr) : \
73 __phys_to_virt(addr)); }) 79 __phys_to_virt(addr)); })
diff --git a/arch/arm/plat-omap/include/mach/menelaus.h b/arch/arm/plat-omap/include/plat/menelaus.h
index 3122bf68c7ce..4a970ec62dd1 100644
--- a/arch/arm/plat-omap/include/mach/menelaus.h
+++ b/arch/arm/plat-omap/include/plat/menelaus.h
@@ -40,7 +40,7 @@ extern int menelaus_set_vcore_hw(unsigned int roof_mV, unsigned int floor_mV);
40 40
41extern int menelaus_set_regulator_sleep(int enable, u32 val); 41extern int menelaus_set_regulator_sleep(int enable, u32 val);
42 42
43#if defined(CONFIG_ARCH_OMAP24XX) && defined(CONFIG_MENELAUS) 43#if defined(CONFIG_ARCH_OMAP2) && defined(CONFIG_MENELAUS)
44#define omap_has_menelaus() 1 44#define omap_has_menelaus() 1
45#else 45#else
46#define omap_has_menelaus() 0 46#define omap_has_menelaus() 0
diff --git a/arch/arm/plat-omap/include/mach/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h
index 7229b9593301..a1bac07c89eb 100644
--- a/arch/arm/plat-omap/include/mach/mmc.h
+++ b/arch/arm/plat-omap/include/plat/mmc.h
@@ -15,7 +15,7 @@
15#include <linux/device.h> 15#include <linux/device.h>
16#include <linux/mmc/host.h> 16#include <linux/mmc/host.h>
17 17
18#include <mach/board.h> 18#include <plat/board.h>
19 19
20#define OMAP15XX_NR_MMC 1 20#define OMAP15XX_NR_MMC 1
21#define OMAP16XX_NR_MMC 2 21#define OMAP16XX_NR_MMC 2
@@ -55,12 +55,12 @@ struct omap_mmc_platform_data {
55 unsigned int max_freq; 55 unsigned int max_freq;
56 56
57 /* switch the bus to a new slot */ 57 /* switch the bus to a new slot */
58 int (* switch_slot)(struct device *dev, int slot); 58 int (*switch_slot)(struct device *dev, int slot);
59 /* initialize board-specific MMC functionality, can be NULL if 59 /* initialize board-specific MMC functionality, can be NULL if
60 * not supported */ 60 * not supported */
61 int (* init)(struct device *dev); 61 int (*init)(struct device *dev);
62 void (* cleanup)(struct device *dev); 62 void (*cleanup)(struct device *dev);
63 void (* shutdown)(struct device *dev); 63 void (*shutdown)(struct device *dev);
64 64
65 /* To handle board related suspend/resume functionality for MMC */ 65 /* To handle board related suspend/resume functionality for MMC */
66 int (*suspend)(struct device *dev, int slot); 66 int (*suspend)(struct device *dev, int slot);
@@ -96,14 +96,28 @@ struct omap_mmc_platform_data {
96 /* Try to sleep or power off when possible */ 96 /* Try to sleep or power off when possible */
97 unsigned power_saving:1; 97 unsigned power_saving:1;
98 98
99 /* If using power_saving and the MMC power is not to go off */
100 unsigned no_off:1;
101
102 /* Regulator off remapped to sleep */
103 unsigned vcc_aux_disable_is_sleep:1;
104
99 int switch_pin; /* gpio (card detect) */ 105 int switch_pin; /* gpio (card detect) */
100 int gpio_wp; /* gpio (write protect) */ 106 int gpio_wp; /* gpio (write protect) */
101 107
102 int (* set_bus_mode)(struct device *dev, int slot, int bus_mode); 108 int (*set_bus_mode)(struct device *dev, int slot, int bus_mode);
103 int (* set_power)(struct device *dev, int slot, int power_on, int vdd); 109 int (*set_power)(struct device *dev, int slot,
104 int (* get_ro)(struct device *dev, int slot); 110 int power_on, int vdd);
111 int (*get_ro)(struct device *dev, int slot);
105 int (*set_sleep)(struct device *dev, int slot, int sleep, 112 int (*set_sleep)(struct device *dev, int slot, int sleep,
106 int vdd, int cardsleep); 113 int vdd, int cardsleep);
114 void (*remux)(struct device *dev, int slot, int power_on);
115 /* Call back before enabling / disabling regulators */
116 void (*before_set_reg)(struct device *dev, int slot,
117 int power_on, int vdd);
118 /* Call back after enabling / disabling regulators */
119 void (*after_set_reg)(struct device *dev, int slot,
120 int power_on, int vdd);
107 121
108 /* return MMC cover switch state, can be NULL if not supported. 122 /* return MMC cover switch state, can be NULL if not supported.
109 * 123 *
@@ -111,14 +125,14 @@ struct omap_mmc_platform_data {
111 * 0 - closed 125 * 0 - closed
112 * 1 - open 126 * 1 - open
113 */ 127 */
114 int (* get_cover_state)(struct device *dev, int slot); 128 int (*get_cover_state)(struct device *dev, int slot);
115 129
116 const char *name; 130 const char *name;
117 u32 ocr_mask; 131 u32 ocr_mask;
118 132
119 /* Card detection IRQs */ 133 /* Card detection IRQs */
120 int card_detect_irq; 134 int card_detect_irq;
121 int (* card_detect)(int irq); 135 int (*card_detect)(struct device *dev, int slot);
122 136
123 unsigned int ban_openended:1; 137 unsigned int ban_openended:1;
124 138
@@ -126,7 +140,8 @@ struct omap_mmc_platform_data {
126}; 140};
127 141
128/* called from board-specific card detection service routine */ 142/* called from board-specific card detection service routine */
129extern void omap_mmc_notify_cover_event(struct device *dev, int slot, int is_closed); 143extern void omap_mmc_notify_cover_event(struct device *dev, int slot,
144 int is_closed);
130 145
131#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ 146#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
132 defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) 147 defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
diff --git a/arch/arm/plat-omap/include/plat/multi.h b/arch/arm/plat-omap/include/plat/multi.h
new file mode 100644
index 000000000000..f235d32cd942
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/multi.h
@@ -0,0 +1,94 @@
1/*
2 * Support for compiling in multiple OMAP processors
3 *
4 * Copyright (C) 2010 Nokia Corporation
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 as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
22#ifndef __PLAT_OMAP_MULTI_H
23#define __PLAT_OMAP_MULTI_H
24
25/*
26 * Test if multicore OMAP support is needed
27 */
28#undef MULTI_OMAP1
29#undef MULTI_OMAP2
30#undef OMAP_NAME
31
32#ifdef CONFIG_ARCH_OMAP730
33# ifdef OMAP_NAME
34# undef MULTI_OMAP1
35# define MULTI_OMAP1
36# else
37# define OMAP_NAME omap730
38# endif
39#endif
40#ifdef CONFIG_ARCH_OMAP850
41# ifdef OMAP_NAME
42# undef MULTI_OMAP1
43# define MULTI_OMAP1
44# else
45# define OMAP_NAME omap850
46# endif
47#endif
48#ifdef CONFIG_ARCH_OMAP15XX
49# ifdef OMAP_NAME
50# undef MULTI_OMAP1
51# define MULTI_OMAP1
52# else
53# define OMAP_NAME omap1510
54# endif
55#endif
56#ifdef CONFIG_ARCH_OMAP16XX
57# ifdef OMAP_NAME
58# undef MULTI_OMAP1
59# define MULTI_OMAP1
60# else
61# define OMAP_NAME omap16xx
62# endif
63#endif
64#if (defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3))
65# if (defined(OMAP_NAME) || defined(MULTI_OMAP1))
66# error "OMAP1 and OMAP2 can't be selected at the same time"
67# endif
68#endif
69#ifdef CONFIG_ARCH_OMAP2420
70# ifdef OMAP_NAME
71# undef MULTI_OMAP2
72# define MULTI_OMAP2
73# else
74# define OMAP_NAME omap2420
75# endif
76#endif
77#ifdef CONFIG_ARCH_OMAP2430
78# ifdef OMAP_NAME
79# undef MULTI_OMAP2
80# define MULTI_OMAP2
81# else
82# define OMAP_NAME omap2430
83# endif
84#endif
85#ifdef CONFIG_ARCH_OMAP3430
86# ifdef OMAP_NAME
87# undef MULTI_OMAP2
88# define MULTI_OMAP2
89# else
90# define OMAP_NAME omap3430
91# endif
92#endif
93
94#endif /* __PLAT_OMAP_MULTI_H */
diff --git a/arch/arm/plat-omap/include/mach/mux.h b/arch/arm/plat-omap/include/plat/mux.h
index 0f49d2d563d9..c7472a28ce24 100644
--- a/arch/arm/plat-omap/include/mach/mux.h
+++ b/arch/arm/plat-omap/include/plat/mux.h
@@ -51,23 +51,13 @@
51 .pu_pd_reg = PU_PD_SEL_##reg, \ 51 .pu_pd_reg = PU_PD_SEL_##reg, \
52 .pu_pd_val = status, 52 .pu_pd_val = status,
53 53
54#define MUX_REG_730(reg, mode_offset, mode) .mux_reg_name = "OMAP730_IO_CONF_"#reg, \ 54#define MUX_REG_7XX(reg, mode_offset, mode) .mux_reg_name = "OMAP7XX_IO_CONF_"#reg, \
55 .mux_reg = OMAP730_IO_CONF_##reg, \ 55 .mux_reg = OMAP7XX_IO_CONF_##reg, \
56 .mask_offset = mode_offset, \ 56 .mask_offset = mode_offset, \
57 .mask = mode, 57 .mask = mode,
58 58
59#define PULL_REG_730(reg, bit, status) .pull_name = "OMAP730_IO_CONF_"#reg, \ 59#define PULL_REG_7XX(reg, bit, status) .pull_name = "OMAP7XX_IO_CONF_"#reg, \
60 .pull_reg = OMAP730_IO_CONF_##reg, \ 60 .pull_reg = OMAP7XX_IO_CONF_##reg, \
61 .pull_bit = bit, \
62 .pull_val = status,
63
64#define MUX_REG_850(reg, mode_offset, mode) .mux_reg_name = "OMAP850_IO_CONF_"#reg, \
65 .mux_reg = OMAP850_IO_CONF_##reg, \
66 .mask_offset = mode_offset, \
67 .mask = mode,
68
69#define PULL_REG_850(reg, bit, status) .pull_name = "OMAP850_IO_CONF_"#reg, \
70 .pull_reg = OMAP850_IO_CONF_##reg, \
71 .pull_bit = bit, \ 61 .pull_bit = bit, \
72 .pull_val = status, 62 .pull_val = status,
73 63
@@ -84,21 +74,12 @@
84#define PU_PD_REG(reg, status) .pu_pd_reg = PU_PD_SEL_##reg, \ 74#define PU_PD_REG(reg, status) .pu_pd_reg = PU_PD_SEL_##reg, \
85 .pu_pd_val = status, 75 .pu_pd_val = status,
86 76
87#define MUX_REG_730(reg, mode_offset, mode) \ 77#define MUX_REG_7XX(reg, mode_offset, mode) \
88 .mux_reg = OMAP730_IO_CONF_##reg, \ 78 .mux_reg = OMAP7XX_IO_CONF_##reg, \
89 .mask_offset = mode_offset, \
90 .mask = mode,
91
92#define PULL_REG_730(reg, bit, status) .pull_reg = OMAP730_IO_CONF_##reg, \
93 .pull_bit = bit, \
94 .pull_val = status,
95
96#define MUX_REG_850(reg, mode_offset, mode) \
97 .mux_reg = OMAP850_IO_CONF_##reg, \
98 .mask_offset = mode_offset, \ 79 .mask_offset = mode_offset, \
99 .mask = mode, 80 .mask = mode,
100 81
101#define PULL_REG_850(reg, bit, status) .pull_reg = OMAP850_IO_CONF_##reg, \ 82#define PULL_REG_7XX(reg, bit, status) .pull_reg = OMAP7XX_IO_CONF_##reg, \
102 .pull_bit = bit, \ 83 .pull_bit = bit, \
103 .pull_val = status, 84 .pull_val = status,
104 85
@@ -118,32 +99,21 @@
118 99
119/* 100/*
120 * OMAP730/850 has a slightly different config for the pin mux. 101 * OMAP730/850 has a slightly different config for the pin mux.
121 * - config regs are the OMAP730_IO_CONF_x regs (see omap730.h) regs and 102 * - config regs are the OMAP7XX_IO_CONF_x regs (see omap730.h) regs and
122 * not the FUNC_MUX_CTRL_x regs from hardware.h 103 * not the FUNC_MUX_CTRL_x regs from hardware.h
123 * - for pull-up/down, only has one enable bit which is is in the same register 104 * - for pull-up/down, only has one enable bit which is is in the same register
124 * as mux config 105 * as mux config
125 */ 106 */
126#define MUX_CFG_730(desc, mux_reg, mode_offset, mode, \ 107#define MUX_CFG_7XX(desc, mux_reg, mode_offset, mode, \
127 pull_bit, pull_status, debug_status)\
128{ \
129 .name = desc, \
130 .debug = debug_status, \
131 MUX_REG_730(mux_reg, mode_offset, mode) \
132 PULL_REG_730(mux_reg, pull_bit, pull_status) \
133 PU_PD_REG(NA, 0) \
134},
135
136#define MUX_CFG_850(desc, mux_reg, mode_offset, mode, \
137 pull_bit, pull_status, debug_status)\ 108 pull_bit, pull_status, debug_status)\
138{ \ 109{ \
139 .name = desc, \ 110 .name = desc, \
140 .debug = debug_status, \ 111 .debug = debug_status, \
141 MUX_REG_850(mux_reg, mode_offset, mode) \ 112 MUX_REG_7XX(mux_reg, mode_offset, mode) \
142 PULL_REG_850(mux_reg, pull_bit, pull_status) \ 113 PULL_REG_7XX(mux_reg, pull_bit, pull_status) \
143 PU_PD_REG(NA, 0) \ 114 PU_PD_REG(NA, 0) \
144}, 115},
145 116
146
147#define MUX_CFG_24XX(desc, reg_offset, mode, \ 117#define MUX_CFG_24XX(desc, reg_offset, mode, \
148 pull_en, pull_mode, dbg) \ 118 pull_en, pull_mode, dbg) \
149{ \ 119{ \
@@ -160,59 +130,12 @@
160#define OMAP2_PULL_UP (1 << 4) 130#define OMAP2_PULL_UP (1 << 4)
161#define OMAP2_ALTELECTRICALSEL (1 << 5) 131#define OMAP2_ALTELECTRICALSEL (1 << 5)
162 132
163/* 34xx specific mux bit defines */
164#define OMAP3_INPUT_EN (1 << 8)
165#define OMAP3_OFF_EN (1 << 9)
166#define OMAP3_OFFOUT_EN (1 << 10)
167#define OMAP3_OFFOUT_VAL (1 << 11)
168#define OMAP3_OFF_PULL_EN (1 << 12)
169#define OMAP3_OFF_PULL_UP (1 << 13)
170#define OMAP3_WAKEUP_EN (1 << 14)
171
172/* 34xx mux mode options for each pin. See TRM for options */
173#define OMAP34XX_MUX_MODE0 0
174#define OMAP34XX_MUX_MODE1 1
175#define OMAP34XX_MUX_MODE2 2
176#define OMAP34XX_MUX_MODE3 3
177#define OMAP34XX_MUX_MODE4 4
178#define OMAP34XX_MUX_MODE5 5
179#define OMAP34XX_MUX_MODE6 6
180#define OMAP34XX_MUX_MODE7 7
181
182/* 34xx active pin states */
183#define OMAP34XX_PIN_OUTPUT 0
184#define OMAP34XX_PIN_INPUT OMAP3_INPUT_EN
185#define OMAP34XX_PIN_INPUT_PULLUP (OMAP2_PULL_ENA | OMAP3_INPUT_EN \
186 | OMAP2_PULL_UP)
187#define OMAP34XX_PIN_INPUT_PULLDOWN (OMAP2_PULL_ENA | OMAP3_INPUT_EN)
188
189/* 34xx off mode states */
190#define OMAP34XX_PIN_OFF_NONE 0
191#define OMAP34XX_PIN_OFF_OUTPUT_HIGH (OMAP3_OFF_EN | OMAP3_OFFOUT_EN \
192 | OMAP3_OFFOUT_VAL)
193#define OMAP34XX_PIN_OFF_OUTPUT_LOW (OMAP3_OFF_EN | OMAP3_OFFOUT_EN)
194#define OMAP34XX_PIN_OFF_INPUT_PULLUP (OMAP3_OFF_EN | OMAP3_OFF_PULL_EN \
195 | OMAP3_OFF_PULL_UP)
196#define OMAP34XX_PIN_OFF_INPUT_PULLDOWN (OMAP3_OFF_EN | OMAP3_OFF_PULL_EN)
197#define OMAP34XX_PIN_OFF_WAKEUPENABLE OMAP3_WAKEUP_EN
198
199#define MUX_CFG_34XX(desc, reg_offset, mux_value) { \
200 .name = desc, \
201 .debug = 0, \
202 .mux_reg = reg_offset, \
203 .mux_val = mux_value \
204},
205
206struct pin_config { 133struct pin_config {
207 char *name; 134 char *name;
208 const unsigned int mux_reg; 135 const unsigned int mux_reg;
209 unsigned char debug; 136 unsigned char debug;
210 137
211#if defined(CONFIG_ARCH_OMAP34XX) 138#if defined(CONFIG_ARCH_OMAP1) || defined(CONFIG_ARCH_OMAP2)
212 u16 mux_val; /* Wake-up, off mode, pull, mux mode */
213#endif
214
215#if defined(CONFIG_ARCH_OMAP1) || defined(CONFIG_ARCH_OMAP24XX)
216 const unsigned char mask_offset; 139 const unsigned char mask_offset;
217 const unsigned char mask; 140 const unsigned char mask;
218 141
@@ -232,45 +155,44 @@ struct pin_config {
232 155
233}; 156};
234 157
235enum omap730_index { 158enum omap7xx_index {
236 /* OMAP 730 keyboard */ 159 /* OMAP 730 keyboard */
237 E2_730_KBR0, 160 E2_7XX_KBR0,
238 J7_730_KBR1, 161 J7_7XX_KBR1,
239 E1_730_KBR2, 162 E1_7XX_KBR2,
240 F3_730_KBR3, 163 F3_7XX_KBR3,
241 D2_730_KBR4, 164 D2_7XX_KBR4,
242 C2_730_KBC0, 165 C2_7XX_KBC0,
243 D3_730_KBC1, 166 D3_7XX_KBC1,
244 E4_730_KBC2, 167 E4_7XX_KBC2,
245 F4_730_KBC3, 168 F4_7XX_KBC3,
246 E3_730_KBC4, 169 E3_7XX_KBC4,
247
248 /* USB */
249 AA17_730_USB_DM,
250 W16_730_USB_PU_EN,
251 W17_730_USB_VBUSI,
252};
253
254enum omap850_index {
255 /* OMAP 850 keyboard */
256 E2_850_KBR0,
257 J7_850_KBR1,
258 E1_850_KBR2,
259 F3_850_KBR3,
260 D2_850_KBR4,
261 C2_850_KBC0,
262 D3_850_KBC1,
263 E4_850_KBC2,
264 F4_850_KBC3,
265 E3_850_KBC4,
266 170
267 /* USB */ 171 /* USB */
268 AA17_850_USB_DM, 172 AA17_7XX_USB_DM,
269 W16_850_USB_PU_EN, 173 W16_7XX_USB_PU_EN,
270 W17_850_USB_VBUSI, 174 W17_7XX_USB_VBUSI,
175 W18_7XX_USB_DMCK_OUT,
176 W19_7XX_USB_DCRST,
177
178 /* MMC */
179 MMC_7XX_CMD,
180 MMC_7XX_CLK,
181 MMC_7XX_DAT0,
182
183 /* I2C */
184 I2C_7XX_SCL,
185 I2C_7XX_SDA,
186
187 /* SPI */
188 SPI_7XX_1,
189 SPI_7XX_2,
190 SPI_7XX_3,
191 SPI_7XX_4,
192 SPI_7XX_5,
193 SPI_7XX_6,
271}; 194};
272 195
273
274enum omap1xxx_index { 196enum omap1xxx_index {
275 /* UART1 (BT_UART_GATING)*/ 197 /* UART1 (BT_UART_GATING)*/
276 UART1_TX = 0, 198 UART1_TX = 0,
@@ -726,172 +648,6 @@ enum omap24xx_index {
726 648
727}; 649};
728 650
729enum omap34xx_index {
730 /* 34xx I2C */
731 K21_34XX_I2C1_SCL,
732 J21_34XX_I2C1_SDA,
733 AF15_34XX_I2C2_SCL,
734 AE15_34XX_I2C2_SDA,
735 AF14_34XX_I2C3_SCL,
736 AG14_34XX_I2C3_SDA,
737 AD26_34XX_I2C4_SCL,
738 AE26_34XX_I2C4_SDA,
739
740 /* PHY - HSUSB: 12-pin ULPI PHY: Port 1*/
741 Y8_3430_USB1HS_PHY_CLK,
742 Y9_3430_USB1HS_PHY_STP,
743 AA14_3430_USB1HS_PHY_DIR,
744 AA11_3430_USB1HS_PHY_NXT,
745 W13_3430_USB1HS_PHY_DATA0,
746 W12_3430_USB1HS_PHY_DATA1,
747 W11_3430_USB1HS_PHY_DATA2,
748 Y11_3430_USB1HS_PHY_DATA3,
749 W9_3430_USB1HS_PHY_DATA4,
750 Y12_3430_USB1HS_PHY_DATA5,
751 W8_3430_USB1HS_PHY_DATA6,
752 Y13_3430_USB1HS_PHY_DATA7,
753
754 /* PHY - HSUSB: 12-pin ULPI PHY: Port 2*/
755 AA8_3430_USB2HS_PHY_CLK,
756 AA10_3430_USB2HS_PHY_STP,
757 AA9_3430_USB2HS_PHY_DIR,
758 AB11_3430_USB2HS_PHY_NXT,
759 AB10_3430_USB2HS_PHY_DATA0,
760 AB9_3430_USB2HS_PHY_DATA1,
761 W3_3430_USB2HS_PHY_DATA2,
762 T4_3430_USB2HS_PHY_DATA3,
763 T3_3430_USB2HS_PHY_DATA4,
764 R3_3430_USB2HS_PHY_DATA5,
765 R4_3430_USB2HS_PHY_DATA6,
766 T2_3430_USB2HS_PHY_DATA7,
767
768
769 /* TLL - HSUSB: 12-pin TLL Port 1*/
770 Y8_3430_USB1HS_TLL_CLK,
771 Y9_3430_USB1HS_TLL_STP,
772 AA14_3430_USB1HS_TLL_DIR,
773 AA11_3430_USB1HS_TLL_NXT,
774 W13_3430_USB1HS_TLL_DATA0,
775 W12_3430_USB1HS_TLL_DATA1,
776 W11_3430_USB1HS_TLL_DATA2,
777 Y11_3430_USB1HS_TLL_DATA3,
778 W9_3430_USB1HS_TLL_DATA4,
779 Y12_3430_USB1HS_TLL_DATA5,
780 W8_3430_USB1HS_TLL_DATA6,
781 Y13_3430_USB1HS_TLL_DATA7,
782
783 /* TLL - HSUSB: 12-pin TLL Port 2*/
784 AA8_3430_USB2HS_TLL_CLK,
785 AA10_3430_USB2HS_TLL_STP,
786 AA9_3430_USB2HS_TLL_DIR,
787 AB11_3430_USB2HS_TLL_NXT,
788 AB10_3430_USB2HS_TLL_DATA0,
789 AB9_3430_USB2HS_TLL_DATA1,
790 W3_3430_USB2HS_TLL_DATA2,
791 T4_3430_USB2HS_TLL_DATA3,
792 T3_3430_USB2HS_TLL_DATA4,
793 R3_3430_USB2HS_TLL_DATA5,
794 R4_3430_USB2HS_TLL_DATA6,
795 T2_3430_USB2HS_TLL_DATA7,
796
797 /* TLL - HSUSB: 12-pin TLL Port 3*/
798 AA6_3430_USB3HS_TLL_CLK,
799 AB3_3430_USB3HS_TLL_STP,
800 AA3_3430_USB3HS_TLL_DIR,
801 Y3_3430_USB3HS_TLL_NXT,
802 AA5_3430_USB3HS_TLL_DATA0,
803 Y4_3430_USB3HS_TLL_DATA1,
804 Y5_3430_USB3HS_TLL_DATA2,
805 W5_3430_USB3HS_TLL_DATA3,
806 AB12_3430_USB3HS_TLL_DATA4,
807 AB13_3430_USB3HS_TLL_DATA5,
808 AA13_3430_USB3HS_TLL_DATA6,
809 AA12_3430_USB3HS_TLL_DATA7,
810
811 /* PHY FSUSB: FS Serial for Port 1 (multiple PHY modes supported) */
812 AF10_3430_USB1FS_PHY_MM1_RXDP,
813 AG9_3430_USB1FS_PHY_MM1_RXDM,
814 W13_3430_USB1FS_PHY_MM1_RXRCV,
815 W12_3430_USB1FS_PHY_MM1_TXSE0,
816 W11_3430_USB1FS_PHY_MM1_TXDAT,
817 Y11_3430_USB1FS_PHY_MM1_TXEN_N,
818
819 /* PHY FSUSB: FS Serial for Port 2 (multiple PHY modes supported) */
820 AF7_3430_USB2FS_PHY_MM2_RXDP,
821 AH7_3430_USB2FS_PHY_MM2_RXDM,
822 AB10_3430_USB2FS_PHY_MM2_RXRCV,
823 AB9_3430_USB2FS_PHY_MM2_TXSE0,
824 W3_3430_USB2FS_PHY_MM2_TXDAT,
825 T4_3430_USB2FS_PHY_MM2_TXEN_N,
826
827 /* PHY FSUSB: FS Serial for Port 3 (multiple PHY modes supported) */
828 AH3_3430_USB3FS_PHY_MM3_RXDP,
829 AE3_3430_USB3FS_PHY_MM3_RXDM,
830 AD1_3430_USB3FS_PHY_MM3_RXRCV,
831 AE1_3430_USB3FS_PHY_MM3_TXSE0,
832 AD2_3430_USB3FS_PHY_MM3_TXDAT,
833 AC1_3430_USB3FS_PHY_MM3_TXEN_N,
834
835 /* 34xx GPIO
836 * - normally these are bidirectional, no internal pullup/pulldown
837 * - "_UP" suffix (GPIO3_UP) if internal pullup is configured
838 * - "_DOWN" suffix (GPIO3_DOWN) with internal pulldown
839 * - "_OUT" suffix (GPIO3_OUT) for output-only pins (unlike 24xx)
840 */
841 AF26_34XX_GPIO0,
842 AF22_34XX_GPIO9,
843 AG9_34XX_GPIO23,
844 AH8_34XX_GPIO29,
845 U8_34XX_GPIO54_OUT,
846 U8_34XX_GPIO54_DOWN,
847 L8_34XX_GPIO63,
848 G25_34XX_GPIO86_OUT,
849 AG4_34XX_GPIO134_OUT,
850 AF4_34XX_GPIO135_OUT,
851 AE4_34XX_GPIO136_OUT,
852 AF6_34XX_GPIO140_UP,
853 AE6_34XX_GPIO141,
854 AF5_34XX_GPIO142,
855 AE5_34XX_GPIO143,
856 H19_34XX_GPIO164_OUT,
857 J25_34XX_GPIO170,
858
859 /* OMAP3 SDRC CKE signals to SDR/DDR ram chips */
860 H16_34XX_SDRC_CKE0,
861 H17_34XX_SDRC_CKE1,
862
863 /* MMC1 */
864 N28_3430_MMC1_CLK,
865 M27_3430_MMC1_CMD,
866 N27_3430_MMC1_DAT0,
867 N26_3430_MMC1_DAT1,
868 N25_3430_MMC1_DAT2,
869 P28_3430_MMC1_DAT3,
870 P27_3430_MMC1_DAT4,
871 P26_3430_MMC1_DAT5,
872 R27_3430_MMC1_DAT6,
873 R25_3430_MMC1_DAT7,
874
875 /* MMC2 */
876 AE2_3430_MMC2_CLK,
877 AG5_3430_MMC2_CMD,
878 AH5_3430_MMC2_DAT0,
879 AH4_3430_MMC2_DAT1,
880 AG4_3430_MMC2_DAT2,
881 AF4_3430_MMC2_DAT3,
882
883 /* MMC3 */
884 AF10_3430_MMC3_CLK,
885 AC3_3430_MMC3_CMD,
886 AE11_3430_MMC3_DAT0,
887 AH9_3430_MMC3_DAT1,
888 AF13_3430_MMC3_DAT2,
889 AF13_3430_MMC3_DAT3,
890
891 /* SYS_NIRQ T2 INT1 */
892 AF26_34XX_SYS_NIRQ,
893};
894
895struct omap_mux_cfg { 651struct omap_mux_cfg {
896 struct pin_config *pins; 652 struct pin_config *pins;
897 unsigned long size; 653 unsigned long size;
@@ -901,14 +657,14 @@ struct omap_mux_cfg {
901#ifdef CONFIG_OMAP_MUX 657#ifdef CONFIG_OMAP_MUX
902/* setup pin muxing in Linux */ 658/* setup pin muxing in Linux */
903extern int omap1_mux_init(void); 659extern int omap1_mux_init(void);
904extern int omap2_mux_init(void);
905extern int omap_mux_register(struct omap_mux_cfg *); 660extern int omap_mux_register(struct omap_mux_cfg *);
906extern int omap_cfg_reg(unsigned long reg_cfg); 661extern int omap_cfg_reg(unsigned long reg_cfg);
907#else 662#else
908/* boot loader does it all (no warnings from CONFIG_OMAP_MUX_WARNINGS) */ 663/* boot loader does it all (no warnings from CONFIG_OMAP_MUX_WARNINGS) */
909static inline int omap1_mux_init(void) { return 0; } 664static inline int omap1_mux_init(void) { return 0; }
910static inline int omap2_mux_init(void) { return 0; }
911static inline int omap_cfg_reg(unsigned long reg_cfg) { return 0; } 665static inline int omap_cfg_reg(unsigned long reg_cfg) { return 0; }
912#endif 666#endif
913 667
668extern int omap2_mux_init(void);
669
914#endif 670#endif
diff --git a/arch/arm/plat-omap/include/mach/nand.h b/arch/arm/plat-omap/include/plat/nand.h
index 631a7bed1eef..f8efd5466b1d 100644
--- a/arch/arm/plat-omap/include/mach/nand.h
+++ b/arch/arm/plat-omap/include/plat/nand.h
@@ -15,10 +15,25 @@ struct omap_nand_platform_data {
15 int cs; 15 int cs;
16 int gpio_irq; 16 int gpio_irq;
17 struct mtd_partition *parts; 17 struct mtd_partition *parts;
18 struct gpmc_timings *gpmc_t;
18 int nr_parts; 19 int nr_parts;
19 int (*nand_setup)(void __iomem *); 20 int (*nand_setup)(void);
20 int (*dev_ready)(struct omap_nand_platform_data *); 21 int (*dev_ready)(struct omap_nand_platform_data *);
21 int dma_channel; 22 int dma_channel;
23 unsigned long phys_base;
22 void __iomem *gpmc_cs_baseaddr; 24 void __iomem *gpmc_cs_baseaddr;
23 void __iomem *gpmc_baseaddr; 25 void __iomem *gpmc_baseaddr;
26 int devsize;
24}; 27};
28
29/* size (4 KiB) for IO mapping */
30#define NAND_IO_SIZE SZ_4K
31
32#if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
33extern int gpmc_nand_init(struct omap_nand_platform_data *d);
34#else
35static inline int gpmc_nand_init(struct omap_nand_platform_data *d)
36{
37 return 0;
38}
39#endif
diff --git a/arch/arm/plat-omap/include/mach/omap-alsa.h b/arch/arm/plat-omap/include/plat/omap-alsa.h
index bdf30a0f87f2..b53055b390d0 100644
--- a/arch/arm/plat-omap/include/mach/omap-alsa.h
+++ b/arch/arm/plat-omap/include/plat/omap-alsa.h
@@ -40,10 +40,10 @@
40#ifndef __OMAP_ALSA_H 40#ifndef __OMAP_ALSA_H
41#define __OMAP_ALSA_H 41#define __OMAP_ALSA_H
42 42
43#include <mach/dma.h> 43#include <plat/dma.h>
44#include <sound/core.h> 44#include <sound/core.h>
45#include <sound/pcm.h> 45#include <sound/pcm.h>
46#include <mach/mcbsp.h> 46#include <plat/mcbsp.h>
47#include <linux/platform_device.h> 47#include <linux/platform_device.h>
48 48
49#define DMA_BUF_SIZE (1024 * 8) 49#define DMA_BUF_SIZE (1024 * 8)
diff --git a/arch/arm/plat-omap/include/mach/omap-pm.h b/arch/arm/plat-omap/include/plat/omap-pm.h
index 3ee41d711492..3ee41d711492 100644
--- a/arch/arm/plat-omap/include/mach/omap-pm.h
+++ b/arch/arm/plat-omap/include/plat/omap-pm.h
diff --git a/arch/arm/plat-omap/include/mach/omap1510.h b/arch/arm/plat-omap/include/plat/omap1510.h
index d24004668138..d24004668138 100644
--- a/arch/arm/plat-omap/include/mach/omap1510.h
+++ b/arch/arm/plat-omap/include/plat/omap1510.h
diff --git a/arch/arm/plat-omap/include/mach/omap16xx.h b/arch/arm/plat-omap/include/plat/omap16xx.h
index 0e69b504c25f..e69e1d857b45 100644
--- a/arch/arm/plat-omap/include/mach/omap16xx.h
+++ b/arch/arm/plat-omap/include/plat/omap16xx.h
@@ -124,44 +124,44 @@
124#define TIPB_SWITCH_BASE (0xfffbc800) 124#define TIPB_SWITCH_BASE (0xfffbc800)
125#define OMAP16XX_MMCSD2_SSW_MPU_CONF (TIPB_SWITCH_BASE + 0x160) 125#define OMAP16XX_MMCSD2_SSW_MPU_CONF (TIPB_SWITCH_BASE + 0x160)
126 126
127/* UART3 Registers Maping through MPU bus */ 127/* UART3 Registers Mapping through MPU bus */
128#define UART3_RHR (OMAP_UART3_BASE + 0) 128#define UART3_RHR (OMAP1_UART3_BASE + 0)
129#define UART3_THR (OMAP_UART3_BASE + 0) 129#define UART3_THR (OMAP1_UART3_BASE + 0)
130#define UART3_DLL (OMAP_UART3_BASE + 0) 130#define UART3_DLL (OMAP1_UART3_BASE + 0)
131#define UART3_IER (OMAP_UART3_BASE + 4) 131#define UART3_IER (OMAP1_UART3_BASE + 4)
132#define UART3_DLH (OMAP_UART3_BASE + 4) 132#define UART3_DLH (OMAP1_UART3_BASE + 4)
133#define UART3_IIR (OMAP_UART3_BASE + 8) 133#define UART3_IIR (OMAP1_UART3_BASE + 8)
134#define UART3_FCR (OMAP_UART3_BASE + 8) 134#define UART3_FCR (OMAP1_UART3_BASE + 8)
135#define UART3_EFR (OMAP_UART3_BASE + 8) 135#define UART3_EFR (OMAP1_UART3_BASE + 8)
136#define UART3_LCR (OMAP_UART3_BASE + 0x0C) 136#define UART3_LCR (OMAP1_UART3_BASE + 0x0C)
137#define UART3_MCR (OMAP_UART3_BASE + 0x10) 137#define UART3_MCR (OMAP1_UART3_BASE + 0x10)
138#define UART3_XON1_ADDR1 (OMAP_UART3_BASE + 0x10) 138#define UART3_XON1_ADDR1 (OMAP1_UART3_BASE + 0x10)
139#define UART3_XON2_ADDR2 (OMAP_UART3_BASE + 0x14) 139#define UART3_XON2_ADDR2 (OMAP1_UART3_BASE + 0x14)
140#define UART3_LSR (OMAP_UART3_BASE + 0x14) 140#define UART3_LSR (OMAP1_UART3_BASE + 0x14)
141#define UART3_TCR (OMAP_UART3_BASE + 0x18) 141#define UART3_TCR (OMAP1_UART3_BASE + 0x18)
142#define UART3_MSR (OMAP_UART3_BASE + 0x18) 142#define UART3_MSR (OMAP1_UART3_BASE + 0x18)
143#define UART3_XOFF1 (OMAP_UART3_BASE + 0x18) 143#define UART3_XOFF1 (OMAP1_UART3_BASE + 0x18)
144#define UART3_XOFF2 (OMAP_UART3_BASE + 0x1C) 144#define UART3_XOFF2 (OMAP1_UART3_BASE + 0x1C)
145#define UART3_SPR (OMAP_UART3_BASE + 0x1C) 145#define UART3_SPR (OMAP1_UART3_BASE + 0x1C)
146#define UART3_TLR (OMAP_UART3_BASE + 0x1C) 146#define UART3_TLR (OMAP1_UART3_BASE + 0x1C)
147#define UART3_MDR1 (OMAP_UART3_BASE + 0x20) 147#define UART3_MDR1 (OMAP1_UART3_BASE + 0x20)
148#define UART3_MDR2 (OMAP_UART3_BASE + 0x24) 148#define UART3_MDR2 (OMAP1_UART3_BASE + 0x24)
149#define UART3_SFLSR (OMAP_UART3_BASE + 0x28) 149#define UART3_SFLSR (OMAP1_UART3_BASE + 0x28)
150#define UART3_TXFLL (OMAP_UART3_BASE + 0x28) 150#define UART3_TXFLL (OMAP1_UART3_BASE + 0x28)
151#define UART3_RESUME (OMAP_UART3_BASE + 0x2C) 151#define UART3_RESUME (OMAP1_UART3_BASE + 0x2C)
152#define UART3_TXFLH (OMAP_UART3_BASE + 0x2C) 152#define UART3_TXFLH (OMAP1_UART3_BASE + 0x2C)
153#define UART3_SFREGL (OMAP_UART3_BASE + 0x30) 153#define UART3_SFREGL (OMAP1_UART3_BASE + 0x30)
154#define UART3_RXFLL (OMAP_UART3_BASE + 0x30) 154#define UART3_RXFLL (OMAP1_UART3_BASE + 0x30)
155#define UART3_SFREGH (OMAP_UART3_BASE + 0x34) 155#define UART3_SFREGH (OMAP1_UART3_BASE + 0x34)
156#define UART3_RXFLH (OMAP_UART3_BASE + 0x34) 156#define UART3_RXFLH (OMAP1_UART3_BASE + 0x34)
157#define UART3_BLR (OMAP_UART3_BASE + 0x38) 157#define UART3_BLR (OMAP1_UART3_BASE + 0x38)
158#define UART3_ACREG (OMAP_UART3_BASE + 0x3C) 158#define UART3_ACREG (OMAP1_UART3_BASE + 0x3C)
159#define UART3_DIV16 (OMAP_UART3_BASE + 0x3C) 159#define UART3_DIV16 (OMAP1_UART3_BASE + 0x3C)
160#define UART3_SCR (OMAP_UART3_BASE + 0x40) 160#define UART3_SCR (OMAP1_UART3_BASE + 0x40)
161#define UART3_SSR (OMAP_UART3_BASE + 0x44) 161#define UART3_SSR (OMAP1_UART3_BASE + 0x44)
162#define UART3_EBLR (OMAP_UART3_BASE + 0x48) 162#define UART3_EBLR (OMAP1_UART3_BASE + 0x48)
163#define UART3_OSC_12M_SEL (OMAP_UART3_BASE + 0x4C) 163#define UART3_OSC_12M_SEL (OMAP1_UART3_BASE + 0x4C)
164#define UART3_MVR (OMAP_UART3_BASE + 0x50) 164#define UART3_MVR (OMAP1_UART3_BASE + 0x50)
165 165
166/* 166/*
167 * --------------------------------------------------------------------------- 167 * ---------------------------------------------------------------------------
diff --git a/arch/arm/plat-omap/include/mach/omap24xx.h b/arch/arm/plat-omap/include/plat/omap24xx.h
index 696edfc145a6..7055672a8c68 100644
--- a/arch/arm/plat-omap/include/mach/omap24xx.h
+++ b/arch/arm/plat-omap/include/plat/omap24xx.h
@@ -23,8 +23,8 @@
23 * 23 *
24 */ 24 */
25 25
26#ifndef __ASM_ARCH_OMAP24XX_H 26#ifndef __ASM_ARCH_OMAP2_H
27#define __ASM_ARCH_OMAP24XX_H 27#define __ASM_ARCH_OMAP2_H
28 28
29/* 29/*
30 * Please place only base defines here and put the rest in device 30 * Please place only base defines here and put the rest in device
@@ -85,5 +85,5 @@
85#define OMAP24XX_SEC_AES_BASE (OMAP24XX_SEC_BASE + 0x6000) 85#define OMAP24XX_SEC_AES_BASE (OMAP24XX_SEC_BASE + 0x6000)
86#define OMAP24XX_SEC_PKA_BASE (OMAP24XX_SEC_BASE + 0x8000) 86#define OMAP24XX_SEC_PKA_BASE (OMAP24XX_SEC_BASE + 0x8000)
87 87
88#endif /* __ASM_ARCH_OMAP24XX_H */ 88#endif /* __ASM_ARCH_OMAP2_H */
89 89
diff --git a/arch/arm/plat-omap/include/mach/omap34xx.h b/arch/arm/plat-omap/include/plat/omap34xx.h
index f8d186a73712..2845fdc658b0 100644
--- a/arch/arm/plat-omap/include/mach/omap34xx.h
+++ b/arch/arm/plat-omap/include/plat/omap34xx.h
@@ -21,8 +21,8 @@
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */ 22 */
23 23
24#ifndef __ASM_ARCH_OMAP34XX_H 24#ifndef __ASM_ARCH_OMAP3_H
25#define __ASM_ARCH_OMAP34XX_H 25#define __ASM_ARCH_OMAP3_H
26 26
27/* 27/*
28 * Please place only base defines here and put the rest in device 28 * Please place only base defines here and put the rest in device
@@ -72,16 +72,15 @@
72#define OMAP3430_ISP_CSI2A_END (OMAP3430_ISP_CSI2A_BASE + 0x16F) 72#define OMAP3430_ISP_CSI2A_END (OMAP3430_ISP_CSI2A_BASE + 0x16F)
73#define OMAP3430_ISP_CSI2PHY_END (OMAP3430_ISP_CSI2PHY_BASE + 0x007) 73#define OMAP3430_ISP_CSI2PHY_END (OMAP3430_ISP_CSI2PHY_BASE + 0x007)
74 74
75#define OMAP34XX_IVA_INTC_BASE 0x40000000
76#define OMAP34XX_HSUSB_OTG_BASE (L4_34XX_BASE + 0xAB000) 75#define OMAP34XX_HSUSB_OTG_BASE (L4_34XX_BASE + 0xAB000)
77#define OMAP34XX_HSUSB_HOST_BASE (L4_34XX_BASE + 0x64000)
78#define OMAP34XX_USBTLL_BASE (L4_34XX_BASE + 0x62000) 76#define OMAP34XX_USBTLL_BASE (L4_34XX_BASE + 0x62000)
77#define OMAP34XX_UHH_CONFIG_BASE (L4_34XX_BASE + 0x64000)
78#define OMAP34XX_OHCI_BASE (L4_34XX_BASE + 0x64400)
79#define OMAP34XX_EHCI_BASE (L4_34XX_BASE + 0x64800)
80#define OMAP34XX_SR1_BASE 0x480C9000
81#define OMAP34XX_SR2_BASE 0x480CB000
79 82
80#define OMAP34XX_MAILBOX_BASE (L4_34XX_BASE + 0x94000) 83#define OMAP34XX_MAILBOX_BASE (L4_34XX_BASE + 0x94000)
81 84
82#define OMAP34XX_DSP_BASE 0x58000000 85#endif /* __ASM_ARCH_OMAP3_H */
83#define OMAP34XX_DSP_MEM_BASE (OMAP34XX_DSP_BASE + 0x0)
84#define OMAP34XX_DSP_IPI_BASE (OMAP34XX_DSP_BASE + 0x1000000)
85#define OMAP34XX_DSP_MMU_BASE (OMAP34XX_DSP_BASE + 0x2000000)
86#endif /* __ASM_ARCH_OMAP34XX_H */
87 86
diff --git a/arch/arm/plat-omap/include/mach/omap44xx.h b/arch/arm/plat-omap/include/plat/omap44xx.h
index b3ba5ac7b4a4..b3ef1a7f53cc 100644
--- a/arch/arm/plat-omap/include/mach/omap44xx.h
+++ b/arch/arm/plat-omap/include/plat/omap44xx.h
@@ -22,25 +22,31 @@
22#define L4_PER_44XX_BASE 0x48000000 22#define L4_PER_44XX_BASE 0x48000000
23#define L4_EMU_44XX_BASE 0x54000000 23#define L4_EMU_44XX_BASE 0x54000000
24#define L3_44XX_BASE 0x44000000 24#define L3_44XX_BASE 0x44000000
25#define OMAP44XX_EMIF1_BASE 0x4c000000
26#define OMAP44XX_EMIF2_BASE 0x4d000000
27#define OMAP44XX_DMM_BASE 0x4e000000
25#define OMAP4430_32KSYNCT_BASE 0x4a304000 28#define OMAP4430_32KSYNCT_BASE 0x4a304000
26#define OMAP4430_CM_BASE 0x4a004000 29#define OMAP4430_CM1_BASE 0x4a004000
27#define OMAP4430_PRM_BASE 0x48306000 30#define OMAP4430_CM_BASE OMAP4430_CM1_BASE
31#define OMAP4430_CM2_BASE 0x4a008000
32#define OMAP4430_PRM_BASE 0x4a306000
28#define OMAP44XX_GPMC_BASE 0x50000000 33#define OMAP44XX_GPMC_BASE 0x50000000
29#define OMAP443X_SCM_BASE 0x4a002000 34#define OMAP443X_SCM_BASE 0x4a002000
30#define OMAP443X_CTRL_BASE OMAP443X_SCM_BASE 35#define OMAP443X_CTRL_BASE 0x4a100000
31#define OMAP44XX_IC_BASE 0x48200000 36#define OMAP44XX_IC_BASE 0x48200000
32#define OMAP44XX_IVA_INTC_BASE 0x40000000 37#define OMAP44XX_IVA_INTC_BASE 0x40000000
33#define IRQ_SIR_IRQ 0x0040 38#define IRQ_SIR_IRQ 0x0040
34#define OMAP44XX_GIC_DIST_BASE 0x48241000 39#define OMAP44XX_GIC_DIST_BASE 0x48241000
35#define OMAP44XX_GIC_CPU_BASE 0x48240100 40#define OMAP44XX_GIC_CPU_BASE 0x48240100
36#define OMAP44XX_VA_GIC_CPU_BASE OMAP2_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE)
37#define OMAP44XX_SCU_BASE 0x48240000 41#define OMAP44XX_SCU_BASE 0x48240000
38#define OMAP44XX_VA_SCU_BASE OMAP2_IO_ADDRESS(OMAP44XX_SCU_BASE)
39#define OMAP44XX_LOCAL_TWD_BASE 0x48240600 42#define OMAP44XX_LOCAL_TWD_BASE 0x48240600
40#define OMAP44XX_VA_LOCAL_TWD_BASE OMAP2_IO_ADDRESS(OMAP44XX_LOCAL_TWD_BASE) 43#define OMAP44XX_L2CACHE_BASE 0x48242000
41#define OMAP44XX_LOCAL_TWD_SIZE 0x00000100
42#define OMAP44XX_WKUPGEN_BASE 0x48281000 44#define OMAP44XX_WKUPGEN_BASE 0x48281000
43#define OMAP44XX_VA_WKUPGEN_BASE OMAP2_IO_ADDRESS(OMAP44XX_WKUPGEN_BASE) 45#define OMAP44XX_MCPDM_BASE 0x40132000
46#define OMAP44XX_MCPDM_L3_BASE 0x49032000
47
48#define OMAP44XX_MAILBOX_BASE (L4_44XX_BASE + 0xF4000)
49#define OMAP44XX_HSUSB_OTG_BASE (L4_44XX_BASE + 0xAB000)
44 50
45#endif /* __ASM_ARCH_OMAP44XX_H */ 51#endif /* __ASM_ARCH_OMAP44XX_H */
46 52
diff --git a/arch/arm/plat-omap/include/mach/omap730.h b/arch/arm/plat-omap/include/plat/omap730.h
index 14272bc1a6fd..14272bc1a6fd 100644
--- a/arch/arm/plat-omap/include/mach/omap730.h
+++ b/arch/arm/plat-omap/include/plat/omap730.h
diff --git a/arch/arm/plat-omap/include/plat/omap7xx.h b/arch/arm/plat-omap/include/plat/omap7xx.h
new file mode 100644
index 000000000000..48e4757e1e30
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/omap7xx.h
@@ -0,0 +1,107 @@
1/* arch/arm/plat-omap/include/mach/omap7xx.h
2 *
3 * Hardware definitions for TI OMAP7XX processor.
4 *
5 * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
6 * Adapted for omap850 by Zebediah C. McClure <zmc@lurian.net>
7 * Adapted for omap7xx by Alistair Buxton <a.j.buxton@gmail.com>
8 *
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation; either version 2 of the License, or (at your
12 * option) any later version.
13 *
14 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
15 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
17 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
20 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
21 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 *
25 * You should have received a copy of the GNU General Public License along
26 * with this program; if not, write to the Free Software Foundation, Inc.,
27 * 675 Mass Ave, Cambridge, MA 02139, USA.
28 */
29
30#ifndef __ASM_ARCH_OMAP7XX_H
31#define __ASM_ARCH_OMAP7XX_H
32
33/*
34 * ----------------------------------------------------------------------------
35 * Base addresses
36 * ----------------------------------------------------------------------------
37 */
38
39/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
40
41#define OMAP7XX_DSP_BASE 0xE0000000
42#define OMAP7XX_DSP_SIZE 0x50000
43#define OMAP7XX_DSP_START 0xE0000000
44
45#define OMAP7XX_DSPREG_BASE 0xE1000000
46#define OMAP7XX_DSPREG_SIZE SZ_128K
47#define OMAP7XX_DSPREG_START 0xE1000000
48
49#define OMAP7XX_SPI1_BASE 0xfffc0800
50#define OMAP7XX_SPI2_BASE 0xfffc1000
51
52/*
53 * ----------------------------------------------------------------------------
54 * OMAP7XX specific configuration registers
55 * ----------------------------------------------------------------------------
56 */
57#define OMAP7XX_CONFIG_BASE 0xfffe1000
58#define OMAP7XX_IO_CONF_0 0xfffe1070
59#define OMAP7XX_IO_CONF_1 0xfffe1074
60#define OMAP7XX_IO_CONF_2 0xfffe1078
61#define OMAP7XX_IO_CONF_3 0xfffe107c
62#define OMAP7XX_IO_CONF_4 0xfffe1080
63#define OMAP7XX_IO_CONF_5 0xfffe1084
64#define OMAP7XX_IO_CONF_6 0xfffe1088
65#define OMAP7XX_IO_CONF_7 0xfffe108c
66#define OMAP7XX_IO_CONF_8 0xfffe1090
67#define OMAP7XX_IO_CONF_9 0xfffe1094
68#define OMAP7XX_IO_CONF_10 0xfffe1098
69#define OMAP7XX_IO_CONF_11 0xfffe109c
70#define OMAP7XX_IO_CONF_12 0xfffe10a0
71#define OMAP7XX_IO_CONF_13 0xfffe10a4
72
73#define OMAP7XX_MODE_1 0xfffe1010
74#define OMAP7XX_MODE_2 0xfffe1014
75
76/* CSMI specials: in terms of base + offset */
77#define OMAP7XX_MODE2_OFFSET 0x14
78
79/*
80 * ----------------------------------------------------------------------------
81 * OMAP7XX traffic controller configuration registers
82 * ----------------------------------------------------------------------------
83 */
84#define OMAP7XX_FLASH_CFG_0 0xfffecc10
85#define OMAP7XX_FLASH_ACFG_0 0xfffecc50
86#define OMAP7XX_FLASH_CFG_1 0xfffecc14
87#define OMAP7XX_FLASH_ACFG_1 0xfffecc54
88
89/*
90 * ----------------------------------------------------------------------------
91 * OMAP7XX DSP control registers
92 * ----------------------------------------------------------------------------
93 */
94#define OMAP7XX_ICR_BASE 0xfffbb800
95#define OMAP7XX_DSP_M_CTL 0xfffbb804
96#define OMAP7XX_DSP_MMU_BASE 0xfffed200
97
98/*
99 * ----------------------------------------------------------------------------
100 * OMAP7XX PCC_UPLD configuration registers
101 * ----------------------------------------------------------------------------
102 */
103#define OMAP7XX_PCC_UPLD_CTRL_BASE (0xfffe0900)
104#define OMAP7XX_PCC_UPLD_CTRL (OMAP7XX_PCC_UPLD_CTRL_BASE + 0x00)
105
106#endif /* __ASM_ARCH_OMAP7XX_H */
107
diff --git a/arch/arm/plat-omap/include/mach/omap850.h b/arch/arm/plat-omap/include/plat/omap850.h
index c33f67981712..c33f67981712 100644
--- a/arch/arm/plat-omap/include/mach/omap850.h
+++ b/arch/arm/plat-omap/include/plat/omap850.h
diff --git a/arch/arm/plat-omap/include/mach/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h
index bd0e136db337..3694b622c4ac 100644
--- a/arch/arm/plat-omap/include/mach/omap_device.h
+++ b/arch/arm/plat-omap/include/plat/omap_device.h
@@ -34,7 +34,7 @@
34#include <linux/kernel.h> 34#include <linux/kernel.h>
35#include <linux/platform_device.h> 35#include <linux/platform_device.h>
36 36
37#include <mach/omap_hwmod.h> 37#include <plat/omap_hwmod.h>
38 38
39/* omap_device._state values */ 39/* omap_device._state values */
40#define OMAP_DEVICE_STATE_UNKNOWN 0 40#define OMAP_DEVICE_STATE_UNKNOWN 0
@@ -50,8 +50,8 @@
50 * @pm_lats: ptr to an omap_device_pm_latency table 50 * @pm_lats: ptr to an omap_device_pm_latency table
51 * @pm_lats_cnt: ARRAY_SIZE() of what is passed to @pm_lats 51 * @pm_lats_cnt: ARRAY_SIZE() of what is passed to @pm_lats
52 * @pm_lat_level: array index of the last odpl entry executed - -1 if never 52 * @pm_lat_level: array index of the last odpl entry executed - -1 if never
53 * @dev_wakeup_lat: dev wakeup latency in microseconds 53 * @dev_wakeup_lat: dev wakeup latency in nanoseconds
54 * @_dev_wakeup_lat_limit: dev wakeup latency limit in usec - set by OMAP PM 54 * @_dev_wakeup_lat_limit: dev wakeup latency limit in nsec - set by OMAP PM
55 * @_state: one of OMAP_DEVICE_STATE_* (see above) 55 * @_state: one of OMAP_DEVICE_STATE_* (see above)
56 * @flags: device flags 56 * @flags: device flags
57 * 57 *
@@ -62,6 +62,7 @@
62 * 62 *
63 */ 63 */
64struct omap_device { 64struct omap_device {
65 u32 magic;
65 struct platform_device pdev; 66 struct platform_device pdev;
66 struct omap_hwmod **hwmods; 67 struct omap_hwmod **hwmods;
67 struct omap_device_pm_latency *pm_lats; 68 struct omap_device_pm_latency *pm_lats;
@@ -81,6 +82,7 @@ int omap_device_shutdown(struct platform_device *pdev);
81 82
82/* Core code interface */ 83/* Core code interface */
83 84
85bool omap_device_is_valid(struct omap_device *od);
84int omap_device_count_resources(struct omap_device *od); 86int omap_device_count_resources(struct omap_device *od);
85int omap_device_fill_resources(struct omap_device *od, struct resource *res); 87int omap_device_fill_resources(struct omap_device *od, struct resource *res);
86 88
@@ -88,15 +90,16 @@ struct omap_device *omap_device_build(const char *pdev_name, int pdev_id,
88 struct omap_hwmod *oh, void *pdata, 90 struct omap_hwmod *oh, void *pdata,
89 int pdata_len, 91 int pdata_len,
90 struct omap_device_pm_latency *pm_lats, 92 struct omap_device_pm_latency *pm_lats,
91 int pm_lats_cnt); 93 int pm_lats_cnt, int is_early_device);
92 94
93struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, 95struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
94 struct omap_hwmod **oh, int oh_cnt, 96 struct omap_hwmod **oh, int oh_cnt,
95 void *pdata, int pdata_len, 97 void *pdata, int pdata_len,
96 struct omap_device_pm_latency *pm_lats, 98 struct omap_device_pm_latency *pm_lats,
97 int pm_lats_cnt); 99 int pm_lats_cnt, int is_early_device);
98 100
99int omap_device_register(struct omap_device *od); 101int omap_device_register(struct omap_device *od);
102int omap_early_device_register(struct omap_device *od);
100 103
101/* OMAP PM interface */ 104/* OMAP PM interface */
102int omap_device_align_pm_lat(struct platform_device *pdev, 105int omap_device_align_pm_lat(struct platform_device *pdev,
@@ -131,11 +134,17 @@ int omap_device_enable_clocks(struct omap_device *od);
131 */ 134 */
132struct omap_device_pm_latency { 135struct omap_device_pm_latency {
133 u32 deactivate_lat; 136 u32 deactivate_lat;
137 u32 deactivate_lat_worst;
134 int (*deactivate_func)(struct omap_device *od); 138 int (*deactivate_func)(struct omap_device *od);
135 u32 activate_lat; 139 u32 activate_lat;
140 u32 activate_lat_worst;
136 int (*activate_func)(struct omap_device *od); 141 int (*activate_func)(struct omap_device *od);
142 u32 flags;
137}; 143};
138 144
145#define OMAP_DEVICE_LATENCY_AUTO_ADJUST BIT(1)
139 146
140#endif 147/* Get omap_device pointer from platform_device pointer */
148#define to_omap_device(x) container_of((x), struct omap_device, pdev)
141 149
150#endif
diff --git a/arch/arm/plat-omap/include/mach/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index 1f79c20e2929..36d6ea56ab51 100644
--- a/arch/arm/plat-omap/include/mach/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -4,7 +4,7 @@
4 * Copyright (C) 2009 Nokia Corporation 4 * Copyright (C) 2009 Nokia Corporation
5 * Paul Walmsley 5 * Paul Walmsley
6 * 6 *
7 * Created in collaboration with (alphabetical order): Benoit Cousson, 7 * Created in collaboration with (alphabetical order): Benoît Cousson,
8 * Kevin Hilman, Tony Lindgren, Rajendra Nayak, Vikram Pandita, Sakari 8 * Kevin Hilman, Tony Lindgren, Rajendra Nayak, Vikram Pandita, Sakari
9 * Poussa, Anand Sawant, Santosh Shilimkar, Richard Woodruff 9 * Poussa, Anand Sawant, Santosh Shilimkar, Richard Woodruff
10 * 10 *
@@ -33,23 +33,42 @@
33#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H 33#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H
34 34
35#include <linux/kernel.h> 35#include <linux/kernel.h>
36#include <linux/list.h>
36#include <linux/ioport.h> 37#include <linux/ioport.h>
37 38#include <plat/cpu.h>
38#include <mach/cpu.h>
39 39
40struct omap_device; 40struct omap_device;
41 41
42/* OCP SYSCONFIG bit shifts/masks */ 42extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1;
43#define SYSC_MIDLEMODE_SHIFT 12 43extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2;
44#define SYSC_MIDLEMODE_MASK (0x3 << SYSC_MIDLEMODE_SHIFT) 44
45#define SYSC_CLOCKACTIVITY_SHIFT 8 45/*
46#define SYSC_CLOCKACTIVITY_MASK (0x3 << SYSC_CLOCKACTIVITY_SHIFT) 46 * OCP SYSCONFIG bit shifts/masks TYPE1. These are for IPs compliant
47#define SYSC_SIDLEMODE_SHIFT 3 47 * with the original PRCM protocol defined for OMAP2420
48#define SYSC_SIDLEMODE_MASK (0x3 << SYSC_SIDLEMODE_SHIFT) 48 */
49#define SYSC_ENAWAKEUP_SHIFT 2 49#define SYSC_TYPE1_MIDLEMODE_SHIFT 12
50#define SYSC_ENAWAKEUP_MASK (1 << SYSC_ENAWAKEUP_SHIFT) 50#define SYSC_TYPE1_MIDLEMODE_MASK (0x3 << SYSC_MIDLEMODE_SHIFT)
51#define SYSC_SOFTRESET_SHIFT 1 51#define SYSC_TYPE1_CLOCKACTIVITY_SHIFT 8
52#define SYSC_SOFTRESET_MASK (1 << SYSC_SOFTRESET_SHIFT) 52#define SYSC_TYPE1_CLOCKACTIVITY_MASK (0x3 << SYSC_CLOCKACTIVITY_SHIFT)
53#define SYSC_TYPE1_SIDLEMODE_SHIFT 3
54#define SYSC_TYPE1_SIDLEMODE_MASK (0x3 << SYSC_SIDLEMODE_SHIFT)
55#define SYSC_TYPE1_ENAWAKEUP_SHIFT 2
56#define SYSC_TYPE1_ENAWAKEUP_MASK (1 << SYSC_ENAWAKEUP_SHIFT)
57#define SYSC_TYPE1_SOFTRESET_SHIFT 1
58#define SYSC_TYPE1_SOFTRESET_MASK (1 << SYSC_SOFTRESET_SHIFT)
59#define SYSC_TYPE1_AUTOIDLE_SHIFT 0
60#define SYSC_TYPE1_AUTOIDLE_MASK (1 << SYSC_AUTOIDLE_SHIFT)
61
62/*
63 * OCP SYSCONFIG bit shifts/masks TYPE2. These are for IPs compliant
64 * with the new PRCM protocol defined for new OMAP4 IPs.
65 */
66#define SYSC_TYPE2_SOFTRESET_SHIFT 0
67#define SYSC_TYPE2_SOFTRESET_MASK (1 << SYSC_TYPE2_SOFTRESET_SHIFT)
68#define SYSC_TYPE2_SIDLEMODE_SHIFT 2
69#define SYSC_TYPE2_SIDLEMODE_MASK (0x3 << SYSC_TYPE2_SIDLEMODE_SHIFT)
70#define SYSC_TYPE2_MIDLEMODE_SHIFT 4
71#define SYSC_TYPE2_MIDLEMODE_MASK (0x3 << SYSC_TYPE2_MIDLEMODE_SHIFT)
53 72
54/* OCP SYSSTATUS bit shifts/masks */ 73/* OCP SYSSTATUS bit shifts/masks */
55#define SYSS_RESETDONE_SHIFT 0 74#define SYSS_RESETDONE_SHIFT 0
@@ -60,9 +79,22 @@ struct omap_device;
60#define HWMOD_IDLEMODE_NO (1 << 1) 79#define HWMOD_IDLEMODE_NO (1 << 1)
61#define HWMOD_IDLEMODE_SMART (1 << 2) 80#define HWMOD_IDLEMODE_SMART (1 << 2)
62 81
82/**
83 * struct omap_hwmod_irq_info - MPU IRQs used by the hwmod
84 * @name: name of the IRQ channel (module local name)
85 * @irq_ch: IRQ channel ID
86 *
87 * @name should be something short, e.g., "tx" or "rx". It is for use
88 * by platform_get_resource_byname(). It is defined locally to the
89 * hwmod.
90 */
91struct omap_hwmod_irq_info {
92 const char *name;
93 u16 irq;
94};
63 95
64/** 96/**
65 * struct omap_hwmod_dma_info - MPU address space handled by the hwmod 97 * struct omap_hwmod_dma_info - DMA channels used by the hwmod
66 * @name: name of the DMA channel (module local name) 98 * @name: name of the DMA channel (module local name)
67 * @dma_ch: DMA channel ID 99 * @dma_ch: DMA channel ID
68 * 100 *
@@ -78,8 +110,7 @@ struct omap_hwmod_dma_info {
78/** 110/**
79 * struct omap_hwmod_opt_clk - optional clocks used by this hwmod 111 * struct omap_hwmod_opt_clk - optional clocks used by this hwmod
80 * @role: "sys", "32k", "tv", etc -- for use in clk_get() 112 * @role: "sys", "32k", "tv", etc -- for use in clk_get()
81 * @clkdev_dev_id: opt clock: clkdev dev_id string 113 * @clk: opt clock: OMAP clock name
82 * @clkdev_con_id: opt clock: clkdev con_id string
83 * @_clk: pointer to the struct clk (filled in at runtime) 114 * @_clk: pointer to the struct clk (filled in at runtime)
84 * 115 *
85 * The module's interface clock and main functional clock should not 116 * The module's interface clock and main functional clock should not
@@ -87,8 +118,7 @@ struct omap_hwmod_dma_info {
87 */ 118 */
88struct omap_hwmod_opt_clk { 119struct omap_hwmod_opt_clk {
89 const char *role; 120 const char *role;
90 const char *clkdev_dev_id; 121 const char *clk;
91 const char *clkdev_con_id;
92 struct clk *_clk; 122 struct clk *_clk;
93}; 123};
94 124
@@ -155,8 +185,7 @@ struct omap_hwmod_addr_space {
155 * @master: struct omap_hwmod that initiates OCP transactions on this link 185 * @master: struct omap_hwmod that initiates OCP transactions on this link
156 * @slave: struct omap_hwmod that responds to OCP transactions on this link 186 * @slave: struct omap_hwmod that responds to OCP transactions on this link
157 * @addr: address space associated with this link 187 * @addr: address space associated with this link
158 * @clkdev_dev_id: interface clock: clkdev dev_id string 188 * @clk: interface clock: OMAP clock name
159 * @clkdev_con_id: interface clock: clkdev con_id string
160 * @_clk: pointer to the interface struct clk (filled in at runtime) 189 * @_clk: pointer to the interface struct clk (filled in at runtime)
161 * @fw: interface firewall data 190 * @fw: interface firewall data
162 * @addr_cnt: ARRAY_SIZE(@addr) 191 * @addr_cnt: ARRAY_SIZE(@addr)
@@ -175,8 +204,7 @@ struct omap_hwmod_ocp_if {
175 struct omap_hwmod *master; 204 struct omap_hwmod *master;
176 struct omap_hwmod *slave; 205 struct omap_hwmod *slave;
177 struct omap_hwmod_addr_space *addr; 206 struct omap_hwmod_addr_space *addr;
178 const char *clkdev_dev_id; 207 const char *clk;
179 const char *clkdev_con_id;
180 struct clk *_clk; 208 struct clk *_clk;
181 union { 209 union {
182 struct omap_hwmod_omap2_firewall omap2; 210 struct omap_hwmod_omap2_firewall omap2;
@@ -211,6 +239,7 @@ struct omap_hwmod_ocp_if {
211#define SYSC_HAS_SIDLEMODE (1 << 5) 239#define SYSC_HAS_SIDLEMODE (1 << 5)
212#define SYSC_HAS_MIDLEMODE (1 << 6) 240#define SYSC_HAS_MIDLEMODE (1 << 6)
213#define SYSS_MISSING (1 << 7) 241#define SYSS_MISSING (1 << 7)
242#define SYSC_NO_CACHE (1 << 8) /* XXX SW flag, belongs elsewhere */
214 243
215/* omap_hwmod_sysconfig.clockact flags */ 244/* omap_hwmod_sysconfig.clockact flags */
216#define CLOCKACT_TEST_BOTH 0x0 245#define CLOCKACT_TEST_BOTH 0x0
@@ -219,7 +248,25 @@ struct omap_hwmod_ocp_if {
219#define CLOCKACT_TEST_NONE 0x3 248#define CLOCKACT_TEST_NONE 0x3
220 249
221/** 250/**
222 * struct omap_hwmod_sysconfig - hwmod OCP_SYSCONFIG/OCP_SYSSTATUS data 251 * struct omap_hwmod_sysc_fields - hwmod OCP_SYSCONFIG register field offsets.
252 * @midle_shift: Offset of the midle bit
253 * @clkact_shift: Offset of the clockactivity bit
254 * @sidle_shift: Offset of the sidle bit
255 * @enwkup_shift: Offset of the enawakeup bit
256 * @srst_shift: Offset of the softreset bit
257 * @autoidle_shift: Offset of the autoidle bit
258 */
259struct omap_hwmod_sysc_fields {
260 u8 midle_shift;
261 u8 clkact_shift;
262 u8 sidle_shift;
263 u8 enwkup_shift;
264 u8 srst_shift;
265 u8 autoidle_shift;
266};
267
268/**
269 * struct omap_hwmod_class_sysconfig - hwmod class OCP_SYS* data
223 * @rev_offs: IP block revision register offset (from module base addr) 270 * @rev_offs: IP block revision register offset (from module base addr)
224 * @sysc_offs: OCP_SYSCONFIG register offset (from module base addr) 271 * @sysc_offs: OCP_SYSCONFIG register offset (from module base addr)
225 * @syss_offs: OCP_SYSSTATUS register offset (from module base addr) 272 * @syss_offs: OCP_SYSSTATUS register offset (from module base addr)
@@ -235,14 +282,22 @@ struct omap_hwmod_ocp_if {
235 * been associated with the clocks marked in @clockact. This field is 282 * been associated with the clocks marked in @clockact. This field is
236 * only used if HWMOD_SET_DEFAULT_CLOCKACT is set (see below) 283 * only used if HWMOD_SET_DEFAULT_CLOCKACT is set (see below)
237 * 284 *
285 * @sysc_fields: structure containing the offset positions of various bits in
286 * SYSCONFIG register. This can be populated using omap_hwmod_sysc_type1 or
287 * omap_hwmod_sysc_type2 defined in omap_hwmod_common_data.c depending on
288 * whether the device ip is compliant with the original PRCM protocol
289 * defined for OMAP2420 or the new PRCM protocol for new OMAP4 IPs.
290 * If the device follows a different scheme for the sysconfig register ,
291 * then this field has to be populated with the correct offset structure.
238 */ 292 */
239struct omap_hwmod_sysconfig { 293struct omap_hwmod_class_sysconfig {
240 u16 rev_offs; 294 u16 rev_offs;
241 u16 sysc_offs; 295 u16 sysc_offs;
242 u16 syss_offs; 296 u16 syss_offs;
297 u16 sysc_flags;
243 u8 idlemodes; 298 u8 idlemodes;
244 u8 sysc_flags;
245 u8 clockact; 299 u8 clockact;
300 struct omap_hwmod_sysc_fields *sysc_fields;
246}; 301};
247 302
248/** 303/**
@@ -294,13 +349,17 @@ struct omap_hwmod_omap4_prcm {
294 * SDRAM controller, etc. 349 * SDRAM controller, etc.
295 * HWMOD_INIT_NO_IDLE: don't idle this module at boot - important for SDRAM 350 * HWMOD_INIT_NO_IDLE: don't idle this module at boot - important for SDRAM
296 * controller, etc. 351 * controller, etc.
352 * HWMOD_NO_AUTOIDLE: disable module autoidle (OCP_SYSCONFIG.AUTOIDLE)
353 * when module is enabled, rather than the default, which is to
354 * enable autoidle
297 * HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup 355 * HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup
298 */ 356 */
299#define HWMOD_SWSUP_SIDLE (1 << 0) 357#define HWMOD_SWSUP_SIDLE (1 << 0)
300#define HWMOD_SWSUP_MSTANDBY (1 << 1) 358#define HWMOD_SWSUP_MSTANDBY (1 << 1)
301#define HWMOD_INIT_NO_RESET (1 << 2) 359#define HWMOD_INIT_NO_RESET (1 << 2)
302#define HWMOD_INIT_NO_IDLE (1 << 3) 360#define HWMOD_INIT_NO_IDLE (1 << 3)
303#define HWMOD_SET_DEFAULT_CLOCKACT (1 << 4) 361#define HWMOD_NO_OCP_AUTOIDLE (1 << 4)
362#define HWMOD_SET_DEFAULT_CLOCKACT (1 << 5)
304 363
305/* 364/*
306 * omap_hwmod._int_flags definitions 365 * omap_hwmod._int_flags definitions
@@ -331,19 +390,33 @@ struct omap_hwmod_omap4_prcm {
331#define _HWMOD_STATE_DISABLED 6 390#define _HWMOD_STATE_DISABLED 6
332 391
333/** 392/**
393 * struct omap_hwmod_class - the type of an IP block
394 * @name: name of the hwmod_class
395 * @sysc: device SYSCONFIG/SYSSTATUS register data
396 * @rev: revision of the IP class
397 *
398 * Represent the class of a OMAP hardware "modules" (e.g. timer,
399 * smartreflex, gpio, uart...)
400 */
401struct omap_hwmod_class {
402 const char *name;
403 struct omap_hwmod_class_sysconfig *sysc;
404 u32 rev;
405};
406
407/**
334 * struct omap_hwmod - integration data for OMAP hardware "modules" (IP blocks) 408 * struct omap_hwmod - integration data for OMAP hardware "modules" (IP blocks)
335 * @name: name of the hwmod 409 * @name: name of the hwmod
410 * @class: struct omap_hwmod_class * to the class of this hwmod
336 * @od: struct omap_device currently associated with this hwmod (internal use) 411 * @od: struct omap_device currently associated with this hwmod (internal use)
337 * @mpu_irqs: ptr to an array of MPU IRQs (see also mpu_irqs_cnt) 412 * @mpu_irqs: ptr to an array of MPU IRQs (see also mpu_irqs_cnt)
338 * @sdma_chs: ptr to an array of SDMA channel IDs (see also sdma_chs_cnt) 413 * @sdma_chs: ptr to an array of SDMA channel IDs (see also sdma_chs_cnt)
339 * @prcm: PRCM data pertaining to this hwmod 414 * @prcm: PRCM data pertaining to this hwmod
340 * @clkdev_dev_id: main clock: clkdev dev_id string 415 * @main_clk: main clock: OMAP clock name
341 * @clkdev_con_id: main clock: clkdev con_id string
342 * @_clk: pointer to the main struct clk (filled in at runtime) 416 * @_clk: pointer to the main struct clk (filled in at runtime)
343 * @opt_clks: other device clocks that drivers can request (0..*) 417 * @opt_clks: other device clocks that drivers can request (0..*)
344 * @masters: ptr to array of OCP ifs that this hwmod can initiate on 418 * @masters: ptr to array of OCP ifs that this hwmod can initiate on
345 * @slaves: ptr to array of OCP ifs that this hwmod can respond on 419 * @slaves: ptr to array of OCP ifs that this hwmod can respond on
346 * @sysconfig: device SYSCONFIG/SYSSTATUS register data
347 * @dev_attr: arbitrary device attributes that can be passed to the driver 420 * @dev_attr: arbitrary device attributes that can be passed to the driver
348 * @_sysc_cache: internal-use hwmod flags 421 * @_sysc_cache: internal-use hwmod flags
349 * @_rt_va: cached register target start address (internal use) 422 * @_rt_va: cached register target start address (internal use)
@@ -362,30 +435,29 @@ struct omap_hwmod_omap4_prcm {
362 * @omap_chip: OMAP chips this hwmod is present on 435 * @omap_chip: OMAP chips this hwmod is present on
363 * @node: list node for hwmod list (internal use) 436 * @node: list node for hwmod list (internal use)
364 * 437 *
365 * @clkdev_dev_id, @clkdev_con_id, and @clk all refer to this module's "main 438 * @main_clk refers to this module's "main clock," which for our
366 * clock," which for our purposes is defined as "the functional clock needed 439 * purposes is defined as "the functional clock needed for register
367 * for register accesses to complete." Modules may not have a main clock if 440 * accesses to complete." Modules may not have a main clock if the
368 * the interface clock also serves as a main clock. 441 * interface clock also serves as a main clock.
369 * 442 *
370 * Parameter names beginning with an underscore are managed internally by 443 * Parameter names beginning with an underscore are managed internally by
371 * the omap_hwmod code and should not be set during initialization. 444 * the omap_hwmod code and should not be set during initialization.
372 */ 445 */
373struct omap_hwmod { 446struct omap_hwmod {
374 const char *name; 447 const char *name;
448 struct omap_hwmod_class *class;
375 struct omap_device *od; 449 struct omap_device *od;
376 u8 *mpu_irqs; 450 struct omap_hwmod_irq_info *mpu_irqs;
377 struct omap_hwmod_dma_info *sdma_chs; 451 struct omap_hwmod_dma_info *sdma_chs;
378 union { 452 union {
379 struct omap_hwmod_omap2_prcm omap2; 453 struct omap_hwmod_omap2_prcm omap2;
380 struct omap_hwmod_omap4_prcm omap4; 454 struct omap_hwmod_omap4_prcm omap4;
381 } prcm; 455 } prcm;
382 const char *clkdev_dev_id; 456 const char *main_clk;
383 const char *clkdev_con_id;
384 struct clk *_clk; 457 struct clk *_clk;
385 struct omap_hwmod_opt_clk *opt_clks; 458 struct omap_hwmod_opt_clk *opt_clks;
386 struct omap_hwmod_ocp_if **masters; /* connect to *_IA */ 459 struct omap_hwmod_ocp_if **masters; /* connect to *_IA */
387 struct omap_hwmod_ocp_if **slaves; /* connect to *_TA */ 460 struct omap_hwmod_ocp_if **slaves; /* connect to *_TA */
388 struct omap_hwmod_sysconfig *sysconfig;
389 void *dev_attr; 461 void *dev_attr;
390 u32 _sysc_cache; 462 u32 _sysc_cache;
391 void __iomem *_rt_va; 463 void __iomem *_rt_va;
@@ -420,6 +492,8 @@ int omap_hwmod_shutdown(struct omap_hwmod *oh);
420int omap_hwmod_enable_clocks(struct omap_hwmod *oh); 492int omap_hwmod_enable_clocks(struct omap_hwmod *oh);
421int omap_hwmod_disable_clocks(struct omap_hwmod *oh); 493int omap_hwmod_disable_clocks(struct omap_hwmod *oh);
422 494
495int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode);
496
423int omap_hwmod_reset(struct omap_hwmod *oh); 497int omap_hwmod_reset(struct omap_hwmod *oh);
424void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); 498void omap_hwmod_ocp_barrier(struct omap_hwmod *oh);
425 499
@@ -444,4 +518,17 @@ int omap_hwmod_set_clockact_none(struct omap_hwmod *oh);
444int omap_hwmod_enable_wakeup(struct omap_hwmod *oh); 518int omap_hwmod_enable_wakeup(struct omap_hwmod *oh);
445int omap_hwmod_disable_wakeup(struct omap_hwmod *oh); 519int omap_hwmod_disable_wakeup(struct omap_hwmod *oh);
446 520
521int omap_hwmod_for_each_by_class(const char *classname,
522 int (*fn)(struct omap_hwmod *oh,
523 void *user),
524 void *user);
525
526/*
527 * Chip variant-specific hwmod init routines - XXX should be converted
528 * to use initcalls once the initial boot ordering is straightened out
529 */
530extern int omap2420_hwmod_init(void);
531extern int omap2430_hwmod_init(void);
532extern int omap3xxx_hwmod_init(void);
533
447#endif 534#endif
diff --git a/arch/arm/plat-omap/include/mach/onenand.h b/arch/arm/plat-omap/include/plat/onenand.h
index 72f433d7d827..72f433d7d827 100644
--- a/arch/arm/plat-omap/include/mach/onenand.h
+++ b/arch/arm/plat-omap/include/plat/onenand.h
diff --git a/arch/arm/plat-omap/include/mach/param.h b/arch/arm/plat-omap/include/plat/param.h
index 1eb4dc326979..1eb4dc326979 100644
--- a/arch/arm/plat-omap/include/mach/param.h
+++ b/arch/arm/plat-omap/include/plat/param.h
diff --git a/arch/arm/plat-omap/include/mach/powerdomain.h b/arch/arm/plat-omap/include/plat/powerdomain.h
index fa6461423bd0..d82b2c00d4f1 100644
--- a/arch/arm/plat-omap/include/mach/powerdomain.h
+++ b/arch/arm/plat-omap/include/plat/powerdomain.h
@@ -1,8 +1,8 @@
1/* 1/*
2 * OMAP2/3 powerdomain control 2 * OMAP2/3 powerdomain control
3 * 3 *
4 * Copyright (C) 2007-8 Texas Instruments, Inc. 4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-8 Nokia Corporation 5 * Copyright (C) 2007-2009 Nokia Corporation
6 * 6 *
7 * Written by Paul Walmsley 7 * Written by Paul Walmsley
8 * 8 *
@@ -19,7 +19,7 @@
19 19
20#include <asm/atomic.h> 20#include <asm/atomic.h>
21 21
22#include <mach/cpu.h> 22#include <plat/cpu.h>
23 23
24 24
25/* Powerdomain basic power states */ 25/* Powerdomain basic power states */
@@ -28,6 +28,8 @@
28#define PWRDM_POWER_INACTIVE 0x2 28#define PWRDM_POWER_INACTIVE 0x2
29#define PWRDM_POWER_ON 0x3 29#define PWRDM_POWER_ON 0x3
30 30
31#define PWRDM_MAX_PWRSTS 4
32
31/* Powerdomain allowable state bitfields */ 33/* Powerdomain allowable state bitfields */
32#define PWRSTS_OFF_ON ((1 << PWRDM_POWER_OFF) | \ 34#define PWRSTS_OFF_ON ((1 << PWRDM_POWER_OFF) | \
33 (1 << PWRDM_POWER_ON)) 35 (1 << PWRDM_POWER_ON))
@@ -35,24 +37,30 @@
35#define PWRSTS_OFF_RET ((1 << PWRDM_POWER_OFF) | \ 37#define PWRSTS_OFF_RET ((1 << PWRDM_POWER_OFF) | \
36 (1 << PWRDM_POWER_RET)) 38 (1 << PWRDM_POWER_RET))
37 39
40#define PWRSTS_RET_ON ((1 << PWRDM_POWER_RET) | \
41 (1 << PWRDM_POWER_ON))
42
38#define PWRSTS_OFF_RET_ON (PWRSTS_OFF_RET | (1 << PWRDM_POWER_ON)) 43#define PWRSTS_OFF_RET_ON (PWRSTS_OFF_RET | (1 << PWRDM_POWER_ON))
39 44
40 45
41/* Powerdomain flags */ 46/* Powerdomain flags */
42#define PWRDM_HAS_HDWR_SAR (1 << 0) /* hardware save-and-restore support */ 47#define PWRDM_HAS_HDWR_SAR (1 << 0) /* hardware save-and-restore support */
43 48#define PWRDM_HAS_MPU_QUIRK (1 << 1) /* MPU pwr domain has MEM bank 0 bits
49 * in MEM bank 1 position. This is
50 * true for OMAP3430
51 */
44 52
45/* 53/*
46 * Number of memory banks that are power-controllable. On OMAP3430, the 54 * Number of memory banks that are power-controllable. On OMAP4430, the
47 * maximum is 4. 55 * maximum is 5.
48 */ 56 */
49#define PWRDM_MAX_MEM_BANKS 4 57#define PWRDM_MAX_MEM_BANKS 5
50 58
51/* 59/*
52 * Maximum number of clockdomains that can be associated with a powerdomain. 60 * Maximum number of clockdomains that can be associated with a powerdomain.
53 * CORE powerdomain on OMAP3 is the worst case 61 * CORE powerdomain on OMAP4 is the worst case
54 */ 62 */
55#define PWRDM_MAX_CLKDMS 4 63#define PWRDM_MAX_CLKDMS 9
56 64
57/* XXX A completely arbitrary number. What is reasonable here? */ 65/* XXX A completely arbitrary number. What is reasonable here? */
58#define PWRDM_TRANSITION_BAILOUT 100000 66#define PWRDM_TRANSITION_BAILOUT 100000
@@ -60,77 +68,50 @@
60struct clockdomain; 68struct clockdomain;
61struct powerdomain; 69struct powerdomain;
62 70
63/* Encodes dependencies between powerdomains - statically defined */ 71/**
64struct pwrdm_dep { 72 * struct powerdomain - OMAP powerdomain
65 73 * @name: Powerdomain name
66 /* Powerdomain name */ 74 * @omap_chip: represents the OMAP chip types containing this pwrdm
67 const char *pwrdm_name; 75 * @prcm_offs: the address offset from CM_BASE/PRM_BASE
68 76 * @pwrsts: Possible powerdomain power states
69 /* Powerdomain pointer - resolved by the powerdomain code */ 77 * @pwrsts_logic_ret: Possible logic power states when pwrdm in RETENTION
70 struct powerdomain *pwrdm; 78 * @flags: Powerdomain flags
71 79 * @banks: Number of software-controllable memory banks in this powerdomain
72 /* Flags to mark OMAP chip restrictions, etc. */ 80 * @pwrsts_mem_ret: Possible memory bank pwrstates when pwrdm in RETENTION
73 const struct omap_chip_id omap_chip; 81 * @pwrsts_mem_on: Possible memory bank pwrstates when pwrdm in ON
74 82 * @pwrdm_clkdms: Clockdomains in this powerdomain
75}; 83 * @node: list_head linking all powerdomains
76 84 * @state:
85 * @state_counter:
86 * @timer:
87 * @state_timer:
88 */
77struct powerdomain { 89struct powerdomain {
78
79 /* Powerdomain name */
80 const char *name; 90 const char *name;
81
82 /* the address offset from CM_BASE/PRM_BASE */
83 const s16 prcm_offs;
84
85 /* Used to represent the OMAP chip types containing this pwrdm */
86 const struct omap_chip_id omap_chip; 91 const struct omap_chip_id omap_chip;
87 92 const s16 prcm_offs;
88 /* Bit shift of this powerdomain's PM_WKDEP/CM_SLEEPDEP bit */
89 const u8 dep_bit;
90
91 /* Powerdomains that can be told to wake this powerdomain up */
92 struct pwrdm_dep *wkdep_srcs;
93
94 /* Powerdomains that can be told to keep this pwrdm from inactivity */
95 struct pwrdm_dep *sleepdep_srcs;
96
97 /* Possible powerdomain power states */
98 const u8 pwrsts; 93 const u8 pwrsts;
99
100 /* Possible logic power states when pwrdm in RETENTION */
101 const u8 pwrsts_logic_ret; 94 const u8 pwrsts_logic_ret;
102
103 /* Powerdomain flags */
104 const u8 flags; 95 const u8 flags;
105
106 /* Number of software-controllable memory banks in this powerdomain */
107 const u8 banks; 96 const u8 banks;
108
109 /* Possible memory bank pwrstates when pwrdm in RETENTION */
110 const u8 pwrsts_mem_ret[PWRDM_MAX_MEM_BANKS]; 97 const u8 pwrsts_mem_ret[PWRDM_MAX_MEM_BANKS];
111
112 /* Possible memory bank pwrstates when pwrdm is ON */
113 const u8 pwrsts_mem_on[PWRDM_MAX_MEM_BANKS]; 98 const u8 pwrsts_mem_on[PWRDM_MAX_MEM_BANKS];
114
115 /* Clockdomains in this powerdomain */
116 struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS]; 99 struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS];
117
118 struct list_head node; 100 struct list_head node;
119
120 int state; 101 int state;
121 unsigned state_counter[4]; 102 unsigned state_counter[PWRDM_MAX_PWRSTS];
103 unsigned ret_logic_off_counter;
104 unsigned ret_mem_off_counter[PWRDM_MAX_MEM_BANKS];
122 105
123#ifdef CONFIG_PM_DEBUG 106#ifdef CONFIG_PM_DEBUG
124 s64 timer; 107 s64 timer;
125 s64 state_timer[4]; 108 s64 state_timer[PWRDM_MAX_PWRSTS];
126#endif 109#endif
127}; 110};
128 111
129 112
130void pwrdm_init(struct powerdomain **pwrdm_list); 113void pwrdm_init(struct powerdomain **pwrdm_list);
131 114
132int pwrdm_register(struct powerdomain *pwrdm);
133int pwrdm_unregister(struct powerdomain *pwrdm);
134struct powerdomain *pwrdm_lookup(const char *name); 115struct powerdomain *pwrdm_lookup(const char *name);
135 116
136int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), 117int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
@@ -144,13 +125,6 @@ int pwrdm_for_each_clkdm(struct powerdomain *pwrdm,
144 int (*fn)(struct powerdomain *pwrdm, 125 int (*fn)(struct powerdomain *pwrdm,
145 struct clockdomain *clkdm)); 126 struct clockdomain *clkdm));
146 127
147int pwrdm_add_wkdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2);
148int pwrdm_del_wkdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2);
149int pwrdm_read_wkdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2);
150int pwrdm_add_sleepdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2);
151int pwrdm_del_sleepdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2);
152int pwrdm_read_sleepdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2);
153
154int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm); 128int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm);
155 129
156int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst); 130int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst);
@@ -165,8 +139,10 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst);
165 139
166int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm); 140int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm);
167int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm); 141int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm);
142int pwrdm_read_logic_retst(struct powerdomain *pwrdm);
168int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank); 143int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank);
169int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank); 144int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank);
145int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank);
170 146
171int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm); 147int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm);
172int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm); 148int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm);
diff --git a/arch/arm/plat-omap/include/mach/prcm.h b/arch/arm/plat-omap/include/plat/prcm.h
index cda2a70397b4..9fbd91419cd1 100644
--- a/arch/arm/plat-omap/include/mach/prcm.h
+++ b/arch/arm/plat-omap/include/plat/prcm.h
@@ -24,12 +24,25 @@
24#define __ASM_ARM_ARCH_OMAP_PRCM_H 24#define __ASM_ARM_ARCH_OMAP_PRCM_H
25 25
26u32 omap_prcm_get_reset_sources(void); 26u32 omap_prcm_get_reset_sources(void);
27void omap_prcm_arch_reset(char mode); 27void omap_prcm_arch_reset(char mode, const char *cmd);
28int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name); 28int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest,
29 const char *name);
29 30
30#endif 31#define START_PADCONF_SAVE 0x2
32#define PADCONF_SAVE_DONE 0x1
33
34void omap3_prcm_save_context(void);
35void omap3_prcm_restore_context(void);
31 36
37u32 prm_read_mod_reg(s16 module, u16 idx);
38void prm_write_mod_reg(u32 val, s16 module, u16 idx);
39u32 prm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx);
40u32 prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask);
41u32 cm_read_mod_reg(s16 module, u16 idx);
42void cm_write_mod_reg(u32 val, s16 module, u16 idx);
43u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx);
32 44
45#endif
33 46
34 47
35 48
diff --git a/arch/arm/plat-omap/include/mach/sdrc.h b/arch/arm/plat-omap/include/plat/sdrc.h
index 1c09c78a48f2..7b76f50564ba 100644
--- a/arch/arm/plat-omap/include/mach/sdrc.h
+++ b/arch/arm/plat-omap/include/plat/sdrc.h
@@ -44,6 +44,12 @@
44#define SDRC_RFR_CTRL_1 0x0D4 44#define SDRC_RFR_CTRL_1 0x0D4
45#define SDRC_MANUAL_1 0x0D8 45#define SDRC_MANUAL_1 0x0D8
46 46
47#define SDRC_POWER_AUTOCOUNT_SHIFT 8
48#define SDRC_POWER_AUTOCOUNT_MASK (0xffff << SDRC_POWER_AUTOCOUNT_SHIFT)
49#define SDRC_POWER_CLKCTRL_SHIFT 4
50#define SDRC_POWER_CLKCTRL_MASK (0x3 << SDRC_POWER_CLKCTRL_SHIFT)
51#define SDRC_SELF_REFRESH_ON_AUTOCOUNT (0x2 << SDRC_POWER_CLKCTRL_SHIFT)
52
47/* 53/*
48 * These values represent the number of memory clock cycles between 54 * These values represent the number of memory clock cycles between
49 * autorefresh initiation. They assume 1 refresh per 64 ms (JEDEC), 8192 55 * autorefresh initiation. They assume 1 refresh per 64 ms (JEDEC), 8192
@@ -80,15 +86,18 @@
80 */ 86 */
81 87
82#define OMAP242X_SMS_REGADDR(reg) \ 88#define OMAP242X_SMS_REGADDR(reg) \
83 (void __iomem *)OMAP2_IO_ADDRESS(OMAP2420_SMS_BASE + reg) 89 (void __iomem *)OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE + reg)
84#define OMAP243X_SMS_REGADDR(reg) \ 90#define OMAP243X_SMS_REGADDR(reg) \
85 (void __iomem *)OMAP2_IO_ADDRESS(OMAP243X_SMS_BASE + reg) 91 (void __iomem *)OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE + reg)
86#define OMAP343X_SMS_REGADDR(reg) \ 92#define OMAP343X_SMS_REGADDR(reg) \
87 (void __iomem *)OMAP2_IO_ADDRESS(OMAP343X_SMS_BASE + reg) 93 (void __iomem *)OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE + reg)
88 94
89/* SMS register offsets - read/write with sms_{read,write}_reg() */ 95/* SMS register offsets - read/write with sms_{read,write}_reg() */
90 96
91#define SMS_SYSCONFIG 0x010 97#define SMS_SYSCONFIG 0x010
98#define SMS_ROT_CONTROL(context) (0x180 + 0x10 * context)
99#define SMS_ROT_SIZE(context) (0x184 + 0x10 * context)
100#define SMS_ROT_PHYSICAL_BA(context) (0x188 + 0x10 * context)
92/* REVISIT: fill in other SMS registers here */ 101/* REVISIT: fill in other SMS registers here */
93 102
94 103
@@ -120,6 +129,12 @@ void __init omap2_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
120int omap2_sdrc_get_params(unsigned long r, 129int omap2_sdrc_get_params(unsigned long r,
121 struct omap_sdrc_params **sdrc_cs0, 130 struct omap_sdrc_params **sdrc_cs0,
122 struct omap_sdrc_params **sdrc_cs1); 131 struct omap_sdrc_params **sdrc_cs1);
132void omap2_sms_save_context(void);
133void omap2_sms_restore_context(void);
134
135void omap2_sms_write_rot_control(u32 val, unsigned ctx);
136void omap2_sms_write_rot_size(u32 val, unsigned ctx);
137void omap2_sms_write_rot_physical_ba(u32 val, unsigned ctx);
123 138
124#ifdef CONFIG_ARCH_OMAP2 139#ifdef CONFIG_ARCH_OMAP2
125 140
diff --git a/arch/arm/plat-omap/include/plat/serial.h b/arch/arm/plat-omap/include/plat/serial.h
new file mode 100644
index 000000000000..83dce4c4f7e6
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/serial.h
@@ -0,0 +1,93 @@
1/*
2 * arch/arm/plat-omap/include/mach/serial.h
3 *
4 * Copyright (C) 2009 Texas Instruments
5 * Addded OMAP4 support- Santosh Shilimkar <santosh.shilimkar@ti.com>
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef __ASM_ARCH_SERIAL_H
14#define __ASM_ARCH_SERIAL_H
15
16#include <linux/init.h>
17
18/* OMAP1 serial ports */
19#define OMAP1_UART1_BASE 0xfffb0000
20#define OMAP1_UART2_BASE 0xfffb0800
21#define OMAP1_UART3_BASE 0xfffb9800
22
23/* OMAP2 serial ports */
24#define OMAP2_UART1_BASE 0x4806a000
25#define OMAP2_UART2_BASE 0x4806c000
26#define OMAP2_UART3_BASE 0x4806e000
27
28/* OMAP3 serial ports */
29#define OMAP3_UART1_BASE OMAP2_UART1_BASE
30#define OMAP3_UART2_BASE OMAP2_UART2_BASE
31#define OMAP3_UART3_BASE 0x49020000
32#define OMAP3_UART4_BASE 0x49042000 /* Only on 36xx */
33
34/* OMAP4 serial ports */
35#define OMAP4_UART1_BASE OMAP2_UART1_BASE
36#define OMAP4_UART2_BASE OMAP2_UART2_BASE
37#define OMAP4_UART3_BASE 0x48020000
38#define OMAP4_UART4_BASE 0x4806e000
39
40/* External port on Zoom2/3 */
41#define ZOOM_UART_BASE 0x10000000
42#define ZOOM_UART_VIRT 0xfb000000
43
44#define OMAP_PORT_SHIFT 2
45#define OMAP7XX_PORT_SHIFT 0
46#define ZOOM_PORT_SHIFT 1
47
48#define OMAP1510_BASE_BAUD (12000000/16)
49#define OMAP16XX_BASE_BAUD (48000000/16)
50#define OMAP24XX_BASE_BAUD (48000000/16)
51
52/*
53 * DEBUG_LL port encoding stored into the UART1 scratchpad register by
54 * decomp_setup in uncompress.h
55 */
56#define OMAP1UART1 11
57#define OMAP1UART2 12
58#define OMAP1UART3 13
59#define OMAP2UART1 21
60#define OMAP2UART2 22
61#define OMAP2UART3 23
62#define OMAP3UART1 OMAP2UART1
63#define OMAP3UART2 OMAP2UART2
64#define OMAP3UART3 33
65#define OMAP3UART4 34 /* Only on 36xx */
66#define OMAP4UART1 OMAP2UART1
67#define OMAP4UART2 OMAP2UART2
68#define OMAP4UART3 43
69#define OMAP4UART4 44
70#define ZOOM_UART 95 /* Only on zoom2/3 */
71
72/* This is only used by 8250.c for omap1510 */
73#define is_omap_port(pt) ({int __ret = 0; \
74 if ((pt)->port.mapbase == OMAP1_UART1_BASE || \
75 (pt)->port.mapbase == OMAP1_UART2_BASE || \
76 (pt)->port.mapbase == OMAP1_UART3_BASE) \
77 __ret = 1; \
78 __ret; \
79 })
80
81#ifndef __ASSEMBLER__
82extern void __init omap_serial_early_init(void);
83extern void omap_serial_init(void);
84extern void omap_serial_init_port(int port);
85extern int omap_uart_can_sleep(void);
86extern void omap_uart_check_wakeup(void);
87extern void omap_uart_prepare_suspend(void);
88extern void omap_uart_prepare_idle(int num);
89extern void omap_uart_resume_idle(int num);
90extern void omap_uart_enable_irqs(int enable);
91#endif
92
93#endif
diff --git a/arch/arm/plat-omap/include/mach/smp.h b/arch/arm/plat-omap/include/plat/smp.h
index dcaa8fde7063..8983d54c4fd2 100644
--- a/arch/arm/plat-omap/include/mach/smp.h
+++ b/arch/arm/plat-omap/include/plat/smp.h
@@ -28,6 +28,8 @@
28 28
29/* Needed for secondary core boot */ 29/* Needed for secondary core boot */
30extern void omap_secondary_startup(void); 30extern void omap_secondary_startup(void);
31extern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask);
32extern void omap_auxcoreboot_addr(u32 cpu_addr);
31 33
32/* 34/*
33 * We use Soft IRQ1 as the IPI 35 * We use Soft IRQ1 as the IPI
diff --git a/arch/arm/plat-omap/include/mach/sram.h b/arch/arm/plat-omap/include/plat/sram.h
index 8974e3fc2691..16a1b458d53c 100644
--- a/arch/arm/plat-omap/include/mach/sram.h
+++ b/arch/arm/plat-omap/include/plat/sram.h
@@ -27,6 +27,7 @@ extern u32 omap3_configure_core_dpll(
27 u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, 27 u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0,
28 u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, 28 u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1,
29 u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1); 29 u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1);
30extern void omap3_sram_restore_context(void);
30 31
31/* Do not use these */ 32/* Do not use these */
32extern void omap1_sram_reprogram_clock(u32 ckctl, u32 dpllctl); 33extern void omap1_sram_reprogram_clock(u32 ckctl, u32 dpllctl);
@@ -68,4 +69,10 @@ extern u32 omap3_sram_configure_core_dpll(
68 u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1); 69 u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1);
69extern unsigned long omap3_sram_configure_core_dpll_sz; 70extern unsigned long omap3_sram_configure_core_dpll_sz;
70 71
72#ifdef CONFIG_PM
73extern void omap_push_sram_idle(void);
74#else
75static inline void omap_push_sram_idle(void) {}
76#endif /* CONFIG_PM */
77
71#endif 78#endif
diff --git a/arch/arm/plat-omap/include/mach/system.h b/arch/arm/plat-omap/include/plat/system.h
index ed8ec7477261..d0a119f735b4 100644
--- a/arch/arm/plat-omap/include/mach/system.h
+++ b/arch/arm/plat-omap/include/plat/system.h
@@ -9,7 +9,7 @@
9#include <asm/mach-types.h> 9#include <asm/mach-types.h>
10#include <mach/hardware.h> 10#include <mach/hardware.h>
11 11
12#include <mach/prcm.h> 12#include <plat/prcm.h>
13 13
14#ifndef CONFIG_MACH_VOICEBLUE 14#ifndef CONFIG_MACH_VOICEBLUE
15#define voiceblue_reset() do {} while (0) 15#define voiceblue_reset() do {} while (0)
@@ -22,7 +22,7 @@ static inline void arch_idle(void)
22 cpu_do_idle(); 22 cpu_do_idle();
23} 23}
24 24
25static inline void omap1_arch_reset(char mode) 25static inline void omap1_arch_reset(char mode, const char *cmd)
26{ 26{
27 /* 27 /*
28 * Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28 28 * Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28
@@ -43,9 +43,9 @@ static inline void omap1_arch_reset(char mode)
43static inline void arch_reset(char mode, const char *cmd) 43static inline void arch_reset(char mode, const char *cmd)
44{ 44{
45 if (!cpu_class_is_omap2()) 45 if (!cpu_class_is_omap2())
46 omap1_arch_reset(mode); 46 omap1_arch_reset(mode, cmd);
47 else 47 else
48 omap_prcm_arch_reset(mode); 48 omap_prcm_arch_reset(mode, cmd);
49} 49}
50 50
51#endif 51#endif
diff --git a/arch/arm/plat-omap/include/mach/tc.h b/arch/arm/plat-omap/include/plat/tc.h
index d2fcd789bb9a..d2fcd789bb9a 100644
--- a/arch/arm/plat-omap/include/mach/tc.h
+++ b/arch/arm/plat-omap/include/plat/tc.h
diff --git a/arch/arm/plat-omap/include/mach/timer-gp.h b/arch/arm/plat-omap/include/plat/timer-gp.h
index c88d346b59d9..c88d346b59d9 100644
--- a/arch/arm/plat-omap/include/mach/timer-gp.h
+++ b/arch/arm/plat-omap/include/plat/timer-gp.h
diff --git a/arch/arm/plat-omap/include/mach/timex.h b/arch/arm/plat-omap/include/plat/timex.h
index 6d35767bc48f..6d35767bc48f 100644
--- a/arch/arm/plat-omap/include/mach/timex.h
+++ b/arch/arm/plat-omap/include/plat/timex.h
diff --git a/arch/arm/plat-omap/include/plat/uncompress.h b/arch/arm/plat-omap/include/plat/uncompress.h
new file mode 100644
index 000000000000..81d9ec540fcf
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/uncompress.h
@@ -0,0 +1,173 @@
1/*
2 * arch/arm/plat-omap/include/mach/uncompress.h
3 *
4 * Serial port stubs for kernel decompress status messages
5 *
6 * Initially based on:
7 * linux-2.4.15-rmk1-dsplinux1.6/arch/arm/plat-omap/include/mach1510/uncompress.h
8 * Copyright (C) 2000 RidgeRun, Inc.
9 * Author: Greg Lonnon <glonnon@ridgerun.com>
10 *
11 * Rewritten by:
12 * Author: <source@mvista.com>
13 * 2004 (c) MontaVista Software, Inc.
14 *
15 * This file is licensed under the terms of the GNU General Public License
16 * version 2. This program is licensed "as is" without any warranty of any
17 * kind, whether express or implied.
18 */
19
20#include <linux/types.h>
21#include <linux/serial_reg.h>
22
23#include <asm/mach-types.h>
24
25#include <plat/serial.h>
26
27static volatile u8 *uart1_base;
28static int uart1_shift;
29
30static volatile u8 *uart_base;
31static int uart_shift;
32
33/*
34 * Store the DEBUG_LL uart number into UART1 scratchpad register.
35 * See also debug-macro.S, and serial.c for related code.
36 *
37 * Please note that we currently assume that:
38 * - UART1 clocks are enabled for register access
39 * - UART1 scratchpad register can be used
40 */
41static void set_uart1_scratchpad(unsigned char port)
42{
43 uart1_base[UART_SCR << uart1_shift] = port;
44}
45
46static void putc(int c)
47{
48 if (!uart_base)
49 return;
50
51 while (!(uart_base[UART_LSR << uart_shift] & UART_LSR_THRE))
52 barrier();
53 uart_base[UART_TX << uart_shift] = c;
54}
55
56static inline void flush(void)
57{
58}
59
60/*
61 * Macros to configure UART1 and debug UART
62 */
63#define _DEBUG_LL_ENTRY(mach, uart1_phys, uart1_shft, \
64 dbg_uart, dbg_shft, dbg_id) \
65 if (machine_is_##mach()) { \
66 uart1_base = (volatile u8 *)(uart1_phys); \
67 uart1_shift = (uart1_shft); \
68 uart_base = (volatile u8 *)(dbg_uart); \
69 uart_shift = (dbg_shft); \
70 port = (dbg_id); \
71 set_uart1_scratchpad(port); \
72 break; \
73 }
74
75#define DEBUG_LL_OMAP7XX(p, mach) \
76 _DEBUG_LL_ENTRY(mach, OMAP1_UART1_BASE, OMAP7XX_PORT_SHIFT, \
77 OMAP1_UART##p##_BASE, OMAP7XX_PORT_SHIFT, OMAP1UART##p)
78
79#define DEBUG_LL_OMAP1(p, mach) \
80 _DEBUG_LL_ENTRY(mach, OMAP1_UART1_BASE, OMAP_PORT_SHIFT, \
81 OMAP1_UART##p##_BASE, OMAP_PORT_SHIFT, OMAP1UART##p)
82
83#define DEBUG_LL_OMAP2(p, mach) \
84 _DEBUG_LL_ENTRY(mach, OMAP2_UART1_BASE, OMAP_PORT_SHIFT, \
85 OMAP2_UART##p##_BASE, OMAP_PORT_SHIFT, OMAP2UART##p)
86
87#define DEBUG_LL_OMAP3(p, mach) \
88 _DEBUG_LL_ENTRY(mach, OMAP3_UART1_BASE, OMAP_PORT_SHIFT, \
89 OMAP3_UART##p##_BASE, OMAP_PORT_SHIFT, OMAP3UART##p)
90
91#define DEBUG_LL_OMAP4(p, mach) \
92 _DEBUG_LL_ENTRY(mach, OMAP4_UART1_BASE, OMAP_PORT_SHIFT, \
93 OMAP4_UART##p##_BASE, OMAP_PORT_SHIFT, OMAP4UART##p)
94
95/* Zoom2/3 shift is different for UART1 and external port */
96#define DEBUG_LL_ZOOM(mach) \
97 _DEBUG_LL_ENTRY(mach, OMAP2_UART1_BASE, OMAP_PORT_SHIFT, \
98 ZOOM_UART_BASE, ZOOM_PORT_SHIFT, ZOOM_UART)
99
100static inline void __arch_decomp_setup(unsigned long arch_id)
101{
102 int port = 0;
103
104 /*
105 * Initialize the port based on the machine ID from the bootloader.
106 * Note that we're using macros here instead of switch statement
107 * as machine_is functions are optimized out for the boards that
108 * are not selected.
109 */
110 do {
111 /* omap7xx/8xx based boards using UART1 with shift 0 */
112 DEBUG_LL_OMAP7XX(1, herald);
113 DEBUG_LL_OMAP7XX(1, omap_perseus2);
114
115 /* omap15xx/16xx based boards using UART1 */
116 DEBUG_LL_OMAP1(1, ams_delta);
117 DEBUG_LL_OMAP1(1, nokia770);
118 DEBUG_LL_OMAP1(1, omap_h2);
119 DEBUG_LL_OMAP1(1, omap_h3);
120 DEBUG_LL_OMAP1(1, omap_innovator);
121 DEBUG_LL_OMAP1(1, omap_osk);
122 DEBUG_LL_OMAP1(1, omap_palmte);
123 DEBUG_LL_OMAP1(1, omap_palmz71);
124
125 /* omap15xx/16xx based boards using UART2 */
126 DEBUG_LL_OMAP1(2, omap_palmtt);
127
128 /* omap15xx/16xx based boards using UART3 */
129 DEBUG_LL_OMAP1(3, sx1);
130
131 /* omap2 based boards using UART1 */
132 DEBUG_LL_OMAP2(1, omap2evm);
133 DEBUG_LL_OMAP2(1, omap_2430sdp);
134 DEBUG_LL_OMAP2(1, omap_apollon);
135 DEBUG_LL_OMAP2(1, omap_h4);
136
137 /* omap2 based boards using UART3 */
138 DEBUG_LL_OMAP2(3, nokia_n800);
139 DEBUG_LL_OMAP2(3, nokia_n810);
140 DEBUG_LL_OMAP2(3, nokia_n810_wimax);
141
142 /* omap3 based boards using UART1 */
143 DEBUG_LL_OMAP2(1, omap3evm);
144 DEBUG_LL_OMAP3(1, omap_3430sdp);
145 DEBUG_LL_OMAP3(1, omap_3630sdp);
146
147 /* omap3 based boards using UART3 */
148 DEBUG_LL_OMAP3(3, cm_t35);
149 DEBUG_LL_OMAP3(3, igep0020);
150 DEBUG_LL_OMAP3(3, nokia_rx51);
151 DEBUG_LL_OMAP3(3, omap3517evm);
152 DEBUG_LL_OMAP3(3, omap3_beagle);
153 DEBUG_LL_OMAP3(3, omap3_pandora);
154 DEBUG_LL_OMAP3(3, omap_ldp);
155 DEBUG_LL_OMAP3(3, overo);
156 DEBUG_LL_OMAP3(3, touchbook);
157
158 /* omap4 based boards using UART3 */
159 DEBUG_LL_OMAP4(3, omap_4430sdp);
160
161 /* zoom2/3 external uart */
162 DEBUG_LL_ZOOM(omap_zoom2);
163 DEBUG_LL_ZOOM(omap_zoom3);
164
165 } while (0);
166}
167
168#define arch_decomp_setup() __arch_decomp_setup(arch_id)
169
170/*
171 * nothing to do
172 */
173#define arch_decomp_wdog()
diff --git a/arch/arm/plat-omap/include/mach/usb.h b/arch/arm/plat-omap/include/plat/usb.h
index f337e1761e2c..876ca8d5e927 100644
--- a/arch/arm/plat-omap/include/mach/usb.h
+++ b/arch/arm/plat-omap/include/plat/usb.h
@@ -3,7 +3,23 @@
3#ifndef __ASM_ARCH_OMAP_USB_H 3#ifndef __ASM_ARCH_OMAP_USB_H
4#define __ASM_ARCH_OMAP_USB_H 4#define __ASM_ARCH_OMAP_USB_H
5 5
6#include <mach/board.h> 6#include <linux/usb/musb.h>
7#include <plat/board.h>
8
9#define OMAP3_HS_USB_PORTS 3
10enum ehci_hcd_omap_mode {
11 EHCI_HCD_OMAP_MODE_UNKNOWN,
12 EHCI_HCD_OMAP_MODE_PHY,
13 EHCI_HCD_OMAP_MODE_TLL,
14};
15
16struct ehci_hcd_omap_platform_data {
17 enum ehci_hcd_omap_mode port_mode[OMAP3_HS_USB_PORTS];
18 unsigned phy_reset:1;
19
20 /* have to be valid if phy_reset is true and portx is in phy mode */
21 int reset_gpio_port[OMAP3_HS_USB_PORTS];
22};
7 23
8/*-------------------------------------------------------------------------*/ 24/*-------------------------------------------------------------------------*/
9 25
@@ -27,7 +43,17 @@
27#define UDC_BASE OMAP2_UDC_BASE 43#define UDC_BASE OMAP2_UDC_BASE
28#define OMAP_OHCI_BASE OMAP2_OHCI_BASE 44#define OMAP_OHCI_BASE OMAP2_OHCI_BASE
29 45
30extern void usb_musb_init(void); 46struct omap_musb_board_data {
47 u8 interface_type;
48 u8 mode;
49 u16 power;
50};
51
52enum musb_interface {MUSB_INTERFACE_ULPI, MUSB_INTERFACE_UTMI};
53
54extern void usb_musb_init(struct omap_musb_board_data *board_data);
55
56extern void usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata);
31 57
32#endif 58#endif
33 59
diff --git a/arch/arm/plat-omap/include/plat/vram.h b/arch/arm/plat-omap/include/plat/vram.h
new file mode 100644
index 000000000000..edd4987758a6
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/vram.h
@@ -0,0 +1,62 @@
1/*
2 * VRAM manager for OMAP
3 *
4 * Copyright (C) 2009 Nokia Corporation
5 * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21#ifndef __OMAP_VRAM_H__
22#define __OMAP_VRAM_H__
23
24#include <linux/types.h>
25
26#define OMAP_VRAM_MEMTYPE_SDRAM 0
27#define OMAP_VRAM_MEMTYPE_SRAM 1
28#define OMAP_VRAM_MEMTYPE_MAX 1
29
30extern int omap_vram_add_region(unsigned long paddr, size_t size);
31extern int omap_vram_free(unsigned long paddr, size_t size);
32extern int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr);
33extern int omap_vram_reserve(unsigned long paddr, size_t size);
34extern void omap_vram_get_info(unsigned long *vram, unsigned long *free_vram,
35 unsigned long *largest_free_block);
36
37#ifdef CONFIG_OMAP2_VRAM
38extern void omap_vram_set_sdram_vram(u32 size, u32 start);
39extern void omap_vram_set_sram_vram(u32 size, u32 start);
40
41extern void omap_vram_reserve_sdram(void);
42extern unsigned long omap_vram_reserve_sram(unsigned long sram_pstart,
43 unsigned long sram_vstart,
44 unsigned long sram_size,
45 unsigned long pstart_avail,
46 unsigned long size_avail);
47#else
48static inline void omap_vram_set_sdram_vram(u32 size, u32 start) { }
49static inline void omap_vram_set_sram_vram(u32 size, u32 start) { }
50
51static inline void omap_vram_reserve_sdram(void) { }
52static inline unsigned long omap_vram_reserve_sram(unsigned long sram_pstart,
53 unsigned long sram_vstart,
54 unsigned long sram_size,
55 unsigned long pstart_avail,
56 unsigned long size_avail)
57{
58 return 0;
59}
60#endif
61
62#endif
diff --git a/arch/arm/plat-omap/include/plat/vrfb.h b/arch/arm/plat-omap/include/plat/vrfb.h
new file mode 100644
index 000000000000..d8a03ced3b10
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/vrfb.h
@@ -0,0 +1,50 @@
1/*
2 * VRFB Rotation Engine
3 *
4 * Copyright (C) 2009 Nokia Corporation
5 * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21#ifndef __OMAP_VRFB_H__
22#define __OMAP_VRFB_H__
23
24#define OMAP_VRFB_LINE_LEN 2048
25
26struct vrfb {
27 u8 context;
28 void __iomem *vaddr[4];
29 unsigned long paddr[4];
30 u16 xres;
31 u16 yres;
32 u16 xoffset;
33 u16 yoffset;
34 u8 bytespp;
35 bool yuv_mode;
36};
37
38extern int omap_vrfb_request_ctx(struct vrfb *vrfb);
39extern void omap_vrfb_release_ctx(struct vrfb *vrfb);
40extern void omap_vrfb_adjust_size(u16 *width, u16 *height,
41 u8 bytespp);
42extern u32 omap_vrfb_min_phys_size(u16 width, u16 height, u8 bytespp);
43extern u16 omap_vrfb_max_height(u32 phys_size, u16 width, u8 bytespp);
44extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
45 u16 width, u16 height,
46 unsigned bytespp, bool yuv_mode);
47extern int omap_vrfb_map_angle(struct vrfb *vrfb, u16 height, u8 rot);
48extern void omap_vrfb_restore_context(void);
49
50#endif /* __VRFB_H */
diff --git a/arch/arm/plat-omap/io.c b/arch/arm/plat-omap/io.c
index b6defa23e77e..b0078cf96281 100644
--- a/arch/arm/plat-omap/io.c
+++ b/arch/arm/plat-omap/io.c
@@ -13,12 +13,12 @@
13#include <linux/io.h> 13#include <linux/io.h>
14#include <linux/mm.h> 14#include <linux/mm.h>
15 15
16#include <mach/omap730.h> 16#include <plat/omap7xx.h>
17#include <mach/omap1510.h> 17#include <plat/omap1510.h>
18#include <mach/omap16xx.h> 18#include <plat/omap16xx.h>
19#include <mach/omap24xx.h> 19#include <plat/omap24xx.h>
20#include <mach/omap34xx.h> 20#include <plat/omap34xx.h>
21#include <mach/omap44xx.h> 21#include <plat/omap44xx.h>
22 22
23#define BETWEEN(p,st,sz) ((p) >= (st) && (p) < ((st) + (sz))) 23#define BETWEEN(p,st,sz) ((p) >= (st) && (p) < ((st) + (sz)))
24#define XLATE(p,pst,vst) ((void __iomem *)((p) - (pst) + (vst))) 24#define XLATE(p,pst,vst) ((void __iomem *)((p) - (pst) + (vst)))
@@ -33,13 +33,13 @@ void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type)
33 if (BETWEEN(p, OMAP1_IO_PHYS, OMAP1_IO_SIZE)) 33 if (BETWEEN(p, OMAP1_IO_PHYS, OMAP1_IO_SIZE))
34 return XLATE(p, OMAP1_IO_PHYS, OMAP1_IO_VIRT); 34 return XLATE(p, OMAP1_IO_PHYS, OMAP1_IO_VIRT);
35 } 35 }
36 if (cpu_is_omap730()) { 36 if (cpu_is_omap7xx()) {
37 if (BETWEEN(p, OMAP730_DSP_BASE, OMAP730_DSP_SIZE)) 37 if (BETWEEN(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_SIZE))
38 return XLATE(p, OMAP730_DSP_BASE, OMAP730_DSP_START); 38 return XLATE(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_START);
39 39
40 if (BETWEEN(p, OMAP730_DSPREG_BASE, OMAP730_DSPREG_SIZE)) 40 if (BETWEEN(p, OMAP7XX_DSPREG_BASE, OMAP7XX_DSPREG_SIZE))
41 return XLATE(p, OMAP730_DSPREG_BASE, 41 return XLATE(p, OMAP7XX_DSPREG_BASE,
42 OMAP730_DSPREG_START); 42 OMAP7XX_DSPREG_START);
43 } 43 }
44 if (cpu_is_omap15xx()) { 44 if (cpu_is_omap15xx()) {
45 if (BETWEEN(p, OMAP1510_DSP_BASE, OMAP1510_DSP_SIZE)) 45 if (BETWEEN(p, OMAP1510_DSP_BASE, OMAP1510_DSP_SIZE))
@@ -66,12 +66,12 @@ void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type)
66 return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT); 66 return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT);
67 } 67 }
68 if (cpu_is_omap2420()) { 68 if (cpu_is_omap2420()) {
69 if (BETWEEN(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_SIZE)) 69 if (BETWEEN(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_SIZE))
70 return XLATE(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_VIRT); 70 return XLATE(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_VIRT);
71 if (BETWEEN(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE)) 71 if (BETWEEN(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE))
72 return XLATE(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE); 72 return XLATE(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE);
73 if (BETWEEN(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_SIZE)) 73 if (BETWEEN(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_SIZE))
74 return XLATE(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_VIRT); 74 return XLATE(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_VIRT);
75 } 75 }
76 if (cpu_is_omap2430()) { 76 if (cpu_is_omap2430()) {
77 if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE)) 77 if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE))
@@ -90,8 +90,6 @@ void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type)
90 return XLATE(p, L3_34XX_PHYS, L3_34XX_VIRT); 90 return XLATE(p, L3_34XX_PHYS, L3_34XX_VIRT);
91 if (BETWEEN(p, L4_34XX_PHYS, L4_34XX_SIZE)) 91 if (BETWEEN(p, L4_34XX_PHYS, L4_34XX_SIZE))
92 return XLATE(p, L4_34XX_PHYS, L4_34XX_VIRT); 92 return XLATE(p, L4_34XX_PHYS, L4_34XX_VIRT);
93 if (BETWEEN(p, L4_WK_34XX_PHYS, L4_WK_34XX_SIZE))
94 return XLATE(p, L4_WK_34XX_PHYS, L4_WK_34XX_VIRT);
95 if (BETWEEN(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_SIZE)) 93 if (BETWEEN(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_SIZE))
96 return XLATE(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_VIRT); 94 return XLATE(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_VIRT);
97 if (BETWEEN(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_SIZE)) 95 if (BETWEEN(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_SIZE))
@@ -110,17 +108,23 @@ void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type)
110 return XLATE(p, L3_44XX_PHYS, L3_44XX_VIRT); 108 return XLATE(p, L3_44XX_PHYS, L3_44XX_VIRT);
111 if (BETWEEN(p, L4_44XX_PHYS, L4_44XX_SIZE)) 109 if (BETWEEN(p, L4_44XX_PHYS, L4_44XX_SIZE))
112 return XLATE(p, L4_44XX_PHYS, L4_44XX_VIRT); 110 return XLATE(p, L4_44XX_PHYS, L4_44XX_VIRT);
113 if (BETWEEN(p, L4_WK_44XX_PHYS, L4_WK_44XX_SIZE))
114 return XLATE(p, L4_WK_44XX_PHYS, L4_WK_44XX_VIRT);
115 if (BETWEEN(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_SIZE)) 111 if (BETWEEN(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_SIZE))
116 return XLATE(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_VIRT); 112 return XLATE(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_VIRT);
113 if (BETWEEN(p, OMAP44XX_EMIF1_PHYS, OMAP44XX_EMIF1_SIZE))
114 return XLATE(p, OMAP44XX_EMIF1_PHYS, \
115 OMAP44XX_EMIF1_VIRT);
116 if (BETWEEN(p, OMAP44XX_EMIF2_PHYS, OMAP44XX_EMIF2_SIZE))
117 return XLATE(p, OMAP44XX_EMIF2_PHYS, \
118 OMAP44XX_EMIF2_VIRT);
119 if (BETWEEN(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_SIZE))
120 return XLATE(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_VIRT);
117 if (BETWEEN(p, L4_PER_44XX_PHYS, L4_PER_44XX_SIZE)) 121 if (BETWEEN(p, L4_PER_44XX_PHYS, L4_PER_44XX_SIZE))
118 return XLATE(p, L4_PER_44XX_PHYS, L4_PER_44XX_VIRT); 122 return XLATE(p, L4_PER_44XX_PHYS, L4_PER_44XX_VIRT);
119 if (BETWEEN(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_SIZE)) 123 if (BETWEEN(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_SIZE))
120 return XLATE(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_VIRT); 124 return XLATE(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_VIRT);
121 } 125 }
122#endif 126#endif
123 return __arm_ioremap(p, size, type); 127 return __arm_ioremap_caller(p, size, type, __builtin_return_address(0));
124} 128}
125EXPORT_SYMBOL(omap_ioremap); 129EXPORT_SYMBOL(omap_ioremap);
126 130
@@ -142,7 +146,7 @@ u8 omap_readb(u32 pa)
142 if (cpu_class_is_omap1()) 146 if (cpu_class_is_omap1())
143 return __raw_readb(OMAP1_IO_ADDRESS(pa)); 147 return __raw_readb(OMAP1_IO_ADDRESS(pa));
144 else 148 else
145 return __raw_readb(OMAP2_IO_ADDRESS(pa)); 149 return __raw_readb(OMAP2_L4_IO_ADDRESS(pa));
146} 150}
147EXPORT_SYMBOL(omap_readb); 151EXPORT_SYMBOL(omap_readb);
148 152
@@ -151,7 +155,7 @@ u16 omap_readw(u32 pa)
151 if (cpu_class_is_omap1()) 155 if (cpu_class_is_omap1())
152 return __raw_readw(OMAP1_IO_ADDRESS(pa)); 156 return __raw_readw(OMAP1_IO_ADDRESS(pa));
153 else 157 else
154 return __raw_readw(OMAP2_IO_ADDRESS(pa)); 158 return __raw_readw(OMAP2_L4_IO_ADDRESS(pa));
155} 159}
156EXPORT_SYMBOL(omap_readw); 160EXPORT_SYMBOL(omap_readw);
157 161
@@ -160,7 +164,7 @@ u32 omap_readl(u32 pa)
160 if (cpu_class_is_omap1()) 164 if (cpu_class_is_omap1())
161 return __raw_readl(OMAP1_IO_ADDRESS(pa)); 165 return __raw_readl(OMAP1_IO_ADDRESS(pa));
162 else 166 else
163 return __raw_readl(OMAP2_IO_ADDRESS(pa)); 167 return __raw_readl(OMAP2_L4_IO_ADDRESS(pa));
164} 168}
165EXPORT_SYMBOL(omap_readl); 169EXPORT_SYMBOL(omap_readl);
166 170
@@ -169,7 +173,7 @@ void omap_writeb(u8 v, u32 pa)
169 if (cpu_class_is_omap1()) 173 if (cpu_class_is_omap1())
170 __raw_writeb(v, OMAP1_IO_ADDRESS(pa)); 174 __raw_writeb(v, OMAP1_IO_ADDRESS(pa));
171 else 175 else
172 __raw_writeb(v, OMAP2_IO_ADDRESS(pa)); 176 __raw_writeb(v, OMAP2_L4_IO_ADDRESS(pa));
173} 177}
174EXPORT_SYMBOL(omap_writeb); 178EXPORT_SYMBOL(omap_writeb);
175 179
@@ -178,7 +182,7 @@ void omap_writew(u16 v, u32 pa)
178 if (cpu_class_is_omap1()) 182 if (cpu_class_is_omap1())
179 __raw_writew(v, OMAP1_IO_ADDRESS(pa)); 183 __raw_writew(v, OMAP1_IO_ADDRESS(pa));
180 else 184 else
181 __raw_writew(v, OMAP2_IO_ADDRESS(pa)); 185 __raw_writew(v, OMAP2_L4_IO_ADDRESS(pa));
182} 186}
183EXPORT_SYMBOL(omap_writew); 187EXPORT_SYMBOL(omap_writew);
184 188
@@ -187,6 +191,6 @@ void omap_writel(u32 v, u32 pa)
187 if (cpu_class_is_omap1()) 191 if (cpu_class_is_omap1())
188 __raw_writel(v, OMAP1_IO_ADDRESS(pa)); 192 __raw_writel(v, OMAP1_IO_ADDRESS(pa));
189 else 193 else
190 __raw_writel(v, OMAP2_IO_ADDRESS(pa)); 194 __raw_writel(v, OMAP2_L4_IO_ADDRESS(pa));
191} 195}
192EXPORT_SYMBOL(omap_writel); 196EXPORT_SYMBOL(omap_writel);
diff --git a/arch/arm/plat-omap/iommu-debug.c b/arch/arm/plat-omap/iommu-debug.c
index c799b3b0d709..e6c0d536899c 100644
--- a/arch/arm/plat-omap/iommu-debug.c
+++ b/arch/arm/plat-omap/iommu-debug.c
@@ -13,12 +13,13 @@
13#include <linux/err.h> 13#include <linux/err.h>
14#include <linux/clk.h> 14#include <linux/clk.h>
15#include <linux/io.h> 15#include <linux/io.h>
16#include <linux/slab.h>
16#include <linux/uaccess.h> 17#include <linux/uaccess.h>
17#include <linux/platform_device.h> 18#include <linux/platform_device.h>
18#include <linux/debugfs.h> 19#include <linux/debugfs.h>
19 20
20#include <mach/iommu.h> 21#include <plat/iommu.h>
21#include <mach/iovmm.h> 22#include <plat/iovmm.h>
22 23
23#include "iopgtable.h" 24#include "iopgtable.h"
24 25
diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c
index 94584f167a82..0e137663349c 100644
--- a/arch/arm/plat-omap/iommu.c
+++ b/arch/arm/plat-omap/iommu.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * omap iommu: tlb and pagetable primitives 2 * omap iommu: tlb and pagetable primitives
3 * 3 *
4 * Copyright (C) 2008-2009 Nokia Corporation 4 * Copyright (C) 2008-2010 Nokia Corporation
5 * 5 *
6 * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>, 6 * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>,
7 * Paul Mundt and Toshihiro Kobayashi 7 * Paul Mundt and Toshihiro Kobayashi
@@ -13,6 +13,7 @@
13 13
14#include <linux/err.h> 14#include <linux/err.h>
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/slab.h>
16#include <linux/interrupt.h> 17#include <linux/interrupt.h>
17#include <linux/ioport.h> 18#include <linux/ioport.h>
18#include <linux/clk.h> 19#include <linux/clk.h>
@@ -20,7 +21,7 @@
20 21
21#include <asm/cacheflush.h> 22#include <asm/cacheflush.h>
22 23
23#include <mach/iommu.h> 24#include <plat/iommu.h>
24 25
25#include "iopgtable.h" 26#include "iopgtable.h"
26 27
@@ -646,7 +647,7 @@ static size_t iopgtable_clear_entry_core(struct iommu *obj, u32 da)
646 if (*iopte & IOPTE_LARGE) { 647 if (*iopte & IOPTE_LARGE) {
647 nent *= 16; 648 nent *= 16;
648 /* rewind to the 1st entry */ 649 /* rewind to the 1st entry */
649 iopte = (u32 *)((u32)iopte & IOLARGE_MASK); 650 iopte = iopte_offset(iopgd, (da & IOLARGE_MASK));
650 } 651 }
651 bytes *= nent; 652 bytes *= nent;
652 memset(iopte, 0, nent * sizeof(*iopte)); 653 memset(iopte, 0, nent * sizeof(*iopte));
@@ -667,7 +668,7 @@ static size_t iopgtable_clear_entry_core(struct iommu *obj, u32 da)
667 if ((*iopgd & IOPGD_SUPER) == IOPGD_SUPER) { 668 if ((*iopgd & IOPGD_SUPER) == IOPGD_SUPER) {
668 nent *= 16; 669 nent *= 16;
669 /* rewind to the 1st entry */ 670 /* rewind to the 1st entry */
670 iopgd = (u32 *)((u32)iopgd & IOSUPER_MASK); 671 iopgd = iopgd_offset(obj, (da & IOSUPER_MASK));
671 } 672 }
672 bytes *= nent; 673 bytes *= nent;
673 } 674 }
@@ -827,7 +828,7 @@ EXPORT_SYMBOL_GPL(iommu_get);
827 **/ 828 **/
828void iommu_put(struct iommu *obj) 829void iommu_put(struct iommu *obj)
829{ 830{
830 if (!obj && IS_ERR(obj)) 831 if (!obj || IS_ERR(obj))
831 return; 832 return;
832 833
833 mutex_lock(&obj->iommu_lock); 834 mutex_lock(&obj->iommu_lock);
diff --git a/arch/arm/plat-omap/iopgtable.h b/arch/arm/plat-omap/iopgtable.h
index 37dac434c7a1..ab23b6a140fd 100644
--- a/arch/arm/plat-omap/iopgtable.h
+++ b/arch/arm/plat-omap/iopgtable.h
@@ -1,7 +1,7 @@
1/* 1/*
2 * omap iommu: pagetable definitions 2 * omap iommu: pagetable definitions
3 * 3 *
4 * Copyright (C) 2008-2009 Nokia Corporation 4 * Copyright (C) 2008-2010 Nokia Corporation
5 * 5 *
6 * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> 6 * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
7 * 7 *
@@ -13,26 +13,52 @@
13#ifndef __PLAT_OMAP_IOMMU_H 13#ifndef __PLAT_OMAP_IOMMU_H
14#define __PLAT_OMAP_IOMMU_H 14#define __PLAT_OMAP_IOMMU_H
15 15
16/*
17 * "L2 table" address mask and size definitions.
18 */
16#define IOPGD_SHIFT 20 19#define IOPGD_SHIFT 20
17#define IOPGD_SIZE (1 << IOPGD_SHIFT) 20#define IOPGD_SIZE (1UL << IOPGD_SHIFT)
18#define IOPGD_MASK (~(IOPGD_SIZE - 1)) 21#define IOPGD_MASK (~(IOPGD_SIZE - 1))
19#define IOSECTION_MASK IOPGD_MASK
20#define PTRS_PER_IOPGD (1 << (32 - IOPGD_SHIFT))
21#define IOPGD_TABLE_SIZE (PTRS_PER_IOPGD * sizeof(u32))
22 22
23#define IOSUPER_SIZE (IOPGD_SIZE << 4) 23/*
24 * "section" address mask and size definitions.
25 */
26#define IOSECTION_SHIFT 20
27#define IOSECTION_SIZE (1UL << IOSECTION_SHIFT)
28#define IOSECTION_MASK (~(IOSECTION_SIZE - 1))
29
30/*
31 * "supersection" address mask and size definitions.
32 */
33#define IOSUPER_SHIFT 24
34#define IOSUPER_SIZE (1UL << IOSUPER_SHIFT)
24#define IOSUPER_MASK (~(IOSUPER_SIZE - 1)) 35#define IOSUPER_MASK (~(IOSUPER_SIZE - 1))
25 36
37#define PTRS_PER_IOPGD (1UL << (32 - IOPGD_SHIFT))
38#define IOPGD_TABLE_SIZE (PTRS_PER_IOPGD * sizeof(u32))
39
40/*
41 * "small page" address mask and size definitions.
42 */
26#define IOPTE_SHIFT 12 43#define IOPTE_SHIFT 12
27#define IOPTE_SIZE (1 << IOPTE_SHIFT) 44#define IOPTE_SIZE (1UL << IOPTE_SHIFT)
28#define IOPTE_MASK (~(IOPTE_SIZE - 1)) 45#define IOPTE_MASK (~(IOPTE_SIZE - 1))
29#define IOPAGE_MASK IOPTE_MASK
30#define PTRS_PER_IOPTE (1 << (IOPGD_SHIFT - IOPTE_SHIFT))
31#define IOPTE_TABLE_SIZE (PTRS_PER_IOPTE * sizeof(u32))
32 46
33#define IOLARGE_SIZE (IOPTE_SIZE << 4) 47/*
48 * "large page" address mask and size definitions.
49 */
50#define IOLARGE_SHIFT 16
51#define IOLARGE_SIZE (1UL << IOLARGE_SHIFT)
34#define IOLARGE_MASK (~(IOLARGE_SIZE - 1)) 52#define IOLARGE_MASK (~(IOLARGE_SIZE - 1))
35 53
54#define PTRS_PER_IOPTE (1UL << (IOPGD_SHIFT - IOPTE_SHIFT))
55#define IOPTE_TABLE_SIZE (PTRS_PER_IOPTE * sizeof(u32))
56
57#define IOPAGE_MASK IOPTE_MASK
58
59/*
60 * some descriptor attributes.
61 */
36#define IOPGD_TABLE (1 << 0) 62#define IOPGD_TABLE (1 << 0)
37#define IOPGD_SECTION (2 << 0) 63#define IOPGD_SECTION (2 << 0)
38#define IOPGD_SUPER (1 << 18 | 2 << 0) 64#define IOPGD_SUPER (1 << 18 | 2 << 0)
@@ -40,12 +66,14 @@
40#define IOPTE_SMALL (2 << 0) 66#define IOPTE_SMALL (2 << 0)
41#define IOPTE_LARGE (1 << 0) 67#define IOPTE_LARGE (1 << 0)
42 68
69/* to find an entry in a page-table-directory */
43#define iopgd_index(da) (((da) >> IOPGD_SHIFT) & (PTRS_PER_IOPGD - 1)) 70#define iopgd_index(da) (((da) >> IOPGD_SHIFT) & (PTRS_PER_IOPGD - 1))
44#define iopgd_offset(obj, da) ((obj)->iopgd + iopgd_index(da)) 71#define iopgd_offset(obj, da) ((obj)->iopgd + iopgd_index(da))
45 72
46#define iopte_paddr(iopgd) (*iopgd & ~((1 << 10) - 1)) 73#define iopte_paddr(iopgd) (*iopgd & ~((1 << 10) - 1))
47#define iopte_vaddr(iopgd) ((u32 *)phys_to_virt(iopte_paddr(iopgd))) 74#define iopte_vaddr(iopgd) ((u32 *)phys_to_virt(iopte_paddr(iopgd)))
48 75
76/* to find an entry in the second-level page table. */
49#define iopte_index(da) (((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1)) 77#define iopte_index(da) (((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1))
50#define iopte_offset(iopgd, da) (iopte_vaddr(iopgd) + iopte_index(da)) 78#define iopte_offset(iopgd, da) (iopte_vaddr(iopgd) + iopte_index(da))
51 79
diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c
index dc3fac3dd0ea..65c6d1ff7237 100644
--- a/arch/arm/plat-omap/iovmm.c
+++ b/arch/arm/plat-omap/iovmm.c
@@ -11,6 +11,7 @@
11 */ 11 */
12 12
13#include <linux/err.h> 13#include <linux/err.h>
14#include <linux/slab.h>
14#include <linux/vmalloc.h> 15#include <linux/vmalloc.h>
15#include <linux/device.h> 16#include <linux/device.h>
16#include <linux/scatterlist.h> 17#include <linux/scatterlist.h>
@@ -18,8 +19,8 @@
18#include <asm/cacheflush.h> 19#include <asm/cacheflush.h>
19#include <asm/mach/map.h> 20#include <asm/mach/map.h>
20 21
21#include <mach/iommu.h> 22#include <plat/iommu.h>
22#include <mach/iovmm.h> 23#include <plat/iovmm.h>
23 24
24#include "iopgtable.h" 25#include "iopgtable.h"
25 26
@@ -392,7 +393,6 @@ static void sgtable_fill_vmalloc(struct sg_table *sgt, void *_va)
392 } 393 }
393 394
394 va_end = _va + PAGE_SIZE * i; 395 va_end = _va + PAGE_SIZE * i;
395 flush_cache_vmap((unsigned long)_va, (unsigned long)va_end);
396} 396}
397 397
398static inline void sgtable_drain_vmalloc(struct sg_table *sgt) 398static inline void sgtable_drain_vmalloc(struct sg_table *sgt)
@@ -427,8 +427,6 @@ static void sgtable_fill_kmalloc(struct sg_table *sgt, u32 pa, size_t len)
427 len -= bytes; 427 len -= bytes;
428 } 428 }
429 BUG_ON(len); 429 BUG_ON(len);
430
431 clean_dcache_area(va, len);
432} 430}
433 431
434static inline void sgtable_drain_kmalloc(struct sg_table *sgt) 432static inline void sgtable_drain_kmalloc(struct sg_table *sgt)
@@ -449,7 +447,7 @@ static int map_iovm_area(struct iommu *obj, struct iovm_struct *new,
449 struct scatterlist *sg; 447 struct scatterlist *sg;
450 u32 da = new->da_start; 448 u32 da = new->da_start;
451 449
452 if (!obj || !new || !sgt) 450 if (!obj || !sgt)
453 return -EINVAL; 451 return -EINVAL;
454 452
455 BUG_ON(!sgtable_ok(sgt)); 453 BUG_ON(!sgtable_ok(sgt));
@@ -617,7 +615,7 @@ u32 iommu_vmap(struct iommu *obj, u32 da, const struct sg_table *sgt,
617 u32 flags) 615 u32 flags)
618{ 616{
619 size_t bytes; 617 size_t bytes;
620 void *va; 618 void *va = NULL;
621 619
622 if (!obj || !obj->dev || !sgt) 620 if (!obj || !obj->dev || !sgt)
623 return -EINVAL; 621 return -EINVAL;
@@ -627,9 +625,11 @@ u32 iommu_vmap(struct iommu *obj, u32 da, const struct sg_table *sgt,
627 return -EINVAL; 625 return -EINVAL;
628 bytes = PAGE_ALIGN(bytes); 626 bytes = PAGE_ALIGN(bytes);
629 627
630 va = vmap_sg(sgt); 628 if (flags & IOVMF_MMIO) {
631 if (IS_ERR(va)) 629 va = vmap_sg(sgt);
632 return PTR_ERR(va); 630 if (IS_ERR(va))
631 return PTR_ERR(va);
632 }
633 633
634 flags &= IOVMF_HW_MASK; 634 flags &= IOVMF_HW_MASK;
635 flags |= IOVMF_DISCONT; 635 flags |= IOVMF_DISCONT;
diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c
index 40424edae939..08a2df766289 100644
--- a/arch/arm/plat-omap/mailbox.c
+++ b/arch/arm/plat-omap/mailbox.c
@@ -25,56 +25,15 @@
25#include <linux/interrupt.h> 25#include <linux/interrupt.h>
26#include <linux/device.h> 26#include <linux/device.h>
27#include <linux/delay.h> 27#include <linux/delay.h>
28#include <linux/slab.h>
28 29
29#include <mach/mailbox.h> 30#include <plat/mailbox.h>
30
31static int enable_seq_bit;
32module_param(enable_seq_bit, bool, 0);
33MODULE_PARM_DESC(enable_seq_bit, "Enable sequence bit checking.");
34 31
32static struct workqueue_struct *mboxd;
35static struct omap_mbox *mboxes; 33static struct omap_mbox *mboxes;
36static DEFINE_RWLOCK(mboxes_lock); 34static DEFINE_RWLOCK(mboxes_lock);
37 35
38/* 36static int mbox_configured;
39 * Mailbox sequence bit API
40 */
41
42/* seq_rcv should be initialized with any value other than
43 * 0 and 1 << 31, to allow either value for the first
44 * message. */
45static inline void mbox_seq_init(struct omap_mbox *mbox)
46{
47 if (!enable_seq_bit)
48 return;
49
50 /* any value other than 0 and 1 << 31 */
51 mbox->seq_rcv = 0xffffffff;
52}
53
54static inline void mbox_seq_toggle(struct omap_mbox *mbox, mbox_msg_t * msg)
55{
56 if (!enable_seq_bit)
57 return;
58
59 /* add seq_snd to msg */
60 *msg = (*msg & 0x7fffffff) | mbox->seq_snd;
61 /* flip seq_snd */
62 mbox->seq_snd ^= 1 << 31;
63}
64
65static inline int mbox_seq_test(struct omap_mbox *mbox, mbox_msg_t msg)
66{
67 mbox_msg_t seq;
68
69 if (!enable_seq_bit)
70 return 0;
71
72 seq = msg & (1 << 31);
73 if (seq == mbox->seq_rcv)
74 return -1;
75 mbox->seq_rcv = seq;
76 return 0;
77}
78 37
79/* Mailbox FIFO handle functions */ 38/* Mailbox FIFO handle functions */
80static inline mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox) 39static inline mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox)
@@ -95,14 +54,6 @@ static inline int mbox_fifo_full(struct omap_mbox *mbox)
95} 54}
96 55
97/* Mailbox IRQ handle functions */ 56/* Mailbox IRQ handle functions */
98static inline void enable_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
99{
100 mbox->ops->enable_irq(mbox, irq);
101}
102static inline void disable_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
103{
104 mbox->ops->disable_irq(mbox, irq);
105}
106static inline void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) 57static inline void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
107{ 58{
108 if (mbox->ops->ack_irq) 59 if (mbox->ops->ack_irq)
@@ -113,17 +64,10 @@ static inline int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
113 return mbox->ops->is_irq(mbox, irq); 64 return mbox->ops->is_irq(mbox, irq);
114} 65}
115 66
116/* Mailbox Sequence Bit function */
117void omap_mbox_init_seq(struct omap_mbox *mbox)
118{
119 mbox_seq_init(mbox);
120}
121EXPORT_SYMBOL(omap_mbox_init_seq);
122
123/* 67/*
124 * message sender 68 * message sender
125 */ 69 */
126static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void *arg) 70static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
127{ 71{
128 int ret = 0, i = 1000; 72 int ret = 0, i = 1000;
129 73
@@ -134,89 +78,49 @@ static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void *arg)
134 return -1; 78 return -1;
135 udelay(1); 79 udelay(1);
136 } 80 }
137
138 if (arg && mbox->txq->callback) {
139 ret = mbox->txq->callback(arg);
140 if (ret)
141 goto out;
142 }
143
144 mbox_seq_toggle(mbox, &msg);
145 mbox_fifo_write(mbox, msg); 81 mbox_fifo_write(mbox, msg);
146 out:
147 return ret; 82 return ret;
148} 83}
149 84
150struct omap_msg_tx_data {
151 mbox_msg_t msg;
152 void *arg;
153};
154 85
155static void omap_msg_tx_end_io(struct request *rq, int error) 86int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
156{ 87{
157 kfree(rq->special);
158 __blk_put_request(rq->q, rq);
159}
160 88
161int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg)
162{
163 struct omap_msg_tx_data *tx_data;
164 struct request *rq; 89 struct request *rq;
165 struct request_queue *q = mbox->txq->queue; 90 struct request_queue *q = mbox->txq->queue;
166 91
167 tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC);
168 if (unlikely(!tx_data))
169 return -ENOMEM;
170
171 rq = blk_get_request(q, WRITE, GFP_ATOMIC); 92 rq = blk_get_request(q, WRITE, GFP_ATOMIC);
172 if (unlikely(!rq)) { 93 if (unlikely(!rq))
173 kfree(tx_data);
174 return -ENOMEM; 94 return -ENOMEM;
175 }
176 95
177 tx_data->msg = msg; 96 blk_insert_request(q, rq, 0, (void *) msg);
178 tx_data->arg = arg; 97 tasklet_schedule(&mbox->txq->tasklet);
179 rq->end_io = omap_msg_tx_end_io;
180 blk_insert_request(q, rq, 0, tx_data);
181 98
182 schedule_work(&mbox->txq->work);
183 return 0; 99 return 0;
184} 100}
185EXPORT_SYMBOL(omap_mbox_msg_send); 101EXPORT_SYMBOL(omap_mbox_msg_send);
186 102
187static void mbox_tx_work(struct work_struct *work) 103static void mbox_tx_tasklet(unsigned long tx_data)
188{ 104{
189 int ret; 105 int ret;
190 struct request *rq; 106 struct request *rq;
191 struct omap_mbox_queue *mq = container_of(work, 107 struct omap_mbox *mbox = (struct omap_mbox *)tx_data;
192 struct omap_mbox_queue, work);
193 struct omap_mbox *mbox = mq->queue->queuedata;
194 struct request_queue *q = mbox->txq->queue; 108 struct request_queue *q = mbox->txq->queue;
195 109
196 while (1) { 110 while (1) {
197 struct omap_msg_tx_data *tx_data;
198 111
199 spin_lock(q->queue_lock);
200 rq = blk_fetch_request(q); 112 rq = blk_fetch_request(q);
201 spin_unlock(q->queue_lock);
202 113
203 if (!rq) 114 if (!rq)
204 break; 115 break;
205 116
206 tx_data = rq->special; 117 ret = __mbox_msg_send(mbox, (mbox_msg_t)rq->special);
207
208 ret = __mbox_msg_send(mbox, tx_data->msg, tx_data->arg);
209 if (ret) { 118 if (ret) {
210 enable_mbox_irq(mbox, IRQ_TX); 119 omap_mbox_enable_irq(mbox, IRQ_TX);
211 spin_lock(q->queue_lock);
212 blk_requeue_request(q, rq); 120 blk_requeue_request(q, rq);
213 spin_unlock(q->queue_lock);
214 return; 121 return;
215 } 122 }
216 123 blk_end_request_all(rq, 0);
217 spin_lock(q->queue_lock);
218 __blk_end_request_all(rq, 0);
219 spin_unlock(q->queue_lock);
220 } 124 }
221} 125}
222 126
@@ -233,11 +137,6 @@ static void mbox_rx_work(struct work_struct *work)
233 mbox_msg_t msg; 137 mbox_msg_t msg;
234 unsigned long flags; 138 unsigned long flags;
235 139
236 if (mbox->rxq->callback == NULL) {
237 sysfs_notify(&mbox->dev->kobj, NULL, "mbox");
238 return;
239 }
240
241 while (1) { 140 while (1) {
242 spin_lock_irqsave(q->queue_lock, flags); 141 spin_lock_irqsave(q->queue_lock, flags);
243 rq = blk_fetch_request(q); 142 rq = blk_fetch_request(q);
@@ -254,19 +153,19 @@ static void mbox_rx_work(struct work_struct *work)
254/* 153/*
255 * Mailbox interrupt handler 154 * Mailbox interrupt handler
256 */ 155 */
257static void mbox_txq_fn(struct request_queue * q) 156static void mbox_txq_fn(struct request_queue *q)
258{ 157{
259} 158}
260 159
261static void mbox_rxq_fn(struct request_queue * q) 160static void mbox_rxq_fn(struct request_queue *q)
262{ 161{
263} 162}
264 163
265static void __mbox_tx_interrupt(struct omap_mbox *mbox) 164static void __mbox_tx_interrupt(struct omap_mbox *mbox)
266{ 165{
267 disable_mbox_irq(mbox, IRQ_TX); 166 omap_mbox_disable_irq(mbox, IRQ_TX);
268 ack_mbox_irq(mbox, IRQ_TX); 167 ack_mbox_irq(mbox, IRQ_TX);
269 schedule_work(&mbox->txq->work); 168 tasklet_schedule(&mbox->txq->tasklet);
270} 169}
271 170
272static void __mbox_rx_interrupt(struct omap_mbox *mbox) 171static void __mbox_rx_interrupt(struct omap_mbox *mbox)
@@ -275,8 +174,6 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
275 mbox_msg_t msg; 174 mbox_msg_t msg;
276 struct request_queue *q = mbox->rxq->queue; 175 struct request_queue *q = mbox->rxq->queue;
277 176
278 disable_mbox_irq(mbox, IRQ_RX);
279
280 while (!mbox_fifo_empty(mbox)) { 177 while (!mbox_fifo_empty(mbox)) {
281 rq = blk_get_request(q, WRITE, GFP_ATOMIC); 178 rq = blk_get_request(q, WRITE, GFP_ATOMIC);
282 if (unlikely(!rq)) 179 if (unlikely(!rq))
@@ -284,11 +181,6 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
284 181
285 msg = mbox_fifo_read(mbox); 182 msg = mbox_fifo_read(mbox);
286 183
287 if (unlikely(mbox_seq_test(mbox, msg))) {
288 pr_info("mbox: Illegal seq bit!(%08x)\n", msg);
289 if (mbox->err_notify)
290 mbox->err_notify();
291 }
292 184
293 blk_insert_request(q, rq, 0, (void *)msg); 185 blk_insert_request(q, rq, 0, (void *)msg);
294 if (mbox->ops->type == OMAP_MBOX_TYPE1) 186 if (mbox->ops->type == OMAP_MBOX_TYPE1)
@@ -297,9 +189,8 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
297 189
298 /* no more messages in the fifo. clear IRQ source. */ 190 /* no more messages in the fifo. clear IRQ source. */
299 ack_mbox_irq(mbox, IRQ_RX); 191 ack_mbox_irq(mbox, IRQ_RX);
300 enable_mbox_irq(mbox, IRQ_RX);
301nomem: 192nomem:
302 schedule_work(&mbox->rxq->work); 193 queue_work(mboxd, &mbox->rxq->work);
303} 194}
304 195
305static irqreturn_t mbox_interrupt(int irq, void *p) 196static irqreturn_t mbox_interrupt(int irq, void *p)
@@ -315,76 +206,10 @@ static irqreturn_t mbox_interrupt(int irq, void *p)
315 return IRQ_HANDLED; 206 return IRQ_HANDLED;
316} 207}
317 208
318/*
319 * sysfs files
320 */
321static ssize_t
322omap_mbox_write(struct device *dev, struct device_attribute *attr,
323 const char * buf, size_t count)
324{
325 int ret;
326 mbox_msg_t *p = (mbox_msg_t *)buf;
327 struct omap_mbox *mbox = dev_get_drvdata(dev);
328
329 for (; count >= sizeof(mbox_msg_t); count -= sizeof(mbox_msg_t)) {
330 ret = omap_mbox_msg_send(mbox, be32_to_cpu(*p), NULL);
331 if (ret)
332 return -EAGAIN;
333 p++;
334 }
335
336 return (size_t)((char *)p - buf);
337}
338
339static ssize_t
340omap_mbox_read(struct device *dev, struct device_attribute *attr, char *buf)
341{
342 unsigned long flags;
343 struct request *rq;
344 mbox_msg_t *p = (mbox_msg_t *) buf;
345 struct omap_mbox *mbox = dev_get_drvdata(dev);
346 struct request_queue *q = mbox->rxq->queue;
347
348 while (1) {
349 spin_lock_irqsave(q->queue_lock, flags);
350 rq = blk_fetch_request(q);
351 spin_unlock_irqrestore(q->queue_lock, flags);
352
353 if (!rq)
354 break;
355
356 *p = (mbox_msg_t)rq->special;
357
358 blk_end_request_all(rq, 0);
359
360 if (unlikely(mbox_seq_test(mbox, *p))) {
361 pr_info("mbox: Illegal seq bit!(%08x) ignored\n", *p);
362 continue;
363 }
364 p++;
365 }
366
367 pr_debug("%02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3]);
368
369 return (size_t) ((char *)p - buf);
370}
371
372static DEVICE_ATTR(mbox, S_IRUGO | S_IWUSR, omap_mbox_read, omap_mbox_write);
373
374static ssize_t mbox_show(struct class *class, char *buf)
375{
376 return sprintf(buf, "mbox");
377}
378
379static CLASS_ATTR(mbox, S_IRUGO, mbox_show, NULL);
380
381static struct class omap_mbox_class = {
382 .name = "omap-mailbox",
383};
384
385static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox, 209static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox,
386 request_fn_proc * proc, 210 request_fn_proc *proc,
387 void (*work) (struct work_struct *)) 211 void (*work) (struct work_struct *),
212 void (*tasklet)(unsigned long))
388{ 213{
389 struct request_queue *q; 214 struct request_queue *q;
390 struct omap_mbox_queue *mq; 215 struct omap_mbox_queue *mq;
@@ -401,8 +226,11 @@ static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox,
401 q->queuedata = mbox; 226 q->queuedata = mbox;
402 mq->queue = q; 227 mq->queue = q;
403 228
404 INIT_WORK(&mq->work, work); 229 if (work)
230 INIT_WORK(&mq->work, work);
405 231
232 if (tasklet)
233 tasklet_init(&mq->tasklet, tasklet, (unsigned long)mbox);
406 return mq; 234 return mq;
407error: 235error:
408 kfree(mq); 236 kfree(mq);
@@ -415,18 +243,25 @@ static void mbox_queue_free(struct omap_mbox_queue *q)
415 kfree(q); 243 kfree(q);
416} 244}
417 245
418static int omap_mbox_init(struct omap_mbox *mbox) 246static int omap_mbox_startup(struct omap_mbox *mbox)
419{ 247{
420 int ret; 248 int ret = 0;
421 struct omap_mbox_queue *mq; 249 struct omap_mbox_queue *mq;
422 250
423 if (likely(mbox->ops->startup)) { 251 if (likely(mbox->ops->startup)) {
424 ret = mbox->ops->startup(mbox); 252 write_lock(&mboxes_lock);
425 if (unlikely(ret)) 253 if (!mbox_configured)
254 ret = mbox->ops->startup(mbox);
255
256 if (unlikely(ret)) {
257 write_unlock(&mboxes_lock);
426 return ret; 258 return ret;
259 }
260 mbox_configured++;
261 write_unlock(&mboxes_lock);
427 } 262 }
428 263
429 ret = request_irq(mbox->irq, mbox_interrupt, IRQF_DISABLED, 264 ret = request_irq(mbox->irq, mbox_interrupt, IRQF_SHARED,
430 mbox->name, mbox); 265 mbox->name, mbox);
431 if (unlikely(ret)) { 266 if (unlikely(ret)) {
432 printk(KERN_ERR 267 printk(KERN_ERR
@@ -434,14 +269,14 @@ static int omap_mbox_init(struct omap_mbox *mbox)
434 goto fail_request_irq; 269 goto fail_request_irq;
435 } 270 }
436 271
437 mq = mbox_queue_alloc(mbox, mbox_txq_fn, mbox_tx_work); 272 mq = mbox_queue_alloc(mbox, mbox_txq_fn, NULL, mbox_tx_tasklet);
438 if (!mq) { 273 if (!mq) {
439 ret = -ENOMEM; 274 ret = -ENOMEM;
440 goto fail_alloc_txq; 275 goto fail_alloc_txq;
441 } 276 }
442 mbox->txq = mq; 277 mbox->txq = mq;
443 278
444 mq = mbox_queue_alloc(mbox, mbox_rxq_fn, mbox_rx_work); 279 mq = mbox_queue_alloc(mbox, mbox_rxq_fn, mbox_rx_work, NULL);
445 if (!mq) { 280 if (!mq) {
446 ret = -ENOMEM; 281 ret = -ENOMEM;
447 goto fail_alloc_rxq; 282 goto fail_alloc_rxq;
@@ -468,8 +303,14 @@ static void omap_mbox_fini(struct omap_mbox *mbox)
468 303
469 free_irq(mbox->irq, mbox); 304 free_irq(mbox->irq, mbox);
470 305
471 if (unlikely(mbox->ops->shutdown)) 306 if (unlikely(mbox->ops->shutdown)) {
472 mbox->ops->shutdown(mbox); 307 write_lock(&mboxes_lock);
308 if (mbox_configured > 0)
309 mbox_configured--;
310 if (!mbox_configured)
311 mbox->ops->shutdown(mbox);
312 write_unlock(&mboxes_lock);
313 }
473} 314}
474 315
475static struct omap_mbox **find_mboxes(const char *name) 316static struct omap_mbox **find_mboxes(const char *name)
@@ -498,7 +339,7 @@ struct omap_mbox *omap_mbox_get(const char *name)
498 339
499 read_unlock(&mboxes_lock); 340 read_unlock(&mboxes_lock);
500 341
501 ret = omap_mbox_init(mbox); 342 ret = omap_mbox_startup(mbox);
502 if (ret) 343 if (ret)
503 return ERR_PTR(-ENODEV); 344 return ERR_PTR(-ENODEV);
504 345
@@ -522,15 +363,6 @@ int omap_mbox_register(struct device *parent, struct omap_mbox *mbox)
522 if (mbox->next) 363 if (mbox->next)
523 return -EBUSY; 364 return -EBUSY;
524 365
525 mbox->dev = device_create(&omap_mbox_class,
526 parent, 0, mbox, "%s", mbox->name);
527 if (IS_ERR(mbox->dev))
528 return PTR_ERR(mbox->dev);
529
530 ret = device_create_file(mbox->dev, &dev_attr_mbox);
531 if (ret)
532 goto err_sysfs;
533
534 write_lock(&mboxes_lock); 366 write_lock(&mboxes_lock);
535 tmp = find_mboxes(mbox->name); 367 tmp = find_mboxes(mbox->name);
536 if (*tmp) { 368 if (*tmp) {
@@ -544,9 +376,6 @@ int omap_mbox_register(struct device *parent, struct omap_mbox *mbox)
544 return 0; 376 return 0;
545 377
546err_find: 378err_find:
547 device_remove_file(mbox->dev, &dev_attr_mbox);
548err_sysfs:
549 device_unregister(mbox->dev);
550 return ret; 379 return ret;
551} 380}
552EXPORT_SYMBOL(omap_mbox_register); 381EXPORT_SYMBOL(omap_mbox_register);
@@ -562,8 +391,6 @@ int omap_mbox_unregister(struct omap_mbox *mbox)
562 *tmp = mbox->next; 391 *tmp = mbox->next;
563 mbox->next = NULL; 392 mbox->next = NULL;
564 write_unlock(&mboxes_lock); 393 write_unlock(&mboxes_lock);
565 device_remove_file(mbox->dev, &dev_attr_mbox);
566 device_unregister(mbox->dev);
567 return 0; 394 return 0;
568 } 395 }
569 tmp = &(*tmp)->next; 396 tmp = &(*tmp)->next;
@@ -574,23 +401,21 @@ int omap_mbox_unregister(struct omap_mbox *mbox)
574} 401}
575EXPORT_SYMBOL(omap_mbox_unregister); 402EXPORT_SYMBOL(omap_mbox_unregister);
576 403
577static int __init omap_mbox_class_init(void) 404static int __init omap_mbox_init(void)
578{ 405{
579 int ret = class_register(&omap_mbox_class); 406 mboxd = create_workqueue("mboxd");
580 if (!ret) 407 if (!mboxd)
581 ret = class_create_file(&omap_mbox_class, &class_attr_mbox); 408 return -ENOMEM;
582 409
583 return ret; 410 return 0;
584} 411}
412module_init(omap_mbox_init);
585 413
586static void __exit omap_mbox_class_exit(void) 414static void __exit omap_mbox_exit(void)
587{ 415{
588 class_remove_file(&omap_mbox_class, &class_attr_mbox); 416 destroy_workqueue(mboxd);
589 class_unregister(&omap_mbox_class);
590} 417}
591 418module_exit(omap_mbox_exit);
592subsys_initcall(omap_mbox_class_init);
593module_exit(omap_mbox_class_exit);
594 419
595MODULE_LICENSE("GPL v2"); 420MODULE_LICENSE("GPL v2");
596MODULE_DESCRIPTION("omap mailbox: interrupt driven messaging"); 421MODULE_DESCRIPTION("omap mailbox: interrupt driven messaging");
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index e664b912d7bb..e1d0440fd4a8 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -23,68 +23,102 @@
23#include <linux/clk.h> 23#include <linux/clk.h>
24#include <linux/delay.h> 24#include <linux/delay.h>
25#include <linux/io.h> 25#include <linux/io.h>
26#include <linux/slab.h>
26 27
27#include <mach/dma.h> 28#include <plat/dma.h>
28#include <mach/mcbsp.h> 29#include <plat/mcbsp.h>
30
31#include "../mach-omap2/cm-regbits-34xx.h"
29 32
30struct omap_mcbsp **mcbsp_ptr; 33struct omap_mcbsp **mcbsp_ptr;
31int omap_mcbsp_count; 34int omap_mcbsp_count, omap_mcbsp_cache_size;
32 35
33void omap_mcbsp_write(void __iomem *io_base, u16 reg, u32 val) 36void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val)
34{ 37{
35 if (cpu_class_is_omap1() || cpu_is_omap2420()) 38 if (cpu_class_is_omap1()) {
36 __raw_writew((u16)val, io_base + reg); 39 ((u16 *)mcbsp->reg_cache)[reg / sizeof(u16)] = (u16)val;
37 else 40 __raw_writew((u16)val, mcbsp->io_base + reg);
38 __raw_writel(val, io_base + reg); 41 } else if (cpu_is_omap2420()) {
42 ((u16 *)mcbsp->reg_cache)[reg / sizeof(u32)] = (u16)val;
43 __raw_writew((u16)val, mcbsp->io_base + reg);
44 } else {
45 ((u32 *)mcbsp->reg_cache)[reg / sizeof(u32)] = val;
46 __raw_writel(val, mcbsp->io_base + reg);
47 }
39} 48}
40 49
41int omap_mcbsp_read(void __iomem *io_base, u16 reg) 50int omap_mcbsp_read(struct omap_mcbsp *mcbsp, u16 reg, bool from_cache)
42{ 51{
43 if (cpu_class_is_omap1() || cpu_is_omap2420()) 52 if (cpu_class_is_omap1()) {
44 return __raw_readw(io_base + reg); 53 return !from_cache ? __raw_readw(mcbsp->io_base + reg) :
45 else 54 ((u16 *)mcbsp->reg_cache)[reg / sizeof(u16)];
46 return __raw_readl(io_base + reg); 55 } else if (cpu_is_omap2420()) {
56 return !from_cache ? __raw_readw(mcbsp->io_base + reg) :
57 ((u16 *)mcbsp->reg_cache)[reg / sizeof(u32)];
58 } else {
59 return !from_cache ? __raw_readl(mcbsp->io_base + reg) :
60 ((u32 *)mcbsp->reg_cache)[reg / sizeof(u32)];
61 }
62}
63
64#ifdef CONFIG_ARCH_OMAP3
65void omap_mcbsp_st_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val)
66{
67 __raw_writel(val, mcbsp->st_data->io_base_st + reg);
47} 68}
48 69
49#define OMAP_MCBSP_READ(base, reg) \ 70int omap_mcbsp_st_read(struct omap_mcbsp *mcbsp, u16 reg)
50 omap_mcbsp_read(base, OMAP_MCBSP_REG_##reg) 71{
51#define OMAP_MCBSP_WRITE(base, reg, val) \ 72 return __raw_readl(mcbsp->st_data->io_base_st + reg);
52 omap_mcbsp_write(base, OMAP_MCBSP_REG_##reg, val) 73}
74#endif
75
76#define MCBSP_READ(mcbsp, reg) \
77 omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 0)
78#define MCBSP_WRITE(mcbsp, reg, val) \
79 omap_mcbsp_write(mcbsp, OMAP_MCBSP_REG_##reg, val)
80#define MCBSP_READ_CACHE(mcbsp, reg) \
81 omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 1)
53 82
54#define omap_mcbsp_check_valid_id(id) (id < omap_mcbsp_count) 83#define omap_mcbsp_check_valid_id(id) (id < omap_mcbsp_count)
55#define id_to_mcbsp_ptr(id) mcbsp_ptr[id]; 84#define id_to_mcbsp_ptr(id) mcbsp_ptr[id];
56 85
86#define MCBSP_ST_READ(mcbsp, reg) \
87 omap_mcbsp_st_read(mcbsp, OMAP_ST_REG_##reg)
88#define MCBSP_ST_WRITE(mcbsp, reg, val) \
89 omap_mcbsp_st_write(mcbsp, OMAP_ST_REG_##reg, val)
90
57static void omap_mcbsp_dump_reg(u8 id) 91static void omap_mcbsp_dump_reg(u8 id)
58{ 92{
59 struct omap_mcbsp *mcbsp = id_to_mcbsp_ptr(id); 93 struct omap_mcbsp *mcbsp = id_to_mcbsp_ptr(id);
60 94
61 dev_dbg(mcbsp->dev, "**** McBSP%d regs ****\n", mcbsp->id); 95 dev_dbg(mcbsp->dev, "**** McBSP%d regs ****\n", mcbsp->id);
62 dev_dbg(mcbsp->dev, "DRR2: 0x%04x\n", 96 dev_dbg(mcbsp->dev, "DRR2: 0x%04x\n",
63 OMAP_MCBSP_READ(mcbsp->io_base, DRR2)); 97 MCBSP_READ(mcbsp, DRR2));
64 dev_dbg(mcbsp->dev, "DRR1: 0x%04x\n", 98 dev_dbg(mcbsp->dev, "DRR1: 0x%04x\n",
65 OMAP_MCBSP_READ(mcbsp->io_base, DRR1)); 99 MCBSP_READ(mcbsp, DRR1));
66 dev_dbg(mcbsp->dev, "DXR2: 0x%04x\n", 100 dev_dbg(mcbsp->dev, "DXR2: 0x%04x\n",
67 OMAP_MCBSP_READ(mcbsp->io_base, DXR2)); 101 MCBSP_READ(mcbsp, DXR2));
68 dev_dbg(mcbsp->dev, "DXR1: 0x%04x\n", 102 dev_dbg(mcbsp->dev, "DXR1: 0x%04x\n",
69 OMAP_MCBSP_READ(mcbsp->io_base, DXR1)); 103 MCBSP_READ(mcbsp, DXR1));
70 dev_dbg(mcbsp->dev, "SPCR2: 0x%04x\n", 104 dev_dbg(mcbsp->dev, "SPCR2: 0x%04x\n",
71 OMAP_MCBSP_READ(mcbsp->io_base, SPCR2)); 105 MCBSP_READ(mcbsp, SPCR2));
72 dev_dbg(mcbsp->dev, "SPCR1: 0x%04x\n", 106 dev_dbg(mcbsp->dev, "SPCR1: 0x%04x\n",
73 OMAP_MCBSP_READ(mcbsp->io_base, SPCR1)); 107 MCBSP_READ(mcbsp, SPCR1));
74 dev_dbg(mcbsp->dev, "RCR2: 0x%04x\n", 108 dev_dbg(mcbsp->dev, "RCR2: 0x%04x\n",
75 OMAP_MCBSP_READ(mcbsp->io_base, RCR2)); 109 MCBSP_READ(mcbsp, RCR2));
76 dev_dbg(mcbsp->dev, "RCR1: 0x%04x\n", 110 dev_dbg(mcbsp->dev, "RCR1: 0x%04x\n",
77 OMAP_MCBSP_READ(mcbsp->io_base, RCR1)); 111 MCBSP_READ(mcbsp, RCR1));
78 dev_dbg(mcbsp->dev, "XCR2: 0x%04x\n", 112 dev_dbg(mcbsp->dev, "XCR2: 0x%04x\n",
79 OMAP_MCBSP_READ(mcbsp->io_base, XCR2)); 113 MCBSP_READ(mcbsp, XCR2));
80 dev_dbg(mcbsp->dev, "XCR1: 0x%04x\n", 114 dev_dbg(mcbsp->dev, "XCR1: 0x%04x\n",
81 OMAP_MCBSP_READ(mcbsp->io_base, XCR1)); 115 MCBSP_READ(mcbsp, XCR1));
82 dev_dbg(mcbsp->dev, "SRGR2: 0x%04x\n", 116 dev_dbg(mcbsp->dev, "SRGR2: 0x%04x\n",
83 OMAP_MCBSP_READ(mcbsp->io_base, SRGR2)); 117 MCBSP_READ(mcbsp, SRGR2));
84 dev_dbg(mcbsp->dev, "SRGR1: 0x%04x\n", 118 dev_dbg(mcbsp->dev, "SRGR1: 0x%04x\n",
85 OMAP_MCBSP_READ(mcbsp->io_base, SRGR1)); 119 MCBSP_READ(mcbsp, SRGR1));
86 dev_dbg(mcbsp->dev, "PCR0: 0x%04x\n", 120 dev_dbg(mcbsp->dev, "PCR0: 0x%04x\n",
87 OMAP_MCBSP_READ(mcbsp->io_base, PCR0)); 121 MCBSP_READ(mcbsp, PCR0));
88 dev_dbg(mcbsp->dev, "***********************\n"); 122 dev_dbg(mcbsp->dev, "***********************\n");
89} 123}
90 124
@@ -93,15 +127,14 @@ static irqreturn_t omap_mcbsp_tx_irq_handler(int irq, void *dev_id)
93 struct omap_mcbsp *mcbsp_tx = dev_id; 127 struct omap_mcbsp *mcbsp_tx = dev_id;
94 u16 irqst_spcr2; 128 u16 irqst_spcr2;
95 129
96 irqst_spcr2 = OMAP_MCBSP_READ(mcbsp_tx->io_base, SPCR2); 130 irqst_spcr2 = MCBSP_READ(mcbsp_tx, SPCR2);
97 dev_dbg(mcbsp_tx->dev, "TX IRQ callback : 0x%x\n", irqst_spcr2); 131 dev_dbg(mcbsp_tx->dev, "TX IRQ callback : 0x%x\n", irqst_spcr2);
98 132
99 if (irqst_spcr2 & XSYNC_ERR) { 133 if (irqst_spcr2 & XSYNC_ERR) {
100 dev_err(mcbsp_tx->dev, "TX Frame Sync Error! : 0x%x\n", 134 dev_err(mcbsp_tx->dev, "TX Frame Sync Error! : 0x%x\n",
101 irqst_spcr2); 135 irqst_spcr2);
102 /* Writing zero to XSYNC_ERR clears the IRQ */ 136 /* Writing zero to XSYNC_ERR clears the IRQ */
103 OMAP_MCBSP_WRITE(mcbsp_tx->io_base, SPCR2, 137 MCBSP_WRITE(mcbsp_tx, SPCR2, MCBSP_READ_CACHE(mcbsp_tx, SPCR2));
104 irqst_spcr2 & ~(XSYNC_ERR));
105 } else { 138 } else {
106 complete(&mcbsp_tx->tx_irq_completion); 139 complete(&mcbsp_tx->tx_irq_completion);
107 } 140 }
@@ -114,15 +147,14 @@ static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id)
114 struct omap_mcbsp *mcbsp_rx = dev_id; 147 struct omap_mcbsp *mcbsp_rx = dev_id;
115 u16 irqst_spcr1; 148 u16 irqst_spcr1;
116 149
117 irqst_spcr1 = OMAP_MCBSP_READ(mcbsp_rx->io_base, SPCR1); 150 irqst_spcr1 = MCBSP_READ(mcbsp_rx, SPCR1);
118 dev_dbg(mcbsp_rx->dev, "RX IRQ callback : 0x%x\n", irqst_spcr1); 151 dev_dbg(mcbsp_rx->dev, "RX IRQ callback : 0x%x\n", irqst_spcr1);
119 152
120 if (irqst_spcr1 & RSYNC_ERR) { 153 if (irqst_spcr1 & RSYNC_ERR) {
121 dev_err(mcbsp_rx->dev, "RX Frame Sync Error! : 0x%x\n", 154 dev_err(mcbsp_rx->dev, "RX Frame Sync Error! : 0x%x\n",
122 irqst_spcr1); 155 irqst_spcr1);
123 /* Writing zero to RSYNC_ERR clears the IRQ */ 156 /* Writing zero to RSYNC_ERR clears the IRQ */
124 OMAP_MCBSP_WRITE(mcbsp_rx->io_base, SPCR1, 157 MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1));
125 irqst_spcr1 & ~(RSYNC_ERR));
126 } else { 158 } else {
127 complete(&mcbsp_rx->tx_irq_completion); 159 complete(&mcbsp_rx->tx_irq_completion);
128 } 160 }
@@ -135,7 +167,7 @@ static void omap_mcbsp_tx_dma_callback(int lch, u16 ch_status, void *data)
135 struct omap_mcbsp *mcbsp_dma_tx = data; 167 struct omap_mcbsp *mcbsp_dma_tx = data;
136 168
137 dev_dbg(mcbsp_dma_tx->dev, "TX DMA callback : 0x%x\n", 169 dev_dbg(mcbsp_dma_tx->dev, "TX DMA callback : 0x%x\n",
138 OMAP_MCBSP_READ(mcbsp_dma_tx->io_base, SPCR2)); 170 MCBSP_READ(mcbsp_dma_tx, SPCR2));
139 171
140 /* We can free the channels */ 172 /* We can free the channels */
141 omap_free_dma(mcbsp_dma_tx->dma_tx_lch); 173 omap_free_dma(mcbsp_dma_tx->dma_tx_lch);
@@ -149,7 +181,7 @@ static void omap_mcbsp_rx_dma_callback(int lch, u16 ch_status, void *data)
149 struct omap_mcbsp *mcbsp_dma_rx = data; 181 struct omap_mcbsp *mcbsp_dma_rx = data;
150 182
151 dev_dbg(mcbsp_dma_rx->dev, "RX DMA callback : 0x%x\n", 183 dev_dbg(mcbsp_dma_rx->dev, "RX DMA callback : 0x%x\n",
152 OMAP_MCBSP_READ(mcbsp_dma_rx->io_base, SPCR2)); 184 MCBSP_READ(mcbsp_dma_rx, SPCR2));
153 185
154 /* We can free the channels */ 186 /* We can free the channels */
155 omap_free_dma(mcbsp_dma_rx->dma_rx_lch); 187 omap_free_dma(mcbsp_dma_rx->dma_rx_lch);
@@ -167,7 +199,6 @@ static void omap_mcbsp_rx_dma_callback(int lch, u16 ch_status, void *data)
167void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config) 199void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config)
168{ 200{
169 struct omap_mcbsp *mcbsp; 201 struct omap_mcbsp *mcbsp;
170 void __iomem *io_base;
171 202
172 if (!omap_mcbsp_check_valid_id(id)) { 203 if (!omap_mcbsp_check_valid_id(id)) {
173 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); 204 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
@@ -175,30 +206,280 @@ void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config)
175 } 206 }
176 mcbsp = id_to_mcbsp_ptr(id); 207 mcbsp = id_to_mcbsp_ptr(id);
177 208
178 io_base = mcbsp->io_base;
179 dev_dbg(mcbsp->dev, "Configuring McBSP%d phys_base: 0x%08lx\n", 209 dev_dbg(mcbsp->dev, "Configuring McBSP%d phys_base: 0x%08lx\n",
180 mcbsp->id, mcbsp->phys_base); 210 mcbsp->id, mcbsp->phys_base);
181 211
182 /* We write the given config */ 212 /* We write the given config */
183 OMAP_MCBSP_WRITE(io_base, SPCR2, config->spcr2); 213 MCBSP_WRITE(mcbsp, SPCR2, config->spcr2);
184 OMAP_MCBSP_WRITE(io_base, SPCR1, config->spcr1); 214 MCBSP_WRITE(mcbsp, SPCR1, config->spcr1);
185 OMAP_MCBSP_WRITE(io_base, RCR2, config->rcr2); 215 MCBSP_WRITE(mcbsp, RCR2, config->rcr2);
186 OMAP_MCBSP_WRITE(io_base, RCR1, config->rcr1); 216 MCBSP_WRITE(mcbsp, RCR1, config->rcr1);
187 OMAP_MCBSP_WRITE(io_base, XCR2, config->xcr2); 217 MCBSP_WRITE(mcbsp, XCR2, config->xcr2);
188 OMAP_MCBSP_WRITE(io_base, XCR1, config->xcr1); 218 MCBSP_WRITE(mcbsp, XCR1, config->xcr1);
189 OMAP_MCBSP_WRITE(io_base, SRGR2, config->srgr2); 219 MCBSP_WRITE(mcbsp, SRGR2, config->srgr2);
190 OMAP_MCBSP_WRITE(io_base, SRGR1, config->srgr1); 220 MCBSP_WRITE(mcbsp, SRGR1, config->srgr1);
191 OMAP_MCBSP_WRITE(io_base, MCR2, config->mcr2); 221 MCBSP_WRITE(mcbsp, MCR2, config->mcr2);
192 OMAP_MCBSP_WRITE(io_base, MCR1, config->mcr1); 222 MCBSP_WRITE(mcbsp, MCR1, config->mcr1);
193 OMAP_MCBSP_WRITE(io_base, PCR0, config->pcr0); 223 MCBSP_WRITE(mcbsp, PCR0, config->pcr0);
194 if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { 224 if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) {
195 OMAP_MCBSP_WRITE(io_base, XCCR, config->xccr); 225 MCBSP_WRITE(mcbsp, XCCR, config->xccr);
196 OMAP_MCBSP_WRITE(io_base, RCCR, config->rccr); 226 MCBSP_WRITE(mcbsp, RCCR, config->rccr);
197 } 227 }
198} 228}
199EXPORT_SYMBOL(omap_mcbsp_config); 229EXPORT_SYMBOL(omap_mcbsp_config);
200 230
201#ifdef CONFIG_ARCH_OMAP34XX 231#ifdef CONFIG_ARCH_OMAP3
232static void omap_st_on(struct omap_mcbsp *mcbsp)
233{
234 unsigned int w;
235
236 /*
237 * Sidetone uses McBSP ICLK - which must not idle when sidetones
238 * are enabled or sidetones start sounding ugly.
239 */
240 w = cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE);
241 w &= ~(1 << (mcbsp->id - 2));
242 cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE);
243
244 /* Enable McBSP Sidetone */
245 w = MCBSP_READ(mcbsp, SSELCR);
246 MCBSP_WRITE(mcbsp, SSELCR, w | SIDETONEEN);
247
248 w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
249 MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE));
250
251 /* Enable Sidetone from Sidetone Core */
252 w = MCBSP_ST_READ(mcbsp, SSELCR);
253 MCBSP_ST_WRITE(mcbsp, SSELCR, w | ST_SIDETONEEN);
254}
255
256static void omap_st_off(struct omap_mcbsp *mcbsp)
257{
258 unsigned int w;
259
260 w = MCBSP_ST_READ(mcbsp, SSELCR);
261 MCBSP_ST_WRITE(mcbsp, SSELCR, w & ~(ST_SIDETONEEN));
262
263 w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
264 MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w | ST_AUTOIDLE);
265
266 w = MCBSP_READ(mcbsp, SSELCR);
267 MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN));
268
269 w = cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE);
270 w |= 1 << (mcbsp->id - 2);
271 cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE);
272}
273
274static void omap_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir)
275{
276 u16 val, i;
277
278 val = MCBSP_ST_READ(mcbsp, SYSCONFIG);
279 MCBSP_ST_WRITE(mcbsp, SYSCONFIG, val & ~(ST_AUTOIDLE));
280
281 val = MCBSP_ST_READ(mcbsp, SSELCR);
282
283 if (val & ST_COEFFWREN)
284 MCBSP_ST_WRITE(mcbsp, SSELCR, val & ~(ST_COEFFWREN));
285
286 MCBSP_ST_WRITE(mcbsp, SSELCR, val | ST_COEFFWREN);
287
288 for (i = 0; i < 128; i++)
289 MCBSP_ST_WRITE(mcbsp, SFIRCR, fir[i]);
290
291 i = 0;
292
293 val = MCBSP_ST_READ(mcbsp, SSELCR);
294 while (!(val & ST_COEFFWRDONE) && (++i < 1000))
295 val = MCBSP_ST_READ(mcbsp, SSELCR);
296
297 MCBSP_ST_WRITE(mcbsp, SSELCR, val & ~(ST_COEFFWREN));
298
299 if (i == 1000)
300 dev_err(mcbsp->dev, "McBSP FIR load error!\n");
301}
302
303static void omap_st_chgain(struct omap_mcbsp *mcbsp)
304{
305 u16 w;
306 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
307
308 w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
309 MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE));
310
311 w = MCBSP_ST_READ(mcbsp, SSELCR);
312
313 MCBSP_ST_WRITE(mcbsp, SGAINCR, ST_CH0GAIN(st_data->ch0gain) | \
314 ST_CH1GAIN(st_data->ch1gain));
315}
316
317int omap_st_set_chgain(unsigned int id, int channel, s16 chgain)
318{
319 struct omap_mcbsp *mcbsp;
320 struct omap_mcbsp_st_data *st_data;
321 int ret = 0;
322
323 if (!omap_mcbsp_check_valid_id(id)) {
324 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
325 return -ENODEV;
326 }
327
328 mcbsp = id_to_mcbsp_ptr(id);
329 st_data = mcbsp->st_data;
330
331 if (!st_data)
332 return -ENOENT;
333
334 spin_lock_irq(&mcbsp->lock);
335 if (channel == 0)
336 st_data->ch0gain = chgain;
337 else if (channel == 1)
338 st_data->ch1gain = chgain;
339 else
340 ret = -EINVAL;
341
342 if (st_data->enabled)
343 omap_st_chgain(mcbsp);
344 spin_unlock_irq(&mcbsp->lock);
345
346 return ret;
347}
348EXPORT_SYMBOL(omap_st_set_chgain);
349
350int omap_st_get_chgain(unsigned int id, int channel, s16 *chgain)
351{
352 struct omap_mcbsp *mcbsp;
353 struct omap_mcbsp_st_data *st_data;
354 int ret = 0;
355
356 if (!omap_mcbsp_check_valid_id(id)) {
357 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
358 return -ENODEV;
359 }
360
361 mcbsp = id_to_mcbsp_ptr(id);
362 st_data = mcbsp->st_data;
363
364 if (!st_data)
365 return -ENOENT;
366
367 spin_lock_irq(&mcbsp->lock);
368 if (channel == 0)
369 *chgain = st_data->ch0gain;
370 else if (channel == 1)
371 *chgain = st_data->ch1gain;
372 else
373 ret = -EINVAL;
374 spin_unlock_irq(&mcbsp->lock);
375
376 return ret;
377}
378EXPORT_SYMBOL(omap_st_get_chgain);
379
380static int omap_st_start(struct omap_mcbsp *mcbsp)
381{
382 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
383
384 if (st_data && st_data->enabled && !st_data->running) {
385 omap_st_fir_write(mcbsp, st_data->taps);
386 omap_st_chgain(mcbsp);
387
388 if (!mcbsp->free) {
389 omap_st_on(mcbsp);
390 st_data->running = 1;
391 }
392 }
393
394 return 0;
395}
396
397int omap_st_enable(unsigned int id)
398{
399 struct omap_mcbsp *mcbsp;
400 struct omap_mcbsp_st_data *st_data;
401
402 if (!omap_mcbsp_check_valid_id(id)) {
403 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
404 return -ENODEV;
405 }
406
407 mcbsp = id_to_mcbsp_ptr(id);
408 st_data = mcbsp->st_data;
409
410 if (!st_data)
411 return -ENODEV;
412
413 spin_lock_irq(&mcbsp->lock);
414 st_data->enabled = 1;
415 omap_st_start(mcbsp);
416 spin_unlock_irq(&mcbsp->lock);
417
418 return 0;
419}
420EXPORT_SYMBOL(omap_st_enable);
421
422static int omap_st_stop(struct omap_mcbsp *mcbsp)
423{
424 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
425
426 if (st_data && st_data->running) {
427 if (!mcbsp->free) {
428 omap_st_off(mcbsp);
429 st_data->running = 0;
430 }
431 }
432
433 return 0;
434}
435
436int omap_st_disable(unsigned int id)
437{
438 struct omap_mcbsp *mcbsp;
439 struct omap_mcbsp_st_data *st_data;
440 int ret = 0;
441
442 if (!omap_mcbsp_check_valid_id(id)) {
443 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
444 return -ENODEV;
445 }
446
447 mcbsp = id_to_mcbsp_ptr(id);
448 st_data = mcbsp->st_data;
449
450 if (!st_data)
451 return -ENODEV;
452
453 spin_lock_irq(&mcbsp->lock);
454 omap_st_stop(mcbsp);
455 st_data->enabled = 0;
456 spin_unlock_irq(&mcbsp->lock);
457
458 return ret;
459}
460EXPORT_SYMBOL(omap_st_disable);
461
462int omap_st_is_enabled(unsigned int id)
463{
464 struct omap_mcbsp *mcbsp;
465 struct omap_mcbsp_st_data *st_data;
466
467 if (!omap_mcbsp_check_valid_id(id)) {
468 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
469 return -ENODEV;
470 }
471
472 mcbsp = id_to_mcbsp_ptr(id);
473 st_data = mcbsp->st_data;
474
475 if (!st_data)
476 return -ENODEV;
477
478
479 return st_data->enabled;
480}
481EXPORT_SYMBOL(omap_st_is_enabled);
482
202/* 483/*
203 * omap_mcbsp_set_tx_threshold configures how to deal 484 * omap_mcbsp_set_tx_threshold configures how to deal
204 * with transmit threshold. the threshold value and handler can be 485 * with transmit threshold. the threshold value and handler can be
@@ -207,7 +488,6 @@ EXPORT_SYMBOL(omap_mcbsp_config);
207void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold) 488void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold)
208{ 489{
209 struct omap_mcbsp *mcbsp; 490 struct omap_mcbsp *mcbsp;
210 void __iomem *io_base;
211 491
212 if (!cpu_is_omap34xx()) 492 if (!cpu_is_omap34xx())
213 return; 493 return;
@@ -217,9 +497,8 @@ void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold)
217 return; 497 return;
218 } 498 }
219 mcbsp = id_to_mcbsp_ptr(id); 499 mcbsp = id_to_mcbsp_ptr(id);
220 io_base = mcbsp->io_base;
221 500
222 OMAP_MCBSP_WRITE(io_base, THRSH2, threshold); 501 MCBSP_WRITE(mcbsp, THRSH2, threshold);
223} 502}
224EXPORT_SYMBOL(omap_mcbsp_set_tx_threshold); 503EXPORT_SYMBOL(omap_mcbsp_set_tx_threshold);
225 504
@@ -231,7 +510,6 @@ EXPORT_SYMBOL(omap_mcbsp_set_tx_threshold);
231void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold) 510void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold)
232{ 511{
233 struct omap_mcbsp *mcbsp; 512 struct omap_mcbsp *mcbsp;
234 void __iomem *io_base;
235 513
236 if (!cpu_is_omap34xx()) 514 if (!cpu_is_omap34xx())
237 return; 515 return;
@@ -241,9 +519,8 @@ void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold)
241 return; 519 return;
242 } 520 }
243 mcbsp = id_to_mcbsp_ptr(id); 521 mcbsp = id_to_mcbsp_ptr(id);
244 io_base = mcbsp->io_base;
245 522
246 OMAP_MCBSP_WRITE(io_base, THRSH1, threshold); 523 MCBSP_WRITE(mcbsp, THRSH1, threshold);
247} 524}
248EXPORT_SYMBOL(omap_mcbsp_set_rx_threshold); 525EXPORT_SYMBOL(omap_mcbsp_set_rx_threshold);
249 526
@@ -298,9 +575,7 @@ int omap_mcbsp_get_dma_op_mode(unsigned int id)
298 } 575 }
299 mcbsp = id_to_mcbsp_ptr(id); 576 mcbsp = id_to_mcbsp_ptr(id);
300 577
301 spin_lock_irq(&mcbsp->lock);
302 dma_op_mode = mcbsp->dma_op_mode; 578 dma_op_mode = mcbsp->dma_op_mode;
303 spin_unlock_irq(&mcbsp->lock);
304 579
305 return dma_op_mode; 580 return dma_op_mode;
306} 581}
@@ -315,21 +590,18 @@ static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp)
315 if (cpu_is_omap34xx()) { 590 if (cpu_is_omap34xx()) {
316 u16 syscon; 591 u16 syscon;
317 592
318 syscon = OMAP_MCBSP_READ(mcbsp->io_base, SYSCON); 593 syscon = MCBSP_READ(mcbsp, SYSCON);
319 syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03)); 594 syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));
320 595
321 spin_lock_irq(&mcbsp->lock);
322 if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) { 596 if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) {
323 syscon |= (ENAWAKEUP | SIDLEMODE(0x02) | 597 syscon |= (ENAWAKEUP | SIDLEMODE(0x02) |
324 CLOCKACTIVITY(0x02)); 598 CLOCKACTIVITY(0x02));
325 OMAP_MCBSP_WRITE(mcbsp->io_base, WAKEUPEN, 599 MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN);
326 XRDYEN | RRDYEN);
327 } else { 600 } else {
328 syscon |= SIDLEMODE(0x01); 601 syscon |= SIDLEMODE(0x01);
329 } 602 }
330 spin_unlock_irq(&mcbsp->lock);
331 603
332 OMAP_MCBSP_WRITE(mcbsp->io_base, SYSCON, syscon); 604 MCBSP_WRITE(mcbsp, SYSCON, syscon);
333 } 605 }
334} 606}
335 607
@@ -341,7 +613,7 @@ static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp)
341 if (cpu_is_omap34xx()) { 613 if (cpu_is_omap34xx()) {
342 u16 syscon; 614 u16 syscon;
343 615
344 syscon = OMAP_MCBSP_READ(mcbsp->io_base, SYSCON); 616 syscon = MCBSP_READ(mcbsp, SYSCON);
345 syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03)); 617 syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));
346 /* 618 /*
347 * HW bug workaround - If no_idle mode is taken, we need to 619 * HW bug workaround - If no_idle mode is taken, we need to
@@ -349,17 +621,19 @@ static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp)
349 * device will not hit retention anymore. 621 * device will not hit retention anymore.
350 */ 622 */
351 syscon |= SIDLEMODE(0x02); 623 syscon |= SIDLEMODE(0x02);
352 OMAP_MCBSP_WRITE(mcbsp->io_base, SYSCON, syscon); 624 MCBSP_WRITE(mcbsp, SYSCON, syscon);
353 625
354 syscon &= ~(SIDLEMODE(0x03)); 626 syscon &= ~(SIDLEMODE(0x03));
355 OMAP_MCBSP_WRITE(mcbsp->io_base, SYSCON, syscon); 627 MCBSP_WRITE(mcbsp, SYSCON, syscon);
356 628
357 OMAP_MCBSP_WRITE(mcbsp->io_base, WAKEUPEN, 0); 629 MCBSP_WRITE(mcbsp, WAKEUPEN, 0);
358 } 630 }
359} 631}
360#else 632#else
361static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp) {} 633static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp) {}
362static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp) {} 634static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp) {}
635static inline void omap_st_start(struct omap_mcbsp *mcbsp) {}
636static inline void omap_st_stop(struct omap_mcbsp *mcbsp) {}
363#endif 637#endif
364 638
365/* 639/*
@@ -396,6 +670,7 @@ EXPORT_SYMBOL(omap_mcbsp_set_io_type);
396int omap_mcbsp_request(unsigned int id) 670int omap_mcbsp_request(unsigned int id)
397{ 671{
398 struct omap_mcbsp *mcbsp; 672 struct omap_mcbsp *mcbsp;
673 void *reg_cache;
399 int err; 674 int err;
400 675
401 if (!omap_mcbsp_check_valid_id(id)) { 676 if (!omap_mcbsp_check_valid_id(id)) {
@@ -404,15 +679,21 @@ int omap_mcbsp_request(unsigned int id)
404 } 679 }
405 mcbsp = id_to_mcbsp_ptr(id); 680 mcbsp = id_to_mcbsp_ptr(id);
406 681
682 reg_cache = kzalloc(omap_mcbsp_cache_size, GFP_KERNEL);
683 if (!reg_cache) {
684 return -ENOMEM;
685 }
686
407 spin_lock(&mcbsp->lock); 687 spin_lock(&mcbsp->lock);
408 if (!mcbsp->free) { 688 if (!mcbsp->free) {
409 dev_err(mcbsp->dev, "McBSP%d is currently in use\n", 689 dev_err(mcbsp->dev, "McBSP%d is currently in use\n",
410 mcbsp->id); 690 mcbsp->id);
411 spin_unlock(&mcbsp->lock); 691 err = -EBUSY;
412 return -EBUSY; 692 goto err_kfree;
413 } 693 }
414 694
415 mcbsp->free = 0; 695 mcbsp->free = 0;
696 mcbsp->reg_cache = reg_cache;
416 spin_unlock(&mcbsp->lock); 697 spin_unlock(&mcbsp->lock);
417 698
418 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request) 699 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
@@ -428,8 +709,8 @@ int omap_mcbsp_request(unsigned int id)
428 * Make sure that transmitter, receiver and sample-rate generator are 709 * Make sure that transmitter, receiver and sample-rate generator are
429 * not running before activating IRQs. 710 * not running before activating IRQs.
430 */ 711 */
431 OMAP_MCBSP_WRITE(mcbsp->io_base, SPCR1, 0); 712 MCBSP_WRITE(mcbsp, SPCR1, 0);
432 OMAP_MCBSP_WRITE(mcbsp->io_base, SPCR2, 0); 713 MCBSP_WRITE(mcbsp, SPCR2, 0);
433 714
434 if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) { 715 if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) {
435 /* We need to get IRQs here */ 716 /* We need to get IRQs here */
@@ -440,7 +721,7 @@ int omap_mcbsp_request(unsigned int id)
440 dev_err(mcbsp->dev, "Unable to request TX IRQ %d " 721 dev_err(mcbsp->dev, "Unable to request TX IRQ %d "
441 "for McBSP%d\n", mcbsp->tx_irq, 722 "for McBSP%d\n", mcbsp->tx_irq,
442 mcbsp->id); 723 mcbsp->id);
443 return err; 724 goto err_clk_disable;
444 } 725 }
445 726
446 init_completion(&mcbsp->rx_irq_completion); 727 init_completion(&mcbsp->rx_irq_completion);
@@ -450,18 +731,38 @@ int omap_mcbsp_request(unsigned int id)
450 dev_err(mcbsp->dev, "Unable to request RX IRQ %d " 731 dev_err(mcbsp->dev, "Unable to request RX IRQ %d "
451 "for McBSP%d\n", mcbsp->rx_irq, 732 "for McBSP%d\n", mcbsp->rx_irq,
452 mcbsp->id); 733 mcbsp->id);
453 free_irq(mcbsp->tx_irq, (void *)mcbsp); 734 goto err_free_irq;
454 return err;
455 } 735 }
456 } 736 }
457 737
458 return 0; 738 return 0;
739err_free_irq:
740 free_irq(mcbsp->tx_irq, (void *)mcbsp);
741err_clk_disable:
742 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
743 mcbsp->pdata->ops->free(id);
744
745 /* Do procedure specific to omap34xx arch, if applicable */
746 omap34xx_mcbsp_free(mcbsp);
747
748 clk_disable(mcbsp->fclk);
749 clk_disable(mcbsp->iclk);
750
751 spin_lock(&mcbsp->lock);
752 mcbsp->free = 1;
753 mcbsp->reg_cache = NULL;
754err_kfree:
755 spin_unlock(&mcbsp->lock);
756 kfree(reg_cache);
757
758 return err;
459} 759}
460EXPORT_SYMBOL(omap_mcbsp_request); 760EXPORT_SYMBOL(omap_mcbsp_request);
461 761
462void omap_mcbsp_free(unsigned int id) 762void omap_mcbsp_free(unsigned int id)
463{ 763{
464 struct omap_mcbsp *mcbsp; 764 struct omap_mcbsp *mcbsp;
765 void *reg_cache;
465 766
466 if (!omap_mcbsp_check_valid_id(id)) { 767 if (!omap_mcbsp_check_valid_id(id)) {
467 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); 768 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
@@ -484,16 +785,18 @@ void omap_mcbsp_free(unsigned int id)
484 free_irq(mcbsp->tx_irq, (void *)mcbsp); 785 free_irq(mcbsp->tx_irq, (void *)mcbsp);
485 } 786 }
486 787
487 spin_lock(&mcbsp->lock); 788 reg_cache = mcbsp->reg_cache;
488 if (mcbsp->free) {
489 dev_err(mcbsp->dev, "McBSP%d was not reserved\n",
490 mcbsp->id);
491 spin_unlock(&mcbsp->lock);
492 return;
493 }
494 789
495 mcbsp->free = 1; 790 spin_lock(&mcbsp->lock);
791 if (mcbsp->free)
792 dev_err(mcbsp->dev, "McBSP%d was not reserved\n", mcbsp->id);
793 else
794 mcbsp->free = 1;
795 mcbsp->reg_cache = NULL;
496 spin_unlock(&mcbsp->lock); 796 spin_unlock(&mcbsp->lock);
797
798 if (reg_cache)
799 kfree(reg_cache);
497} 800}
498EXPORT_SYMBOL(omap_mcbsp_free); 801EXPORT_SYMBOL(omap_mcbsp_free);
499 802
@@ -505,7 +808,6 @@ EXPORT_SYMBOL(omap_mcbsp_free);
505void omap_mcbsp_start(unsigned int id, int tx, int rx) 808void omap_mcbsp_start(unsigned int id, int tx, int rx)
506{ 809{
507 struct omap_mcbsp *mcbsp; 810 struct omap_mcbsp *mcbsp;
508 void __iomem *io_base;
509 int idle; 811 int idle;
510 u16 w; 812 u16 w;
511 813
@@ -514,28 +816,30 @@ void omap_mcbsp_start(unsigned int id, int tx, int rx)
514 return; 816 return;
515 } 817 }
516 mcbsp = id_to_mcbsp_ptr(id); 818 mcbsp = id_to_mcbsp_ptr(id);
517 io_base = mcbsp->io_base;
518 819
519 mcbsp->rx_word_length = (OMAP_MCBSP_READ(io_base, RCR1) >> 5) & 0x7; 820 if (cpu_is_omap34xx())
520 mcbsp->tx_word_length = (OMAP_MCBSP_READ(io_base, XCR1) >> 5) & 0x7; 821 omap_st_start(mcbsp);
822
823 mcbsp->rx_word_length = (MCBSP_READ_CACHE(mcbsp, RCR1) >> 5) & 0x7;
824 mcbsp->tx_word_length = (MCBSP_READ_CACHE(mcbsp, XCR1) >> 5) & 0x7;
521 825
522 idle = !((OMAP_MCBSP_READ(io_base, SPCR2) | 826 idle = !((MCBSP_READ_CACHE(mcbsp, SPCR2) |
523 OMAP_MCBSP_READ(io_base, SPCR1)) & 1); 827 MCBSP_READ_CACHE(mcbsp, SPCR1)) & 1);
524 828
525 if (idle) { 829 if (idle) {
526 /* Start the sample generator */ 830 /* Start the sample generator */
527 w = OMAP_MCBSP_READ(io_base, SPCR2); 831 w = MCBSP_READ_CACHE(mcbsp, SPCR2);
528 OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 6)); 832 MCBSP_WRITE(mcbsp, SPCR2, w | (1 << 6));
529 } 833 }
530 834
531 /* Enable transmitter and receiver */ 835 /* Enable transmitter and receiver */
532 tx &= 1; 836 tx &= 1;
533 w = OMAP_MCBSP_READ(io_base, SPCR2); 837 w = MCBSP_READ_CACHE(mcbsp, SPCR2);
534 OMAP_MCBSP_WRITE(io_base, SPCR2, w | tx); 838 MCBSP_WRITE(mcbsp, SPCR2, w | tx);
535 839
536 rx &= 1; 840 rx &= 1;
537 w = OMAP_MCBSP_READ(io_base, SPCR1); 841 w = MCBSP_READ_CACHE(mcbsp, SPCR1);
538 OMAP_MCBSP_WRITE(io_base, SPCR1, w | rx); 842 MCBSP_WRITE(mcbsp, SPCR1, w | rx);
539 843
540 /* 844 /*
541 * Worst case: CLKSRG*2 = 8000khz: (1/8000) * 2 * 2 usec 845 * Worst case: CLKSRG*2 = 8000khz: (1/8000) * 2 * 2 usec
@@ -547,18 +851,18 @@ void omap_mcbsp_start(unsigned int id, int tx, int rx)
547 851
548 if (idle) { 852 if (idle) {
549 /* Start frame sync */ 853 /* Start frame sync */
550 w = OMAP_MCBSP_READ(io_base, SPCR2); 854 w = MCBSP_READ_CACHE(mcbsp, SPCR2);
551 OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 7)); 855 MCBSP_WRITE(mcbsp, SPCR2, w | (1 << 7));
552 } 856 }
553 857
554 if (cpu_is_omap2430() || cpu_is_omap34xx()) { 858 if (cpu_is_omap2430() || cpu_is_omap34xx()) {
555 /* Release the transmitter and receiver */ 859 /* Release the transmitter and receiver */
556 w = OMAP_MCBSP_READ(io_base, XCCR); 860 w = MCBSP_READ_CACHE(mcbsp, XCCR);
557 w &= ~(tx ? XDISABLE : 0); 861 w &= ~(tx ? XDISABLE : 0);
558 OMAP_MCBSP_WRITE(io_base, XCCR, w); 862 MCBSP_WRITE(mcbsp, XCCR, w);
559 w = OMAP_MCBSP_READ(io_base, RCCR); 863 w = MCBSP_READ_CACHE(mcbsp, RCCR);
560 w &= ~(rx ? RDISABLE : 0); 864 w &= ~(rx ? RDISABLE : 0);
561 OMAP_MCBSP_WRITE(io_base, RCCR, w); 865 MCBSP_WRITE(mcbsp, RCCR, w);
562 } 866 }
563 867
564 /* Dump McBSP Regs */ 868 /* Dump McBSP Regs */
@@ -569,7 +873,6 @@ EXPORT_SYMBOL(omap_mcbsp_start);
569void omap_mcbsp_stop(unsigned int id, int tx, int rx) 873void omap_mcbsp_stop(unsigned int id, int tx, int rx)
570{ 874{
571 struct omap_mcbsp *mcbsp; 875 struct omap_mcbsp *mcbsp;
572 void __iomem *io_base;
573 int idle; 876 int idle;
574 u16 w; 877 u16 w;
575 878
@@ -579,36 +882,38 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx)
579 } 882 }
580 883
581 mcbsp = id_to_mcbsp_ptr(id); 884 mcbsp = id_to_mcbsp_ptr(id);
582 io_base = mcbsp->io_base;
583 885
584 /* Reset transmitter */ 886 /* Reset transmitter */
585 tx &= 1; 887 tx &= 1;
586 if (cpu_is_omap2430() || cpu_is_omap34xx()) { 888 if (cpu_is_omap2430() || cpu_is_omap34xx()) {
587 w = OMAP_MCBSP_READ(io_base, XCCR); 889 w = MCBSP_READ_CACHE(mcbsp, XCCR);
588 w |= (tx ? XDISABLE : 0); 890 w |= (tx ? XDISABLE : 0);
589 OMAP_MCBSP_WRITE(io_base, XCCR, w); 891 MCBSP_WRITE(mcbsp, XCCR, w);
590 } 892 }
591 w = OMAP_MCBSP_READ(io_base, SPCR2); 893 w = MCBSP_READ_CACHE(mcbsp, SPCR2);
592 OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~tx); 894 MCBSP_WRITE(mcbsp, SPCR2, w & ~tx);
593 895
594 /* Reset receiver */ 896 /* Reset receiver */
595 rx &= 1; 897 rx &= 1;
596 if (cpu_is_omap2430() || cpu_is_omap34xx()) { 898 if (cpu_is_omap2430() || cpu_is_omap34xx()) {
597 w = OMAP_MCBSP_READ(io_base, RCCR); 899 w = MCBSP_READ_CACHE(mcbsp, RCCR);
598 w |= (rx ? RDISABLE : 0); 900 w |= (rx ? RDISABLE : 0);
599 OMAP_MCBSP_WRITE(io_base, RCCR, w); 901 MCBSP_WRITE(mcbsp, RCCR, w);
600 } 902 }
601 w = OMAP_MCBSP_READ(io_base, SPCR1); 903 w = MCBSP_READ_CACHE(mcbsp, SPCR1);
602 OMAP_MCBSP_WRITE(io_base, SPCR1, w & ~rx); 904 MCBSP_WRITE(mcbsp, SPCR1, w & ~rx);
603 905
604 idle = !((OMAP_MCBSP_READ(io_base, SPCR2) | 906 idle = !((MCBSP_READ_CACHE(mcbsp, SPCR2) |
605 OMAP_MCBSP_READ(io_base, SPCR1)) & 1); 907 MCBSP_READ_CACHE(mcbsp, SPCR1)) & 1);
606 908
607 if (idle) { 909 if (idle) {
608 /* Reset the sample rate generator */ 910 /* Reset the sample rate generator */
609 w = OMAP_MCBSP_READ(io_base, SPCR2); 911 w = MCBSP_READ_CACHE(mcbsp, SPCR2);
610 OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~(1 << 6)); 912 MCBSP_WRITE(mcbsp, SPCR2, w & ~(1 << 6));
611 } 913 }
914
915 if (cpu_is_omap34xx())
916 omap_st_stop(mcbsp);
612} 917}
613EXPORT_SYMBOL(omap_mcbsp_stop); 918EXPORT_SYMBOL(omap_mcbsp_stop);
614 919
@@ -616,7 +921,6 @@ EXPORT_SYMBOL(omap_mcbsp_stop);
616int omap_mcbsp_pollwrite(unsigned int id, u16 buf) 921int omap_mcbsp_pollwrite(unsigned int id, u16 buf)
617{ 922{
618 struct omap_mcbsp *mcbsp; 923 struct omap_mcbsp *mcbsp;
619 void __iomem *base;
620 924
621 if (!omap_mcbsp_check_valid_id(id)) { 925 if (!omap_mcbsp_check_valid_id(id)) {
622 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); 926 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
@@ -624,28 +928,26 @@ int omap_mcbsp_pollwrite(unsigned int id, u16 buf)
624 } 928 }
625 929
626 mcbsp = id_to_mcbsp_ptr(id); 930 mcbsp = id_to_mcbsp_ptr(id);
627 base = mcbsp->io_base;
628 931
629 writew(buf, base + OMAP_MCBSP_REG_DXR1); 932 MCBSP_WRITE(mcbsp, DXR1, buf);
630 /* if frame sync error - clear the error */ 933 /* if frame sync error - clear the error */
631 if (readw(base + OMAP_MCBSP_REG_SPCR2) & XSYNC_ERR) { 934 if (MCBSP_READ(mcbsp, SPCR2) & XSYNC_ERR) {
632 /* clear error */ 935 /* clear error */
633 writew(readw(base + OMAP_MCBSP_REG_SPCR2) & (~XSYNC_ERR), 936 MCBSP_WRITE(mcbsp, SPCR2, MCBSP_READ_CACHE(mcbsp, SPCR2));
634 base + OMAP_MCBSP_REG_SPCR2);
635 /* resend */ 937 /* resend */
636 return -1; 938 return -1;
637 } else { 939 } else {
638 /* wait for transmit confirmation */ 940 /* wait for transmit confirmation */
639 int attemps = 0; 941 int attemps = 0;
640 while (!(readw(base + OMAP_MCBSP_REG_SPCR2) & XRDY)) { 942 while (!(MCBSP_READ(mcbsp, SPCR2) & XRDY)) {
641 if (attemps++ > 1000) { 943 if (attemps++ > 1000) {
642 writew(readw(base + OMAP_MCBSP_REG_SPCR2) & 944 MCBSP_WRITE(mcbsp, SPCR2,
643 (~XRST), 945 MCBSP_READ_CACHE(mcbsp, SPCR2) &
644 base + OMAP_MCBSP_REG_SPCR2); 946 (~XRST));
645 udelay(10); 947 udelay(10);
646 writew(readw(base + OMAP_MCBSP_REG_SPCR2) | 948 MCBSP_WRITE(mcbsp, SPCR2,
647 (XRST), 949 MCBSP_READ_CACHE(mcbsp, SPCR2) |
648 base + OMAP_MCBSP_REG_SPCR2); 950 (XRST));
649 udelay(10); 951 udelay(10);
650 dev_err(mcbsp->dev, "Could not write to" 952 dev_err(mcbsp->dev, "Could not write to"
651 " McBSP%d Register\n", mcbsp->id); 953 " McBSP%d Register\n", mcbsp->id);
@@ -661,7 +963,6 @@ EXPORT_SYMBOL(omap_mcbsp_pollwrite);
661int omap_mcbsp_pollread(unsigned int id, u16 *buf) 963int omap_mcbsp_pollread(unsigned int id, u16 *buf)
662{ 964{
663 struct omap_mcbsp *mcbsp; 965 struct omap_mcbsp *mcbsp;
664 void __iomem *base;
665 966
666 if (!omap_mcbsp_check_valid_id(id)) { 967 if (!omap_mcbsp_check_valid_id(id)) {
667 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); 968 printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
@@ -669,26 +970,24 @@ int omap_mcbsp_pollread(unsigned int id, u16 *buf)
669 } 970 }
670 mcbsp = id_to_mcbsp_ptr(id); 971 mcbsp = id_to_mcbsp_ptr(id);
671 972
672 base = mcbsp->io_base;
673 /* if frame sync error - clear the error */ 973 /* if frame sync error - clear the error */
674 if (readw(base + OMAP_MCBSP_REG_SPCR1) & RSYNC_ERR) { 974 if (MCBSP_READ(mcbsp, SPCR1) & RSYNC_ERR) {
675 /* clear error */ 975 /* clear error */
676 writew(readw(base + OMAP_MCBSP_REG_SPCR1) & (~RSYNC_ERR), 976 MCBSP_WRITE(mcbsp, SPCR1, MCBSP_READ_CACHE(mcbsp, SPCR1));
677 base + OMAP_MCBSP_REG_SPCR1);
678 /* resend */ 977 /* resend */
679 return -1; 978 return -1;
680 } else { 979 } else {
681 /* wait for recieve confirmation */ 980 /* wait for recieve confirmation */
682 int attemps = 0; 981 int attemps = 0;
683 while (!(readw(base + OMAP_MCBSP_REG_SPCR1) & RRDY)) { 982 while (!(MCBSP_READ(mcbsp, SPCR1) & RRDY)) {
684 if (attemps++ > 1000) { 983 if (attemps++ > 1000) {
685 writew(readw(base + OMAP_MCBSP_REG_SPCR1) & 984 MCBSP_WRITE(mcbsp, SPCR1,
686 (~RRST), 985 MCBSP_READ_CACHE(mcbsp, SPCR1) &
687 base + OMAP_MCBSP_REG_SPCR1); 986 (~RRST));
688 udelay(10); 987 udelay(10);
689 writew(readw(base + OMAP_MCBSP_REG_SPCR1) | 988 MCBSP_WRITE(mcbsp, SPCR1,
690 (RRST), 989 MCBSP_READ_CACHE(mcbsp, SPCR1) |
691 base + OMAP_MCBSP_REG_SPCR1); 990 (RRST));
692 udelay(10); 991 udelay(10);
693 dev_err(mcbsp->dev, "Could not read from" 992 dev_err(mcbsp->dev, "Could not read from"
694 " McBSP%d Register\n", mcbsp->id); 993 " McBSP%d Register\n", mcbsp->id);
@@ -696,7 +995,7 @@ int omap_mcbsp_pollread(unsigned int id, u16 *buf)
696 } 995 }
697 } 996 }
698 } 997 }
699 *buf = readw(base + OMAP_MCBSP_REG_DRR1); 998 *buf = MCBSP_READ(mcbsp, DRR1);
700 999
701 return 0; 1000 return 0;
702} 1001}
@@ -708,7 +1007,6 @@ EXPORT_SYMBOL(omap_mcbsp_pollread);
708void omap_mcbsp_xmit_word(unsigned int id, u32 word) 1007void omap_mcbsp_xmit_word(unsigned int id, u32 word)
709{ 1008{
710 struct omap_mcbsp *mcbsp; 1009 struct omap_mcbsp *mcbsp;
711 void __iomem *io_base;
712 omap_mcbsp_word_length word_length; 1010 omap_mcbsp_word_length word_length;
713 1011
714 if (!omap_mcbsp_check_valid_id(id)) { 1012 if (!omap_mcbsp_check_valid_id(id)) {
@@ -717,21 +1015,19 @@ void omap_mcbsp_xmit_word(unsigned int id, u32 word)
717 } 1015 }
718 1016
719 mcbsp = id_to_mcbsp_ptr(id); 1017 mcbsp = id_to_mcbsp_ptr(id);
720 io_base = mcbsp->io_base;
721 word_length = mcbsp->tx_word_length; 1018 word_length = mcbsp->tx_word_length;
722 1019
723 wait_for_completion(&mcbsp->tx_irq_completion); 1020 wait_for_completion(&mcbsp->tx_irq_completion);
724 1021
725 if (word_length > OMAP_MCBSP_WORD_16) 1022 if (word_length > OMAP_MCBSP_WORD_16)
726 OMAP_MCBSP_WRITE(io_base, DXR2, word >> 16); 1023 MCBSP_WRITE(mcbsp, DXR2, word >> 16);
727 OMAP_MCBSP_WRITE(io_base, DXR1, word & 0xffff); 1024 MCBSP_WRITE(mcbsp, DXR1, word & 0xffff);
728} 1025}
729EXPORT_SYMBOL(omap_mcbsp_xmit_word); 1026EXPORT_SYMBOL(omap_mcbsp_xmit_word);
730 1027
731u32 omap_mcbsp_recv_word(unsigned int id) 1028u32 omap_mcbsp_recv_word(unsigned int id)
732{ 1029{
733 struct omap_mcbsp *mcbsp; 1030 struct omap_mcbsp *mcbsp;
734 void __iomem *io_base;
735 u16 word_lsb, word_msb = 0; 1031 u16 word_lsb, word_msb = 0;
736 omap_mcbsp_word_length word_length; 1032 omap_mcbsp_word_length word_length;
737 1033
@@ -742,13 +1038,12 @@ u32 omap_mcbsp_recv_word(unsigned int id)
742 mcbsp = id_to_mcbsp_ptr(id); 1038 mcbsp = id_to_mcbsp_ptr(id);
743 1039
744 word_length = mcbsp->rx_word_length; 1040 word_length = mcbsp->rx_word_length;
745 io_base = mcbsp->io_base;
746 1041
747 wait_for_completion(&mcbsp->rx_irq_completion); 1042 wait_for_completion(&mcbsp->rx_irq_completion);
748 1043
749 if (word_length > OMAP_MCBSP_WORD_16) 1044 if (word_length > OMAP_MCBSP_WORD_16)
750 word_msb = OMAP_MCBSP_READ(io_base, DRR2); 1045 word_msb = MCBSP_READ(mcbsp, DRR2);
751 word_lsb = OMAP_MCBSP_READ(io_base, DRR1); 1046 word_lsb = MCBSP_READ(mcbsp, DRR1);
752 1047
753 return (word_lsb | (word_msb << 16)); 1048 return (word_lsb | (word_msb << 16));
754} 1049}
@@ -757,7 +1052,6 @@ EXPORT_SYMBOL(omap_mcbsp_recv_word);
757int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word) 1052int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word)
758{ 1053{
759 struct omap_mcbsp *mcbsp; 1054 struct omap_mcbsp *mcbsp;
760 void __iomem *io_base;
761 omap_mcbsp_word_length tx_word_length; 1055 omap_mcbsp_word_length tx_word_length;
762 omap_mcbsp_word_length rx_word_length; 1056 omap_mcbsp_word_length rx_word_length;
763 u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0; 1057 u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0;
@@ -767,7 +1061,6 @@ int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word)
767 return -ENODEV; 1061 return -ENODEV;
768 } 1062 }
769 mcbsp = id_to_mcbsp_ptr(id); 1063 mcbsp = id_to_mcbsp_ptr(id);
770 io_base = mcbsp->io_base;
771 tx_word_length = mcbsp->tx_word_length; 1064 tx_word_length = mcbsp->tx_word_length;
772 rx_word_length = mcbsp->rx_word_length; 1065 rx_word_length = mcbsp->rx_word_length;
773 1066
@@ -775,14 +1068,16 @@ int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word)
775 return -EINVAL; 1068 return -EINVAL;
776 1069
777 /* First we wait for the transmitter to be ready */ 1070 /* First we wait for the transmitter to be ready */
778 spcr2 = OMAP_MCBSP_READ(io_base, SPCR2); 1071 spcr2 = MCBSP_READ(mcbsp, SPCR2);
779 while (!(spcr2 & XRDY)) { 1072 while (!(spcr2 & XRDY)) {
780 spcr2 = OMAP_MCBSP_READ(io_base, SPCR2); 1073 spcr2 = MCBSP_READ(mcbsp, SPCR2);
781 if (attempts++ > 1000) { 1074 if (attempts++ > 1000) {
782 /* We must reset the transmitter */ 1075 /* We must reset the transmitter */
783 OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 & (~XRST)); 1076 MCBSP_WRITE(mcbsp, SPCR2,
1077 MCBSP_READ_CACHE(mcbsp, SPCR2) & (~XRST));
784 udelay(10); 1078 udelay(10);
785 OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 | XRST); 1079 MCBSP_WRITE(mcbsp, SPCR2,
1080 MCBSP_READ_CACHE(mcbsp, SPCR2) | XRST);
786 udelay(10); 1081 udelay(10);
787 dev_err(mcbsp->dev, "McBSP%d transmitter not " 1082 dev_err(mcbsp->dev, "McBSP%d transmitter not "
788 "ready\n", mcbsp->id); 1083 "ready\n", mcbsp->id);
@@ -792,18 +1087,20 @@ int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word)
792 1087
793 /* Now we can push the data */ 1088 /* Now we can push the data */
794 if (tx_word_length > OMAP_MCBSP_WORD_16) 1089 if (tx_word_length > OMAP_MCBSP_WORD_16)
795 OMAP_MCBSP_WRITE(io_base, DXR2, word >> 16); 1090 MCBSP_WRITE(mcbsp, DXR2, word >> 16);
796 OMAP_MCBSP_WRITE(io_base, DXR1, word & 0xffff); 1091 MCBSP_WRITE(mcbsp, DXR1, word & 0xffff);
797 1092
798 /* We wait for the receiver to be ready */ 1093 /* We wait for the receiver to be ready */
799 spcr1 = OMAP_MCBSP_READ(io_base, SPCR1); 1094 spcr1 = MCBSP_READ(mcbsp, SPCR1);
800 while (!(spcr1 & RRDY)) { 1095 while (!(spcr1 & RRDY)) {
801 spcr1 = OMAP_MCBSP_READ(io_base, SPCR1); 1096 spcr1 = MCBSP_READ(mcbsp, SPCR1);
802 if (attempts++ > 1000) { 1097 if (attempts++ > 1000) {
803 /* We must reset the receiver */ 1098 /* We must reset the receiver */
804 OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 & (~RRST)); 1099 MCBSP_WRITE(mcbsp, SPCR1,
1100 MCBSP_READ_CACHE(mcbsp, SPCR1) & (~RRST));
805 udelay(10); 1101 udelay(10);
806 OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 | RRST); 1102 MCBSP_WRITE(mcbsp, SPCR1,
1103 MCBSP_READ_CACHE(mcbsp, SPCR1) | RRST);
807 udelay(10); 1104 udelay(10);
808 dev_err(mcbsp->dev, "McBSP%d receiver not " 1105 dev_err(mcbsp->dev, "McBSP%d receiver not "
809 "ready\n", mcbsp->id); 1106 "ready\n", mcbsp->id);
@@ -813,8 +1110,8 @@ int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word)
813 1110
814 /* Receiver is ready, let's read the dummy data */ 1111 /* Receiver is ready, let's read the dummy data */
815 if (rx_word_length > OMAP_MCBSP_WORD_16) 1112 if (rx_word_length > OMAP_MCBSP_WORD_16)
816 word_msb = OMAP_MCBSP_READ(io_base, DRR2); 1113 word_msb = MCBSP_READ(mcbsp, DRR2);
817 word_lsb = OMAP_MCBSP_READ(io_base, DRR1); 1114 word_lsb = MCBSP_READ(mcbsp, DRR1);
818 1115
819 return 0; 1116 return 0;
820} 1117}
@@ -824,7 +1121,6 @@ int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 *word)
824{ 1121{
825 struct omap_mcbsp *mcbsp; 1122 struct omap_mcbsp *mcbsp;
826 u32 clock_word = 0; 1123 u32 clock_word = 0;
827 void __iomem *io_base;
828 omap_mcbsp_word_length tx_word_length; 1124 omap_mcbsp_word_length tx_word_length;
829 omap_mcbsp_word_length rx_word_length; 1125 omap_mcbsp_word_length rx_word_length;
830 u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0; 1126 u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0;
@@ -835,7 +1131,6 @@ int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 *word)
835 } 1131 }
836 1132
837 mcbsp = id_to_mcbsp_ptr(id); 1133 mcbsp = id_to_mcbsp_ptr(id);
838 io_base = mcbsp->io_base;
839 1134
840 tx_word_length = mcbsp->tx_word_length; 1135 tx_word_length = mcbsp->tx_word_length;
841 rx_word_length = mcbsp->rx_word_length; 1136 rx_word_length = mcbsp->rx_word_length;
@@ -844,14 +1139,16 @@ int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 *word)
844 return -EINVAL; 1139 return -EINVAL;
845 1140
846 /* First we wait for the transmitter to be ready */ 1141 /* First we wait for the transmitter to be ready */
847 spcr2 = OMAP_MCBSP_READ(io_base, SPCR2); 1142 spcr2 = MCBSP_READ(mcbsp, SPCR2);
848 while (!(spcr2 & XRDY)) { 1143 while (!(spcr2 & XRDY)) {
849 spcr2 = OMAP_MCBSP_READ(io_base, SPCR2); 1144 spcr2 = MCBSP_READ(mcbsp, SPCR2);
850 if (attempts++ > 1000) { 1145 if (attempts++ > 1000) {
851 /* We must reset the transmitter */ 1146 /* We must reset the transmitter */
852 OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 & (~XRST)); 1147 MCBSP_WRITE(mcbsp, SPCR2,
1148 MCBSP_READ_CACHE(mcbsp, SPCR2) & (~XRST));
853 udelay(10); 1149 udelay(10);
854 OMAP_MCBSP_WRITE(io_base, SPCR2, spcr2 | XRST); 1150 MCBSP_WRITE(mcbsp, SPCR2,
1151 MCBSP_READ_CACHE(mcbsp, SPCR2) | XRST);
855 udelay(10); 1152 udelay(10);
856 dev_err(mcbsp->dev, "McBSP%d transmitter not " 1153 dev_err(mcbsp->dev, "McBSP%d transmitter not "
857 "ready\n", mcbsp->id); 1154 "ready\n", mcbsp->id);
@@ -861,18 +1158,20 @@ int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 *word)
861 1158
862 /* We first need to enable the bus clock */ 1159 /* We first need to enable the bus clock */
863 if (tx_word_length > OMAP_MCBSP_WORD_16) 1160 if (tx_word_length > OMAP_MCBSP_WORD_16)
864 OMAP_MCBSP_WRITE(io_base, DXR2, clock_word >> 16); 1161 MCBSP_WRITE(mcbsp, DXR2, clock_word >> 16);
865 OMAP_MCBSP_WRITE(io_base, DXR1, clock_word & 0xffff); 1162 MCBSP_WRITE(mcbsp, DXR1, clock_word & 0xffff);
866 1163
867 /* We wait for the receiver to be ready */ 1164 /* We wait for the receiver to be ready */
868 spcr1 = OMAP_MCBSP_READ(io_base, SPCR1); 1165 spcr1 = MCBSP_READ(mcbsp, SPCR1);
869 while (!(spcr1 & RRDY)) { 1166 while (!(spcr1 & RRDY)) {
870 spcr1 = OMAP_MCBSP_READ(io_base, SPCR1); 1167 spcr1 = MCBSP_READ(mcbsp, SPCR1);
871 if (attempts++ > 1000) { 1168 if (attempts++ > 1000) {
872 /* We must reset the receiver */ 1169 /* We must reset the receiver */
873 OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 & (~RRST)); 1170 MCBSP_WRITE(mcbsp, SPCR1,
1171 MCBSP_READ_CACHE(mcbsp, SPCR1) & (~RRST));
874 udelay(10); 1172 udelay(10);
875 OMAP_MCBSP_WRITE(io_base, SPCR1, spcr1 | RRST); 1173 MCBSP_WRITE(mcbsp, SPCR1,
1174 MCBSP_READ_CACHE(mcbsp, SPCR1) | RRST);
876 udelay(10); 1175 udelay(10);
877 dev_err(mcbsp->dev, "McBSP%d receiver not " 1176 dev_err(mcbsp->dev, "McBSP%d receiver not "
878 "ready\n", mcbsp->id); 1177 "ready\n", mcbsp->id);
@@ -882,8 +1181,8 @@ int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 *word)
882 1181
883 /* Receiver is ready, there is something for us */ 1182 /* Receiver is ready, there is something for us */
884 if (rx_word_length > OMAP_MCBSP_WORD_16) 1183 if (rx_word_length > OMAP_MCBSP_WORD_16)
885 word_msb = OMAP_MCBSP_READ(io_base, DRR2); 1184 word_msb = MCBSP_READ(mcbsp, DRR2);
886 word_lsb = OMAP_MCBSP_READ(io_base, DRR1); 1185 word_lsb = MCBSP_READ(mcbsp, DRR1);
887 1186
888 word[0] = (word_lsb | (word_msb << 16)); 1187 word[0] = (word_lsb | (word_msb << 16));
889 1188
@@ -1097,7 +1396,7 @@ void omap_mcbsp_set_spi_mode(unsigned int id,
1097} 1396}
1098EXPORT_SYMBOL(omap_mcbsp_set_spi_mode); 1397EXPORT_SYMBOL(omap_mcbsp_set_spi_mode);
1099 1398
1100#ifdef CONFIG_ARCH_OMAP34XX 1399#ifdef CONFIG_ARCH_OMAP3
1101#define max_thres(m) (mcbsp->pdata->buffer_size) 1400#define max_thres(m) (mcbsp->pdata->buffer_size)
1102#define valid_threshold(m, val) ((val) <= max_thres(m)) 1401#define valid_threshold(m, val) ((val) <= max_thres(m))
1103#define THRESHOLD_PROP_BUILDER(prop) \ 1402#define THRESHOLD_PROP_BUILDER(prop) \
@@ -1145,9 +1444,7 @@ static ssize_t dma_op_mode_show(struct device *dev,
1145 ssize_t len = 0; 1444 ssize_t len = 0;
1146 const char * const *s; 1445 const char * const *s;
1147 1446
1148 spin_lock_irq(&mcbsp->lock);
1149 dma_op_mode = mcbsp->dma_op_mode; 1447 dma_op_mode = mcbsp->dma_op_mode;
1150 spin_unlock_irq(&mcbsp->lock);
1151 1448
1152 for (s = &dma_op_modes[i]; i < ARRAY_SIZE(dma_op_modes); s++, i++) { 1449 for (s = &dma_op_modes[i]; i < ARRAY_SIZE(dma_op_modes); s++, i++) {
1153 if (dma_op_mode == i) 1450 if (dma_op_mode == i)
@@ -1190,6 +1487,64 @@ unlock:
1190 1487
1191static DEVICE_ATTR(dma_op_mode, 0644, dma_op_mode_show, dma_op_mode_store); 1488static DEVICE_ATTR(dma_op_mode, 0644, dma_op_mode_show, dma_op_mode_store);
1192 1489
1490static ssize_t st_taps_show(struct device *dev,
1491 struct device_attribute *attr, char *buf)
1492{
1493 struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
1494 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
1495 ssize_t status = 0;
1496 int i;
1497
1498 spin_lock_irq(&mcbsp->lock);
1499 for (i = 0; i < st_data->nr_taps; i++)
1500 status += sprintf(&buf[status], (i ? ", %d" : "%d"),
1501 st_data->taps[i]);
1502 if (i)
1503 status += sprintf(&buf[status], "\n");
1504 spin_unlock_irq(&mcbsp->lock);
1505
1506 return status;
1507}
1508
1509static ssize_t st_taps_store(struct device *dev,
1510 struct device_attribute *attr,
1511 const char *buf, size_t size)
1512{
1513 struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
1514 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
1515 int val, tmp, status, i = 0;
1516
1517 spin_lock_irq(&mcbsp->lock);
1518 memset(st_data->taps, 0, sizeof(st_data->taps));
1519 st_data->nr_taps = 0;
1520
1521 do {
1522 status = sscanf(buf, "%d%n", &val, &tmp);
1523 if (status < 0 || status == 0) {
1524 size = -EINVAL;
1525 goto out;
1526 }
1527 if (val < -32768 || val > 32767) {
1528 size = -EINVAL;
1529 goto out;
1530 }
1531 st_data->taps[i++] = val;
1532 buf += tmp;
1533 if (*buf != ',')
1534 break;
1535 buf++;
1536 } while (1);
1537
1538 st_data->nr_taps = i;
1539
1540out:
1541 spin_unlock_irq(&mcbsp->lock);
1542
1543 return size;
1544}
1545
1546static DEVICE_ATTR(st_taps, 0644, st_taps_show, st_taps_store);
1547
1193static const struct attribute *additional_attrs[] = { 1548static const struct attribute *additional_attrs[] = {
1194 &dev_attr_max_tx_thres.attr, 1549 &dev_attr_max_tx_thres.attr,
1195 &dev_attr_max_rx_thres.attr, 1550 &dev_attr_max_rx_thres.attr,
@@ -1211,6 +1566,60 @@ static inline void __devexit omap_additional_remove(struct device *dev)
1211 sysfs_remove_group(&dev->kobj, &additional_attr_group); 1566 sysfs_remove_group(&dev->kobj, &additional_attr_group);
1212} 1567}
1213 1568
1569static const struct attribute *sidetone_attrs[] = {
1570 &dev_attr_st_taps.attr,
1571 NULL,
1572};
1573
1574static const struct attribute_group sidetone_attr_group = {
1575 .attrs = (struct attribute **)sidetone_attrs,
1576};
1577
1578int __devinit omap_st_add(struct omap_mcbsp *mcbsp)
1579{
1580 struct omap_mcbsp_platform_data *pdata = mcbsp->pdata;
1581 struct omap_mcbsp_st_data *st_data;
1582 int err;
1583
1584 st_data = kzalloc(sizeof(*mcbsp->st_data), GFP_KERNEL);
1585 if (!st_data) {
1586 err = -ENOMEM;
1587 goto err1;
1588 }
1589
1590 st_data->io_base_st = ioremap(pdata->phys_base_st, SZ_4K);
1591 if (!st_data->io_base_st) {
1592 err = -ENOMEM;
1593 goto err2;
1594 }
1595
1596 err = sysfs_create_group(&mcbsp->dev->kobj, &sidetone_attr_group);
1597 if (err)
1598 goto err3;
1599
1600 mcbsp->st_data = st_data;
1601 return 0;
1602
1603err3:
1604 iounmap(st_data->io_base_st);
1605err2:
1606 kfree(st_data);
1607err1:
1608 return err;
1609
1610}
1611
1612static void __devexit omap_st_remove(struct omap_mcbsp *mcbsp)
1613{
1614 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
1615
1616 if (st_data) {
1617 sysfs_remove_group(&mcbsp->dev->kobj, &sidetone_attr_group);
1618 iounmap(st_data->io_base_st);
1619 kfree(st_data);
1620 }
1621}
1622
1214static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) 1623static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp)
1215{ 1624{
1216 mcbsp->dma_op_mode = MCBSP_DMA_MODE_ELEMENT; 1625 mcbsp->dma_op_mode = MCBSP_DMA_MODE_ELEMENT;
@@ -1224,6 +1633,12 @@ static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp)
1224 if (omap_additional_add(mcbsp->dev)) 1633 if (omap_additional_add(mcbsp->dev))
1225 dev_warn(mcbsp->dev, 1634 dev_warn(mcbsp->dev,
1226 "Unable to create additional controls\n"); 1635 "Unable to create additional controls\n");
1636
1637 if (mcbsp->id == 2 || mcbsp->id == 3)
1638 if (omap_st_add(mcbsp))
1639 dev_warn(mcbsp->dev,
1640 "Unable to create sidetone controls\n");
1641
1227 } else { 1642 } else {
1228 mcbsp->max_tx_thres = -EINVAL; 1643 mcbsp->max_tx_thres = -EINVAL;
1229 mcbsp->max_rx_thres = -EINVAL; 1644 mcbsp->max_rx_thres = -EINVAL;
@@ -1232,13 +1647,17 @@ static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp)
1232 1647
1233static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) 1648static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp)
1234{ 1649{
1235 if (cpu_is_omap34xx()) 1650 if (cpu_is_omap34xx()) {
1236 omap_additional_remove(mcbsp->dev); 1651 omap_additional_remove(mcbsp->dev);
1652
1653 if (mcbsp->id == 2 || mcbsp->id == 3)
1654 omap_st_remove(mcbsp);
1655 }
1237} 1656}
1238#else 1657#else
1239static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) {} 1658static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) {}
1240static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) {} 1659static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) {}
1241#endif /* CONFIG_ARCH_OMAP34XX */ 1660#endif /* CONFIG_ARCH_OMAP3 */
1242 1661
1243/* 1662/*
1244 * McBSP1 and McBSP3 are directly mapped on 1610 and 1510. 1663 * McBSP1 and McBSP3 are directly mapped on 1610 and 1510.
diff --git a/arch/arm/plat-omap/mux.c b/arch/arm/plat-omap/mux.c
index 8d329fb20740..06703635ace1 100644
--- a/arch/arm/plat-omap/mux.c
+++ b/arch/arm/plat-omap/mux.c
@@ -28,7 +28,7 @@
28#include <linux/io.h> 28#include <linux/io.h>
29#include <asm/system.h> 29#include <asm/system.h>
30#include <linux/spinlock.h> 30#include <linux/spinlock.h>
31#include <mach/mux.h> 31#include <plat/mux.h>
32 32
33#ifdef CONFIG_OMAP_MUX 33#ifdef CONFIG_OMAP_MUX
34 34
@@ -54,8 +54,12 @@ int __init_or_module omap_cfg_reg(const unsigned long index)
54{ 54{
55 struct pin_config *reg; 55 struct pin_config *reg;
56 56
57 if (cpu_is_omap44xx()) 57 if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
58 return 0; 58 printk(KERN_ERR "mux: Broken omap_cfg_reg(%lu) entry\n",
59 index);
60 WARN_ON(1);
61 return -EINVAL;
62 }
59 63
60 if (mux_cfg == NULL) { 64 if (mux_cfg == NULL) {
61 printk(KERN_ERR "Pin mux table not initialized\n"); 65 printk(KERN_ERR "Pin mux table not initialized\n");
diff --git a/arch/arm/plat-omap/omap-pm-noop.c b/arch/arm/plat-omap/omap-pm-noop.c
index e98f0a2a6c26..186bca82cfab 100644
--- a/arch/arm/plat-omap/omap-pm-noop.c
+++ b/arch/arm/plat-omap/omap-pm-noop.c
@@ -22,9 +22,9 @@
22#include <linux/device.h> 22#include <linux/device.h>
23 23
24/* Interface documentation is in mach/omap-pm.h */ 24/* Interface documentation is in mach/omap-pm.h */
25#include <mach/omap-pm.h> 25#include <plat/omap-pm.h>
26 26
27#include <mach/powerdomain.h> 27#include <plat/powerdomain.h>
28 28
29struct omap_opp *dsp_opps; 29struct omap_opp *dsp_opps;
30struct omap_opp *mpu_opps; 30struct omap_opp *mpu_opps;
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index 2c409fc6dd21..0f5197479513 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -79,43 +79,21 @@
79 79
80#include <linux/kernel.h> 80#include <linux/kernel.h>
81#include <linux/platform_device.h> 81#include <linux/platform_device.h>
82#include <linux/slab.h>
82#include <linux/err.h> 83#include <linux/err.h>
83#include <linux/io.h> 84#include <linux/io.h>
84 85
85#include <mach/omap_device.h> 86#include <plat/omap_device.h>
86#include <mach/omap_hwmod.h> 87#include <plat/omap_hwmod.h>
87 88
88/* These parameters are passed to _omap_device_{de,}activate() */ 89/* These parameters are passed to _omap_device_{de,}activate() */
89#define USE_WAKEUP_LAT 0 90#define USE_WAKEUP_LAT 0
90#define IGNORE_WAKEUP_LAT 1 91#define IGNORE_WAKEUP_LAT 1
91 92
92/* XXX this should be moved into a separate file */
93#if defined(CONFIG_ARCH_OMAP2420)
94# define OMAP_32KSYNCT_BASE 0x48004000
95#elif defined(CONFIG_ARCH_OMAP2430)
96# define OMAP_32KSYNCT_BASE 0x49020000
97#elif defined(CONFIG_ARCH_OMAP3430)
98# define OMAP_32KSYNCT_BASE 0x48320000
99#else
100# error Unknown OMAP device
101#endif
102 93
103/* Private functions */ 94#define OMAP_DEVICE_MAGIC 0xf00dcafe
104
105/**
106 * _read_32ksynct - read the OMAP 32K sync timer
107 *
108 * Returns the current value of the 32KiHz synchronization counter.
109 * XXX this should be generalized to simply read the system clocksource.
110 * XXX this should be moved to a separate synctimer32k.c file
111 */
112static u32 _read_32ksynct(void)
113{
114 if (!cpu_class_is_omap2())
115 BUG();
116 95
117 return __raw_readl(OMAP2_IO_ADDRESS(OMAP_32KSYNCT_BASE + 0x010)); 96/* Private functions */
118}
119 97
120/** 98/**
121 * _omap_device_activate - increase device readiness 99 * _omap_device_activate - increase device readiness
@@ -133,13 +111,13 @@ static u32 _read_32ksynct(void)
133 */ 111 */
134static int _omap_device_activate(struct omap_device *od, u8 ignore_lat) 112static int _omap_device_activate(struct omap_device *od, u8 ignore_lat)
135{ 113{
136 u32 a, b; 114 struct timespec a, b, c;
137 115
138 pr_debug("omap_device: %s: activating\n", od->pdev.name); 116 pr_debug("omap_device: %s: activating\n", od->pdev.name);
139 117
140 while (od->pm_lat_level > 0) { 118 while (od->pm_lat_level > 0) {
141 struct omap_device_pm_latency *odpl; 119 struct omap_device_pm_latency *odpl;
142 int act_lat = 0; 120 unsigned long long act_lat = 0;
143 121
144 od->pm_lat_level--; 122 od->pm_lat_level--;
145 123
@@ -149,22 +127,36 @@ static int _omap_device_activate(struct omap_device *od, u8 ignore_lat)
149 (od->dev_wakeup_lat <= od->_dev_wakeup_lat_limit)) 127 (od->dev_wakeup_lat <= od->_dev_wakeup_lat_limit))
150 break; 128 break;
151 129
152 a = _read_32ksynct(); 130 read_persistent_clock(&a);
153 131
154 /* XXX check return code */ 132 /* XXX check return code */
155 odpl->activate_func(od); 133 odpl->activate_func(od);
156 134
157 b = _read_32ksynct(); 135 read_persistent_clock(&b);
158 136
159 act_lat = (b - a) >> 15; /* 32KiHz cycles to microseconds */ 137 c = timespec_sub(b, a);
138 act_lat = timespec_to_ns(&c);
160 139
161 pr_debug("omap_device: %s: pm_lat %d: activate: elapsed time " 140 pr_debug("omap_device: %s: pm_lat %d: activate: elapsed time "
162 "%d usec\n", od->pdev.name, od->pm_lat_level, act_lat); 141 "%llu nsec\n", od->pdev.name, od->pm_lat_level,
163 142 act_lat);
164 WARN(act_lat > odpl->activate_lat, "omap_device: %s.%d: " 143
165 "activate step %d took longer than expected (%d > %d)\n", 144 if (act_lat > odpl->activate_lat) {
166 od->pdev.name, od->pdev.id, od->pm_lat_level, 145 odpl->activate_lat_worst = act_lat;
167 act_lat, odpl->activate_lat); 146 if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) {
147 odpl->activate_lat = act_lat;
148 pr_warning("omap_device: %s.%d: new worst case "
149 "activate latency %d: %llu\n",
150 od->pdev.name, od->pdev.id,
151 od->pm_lat_level, act_lat);
152 } else
153 pr_warning("omap_device: %s.%d: activate "
154 "latency %d higher than exptected. "
155 "(%llu > %d)\n",
156 od->pdev.name, od->pdev.id,
157 od->pm_lat_level, act_lat,
158 odpl->activate_lat);
159 }
168 160
169 od->dev_wakeup_lat -= odpl->activate_lat; 161 od->dev_wakeup_lat -= odpl->activate_lat;
170 } 162 }
@@ -188,13 +180,13 @@ static int _omap_device_activate(struct omap_device *od, u8 ignore_lat)
188 */ 180 */
189static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat) 181static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat)
190{ 182{
191 u32 a, b; 183 struct timespec a, b, c;
192 184
193 pr_debug("omap_device: %s: deactivating\n", od->pdev.name); 185 pr_debug("omap_device: %s: deactivating\n", od->pdev.name);
194 186
195 while (od->pm_lat_level < od->pm_lats_cnt) { 187 while (od->pm_lat_level < od->pm_lats_cnt) {
196 struct omap_device_pm_latency *odpl; 188 struct omap_device_pm_latency *odpl;
197 int deact_lat = 0; 189 unsigned long long deact_lat = 0;
198 190
199 odpl = od->pm_lats + od->pm_lat_level; 191 odpl = od->pm_lats + od->pm_lat_level;
200 192
@@ -203,23 +195,37 @@ static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat)
203 od->_dev_wakeup_lat_limit)) 195 od->_dev_wakeup_lat_limit))
204 break; 196 break;
205 197
206 a = _read_32ksynct(); 198 read_persistent_clock(&a);
207 199
208 /* XXX check return code */ 200 /* XXX check return code */
209 odpl->deactivate_func(od); 201 odpl->deactivate_func(od);
210 202
211 b = _read_32ksynct(); 203 read_persistent_clock(&b);
212 204
213 deact_lat = (b - a) >> 15; /* 32KiHz cycles to microseconds */ 205 c = timespec_sub(b, a);
206 deact_lat = timespec_to_ns(&c);
214 207
215 pr_debug("omap_device: %s: pm_lat %d: deactivate: elapsed time " 208 pr_debug("omap_device: %s: pm_lat %d: deactivate: elapsed time "
216 "%d usec\n", od->pdev.name, od->pm_lat_level, 209 "%llu nsec\n", od->pdev.name, od->pm_lat_level,
217 deact_lat); 210 deact_lat);
218 211
219 WARN(deact_lat > odpl->deactivate_lat, "omap_device: %s.%d: " 212 if (deact_lat > odpl->deactivate_lat) {
220 "deactivate step %d took longer than expected (%d > %d)\n", 213 odpl->deactivate_lat_worst = deact_lat;
221 od->pdev.name, od->pdev.id, od->pm_lat_level, 214 if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) {
222 deact_lat, odpl->deactivate_lat); 215 odpl->deactivate_lat = deact_lat;
216 pr_warning("omap_device: %s.%d: new worst case "
217 "deactivate latency %d: %llu\n",
218 od->pdev.name, od->pdev.id,
219 od->pm_lat_level, deact_lat);
220 } else
221 pr_warning("omap_device: %s.%d: deactivate "
222 "latency %d higher than exptected. "
223 "(%llu > %d)\n",
224 od->pdev.name, od->pdev.id,
225 od->pm_lat_level, deact_lat,
226 odpl->deactivate_lat);
227 }
228
223 229
224 od->dev_wakeup_lat += odpl->activate_lat; 230 od->dev_wakeup_lat += odpl->activate_lat;
225 231
@@ -302,6 +308,7 @@ int omap_device_fill_resources(struct omap_device *od, struct resource *res)
302 * @pdata_len: amount of memory pointed to by @pdata 308 * @pdata_len: amount of memory pointed to by @pdata
303 * @pm_lats: pointer to a omap_device_pm_latency array for this device 309 * @pm_lats: pointer to a omap_device_pm_latency array for this device
304 * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats 310 * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats
311 * @is_early_device: should the device be registered as an early device or not
305 * 312 *
306 * Convenience function for building and registering a single 313 * Convenience function for building and registering a single
307 * omap_device record, which in turn builds and registers a 314 * omap_device record, which in turn builds and registers a
@@ -313,7 +320,7 @@ struct omap_device *omap_device_build(const char *pdev_name, int pdev_id,
313 struct omap_hwmod *oh, void *pdata, 320 struct omap_hwmod *oh, void *pdata,
314 int pdata_len, 321 int pdata_len,
315 struct omap_device_pm_latency *pm_lats, 322 struct omap_device_pm_latency *pm_lats,
316 int pm_lats_cnt) 323 int pm_lats_cnt, int is_early_device)
317{ 324{
318 struct omap_hwmod *ohs[] = { oh }; 325 struct omap_hwmod *ohs[] = { oh };
319 326
@@ -321,7 +328,8 @@ struct omap_device *omap_device_build(const char *pdev_name, int pdev_id,
321 return ERR_PTR(-EINVAL); 328 return ERR_PTR(-EINVAL);
322 329
323 return omap_device_build_ss(pdev_name, pdev_id, ohs, 1, pdata, 330 return omap_device_build_ss(pdev_name, pdev_id, ohs, 1, pdata,
324 pdata_len, pm_lats, pm_lats_cnt); 331 pdata_len, pm_lats, pm_lats_cnt,
332 is_early_device);
325} 333}
326 334
327/** 335/**
@@ -333,6 +341,7 @@ struct omap_device *omap_device_build(const char *pdev_name, int pdev_id,
333 * @pdata_len: amount of memory pointed to by @pdata 341 * @pdata_len: amount of memory pointed to by @pdata
334 * @pm_lats: pointer to a omap_device_pm_latency array for this device 342 * @pm_lats: pointer to a omap_device_pm_latency array for this device
335 * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats 343 * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats
344 * @is_early_device: should the device be registered as an early device or not
336 * 345 *
337 * Convenience function for building and registering an omap_device 346 * Convenience function for building and registering an omap_device
338 * subsystem record. Subsystem records consist of multiple 347 * subsystem record. Subsystem records consist of multiple
@@ -344,7 +353,7 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
344 struct omap_hwmod **ohs, int oh_cnt, 353 struct omap_hwmod **ohs, int oh_cnt,
345 void *pdata, int pdata_len, 354 void *pdata, int pdata_len,
346 struct omap_device_pm_latency *pm_lats, 355 struct omap_device_pm_latency *pm_lats,
347 int pm_lats_cnt) 356 int pm_lats_cnt, int is_early_device)
348{ 357{
349 int ret = -ENOMEM; 358 int ret = -ENOMEM;
350 struct omap_device *od; 359 struct omap_device *od;
@@ -400,7 +409,13 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
400 od->pm_lats = pm_lats; 409 od->pm_lats = pm_lats;
401 od->pm_lats_cnt = pm_lats_cnt; 410 od->pm_lats_cnt = pm_lats_cnt;
402 411
403 ret = omap_device_register(od); 412 od->magic = OMAP_DEVICE_MAGIC;
413
414 if (is_early_device)
415 ret = omap_early_device_register(od);
416 else
417 ret = omap_device_register(od);
418
404 if (ret) 419 if (ret)
405 goto odbs_exit4; 420 goto odbs_exit4;
406 421
@@ -421,6 +436,24 @@ odbs_exit1:
421} 436}
422 437
423/** 438/**
439 * omap_early_device_register - register an omap_device as an early platform
440 * device.
441 * @od: struct omap_device * to register
442 *
443 * Register the omap_device structure. This currently just calls
444 * platform_early_add_device() on the underlying platform_device.
445 * Returns 0 by default.
446 */
447int omap_early_device_register(struct omap_device *od)
448{
449 struct platform_device *devices[1];
450
451 devices[0] = &(od->pdev);
452 early_platform_add_devices(devices, 1);
453 return 0;
454}
455
456/**
424 * omap_device_register - register an omap_device with one omap_hwmod 457 * omap_device_register - register an omap_device with one omap_hwmod
425 * @od: struct omap_device * to register 458 * @od: struct omap_device * to register
426 * 459 *
@@ -459,8 +492,8 @@ int omap_device_enable(struct platform_device *pdev)
459 od = _find_by_pdev(pdev); 492 od = _find_by_pdev(pdev);
460 493
461 if (od->_state == OMAP_DEVICE_STATE_ENABLED) { 494 if (od->_state == OMAP_DEVICE_STATE_ENABLED) {
462 WARN(1, "omap_device: %s.%d: omap_device_enable() called from " 495 WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n",
463 "invalid state\n", od->pdev.name, od->pdev.id); 496 od->pdev.name, od->pdev.id, __func__, od->_state);
464 return -EINVAL; 497 return -EINVAL;
465 } 498 }
466 499
@@ -471,7 +504,7 @@ int omap_device_enable(struct platform_device *pdev)
471 ret = _omap_device_activate(od, IGNORE_WAKEUP_LAT); 504 ret = _omap_device_activate(od, IGNORE_WAKEUP_LAT);
472 505
473 od->dev_wakeup_lat = 0; 506 od->dev_wakeup_lat = 0;
474 od->_dev_wakeup_lat_limit = INT_MAX; 507 od->_dev_wakeup_lat_limit = UINT_MAX;
475 od->_state = OMAP_DEVICE_STATE_ENABLED; 508 od->_state = OMAP_DEVICE_STATE_ENABLED;
476 509
477 return ret; 510 return ret;
@@ -498,8 +531,8 @@ int omap_device_idle(struct platform_device *pdev)
498 od = _find_by_pdev(pdev); 531 od = _find_by_pdev(pdev);
499 532
500 if (od->_state != OMAP_DEVICE_STATE_ENABLED) { 533 if (od->_state != OMAP_DEVICE_STATE_ENABLED) {
501 WARN(1, "omap_device: %s.%d: omap_device_idle() called from " 534 WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n",
502 "invalid state\n", od->pdev.name, od->pdev.id); 535 od->pdev.name, od->pdev.id, __func__, od->_state);
503 return -EINVAL; 536 return -EINVAL;
504 } 537 }
505 538
@@ -531,8 +564,8 @@ int omap_device_shutdown(struct platform_device *pdev)
531 564
532 if (od->_state != OMAP_DEVICE_STATE_ENABLED && 565 if (od->_state != OMAP_DEVICE_STATE_ENABLED &&
533 od->_state != OMAP_DEVICE_STATE_IDLE) { 566 od->_state != OMAP_DEVICE_STATE_IDLE) {
534 WARN(1, "omap_device: %s.%d: omap_device_shutdown() called " 567 WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n",
535 "from invalid state\n", od->pdev.name, od->pdev.id); 568 od->pdev.name, od->pdev.id, __func__, od->_state);
536 return -EINVAL; 569 return -EINVAL;
537 } 570 }
538 571
@@ -586,6 +619,18 @@ int omap_device_align_pm_lat(struct platform_device *pdev,
586} 619}
587 620
588/** 621/**
622 * omap_device_is_valid - Check if pointer is a valid omap_device
623 * @od: struct omap_device *
624 *
625 * Return whether struct omap_device pointer @od points to a valid
626 * omap_device.
627 */
628bool omap_device_is_valid(struct omap_device *od)
629{
630 return (od && od->magic == OMAP_DEVICE_MAGIC);
631}
632
633/**
589 * omap_device_get_pwrdm - return the powerdomain * associated with @od 634 * omap_device_get_pwrdm - return the powerdomain * associated with @od
590 * @od: struct omap_device * 635 * @od: struct omap_device *
591 * 636 *
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c
index 75d1f26e5b17..51f4dfb82e2b 100644
--- a/arch/arm/plat-omap/sram.c
+++ b/arch/arm/plat-omap/sram.c
@@ -25,11 +25,12 @@
25 25
26#include <asm/mach/map.h> 26#include <asm/mach/map.h>
27 27
28#include <mach/sram.h> 28#include <plat/sram.h>
29#include <mach/board.h> 29#include <plat/board.h>
30#include <mach/cpu.h> 30#include <plat/cpu.h>
31#include <plat/vram.h>
31 32
32#include <mach/control.h> 33#include <plat/control.h>
33 34
34#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) 35#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
35# include "../mach-omap2/prm.h" 36# include "../mach-omap2/prm.h"
@@ -41,31 +42,33 @@
41#define OMAP1_SRAM_VA VMALLOC_END 42#define OMAP1_SRAM_VA VMALLOC_END
42#define OMAP2_SRAM_PA 0x40200000 43#define OMAP2_SRAM_PA 0x40200000
43#define OMAP2_SRAM_PUB_PA 0x4020f800 44#define OMAP2_SRAM_PUB_PA 0x4020f800
44#define OMAP2_SRAM_VA 0xe3000000 45#define OMAP2_SRAM_VA 0xfe400000
45#define OMAP2_SRAM_PUB_VA (OMAP2_SRAM_VA + 0x800) 46#define OMAP2_SRAM_PUB_VA (OMAP2_SRAM_VA + 0x800)
46#define OMAP3_SRAM_PA 0x40200000 47#define OMAP3_SRAM_PA 0x40200000
47#define OMAP3_SRAM_VA 0xe3000000 48#define OMAP3_SRAM_VA 0xfe400000
48#define OMAP3_SRAM_PUB_PA 0x40208000 49#define OMAP3_SRAM_PUB_PA 0x40208000
49#define OMAP3_SRAM_PUB_VA (OMAP3_SRAM_VA + 0x8000) 50#define OMAP3_SRAM_PUB_VA (OMAP3_SRAM_VA + 0x8000)
50#define OMAP4_SRAM_PA 0x40200000 /*0x402f0000*/ 51#define OMAP4_SRAM_PA 0x40300000
51#define OMAP4_SRAM_VA 0xd7000000 /*0xd70f0000*/ 52#define OMAP4_SRAM_VA 0xfe400000
53#define OMAP4_SRAM_PUB_PA (OMAP4_SRAM_PA + 0x4000)
54#define OMAP4_SRAM_PUB_VA (OMAP4_SRAM_VA + 0x4000)
52 55
53#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) 56#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
54#define SRAM_BOOTLOADER_SZ 0x00 57#define SRAM_BOOTLOADER_SZ 0x00
55#else 58#else
56#define SRAM_BOOTLOADER_SZ 0x80 59#define SRAM_BOOTLOADER_SZ 0x80
57#endif 60#endif
58 61
59#define OMAP24XX_VA_REQINFOPERM0 OMAP2_IO_ADDRESS(0x68005048) 62#define OMAP24XX_VA_REQINFOPERM0 OMAP2_L3_IO_ADDRESS(0x68005048)
60#define OMAP24XX_VA_READPERM0 OMAP2_IO_ADDRESS(0x68005050) 63#define OMAP24XX_VA_READPERM0 OMAP2_L3_IO_ADDRESS(0x68005050)
61#define OMAP24XX_VA_WRITEPERM0 OMAP2_IO_ADDRESS(0x68005058) 64#define OMAP24XX_VA_WRITEPERM0 OMAP2_L3_IO_ADDRESS(0x68005058)
62 65
63#define OMAP34XX_VA_REQINFOPERM0 OMAP2_IO_ADDRESS(0x68012848) 66#define OMAP34XX_VA_REQINFOPERM0 OMAP2_L3_IO_ADDRESS(0x68012848)
64#define OMAP34XX_VA_READPERM0 OMAP2_IO_ADDRESS(0x68012850) 67#define OMAP34XX_VA_READPERM0 OMAP2_L3_IO_ADDRESS(0x68012850)
65#define OMAP34XX_VA_WRITEPERM0 OMAP2_IO_ADDRESS(0x68012858) 68#define OMAP34XX_VA_WRITEPERM0 OMAP2_L3_IO_ADDRESS(0x68012858)
66#define OMAP34XX_VA_ADDR_MATCH2 OMAP2_IO_ADDRESS(0x68012880) 69#define OMAP34XX_VA_ADDR_MATCH2 OMAP2_L3_IO_ADDRESS(0x68012880)
67#define OMAP34XX_VA_SMS_RG_ATT0 OMAP2_IO_ADDRESS(0x6C000048) 70#define OMAP34XX_VA_SMS_RG_ATT0 OMAP2_L3_IO_ADDRESS(0x6C000048)
68#define OMAP34XX_VA_CONTROL_STAT OMAP2_IO_ADDRESS(0x480022F0) 71#define OMAP34XX_VA_CONTROL_STAT OMAP2_L4_IO_ADDRESS(0x480022F0)
69 72
70#define GP_DEVICE 0x300 73#define GP_DEVICE 0x300
71 74
@@ -139,6 +142,10 @@ void __init omap_detect_sram(void)
139 } else { 142 } else {
140 omap_sram_size = 0x8000; /* 32K */ 143 omap_sram_size = 0x8000; /* 32K */
141 } 144 }
145 } else if (cpu_is_omap44xx()) {
146 omap_sram_base = OMAP4_SRAM_PUB_VA;
147 omap_sram_start = OMAP4_SRAM_PUB_PA;
148 omap_sram_size = 0xa000; /* 40K */
142 } else { 149 } else {
143 omap_sram_base = OMAP2_SRAM_PUB_VA; 150 omap_sram_base = OMAP2_SRAM_PUB_VA;
144 omap_sram_start = OMAP2_SRAM_PUB_PA; 151 omap_sram_start = OMAP2_SRAM_PUB_PA;
@@ -152,7 +159,7 @@ void __init omap_detect_sram(void)
152 } else if (cpu_is_omap44xx()) { 159 } else if (cpu_is_omap44xx()) {
153 omap_sram_base = OMAP4_SRAM_VA; 160 omap_sram_base = OMAP4_SRAM_VA;
154 omap_sram_start = OMAP4_SRAM_PA; 161 omap_sram_start = OMAP4_SRAM_PA;
155 omap_sram_size = 0x8000; /* 32K */ 162 omap_sram_size = 0xe000; /* 56K */
156 } else { 163 } else {
157 omap_sram_base = OMAP2_SRAM_VA; 164 omap_sram_base = OMAP2_SRAM_VA;
158 omap_sram_start = OMAP2_SRAM_PA; 165 omap_sram_start = OMAP2_SRAM_PA;
@@ -185,6 +192,13 @@ void __init omap_detect_sram(void)
185 omap_sram_start + SRAM_BOOTLOADER_SZ, 192 omap_sram_start + SRAM_BOOTLOADER_SZ,
186 omap_sram_size - SRAM_BOOTLOADER_SZ); 193 omap_sram_size - SRAM_BOOTLOADER_SZ);
187 omap_sram_size -= reserved; 194 omap_sram_size -= reserved;
195
196 reserved = omap_vram_reserve_sram(omap_sram_start, omap_sram_base,
197 omap_sram_size,
198 omap_sram_start + SRAM_BOOTLOADER_SZ,
199 omap_sram_size - SRAM_BOOTLOADER_SZ);
200 omap_sram_size -= reserved;
201
188 omap_sram_ceil = omap_sram_base + omap_sram_size; 202 omap_sram_ceil = omap_sram_base + omap_sram_size;
189} 203}
190 204
@@ -396,22 +410,24 @@ u32 omap3_configure_core_dpll(u32 m2, u32 unlock_dll, u32 f, u32 inc,
396 sdrc_actim_ctrl_b_1, sdrc_mr_1); 410 sdrc_actim_ctrl_b_1, sdrc_mr_1);
397} 411}
398 412
399/* REVISIT: Should this be same as omap34xx_sram_init() after off-idle? */ 413#ifdef CONFIG_PM
400void restore_sram_functions(void) 414void omap3_sram_restore_context(void)
401{ 415{
402 omap_sram_ceil = omap_sram_base + omap_sram_size; 416 omap_sram_ceil = omap_sram_base + omap_sram_size;
403 417
404 _omap3_sram_configure_core_dpll = 418 _omap3_sram_configure_core_dpll =
405 omap_sram_push(omap3_sram_configure_core_dpll, 419 omap_sram_push(omap3_sram_configure_core_dpll,
406 omap3_sram_configure_core_dpll_sz); 420 omap3_sram_configure_core_dpll_sz);
421 omap_push_sram_idle();
407} 422}
423#endif /* CONFIG_PM */
408 424
409int __init omap34xx_sram_init(void) 425int __init omap34xx_sram_init(void)
410{ 426{
411 _omap3_sram_configure_core_dpll = 427 _omap3_sram_configure_core_dpll =
412 omap_sram_push(omap3_sram_configure_core_dpll, 428 omap_sram_push(omap3_sram_configure_core_dpll,
413 omap3_sram_configure_core_dpll_sz); 429 omap3_sram_configure_core_dpll_sz);
414 430 omap_push_sram_idle();
415 return 0; 431 return 0;
416} 432}
417#else 433#else
diff --git a/arch/arm/plat-omap/usb.c b/arch/arm/plat-omap/usb.c
index 509f2ed99e21..d3bf17cd36f3 100644
--- a/arch/arm/plat-omap/usb.c
+++ b/arch/arm/plat-omap/usb.c
@@ -33,10 +33,10 @@
33#include <asm/system.h> 33#include <asm/system.h>
34#include <mach/hardware.h> 34#include <mach/hardware.h>
35 35
36#include <mach/control.h> 36#include <plat/control.h>
37#include <mach/mux.h> 37#include <plat/mux.h>
38#include <mach/usb.h> 38#include <plat/usb.h>
39#include <mach/board.h> 39#include <plat/board.h>
40 40
41#ifdef CONFIG_ARCH_OMAP1 41#ifdef CONFIG_ARCH_OMAP1
42 42
@@ -137,7 +137,13 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device)
137 if (is_device) { 137 if (is_device) {
138 if (cpu_is_omap24xx()) 138 if (cpu_is_omap24xx())
139 omap_cfg_reg(J20_24XX_USB0_PUEN); 139 omap_cfg_reg(J20_24XX_USB0_PUEN);
140 else 140 else if (cpu_is_omap7xx()) {
141 omap_cfg_reg(AA17_7XX_USB_DM);
142 omap_cfg_reg(W16_7XX_USB_PU_EN);
143 omap_cfg_reg(W17_7XX_USB_VBUSI);
144 omap_cfg_reg(W18_7XX_USB_DMCK_OUT);
145 omap_cfg_reg(W19_7XX_USB_DCRST);
146 } else
141 omap_cfg_reg(W4_USB_PUEN); 147 omap_cfg_reg(W4_USB_PUEN);
142 } 148 }
143 149
@@ -159,11 +165,14 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device)
159 * - OTG support on this port not yet written 165 * - OTG support on this port not yet written
160 */ 166 */
161 167
162 l = omap_readl(USB_TRANSCEIVER_CTRL); 168 /* Don't do this for omap7xx -- it causes USB to not work correctly */
163 l &= ~(7 << 4); 169 if (!cpu_is_omap7xx()) {
164 if (!is_device) 170 l = omap_readl(USB_TRANSCEIVER_CTRL);
165 l |= (3 << 1); 171 l &= ~(7 << 4);
166 omap_writel(l, USB_TRANSCEIVER_CTRL); 172 if (!is_device)
173 l |= (3 << 1);
174 omap_writel(l, USB_TRANSCEIVER_CTRL);
175 }
167 176
168 return 3 << 16; 177 return 3 << 16;
169 } 178 }
@@ -603,7 +612,12 @@ omap_otg_init(struct omap_usb_config *config)
603 if (config->otg || config->register_dev) { 612 if (config->otg || config->register_dev) {
604 syscon &= ~DEV_IDLE_EN; 613 syscon &= ~DEV_IDLE_EN;
605 udc_device.dev.platform_data = config; 614 udc_device.dev.platform_data = config;
606 /* FIXME patch IRQ numbers for omap730 */ 615 /* IRQ numbers for omap7xx */
616 if(cpu_is_omap7xx()) {
617 udc_resources[1].start = INT_7XX_USB_GENI;
618 udc_resources[2].start = INT_7XX_USB_NON_ISO;
619 udc_resources[3].start = INT_7XX_USB_ISO;
620 }
607 status = platform_device_register(&udc_device); 621 status = platform_device_register(&udc_device);
608 if (status) 622 if (status)
609 pr_debug("can't register UDC device, %d\n", status); 623 pr_debug("can't register UDC device, %d\n", status);
@@ -614,8 +628,8 @@ omap_otg_init(struct omap_usb_config *config)
614 if (config->otg || config->register_host) { 628 if (config->otg || config->register_host) {
615 syscon &= ~HST_IDLE_EN; 629 syscon &= ~HST_IDLE_EN;
616 ohci_device.dev.platform_data = config; 630 ohci_device.dev.platform_data = config;
617 if (cpu_is_omap730()) 631 if (cpu_is_omap7xx())
618 ohci_resources[1].start = INT_730_USB_HHC_1; 632 ohci_resources[1].start = INT_7XX_USB_HHC_1;
619 status = platform_device_register(&ohci_device); 633 status = platform_device_register(&ohci_device);
620 if (status) 634 if (status)
621 pr_debug("can't register OHCI device, %d\n", status); 635 pr_debug("can't register OHCI device, %d\n", status);
@@ -626,8 +640,8 @@ omap_otg_init(struct omap_usb_config *config)
626 if (config->otg) { 640 if (config->otg) {
627 syscon &= ~OTG_IDLE_EN; 641 syscon &= ~OTG_IDLE_EN;
628 otg_device.dev.platform_data = config; 642 otg_device.dev.platform_data = config;
629 if (cpu_is_omap730()) 643 if (cpu_is_omap7xx())
630 otg_resources[1].start = INT_730_USB_OTG; 644 otg_resources[1].start = INT_7XX_USB_OTG;
631 status = platform_device_register(&otg_device); 645 status = platform_device_register(&otg_device);
632 if (status) 646 if (status)
633 pr_debug("can't register OTG device, %d\n", status); 647 pr_debug("can't register OTG device, %d\n", status);
@@ -731,7 +745,7 @@ static inline void omap_1510_usb_init(struct omap_usb_config *config) {}
731 745
732void __init omap_usb_init(struct omap_usb_config *pdata) 746void __init omap_usb_init(struct omap_usb_config *pdata)
733{ 747{
734 if (cpu_is_omap730() || cpu_is_omap16xx() || cpu_is_omap24xx()) 748 if (cpu_is_omap7xx() || cpu_is_omap16xx() || cpu_is_omap24xx())
735 omap_otg_init(pdata); 749 omap_otg_init(pdata);
736 else if (cpu_is_omap15xx()) 750 else if (cpu_is_omap15xx())
737 omap_1510_usb_init(pdata); 751 omap_1510_usb_init(pdata);