diff options
Diffstat (limited to 'arch/arm/plat-omap')
-rw-r--r-- | arch/arm/plat-omap/Kconfig | 116 | ||||
-rw-r--r-- | arch/arm/plat-omap/clock.c | 100 | ||||
-rw-r--r-- | arch/arm/plat-omap/common.c | 140 | ||||
-rw-r--r-- | arch/arm/plat-omap/cpu-omap.c | 3 | ||||
-rw-r--r-- | arch/arm/plat-omap/debug-devices.c | 12 | ||||
-rw-r--r-- | arch/arm/plat-omap/debug-leds.c | 4 | ||||
-rw-r--r-- | arch/arm/plat-omap/devices.c | 144 | ||||
-rw-r--r-- | arch/arm/plat-omap/dma.c | 492 | ||||
-rw-r--r-- | arch/arm/plat-omap/dmtimer.c | 153 | ||||
-rw-r--r-- | arch/arm/plat-omap/fb.c | 53 | ||||
-rw-r--r-- | arch/arm/plat-omap/gpio.c | 906 | ||||
-rw-r--r-- | arch/arm/plat-omap/i2c.c | 56 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/clock.h | 163 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/clockdomain.h | 111 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/debug-macro.S | 70 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/entry-macro.S | 172 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/irqs.h | 568 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/mtd-xip.h | 61 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/omapfb.h | 398 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/serial.h | 68 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/uncompress.h | 83 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/vmalloc.h | 21 | ||||
-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.h | 49 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/clock.h | 210 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/clockdomain.h | 141 | ||||
-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.h | 590 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/dma-44xx.h | 147 | ||||
-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.h | 16 | ||||
-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.h | 38 | ||||
-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.h | 144 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/irqs.h | 431 | ||||
-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.h | 94 | ||||
-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.h | 107 | ||||
-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.h | 93 | ||||
-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.h | 173 | ||||
-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.h | 62 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/vrfb.h | 50 | ||||
-rw-r--r-- | arch/arm/plat-omap/io.c | 62 | ||||
-rw-r--r-- | arch/arm/plat-omap/iommu-debug.c | 5 | ||||
-rw-r--r-- | arch/arm/plat-omap/iommu.c | 11 | ||||
-rw-r--r-- | arch/arm/plat-omap/iopgtable.h | 50 | ||||
-rw-r--r-- | arch/arm/plat-omap/iovmm.c | 20 | ||||
-rw-r--r-- | arch/arm/plat-omap/mailbox.c | 291 | ||||
-rw-r--r-- | arch/arm/plat-omap/mcbsp.c | 791 | ||||
-rw-r--r-- | arch/arm/plat-omap/mux.c | 10 | ||||
-rw-r--r-- | arch/arm/plat-omap/omap-pm-noop.c | 4 | ||||
-rw-r--r-- | arch/arm/plat-omap/omap_device.c | 163 | ||||
-rw-r--r-- | arch/arm/plat-omap/sram.c | 60 | ||||
-rw-r--r-- | arch/arm/plat-omap/usb.c | 46 |
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 | ||
8 | choice | 8 | choice |
9 | prompt "OMAP System Type" | 9 | prompt "OMAP System Type" |
10 | default ARCH_OMAP1 | 10 | default ARCH_OMAP2PLUS |
11 | 11 | ||
12 | config ARCH_OMAP1 | 12 | config 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 | |||
18 | config ARCH_OMAP2PLUS | ||
19 | bool "TI OMAP2/3/4" | ||
20 | select COMMON_CLKDEV | ||
21 | help | ||
22 | "Systems based on omap24xx, omap34xx or omap44xx" | ||
15 | 23 | ||
16 | config ARCH_OMAP2 | 24 | config 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 | ||
21 | config ARCH_OMAP3 | 29 | config 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 | ||
26 | config ARCH_OMAP4 | 36 | config 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 | ||
45 | config 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 | |||
56 | config 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 | |||
67 | config OMAP_RESET_CLOCKS | 56 | config 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 | ||
79 | config OMAP_MUX | 68 | config 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 | ||
88 | config OMAP_MUX_DEBUG | 77 | config 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 | ||
96 | config OMAP_MUX_WARNINGS | 85 | config 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 | ||
105 | config OMAP_MCBSP | 94 | config OMAP_MCBSP |
@@ -125,7 +114,7 @@ config OMAP_IOMMU_DEBUG | |||
125 | tristate | 114 | tristate |
126 | 115 | ||
127 | choice | 116 | choice |
128 | prompt "System timer" | 117 | prompt "System timer" |
129 | default OMAP_MPU_TIMER | 118 | default OMAP_MPU_TIMER |
130 | 119 | ||
131 | config OMAP_MPU_TIMER | 120 | config OMAP_MPU_TIMER |
@@ -137,7 +126,7 @@ config OMAP_MPU_TIMER | |||
137 | 126 | ||
138 | config OMAP_32K_TIMER | 127 | config 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 | ||
148 | endchoice | 137 | endchoice |
149 | 138 | ||
139 | config 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 | |||
149 | config 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 | |||
150 | config OMAP_32K_TIMER_HZ | 156 | config 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 | ||
159 | config OMAP_DM_TIMER | 165 | config 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 | ||
165 | choice | ||
166 | prompt "Low-level debug console UART" | ||
167 | depends on ARCH_OMAP | ||
168 | default OMAP_LL_DEBUG_UART1 | ||
169 | |||
170 | config OMAP_LL_DEBUG_UART1 | ||
171 | bool "UART1" | ||
172 | |||
173 | config OMAP_LL_DEBUG_UART2 | ||
174 | bool "UART2" | ||
175 | |||
176 | config OMAP_LL_DEBUG_UART3 | ||
177 | bool "UART3" | ||
178 | |||
179 | endchoice | ||
180 | |||
181 | config OMAP_SERIAL_WAKE | 171 | config 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 | ||
29 | static LIST_HEAD(clocks); | 29 | static LIST_HEAD(clocks); |
30 | static DEFINE_MUTEX(clocks_mutex); | 30 | static 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) | ||
45 | struct clk *clk_get(struct device *dev, const char *id) | ||
46 | { | ||
47 | return NULL; | ||
48 | } | ||
49 | EXPORT_SYMBOL(clk_get); | ||
50 | |||
51 | void clk_put(struct clk *clk) | ||
52 | { | ||
53 | } | ||
54 | EXPORT_SYMBOL(clk_put); | ||
55 | |||
56 | void omap2_clk_prepare_for_reboot(void) | ||
57 | { | ||
58 | } | ||
59 | EXPORT_SYMBOL(omap2_clk_prepare_for_reboot); | ||
60 | |||
61 | void omap_prcm_arch_reset(char mode) | ||
62 | { | ||
63 | } | ||
64 | EXPORT_SYMBOL(omap_prcm_arch_reset); | ||
65 | #endif | ||
66 | int clk_enable(struct clk *clk) | 39 | int 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 | ||
206 | unsigned int __initdata mpurate; | 176 | int __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 | */ | ||
206 | unsigned 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 | |||
232 | void clk_reparent(struct clk *child, struct clk *parent) | 213 | void 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 | } |
334 | EXPORT_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 | */ | ||
324 | struct 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 | */ | ||
365 | struct clk dummy_ck = { | ||
366 | .name = "dummy", | ||
367 | .ops = &clkops_null, | ||
368 | }; | ||
369 | |||
353 | #ifdef CONFIG_CPU_FREQ | 370 | #ifdef CONFIG_CPU_FREQ |
354 | void clk_init_cpufreq_table(struct cpufreq_frequency_table **table) | 371 | void 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 | } |
363 | EXPORT_SYMBOL(clk_init_cpufreq_table); | 380 | |
381 | void 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; | |||
413 | static int clk_debugfs_register_one(struct clk *c) | 439 | static 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 | ||
446 | err_out: | 470 | err_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 | ||
46 | unsigned char omap_bootloader_tag[512]; | ||
47 | int omap_bootloader_tag_len; | ||
48 | |||
49 | struct omap_board_config_kernel *omap_board_config; | 47 | struct omap_board_config_kernel *omap_board_config; |
50 | int omap_board_config_size; | 48 | int omap_board_config_size; |
51 | 49 | ||
50 | /* used by omap-smp.c and board-4430sdp.c */ | ||
51 | void __iomem *gic_cpu_base_addr; | ||
52 | |||
52 | static const void *get_config(u16 tag, size_t len, int skip, size_t *len_out) | 53 | static 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 | */ | ||
105 | static u32 offset_32k __read_mostly; | ||
106 | |||
99 | #ifdef CONFIG_ARCH_OMAP16XX | 107 | #ifdef CONFIG_ARCH_OMAP16XX |
100 | static cycle_t omap16xx_32k_read(struct clocksource *cs) | 108 | static 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 |
109 | static cycle_t omap2420_32k_read(struct clocksource *cs) | 117 | static 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 |
118 | static cycle_t omap2430_32k_read(struct clocksource *cs) | 126 | static 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 |
127 | static cycle_t omap34xx_32k_read(struct clocksource *cs) | 135 | static 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 |
136 | static cycle_t omap44xx_32k_read(struct clocksource *cs) | 144 | static 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 | */ | ||
187 | static struct timespec persistent_ts; | ||
188 | static cycles_t cycles, last_cycles; | ||
189 | void 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 | |||
172 | static int __init omap_init_clocksource_32k(void) | 206 | static 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 | ||
225 | static struct omap_globals omap242x_globals = { | 262 | static 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 | ||
235 | void __init omap2_set_globals_242x(void) | 275 | void __init omap2_set_globals_242x(void) |
@@ -242,12 +282,15 @@ void __init omap2_set_globals_242x(void) | |||
242 | 282 | ||
243 | static struct omap_globals omap243x_globals = { | 283 | static 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 | ||
253 | void __init omap2_set_globals_243x(void) | 296 | void __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 | ||
261 | static struct omap_globals omap343x_globals = { | 304 | static 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 | ||
271 | void __init omap2_set_globals_343x(void) | 317 | void __init omap2_set_globals_343x(void) |
272 | { | 318 | { |
273 | __omap2_set_globals(&omap343x_globals); | 319 | __omap2_set_globals(&omap3_globals); |
320 | } | ||
321 | |||
322 | void __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) |
278 | static struct omap_globals omap4_globals = { | 331 | static 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 | ||
286 | void __init omap2_set_globals_443x(void) | 344 | void __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 | ||
135 | static int omap_cpu_exit(struct cpufreq_policy *policy) | 135 | static 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 | ||
28 | static 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 | |||
27 | static struct resource smc91x_resources[] = { | 34 | static 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[] = { | |||
36 | static struct platform_device smc91x_device = { | 43 | static 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 | ||
296 | static struct dev_pm_ops fpga_dev_pm_ops = { | 296 | static 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 | |||
200 | static 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 | |||
215 | static 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 | |||
222 | static void omap_init_mcpdm(void) | ||
223 | { | ||
224 | (void) platform_device_register(&omap_mcpdm_device); | ||
225 | } | ||
226 | #else | ||
227 | static 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 | |||
290 | static struct resource rng_resources[] = { | ||
291 | { | ||
292 | .start = OMAP_RNG_BASE, | ||
293 | .end = OMAP_RNG_BASE + 0x4f, | ||
294 | .flags = IORESOURCE_MEM, | ||
295 | }, | ||
296 | }; | ||
297 | |||
298 | static 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 | |||
305 | static void omap_init_rng(void) | ||
306 | { | ||
307 | (void) platform_device_register(&omap_rng_device); | ||
308 | } | ||
309 | #else | ||
310 | static 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) | |||
324 | static inline void omap_init_wdt(void) {} | 394 | static 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 | |||
337 | static struct resource rng_resources[] = { | ||
338 | { | ||
339 | .start = OMAP_RNG_BASE, | ||
340 | .end = OMAP_RNG_BASE + 0x4f, | ||
341 | .flags = IORESOURCE_MEM, | ||
342 | }, | ||
343 | }; | ||
344 | |||
345 | static 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 | |||
352 | static void omap_init_rng(void) | ||
353 | { | ||
354 | (void) platform_device_register(&omap_rng_device); | ||
355 | } | ||
356 | #else | ||
357 | static 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 | } |
392 | arch_initcall(omap_init_devices); | 430 | arch_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 | ||
55 | static int enable_1510_mode; | 55 | static int enable_1510_mode; |
56 | 56 | ||
57 | static 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 | |||
57 | struct omap_dma_lch { | 63 | struct 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 | */ |
1252 | int omap_request_dma_chain(int dev_id, const char *dev_name, | 1258 | int 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 | ||
1880 | static int omap2_dma_handle_ch(int ch) | 1885 | static 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 | ||
1987 | static struct lcd_dma_info { | 1992 | void 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 | |||
2004 | void 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 | } | ||
2012 | EXPORT_SYMBOL(omap_set_lcd_dma_b1); | ||
2013 | |||
2014 | void omap_set_lcd_dma_src_port(int port) | ||
2015 | { | ||
2016 | lcd_dma.src_port = port; | ||
2017 | } | ||
2018 | |||
2019 | void 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 | } |
2023 | EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller); | ||
2024 | 2000 | ||
2025 | void omap_set_lcd_dma_single_transfer(int single) | 2001 | void omap_dma_global_context_restore(void) |
2026 | { | 2002 | { |
2027 | lcd_dma.single_transfer = single; | 2003 | int ch; |
2028 | } | ||
2029 | EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer); | ||
2030 | 2004 | ||
2031 | void 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 | } | ||
2040 | EXPORT_SYMBOL(omap_set_lcd_dma_b1_rotation); | ||
2041 | |||
2042 | void 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 | } | ||
2050 | EXPORT_SYMBOL(omap_set_lcd_dma_b1_mirror); | ||
2051 | |||
2052 | void 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 | } | ||
2061 | EXPORT_SYMBOL(omap_set_lcd_dma_b1_vxres); | ||
2062 | |||
2063 | void 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 | } | ||
2072 | EXPORT_SYMBOL(omap_set_lcd_dma_b1_scale); | ||
2073 | |||
2074 | static 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 | |||
2225 | static 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 | |||
2244 | int 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 | } | ||
2270 | EXPORT_SYMBOL(omap_request_lcd_dma); | ||
2271 | |||
2272 | void 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 | } | ||
2287 | EXPORT_SYMBOL(omap_free_lcd_dma); | ||
2288 | |||
2289 | void 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 | } |
2311 | EXPORT_SYMBOL(omap_enable_lcd_dma); | ||
2312 | |||
2313 | void 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 | } | ||
2338 | EXPORT_SYMBOL(omap_setup_lcd_dma); | ||
2339 | |||
2340 | void 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 | } | ||
2356 | EXPORT_SYMBOL(omap_stop_lcd_dma); | ||
2357 | 2024 | ||
2358 | /*----------------------------------------------------------------------------*/ | 2025 | /*----------------------------------------------------------------------------*/ |
2359 | 2026 | ||
2360 | static int __init omap_init_dma(void) | 2027 | static 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 | |||
2173 | out_free: | ||
2174 | kfree(dma_chan); | ||
2175 | |||
2176 | out_unmap: | ||
2177 | iounmap(omap_dma_base); | ||
2178 | |||
2179 | return r; | ||
2516 | } | 2180 | } |
2517 | 2181 | ||
2518 | arch_initcall(omap_init_dma); | 2182 | arch_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 @@ | |||
153 | struct omap_dm_timer { | 153 | struct 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 | 165 | static 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 | ||
180 | static struct omap_dm_timer omap1_dm_timers[] = { | 168 | static 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 | ||
191 | static const int dm_timer_count = ARRAY_SIZE(omap1_dm_timers); | 179 | static 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 | ||
205 | static struct omap_dm_timer omap2_dm_timers[] = { | 187 | static 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 | ||
227 | static struct clk *omap2_dm_source_clocks[3]; | 209 | static struct clk *omap2_dm_source_clocks[3]; |
228 | static const int dm_timer_count = ARRAY_SIZE(omap2_dm_timers); | 210 | static 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 | ||
242 | static struct omap_dm_timer omap3_dm_timers[] = { | 220 | static 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 | ||
263 | static struct clk *omap3_dm_source_clocks[2]; | 241 | static struct clk *omap3_dm_source_clocks[2]; |
264 | static const int dm_timer_count = ARRAY_SIZE(omap3_dm_timers); | 242 | static 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 | ||
278 | static struct omap_dm_timer omap4_dm_timers[] = { | 252 | static 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 | }; |
292 | static const char *omap4_dm_source_names[] __initdata = { | 266 | static 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 | }; |
297 | static struct clk *omap4_dm_source_clocks[2]; | 271 | static struct clk *omap4_dm_source_clocks[2]; |
298 | static const int dm_timer_count = ARRAY_SIZE(omap4_dm_timers); | 272 | static 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 | ||
306 | static struct omap_dm_timer *dm_timers; | 281 | static struct omap_dm_timer *dm_timers; |
307 | static const char **dm_source_names; | 282 | static 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 | } |
507 | EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask); | 490 | EXPORT_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 | ||
512 | struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) | 494 | struct 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 | } |
556 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); | 550 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); |
@@ -742,25 +736,30 @@ EXPORT_SYMBOL_GPL(omap_dm_timers_active); | |||
742 | int __init omap_dm_timer_init(void) | 736 | int __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 | ||
58 | void omapfb_set_platform_data(struct omapfb_platform_data *data) | ||
59 | { | ||
60 | } | ||
61 | |||
58 | static inline int ranges_overlap(unsigned long start1, unsigned long size1, | 62 | static 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 | ||
328 | arch_initcall(omap_init_fb); | 332 | arch_initcall(omap_init_fb); |
329 | 333 | ||
330 | #else | 334 | #elif defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) |
335 | |||
336 | static u64 omap_fb_dma_mask = ~(u32)0; | ||
337 | static struct omapfb_platform_data omapfb_config; | ||
338 | |||
339 | static 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 | |||
350 | void omapfb_set_platform_data(struct omapfb_platform_data *data) | ||
351 | { | ||
352 | omapfb_config = *data; | ||
353 | } | ||
354 | |||
355 | static inline int omap_init_fb(void) | ||
356 | { | ||
357 | return platform_device_register(&omap_fb_device); | ||
358 | } | ||
359 | |||
360 | arch_initcall(omap_init_fb); | ||
331 | 361 | ||
332 | void omapfb_reserve_sdram(void) {} | 362 | void omapfb_reserve_sdram(void) {} |
333 | unsigned long omapfb_reserve_sram(unsigned long sram_pstart, | 363 | unsigned 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 | |||
374 | void omapfb_set_platform_data(struct omapfb_platform_data *data) | ||
375 | { | ||
376 | } | ||
377 | |||
378 | void omapfb_reserve_sdram(void) {} | ||
379 | unsigned 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 | ||
190 | struct gpio_bank { | 174 | struct 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 |
223 | static struct gpio_bank gpio_bank_1610[5] = { | 208 | static 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 |
233 | static struct gpio_bank gpio_bank_1510[2] = { | 223 | static 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 | ||
240 | static 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) |
252 | static struct gpio_bank gpio_bank_850[7] = { | 232 | static 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 | ||
266 | static struct gpio_bank gpio_bank_242x[4] = { | 252 | static 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 | ||
273 | static struct gpio_bank gpio_bank_243x[5] = { | 263 | static 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 |
284 | static struct gpio_bank gpio_bank_34xx[6] = { | 279 | static 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 | ||
296 | static 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 | ||
294 | struct 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 | |||
310 | static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS]; | ||
311 | #endif | ||
312 | |||
313 | #ifdef CONFIG_ARCH_OMAP4 | ||
314 | static 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 | ||
313 | static struct gpio_bank *gpio_bank; | 331 | static 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 | } |
682 | EXPORT_SYMBOL(omap_set_gpio_debounce_time); | 686 | EXPORT_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) | ||
686 | static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | 689 | static 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 | */ | ||
758 | static 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 | |||
750 | static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | 791 | static 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 | */ |
1105 | static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | 1117 | static 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 | ||
1450 | static struct dev_pm_ops omap_mpuio_dev_pm_ops = { | 1492 | static 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 | ||
1592 | static int initialized; | 1632 | static int initialized; |
1593 | #if !(defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)) | 1633 | #if defined(CONFIG_ARCH_OMAP1) || defined(CONFIG_ARCH_OMAP2) |
1594 | static struct clk * gpio_ick; | 1634 | static struct clk * gpio_ick; |
1595 | #endif | 1635 | #endif |
1596 | 1636 | ||
@@ -1607,6 +1647,23 @@ static struct clk * gpio5_fck; | |||
1607 | static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; | 1647 | static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; |
1608 | #endif | 1648 | #endif |
1609 | 1649 | ||
1650 | static 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) | ||
1870 | static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) | 1919 | static 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 | ||
1981 | static int workaround_enabled; | 2029 | static 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 */ | ||
2181 | void 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 */ | ||
2218 | void 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 | ||
51 | static struct resource i2c_resources[][2] = { | 52 | static 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] = { | |||
72 | static u32 i2c_rate[ARRAY_SIZE(i2c_resources)]; | 73 | static u32 i2c_rate[ARRAY_SIZE(i2c_resources)]; |
73 | static struct platform_device omap_i2c_devices[] = { | 74 | static 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) | ||
84 | static 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 | ||
89 | static const int omap24xx_pins[][2] = {}; | ||
90 | #endif | ||
91 | #if defined(CONFIG_ARCH_OMAP34XX) | ||
92 | static 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 | ||
98 | static 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 | ||
103 | static 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 | |||
124 | static int __init omap_i2c_nr_ports(void) | 86 | static 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 | |||
16 | struct module; | ||
17 | struct clk; | ||
18 | struct clockdomain; | ||
19 | |||
20 | struct 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 | |||
30 | struct clksel_rate { | ||
31 | u32 val; | ||
32 | u8 div; | ||
33 | u8 flags; | ||
34 | }; | ||
35 | |||
36 | struct clksel { | ||
37 | struct clk *parent; | ||
38 | const struct clksel_rate *rates; | ||
39 | }; | ||
40 | |||
41 | struct 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 | |||
72 | struct 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 | |||
107 | struct cpufreq_frequency_table; | ||
108 | |||
109 | struct 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 | |||
123 | extern unsigned int mpurate; | ||
124 | |||
125 | extern int clk_init(struct clk_functions *custom_clocks); | ||
126 | extern void clk_preinit(struct clk *clk); | ||
127 | extern int clk_register(struct clk *clk); | ||
128 | extern void clk_reparent(struct clk *child, struct clk *parent); | ||
129 | extern void clk_unregister(struct clk *clk); | ||
130 | extern void propagate_rate(struct clk *clk); | ||
131 | extern void recalculate_root_clocks(void); | ||
132 | extern unsigned long followparent_recalc(struct clk *clk); | ||
133 | extern void clk_enable_init_clocks(void); | ||
134 | #ifdef CONFIG_CPU_FREQ | ||
135 | extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table); | ||
136 | #endif | ||
137 | |||
138 | extern 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 | */ | ||
49 | struct 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 | |||
64 | struct 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 | |||
93 | void clkdm_init(struct clockdomain **clkdms, struct clkdm_pwrdm_autodep *autodeps); | ||
94 | int clkdm_register(struct clockdomain *clkdm); | ||
95 | int clkdm_unregister(struct clockdomain *clkdm); | ||
96 | struct clockdomain *clkdm_lookup(const char *name); | ||
97 | |||
98 | int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user), | ||
99 | void *user); | ||
100 | struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm); | ||
101 | |||
102 | void omap2_clkdm_allow_idle(struct clockdomain *clkdm); | ||
103 | void omap2_clkdm_deny_idle(struct clockdomain *clkdm); | ||
104 | |||
105 | int omap2_clkdm_wakeup(struct clockdomain *clkdm); | ||
106 | int omap2_clkdm_sleep(struct clockdomain *clkdm); | ||
107 | |||
108 | int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); | ||
109 | int 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 | ||
58 | 1001: 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 | ||
66 | 1002: | ||
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 | ||
59 | 1510: | ||
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 | ||
101 | 2222: | ||
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__ | ||
562 | extern void omap_init_irq(void); | ||
563 | extern 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 | |||
21 | typedef 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 | |||
31 | static 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 | |||
83 | enum 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 | |||
95 | struct 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 | |||
104 | struct omapfb_update_window_old { | ||
105 | __u32 x, y; | ||
106 | __u32 width, height; | ||
107 | __u32 format; | ||
108 | }; | ||
109 | |||
110 | enum omapfb_plane { | ||
111 | OMAPFB_PLANE_GFX = 0, | ||
112 | OMAPFB_PLANE_VID1, | ||
113 | OMAPFB_PLANE_VID2, | ||
114 | }; | ||
115 | |||
116 | enum omapfb_channel_out { | ||
117 | OMAPFB_CHANNEL_OUT_LCD = 0, | ||
118 | OMAPFB_CHANNEL_OUT_DIGIT, | ||
119 | }; | ||
120 | |||
121 | struct 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 | |||
133 | struct omapfb_mem_info { | ||
134 | __u32 size; | ||
135 | __u8 type; | ||
136 | __u8 reserved[3]; | ||
137 | }; | ||
138 | |||
139 | struct omapfb_caps { | ||
140 | __u32 ctrl; | ||
141 | __u32 plane_color; | ||
142 | __u32 wnd_color; | ||
143 | }; | ||
144 | |||
145 | enum omapfb_color_key_type { | ||
146 | OMAPFB_COLOR_KEY_DISABLED = 0, | ||
147 | OMAPFB_COLOR_KEY_GFX_DST, | ||
148 | OMAPFB_COLOR_KEY_VID_SRC, | ||
149 | }; | ||
150 | |||
151 | struct omapfb_color_key { | ||
152 | __u8 channel_out; | ||
153 | __u32 background; | ||
154 | __u32 trans_key; | ||
155 | __u8 key_type; | ||
156 | }; | ||
157 | |||
158 | enum 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 | |||
193 | struct omapfb_device; | ||
194 | |||
195 | struct 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 | |||
228 | struct 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 | |||
247 | struct 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 | |||
268 | struct omapfb_notifier_block { | ||
269 | struct notifier_block nb; | ||
270 | void *data; | ||
271 | int plane_idx; | ||
272 | }; | ||
273 | |||
274 | typedef int (*omapfb_notifier_callback_t)(struct notifier_block *, | ||
275 | unsigned long event, | ||
276 | void *fbi); | ||
277 | |||
278 | struct 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 | |||
287 | struct omapfb_mem_desc { | ||
288 | int region_cnt; | ||
289 | struct omapfb_mem_region region[OMAPFB_PLANE_NUM]; | ||
290 | }; | ||
291 | |||
292 | struct 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 | |||
333 | enum omapfb_state { | ||
334 | OMAPFB_DISABLED = 0, | ||
335 | OMAPFB_SUSPENDED= 99, | ||
336 | OMAPFB_ACTIVE = 100 | ||
337 | }; | ||
338 | |||
339 | struct 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 | |||
346 | struct 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 | |||
367 | struct 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 | ||
374 | extern struct lcd_ctrl omap1_lcd_ctrl; | ||
375 | #else | ||
376 | extern struct lcd_ctrl omap2_disp_ctrl; | ||
377 | #endif | ||
378 | |||
379 | extern void omapfb_reserve_sdram(void); | ||
380 | extern void omapfb_register_panel(struct lcd_panel *panel); | ||
381 | extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval); | ||
382 | extern void omapfb_notify_clients(struct omapfb_device *fbdev, | ||
383 | unsigned long event); | ||
384 | extern int omapfb_register_client(struct omapfb_notifier_block *nb, | ||
385 | omapfb_notifier_callback_t callback, | ||
386 | void *callback_data); | ||
387 | extern int omapfb_unregister_client(struct omapfb_notifier_block *nb); | ||
388 | extern 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 */ | ||
394 | extern 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__ | ||
58 | extern void __init omap_serial_early_init(void); | ||
59 | extern void omap_serial_init(void); | ||
60 | extern int omap_uart_can_sleep(void); | ||
61 | extern void omap_uart_check_wakeup(void); | ||
62 | extern void omap_uart_prepare_suspend(void); | ||
63 | extern void omap_uart_prepare_idle(int num); | ||
64 | extern void omap_uart_resume_idle(int num); | ||
65 | extern 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 | |||
24 | unsigned 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 | |||
32 | static 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 | |||
75 | static 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 | */ | ||
24 | enum { | ||
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; | |||
87 | struct omap_backlight_config { | 99 | struct 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 | ||
93 | struct omap_fbmem_config { | 104 | struct 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 */ | ||
106 | struct 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 | |||
114 | struct omap_uart_config { | 116 | struct 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 */ |
158 | extern int debug_card_init(u32 addr, unsigned gpio); | 160 | extern int debug_card_init(u32 addr, unsigned gpio); |
159 | 161 | ||
162 | /* OMAP3EVM revision */ | ||
163 | #if defined(CONFIG_MACH_OMAP3EVM) | ||
164 | u8 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 | |||
13 | struct 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 | |||
18 | struct module; | ||
19 | struct clk; | ||
20 | struct clockdomain; | ||
21 | |||
22 | struct 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 | |||
33 | struct clksel_rate { | ||
34 | u32 val; | ||
35 | u8 div; | ||
36 | u8 flags; | ||
37 | }; | ||
38 | |||
39 | struct 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 | */ | ||
88 | struct 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 | |||
119 | struct 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 | |||
152 | struct cpufreq_frequency_table; | ||
153 | |||
154 | struct 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 | |||
169 | extern int mpurate; | ||
170 | |||
171 | extern int clk_init(struct clk_functions *custom_clocks); | ||
172 | extern void clk_preinit(struct clk *clk); | ||
173 | extern int clk_register(struct clk *clk); | ||
174 | extern void clk_reparent(struct clk *child, struct clk *parent); | ||
175 | extern void clk_unregister(struct clk *clk); | ||
176 | extern void propagate_rate(struct clk *clk); | ||
177 | extern void recalculate_root_clocks(void); | ||
178 | extern unsigned long followparent_recalc(struct clk *clk); | ||
179 | extern void clk_enable_init_clocks(void); | ||
180 | unsigned long omap_fixed_divisor_recalc(struct clk *clk); | ||
181 | #ifdef CONFIG_CPU_FREQ | ||
182 | extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table); | ||
183 | extern void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table); | ||
184 | #endif | ||
185 | extern struct clk *omap_clk_get_by_name(const char *name); | ||
186 | |||
187 | extern const struct clkops clkops_null; | ||
188 | |||
189 | extern 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 | */ | ||
56 | struct 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 | */ | ||
77 | struct 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 | */ | ||
99 | struct 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 | |||
116 | void clkdm_init(struct clockdomain **clkdms, struct clkdm_autodep *autodeps); | ||
117 | struct clockdomain *clkdm_lookup(const char *name); | ||
118 | |||
119 | int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user), | ||
120 | void *user); | ||
121 | struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm); | ||
122 | |||
123 | int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
124 | int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
125 | int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
126 | int clkdm_clear_all_wkdeps(struct clockdomain *clkdm); | ||
127 | int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
128 | int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
129 | int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | ||
130 | int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm); | ||
131 | |||
132 | void omap2_clkdm_allow_idle(struct clockdomain *clkdm); | ||
133 | void omap2_clkdm_deny_idle(struct clockdomain *clkdm); | ||
134 | |||
135 | int omap2_clkdm_wakeup(struct clockdomain *clkdm); | ||
136 | int omap2_clkdm_sleep(struct clockdomain *clkdm); | ||
137 | |||
138 | int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); | ||
139 | int 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 | ||
32 | struct sys_timer; | 32 | struct sys_timer; |
33 | 33 | ||
34 | /* used by omap-smp.c and board-4430sdp.c */ | ||
35 | extern void __iomem *gic_cpu_base_addr; | ||
36 | |||
34 | extern void omap_map_common_io(void); | 37 | extern void omap_map_common_io(void); |
35 | extern struct sys_timer omap_timer; | 38 | extern struct sys_timer omap_timer; |
36 | #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) | ||
37 | extern int omap_register_i2c_bus(int bus_id, u32 clkrate, | ||
38 | struct i2c_board_info const *info, | ||
39 | unsigned len); | ||
40 | #else | ||
41 | static 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 | */ | ||
50 | struct omap_globals { | 45 | struct 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 | ||
60 | void omap2_set_globals_242x(void); | 60 | void omap2_set_globals_242x(void); |
61 | void omap2_set_globals_243x(void); | 61 | void omap2_set_globals_243x(void); |
62 | void omap2_set_globals_343x(void); | 62 | void omap2_set_globals_343x(void); |
63 | void omap2_set_globals_36xx(void); | ||
63 | void omap2_set_globals_443x(void); | 64 | void 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 *); | |||
67 | void omap2_set_globals_sdrc(struct omap_globals *); | 68 | void omap2_set_globals_sdrc(struct omap_globals *); |
68 | void omap2_set_globals_control(struct omap_globals *); | 69 | void omap2_set_globals_control(struct omap_globals *); |
69 | void omap2_set_globals_prcm(struct omap_globals *); | 70 | void omap2_set_globals_prcm(struct omap_globals *); |
71 | void 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) | ||
208 | extern void __iomem *omap_ctrl_base_get(void); | 333 | extern void __iomem *omap_ctrl_base_get(void); |
209 | extern u8 omap_ctrl_readb(u16 offset); | 334 | extern u8 omap_ctrl_readb(u16 offset); |
210 | extern u16 omap_ctrl_readw(u16 offset); | 335 | extern u16 omap_ctrl_readw(u16 offset); |
@@ -212,6 +337,15 @@ extern u32 omap_ctrl_readl(u16 offset); | |||
212 | extern void omap_ctrl_writeb(u8 val, u16 offset); | 337 | extern void omap_ctrl_writeb(u8 val, u16 offset); |
213 | extern void omap_ctrl_writew(u16 val, u16 offset); | 338 | extern void omap_ctrl_writew(u16 val, u16 offset); |
214 | extern void omap_ctrl_writel(u32 val, u16 offset); | 339 | extern void omap_ctrl_writel(u32 val, u16 offset); |
340 | |||
341 | extern void omap3_save_scratchpad_contents(void); | ||
342 | extern void omap3_clear_scratchpad_contents(void); | ||
343 | extern u32 *get_restore_pointer(void); | ||
344 | extern u32 *get_es3_restore_pointer(void); | ||
345 | extern u32 omap3_arm_context[128]; | ||
346 | extern void omap3_control_save_context(void); | ||
347 | extern 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 @@ | |||
42 | int omap_type(void); | 45 | int omap_type(void); |
43 | 46 | ||
44 | struct omap_chip_id { | 47 | struct 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 { | |||
57 | unsigned int omap_rev(void); | 60 | unsigned 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) | |||
157 | IS_OMAP_CLASS(16xx, 0x16) | 109 | IS_OMAP_CLASS(16xx, 0x16) |
158 | IS_OMAP_CLASS(24xx, 0x24) | 110 | IS_OMAP_CLASS(24xx, 0x24) |
159 | IS_OMAP_CLASS(34xx, 0x34) | 111 | IS_OMAP_CLASS(34xx, 0x34) |
112 | IS_OMAP_CLASS(44xx, 0x44) | ||
160 | 113 | ||
161 | IS_OMAP_SUBCLASS(242x, 0x242) | 114 | IS_OMAP_SUBCLASS(242x, 0x242) |
162 | IS_OMAP_SUBCLASS(243x, 0x243) | 115 | IS_OMAP_SUBCLASS(243x, 0x243) |
163 | IS_OMAP_SUBCLASS(343x, 0x343) | 116 | IS_OMAP_SUBCLASS(343x, 0x343) |
117 | IS_OMAP_SUBCLASS(363x, 0x363) | ||
118 | IS_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) | |||
287 | IS_OMAP_TYPE(2423, 0x2423) | 249 | IS_OMAP_TYPE(2423, 0x2423) |
288 | IS_OMAP_TYPE(2430, 0x2430) | 250 | IS_OMAP_TYPE(2430, 0x2430) |
289 | IS_OMAP_TYPE(3430, 0x3430) | 251 | IS_OMAP_TYPE(3430, 0x3430) |
252 | IS_OMAP_TYPE(3505, 0x3505) | ||
253 | IS_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 | ||
423 | int omap_chip_is(struct omap_chip_id oci); | 433 | int omap_chip_is(struct omap_chip_id oci); |
424 | void omap2_check_revision(void); | 434 | void omap2_check_revision(void); |
425 | 435 | ||
436 | /* | ||
437 | * Runtime detection of OMAP3 features | ||
438 | */ | ||
439 | extern 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) \ | ||
449 | static inline unsigned int omap3_has_ ##feat(void) \ | ||
450 | { \ | ||
451 | return (omap3_features & OMAP3_HAS_ ##flag); \ | ||
452 | } \ | ||
453 | |||
454 | OMAP3_HAS_FEATURE(l2cache, L2CACHE) | ||
455 | OMAP3_HAS_FEATURE(sgx, SGX) | ||
456 | OMAP3_HAS_FEATURE(iva, IVA) | ||
457 | OMAP3_HAS_FEATURE(neon, NEON) | ||
458 | OMAP3_HAS_FEATURE(isp, ISP) | ||
459 | OMAP3_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 | |||
46 | struct omap_dss_device; | ||
47 | struct omap_overlay_manager; | ||
48 | |||
49 | enum 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 | |||
58 | enum omap_plane { | ||
59 | OMAP_DSS_GFX = 0, | ||
60 | OMAP_DSS_VIDEO1 = 1, | ||
61 | OMAP_DSS_VIDEO2 = 2 | ||
62 | }; | ||
63 | |||
64 | enum omap_channel { | ||
65 | OMAP_DSS_CHANNEL_LCD = 0, | ||
66 | OMAP_DSS_CHANNEL_DIGIT = 1, | ||
67 | }; | ||
68 | |||
69 | enum 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 | |||
117 | enum omap_lcd_display_type { | ||
118 | OMAP_DSS_LCD_DISPLAY_STN, | ||
119 | OMAP_DSS_LCD_DISPLAY_TFT, | ||
120 | }; | ||
121 | |||
122 | enum 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 | |||
129 | enum omap_dss_trans_key_type { | ||
130 | OMAP_DSS_COLOR_KEY_GFX_DST = 0, | ||
131 | OMAP_DSS_COLOR_KEY_VID_SRC = 1, | ||
132 | }; | ||
133 | |||
134 | enum omap_rfbi_te_mode { | ||
135 | OMAP_DSS_RFBI_TE_MODE_1 = 1, | ||
136 | OMAP_DSS_RFBI_TE_MODE_2 = 2, | ||
137 | }; | ||
138 | |||
139 | enum 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 | |||
150 | enum omap_dss_venc_type { | ||
151 | OMAP_DSS_VENC_TYPE_COMPOSITE, | ||
152 | OMAP_DSS_VENC_TYPE_SVIDEO, | ||
153 | }; | ||
154 | |||
155 | enum omap_display_caps { | ||
156 | OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE = 1 << 0, | ||
157 | OMAP_DSS_DISPLAY_CAP_TEAR_ELIM = 1 << 1, | ||
158 | }; | ||
159 | |||
160 | enum omap_dss_update_mode { | ||
161 | OMAP_DSS_UPDATE_DISABLED = 0, | ||
162 | OMAP_DSS_UPDATE_AUTO, | ||
163 | OMAP_DSS_UPDATE_MANUAL, | ||
164 | }; | ||
165 | |||
166 | enum 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 */ | ||
173 | enum omap_dss_overlay_managers { | ||
174 | OMAP_DSS_OVL_MGR_LCD, | ||
175 | OMAP_DSS_OVL_MGR_TV, | ||
176 | }; | ||
177 | |||
178 | enum omap_dss_rotation_type { | ||
179 | OMAP_DSS_ROT_DMA = 0, | ||
180 | OMAP_DSS_ROT_VRFB = 1, | ||
181 | }; | ||
182 | |||
183 | /* clockwise rotation angle */ | ||
184 | enum 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 | |||
191 | enum omap_overlay_caps { | ||
192 | OMAP_DSS_OVL_CAP_SCALE = 1 << 0, | ||
193 | OMAP_DSS_OVL_CAP_DISPC = 1 << 1, | ||
194 | }; | ||
195 | |||
196 | enum omap_overlay_manager_caps { | ||
197 | OMAP_DSS_OVL_MGR_CAP_DISPC = 1 << 0, | ||
198 | }; | ||
199 | |||
200 | /* RFBI */ | ||
201 | |||
202 | struct 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 | |||
221 | void omap_rfbi_write_command(const void *buf, u32 len); | ||
222 | void omap_rfbi_read_data(void *buf, u32 len); | ||
223 | void omap_rfbi_write_data(const void *buf, u32 len); | ||
224 | void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width, | ||
225 | u16 x, u16 y, | ||
226 | u16 w, u16 h); | ||
227 | int omap_rfbi_enable_te(bool enable, unsigned line); | ||
228 | int 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 */ | ||
233 | void dsi_bus_lock(void); | ||
234 | void dsi_bus_unlock(void); | ||
235 | int dsi_vc_dcs_write(int channel, u8 *data, int len); | ||
236 | int dsi_vc_dcs_write_0(int channel, u8 dcs_cmd); | ||
237 | int dsi_vc_dcs_write_1(int channel, u8 dcs_cmd, u8 param); | ||
238 | int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len); | ||
239 | int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen); | ||
240 | int dsi_vc_dcs_read_1(int channel, u8 dcs_cmd, u8 *data); | ||
241 | int dsi_vc_dcs_read_2(int channel, u8 dcs_cmd, u16 *data); | ||
242 | int dsi_vc_set_max_rx_packet_size(int channel, u16 len); | ||
243 | int dsi_vc_send_null(int channel); | ||
244 | int dsi_vc_send_bta_sync(int channel); | ||
245 | |||
246 | /* Board specific data */ | ||
247 | struct 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 | |||
254 | struct 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 */ | ||
280 | const extern struct omap_video_timings omap_dss_pal_timings; | ||
281 | const extern struct omap_video_timings omap_dss_ntsc_timings; | ||
282 | #endif | ||
283 | |||
284 | struct 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 | |||
304 | struct 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 | |||
333 | struct 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 | |||
343 | struct 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 | |||
380 | struct 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 | |||
473 | struct 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 | |||
522 | int omap_dss_register_driver(struct omap_dss_driver *); | ||
523 | void omap_dss_unregister_driver(struct omap_dss_driver *); | ||
524 | |||
525 | int omap_dss_register_device(struct omap_dss_device *); | ||
526 | void omap_dss_unregister_device(struct omap_dss_device *); | ||
527 | |||
528 | void omap_dss_get_device(struct omap_dss_device *dssdev); | ||
529 | void 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) | ||
531 | struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from); | ||
532 | struct omap_dss_device *omap_dss_find_device(void *data, | ||
533 | int (*match)(struct omap_dss_device *dssdev, void *data)); | ||
534 | |||
535 | int omap_dss_start_device(struct omap_dss_device *dssdev); | ||
536 | void omap_dss_stop_device(struct omap_dss_device *dssdev); | ||
537 | |||
538 | int omap_dss_get_num_overlay_managers(void); | ||
539 | struct omap_overlay_manager *omap_dss_get_overlay_manager(int num); | ||
540 | |||
541 | int omap_dss_get_num_overlays(void); | ||
542 | struct omap_overlay *omap_dss_get_overlay(int num); | ||
543 | |||
544 | void omapdss_default_get_resolution(struct omap_dss_device *dssdev, | ||
545 | u16 *xres, u16 *yres); | ||
546 | int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev); | ||
547 | |||
548 | typedef void (*omap_dispc_isr_t) (void *arg, u32 mask); | ||
549 | int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask); | ||
550 | int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask); | ||
551 | |||
552 | int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout); | ||
553 | int 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 | |||
559 | void omapdss_dsi_vc_enable_hs(int channel, bool enable); | ||
560 | int omapdss_dsi_enable_te(struct omap_dss_device *dssdev, bool enable); | ||
561 | |||
562 | int omap_dsi_prepare_update(struct omap_dss_device *dssdev, | ||
563 | u16 *x, u16 *y, u16 *w, u16 *h); | ||
564 | int 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 | |||
569 | int omapdss_dsi_display_enable(struct omap_dss_device *dssdev); | ||
570 | void omapdss_dsi_display_disable(struct omap_dss_device *dssdev); | ||
571 | |||
572 | int omapdss_dpi_display_enable(struct omap_dss_device *dssdev); | ||
573 | void omapdss_dpi_display_disable(struct omap_dss_device *dssdev); | ||
574 | void dpi_set_timings(struct omap_dss_device *dssdev, | ||
575 | struct omap_video_timings *timings); | ||
576 | int dpi_check_timings(struct omap_dss_device *dssdev, | ||
577 | struct omap_video_timings *timings); | ||
578 | |||
579 | int omapdss_sdi_display_enable(struct omap_dss_device *dssdev); | ||
580 | void omapdss_sdi_display_disable(struct omap_dss_device *dssdev); | ||
581 | |||
582 | int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev); | ||
583 | void omapdss_rfbi_display_disable(struct omap_dss_device *dssdev); | ||
584 | int omap_rfbi_prepare_update(struct omap_dss_device *dssdev, | ||
585 | u16 *x, u16 *y, u16 *w, u16 *h); | ||
586 | int 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 */ | ||
507 | enum { | ||
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 | |||
514 | enum omap_dma_burst_mode { | 401 | enum 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); | |||
633 | extern void omap_set_dma_src_endian_type(int lch, enum end_type etype); | 520 | extern void omap_set_dma_src_endian_type(int lch, enum end_type etype); |
634 | extern int omap_get_dma_index(int lch, int *ei, int *fi); | 521 | extern int omap_get_dma_index(int lch, int *ei, int *fi); |
635 | 522 | ||
523 | void omap_dma_global_context_save(void); | ||
524 | void omap_dma_global_context_restore(void); | ||
525 | |||
526 | extern void omap_dma_disable_irq(int lch); | ||
527 | |||
636 | /* Chaining APIs */ | 528 | /* Chaining APIs */ |
637 | #ifndef CONFIG_ARCH_OMAP1 | 529 | #ifndef CONFIG_ARCH_OMAP1 |
638 | extern int omap_request_dma_chain(int dev_id, const char *dev_name, | 530 | extern 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, | |||
656 | extern int omap_dma_chain_status(int chain_id); | 548 | extern 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) |
660 | extern int omap_request_lcd_dma(void (*callback)(u16 status, void *data), | 552 | #include <mach/lcd_dma.h> |
661 | void *data); | 553 | #else |
662 | extern void omap_free_lcd_dma(void); | 554 | static inline int omap_lcd_dma_running(void) |
663 | extern void omap_setup_lcd_dma(void); | 555 | { |
664 | extern void omap_enable_lcd_dma(void); | 556 | return 0; |
665 | extern void omap_stop_lcd_dma(void); | 557 | } |
666 | extern void omap_set_lcd_dma_ext_controller(int external); | 558 | #endif |
667 | extern void omap_set_lcd_dma_single_transfer(int single); | ||
668 | extern void omap_set_lcd_dma_b1(unsigned long addr, u16 fb_xres, u16 fb_yres, | ||
669 | int data_type); | ||
670 | extern void omap_set_lcd_dma_b1_rotation(int rotate); | ||
671 | extern void omap_set_lcd_dma_b1_vxres(unsigned long vxres); | ||
672 | extern void omap_set_lcd_dma_b1_mirror(int mirror); | ||
673 | extern 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 | |||
14 | extern 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); | |||
76 | extern void omap2_gpio_resume_after_retention(void); | 76 | extern void omap2_gpio_resume_after_retention(void); |
77 | extern void omap_set_gpio_debounce(int gpio, int enable); | 77 | extern void omap_set_gpio_debounce(int gpio, int enable); |
78 | extern void omap_set_gpio_debounce_time(int gpio, int enable); | 78 | extern void omap_set_gpio_debounce_time(int gpio, int enable); |
79 | 79 | extern void omap_gpio_save_context(void); | |
80 | extern 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); |
108 | extern void gpmc_prefetch_reset(void); | 111 | extern void gpmc_prefetch_reset(void); |
109 | extern int gpmc_prefetch_status(void); | 112 | extern int gpmc_prefetch_status(void); |
110 | extern void __init gpmc_init(void); | 113 | extern void omap3_gpmc_save_context(void); |
114 | extern void omap3_gpmc_restore_context(void); | ||
115 | extern 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) | ||
25 | extern int omap_register_i2c_bus(int bus_id, u32 clkrate, | ||
26 | struct i2c_board_info const *info, | ||
27 | unsigned len); | ||
28 | #else | ||
29 | static 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 | |||
37 | void __init omap1_i2c_mux_pins(int bus_id); | ||
38 | void __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; | |||
226 | extern void omap1_map_common_io(void); | 259 | extern void omap1_map_common_io(void); |
227 | extern void omap1_init_common_hw(void); | 260 | extern void omap1_init_common_hw(void); |
228 | 261 | ||
229 | extern void omap2_map_common_io(void); | 262 | #ifdef CONFIG_ARCH_OMAP2420 |
263 | extern void omap242x_map_common_io(void); | ||
264 | #else | ||
265 | static inline void omap242x_map_common_io(void) | ||
266 | { | ||
267 | } | ||
268 | #endif | ||
269 | |||
270 | #ifdef CONFIG_ARCH_OMAP2430 | ||
271 | extern void omap243x_map_common_io(void); | ||
272 | #else | ||
273 | static inline void omap243x_map_common_io(void) | ||
274 | { | ||
275 | } | ||
276 | #endif | ||
277 | |||
278 | #ifdef CONFIG_ARCH_OMAP3 | ||
279 | extern void omap34xx_map_common_io(void); | ||
280 | #else | ||
281 | static inline void omap34xx_map_common_io(void) | ||
282 | { | ||
283 | } | ||
284 | #endif | ||
285 | |||
286 | #ifdef CONFIG_ARCH_OMAP4 | ||
287 | extern void omap44xx_map_common_io(void); | ||
288 | #else | ||
289 | static inline void omap44xx_map_common_io(void) | ||
290 | { | ||
291 | } | ||
292 | #endif | ||
293 | |||
230 | extern void omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, | 294 | extern 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__ | ||
420 | extern void omap_init_irq(void); | ||
421 | extern int omap_irq_pending(void); | ||
422 | void omap_intc_save_context(void); | ||
423 | void omap_intc_restore_context(void); | ||
424 | void omap3_intc_suspend(void); | ||
425 | void omap3_intc_prepare_idle(void); | ||
426 | void 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 | ||
10 | typedef u32 mbox_msg_t; | 11 | typedef u32 mbox_msg_t; |
11 | typedef void (mbox_receiver_t)(mbox_msg_t msg); | ||
12 | struct omap_mbox; | 12 | struct omap_mbox; |
13 | 13 | ||
14 | typedef int __bitwise omap_mbox_irq_t; | 14 | typedef 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 | ||
67 | int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg, void *); | 70 | int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg); |
68 | void omap_mbox_init_seq(struct omap_mbox *); | 71 | void omap_mbox_init_seq(struct omap_mbox *); |
69 | 72 | ||
70 | struct omap_mbox *omap_mbox_get(const char *); | 73 | struct 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 | ||
99 | static 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 | |||
105 | static 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 | ||
413 | struct 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 | |||
382 | struct omap_mcbsp { | 423 | struct 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 | }; |
419 | extern struct omap_mcbsp **mcbsp_ptr; | 462 | extern struct omap_mcbsp **mcbsp_ptr; |
420 | extern int omap_mcbsp_count; | 463 | extern int omap_mcbsp_count, omap_mcbsp_cache_size; |
421 | 464 | ||
422 | int omap_mcbsp_init(void); | 465 | int omap_mcbsp_init(void); |
423 | void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config, | 466 | void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config, |
424 | int size); | 467 | int size); |
425 | void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config); | 468 | void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config); |
426 | #ifdef CONFIG_ARCH_OMAP34XX | 469 | #ifdef CONFIG_ARCH_OMAP3 |
427 | void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold); | 470 | void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold); |
428 | void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold); | 471 | void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold); |
429 | u16 omap_mcbsp_get_max_tx_threshold(unsigned int id); | 472 | u16 omap_mcbsp_get_max_tx_threshold(unsigned int id); |
@@ -459,4 +502,21 @@ int omap_mcbsp_pollread(unsigned int id, u16 * buf); | |||
459 | int omap_mcbsp_pollwrite(unsigned int id, u16 buf); | 502 | int omap_mcbsp_pollwrite(unsigned int id, u16 buf); |
460 | int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type); | 503 | int 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 */ | ||
507 | int omap_st_set_chgain(unsigned int id, int channel, s16 chgain); | ||
508 | int omap_st_get_chgain(unsigned int id, int channel, s16 *chgain); | ||
509 | int omap_st_enable(unsigned int id); | ||
510 | int omap_st_disable(unsigned int id); | ||
511 | int omap_st_is_enabled(unsigned int id); | ||
512 | #else | ||
513 | static inline int omap_st_set_chgain(unsigned int id, int channel, | ||
514 | s16 chgain) { return 0; } | ||
515 | static inline int omap_st_get_chgain(unsigned int id, int channel, | ||
516 | s16 *chgain) { return 0; } | ||
517 | static inline int omap_st_enable(unsigned int id) { return 0; } | ||
518 | static inline int omap_st_disable(unsigned int id) { return 0; } | ||
519 | static 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 | ||
41 | extern int menelaus_set_regulator_sleep(int enable, u32 val); | 41 | extern 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 */ |
129 | extern void omap_mmc_notify_cover_event(struct device *dev, int slot, int is_closed); | 143 | extern 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 | |||
206 | struct pin_config { | 133 | struct 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 | ||
235 | enum omap730_index { | 158 | enum 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 | |||
254 | enum 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 | |||
274 | enum omap1xxx_index { | 196 | enum 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 | ||
729 | enum 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 | |||
895 | struct omap_mux_cfg { | 651 | struct 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 */ |
903 | extern int omap1_mux_init(void); | 659 | extern int omap1_mux_init(void); |
904 | extern int omap2_mux_init(void); | ||
905 | extern int omap_mux_register(struct omap_mux_cfg *); | 660 | extern int omap_mux_register(struct omap_mux_cfg *); |
906 | extern int omap_cfg_reg(unsigned long reg_cfg); | 661 | extern 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) */ |
909 | static inline int omap1_mux_init(void) { return 0; } | 664 | static inline int omap1_mux_init(void) { return 0; } |
910 | static inline int omap2_mux_init(void) { return 0; } | ||
911 | static inline int omap_cfg_reg(unsigned long reg_cfg) { return 0; } | 665 | static inline int omap_cfg_reg(unsigned long reg_cfg) { return 0; } |
912 | #endif | 666 | #endif |
913 | 667 | ||
668 | extern 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) | ||
33 | extern int gpmc_nand_init(struct omap_nand_platform_data *d); | ||
34 | #else | ||
35 | static 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 | */ |
64 | struct omap_device { | 64 | struct 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 | ||
85 | bool omap_device_is_valid(struct omap_device *od); | ||
84 | int omap_device_count_resources(struct omap_device *od); | 86 | int omap_device_count_resources(struct omap_device *od); |
85 | int omap_device_fill_resources(struct omap_device *od, struct resource *res); | 87 | int 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 | ||
93 | struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | 95 | struct 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 | ||
99 | int omap_device_register(struct omap_device *od); | 101 | int omap_device_register(struct omap_device *od); |
102 | int omap_early_device_register(struct omap_device *od); | ||
100 | 103 | ||
101 | /* OMAP PM interface */ | 104 | /* OMAP PM interface */ |
102 | int omap_device_align_pm_lat(struct platform_device *pdev, | 105 | int omap_device_align_pm_lat(struct platform_device *pdev, |
@@ -131,11 +134,17 @@ int omap_device_enable_clocks(struct omap_device *od); | |||
131 | */ | 134 | */ |
132 | struct omap_device_pm_latency { | 135 | struct 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 | ||
40 | struct omap_device; | 40 | struct omap_device; |
41 | 41 | ||
42 | /* OCP SYSCONFIG bit shifts/masks */ | 42 | extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1; |
43 | #define SYSC_MIDLEMODE_SHIFT 12 | 43 | extern 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 | */ | ||
91 | struct 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 | */ |
88 | struct omap_hwmod_opt_clk { | 119 | struct 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 | */ | ||
259 | struct 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 | */ |
239 | struct omap_hwmod_sysconfig { | 293 | struct 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 | */ | ||
401 | struct 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 | */ |
373 | struct omap_hwmod { | 446 | struct 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); | |||
420 | int omap_hwmod_enable_clocks(struct omap_hwmod *oh); | 492 | int omap_hwmod_enable_clocks(struct omap_hwmod *oh); |
421 | int omap_hwmod_disable_clocks(struct omap_hwmod *oh); | 493 | int omap_hwmod_disable_clocks(struct omap_hwmod *oh); |
422 | 494 | ||
495 | int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode); | ||
496 | |||
423 | int omap_hwmod_reset(struct omap_hwmod *oh); | 497 | int omap_hwmod_reset(struct omap_hwmod *oh); |
424 | void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); | 498 | void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); |
425 | 499 | ||
@@ -444,4 +518,17 @@ int omap_hwmod_set_clockact_none(struct omap_hwmod *oh); | |||
444 | int omap_hwmod_enable_wakeup(struct omap_hwmod *oh); | 518 | int omap_hwmod_enable_wakeup(struct omap_hwmod *oh); |
445 | int omap_hwmod_disable_wakeup(struct omap_hwmod *oh); | 519 | int omap_hwmod_disable_wakeup(struct omap_hwmod *oh); |
446 | 520 | ||
521 | int 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 | */ | ||
530 | extern int omap2420_hwmod_init(void); | ||
531 | extern int omap2430_hwmod_init(void); | ||
532 | extern 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 @@ | |||
60 | struct clockdomain; | 68 | struct clockdomain; |
61 | struct powerdomain; | 69 | struct powerdomain; |
62 | 70 | ||
63 | /* Encodes dependencies between powerdomains - statically defined */ | 71 | /** |
64 | struct 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 | */ | ||
77 | struct powerdomain { | 89 | struct 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 | ||
130 | void pwrdm_init(struct powerdomain **pwrdm_list); | 113 | void pwrdm_init(struct powerdomain **pwrdm_list); |
131 | 114 | ||
132 | int pwrdm_register(struct powerdomain *pwrdm); | ||
133 | int pwrdm_unregister(struct powerdomain *pwrdm); | ||
134 | struct powerdomain *pwrdm_lookup(const char *name); | 115 | struct powerdomain *pwrdm_lookup(const char *name); |
135 | 116 | ||
136 | int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), | 117 | int 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 | ||
147 | int pwrdm_add_wkdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2); | ||
148 | int pwrdm_del_wkdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2); | ||
149 | int pwrdm_read_wkdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2); | ||
150 | int pwrdm_add_sleepdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2); | ||
151 | int pwrdm_del_sleepdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2); | ||
152 | int pwrdm_read_sleepdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2); | ||
153 | |||
154 | int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm); | 128 | int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm); |
155 | 129 | ||
156 | int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst); | 130 | int 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 | ||
166 | int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm); | 140 | int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm); |
167 | int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm); | 141 | int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm); |
142 | int pwrdm_read_logic_retst(struct powerdomain *pwrdm); | ||
168 | int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank); | 143 | int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank); |
169 | int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank); | 144 | int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank); |
145 | int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank); | ||
170 | 146 | ||
171 | int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm); | 147 | int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm); |
172 | int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm); | 148 | int 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 | ||
26 | u32 omap_prcm_get_reset_sources(void); | 26 | u32 omap_prcm_get_reset_sources(void); |
27 | void omap_prcm_arch_reset(char mode); | 27 | void omap_prcm_arch_reset(char mode, const char *cmd); |
28 | int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name); | 28 | int 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 | |||
34 | void omap3_prcm_save_context(void); | ||
35 | void omap3_prcm_restore_context(void); | ||
31 | 36 | ||
37 | u32 prm_read_mod_reg(s16 module, u16 idx); | ||
38 | void prm_write_mod_reg(u32 val, s16 module, u16 idx); | ||
39 | u32 prm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx); | ||
40 | u32 prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask); | ||
41 | u32 cm_read_mod_reg(s16 module, u16 idx); | ||
42 | void cm_write_mod_reg(u32 val, s16 module, u16 idx); | ||
43 | u32 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, | |||
120 | int omap2_sdrc_get_params(unsigned long r, | 129 | int 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); |
132 | void omap2_sms_save_context(void); | ||
133 | void omap2_sms_restore_context(void); | ||
134 | |||
135 | void omap2_sms_write_rot_control(u32 val, unsigned ctx); | ||
136 | void omap2_sms_write_rot_size(u32 val, unsigned ctx); | ||
137 | void 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__ | ||
82 | extern void __init omap_serial_early_init(void); | ||
83 | extern void omap_serial_init(void); | ||
84 | extern void omap_serial_init_port(int port); | ||
85 | extern int omap_uart_can_sleep(void); | ||
86 | extern void omap_uart_check_wakeup(void); | ||
87 | extern void omap_uart_prepare_suspend(void); | ||
88 | extern void omap_uart_prepare_idle(int num); | ||
89 | extern void omap_uart_resume_idle(int num); | ||
90 | extern 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 */ |
30 | extern void omap_secondary_startup(void); | 30 | extern void omap_secondary_startup(void); |
31 | extern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask); | ||
32 | extern 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); |
30 | extern void omap3_sram_restore_context(void); | ||
30 | 31 | ||
31 | /* Do not use these */ | 32 | /* Do not use these */ |
32 | extern void omap1_sram_reprogram_clock(u32 ckctl, u32 dpllctl); | 33 | extern 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); |
69 | extern unsigned long omap3_sram_configure_core_dpll_sz; | 70 | extern unsigned long omap3_sram_configure_core_dpll_sz; |
70 | 71 | ||
72 | #ifdef CONFIG_PM | ||
73 | extern void omap_push_sram_idle(void); | ||
74 | #else | ||
75 | static 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 | ||
25 | static inline void omap1_arch_reset(char mode) | 25 | static 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) | |||
43 | static inline void arch_reset(char mode, const char *cmd) | 43 | static 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 | |||
27 | static volatile u8 *uart1_base; | ||
28 | static int uart1_shift; | ||
29 | |||
30 | static volatile u8 *uart_base; | ||
31 | static 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 | */ | ||
41 | static void set_uart1_scratchpad(unsigned char port) | ||
42 | { | ||
43 | uart1_base[UART_SCR << uart1_shift] = port; | ||
44 | } | ||
45 | |||
46 | static 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 | |||
56 | static 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 | |||
100 | static 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 | ||
10 | enum ehci_hcd_omap_mode { | ||
11 | EHCI_HCD_OMAP_MODE_UNKNOWN, | ||
12 | EHCI_HCD_OMAP_MODE_PHY, | ||
13 | EHCI_HCD_OMAP_MODE_TLL, | ||
14 | }; | ||
15 | |||
16 | struct 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 | ||
30 | extern void usb_musb_init(void); | 46 | struct omap_musb_board_data { |
47 | u8 interface_type; | ||
48 | u8 mode; | ||
49 | u16 power; | ||
50 | }; | ||
51 | |||
52 | enum musb_interface {MUSB_INTERFACE_ULPI, MUSB_INTERFACE_UTMI}; | ||
53 | |||
54 | extern void usb_musb_init(struct omap_musb_board_data *board_data); | ||
55 | |||
56 | extern 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 | |||
30 | extern int omap_vram_add_region(unsigned long paddr, size_t size); | ||
31 | extern int omap_vram_free(unsigned long paddr, size_t size); | ||
32 | extern int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr); | ||
33 | extern int omap_vram_reserve(unsigned long paddr, size_t size); | ||
34 | extern void omap_vram_get_info(unsigned long *vram, unsigned long *free_vram, | ||
35 | unsigned long *largest_free_block); | ||
36 | |||
37 | #ifdef CONFIG_OMAP2_VRAM | ||
38 | extern void omap_vram_set_sdram_vram(u32 size, u32 start); | ||
39 | extern void omap_vram_set_sram_vram(u32 size, u32 start); | ||
40 | |||
41 | extern void omap_vram_reserve_sdram(void); | ||
42 | extern 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 | ||
48 | static inline void omap_vram_set_sdram_vram(u32 size, u32 start) { } | ||
49 | static inline void omap_vram_set_sram_vram(u32 size, u32 start) { } | ||
50 | |||
51 | static inline void omap_vram_reserve_sdram(void) { } | ||
52 | static 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 | |||
26 | struct 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 | |||
38 | extern int omap_vrfb_request_ctx(struct vrfb *vrfb); | ||
39 | extern void omap_vrfb_release_ctx(struct vrfb *vrfb); | ||
40 | extern void omap_vrfb_adjust_size(u16 *width, u16 *height, | ||
41 | u8 bytespp); | ||
42 | extern u32 omap_vrfb_min_phys_size(u16 width, u16 height, u8 bytespp); | ||
43 | extern u16 omap_vrfb_max_height(u32 phys_size, u16 width, u8 bytespp); | ||
44 | extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, | ||
45 | u16 width, u16 height, | ||
46 | unsigned bytespp, bool yuv_mode); | ||
47 | extern int omap_vrfb_map_angle(struct vrfb *vrfb, u16 height, u8 rot); | ||
48 | extern 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 | } |
125 | EXPORT_SYMBOL(omap_ioremap); | 129 | EXPORT_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 | } |
147 | EXPORT_SYMBOL(omap_readb); | 151 | EXPORT_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 | } |
156 | EXPORT_SYMBOL(omap_readw); | 160 | EXPORT_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 | } |
165 | EXPORT_SYMBOL(omap_readl); | 169 | EXPORT_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 | } |
174 | EXPORT_SYMBOL(omap_writeb); | 178 | EXPORT_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 | } |
183 | EXPORT_SYMBOL(omap_writew); | 187 | EXPORT_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 | } |
192 | EXPORT_SYMBOL(omap_writel); | 196 | EXPORT_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 | **/ |
828 | void iommu_put(struct iommu *obj) | 829 | void 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 | ||
398 | static inline void sgtable_drain_vmalloc(struct sg_table *sgt) | 398 | static 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 | ||
434 | static inline void sgtable_drain_kmalloc(struct sg_table *sgt) | 432 | static 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 | |||
31 | static int enable_seq_bit; | ||
32 | module_param(enable_seq_bit, bool, 0); | ||
33 | MODULE_PARM_DESC(enable_seq_bit, "Enable sequence bit checking."); | ||
34 | 31 | ||
32 | static struct workqueue_struct *mboxd; | ||
35 | static struct omap_mbox *mboxes; | 33 | static struct omap_mbox *mboxes; |
36 | static DEFINE_RWLOCK(mboxes_lock); | 34 | static DEFINE_RWLOCK(mboxes_lock); |
37 | 35 | ||
38 | /* | 36 | static 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. */ | ||
45 | static 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 | |||
54 | static 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 | |||
65 | static 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 */ |
80 | static inline mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox) | 39 | static 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 */ |
98 | static inline void enable_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) | ||
99 | { | ||
100 | mbox->ops->enable_irq(mbox, irq); | ||
101 | } | ||
102 | static inline void disable_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) | ||
103 | { | ||
104 | mbox->ops->disable_irq(mbox, irq); | ||
105 | } | ||
106 | static inline void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) | 57 | static 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 */ | ||
117 | void omap_mbox_init_seq(struct omap_mbox *mbox) | ||
118 | { | ||
119 | mbox_seq_init(mbox); | ||
120 | } | ||
121 | EXPORT_SYMBOL(omap_mbox_init_seq); | ||
122 | |||
123 | /* | 67 | /* |
124 | * message sender | 68 | * message sender |
125 | */ | 69 | */ |
126 | static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void *arg) | 70 | static 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 | ||
150 | struct omap_msg_tx_data { | ||
151 | mbox_msg_t msg; | ||
152 | void *arg; | ||
153 | }; | ||
154 | 85 | ||
155 | static void omap_msg_tx_end_io(struct request *rq, int error) | 86 | int 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 | ||
161 | int 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 | } |
185 | EXPORT_SYMBOL(omap_mbox_msg_send); | 101 | EXPORT_SYMBOL(omap_mbox_msg_send); |
186 | 102 | ||
187 | static void mbox_tx_work(struct work_struct *work) | 103 | static 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 | */ |
257 | static void mbox_txq_fn(struct request_queue * q) | 156 | static void mbox_txq_fn(struct request_queue *q) |
258 | { | 157 | { |
259 | } | 158 | } |
260 | 159 | ||
261 | static void mbox_rxq_fn(struct request_queue * q) | 160 | static void mbox_rxq_fn(struct request_queue *q) |
262 | { | 161 | { |
263 | } | 162 | } |
264 | 163 | ||
265 | static void __mbox_tx_interrupt(struct omap_mbox *mbox) | 164 | static 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 | ||
272 | static void __mbox_rx_interrupt(struct omap_mbox *mbox) | 171 | static 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); | ||
301 | nomem: | 192 | nomem: |
302 | schedule_work(&mbox->rxq->work); | 193 | queue_work(mboxd, &mbox->rxq->work); |
303 | } | 194 | } |
304 | 195 | ||
305 | static irqreturn_t mbox_interrupt(int irq, void *p) | 196 | static 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 | */ | ||
321 | static ssize_t | ||
322 | omap_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 | |||
339 | static ssize_t | ||
340 | omap_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 | |||
372 | static DEVICE_ATTR(mbox, S_IRUGO | S_IWUSR, omap_mbox_read, omap_mbox_write); | ||
373 | |||
374 | static ssize_t mbox_show(struct class *class, char *buf) | ||
375 | { | ||
376 | return sprintf(buf, "mbox"); | ||
377 | } | ||
378 | |||
379 | static CLASS_ATTR(mbox, S_IRUGO, mbox_show, NULL); | ||
380 | |||
381 | static struct class omap_mbox_class = { | ||
382 | .name = "omap-mailbox", | ||
383 | }; | ||
384 | |||
385 | static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox, | 209 | static 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; |
407 | error: | 235 | error: |
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 | ||
418 | static int omap_mbox_init(struct omap_mbox *mbox) | 246 | static 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 | ||
475 | static struct omap_mbox **find_mboxes(const char *name) | 316 | static 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 | ||
546 | err_find: | 378 | err_find: |
547 | device_remove_file(mbox->dev, &dev_attr_mbox); | ||
548 | err_sysfs: | ||
549 | device_unregister(mbox->dev); | ||
550 | return ret; | 379 | return ret; |
551 | } | 380 | } |
552 | EXPORT_SYMBOL(omap_mbox_register); | 381 | EXPORT_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 | } |
575 | EXPORT_SYMBOL(omap_mbox_unregister); | 402 | EXPORT_SYMBOL(omap_mbox_unregister); |
576 | 403 | ||
577 | static int __init omap_mbox_class_init(void) | 404 | static 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 | } |
412 | module_init(omap_mbox_init); | ||
585 | 413 | ||
586 | static void __exit omap_mbox_class_exit(void) | 414 | static 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 | 418 | module_exit(omap_mbox_exit); | |
592 | subsys_initcall(omap_mbox_class_init); | ||
593 | module_exit(omap_mbox_class_exit); | ||
594 | 419 | ||
595 | MODULE_LICENSE("GPL v2"); | 420 | MODULE_LICENSE("GPL v2"); |
596 | MODULE_DESCRIPTION("omap mailbox: interrupt driven messaging"); | 421 | MODULE_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 | ||
30 | struct omap_mcbsp **mcbsp_ptr; | 33 | struct omap_mcbsp **mcbsp_ptr; |
31 | int omap_mcbsp_count; | 34 | int omap_mcbsp_count, omap_mcbsp_cache_size; |
32 | 35 | ||
33 | void omap_mcbsp_write(void __iomem *io_base, u16 reg, u32 val) | 36 | void 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 | ||
41 | int omap_mcbsp_read(void __iomem *io_base, u16 reg) | 50 | int 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 | ||
65 | void 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) \ | 70 | int 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 | |||
57 | static void omap_mcbsp_dump_reg(u8 id) | 91 | static 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) | |||
167 | void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config) | 199 | void 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 | } |
199 | EXPORT_SYMBOL(omap_mcbsp_config); | 229 | EXPORT_SYMBOL(omap_mcbsp_config); |
200 | 230 | ||
201 | #ifdef CONFIG_ARCH_OMAP34XX | 231 | #ifdef CONFIG_ARCH_OMAP3 |
232 | static 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 | |||
256 | static 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 | |||
274 | static 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 | |||
303 | static 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 | |||
317 | int 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 | } | ||
348 | EXPORT_SYMBOL(omap_st_set_chgain); | ||
349 | |||
350 | int 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 | } | ||
378 | EXPORT_SYMBOL(omap_st_get_chgain); | ||
379 | |||
380 | static 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 | |||
397 | int 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 | } | ||
420 | EXPORT_SYMBOL(omap_st_enable); | ||
421 | |||
422 | static 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 | |||
436 | int 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 | } | ||
460 | EXPORT_SYMBOL(omap_st_disable); | ||
461 | |||
462 | int 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 | } | ||
481 | EXPORT_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); | |||
207 | void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold) | 488 | void 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 | } |
224 | EXPORT_SYMBOL(omap_mcbsp_set_tx_threshold); | 503 | EXPORT_SYMBOL(omap_mcbsp_set_tx_threshold); |
225 | 504 | ||
@@ -231,7 +510,6 @@ EXPORT_SYMBOL(omap_mcbsp_set_tx_threshold); | |||
231 | void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold) | 510 | void 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 | } |
248 | EXPORT_SYMBOL(omap_mcbsp_set_rx_threshold); | 525 | EXPORT_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 |
361 | static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp) {} | 633 | static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp) {} |
362 | static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp) {} | 634 | static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp) {} |
635 | static inline void omap_st_start(struct omap_mcbsp *mcbsp) {} | ||
636 | static 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); | |||
396 | int omap_mcbsp_request(unsigned int id) | 670 | int 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; |
739 | err_free_irq: | ||
740 | free_irq(mcbsp->tx_irq, (void *)mcbsp); | ||
741 | err_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; | ||
754 | err_kfree: | ||
755 | spin_unlock(&mcbsp->lock); | ||
756 | kfree(reg_cache); | ||
757 | |||
758 | return err; | ||
459 | } | 759 | } |
460 | EXPORT_SYMBOL(omap_mcbsp_request); | 760 | EXPORT_SYMBOL(omap_mcbsp_request); |
461 | 761 | ||
462 | void omap_mcbsp_free(unsigned int id) | 762 | void 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 | } |
498 | EXPORT_SYMBOL(omap_mcbsp_free); | 801 | EXPORT_SYMBOL(omap_mcbsp_free); |
499 | 802 | ||
@@ -505,7 +808,6 @@ EXPORT_SYMBOL(omap_mcbsp_free); | |||
505 | void omap_mcbsp_start(unsigned int id, int tx, int rx) | 808 | void 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); | |||
569 | void omap_mcbsp_stop(unsigned int id, int tx, int rx) | 873 | void 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 | } |
613 | EXPORT_SYMBOL(omap_mcbsp_stop); | 918 | EXPORT_SYMBOL(omap_mcbsp_stop); |
614 | 919 | ||
@@ -616,7 +921,6 @@ EXPORT_SYMBOL(omap_mcbsp_stop); | |||
616 | int omap_mcbsp_pollwrite(unsigned int id, u16 buf) | 921 | int 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); | |||
661 | int omap_mcbsp_pollread(unsigned int id, u16 *buf) | 963 | int 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); | |||
708 | void omap_mcbsp_xmit_word(unsigned int id, u32 word) | 1007 | void 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 | } |
729 | EXPORT_SYMBOL(omap_mcbsp_xmit_word); | 1026 | EXPORT_SYMBOL(omap_mcbsp_xmit_word); |
730 | 1027 | ||
731 | u32 omap_mcbsp_recv_word(unsigned int id) | 1028 | u32 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); | |||
757 | int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word) | 1052 | int 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 | } |
1098 | EXPORT_SYMBOL(omap_mcbsp_set_spi_mode); | 1397 | EXPORT_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 | ||
1191 | static DEVICE_ATTR(dma_op_mode, 0644, dma_op_mode_show, dma_op_mode_store); | 1488 | static DEVICE_ATTR(dma_op_mode, 0644, dma_op_mode_show, dma_op_mode_store); |
1192 | 1489 | ||
1490 | static 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 | |||
1509 | static 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 | |||
1540 | out: | ||
1541 | spin_unlock_irq(&mcbsp->lock); | ||
1542 | |||
1543 | return size; | ||
1544 | } | ||
1545 | |||
1546 | static DEVICE_ATTR(st_taps, 0644, st_taps_show, st_taps_store); | ||
1547 | |||
1193 | static const struct attribute *additional_attrs[] = { | 1548 | static 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 | ||
1569 | static const struct attribute *sidetone_attrs[] = { | ||
1570 | &dev_attr_st_taps.attr, | ||
1571 | NULL, | ||
1572 | }; | ||
1573 | |||
1574 | static const struct attribute_group sidetone_attr_group = { | ||
1575 | .attrs = (struct attribute **)sidetone_attrs, | ||
1576 | }; | ||
1577 | |||
1578 | int __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 | |||
1603 | err3: | ||
1604 | iounmap(st_data->io_base_st); | ||
1605 | err2: | ||
1606 | kfree(st_data); | ||
1607 | err1: | ||
1608 | return err; | ||
1609 | |||
1610 | } | ||
1611 | |||
1612 | static 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 | |||
1214 | static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) | 1623 | static 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 | ||
1233 | static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) | 1648 | static 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 |
1239 | static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) {} | 1658 | static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) {} |
1240 | static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) {} | 1659 | static 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 | ||
29 | struct omap_opp *dsp_opps; | 29 | struct omap_opp *dsp_opps; |
30 | struct omap_opp *mpu_opps; | 30 | struct 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 | */ | ||
112 | static 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 | */ |
134 | static int _omap_device_activate(struct omap_device *od, u8 ignore_lat) | 112 | static 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 | */ |
189 | static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat) | 181 | static 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 | */ | ||
447 | int 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 | */ | ||
628 | bool 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 |
400 | void restore_sram_functions(void) | 414 | void 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 | ||
409 | int __init omap34xx_sram_init(void) | 425 | int __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 | ||
732 | void __init omap_usb_init(struct omap_usb_config *pdata) | 746 | void __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); |