diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-16 22:03:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-16 22:03:06 -0400 |
commit | 16d8775700f1815076f879719ce14b33f50a3171 (patch) | |
tree | 8525e6e6f12b6acf7cf2746853cc65549f3dbf4c | |
parent | e34551339a195aa548eaf698523714a8fe7f1984 (diff) | |
parent | 05e34754518b6a90d5c392790c032575fab12d66 (diff) |
Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm: (91 commits)
ARM: 6806/1: irq: introduce entry and exit functions for chained handlers
ARM: 6781/1: Thumb-2: Work around buggy Thumb-2 short branch relocations in gas
ARM: 6747/1: P2V: Thumb2 support
ARM: 6798/1: aout-core: zero thread debug registers in a.out core dump
ARM: 6796/1: Footbridge: Fix I/O mappings for NOMMU mode
ARM: 6784/1: errata: no automatic Store Buffer drain on Cortex-A9
ARM: 6772/1: errata: possible fault MMU translations following an ASID switch
ARM: 6776/1: mach-ux500: activate fix for errata 753970
ARM: 6794/1: SPEAr: Append UL to device address macros.
ARM: 6793/1: SPEAr: Remove unused *_SIZE macros from spear*.h files
ARM: 6792/1: SPEAr: Replace SIZE macro's with SZ_4K macros
ARM: 6791/1: SPEAr3xx: Declare device structures after shirq code
ARM: 6790/1: SPEAr: Clock Framework: Rename usbd clock and align apb_clk entry
ARM: 6789/1: SPEAr3xx: Rename sdio to sdhci
ARM: 6788/1: SPEAr: Include mach/hardware.h instead of mach/spear.h
ARM: 6787/1: SPEAr: Reorder #includes in .h & .c files.
ARM: 6681/1: SPEAr: add debugfs support to clk API
ARM: 6703/1: SPEAr: update clk API support
ARM: 6679/1: SPEAr: make clk API functions more generic
ARM: 6737/1: SPEAr: formalized timer support
...
295 files changed, 7683 insertions, 3388 deletions
diff --git a/Documentation/arm/SH-Mobile/Makefile b/Documentation/arm/SH-Mobile/Makefile new file mode 100644 index 000000000000..8771d832cf8c --- /dev/null +++ b/Documentation/arm/SH-Mobile/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | BIN := vrl4 | ||
2 | |||
3 | .PHONY: all | ||
4 | all: $(BIN) | ||
5 | |||
6 | .PHONY: clean | ||
7 | clean: | ||
8 | rm -f *.o $(BIN) | ||
diff --git a/Documentation/arm/SH-Mobile/vrl4.c b/Documentation/arm/SH-Mobile/vrl4.c new file mode 100644 index 000000000000..e8a191358ad2 --- /dev/null +++ b/Documentation/arm/SH-Mobile/vrl4.c | |||
@@ -0,0 +1,169 @@ | |||
1 | /* | ||
2 | * vrl4 format generator | ||
3 | * | ||
4 | * Copyright (C) 2010 Simon Horman | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | /* | ||
12 | * usage: vrl4 < zImage > out | ||
13 | * dd if=out of=/dev/sdx bs=512 seek=1 # Write the image to sector 1 | ||
14 | * | ||
15 | * Reads a zImage from stdin and writes a vrl4 image to stdout. | ||
16 | * In practice this means writing a padded vrl4 header to stdout followed | ||
17 | * by the zImage. | ||
18 | * | ||
19 | * The padding places the zImage at ALIGN bytes into the output. | ||
20 | * The vrl4 uses ALIGN + START_BASE as the start_address. | ||
21 | * This is where the mask ROM will jump to after verifying the header. | ||
22 | * | ||
23 | * The header sets copy_size to min(sizeof(zImage), MAX_BOOT_PROG_LEN) + ALIGN. | ||
24 | * That is, the mask ROM will load the padded header (ALIGN bytes) | ||
25 | * And then MAX_BOOT_PROG_LEN bytes of the image, or the entire image, | ||
26 | * whichever is smaller. | ||
27 | * | ||
28 | * The zImage is not modified in any way. | ||
29 | */ | ||
30 | |||
31 | #define _BSD_SOURCE | ||
32 | #include <endian.h> | ||
33 | #include <unistd.h> | ||
34 | #include <stdint.h> | ||
35 | #include <stdio.h> | ||
36 | #include <errno.h> | ||
37 | |||
38 | struct hdr { | ||
39 | uint32_t magic1; | ||
40 | uint32_t reserved1; | ||
41 | uint32_t magic2; | ||
42 | uint32_t reserved2; | ||
43 | uint16_t copy_size; | ||
44 | uint16_t boot_options; | ||
45 | uint32_t reserved3; | ||
46 | uint32_t start_address; | ||
47 | uint32_t reserved4; | ||
48 | uint32_t reserved5; | ||
49 | char reserved6[308]; | ||
50 | }; | ||
51 | |||
52 | #define DECLARE_HDR(h) \ | ||
53 | struct hdr (h) = { \ | ||
54 | .magic1 = htole32(0xea000000), \ | ||
55 | .reserved1 = htole32(0x56), \ | ||
56 | .magic2 = htole32(0xe59ff008), \ | ||
57 | .reserved3 = htole16(0x1) } | ||
58 | |||
59 | /* Align to 512 bytes, the MMCIF sector size */ | ||
60 | #define ALIGN_BITS 9 | ||
61 | #define ALIGN (1 << ALIGN_BITS) | ||
62 | |||
63 | #define START_BASE 0xe55b0000 | ||
64 | |||
65 | /* | ||
66 | * With an alignment of 512 the header uses the first sector. | ||
67 | * There is a 128 sector (64kbyte) limit on the data loaded by the mask ROM. | ||
68 | * So there are 127 sectors left for the boot programme. But in practice | ||
69 | * Only a small portion of a zImage is needed, 16 sectors should be more | ||
70 | * than enough. | ||
71 | * | ||
72 | * Note that this sets how much of the zImage is copied by the mask ROM. | ||
73 | * The entire zImage is present after the header and is loaded | ||
74 | * by the code in the boot program (which is the first portion of the zImage). | ||
75 | */ | ||
76 | #define MAX_BOOT_PROG_LEN (16 * 512) | ||
77 | |||
78 | #define ROUND_UP(x) ((x + ALIGN - 1) & ~(ALIGN - 1)) | ||
79 | |||
80 | ssize_t do_read(int fd, void *buf, size_t count) | ||
81 | { | ||
82 | size_t offset = 0; | ||
83 | ssize_t l; | ||
84 | |||
85 | while (offset < count) { | ||
86 | l = read(fd, buf + offset, count - offset); | ||
87 | if (!l) | ||
88 | break; | ||
89 | if (l < 0) { | ||
90 | if (errno == EAGAIN || errno == EWOULDBLOCK) | ||
91 | continue; | ||
92 | perror("read"); | ||
93 | return -1; | ||
94 | } | ||
95 | offset += l; | ||
96 | } | ||
97 | |||
98 | return offset; | ||
99 | } | ||
100 | |||
101 | ssize_t do_write(int fd, const void *buf, size_t count) | ||
102 | { | ||
103 | size_t offset = 0; | ||
104 | ssize_t l; | ||
105 | |||
106 | while (offset < count) { | ||
107 | l = write(fd, buf + offset, count - offset); | ||
108 | if (l < 0) { | ||
109 | if (errno == EAGAIN || errno == EWOULDBLOCK) | ||
110 | continue; | ||
111 | perror("write"); | ||
112 | return -1; | ||
113 | } | ||
114 | offset += l; | ||
115 | } | ||
116 | |||
117 | return offset; | ||
118 | } | ||
119 | |||
120 | ssize_t write_zero(int fd, size_t len) | ||
121 | { | ||
122 | size_t i = len; | ||
123 | |||
124 | while (i--) { | ||
125 | const char x = 0; | ||
126 | if (do_write(fd, &x, 1) < 0) | ||
127 | return -1; | ||
128 | } | ||
129 | |||
130 | return len; | ||
131 | } | ||
132 | |||
133 | int main(void) | ||
134 | { | ||
135 | DECLARE_HDR(hdr); | ||
136 | char boot_program[MAX_BOOT_PROG_LEN]; | ||
137 | size_t aligned_hdr_len, alligned_prog_len; | ||
138 | ssize_t prog_len; | ||
139 | |||
140 | prog_len = do_read(0, boot_program, sizeof(boot_program)); | ||
141 | if (prog_len <= 0) | ||
142 | return -1; | ||
143 | |||
144 | aligned_hdr_len = ROUND_UP(sizeof(hdr)); | ||
145 | hdr.start_address = htole32(START_BASE + aligned_hdr_len); | ||
146 | alligned_prog_len = ROUND_UP(prog_len); | ||
147 | hdr.copy_size = htole16(aligned_hdr_len + alligned_prog_len); | ||
148 | |||
149 | if (do_write(1, &hdr, sizeof(hdr)) < 0) | ||
150 | return -1; | ||
151 | if (write_zero(1, aligned_hdr_len - sizeof(hdr)) < 0) | ||
152 | return -1; | ||
153 | |||
154 | if (do_write(1, boot_program, prog_len) < 0) | ||
155 | return 1; | ||
156 | |||
157 | /* Write out the rest of the kernel */ | ||
158 | while (1) { | ||
159 | prog_len = do_read(0, boot_program, sizeof(boot_program)); | ||
160 | if (prog_len < 0) | ||
161 | return 1; | ||
162 | if (prog_len == 0) | ||
163 | break; | ||
164 | if (do_write(1, boot_program, prog_len) < 0) | ||
165 | return 1; | ||
166 | } | ||
167 | |||
168 | return 0; | ||
169 | } | ||
diff --git a/Documentation/arm/SH-Mobile/zboot-rom-mmcif.txt b/Documentation/arm/SH-Mobile/zboot-rom-mmcif.txt new file mode 100644 index 000000000000..efff8ae2713d --- /dev/null +++ b/Documentation/arm/SH-Mobile/zboot-rom-mmcif.txt | |||
@@ -0,0 +1,29 @@ | |||
1 | ROM-able zImage boot from MMC | ||
2 | ----------------------------- | ||
3 | |||
4 | An ROM-able zImage compiled with ZBOOT_ROM_MMCIF may be written to MMC and | ||
5 | SuperH Mobile ARM will to boot directly from the MMCIF hardware block. | ||
6 | |||
7 | This is achieved by the mask ROM loading the first portion of the image into | ||
8 | MERAM and then jumping to it. This portion contains loader code which | ||
9 | copies the entire image to SDRAM and jumps to it. From there the zImage | ||
10 | boot code proceeds as normal, uncompressing the image into its final | ||
11 | location and then jumping to it. | ||
12 | |||
13 | This code has been tested on an AP4EB board using the developer 1A eMMC | ||
14 | boot mode which is configured using the following jumper settings. | ||
15 | The board used for testing required a patched mask ROM in order for | ||
16 | this mode to function. | ||
17 | |||
18 | 8 7 6 5 4 3 2 1 | ||
19 | x|x|x|x|x| |x| | ||
20 | S4 -+-+-+-+-+-+-+- | ||
21 | | | | | |x| |x on | ||
22 | |||
23 | The zImage must be written to the MMC card at sector 1 (512 bytes) in | ||
24 | vrl4 format. A utility vrl4 is supplied to accomplish this. | ||
25 | |||
26 | e.g. | ||
27 | vrl4 < zImage | dd of=/dev/sdX bs=512 seek=1 | ||
28 | |||
29 | A dual-voltage MMC 4.0 card was used for testing. | ||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 166efa2a19cd..48a0628d93e8 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -7,7 +7,7 @@ config ARM | |||
7 | select HAVE_MEMBLOCK | 7 | select HAVE_MEMBLOCK |
8 | select RTC_LIB | 8 | select RTC_LIB |
9 | select SYS_SUPPORTS_APM_EMULATION | 9 | select SYS_SUPPORTS_APM_EMULATION |
10 | select GENERIC_ATOMIC64 if (!CPU_32v6K || !AEABI) | 10 | select GENERIC_ATOMIC64 if (CPU_V6 || !CPU_32v6K || !AEABI) |
11 | select HAVE_OPROFILE if (HAVE_PERF_EVENTS) | 11 | select HAVE_OPROFILE if (HAVE_PERF_EVENTS) |
12 | select HAVE_ARCH_KGDB | 12 | select HAVE_ARCH_KGDB |
13 | select HAVE_KPROBES if (!XIP_KERNEL && !THUMB2_KERNEL) | 13 | select HAVE_KPROBES if (!XIP_KERNEL && !THUMB2_KERNEL) |
@@ -24,7 +24,7 @@ config ARM | |||
24 | select HAVE_PERF_EVENTS | 24 | select HAVE_PERF_EVENTS |
25 | select PERF_USE_VMALLOC | 25 | select PERF_USE_VMALLOC |
26 | select HAVE_REGS_AND_STACK_ACCESS_API | 26 | select HAVE_REGS_AND_STACK_ACCESS_API |
27 | select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V7)) | 27 | select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7)) |
28 | select HAVE_C_RECORDMCOUNT | 28 | select HAVE_C_RECORDMCOUNT |
29 | select HAVE_GENERIC_HARDIRQS | 29 | select HAVE_GENERIC_HARDIRQS |
30 | select HAVE_SPARSE_IRQ | 30 | select HAVE_SPARSE_IRQ |
@@ -63,6 +63,10 @@ config GENERIC_CLOCKEVENTS_BROADCAST | |||
63 | depends on GENERIC_CLOCKEVENTS | 63 | depends on GENERIC_CLOCKEVENTS |
64 | default y if SMP | 64 | default y if SMP |
65 | 65 | ||
66 | config KTIME_SCALAR | ||
67 | bool | ||
68 | default y | ||
69 | |||
66 | config HAVE_TCM | 70 | config HAVE_TCM |
67 | bool | 71 | bool |
68 | select GENERIC_ALLOCATOR | 72 | select GENERIC_ALLOCATOR |
@@ -178,11 +182,6 @@ config FIQ | |||
178 | config ARCH_MTD_XIP | 182 | config ARCH_MTD_XIP |
179 | bool | 183 | bool |
180 | 184 | ||
181 | config ARM_L1_CACHE_SHIFT_6 | ||
182 | bool | ||
183 | help | ||
184 | Setting ARM L1 cache line size to 64 Bytes. | ||
185 | |||
186 | config VECTORS_BASE | 185 | config VECTORS_BASE |
187 | hex | 186 | hex |
188 | default 0xffff0000 if MMU || CPU_HIGH_VECTOR | 187 | default 0xffff0000 if MMU || CPU_HIGH_VECTOR |
@@ -191,6 +190,22 @@ config VECTORS_BASE | |||
191 | help | 190 | help |
192 | The base address of exception vectors. | 191 | The base address of exception vectors. |
193 | 192 | ||
193 | config ARM_PATCH_PHYS_VIRT | ||
194 | bool "Patch physical to virtual translations at runtime (EXPERIMENTAL)" | ||
195 | depends on EXPERIMENTAL | ||
196 | depends on !XIP_KERNEL && MMU | ||
197 | depends on !ARCH_REALVIEW || !SPARSEMEM | ||
198 | help | ||
199 | Patch phys-to-virt translation functions at runtime according to | ||
200 | the position of the kernel in system memory. | ||
201 | |||
202 | This can only be used with non-XIP with MMU kernels where | ||
203 | the base of physical memory is at a 16MB boundary. | ||
204 | |||
205 | config ARM_PATCH_PHYS_VIRT_16BIT | ||
206 | def_bool y | ||
207 | depends on ARM_PATCH_PHYS_VIRT && ARCH_MSM | ||
208 | |||
194 | source "init/Kconfig" | 209 | source "init/Kconfig" |
195 | 210 | ||
196 | source "kernel/Kconfig.freezer" | 211 | source "kernel/Kconfig.freezer" |
@@ -346,7 +361,7 @@ config ARCH_FOOTBRIDGE | |||
346 | bool "FootBridge" | 361 | bool "FootBridge" |
347 | select CPU_SA110 | 362 | select CPU_SA110 |
348 | select FOOTBRIDGE | 363 | select FOOTBRIDGE |
349 | select ARCH_USES_GETTIMEOFFSET | 364 | select GENERIC_CLOCKEVENTS |
350 | help | 365 | help |
351 | Support for systems based on the DC21285 companion chip | 366 | Support for systems based on the DC21285 companion chip |
352 | ("FootBridge"), such as the Simtec CATS and the Rebel NetWinder. | 367 | ("FootBridge"), such as the Simtec CATS and the Rebel NetWinder. |
@@ -457,6 +472,7 @@ config ARCH_IXP4XX | |||
457 | 472 | ||
458 | config ARCH_DOVE | 473 | config ARCH_DOVE |
459 | bool "Marvell Dove" | 474 | bool "Marvell Dove" |
475 | select CPU_V6K | ||
460 | select PCI | 476 | select PCI |
461 | select ARCH_REQUIRE_GPIOLIB | 477 | select ARCH_REQUIRE_GPIOLIB |
462 | select GENERIC_CLOCKEVENTS | 478 | select GENERIC_CLOCKEVENTS |
@@ -875,6 +891,16 @@ config PLAT_SPEAR | |||
875 | help | 891 | help |
876 | Support for ST's SPEAr platform (SPEAr3xx, SPEAr6xx and SPEAr13xx). | 892 | Support for ST's SPEAr platform (SPEAr3xx, SPEAr6xx and SPEAr13xx). |
877 | 893 | ||
894 | config ARCH_VT8500 | ||
895 | bool "VIA/WonderMedia 85xx" | ||
896 | select CPU_ARM926T | ||
897 | select GENERIC_GPIO | ||
898 | select ARCH_HAS_CPUFREQ | ||
899 | select GENERIC_CLOCKEVENTS | ||
900 | select ARCH_REQUIRE_GPIOLIB | ||
901 | select HAVE_PWM | ||
902 | help | ||
903 | Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip. | ||
878 | endchoice | 904 | endchoice |
879 | 905 | ||
880 | # | 906 | # |
@@ -1007,6 +1033,8 @@ source "arch/arm/mach-versatile/Kconfig" | |||
1007 | 1033 | ||
1008 | source "arch/arm/mach-vexpress/Kconfig" | 1034 | source "arch/arm/mach-vexpress/Kconfig" |
1009 | 1035 | ||
1036 | source "arch/arm/mach-vt8500/Kconfig" | ||
1037 | |||
1010 | source "arch/arm/mach-w90x900/Kconfig" | 1038 | source "arch/arm/mach-w90x900/Kconfig" |
1011 | 1039 | ||
1012 | # Definitions to make life easier | 1040 | # Definitions to make life easier |
@@ -1048,7 +1076,7 @@ config XSCALE_PMU | |||
1048 | default y | 1076 | default y |
1049 | 1077 | ||
1050 | config CPU_HAS_PMU | 1078 | config CPU_HAS_PMU |
1051 | depends on (CPU_V6 || CPU_V7 || XSCALE_PMU) && \ | 1079 | depends on (CPU_V6 || CPU_V6K || CPU_V7 || XSCALE_PMU) && \ |
1052 | (!ARCH_OMAP3 || OMAP3_EMU) | 1080 | (!ARCH_OMAP3 || OMAP3_EMU) |
1053 | default y | 1081 | default y |
1054 | bool | 1082 | bool |
@@ -1064,7 +1092,7 @@ endif | |||
1064 | 1092 | ||
1065 | config ARM_ERRATA_411920 | 1093 | config ARM_ERRATA_411920 |
1066 | bool "ARM errata: Invalidation of the Instruction Cache operation can fail" | 1094 | bool "ARM errata: Invalidation of the Instruction Cache operation can fail" |
1067 | depends on CPU_V6 | 1095 | depends on CPU_V6 || CPU_V6K |
1068 | help | 1096 | help |
1069 | Invalidation of the Instruction Cache operation can | 1097 | Invalidation of the Instruction Cache operation can |
1070 | fail. This erratum is present in 1136 (before r1p4), 1156 and 1176. | 1098 | fail. This erratum is present in 1136 (before r1p4), 1156 and 1176. |
@@ -1140,7 +1168,7 @@ config ARM_ERRATA_742231 | |||
1140 | 1168 | ||
1141 | config PL310_ERRATA_588369 | 1169 | config PL310_ERRATA_588369 |
1142 | bool "Clean & Invalidate maintenance operations do not invalidate clean lines" | 1170 | bool "Clean & Invalidate maintenance operations do not invalidate clean lines" |
1143 | depends on CACHE_L2X0 && ARCH_OMAP4 | 1171 | depends on CACHE_L2X0 |
1144 | help | 1172 | help |
1145 | The PL310 L2 cache controller implements three types of Clean & | 1173 | The PL310 L2 cache controller implements three types of Clean & |
1146 | Invalidate maintenance operations: by Physical Address | 1174 | Invalidate maintenance operations: by Physical Address |
@@ -1149,8 +1177,7 @@ config PL310_ERRATA_588369 | |||
1149 | clean operation followed immediately by an invalidate operation, | 1177 | clean operation followed immediately by an invalidate operation, |
1150 | both performing to the same memory location. This functionality | 1178 | both performing to the same memory location. This functionality |
1151 | is not correctly implemented in PL310 as clean lines are not | 1179 | is not correctly implemented in PL310 as clean lines are not |
1152 | invalidated as a result of these operations. Note that this errata | 1180 | invalidated as a result of these operations. |
1153 | uses Texas Instrument's secure monitor api. | ||
1154 | 1181 | ||
1155 | config ARM_ERRATA_720789 | 1182 | config ARM_ERRATA_720789 |
1156 | bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID" | 1183 | bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID" |
@@ -1164,6 +1191,17 @@ config ARM_ERRATA_720789 | |||
1164 | tables. The workaround changes the TLB flushing routines to invalidate | 1191 | tables. The workaround changes the TLB flushing routines to invalidate |
1165 | entries regardless of the ASID. | 1192 | entries regardless of the ASID. |
1166 | 1193 | ||
1194 | config PL310_ERRATA_727915 | ||
1195 | bool "Background Clean & Invalidate by Way operation can cause data corruption" | ||
1196 | depends on CACHE_L2X0 | ||
1197 | help | ||
1198 | PL310 implements the Clean & Invalidate by Way L2 cache maintenance | ||
1199 | operation (offset 0x7FC). This operation runs in background so that | ||
1200 | PL310 can handle normal accesses while it is in progress. Under very | ||
1201 | rare circumstances, due to this erratum, write data can be lost when | ||
1202 | PL310 treats a cacheable write transaction during a Clean & | ||
1203 | Invalidate by Way operation. | ||
1204 | |||
1167 | config ARM_ERRATA_743622 | 1205 | config ARM_ERRATA_743622 |
1168 | bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption" | 1206 | bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption" |
1169 | depends on CPU_V7 | 1207 | depends on CPU_V7 |
@@ -1202,6 +1240,28 @@ config ARM_ERRATA_753970 | |||
1202 | This has the same effect as the cache sync operation: store buffer | 1240 | This has the same effect as the cache sync operation: store buffer |
1203 | drain and waiting for all buffers empty. | 1241 | drain and waiting for all buffers empty. |
1204 | 1242 | ||
1243 | config ARM_ERRATA_754322 | ||
1244 | bool "ARM errata: possible faulty MMU translations following an ASID switch" | ||
1245 | depends on CPU_V7 | ||
1246 | help | ||
1247 | This option enables the workaround for the 754322 Cortex-A9 (r2p*, | ||
1248 | r3p*) erratum. A speculative memory access may cause a page table walk | ||
1249 | which starts prior to an ASID switch but completes afterwards. This | ||
1250 | can populate the micro-TLB with a stale entry which may be hit with | ||
1251 | the new ASID. This workaround places two dsb instructions in the mm | ||
1252 | switching code so that no page table walks can cross the ASID switch. | ||
1253 | |||
1254 | config ARM_ERRATA_754327 | ||
1255 | bool "ARM errata: no automatic Store Buffer drain" | ||
1256 | depends on CPU_V7 && SMP | ||
1257 | help | ||
1258 | This option enables the workaround for the 754327 Cortex-A9 (prior to | ||
1259 | r2p0) erratum. The Store Buffer does not have any automatic draining | ||
1260 | mechanism and therefore a livelock may occur if an external agent | ||
1261 | continuously polls a memory location waiting to observe an update. | ||
1262 | This workaround defines cpu_relax() as smp_mb(), preventing correctly | ||
1263 | written polling loops from denying visibility of updates to memory. | ||
1264 | |||
1205 | endmenu | 1265 | endmenu |
1206 | 1266 | ||
1207 | source "arch/arm/common/Kconfig" | 1267 | source "arch/arm/common/Kconfig" |
@@ -1275,6 +1335,7 @@ source "kernel/time/Kconfig" | |||
1275 | config SMP | 1335 | config SMP |
1276 | bool "Symmetric Multi-Processing (EXPERIMENTAL)" | 1336 | bool "Symmetric Multi-Processing (EXPERIMENTAL)" |
1277 | depends on EXPERIMENTAL | 1337 | depends on EXPERIMENTAL |
1338 | depends on CPU_V6K || CPU_V7 | ||
1278 | depends on GENERIC_CLOCKEVENTS | 1339 | depends on GENERIC_CLOCKEVENTS |
1279 | depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \ | 1340 | depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \ |
1280 | MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \ | 1341 | MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \ |
@@ -1386,7 +1447,7 @@ config HZ | |||
1386 | 1447 | ||
1387 | config THUMB2_KERNEL | 1448 | config THUMB2_KERNEL |
1388 | bool "Compile the kernel in Thumb-2 mode (EXPERIMENTAL)" | 1449 | bool "Compile the kernel in Thumb-2 mode (EXPERIMENTAL)" |
1389 | depends on CPU_V7 && !CPU_V6 && EXPERIMENTAL | 1450 | depends on CPU_V7 && !CPU_V6 && !CPU_V6K && EXPERIMENTAL |
1390 | select AEABI | 1451 | select AEABI |
1391 | select ARM_ASM_UNIFIED | 1452 | select ARM_ASM_UNIFIED |
1392 | help | 1453 | help |
@@ -1396,6 +1457,37 @@ config THUMB2_KERNEL | |||
1396 | 1457 | ||
1397 | If unsure, say N. | 1458 | If unsure, say N. |
1398 | 1459 | ||
1460 | config THUMB2_AVOID_R_ARM_THM_JUMP11 | ||
1461 | bool "Work around buggy Thumb-2 short branch relocations in gas" | ||
1462 | depends on THUMB2_KERNEL && MODULES | ||
1463 | default y | ||
1464 | help | ||
1465 | Various binutils versions can resolve Thumb-2 branches to | ||
1466 | locally-defined, preemptible global symbols as short-range "b.n" | ||
1467 | branch instructions. | ||
1468 | |||
1469 | This is a problem, because there's no guarantee the final | ||
1470 | destination of the symbol, or any candidate locations for a | ||
1471 | trampoline, are within range of the branch. For this reason, the | ||
1472 | kernel does not support fixing up the R_ARM_THM_JUMP11 (102) | ||
1473 | relocation in modules at all, and it makes little sense to add | ||
1474 | support. | ||
1475 | |||
1476 | The symptom is that the kernel fails with an "unsupported | ||
1477 | relocation" error when loading some modules. | ||
1478 | |||
1479 | Until fixed tools are available, passing | ||
1480 | -fno-optimize-sibling-calls to gcc should prevent gcc generating | ||
1481 | code which hits this problem, at the cost of a bit of extra runtime | ||
1482 | stack usage in some cases. | ||
1483 | |||
1484 | The problem is described in more detail at: | ||
1485 | https://bugs.launchpad.net/binutils-linaro/+bug/725126 | ||
1486 | |||
1487 | Only Thumb-2 kernels are affected. | ||
1488 | |||
1489 | Unless you are sure your tools don't have this problem, say Y. | ||
1490 | |||
1399 | config ARM_ASM_UNIFIED | 1491 | config ARM_ASM_UNIFIED |
1400 | bool | 1492 | bool |
1401 | 1493 | ||
@@ -1644,6 +1736,18 @@ config ZBOOT_ROM | |||
1644 | Say Y here if you intend to execute your compressed kernel image | 1736 | Say Y here if you intend to execute your compressed kernel image |
1645 | (zImage) directly from ROM or flash. If unsure, say N. | 1737 | (zImage) directly from ROM or flash. If unsure, say N. |
1646 | 1738 | ||
1739 | config ZBOOT_ROM_MMCIF | ||
1740 | bool "Include MMCIF loader in zImage (EXPERIMENTAL)" | ||
1741 | depends on ZBOOT_ROM && ARCH_SH7372 && EXPERIMENTAL | ||
1742 | help | ||
1743 | Say Y here to include experimental MMCIF loading code in the | ||
1744 | ROM-able zImage. With this enabled it is possible to write the | ||
1745 | the ROM-able zImage kernel image to an MMC card and boot the | ||
1746 | kernel straight from the reset vector. At reset the processor | ||
1747 | Mask ROM will load the first part of the the ROM-able zImage | ||
1748 | which in turn loads the rest the kernel image to RAM using the | ||
1749 | MMCIF hardware block. | ||
1750 | |||
1647 | config CMDLINE | 1751 | config CMDLINE |
1648 | string "Default kernel command string" | 1752 | string "Default kernel command string" |
1649 | default "" | 1753 | default "" |
@@ -1877,7 +1981,7 @@ config FPE_FASTFPE | |||
1877 | 1981 | ||
1878 | config VFP | 1982 | config VFP |
1879 | bool "VFP-format floating point maths" | 1983 | bool "VFP-format floating point maths" |
1880 | depends on CPU_V6 || CPU_ARM926T || CPU_V7 || CPU_FEROCEON | 1984 | depends on CPU_V6 || CPU_V6K || CPU_ARM926T || CPU_V7 || CPU_FEROCEON |
1881 | help | 1985 | help |
1882 | Say Y to include VFP support code in the kernel. This is needed | 1986 | Say Y to include VFP support code in the kernel. This is needed |
1883 | if your hardware includes a VFP unit. | 1987 | if your hardware includes a VFP unit. |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 6f7b29294c80..1e20c414d5cf 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -89,6 +89,7 @@ tune-$(CONFIG_CPU_XSCALE) :=$(call cc-option,-mtune=xscale,-mtune=strongarm110) | |||
89 | tune-$(CONFIG_CPU_XSC3) :=$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale | 89 | tune-$(CONFIG_CPU_XSC3) :=$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale |
90 | tune-$(CONFIG_CPU_FEROCEON) :=$(call cc-option,-mtune=marvell-f,-mtune=xscale) | 90 | tune-$(CONFIG_CPU_FEROCEON) :=$(call cc-option,-mtune=marvell-f,-mtune=xscale) |
91 | tune-$(CONFIG_CPU_V6) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm) | 91 | tune-$(CONFIG_CPU_V6) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm) |
92 | tune-$(CONFIG_CPU_V6K) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm) | ||
92 | 93 | ||
93 | ifeq ($(CONFIG_AEABI),y) | 94 | ifeq ($(CONFIG_AEABI),y) |
94 | CFLAGS_ABI :=-mabi=aapcs-linux -mno-thumb-interwork | 95 | CFLAGS_ABI :=-mabi=aapcs-linux -mno-thumb-interwork |
@@ -105,6 +106,10 @@ AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=always,-Wa$(comma)-mau | |||
105 | AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W) | 106 | AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W) |
106 | CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN) | 107 | CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN) |
107 | AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb | 108 | AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb |
109 | # Work around buggy relocation from gas if requested: | ||
110 | ifeq ($(CONFIG_THUMB2_AVOID_R_ARM_THM_JUMP11),y) | ||
111 | CFLAGS_MODULE +=-fno-optimize-sibling-calls | ||
112 | endif | ||
108 | endif | 113 | endif |
109 | 114 | ||
110 | # Need -Uarm for gcc < 3.x | 115 | # Need -Uarm for gcc < 3.x |
@@ -190,6 +195,7 @@ machine-$(CONFIG_ARCH_U300) := u300 | |||
190 | machine-$(CONFIG_ARCH_U8500) := ux500 | 195 | machine-$(CONFIG_ARCH_U8500) := ux500 |
191 | machine-$(CONFIG_ARCH_VERSATILE) := versatile | 196 | machine-$(CONFIG_ARCH_VERSATILE) := versatile |
192 | machine-$(CONFIG_ARCH_VEXPRESS) := vexpress | 197 | machine-$(CONFIG_ARCH_VEXPRESS) := vexpress |
198 | machine-$(CONFIG_ARCH_VT8500) := vt8500 | ||
193 | machine-$(CONFIG_ARCH_W90X900) := w90x900 | 199 | machine-$(CONFIG_ARCH_W90X900) := w90x900 |
194 | machine-$(CONFIG_ARCH_NUC93X) := nuc93x | 200 | machine-$(CONFIG_ARCH_NUC93X) := nuc93x |
195 | machine-$(CONFIG_FOOTBRIDGE) := footbridge | 201 | machine-$(CONFIG_FOOTBRIDGE) := footbridge |
@@ -280,7 +286,7 @@ bzImage: zImage | |||
280 | zImage Image xipImage bootpImage uImage: vmlinux | 286 | zImage Image xipImage bootpImage uImage: vmlinux |
281 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ | 287 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ |
282 | 288 | ||
283 | zinstall install: vmlinux | 289 | zinstall uinstall install: vmlinux |
284 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@ | 290 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@ |
285 | 291 | ||
286 | # We use MRPROPER_FILES and CLEAN_FILES now | 292 | # We use MRPROPER_FILES and CLEAN_FILES now |
@@ -301,6 +307,7 @@ define archhelp | |||
301 | echo ' (supply initrd image via make variable INITRD=<path>)' | 307 | echo ' (supply initrd image via make variable INITRD=<path>)' |
302 | echo ' install - Install uncompressed kernel' | 308 | echo ' install - Install uncompressed kernel' |
303 | echo ' zinstall - Install compressed kernel' | 309 | echo ' zinstall - Install compressed kernel' |
310 | echo ' uinstall - Install U-Boot wrapped compressed kernel' | ||
304 | echo ' Install using (your) ~/bin/$(INSTALLKERNEL) or' | 311 | echo ' Install using (your) ~/bin/$(INSTALLKERNEL) or' |
305 | echo ' (distribution) /sbin/$(INSTALLKERNEL) or' | 312 | echo ' (distribution) /sbin/$(INSTALLKERNEL) or' |
306 | echo ' install to $$(INSTALL_PATH) and run lilo' | 313 | echo ' install to $$(INSTALL_PATH) and run lilo' |
diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile index 4d26f2c52a75..9128fddf1109 100644 --- a/arch/arm/boot/Makefile +++ b/arch/arm/boot/Makefile | |||
@@ -99,6 +99,10 @@ zinstall: $(obj)/zImage | |||
99 | $(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \ | 99 | $(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \ |
100 | $(obj)/zImage System.map "$(INSTALL_PATH)" | 100 | $(obj)/zImage System.map "$(INSTALL_PATH)" |
101 | 101 | ||
102 | uinstall: $(obj)/uImage | ||
103 | $(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \ | ||
104 | $(obj)/uImage System.map "$(INSTALL_PATH)" | ||
105 | |||
102 | zi: | 106 | zi: |
103 | $(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \ | 107 | $(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \ |
104 | $(obj)/zImage System.map "$(INSTALL_PATH)" | 108 | $(obj)/zImage System.map "$(INSTALL_PATH)" |
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index 0a8f748e506a..f9f77c65dff3 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile | |||
@@ -4,9 +4,20 @@ | |||
4 | # create a compressed vmlinuz image from the original vmlinux | 4 | # create a compressed vmlinuz image from the original vmlinux |
5 | # | 5 | # |
6 | 6 | ||
7 | OBJS = | ||
8 | |||
9 | # Ensure that mmcif loader code appears early in the image | ||
10 | # to minimise that number of bocks that have to be read in | ||
11 | # order to load it. | ||
12 | ifeq ($(CONFIG_ZBOOT_ROM_MMCIF),y) | ||
13 | ifeq ($(CONFIG_ARCH_SH7372),y) | ||
14 | OBJS += mmcif-sh7372.o | ||
15 | endif | ||
16 | endif | ||
17 | |||
7 | AFLAGS_head.o += -DTEXT_OFFSET=$(TEXT_OFFSET) | 18 | AFLAGS_head.o += -DTEXT_OFFSET=$(TEXT_OFFSET) |
8 | HEAD = head.o | 19 | HEAD = head.o |
9 | OBJS = misc.o decompress.o | 20 | OBJS += misc.o decompress.o |
10 | FONTC = $(srctree)/drivers/video/console/font_acorn_8x8.c | 21 | FONTC = $(srctree)/drivers/video/console/font_acorn_8x8.c |
11 | 22 | ||
12 | # | 23 | # |
@@ -29,6 +40,10 @@ ifeq ($(CONFIG_ARCH_SA1100),y) | |||
29 | OBJS += head-sa1100.o | 40 | OBJS += head-sa1100.o |
30 | endif | 41 | endif |
31 | 42 | ||
43 | ifeq ($(CONFIG_ARCH_VT8500),y) | ||
44 | OBJS += head-vt8500.o | ||
45 | endif | ||
46 | |||
32 | ifeq ($(CONFIG_CPU_XSCALE),y) | 47 | ifeq ($(CONFIG_CPU_XSCALE),y) |
33 | OBJS += head-xscale.o | 48 | OBJS += head-xscale.o |
34 | endif | 49 | endif |
@@ -83,9 +98,11 @@ endif | |||
83 | EXTRA_CFLAGS := -fpic -fno-builtin | 98 | EXTRA_CFLAGS := -fpic -fno-builtin |
84 | EXTRA_AFLAGS := -Wa,-march=all | 99 | EXTRA_AFLAGS := -Wa,-march=all |
85 | 100 | ||
101 | # Provide size of uncompressed kernel to the decompressor via a linker symbol. | ||
102 | LDFLAGS_vmlinux = --defsym _image_size=$(shell stat -c "%s" $(obj)/../Image) | ||
86 | # Supply ZRELADDR to the decompressor via a linker symbol. | 103 | # Supply ZRELADDR to the decompressor via a linker symbol. |
87 | ifneq ($(CONFIG_AUTO_ZRELADDR),y) | 104 | ifneq ($(CONFIG_AUTO_ZRELADDR),y) |
88 | LDFLAGS_vmlinux := --defsym zreladdr=$(ZRELADDR) | 105 | LDFLAGS_vmlinux += --defsym zreladdr=$(ZRELADDR) |
89 | endif | 106 | endif |
90 | ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) | 107 | ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) |
91 | LDFLAGS_vmlinux += --be8 | 108 | LDFLAGS_vmlinux += --be8 |
diff --git a/arch/arm/boot/compressed/head-shmobile.S b/arch/arm/boot/compressed/head-shmobile.S index 30973b76e6ae..c943d2e7da9d 100644 --- a/arch/arm/boot/compressed/head-shmobile.S +++ b/arch/arm/boot/compressed/head-shmobile.S | |||
@@ -25,6 +25,36 @@ | |||
25 | /* load board-specific initialization code */ | 25 | /* load board-specific initialization code */ |
26 | #include <mach/zboot.h> | 26 | #include <mach/zboot.h> |
27 | 27 | ||
28 | #ifdef CONFIG_ZBOOT_ROM_MMCIF | ||
29 | /* Load image from MMC */ | ||
30 | adr sp, __tmp_stack + 128 | ||
31 | ldr r0, __image_start | ||
32 | ldr r1, __image_end | ||
33 | subs r1, r1, r0 | ||
34 | ldr r0, __load_base | ||
35 | bl mmcif_loader | ||
36 | |||
37 | /* Jump to loaded code */ | ||
38 | ldr r0, __loaded | ||
39 | ldr r1, __image_start | ||
40 | sub r0, r0, r1 | ||
41 | ldr r1, __load_base | ||
42 | add pc, r0, r1 | ||
43 | |||
44 | __image_start: | ||
45 | .long _start | ||
46 | __image_end: | ||
47 | .long _got_end | ||
48 | __load_base: | ||
49 | .long CONFIG_MEMORY_START + 0x02000000 @ Load at 32Mb into SDRAM | ||
50 | __loaded: | ||
51 | .long __continue | ||
52 | .align | ||
53 | __tmp_stack: | ||
54 | .space 128 | ||
55 | __continue: | ||
56 | #endif /* CONFIG_ZBOOT_ROM_MMCIF */ | ||
57 | |||
28 | b 1f | 58 | b 1f |
29 | __atags:@ tag #1 | 59 | __atags:@ tag #1 |
30 | .long 12 @ tag->hdr.size = tag_size(tag_core); | 60 | .long 12 @ tag->hdr.size = tag_size(tag_core); |
diff --git a/arch/arm/boot/compressed/head-vt8500.S b/arch/arm/boot/compressed/head-vt8500.S new file mode 100644 index 000000000000..1dc1e21a3be3 --- /dev/null +++ b/arch/arm/boot/compressed/head-vt8500.S | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/boot/compressed/head-vt8500.S | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
5 | * | ||
6 | * VIA VT8500 specific tweaks. This is merged into head.S by the linker. | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #include <linux/linkage.h> | ||
11 | #include <asm/mach-types.h> | ||
12 | |||
13 | .section ".start", "ax" | ||
14 | |||
15 | __VT8500_start: | ||
16 | @ Compare the SCC ID register against a list of known values | ||
17 | ldr r1, .SCCID | ||
18 | ldr r3, [r1] | ||
19 | |||
20 | @ VT8500 override | ||
21 | ldr r4, .VT8500SCC | ||
22 | cmp r3, r4 | ||
23 | ldreq r7, .ID_BV07 | ||
24 | beq .Lendvt8500 | ||
25 | |||
26 | @ WM8505 override | ||
27 | ldr r4, .WM8505SCC | ||
28 | cmp r3, r4 | ||
29 | ldreq r7, .ID_8505 | ||
30 | beq .Lendvt8500 | ||
31 | |||
32 | @ Otherwise, leave the bootloader's machine id untouched | ||
33 | |||
34 | .SCCID: | ||
35 | .word 0xd8120000 | ||
36 | .VT8500SCC: | ||
37 | .word 0x34000102 | ||
38 | .WM8505SCC: | ||
39 | .word 0x34260103 | ||
40 | |||
41 | .ID_BV07: | ||
42 | .word MACH_TYPE_BV07 | ||
43 | .ID_8505: | ||
44 | .word MACH_TYPE_WM8505_7IN_NETBOOK | ||
45 | |||
46 | .Lendvt8500: | ||
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 7193884ed8b0..84ac4d656310 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
@@ -21,7 +21,7 @@ | |||
21 | 21 | ||
22 | #if defined(CONFIG_DEBUG_ICEDCC) | 22 | #if defined(CONFIG_DEBUG_ICEDCC) |
23 | 23 | ||
24 | #ifdef CONFIG_CPU_V6 | 24 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) |
25 | .macro loadsp, rb, tmp | 25 | .macro loadsp, rb, tmp |
26 | .endm | 26 | .endm |
27 | .macro writeb, ch, rb | 27 | .macro writeb, ch, rb |
@@ -128,14 +128,14 @@ wait: mrc p14, 0, pc, c0, c1, 0 | |||
128 | .arm @ Always enter in ARM state | 128 | .arm @ Always enter in ARM state |
129 | start: | 129 | start: |
130 | .type start,#function | 130 | .type start,#function |
131 | THUMB( adr r12, BSYM(1f) ) | 131 | .rept 7 |
132 | THUMB( bx r12 ) | ||
133 | THUMB( .rept 6 ) | ||
134 | ARM( .rept 8 ) | ||
135 | mov r0, r0 | 132 | mov r0, r0 |
136 | .endr | 133 | .endr |
134 | ARM( mov r0, r0 ) | ||
135 | ARM( b 1f ) | ||
136 | THUMB( adr r12, BSYM(1f) ) | ||
137 | THUMB( bx r12 ) | ||
137 | 138 | ||
138 | b 1f | ||
139 | .word 0x016f2818 @ Magic numbers to help the loader | 139 | .word 0x016f2818 @ Magic numbers to help the loader |
140 | .word start @ absolute load/run zImage address | 140 | .word start @ absolute load/run zImage address |
141 | .word _edata @ zImage end address | 141 | .word _edata @ zImage end address |
@@ -174,9 +174,7 @@ not_angel: | |||
174 | */ | 174 | */ |
175 | 175 | ||
176 | .text | 176 | .text |
177 | adr r0, LC0 | 177 | |
178 | ldmia r0, {r1, r2, r3, r5, r6, r11, ip} | ||
179 | ldr sp, [r0, #28] | ||
180 | #ifdef CONFIG_AUTO_ZRELADDR | 178 | #ifdef CONFIG_AUTO_ZRELADDR |
181 | @ determine final kernel image address | 179 | @ determine final kernel image address |
182 | mov r4, pc | 180 | mov r4, pc |
@@ -185,35 +183,108 @@ not_angel: | |||
185 | #else | 183 | #else |
186 | ldr r4, =zreladdr | 184 | ldr r4, =zreladdr |
187 | #endif | 185 | #endif |
188 | subs r0, r0, r1 @ calculate the delta offset | ||
189 | 186 | ||
190 | @ if delta is zero, we are | 187 | bl cache_on |
191 | beq not_relocated @ running at the address we | 188 | |
192 | @ were linked at. | 189 | restart: adr r0, LC0 |
190 | ldmia r0, {r1, r2, r3, r5, r6, r9, r11, r12} | ||
191 | ldr sp, [r0, #32] | ||
192 | |||
193 | /* | ||
194 | * We might be running at a different address. We need | ||
195 | * to fix up various pointers. | ||
196 | */ | ||
197 | sub r0, r0, r1 @ calculate the delta offset | ||
198 | add r5, r5, r0 @ _start | ||
199 | add r6, r6, r0 @ _edata | ||
193 | 200 | ||
201 | #ifndef CONFIG_ZBOOT_ROM | ||
202 | /* malloc space is above the relocated stack (64k max) */ | ||
203 | add sp, sp, r0 | ||
204 | add r10, sp, #0x10000 | ||
205 | #else | ||
194 | /* | 206 | /* |
195 | * We're running at a different address. We need to fix | 207 | * With ZBOOT_ROM the bss/stack is non relocatable, |
196 | * up various pointers: | 208 | * but someone could still run this code from RAM, |
197 | * r5 - zImage base address (_start) | 209 | * in which case our reference is _edata. |
198 | * r6 - size of decompressed image | ||
199 | * r11 - GOT start | ||
200 | * ip - GOT end | ||
201 | */ | 210 | */ |
202 | add r5, r5, r0 | 211 | mov r10, r6 |
212 | #endif | ||
213 | |||
214 | /* | ||
215 | * Check to see if we will overwrite ourselves. | ||
216 | * r4 = final kernel address | ||
217 | * r5 = start of this image | ||
218 | * r9 = size of decompressed image | ||
219 | * r10 = end of this image, including bss/stack/malloc space if non XIP | ||
220 | * We basically want: | ||
221 | * r4 >= r10 -> OK | ||
222 | * r4 + image length <= r5 -> OK | ||
223 | */ | ||
224 | cmp r4, r10 | ||
225 | bhs wont_overwrite | ||
226 | add r10, r4, r9 | ||
227 | cmp r10, r5 | ||
228 | bls wont_overwrite | ||
229 | |||
230 | /* | ||
231 | * Relocate ourselves past the end of the decompressed kernel. | ||
232 | * r5 = start of this image | ||
233 | * r6 = _edata | ||
234 | * r10 = end of the decompressed kernel | ||
235 | * Because we always copy ahead, we need to do it from the end and go | ||
236 | * backward in case the source and destination overlap. | ||
237 | */ | ||
238 | /* Round up to next 256-byte boundary. */ | ||
239 | add r10, r10, #256 | ||
240 | bic r10, r10, #255 | ||
241 | |||
242 | sub r9, r6, r5 @ size to copy | ||
243 | add r9, r9, #31 @ rounded up to a multiple | ||
244 | bic r9, r9, #31 @ ... of 32 bytes | ||
245 | add r6, r9, r5 | ||
246 | add r9, r9, r10 | ||
247 | |||
248 | 1: ldmdb r6!, {r0 - r3, r10 - r12, lr} | ||
249 | cmp r6, r5 | ||
250 | stmdb r9!, {r0 - r3, r10 - r12, lr} | ||
251 | bhi 1b | ||
252 | |||
253 | /* Preserve offset to relocated code. */ | ||
254 | sub r6, r9, r6 | ||
255 | |||
256 | bl cache_clean_flush | ||
257 | |||
258 | adr r0, BSYM(restart) | ||
259 | add r0, r0, r6 | ||
260 | mov pc, r0 | ||
261 | |||
262 | wont_overwrite: | ||
263 | /* | ||
264 | * If delta is zero, we are running at the address we were linked at. | ||
265 | * r0 = delta | ||
266 | * r2 = BSS start | ||
267 | * r3 = BSS end | ||
268 | * r4 = kernel execution address | ||
269 | * r7 = architecture ID | ||
270 | * r8 = atags pointer | ||
271 | * r11 = GOT start | ||
272 | * r12 = GOT end | ||
273 | * sp = stack pointer | ||
274 | */ | ||
275 | teq r0, #0 | ||
276 | beq not_relocated | ||
203 | add r11, r11, r0 | 277 | add r11, r11, r0 |
204 | add ip, ip, r0 | 278 | add r12, r12, r0 |
205 | 279 | ||
206 | #ifndef CONFIG_ZBOOT_ROM | 280 | #ifndef CONFIG_ZBOOT_ROM |
207 | /* | 281 | /* |
208 | * If we're running fully PIC === CONFIG_ZBOOT_ROM = n, | 282 | * If we're running fully PIC === CONFIG_ZBOOT_ROM = n, |
209 | * we need to fix up pointers into the BSS region. | 283 | * we need to fix up pointers into the BSS region. |
210 | * r2 - BSS start | 284 | * Note that the stack pointer has already been fixed up. |
211 | * r3 - BSS end | ||
212 | * sp - stack pointer | ||
213 | */ | 285 | */ |
214 | add r2, r2, r0 | 286 | add r2, r2, r0 |
215 | add r3, r3, r0 | 287 | add r3, r3, r0 |
216 | add sp, sp, r0 | ||
217 | 288 | ||
218 | /* | 289 | /* |
219 | * Relocate all entries in the GOT table. | 290 | * Relocate all entries in the GOT table. |
@@ -221,7 +292,7 @@ not_angel: | |||
221 | 1: ldr r1, [r11, #0] @ relocate entries in the GOT | 292 | 1: ldr r1, [r11, #0] @ relocate entries in the GOT |
222 | add r1, r1, r0 @ table. This fixes up the | 293 | add r1, r1, r0 @ table. This fixes up the |
223 | str r1, [r11], #4 @ C references. | 294 | str r1, [r11], #4 @ C references. |
224 | cmp r11, ip | 295 | cmp r11, r12 |
225 | blo 1b | 296 | blo 1b |
226 | #else | 297 | #else |
227 | 298 | ||
@@ -234,7 +305,7 @@ not_angel: | |||
234 | cmphs r3, r1 @ _end < entry | 305 | cmphs r3, r1 @ _end < entry |
235 | addlo r1, r1, r0 @ table. This fixes up the | 306 | addlo r1, r1, r0 @ table. This fixes up the |
236 | str r1, [r11], #4 @ C references. | 307 | str r1, [r11], #4 @ C references. |
237 | cmp r11, ip | 308 | cmp r11, r12 |
238 | blo 1b | 309 | blo 1b |
239 | #endif | 310 | #endif |
240 | 311 | ||
@@ -246,76 +317,24 @@ not_relocated: mov r0, #0 | |||
246 | cmp r2, r3 | 317 | cmp r2, r3 |
247 | blo 1b | 318 | blo 1b |
248 | 319 | ||
249 | /* | ||
250 | * The C runtime environment should now be setup | ||
251 | * sufficiently. Turn the cache on, set up some | ||
252 | * pointers, and start decompressing. | ||
253 | */ | ||
254 | bl cache_on | ||
255 | |||
256 | mov r1, sp @ malloc space above stack | ||
257 | add r2, sp, #0x10000 @ 64k max | ||
258 | |||
259 | /* | 320 | /* |
260 | * Check to see if we will overwrite ourselves. | 321 | * The C runtime environment should now be setup sufficiently. |
261 | * r4 = final kernel address | 322 | * Set up some pointers, and start decompressing. |
262 | * r5 = start of this image | 323 | * r4 = kernel execution address |
263 | * r6 = size of decompressed image | 324 | * r7 = architecture ID |
264 | * r2 = end of malloc space (and therefore this image) | 325 | * r8 = atags pointer |
265 | * We basically want: | ||
266 | * r4 >= r2 -> OK | ||
267 | * r4 + image length <= r5 -> OK | ||
268 | */ | 326 | */ |
269 | cmp r4, r2 | 327 | mov r0, r4 |
270 | bhs wont_overwrite | 328 | mov r1, sp @ malloc space above stack |
271 | add r0, r4, r6 | 329 | add r2, sp, #0x10000 @ 64k max |
272 | cmp r0, r5 | ||
273 | bls wont_overwrite | ||
274 | |||
275 | mov r5, r2 @ decompress after malloc space | ||
276 | mov r0, r5 | ||
277 | mov r3, r7 | 330 | mov r3, r7 |
278 | bl decompress_kernel | 331 | bl decompress_kernel |
279 | |||
280 | add r0, r0, #127 + 128 @ alignment + stack | ||
281 | bic r0, r0, #127 @ align the kernel length | ||
282 | /* | ||
283 | * r0 = decompressed kernel length | ||
284 | * r1-r3 = unused | ||
285 | * r4 = kernel execution address | ||
286 | * r5 = decompressed kernel start | ||
287 | * r7 = architecture ID | ||
288 | * r8 = atags pointer | ||
289 | * r9-r12,r14 = corrupted | ||
290 | */ | ||
291 | add r1, r5, r0 @ end of decompressed kernel | ||
292 | adr r2, reloc_start | ||
293 | ldr r3, LC1 | ||
294 | add r3, r2, r3 | ||
295 | 1: ldmia r2!, {r9 - r12, r14} @ copy relocation code | ||
296 | stmia r1!, {r9 - r12, r14} | ||
297 | ldmia r2!, {r9 - r12, r14} | ||
298 | stmia r1!, {r9 - r12, r14} | ||
299 | cmp r2, r3 | ||
300 | blo 1b | ||
301 | mov sp, r1 | ||
302 | add sp, sp, #128 @ relocate the stack | ||
303 | |||
304 | bl cache_clean_flush | 332 | bl cache_clean_flush |
305 | ARM( add pc, r5, r0 ) @ call relocation code | 333 | bl cache_off |
306 | THUMB( add r12, r5, r0 ) | 334 | mov r0, #0 @ must be zero |
307 | THUMB( mov pc, r12 ) @ call relocation code | 335 | mov r1, r7 @ restore architecture number |
308 | 336 | mov r2, r8 @ restore atags pointer | |
309 | /* | 337 | mov pc, r4 @ call kernel |
310 | * We're not in danger of overwriting ourselves. Do this the simple way. | ||
311 | * | ||
312 | * r4 = kernel execution address | ||
313 | * r7 = architecture ID | ||
314 | */ | ||
315 | wont_overwrite: mov r0, r4 | ||
316 | mov r3, r7 | ||
317 | bl decompress_kernel | ||
318 | b call_kernel | ||
319 | 338 | ||
320 | .align 2 | 339 | .align 2 |
321 | .type LC0, #object | 340 | .type LC0, #object |
@@ -323,11 +342,11 @@ LC0: .word LC0 @ r1 | |||
323 | .word __bss_start @ r2 | 342 | .word __bss_start @ r2 |
324 | .word _end @ r3 | 343 | .word _end @ r3 |
325 | .word _start @ r5 | 344 | .word _start @ r5 |
326 | .word _image_size @ r6 | 345 | .word _edata @ r6 |
346 | .word _image_size @ r9 | ||
327 | .word _got_start @ r11 | 347 | .word _got_start @ r11 |
328 | .word _got_end @ ip | 348 | .word _got_end @ ip |
329 | .word user_stack_end @ sp | 349 | .word user_stack_end @ sp |
330 | LC1: .word reloc_end - reloc_start | ||
331 | .size LC0, . - LC0 | 350 | .size LC0, . - LC0 |
332 | 351 | ||
333 | #ifdef CONFIG_ARCH_RPC | 352 | #ifdef CONFIG_ARCH_RPC |
@@ -353,7 +372,7 @@ params: ldr r0, =0x10000100 @ params_phys for RPC | |||
353 | * On exit, | 372 | * On exit, |
354 | * r0, r1, r2, r3, r9, r10, r12 corrupted | 373 | * r0, r1, r2, r3, r9, r10, r12 corrupted |
355 | * This routine must preserve: | 374 | * This routine must preserve: |
356 | * r4, r5, r6, r7, r8 | 375 | * r4, r7, r8 |
357 | */ | 376 | */ |
358 | .align 5 | 377 | .align 5 |
359 | cache_on: mov r3, #8 @ cache_on function | 378 | cache_on: mov r3, #8 @ cache_on function |
@@ -551,43 +570,6 @@ __common_mmu_cache_on: | |||
551 | #endif | 570 | #endif |
552 | 571 | ||
553 | /* | 572 | /* |
554 | * All code following this line is relocatable. It is relocated by | ||
555 | * the above code to the end of the decompressed kernel image and | ||
556 | * executed there. During this time, we have no stacks. | ||
557 | * | ||
558 | * r0 = decompressed kernel length | ||
559 | * r1-r3 = unused | ||
560 | * r4 = kernel execution address | ||
561 | * r5 = decompressed kernel start | ||
562 | * r7 = architecture ID | ||
563 | * r8 = atags pointer | ||
564 | * r9-r12,r14 = corrupted | ||
565 | */ | ||
566 | .align 5 | ||
567 | reloc_start: add r9, r5, r0 | ||
568 | sub r9, r9, #128 @ do not copy the stack | ||
569 | debug_reloc_start | ||
570 | mov r1, r4 | ||
571 | 1: | ||
572 | .rept 4 | ||
573 | ldmia r5!, {r0, r2, r3, r10 - r12, r14} @ relocate kernel | ||
574 | stmia r1!, {r0, r2, r3, r10 - r12, r14} | ||
575 | .endr | ||
576 | |||
577 | cmp r5, r9 | ||
578 | blo 1b | ||
579 | mov sp, r1 | ||
580 | add sp, sp, #128 @ relocate the stack | ||
581 | debug_reloc_end | ||
582 | |||
583 | call_kernel: bl cache_clean_flush | ||
584 | bl cache_off | ||
585 | mov r0, #0 @ must be zero | ||
586 | mov r1, r7 @ restore architecture number | ||
587 | mov r2, r8 @ restore atags pointer | ||
588 | mov pc, r4 @ call kernel | ||
589 | |||
590 | /* | ||
591 | * Here follow the relocatable cache support functions for the | 573 | * Here follow the relocatable cache support functions for the |
592 | * various processors. This is a generic hook for locating an | 574 | * various processors. This is a generic hook for locating an |
593 | * entry and jumping to an instruction at the specified offset | 575 | * entry and jumping to an instruction at the specified offset |
@@ -791,7 +773,7 @@ proc_types: | |||
791 | * On exit, | 773 | * On exit, |
792 | * r0, r1, r2, r3, r9, r12 corrupted | 774 | * r0, r1, r2, r3, r9, r12 corrupted |
793 | * This routine must preserve: | 775 | * This routine must preserve: |
794 | * r4, r6, r7 | 776 | * r4, r7, r8 |
795 | */ | 777 | */ |
796 | .align 5 | 778 | .align 5 |
797 | cache_off: mov r3, #12 @ cache_off function | 779 | cache_off: mov r3, #12 @ cache_off function |
@@ -866,7 +848,7 @@ __armv3_mmu_cache_off: | |||
866 | * On exit, | 848 | * On exit, |
867 | * r1, r2, r3, r9, r10, r11, r12 corrupted | 849 | * r1, r2, r3, r9, r10, r11, r12 corrupted |
868 | * This routine must preserve: | 850 | * This routine must preserve: |
869 | * r0, r4, r5, r6, r7 | 851 | * r4, r6, r7, r8 |
870 | */ | 852 | */ |
871 | .align 5 | 853 | .align 5 |
872 | cache_clean_flush: | 854 | cache_clean_flush: |
@@ -1088,7 +1070,6 @@ memdump: mov r12, r0 | |||
1088 | #endif | 1070 | #endif |
1089 | 1071 | ||
1090 | .ltorg | 1072 | .ltorg |
1091 | reloc_end: | ||
1092 | 1073 | ||
1093 | .align | 1074 | .align |
1094 | .section ".stack", "aw", %nobits | 1075 | .section ".stack", "aw", %nobits |
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c index e653a6d3c8d9..4657e877bf8f 100644 --- a/arch/arm/boot/compressed/misc.c +++ b/arch/arm/boot/compressed/misc.c | |||
@@ -36,7 +36,7 @@ extern void error(char *x); | |||
36 | 36 | ||
37 | #ifdef CONFIG_DEBUG_ICEDCC | 37 | #ifdef CONFIG_DEBUG_ICEDCC |
38 | 38 | ||
39 | #ifdef CONFIG_CPU_V6 | 39 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) |
40 | 40 | ||
41 | static void icedcc_putc(int ch) | 41 | static void icedcc_putc(int ch) |
42 | { | 42 | { |
diff --git a/arch/arm/boot/compressed/mmcif-sh7372.c b/arch/arm/boot/compressed/mmcif-sh7372.c new file mode 100644 index 000000000000..e6180af241f6 --- /dev/null +++ b/arch/arm/boot/compressed/mmcif-sh7372.c | |||
@@ -0,0 +1,87 @@ | |||
1 | /* | ||
2 | * sh7372 MMCIF loader | ||
3 | * | ||
4 | * Copyright (C) 2010 Magnus Damm | ||
5 | * Copyright (C) 2010 Simon Horman | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | |||
12 | #include <linux/mmc/sh_mmcif.h> | ||
13 | #include <mach/mmcif.h> | ||
14 | |||
15 | #define MMCIF_BASE (void __iomem *)0xe6bd0000 | ||
16 | |||
17 | #define PORT84CR (void __iomem *)0xe6050054 | ||
18 | #define PORT85CR (void __iomem *)0xe6050055 | ||
19 | #define PORT86CR (void __iomem *)0xe6050056 | ||
20 | #define PORT87CR (void __iomem *)0xe6050057 | ||
21 | #define PORT88CR (void __iomem *)0xe6050058 | ||
22 | #define PORT89CR (void __iomem *)0xe6050059 | ||
23 | #define PORT90CR (void __iomem *)0xe605005a | ||
24 | #define PORT91CR (void __iomem *)0xe605005b | ||
25 | #define PORT92CR (void __iomem *)0xe605005c | ||
26 | #define PORT99CR (void __iomem *)0xe6050063 | ||
27 | |||
28 | #define SMSTPCR3 (void __iomem *)0xe615013c | ||
29 | |||
30 | /* SH7372 specific MMCIF loader | ||
31 | * | ||
32 | * loads the zImage from an MMC card starting from block 1. | ||
33 | * | ||
34 | * The image must be start with a vrl4 header and | ||
35 | * the zImage must start at offset 512 of the image. That is, | ||
36 | * at block 2 (=byte 1024) on the media | ||
37 | * | ||
38 | * Use the following line to write the vrl4 formated zImage | ||
39 | * to an MMC card | ||
40 | * # dd if=vrl4.out of=/dev/sdx bs=512 seek=1 | ||
41 | */ | ||
42 | asmlinkage void mmcif_loader(unsigned char *buf, unsigned long len) | ||
43 | { | ||
44 | mmcif_init_progress(); | ||
45 | mmcif_update_progress(MMCIF_PROGRESS_ENTER); | ||
46 | |||
47 | /* Initialise MMC | ||
48 | * registers: PORT84CR-PORT92CR | ||
49 | * (MMCD0_0-MMCD0_7,MMCCMD0 Control) | ||
50 | * value: 0x04 - select function 4 | ||
51 | */ | ||
52 | __raw_writeb(0x04, PORT84CR); | ||
53 | __raw_writeb(0x04, PORT85CR); | ||
54 | __raw_writeb(0x04, PORT86CR); | ||
55 | __raw_writeb(0x04, PORT87CR); | ||
56 | __raw_writeb(0x04, PORT88CR); | ||
57 | __raw_writeb(0x04, PORT89CR); | ||
58 | __raw_writeb(0x04, PORT90CR); | ||
59 | __raw_writeb(0x04, PORT91CR); | ||
60 | __raw_writeb(0x04, PORT92CR); | ||
61 | |||
62 | /* Initialise MMC | ||
63 | * registers: PORT99CR (MMCCLK0 Control) | ||
64 | * value: 0x10 | 0x04 - enable output | select function 4 | ||
65 | */ | ||
66 | __raw_writeb(0x14, PORT99CR); | ||
67 | |||
68 | /* Enable clock to MMC hardware block */ | ||
69 | __raw_writel(__raw_readl(SMSTPCR3) & ~(1 << 12), SMSTPCR3); | ||
70 | |||
71 | mmcif_update_progress(MMCIF_PROGRESS_INIT); | ||
72 | |||
73 | /* setup MMCIF hardware */ | ||
74 | sh_mmcif_boot_init(MMCIF_BASE); | ||
75 | |||
76 | mmcif_update_progress(MMCIF_PROGRESS_LOAD); | ||
77 | |||
78 | /* load kernel via MMCIF interface */ | ||
79 | sh_mmcif_boot_do_read(MMCIF_BASE, 2, /* Kernel is at block 2 */ | ||
80 | (len + SH_MMCIF_BBS - 1) / SH_MMCIF_BBS, buf); | ||
81 | |||
82 | |||
83 | /* Disable clock to MMC hardware block */ | ||
84 | __raw_writel(__raw_readl(SMSTPCR3) & (1 << 12), SMSTPCR3); | ||
85 | |||
86 | mmcif_update_progress(MMCIF_PROGRESS_DONE); | ||
87 | } | ||
diff --git a/arch/arm/boot/compressed/vmlinux.lds.in b/arch/arm/boot/compressed/vmlinux.lds.in index 366a924019ac..5309909d7282 100644 --- a/arch/arm/boot/compressed/vmlinux.lds.in +++ b/arch/arm/boot/compressed/vmlinux.lds.in | |||
@@ -43,9 +43,6 @@ SECTIONS | |||
43 | 43 | ||
44 | _etext = .; | 44 | _etext = .; |
45 | 45 | ||
46 | /* Assume size of decompressed image is 4x the compressed image */ | ||
47 | _image_size = (_etext - _text) * 4; | ||
48 | |||
49 | _got_start = .; | 46 | _got_start = .; |
50 | .got : { *(.got) } | 47 | .got : { *(.got) } |
51 | _got_end = .; | 48 | _got_end = .; |
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index 224377211151..cb6b041c39d2 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c | |||
@@ -44,6 +44,19 @@ struct gic_chip_data { | |||
44 | void __iomem *cpu_base; | 44 | void __iomem *cpu_base; |
45 | }; | 45 | }; |
46 | 46 | ||
47 | /* | ||
48 | * Supported arch specific GIC irq extension. | ||
49 | * Default make them NULL. | ||
50 | */ | ||
51 | struct irq_chip gic_arch_extn = { | ||
52 | .irq_ack = NULL, | ||
53 | .irq_mask = NULL, | ||
54 | .irq_unmask = NULL, | ||
55 | .irq_retrigger = NULL, | ||
56 | .irq_set_type = NULL, | ||
57 | .irq_set_wake = NULL, | ||
58 | }; | ||
59 | |||
47 | #ifndef MAX_GIC_NR | 60 | #ifndef MAX_GIC_NR |
48 | #define MAX_GIC_NR 1 | 61 | #define MAX_GIC_NR 1 |
49 | #endif | 62 | #endif |
@@ -74,6 +87,8 @@ static inline unsigned int gic_irq(struct irq_data *d) | |||
74 | static void gic_ack_irq(struct irq_data *d) | 87 | static void gic_ack_irq(struct irq_data *d) |
75 | { | 88 | { |
76 | spin_lock(&irq_controller_lock); | 89 | spin_lock(&irq_controller_lock); |
90 | if (gic_arch_extn.irq_ack) | ||
91 | gic_arch_extn.irq_ack(d); | ||
77 | writel(gic_irq(d), gic_cpu_base(d) + GIC_CPU_EOI); | 92 | writel(gic_irq(d), gic_cpu_base(d) + GIC_CPU_EOI); |
78 | spin_unlock(&irq_controller_lock); | 93 | spin_unlock(&irq_controller_lock); |
79 | } | 94 | } |
@@ -84,6 +99,8 @@ static void gic_mask_irq(struct irq_data *d) | |||
84 | 99 | ||
85 | spin_lock(&irq_controller_lock); | 100 | spin_lock(&irq_controller_lock); |
86 | writel(mask, gic_dist_base(d) + GIC_DIST_ENABLE_CLEAR + (gic_irq(d) / 32) * 4); | 101 | writel(mask, gic_dist_base(d) + GIC_DIST_ENABLE_CLEAR + (gic_irq(d) / 32) * 4); |
102 | if (gic_arch_extn.irq_mask) | ||
103 | gic_arch_extn.irq_mask(d); | ||
87 | spin_unlock(&irq_controller_lock); | 104 | spin_unlock(&irq_controller_lock); |
88 | } | 105 | } |
89 | 106 | ||
@@ -92,6 +109,8 @@ static void gic_unmask_irq(struct irq_data *d) | |||
92 | u32 mask = 1 << (d->irq % 32); | 109 | u32 mask = 1 << (d->irq % 32); |
93 | 110 | ||
94 | spin_lock(&irq_controller_lock); | 111 | spin_lock(&irq_controller_lock); |
112 | if (gic_arch_extn.irq_unmask) | ||
113 | gic_arch_extn.irq_unmask(d); | ||
95 | writel(mask, gic_dist_base(d) + GIC_DIST_ENABLE_SET + (gic_irq(d) / 32) * 4); | 114 | writel(mask, gic_dist_base(d) + GIC_DIST_ENABLE_SET + (gic_irq(d) / 32) * 4); |
96 | spin_unlock(&irq_controller_lock); | 115 | spin_unlock(&irq_controller_lock); |
97 | } | 116 | } |
@@ -116,6 +135,9 @@ static int gic_set_type(struct irq_data *d, unsigned int type) | |||
116 | 135 | ||
117 | spin_lock(&irq_controller_lock); | 136 | spin_lock(&irq_controller_lock); |
118 | 137 | ||
138 | if (gic_arch_extn.irq_set_type) | ||
139 | gic_arch_extn.irq_set_type(d, type); | ||
140 | |||
119 | val = readl(base + GIC_DIST_CONFIG + confoff); | 141 | val = readl(base + GIC_DIST_CONFIG + confoff); |
120 | if (type == IRQ_TYPE_LEVEL_HIGH) | 142 | if (type == IRQ_TYPE_LEVEL_HIGH) |
121 | val &= ~confmask; | 143 | val &= ~confmask; |
@@ -141,32 +163,54 @@ static int gic_set_type(struct irq_data *d, unsigned int type) | |||
141 | return 0; | 163 | return 0; |
142 | } | 164 | } |
143 | 165 | ||
166 | static int gic_retrigger(struct irq_data *d) | ||
167 | { | ||
168 | if (gic_arch_extn.irq_retrigger) | ||
169 | return gic_arch_extn.irq_retrigger(d); | ||
170 | |||
171 | return -ENXIO; | ||
172 | } | ||
173 | |||
144 | #ifdef CONFIG_SMP | 174 | #ifdef CONFIG_SMP |
145 | static int | 175 | static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, |
146 | gic_set_cpu(struct irq_data *d, const struct cpumask *mask_val, bool force) | 176 | bool force) |
147 | { | 177 | { |
148 | void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); | 178 | void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); |
149 | unsigned int shift = (d->irq % 4) * 8; | 179 | unsigned int shift = (d->irq % 4) * 8; |
150 | unsigned int cpu = cpumask_first(mask_val); | 180 | unsigned int cpu = cpumask_first(mask_val); |
151 | u32 val; | 181 | u32 val, mask, bit; |
152 | struct irq_desc *desc; | ||
153 | 182 | ||
154 | spin_lock(&irq_controller_lock); | 183 | if (cpu >= 8) |
155 | desc = irq_to_desc(d->irq); | ||
156 | if (desc == NULL) { | ||
157 | spin_unlock(&irq_controller_lock); | ||
158 | return -EINVAL; | 184 | return -EINVAL; |
159 | } | 185 | |
186 | mask = 0xff << shift; | ||
187 | bit = 1 << (cpu + shift); | ||
188 | |||
189 | spin_lock(&irq_controller_lock); | ||
160 | d->node = cpu; | 190 | d->node = cpu; |
161 | val = readl(reg) & ~(0xff << shift); | 191 | val = readl(reg) & ~mask; |
162 | val |= 1 << (cpu + shift); | 192 | writel(val | bit, reg); |
163 | writel(val, reg); | ||
164 | spin_unlock(&irq_controller_lock); | 193 | spin_unlock(&irq_controller_lock); |
165 | 194 | ||
166 | return 0; | 195 | return 0; |
167 | } | 196 | } |
168 | #endif | 197 | #endif |
169 | 198 | ||
199 | #ifdef CONFIG_PM | ||
200 | static int gic_set_wake(struct irq_data *d, unsigned int on) | ||
201 | { | ||
202 | int ret = -ENXIO; | ||
203 | |||
204 | if (gic_arch_extn.irq_set_wake) | ||
205 | ret = gic_arch_extn.irq_set_wake(d, on); | ||
206 | |||
207 | return ret; | ||
208 | } | ||
209 | |||
210 | #else | ||
211 | #define gic_set_wake NULL | ||
212 | #endif | ||
213 | |||
170 | static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) | 214 | static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) |
171 | { | 215 | { |
172 | struct gic_chip_data *chip_data = get_irq_data(irq); | 216 | struct gic_chip_data *chip_data = get_irq_data(irq); |
@@ -202,9 +246,11 @@ static struct irq_chip gic_chip = { | |||
202 | .irq_mask = gic_mask_irq, | 246 | .irq_mask = gic_mask_irq, |
203 | .irq_unmask = gic_unmask_irq, | 247 | .irq_unmask = gic_unmask_irq, |
204 | .irq_set_type = gic_set_type, | 248 | .irq_set_type = gic_set_type, |
249 | .irq_retrigger = gic_retrigger, | ||
205 | #ifdef CONFIG_SMP | 250 | #ifdef CONFIG_SMP |
206 | .irq_set_affinity = gic_set_cpu, | 251 | .irq_set_affinity = gic_set_affinity, |
207 | #endif | 252 | #endif |
253 | .irq_set_wake = gic_set_wake, | ||
208 | }; | 254 | }; |
209 | 255 | ||
210 | void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq) | 256 | void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq) |
diff --git a/arch/arm/include/asm/a.out-core.h b/arch/arm/include/asm/a.out-core.h index 93d04acaa31f..92f10cb5c70c 100644 --- a/arch/arm/include/asm/a.out-core.h +++ b/arch/arm/include/asm/a.out-core.h | |||
@@ -32,11 +32,7 @@ static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump) | |||
32 | dump->u_dsize = (tsk->mm->brk - tsk->mm->start_data + PAGE_SIZE - 1) >> PAGE_SHIFT; | 32 | dump->u_dsize = (tsk->mm->brk - tsk->mm->start_data + PAGE_SIZE - 1) >> PAGE_SHIFT; |
33 | dump->u_ssize = 0; | 33 | dump->u_ssize = 0; |
34 | 34 | ||
35 | dump->u_debugreg[0] = tsk->thread.debug.bp[0].address; | 35 | memset(dump->u_debugreg, 0, sizeof(dump->u_debugreg)); |
36 | dump->u_debugreg[1] = tsk->thread.debug.bp[1].address; | ||
37 | dump->u_debugreg[2] = tsk->thread.debug.bp[0].insn.arm; | ||
38 | dump->u_debugreg[3] = tsk->thread.debug.bp[1].insn.arm; | ||
39 | dump->u_debugreg[4] = tsk->thread.debug.nsaved; | ||
40 | 36 | ||
41 | if (dump->start_stack < 0x04000000) | 37 | if (dump->start_stack < 0x04000000) |
42 | dump->u_ssize = (0x04000000 - dump->start_stack) >> PAGE_SHIFT; | 38 | dump->u_ssize = (0x04000000 - dump->start_stack) >> PAGE_SHIFT; |
diff --git a/arch/arm/include/asm/bitops.h b/arch/arm/include/asm/bitops.h index 7b1bb2bbaf88..af54ed102f5f 100644 --- a/arch/arm/include/asm/bitops.h +++ b/arch/arm/include/asm/bitops.h | |||
@@ -149,14 +149,18 @@ ____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p) | |||
149 | */ | 149 | */ |
150 | 150 | ||
151 | /* | 151 | /* |
152 | * Native endian assembly bitops. nr = 0 -> word 0 bit 0. | ||
153 | */ | ||
154 | extern void _set_bit(int nr, volatile unsigned long * p); | ||
155 | extern void _clear_bit(int nr, volatile unsigned long * p); | ||
156 | extern void _change_bit(int nr, volatile unsigned long * p); | ||
157 | extern int _test_and_set_bit(int nr, volatile unsigned long * p); | ||
158 | extern int _test_and_clear_bit(int nr, volatile unsigned long * p); | ||
159 | extern int _test_and_change_bit(int nr, volatile unsigned long * p); | ||
160 | |||
161 | /* | ||
152 | * Little endian assembly bitops. nr = 0 -> byte 0 bit 0. | 162 | * Little endian assembly bitops. nr = 0 -> byte 0 bit 0. |
153 | */ | 163 | */ |
154 | extern void _set_bit_le(int nr, volatile unsigned long * p); | ||
155 | extern void _clear_bit_le(int nr, volatile unsigned long * p); | ||
156 | extern void _change_bit_le(int nr, volatile unsigned long * p); | ||
157 | extern int _test_and_set_bit_le(int nr, volatile unsigned long * p); | ||
158 | extern int _test_and_clear_bit_le(int nr, volatile unsigned long * p); | ||
159 | extern int _test_and_change_bit_le(int nr, volatile unsigned long * p); | ||
160 | extern int _find_first_zero_bit_le(const void * p, unsigned size); | 164 | extern int _find_first_zero_bit_le(const void * p, unsigned size); |
161 | extern int _find_next_zero_bit_le(const void * p, int size, int offset); | 165 | extern int _find_next_zero_bit_le(const void * p, int size, int offset); |
162 | extern int _find_first_bit_le(const unsigned long *p, unsigned size); | 166 | extern int _find_first_bit_le(const unsigned long *p, unsigned size); |
@@ -165,12 +169,6 @@ extern int _find_next_bit_le(const unsigned long *p, int size, int offset); | |||
165 | /* | 169 | /* |
166 | * Big endian assembly bitops. nr = 0 -> byte 3 bit 0. | 170 | * Big endian assembly bitops. nr = 0 -> byte 3 bit 0. |
167 | */ | 171 | */ |
168 | extern void _set_bit_be(int nr, volatile unsigned long * p); | ||
169 | extern void _clear_bit_be(int nr, volatile unsigned long * p); | ||
170 | extern void _change_bit_be(int nr, volatile unsigned long * p); | ||
171 | extern int _test_and_set_bit_be(int nr, volatile unsigned long * p); | ||
172 | extern int _test_and_clear_bit_be(int nr, volatile unsigned long * p); | ||
173 | extern int _test_and_change_bit_be(int nr, volatile unsigned long * p); | ||
174 | extern int _find_first_zero_bit_be(const void * p, unsigned size); | 172 | extern int _find_first_zero_bit_be(const void * p, unsigned size); |
175 | extern int _find_next_zero_bit_be(const void * p, int size, int offset); | 173 | extern int _find_next_zero_bit_be(const void * p, int size, int offset); |
176 | extern int _find_first_bit_be(const unsigned long *p, unsigned size); | 174 | extern int _find_first_bit_be(const unsigned long *p, unsigned size); |
@@ -180,33 +178,26 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
180 | /* | 178 | /* |
181 | * The __* form of bitops are non-atomic and may be reordered. | 179 | * The __* form of bitops are non-atomic and may be reordered. |
182 | */ | 180 | */ |
183 | #define ATOMIC_BITOP_LE(name,nr,p) \ | 181 | #define ATOMIC_BITOP(name,nr,p) \ |
184 | (__builtin_constant_p(nr) ? \ | 182 | (__builtin_constant_p(nr) ? ____atomic_##name(nr, p) : _##name(nr,p)) |
185 | ____atomic_##name(nr, p) : \ | ||
186 | _##name##_le(nr,p)) | ||
187 | |||
188 | #define ATOMIC_BITOP_BE(name,nr,p) \ | ||
189 | (__builtin_constant_p(nr) ? \ | ||
190 | ____atomic_##name(nr, p) : \ | ||
191 | _##name##_be(nr,p)) | ||
192 | #else | 183 | #else |
193 | #define ATOMIC_BITOP_LE(name,nr,p) _##name##_le(nr,p) | 184 | #define ATOMIC_BITOP(name,nr,p) _##name(nr,p) |
194 | #define ATOMIC_BITOP_BE(name,nr,p) _##name##_be(nr,p) | ||
195 | #endif | 185 | #endif |
196 | 186 | ||
197 | #define NONATOMIC_BITOP(name,nr,p) \ | 187 | /* |
198 | (____nonatomic_##name(nr, p)) | 188 | * Native endian atomic definitions. |
189 | */ | ||
190 | #define set_bit(nr,p) ATOMIC_BITOP(set_bit,nr,p) | ||
191 | #define clear_bit(nr,p) ATOMIC_BITOP(clear_bit,nr,p) | ||
192 | #define change_bit(nr,p) ATOMIC_BITOP(change_bit,nr,p) | ||
193 | #define test_and_set_bit(nr,p) ATOMIC_BITOP(test_and_set_bit,nr,p) | ||
194 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP(test_and_clear_bit,nr,p) | ||
195 | #define test_and_change_bit(nr,p) ATOMIC_BITOP(test_and_change_bit,nr,p) | ||
199 | 196 | ||
200 | #ifndef __ARMEB__ | 197 | #ifndef __ARMEB__ |
201 | /* | 198 | /* |
202 | * These are the little endian, atomic definitions. | 199 | * These are the little endian, atomic definitions. |
203 | */ | 200 | */ |
204 | #define set_bit(nr,p) ATOMIC_BITOP_LE(set_bit,nr,p) | ||
205 | #define clear_bit(nr,p) ATOMIC_BITOP_LE(clear_bit,nr,p) | ||
206 | #define change_bit(nr,p) ATOMIC_BITOP_LE(change_bit,nr,p) | ||
207 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p) | ||
208 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p) | ||
209 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p) | ||
210 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) | 201 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) |
211 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) | 202 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) |
212 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) | 203 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) |
@@ -215,16 +206,9 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
215 | #define WORD_BITOFF_TO_LE(x) ((x)) | 206 | #define WORD_BITOFF_TO_LE(x) ((x)) |
216 | 207 | ||
217 | #else | 208 | #else |
218 | |||
219 | /* | 209 | /* |
220 | * These are the big endian, atomic definitions. | 210 | * These are the big endian, atomic definitions. |
221 | */ | 211 | */ |
222 | #define set_bit(nr,p) ATOMIC_BITOP_BE(set_bit,nr,p) | ||
223 | #define clear_bit(nr,p) ATOMIC_BITOP_BE(clear_bit,nr,p) | ||
224 | #define change_bit(nr,p) ATOMIC_BITOP_BE(change_bit,nr,p) | ||
225 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p) | ||
226 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p) | ||
227 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p) | ||
228 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz) | 212 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz) |
229 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off) | 213 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off) |
230 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) | 214 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) |
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index 3acd8fa25e34..d5d8d5c72682 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h | |||
@@ -12,7 +12,7 @@ | |||
12 | 12 | ||
13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
14 | 14 | ||
15 | #include <asm/glue.h> | 15 | #include <asm/glue-cache.h> |
16 | #include <asm/shmparam.h> | 16 | #include <asm/shmparam.h> |
17 | #include <asm/cachetype.h> | 17 | #include <asm/cachetype.h> |
18 | #include <asm/outercache.h> | 18 | #include <asm/outercache.h> |
@@ -20,123 +20,6 @@ | |||
20 | #define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT) | 20 | #define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT) |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * Cache Model | ||
24 | * =========== | ||
25 | */ | ||
26 | #undef _CACHE | ||
27 | #undef MULTI_CACHE | ||
28 | |||
29 | #if defined(CONFIG_CPU_CACHE_V3) | ||
30 | # ifdef _CACHE | ||
31 | # define MULTI_CACHE 1 | ||
32 | # else | ||
33 | # define _CACHE v3 | ||
34 | # endif | ||
35 | #endif | ||
36 | |||
37 | #if defined(CONFIG_CPU_CACHE_V4) | ||
38 | # ifdef _CACHE | ||
39 | # define MULTI_CACHE 1 | ||
40 | # else | ||
41 | # define _CACHE v4 | ||
42 | # endif | ||
43 | #endif | ||
44 | |||
45 | #if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \ | ||
46 | defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) || \ | ||
47 | defined(CONFIG_CPU_ARM1026) | ||
48 | # define MULTI_CACHE 1 | ||
49 | #endif | ||
50 | |||
51 | #if defined(CONFIG_CPU_FA526) | ||
52 | # ifdef _CACHE | ||
53 | # define MULTI_CACHE 1 | ||
54 | # else | ||
55 | # define _CACHE fa | ||
56 | # endif | ||
57 | #endif | ||
58 | |||
59 | #if defined(CONFIG_CPU_ARM926T) | ||
60 | # ifdef _CACHE | ||
61 | # define MULTI_CACHE 1 | ||
62 | # else | ||
63 | # define _CACHE arm926 | ||
64 | # endif | ||
65 | #endif | ||
66 | |||
67 | #if defined(CONFIG_CPU_ARM940T) | ||
68 | # ifdef _CACHE | ||
69 | # define MULTI_CACHE 1 | ||
70 | # else | ||
71 | # define _CACHE arm940 | ||
72 | # endif | ||
73 | #endif | ||
74 | |||
75 | #if defined(CONFIG_CPU_ARM946E) | ||
76 | # ifdef _CACHE | ||
77 | # define MULTI_CACHE 1 | ||
78 | # else | ||
79 | # define _CACHE arm946 | ||
80 | # endif | ||
81 | #endif | ||
82 | |||
83 | #if defined(CONFIG_CPU_CACHE_V4WB) | ||
84 | # ifdef _CACHE | ||
85 | # define MULTI_CACHE 1 | ||
86 | # else | ||
87 | # define _CACHE v4wb | ||
88 | # endif | ||
89 | #endif | ||
90 | |||
91 | #if defined(CONFIG_CPU_XSCALE) | ||
92 | # ifdef _CACHE | ||
93 | # define MULTI_CACHE 1 | ||
94 | # else | ||
95 | # define _CACHE xscale | ||
96 | # endif | ||
97 | #endif | ||
98 | |||
99 | #if defined(CONFIG_CPU_XSC3) | ||
100 | # ifdef _CACHE | ||
101 | # define MULTI_CACHE 1 | ||
102 | # else | ||
103 | # define _CACHE xsc3 | ||
104 | # endif | ||
105 | #endif | ||
106 | |||
107 | #if defined(CONFIG_CPU_MOHAWK) | ||
108 | # ifdef _CACHE | ||
109 | # define MULTI_CACHE 1 | ||
110 | # else | ||
111 | # define _CACHE mohawk | ||
112 | # endif | ||
113 | #endif | ||
114 | |||
115 | #if defined(CONFIG_CPU_FEROCEON) | ||
116 | # define MULTI_CACHE 1 | ||
117 | #endif | ||
118 | |||
119 | #if defined(CONFIG_CPU_V6) | ||
120 | //# ifdef _CACHE | ||
121 | # define MULTI_CACHE 1 | ||
122 | //# else | ||
123 | //# define _CACHE v6 | ||
124 | //# endif | ||
125 | #endif | ||
126 | |||
127 | #if defined(CONFIG_CPU_V7) | ||
128 | //# ifdef _CACHE | ||
129 | # define MULTI_CACHE 1 | ||
130 | //# else | ||
131 | //# define _CACHE v7 | ||
132 | //# endif | ||
133 | #endif | ||
134 | |||
135 | #if !defined(_CACHE) && !defined(MULTI_CACHE) | ||
136 | #error Unknown cache maintainence model | ||
137 | #endif | ||
138 | |||
139 | /* | ||
140 | * This flag is used to indicate that the page pointed to by a pte is clean | 23 | * This flag is used to indicate that the page pointed to by a pte is clean |
141 | * and does not require cleaning before returning it to the user. | 24 | * and does not require cleaning before returning it to the user. |
142 | */ | 25 | */ |
@@ -249,19 +132,11 @@ extern struct cpu_cache_fns cpu_cache; | |||
249 | * visible to the CPU. | 132 | * visible to the CPU. |
250 | */ | 133 | */ |
251 | #define dmac_map_area cpu_cache.dma_map_area | 134 | #define dmac_map_area cpu_cache.dma_map_area |
252 | #define dmac_unmap_area cpu_cache.dma_unmap_area | 135 | #define dmac_unmap_area cpu_cache.dma_unmap_area |
253 | #define dmac_flush_range cpu_cache.dma_flush_range | 136 | #define dmac_flush_range cpu_cache.dma_flush_range |
254 | 137 | ||
255 | #else | 138 | #else |
256 | 139 | ||
257 | #define __cpuc_flush_icache_all __glue(_CACHE,_flush_icache_all) | ||
258 | #define __cpuc_flush_kern_all __glue(_CACHE,_flush_kern_cache_all) | ||
259 | #define __cpuc_flush_user_all __glue(_CACHE,_flush_user_cache_all) | ||
260 | #define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range) | ||
261 | #define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range) | ||
262 | #define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range) | ||
263 | #define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area) | ||
264 | |||
265 | extern void __cpuc_flush_icache_all(void); | 140 | extern void __cpuc_flush_icache_all(void); |
266 | extern void __cpuc_flush_kern_all(void); | 141 | extern void __cpuc_flush_kern_all(void); |
267 | extern void __cpuc_flush_user_all(void); | 142 | extern void __cpuc_flush_user_all(void); |
@@ -276,10 +151,6 @@ extern void __cpuc_flush_dcache_area(void *, size_t); | |||
276 | * is visible to DMA, or data written by DMA to system memory is | 151 | * is visible to DMA, or data written by DMA to system memory is |
277 | * visible to the CPU. | 152 | * visible to the CPU. |
278 | */ | 153 | */ |
279 | #define dmac_map_area __glue(_CACHE,_dma_map_area) | ||
280 | #define dmac_unmap_area __glue(_CACHE,_dma_unmap_area) | ||
281 | #define dmac_flush_range __glue(_CACHE,_dma_flush_range) | ||
282 | |||
283 | extern void dmac_map_area(const void *, size_t, int); | 154 | extern void dmac_map_area(const void *, size_t, int); |
284 | extern void dmac_unmap_area(const void *, size_t, int); | 155 | extern void dmac_unmap_area(const void *, size_t, int); |
285 | extern void dmac_flush_range(const void *, const void *); | 156 | extern void dmac_flush_range(const void *, const void *); |
@@ -316,7 +187,8 @@ extern void copy_to_user_page(struct vm_area_struct *, struct page *, | |||
316 | * Optimized __flush_icache_all for the common cases. Note that UP ARMv7 | 187 | * Optimized __flush_icache_all for the common cases. Note that UP ARMv7 |
317 | * will fall through to use __flush_icache_all_generic. | 188 | * will fall through to use __flush_icache_all_generic. |
318 | */ | 189 | */ |
319 | #if (defined(CONFIG_CPU_V7) && defined(CONFIG_CPU_V6)) || \ | 190 | #if (defined(CONFIG_CPU_V7) && \ |
191 | (defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K))) || \ | ||
320 | defined(CONFIG_SMP_ON_UP) | 192 | defined(CONFIG_SMP_ON_UP) |
321 | #define __flush_icache_preferred __cpuc_flush_icache_all | 193 | #define __flush_icache_preferred __cpuc_flush_icache_all |
322 | #elif __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP) | 194 | #elif __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP) |
diff --git a/arch/arm/include/asm/cpu-multi32.h b/arch/arm/include/asm/cpu-multi32.h deleted file mode 100644 index e2b5b0b2116a..000000000000 --- a/arch/arm/include/asm/cpu-multi32.h +++ /dev/null | |||
@@ -1,69 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/cpu-multi32.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 version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #include <asm/page.h> | ||
11 | |||
12 | struct mm_struct; | ||
13 | |||
14 | /* | ||
15 | * Don't change this structure - ASM code | ||
16 | * relies on it. | ||
17 | */ | ||
18 | extern struct processor { | ||
19 | /* MISC | ||
20 | * get data abort address/flags | ||
21 | */ | ||
22 | void (*_data_abort)(unsigned long pc); | ||
23 | /* | ||
24 | * Retrieve prefetch fault address | ||
25 | */ | ||
26 | unsigned long (*_prefetch_abort)(unsigned long lr); | ||
27 | /* | ||
28 | * Set up any processor specifics | ||
29 | */ | ||
30 | void (*_proc_init)(void); | ||
31 | /* | ||
32 | * Disable any processor specifics | ||
33 | */ | ||
34 | void (*_proc_fin)(void); | ||
35 | /* | ||
36 | * Special stuff for a reset | ||
37 | */ | ||
38 | void (*reset)(unsigned long addr) __attribute__((noreturn)); | ||
39 | /* | ||
40 | * Idle the processor | ||
41 | */ | ||
42 | int (*_do_idle)(void); | ||
43 | /* | ||
44 | * Processor architecture specific | ||
45 | */ | ||
46 | /* | ||
47 | * clean a virtual address range from the | ||
48 | * D-cache without flushing the cache. | ||
49 | */ | ||
50 | void (*dcache_clean_area)(void *addr, int size); | ||
51 | |||
52 | /* | ||
53 | * Set the page table | ||
54 | */ | ||
55 | void (*switch_mm)(unsigned long pgd_phys, struct mm_struct *mm); | ||
56 | /* | ||
57 | * Set a possibly extended PTE. Non-extended PTEs should | ||
58 | * ignore 'ext'. | ||
59 | */ | ||
60 | void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext); | ||
61 | } processor; | ||
62 | |||
63 | #define cpu_proc_init() processor._proc_init() | ||
64 | #define cpu_proc_fin() processor._proc_fin() | ||
65 | #define cpu_reset(addr) processor.reset(addr) | ||
66 | #define cpu_do_idle() processor._do_idle() | ||
67 | #define cpu_dcache_clean_area(addr,sz) processor.dcache_clean_area(addr,sz) | ||
68 | #define cpu_set_pte_ext(ptep,pte,ext) processor.set_pte_ext(ptep,pte,ext) | ||
69 | #define cpu_do_switch_mm(pgd,mm) processor.switch_mm(pgd,mm) | ||
diff --git a/arch/arm/include/asm/cpu-single.h b/arch/arm/include/asm/cpu-single.h deleted file mode 100644 index f073a6d2a406..000000000000 --- a/arch/arm/include/asm/cpu-single.h +++ /dev/null | |||
@@ -1,44 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/cpu-single.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 version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | /* | ||
11 | * Single CPU | ||
12 | */ | ||
13 | #ifdef __STDC__ | ||
14 | #define __catify_fn(name,x) name##x | ||
15 | #else | ||
16 | #define __catify_fn(name,x) name/**/x | ||
17 | #endif | ||
18 | #define __cpu_fn(name,x) __catify_fn(name,x) | ||
19 | |||
20 | /* | ||
21 | * If we are supporting multiple CPUs, then we must use a table of | ||
22 | * function pointers for this lot. Otherwise, we can optimise the | ||
23 | * table away. | ||
24 | */ | ||
25 | #define cpu_proc_init __cpu_fn(CPU_NAME,_proc_init) | ||
26 | #define cpu_proc_fin __cpu_fn(CPU_NAME,_proc_fin) | ||
27 | #define cpu_reset __cpu_fn(CPU_NAME,_reset) | ||
28 | #define cpu_do_idle __cpu_fn(CPU_NAME,_do_idle) | ||
29 | #define cpu_dcache_clean_area __cpu_fn(CPU_NAME,_dcache_clean_area) | ||
30 | #define cpu_do_switch_mm __cpu_fn(CPU_NAME,_switch_mm) | ||
31 | #define cpu_set_pte_ext __cpu_fn(CPU_NAME,_set_pte_ext) | ||
32 | |||
33 | #include <asm/page.h> | ||
34 | |||
35 | struct mm_struct; | ||
36 | |||
37 | /* declare all the functions as extern */ | ||
38 | extern void cpu_proc_init(void); | ||
39 | extern void cpu_proc_fin(void); | ||
40 | extern int cpu_do_idle(void); | ||
41 | extern void cpu_dcache_clean_area(void *, int); | ||
42 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); | ||
43 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext); | ||
44 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); | ||
diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.h index 20ae96cc0020..ed5bc9e05a4e 100644 --- a/arch/arm/include/asm/cputype.h +++ b/arch/arm/include/asm/cputype.h | |||
@@ -23,6 +23,8 @@ | |||
23 | #define CPUID_EXT_ISAR4 "c2, 4" | 23 | #define CPUID_EXT_ISAR4 "c2, 4" |
24 | #define CPUID_EXT_ISAR5 "c2, 5" | 24 | #define CPUID_EXT_ISAR5 "c2, 5" |
25 | 25 | ||
26 | extern unsigned int processor_id; | ||
27 | |||
26 | #ifdef CONFIG_CPU_CP15 | 28 | #ifdef CONFIG_CPU_CP15 |
27 | #define read_cpuid(reg) \ | 29 | #define read_cpuid(reg) \ |
28 | ({ \ | 30 | ({ \ |
@@ -43,7 +45,6 @@ | |||
43 | __val; \ | 45 | __val; \ |
44 | }) | 46 | }) |
45 | #else | 47 | #else |
46 | extern unsigned int processor_id; | ||
47 | #define read_cpuid(reg) (processor_id) | 48 | #define read_cpuid(reg) (processor_id) |
48 | #define read_cpuid_ext(reg) 0 | 49 | #define read_cpuid_ext(reg) 0 |
49 | #endif | 50 | #endif |
diff --git a/arch/arm/include/asm/fncpy.h b/arch/arm/include/asm/fncpy.h new file mode 100644 index 000000000000..de5354746924 --- /dev/null +++ b/arch/arm/include/asm/fncpy.h | |||
@@ -0,0 +1,94 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/fncpy.h - helper macros for function body copying | ||
3 | * | ||
4 | * Copyright (C) 2011 Linaro Limited | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | */ | ||
19 | |||
20 | /* | ||
21 | * These macros are intended for use when there is a need to copy a low-level | ||
22 | * function body into special memory. | ||
23 | * | ||
24 | * For example, when reconfiguring the SDRAM controller, the code doing the | ||
25 | * reconfiguration may need to run from SRAM. | ||
26 | * | ||
27 | * NOTE: that the copied function body must be entirely self-contained and | ||
28 | * position-independent in order for this to work properly. | ||
29 | * | ||
30 | * NOTE: in order for embedded literals and data to get referenced correctly, | ||
31 | * the alignment of functions must be preserved when copying. To ensure this, | ||
32 | * the source and destination addresses for fncpy() must be aligned to a | ||
33 | * multiple of 8 bytes: you will be get a BUG() if this condition is not met. | ||
34 | * You will typically need a ".align 3" directive in the assembler where the | ||
35 | * function to be copied is defined, and ensure that your allocator for the | ||
36 | * destination buffer returns 8-byte-aligned pointers. | ||
37 | * | ||
38 | * Typical usage example: | ||
39 | * | ||
40 | * extern int f(args); | ||
41 | * extern uint32_t size_of_f; | ||
42 | * int (*copied_f)(args); | ||
43 | * void *sram_buffer; | ||
44 | * | ||
45 | * copied_f = fncpy(sram_buffer, &f, size_of_f); | ||
46 | * | ||
47 | * ... later, call the function: ... | ||
48 | * | ||
49 | * copied_f(args); | ||
50 | * | ||
51 | * The size of the function to be copied can't be determined from C: | ||
52 | * this must be determined by other means, such as adding assmbler directives | ||
53 | * in the file where f is defined. | ||
54 | */ | ||
55 | |||
56 | #ifndef __ASM_FNCPY_H | ||
57 | #define __ASM_FNCPY_H | ||
58 | |||
59 | #include <linux/types.h> | ||
60 | #include <linux/string.h> | ||
61 | |||
62 | #include <asm/bug.h> | ||
63 | #include <asm/cacheflush.h> | ||
64 | |||
65 | /* | ||
66 | * Minimum alignment requirement for the source and destination addresses | ||
67 | * for function copying. | ||
68 | */ | ||
69 | #define FNCPY_ALIGN 8 | ||
70 | |||
71 | #define fncpy(dest_buf, funcp, size) ({ \ | ||
72 | uintptr_t __funcp_address; \ | ||
73 | typeof(funcp) __result; \ | ||
74 | \ | ||
75 | asm("" : "=r" (__funcp_address) : "0" (funcp)); \ | ||
76 | \ | ||
77 | /* \ | ||
78 | * Ensure alignment of source and destination addresses, \ | ||
79 | * disregarding the function's Thumb bit: \ | ||
80 | */ \ | ||
81 | BUG_ON((uintptr_t)(dest_buf) & (FNCPY_ALIGN - 1) || \ | ||
82 | (__funcp_address & ~(uintptr_t)1 & (FNCPY_ALIGN - 1))); \ | ||
83 | \ | ||
84 | memcpy(dest_buf, (void const *)(__funcp_address & ~1), size); \ | ||
85 | flush_icache_range((unsigned long)(dest_buf), \ | ||
86 | (unsigned long)(dest_buf) + (size)); \ | ||
87 | \ | ||
88 | asm("" : "=r" (__result) \ | ||
89 | : "0" ((uintptr_t)(dest_buf) | (__funcp_address & 1))); \ | ||
90 | \ | ||
91 | __result; \ | ||
92 | }) | ||
93 | |||
94 | #endif /* !__ASM_FNCPY_H */ | ||
diff --git a/arch/arm/include/asm/glue-cache.h b/arch/arm/include/asm/glue-cache.h new file mode 100644 index 000000000000..c7afbc552c7f --- /dev/null +++ b/arch/arm/include/asm/glue-cache.h | |||
@@ -0,0 +1,146 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/glue-cache.h | ||
3 | * | ||
4 | * Copyright (C) 1999-2002 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 version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #ifndef ASM_GLUE_CACHE_H | ||
11 | #define ASM_GLUE_CACHE_H | ||
12 | |||
13 | #include <asm/glue.h> | ||
14 | |||
15 | /* | ||
16 | * Cache Model | ||
17 | * =========== | ||
18 | */ | ||
19 | #undef _CACHE | ||
20 | #undef MULTI_CACHE | ||
21 | |||
22 | #if defined(CONFIG_CPU_CACHE_V3) | ||
23 | # ifdef _CACHE | ||
24 | # define MULTI_CACHE 1 | ||
25 | # else | ||
26 | # define _CACHE v3 | ||
27 | # endif | ||
28 | #endif | ||
29 | |||
30 | #if defined(CONFIG_CPU_CACHE_V4) | ||
31 | # ifdef _CACHE | ||
32 | # define MULTI_CACHE 1 | ||
33 | # else | ||
34 | # define _CACHE v4 | ||
35 | # endif | ||
36 | #endif | ||
37 | |||
38 | #if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \ | ||
39 | defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) || \ | ||
40 | defined(CONFIG_CPU_ARM1026) | ||
41 | # define MULTI_CACHE 1 | ||
42 | #endif | ||
43 | |||
44 | #if defined(CONFIG_CPU_FA526) | ||
45 | # ifdef _CACHE | ||
46 | # define MULTI_CACHE 1 | ||
47 | # else | ||
48 | # define _CACHE fa | ||
49 | # endif | ||
50 | #endif | ||
51 | |||
52 | #if defined(CONFIG_CPU_ARM926T) | ||
53 | # ifdef _CACHE | ||
54 | # define MULTI_CACHE 1 | ||
55 | # else | ||
56 | # define _CACHE arm926 | ||
57 | # endif | ||
58 | #endif | ||
59 | |||
60 | #if defined(CONFIG_CPU_ARM940T) | ||
61 | # ifdef _CACHE | ||
62 | # define MULTI_CACHE 1 | ||
63 | # else | ||
64 | # define _CACHE arm940 | ||
65 | # endif | ||
66 | #endif | ||
67 | |||
68 | #if defined(CONFIG_CPU_ARM946E) | ||
69 | # ifdef _CACHE | ||
70 | # define MULTI_CACHE 1 | ||
71 | # else | ||
72 | # define _CACHE arm946 | ||
73 | # endif | ||
74 | #endif | ||
75 | |||
76 | #if defined(CONFIG_CPU_CACHE_V4WB) | ||
77 | # ifdef _CACHE | ||
78 | # define MULTI_CACHE 1 | ||
79 | # else | ||
80 | # define _CACHE v4wb | ||
81 | # endif | ||
82 | #endif | ||
83 | |||
84 | #if defined(CONFIG_CPU_XSCALE) | ||
85 | # ifdef _CACHE | ||
86 | # define MULTI_CACHE 1 | ||
87 | # else | ||
88 | # define _CACHE xscale | ||
89 | # endif | ||
90 | #endif | ||
91 | |||
92 | #if defined(CONFIG_CPU_XSC3) | ||
93 | # ifdef _CACHE | ||
94 | # define MULTI_CACHE 1 | ||
95 | # else | ||
96 | # define _CACHE xsc3 | ||
97 | # endif | ||
98 | #endif | ||
99 | |||
100 | #if defined(CONFIG_CPU_MOHAWK) | ||
101 | # ifdef _CACHE | ||
102 | # define MULTI_CACHE 1 | ||
103 | # else | ||
104 | # define _CACHE mohawk | ||
105 | # endif | ||
106 | #endif | ||
107 | |||
108 | #if defined(CONFIG_CPU_FEROCEON) | ||
109 | # define MULTI_CACHE 1 | ||
110 | #endif | ||
111 | |||
112 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) | ||
113 | //# ifdef _CACHE | ||
114 | # define MULTI_CACHE 1 | ||
115 | //# else | ||
116 | //# define _CACHE v6 | ||
117 | //# endif | ||
118 | #endif | ||
119 | |||
120 | #if defined(CONFIG_CPU_V7) | ||
121 | //# ifdef _CACHE | ||
122 | # define MULTI_CACHE 1 | ||
123 | //# else | ||
124 | //# define _CACHE v7 | ||
125 | //# endif | ||
126 | #endif | ||
127 | |||
128 | #if !defined(_CACHE) && !defined(MULTI_CACHE) | ||
129 | #error Unknown cache maintainence model | ||
130 | #endif | ||
131 | |||
132 | #ifndef MULTI_CACHE | ||
133 | #define __cpuc_flush_icache_all __glue(_CACHE,_flush_icache_all) | ||
134 | #define __cpuc_flush_kern_all __glue(_CACHE,_flush_kern_cache_all) | ||
135 | #define __cpuc_flush_user_all __glue(_CACHE,_flush_user_cache_all) | ||
136 | #define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range) | ||
137 | #define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range) | ||
138 | #define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range) | ||
139 | #define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area) | ||
140 | |||
141 | #define dmac_map_area __glue(_CACHE,_dma_map_area) | ||
142 | #define dmac_unmap_area __glue(_CACHE,_dma_unmap_area) | ||
143 | #define dmac_flush_range __glue(_CACHE,_dma_flush_range) | ||
144 | #endif | ||
145 | |||
146 | #endif | ||
diff --git a/arch/arm/include/asm/glue-df.h b/arch/arm/include/asm/glue-df.h new file mode 100644 index 000000000000..354d571e8bcc --- /dev/null +++ b/arch/arm/include/asm/glue-df.h | |||
@@ -0,0 +1,110 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/glue-df.h | ||
3 | * | ||
4 | * Copyright (C) 1997-1999 Russell King | ||
5 | * Copyright (C) 2000-2002 Deep Blue Solutions Ltd. | ||
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 | #ifndef ASM_GLUE_DF_H | ||
12 | #define ASM_GLUE_DF_H | ||
13 | |||
14 | #include <asm/glue.h> | ||
15 | |||
16 | /* | ||
17 | * Data Abort Model | ||
18 | * ================ | ||
19 | * | ||
20 | * We have the following to choose from: | ||
21 | * arm6 - ARM6 style | ||
22 | * arm7 - ARM7 style | ||
23 | * v4_early - ARMv4 without Thumb early abort handler | ||
24 | * v4t_late - ARMv4 with Thumb late abort handler | ||
25 | * v4t_early - ARMv4 with Thumb early abort handler | ||
26 | * v5tej_early - ARMv5 with Thumb and Java early abort handler | ||
27 | * xscale - ARMv5 with Thumb with Xscale extensions | ||
28 | * v6_early - ARMv6 generic early abort handler | ||
29 | * v7_early - ARMv7 generic early abort handler | ||
30 | */ | ||
31 | #undef CPU_DABORT_HANDLER | ||
32 | #undef MULTI_DABORT | ||
33 | |||
34 | #if defined(CONFIG_CPU_ARM610) | ||
35 | # ifdef CPU_DABORT_HANDLER | ||
36 | # define MULTI_DABORT 1 | ||
37 | # else | ||
38 | # define CPU_DABORT_HANDLER cpu_arm6_data_abort | ||
39 | # endif | ||
40 | #endif | ||
41 | |||
42 | #if defined(CONFIG_CPU_ARM710) | ||
43 | # ifdef CPU_DABORT_HANDLER | ||
44 | # define MULTI_DABORT 1 | ||
45 | # else | ||
46 | # define CPU_DABORT_HANDLER cpu_arm7_data_abort | ||
47 | # endif | ||
48 | #endif | ||
49 | |||
50 | #ifdef CONFIG_CPU_ABRT_LV4T | ||
51 | # ifdef CPU_DABORT_HANDLER | ||
52 | # define MULTI_DABORT 1 | ||
53 | # else | ||
54 | # define CPU_DABORT_HANDLER v4t_late_abort | ||
55 | # endif | ||
56 | #endif | ||
57 | |||
58 | #ifdef CONFIG_CPU_ABRT_EV4 | ||
59 | # ifdef CPU_DABORT_HANDLER | ||
60 | # define MULTI_DABORT 1 | ||
61 | # else | ||
62 | # define CPU_DABORT_HANDLER v4_early_abort | ||
63 | # endif | ||
64 | #endif | ||
65 | |||
66 | #ifdef CONFIG_CPU_ABRT_EV4T | ||
67 | # ifdef CPU_DABORT_HANDLER | ||
68 | # define MULTI_DABORT 1 | ||
69 | # else | ||
70 | # define CPU_DABORT_HANDLER v4t_early_abort | ||
71 | # endif | ||
72 | #endif | ||
73 | |||
74 | #ifdef CONFIG_CPU_ABRT_EV5TJ | ||
75 | # ifdef CPU_DABORT_HANDLER | ||
76 | # define MULTI_DABORT 1 | ||
77 | # else | ||
78 | # define CPU_DABORT_HANDLER v5tj_early_abort | ||
79 | # endif | ||
80 | #endif | ||
81 | |||
82 | #ifdef CONFIG_CPU_ABRT_EV5T | ||
83 | # ifdef CPU_DABORT_HANDLER | ||
84 | # define MULTI_DABORT 1 | ||
85 | # else | ||
86 | # define CPU_DABORT_HANDLER v5t_early_abort | ||
87 | # endif | ||
88 | #endif | ||
89 | |||
90 | #ifdef CONFIG_CPU_ABRT_EV6 | ||
91 | # ifdef CPU_DABORT_HANDLER | ||
92 | # define MULTI_DABORT 1 | ||
93 | # else | ||
94 | # define CPU_DABORT_HANDLER v6_early_abort | ||
95 | # endif | ||
96 | #endif | ||
97 | |||
98 | #ifdef CONFIG_CPU_ABRT_EV7 | ||
99 | # ifdef CPU_DABORT_HANDLER | ||
100 | # define MULTI_DABORT 1 | ||
101 | # else | ||
102 | # define CPU_DABORT_HANDLER v7_early_abort | ||
103 | # endif | ||
104 | #endif | ||
105 | |||
106 | #ifndef CPU_DABORT_HANDLER | ||
107 | #error Unknown data abort handler type | ||
108 | #endif | ||
109 | |||
110 | #endif | ||
diff --git a/arch/arm/include/asm/glue-pf.h b/arch/arm/include/asm/glue-pf.h new file mode 100644 index 000000000000..d385f37c13f0 --- /dev/null +++ b/arch/arm/include/asm/glue-pf.h | |||
@@ -0,0 +1,57 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/glue-pf.h | ||
3 | * | ||
4 | * Copyright (C) 1997-1999 Russell King | ||
5 | * Copyright (C) 2000-2002 Deep Blue Solutions Ltd. | ||
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 | #ifndef ASM_GLUE_PF_H | ||
12 | #define ASM_GLUE_PF_H | ||
13 | |||
14 | #include <asm/glue.h> | ||
15 | |||
16 | /* | ||
17 | * Prefetch Abort Model | ||
18 | * ================ | ||
19 | * | ||
20 | * We have the following to choose from: | ||
21 | * legacy - no IFSR, no IFAR | ||
22 | * v6 - ARMv6: IFSR, no IFAR | ||
23 | * v7 - ARMv7: IFSR and IFAR | ||
24 | */ | ||
25 | |||
26 | #undef CPU_PABORT_HANDLER | ||
27 | #undef MULTI_PABORT | ||
28 | |||
29 | #ifdef CONFIG_CPU_PABRT_LEGACY | ||
30 | # ifdef CPU_PABORT_HANDLER | ||
31 | # define MULTI_PABORT 1 | ||
32 | # else | ||
33 | # define CPU_PABORT_HANDLER legacy_pabort | ||
34 | # endif | ||
35 | #endif | ||
36 | |||
37 | #ifdef CONFIG_CPU_PABRT_V6 | ||
38 | # ifdef CPU_PABORT_HANDLER | ||
39 | # define MULTI_PABORT 1 | ||
40 | # else | ||
41 | # define CPU_PABORT_HANDLER v6_pabort | ||
42 | # endif | ||
43 | #endif | ||
44 | |||
45 | #ifdef CONFIG_CPU_PABRT_V7 | ||
46 | # ifdef CPU_PABORT_HANDLER | ||
47 | # define MULTI_PABORT 1 | ||
48 | # else | ||
49 | # define CPU_PABORT_HANDLER v7_pabort | ||
50 | # endif | ||
51 | #endif | ||
52 | |||
53 | #ifndef CPU_PABORT_HANDLER | ||
54 | #error Unknown prefetch abort handler type | ||
55 | #endif | ||
56 | |||
57 | #endif | ||
diff --git a/arch/arm/include/asm/glue-proc.h b/arch/arm/include/asm/glue-proc.h new file mode 100644 index 000000000000..e2be7f142668 --- /dev/null +++ b/arch/arm/include/asm/glue-proc.h | |||
@@ -0,0 +1,264 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/glue-proc.h | ||
3 | * | ||
4 | * Copyright (C) 1997-1999 Russell King | ||
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd | ||
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 | #ifndef ASM_GLUE_PROC_H | ||
12 | #define ASM_GLUE_PROC_H | ||
13 | |||
14 | #include <asm/glue.h> | ||
15 | |||
16 | /* | ||
17 | * Work out if we need multiple CPU support | ||
18 | */ | ||
19 | #undef MULTI_CPU | ||
20 | #undef CPU_NAME | ||
21 | |||
22 | /* | ||
23 | * CPU_NAME - the prefix for CPU related functions | ||
24 | */ | ||
25 | |||
26 | #ifdef CONFIG_CPU_ARM610 | ||
27 | # ifdef CPU_NAME | ||
28 | # undef MULTI_CPU | ||
29 | # define MULTI_CPU | ||
30 | # else | ||
31 | # define CPU_NAME cpu_arm6 | ||
32 | # endif | ||
33 | #endif | ||
34 | |||
35 | #ifdef CONFIG_CPU_ARM7TDMI | ||
36 | # ifdef CPU_NAME | ||
37 | # undef MULTI_CPU | ||
38 | # define MULTI_CPU | ||
39 | # else | ||
40 | # define CPU_NAME cpu_arm7tdmi | ||
41 | # endif | ||
42 | #endif | ||
43 | |||
44 | #ifdef CONFIG_CPU_ARM710 | ||
45 | # ifdef CPU_NAME | ||
46 | # undef MULTI_CPU | ||
47 | # define MULTI_CPU | ||
48 | # else | ||
49 | # define CPU_NAME cpu_arm7 | ||
50 | # endif | ||
51 | #endif | ||
52 | |||
53 | #ifdef CONFIG_CPU_ARM720T | ||
54 | # ifdef CPU_NAME | ||
55 | # undef MULTI_CPU | ||
56 | # define MULTI_CPU | ||
57 | # else | ||
58 | # define CPU_NAME cpu_arm720 | ||
59 | # endif | ||
60 | #endif | ||
61 | |||
62 | #ifdef CONFIG_CPU_ARM740T | ||
63 | # ifdef CPU_NAME | ||
64 | # undef MULTI_CPU | ||
65 | # define MULTI_CPU | ||
66 | # else | ||
67 | # define CPU_NAME cpu_arm740 | ||
68 | # endif | ||
69 | #endif | ||
70 | |||
71 | #ifdef CONFIG_CPU_ARM9TDMI | ||
72 | # ifdef CPU_NAME | ||
73 | # undef MULTI_CPU | ||
74 | # define MULTI_CPU | ||
75 | # else | ||
76 | # define CPU_NAME cpu_arm9tdmi | ||
77 | # endif | ||
78 | #endif | ||
79 | |||
80 | #ifdef CONFIG_CPU_ARM920T | ||
81 | # ifdef CPU_NAME | ||
82 | # undef MULTI_CPU | ||
83 | # define MULTI_CPU | ||
84 | # else | ||
85 | # define CPU_NAME cpu_arm920 | ||
86 | # endif | ||
87 | #endif | ||
88 | |||
89 | #ifdef CONFIG_CPU_ARM922T | ||
90 | # ifdef CPU_NAME | ||
91 | # undef MULTI_CPU | ||
92 | # define MULTI_CPU | ||
93 | # else | ||
94 | # define CPU_NAME cpu_arm922 | ||
95 | # endif | ||
96 | #endif | ||
97 | |||
98 | #ifdef CONFIG_CPU_FA526 | ||
99 | # ifdef CPU_NAME | ||
100 | # undef MULTI_CPU | ||
101 | # define MULTI_CPU | ||
102 | # else | ||
103 | # define CPU_NAME cpu_fa526 | ||
104 | # endif | ||
105 | #endif | ||
106 | |||
107 | #ifdef CONFIG_CPU_ARM925T | ||
108 | # ifdef CPU_NAME | ||
109 | # undef MULTI_CPU | ||
110 | # define MULTI_CPU | ||
111 | # else | ||
112 | # define CPU_NAME cpu_arm925 | ||
113 | # endif | ||
114 | #endif | ||
115 | |||
116 | #ifdef CONFIG_CPU_ARM926T | ||
117 | # ifdef CPU_NAME | ||
118 | # undef MULTI_CPU | ||
119 | # define MULTI_CPU | ||
120 | # else | ||
121 | # define CPU_NAME cpu_arm926 | ||
122 | # endif | ||
123 | #endif | ||
124 | |||
125 | #ifdef CONFIG_CPU_ARM940T | ||
126 | # ifdef CPU_NAME | ||
127 | # undef MULTI_CPU | ||
128 | # define MULTI_CPU | ||
129 | # else | ||
130 | # define CPU_NAME cpu_arm940 | ||
131 | # endif | ||
132 | #endif | ||
133 | |||
134 | #ifdef CONFIG_CPU_ARM946E | ||
135 | # ifdef CPU_NAME | ||
136 | # undef MULTI_CPU | ||
137 | # define MULTI_CPU | ||
138 | # else | ||
139 | # define CPU_NAME cpu_arm946 | ||
140 | # endif | ||
141 | #endif | ||
142 | |||
143 | #ifdef CONFIG_CPU_SA110 | ||
144 | # ifdef CPU_NAME | ||
145 | # undef MULTI_CPU | ||
146 | # define MULTI_CPU | ||
147 | # else | ||
148 | # define CPU_NAME cpu_sa110 | ||
149 | # endif | ||
150 | #endif | ||
151 | |||
152 | #ifdef CONFIG_CPU_SA1100 | ||
153 | # ifdef CPU_NAME | ||
154 | # undef MULTI_CPU | ||
155 | # define MULTI_CPU | ||
156 | # else | ||
157 | # define CPU_NAME cpu_sa1100 | ||
158 | # endif | ||
159 | #endif | ||
160 | |||
161 | #ifdef CONFIG_CPU_ARM1020 | ||
162 | # ifdef CPU_NAME | ||
163 | # undef MULTI_CPU | ||
164 | # define MULTI_CPU | ||
165 | # else | ||
166 | # define CPU_NAME cpu_arm1020 | ||
167 | # endif | ||
168 | #endif | ||
169 | |||
170 | #ifdef CONFIG_CPU_ARM1020E | ||
171 | # ifdef CPU_NAME | ||
172 | # undef MULTI_CPU | ||
173 | # define MULTI_CPU | ||
174 | # else | ||
175 | # define CPU_NAME cpu_arm1020e | ||
176 | # endif | ||
177 | #endif | ||
178 | |||
179 | #ifdef CONFIG_CPU_ARM1022 | ||
180 | # ifdef CPU_NAME | ||
181 | # undef MULTI_CPU | ||
182 | # define MULTI_CPU | ||
183 | # else | ||
184 | # define CPU_NAME cpu_arm1022 | ||
185 | # endif | ||
186 | #endif | ||
187 | |||
188 | #ifdef CONFIG_CPU_ARM1026 | ||
189 | # ifdef CPU_NAME | ||
190 | # undef MULTI_CPU | ||
191 | # define MULTI_CPU | ||
192 | # else | ||
193 | # define CPU_NAME cpu_arm1026 | ||
194 | # endif | ||
195 | #endif | ||
196 | |||
197 | #ifdef CONFIG_CPU_XSCALE | ||
198 | # ifdef CPU_NAME | ||
199 | # undef MULTI_CPU | ||
200 | # define MULTI_CPU | ||
201 | # else | ||
202 | # define CPU_NAME cpu_xscale | ||
203 | # endif | ||
204 | #endif | ||
205 | |||
206 | #ifdef CONFIG_CPU_XSC3 | ||
207 | # ifdef CPU_NAME | ||
208 | # undef MULTI_CPU | ||
209 | # define MULTI_CPU | ||
210 | # else | ||
211 | # define CPU_NAME cpu_xsc3 | ||
212 | # endif | ||
213 | #endif | ||
214 | |||
215 | #ifdef CONFIG_CPU_MOHAWK | ||
216 | # ifdef CPU_NAME | ||
217 | # undef MULTI_CPU | ||
218 | # define MULTI_CPU | ||
219 | # else | ||
220 | # define CPU_NAME cpu_mohawk | ||
221 | # endif | ||
222 | #endif | ||
223 | |||
224 | #ifdef CONFIG_CPU_FEROCEON | ||
225 | # ifdef CPU_NAME | ||
226 | # undef MULTI_CPU | ||
227 | # define MULTI_CPU | ||
228 | # else | ||
229 | # define CPU_NAME cpu_feroceon | ||
230 | # endif | ||
231 | #endif | ||
232 | |||
233 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) | ||
234 | # ifdef CPU_NAME | ||
235 | # undef MULTI_CPU | ||
236 | # define MULTI_CPU | ||
237 | # else | ||
238 | # define CPU_NAME cpu_v6 | ||
239 | # endif | ||
240 | #endif | ||
241 | |||
242 | #ifdef CONFIG_CPU_V7 | ||
243 | # ifdef CPU_NAME | ||
244 | # undef MULTI_CPU | ||
245 | # define MULTI_CPU | ||
246 | # else | ||
247 | # define CPU_NAME cpu_v7 | ||
248 | # endif | ||
249 | #endif | ||
250 | |||
251 | #ifndef MULTI_CPU | ||
252 | #define cpu_proc_init __glue(CPU_NAME,_proc_init) | ||
253 | #define cpu_proc_fin __glue(CPU_NAME,_proc_fin) | ||
254 | #define cpu_reset __glue(CPU_NAME,_reset) | ||
255 | #define cpu_do_idle __glue(CPU_NAME,_do_idle) | ||
256 | #define cpu_dcache_clean_area __glue(CPU_NAME,_dcache_clean_area) | ||
257 | #define cpu_do_switch_mm __glue(CPU_NAME,_switch_mm) | ||
258 | #define cpu_set_pte_ext __glue(CPU_NAME,_set_pte_ext) | ||
259 | #define cpu_suspend_size __glue(CPU_NAME,_suspend_size) | ||
260 | #define cpu_do_suspend __glue(CPU_NAME,_do_suspend) | ||
261 | #define cpu_do_resume __glue(CPU_NAME,_do_resume) | ||
262 | #endif | ||
263 | |||
264 | #endif | ||
diff --git a/arch/arm/include/asm/glue.h b/arch/arm/include/asm/glue.h index 234a3fc1c78e..0ec35d1698aa 100644 --- a/arch/arm/include/asm/glue.h +++ b/arch/arm/include/asm/glue.h | |||
@@ -15,7 +15,6 @@ | |||
15 | */ | 15 | */ |
16 | #ifdef __KERNEL__ | 16 | #ifdef __KERNEL__ |
17 | 17 | ||
18 | |||
19 | #ifdef __STDC__ | 18 | #ifdef __STDC__ |
20 | #define ____glue(name,fn) name##fn | 19 | #define ____glue(name,fn) name##fn |
21 | #else | 20 | #else |
@@ -23,141 +22,4 @@ | |||
23 | #endif | 22 | #endif |
24 | #define __glue(name,fn) ____glue(name,fn) | 23 | #define __glue(name,fn) ____glue(name,fn) |
25 | 24 | ||
26 | |||
27 | |||
28 | /* | ||
29 | * Data Abort Model | ||
30 | * ================ | ||
31 | * | ||
32 | * We have the following to choose from: | ||
33 | * arm6 - ARM6 style | ||
34 | * arm7 - ARM7 style | ||
35 | * v4_early - ARMv4 without Thumb early abort handler | ||
36 | * v4t_late - ARMv4 with Thumb late abort handler | ||
37 | * v4t_early - ARMv4 with Thumb early abort handler | ||
38 | * v5tej_early - ARMv5 with Thumb and Java early abort handler | ||
39 | * xscale - ARMv5 with Thumb with Xscale extensions | ||
40 | * v6_early - ARMv6 generic early abort handler | ||
41 | * v7_early - ARMv7 generic early abort handler | ||
42 | */ | ||
43 | #undef CPU_DABORT_HANDLER | ||
44 | #undef MULTI_DABORT | ||
45 | |||
46 | #if defined(CONFIG_CPU_ARM610) | ||
47 | # ifdef CPU_DABORT_HANDLER | ||
48 | # define MULTI_DABORT 1 | ||
49 | # else | ||
50 | # define CPU_DABORT_HANDLER cpu_arm6_data_abort | ||
51 | # endif | ||
52 | #endif | ||
53 | |||
54 | #if defined(CONFIG_CPU_ARM710) | ||
55 | # ifdef CPU_DABORT_HANDLER | ||
56 | # define MULTI_DABORT 1 | ||
57 | # else | ||
58 | # define CPU_DABORT_HANDLER cpu_arm7_data_abort | ||
59 | # endif | ||
60 | #endif | ||
61 | |||
62 | #ifdef CONFIG_CPU_ABRT_LV4T | ||
63 | # ifdef CPU_DABORT_HANDLER | ||
64 | # define MULTI_DABORT 1 | ||
65 | # else | ||
66 | # define CPU_DABORT_HANDLER v4t_late_abort | ||
67 | # endif | ||
68 | #endif | ||
69 | |||
70 | #ifdef CONFIG_CPU_ABRT_EV4 | ||
71 | # ifdef CPU_DABORT_HANDLER | ||
72 | # define MULTI_DABORT 1 | ||
73 | # else | ||
74 | # define CPU_DABORT_HANDLER v4_early_abort | ||
75 | # endif | ||
76 | #endif | ||
77 | |||
78 | #ifdef CONFIG_CPU_ABRT_EV4T | ||
79 | # ifdef CPU_DABORT_HANDLER | ||
80 | # define MULTI_DABORT 1 | ||
81 | # else | ||
82 | # define CPU_DABORT_HANDLER v4t_early_abort | ||
83 | # endif | ||
84 | #endif | ||
85 | |||
86 | #ifdef CONFIG_CPU_ABRT_EV5TJ | ||
87 | # ifdef CPU_DABORT_HANDLER | ||
88 | # define MULTI_DABORT 1 | ||
89 | # else | ||
90 | # define CPU_DABORT_HANDLER v5tj_early_abort | ||
91 | # endif | ||
92 | #endif | ||
93 | |||
94 | #ifdef CONFIG_CPU_ABRT_EV5T | ||
95 | # ifdef CPU_DABORT_HANDLER | ||
96 | # define MULTI_DABORT 1 | ||
97 | # else | ||
98 | # define CPU_DABORT_HANDLER v5t_early_abort | ||
99 | # endif | ||
100 | #endif | ||
101 | |||
102 | #ifdef CONFIG_CPU_ABRT_EV6 | ||
103 | # ifdef CPU_DABORT_HANDLER | ||
104 | # define MULTI_DABORT 1 | ||
105 | # else | ||
106 | # define CPU_DABORT_HANDLER v6_early_abort | ||
107 | # endif | ||
108 | #endif | ||
109 | |||
110 | #ifdef CONFIG_CPU_ABRT_EV7 | ||
111 | # ifdef CPU_DABORT_HANDLER | ||
112 | # define MULTI_DABORT 1 | ||
113 | # else | ||
114 | # define CPU_DABORT_HANDLER v7_early_abort | ||
115 | # endif | ||
116 | #endif | ||
117 | |||
118 | #ifndef CPU_DABORT_HANDLER | ||
119 | #error Unknown data abort handler type | ||
120 | #endif | ||
121 | |||
122 | /* | ||
123 | * Prefetch Abort Model | ||
124 | * ================ | ||
125 | * | ||
126 | * We have the following to choose from: | ||
127 | * legacy - no IFSR, no IFAR | ||
128 | * v6 - ARMv6: IFSR, no IFAR | ||
129 | * v7 - ARMv7: IFSR and IFAR | ||
130 | */ | ||
131 | |||
132 | #undef CPU_PABORT_HANDLER | ||
133 | #undef MULTI_PABORT | ||
134 | |||
135 | #ifdef CONFIG_CPU_PABRT_LEGACY | ||
136 | # ifdef CPU_PABORT_HANDLER | ||
137 | # define MULTI_PABORT 1 | ||
138 | # else | ||
139 | # define CPU_PABORT_HANDLER legacy_pabort | ||
140 | # endif | ||
141 | #endif | ||
142 | |||
143 | #ifdef CONFIG_CPU_PABRT_V6 | ||
144 | # ifdef CPU_PABORT_HANDLER | ||
145 | # define MULTI_PABORT 1 | ||
146 | # else | ||
147 | # define CPU_PABORT_HANDLER v6_pabort | ||
148 | # endif | ||
149 | #endif | ||
150 | |||
151 | #ifdef CONFIG_CPU_PABRT_V7 | ||
152 | # ifdef CPU_PABORT_HANDLER | ||
153 | # define MULTI_PABORT 1 | ||
154 | # else | ||
155 | # define CPU_PABORT_HANDLER v7_pabort | ||
156 | # endif | ||
157 | #endif | ||
158 | |||
159 | #ifndef CPU_PABORT_HANDLER | ||
160 | #error Unknown prefetch abort handler type | ||
161 | #endif | ||
162 | |||
163 | #endif | 25 | #endif |
diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h index 84557d321001..0691f9dcc500 100644 --- a/arch/arm/include/asm/hardware/gic.h +++ b/arch/arm/include/asm/hardware/gic.h | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
36 | extern void __iomem *gic_cpu_base_addr; | 36 | extern void __iomem *gic_cpu_base_addr; |
37 | extern struct irq_chip gic_arch_extn; | ||
37 | 38 | ||
38 | void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *); | 39 | void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *); |
39 | void gic_secondary_init(unsigned int); | 40 | void gic_secondary_init(unsigned int); |
diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index 7080e2c8fa62..a4edd19dd3d6 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h | |||
@@ -19,11 +19,36 @@ | |||
19 | 19 | ||
20 | extern pte_t *pkmap_page_table; | 20 | extern pte_t *pkmap_page_table; |
21 | 21 | ||
22 | extern void *kmap_high(struct page *page); | ||
23 | extern void kunmap_high(struct page *page); | ||
24 | |||
25 | /* | ||
26 | * The reason for kmap_high_get() is to ensure that the currently kmap'd | ||
27 | * page usage count does not decrease to zero while we're using its | ||
28 | * existing virtual mapping in an atomic context. With a VIVT cache this | ||
29 | * is essential to do, but with a VIPT cache this is only an optimization | ||
30 | * so not to pay the price of establishing a second mapping if an existing | ||
31 | * one can be used. However, on platforms without hardware TLB maintenance | ||
32 | * broadcast, we simply cannot use ARCH_NEEDS_KMAP_HIGH_GET at all since | ||
33 | * the locking involved must also disable IRQs which is incompatible with | ||
34 | * the IPI mechanism used by global TLB operations. | ||
35 | */ | ||
22 | #define ARCH_NEEDS_KMAP_HIGH_GET | 36 | #define ARCH_NEEDS_KMAP_HIGH_GET |
37 | #if defined(CONFIG_SMP) && defined(CONFIG_CPU_TLB_V6) | ||
38 | #undef ARCH_NEEDS_KMAP_HIGH_GET | ||
39 | #if defined(CONFIG_HIGHMEM) && defined(CONFIG_CPU_CACHE_VIVT) | ||
40 | #error "The sum of features in your kernel config cannot be supported together" | ||
41 | #endif | ||
42 | #endif | ||
23 | 43 | ||
24 | extern void *kmap_high(struct page *page); | 44 | #ifdef ARCH_NEEDS_KMAP_HIGH_GET |
25 | extern void *kmap_high_get(struct page *page); | 45 | extern void *kmap_high_get(struct page *page); |
26 | extern void kunmap_high(struct page *page); | 46 | #else |
47 | static inline void *kmap_high_get(struct page *page) | ||
48 | { | ||
49 | return NULL; | ||
50 | } | ||
51 | #endif | ||
27 | 52 | ||
28 | /* | 53 | /* |
29 | * The following functions are already defined by <linux/highmem.h> | 54 | * The following functions are already defined by <linux/highmem.h> |
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h index 22ac140edd9e..febe495d0c6e 100644 --- a/arch/arm/include/asm/mach/irq.h +++ b/arch/arm/include/asm/mach/irq.h | |||
@@ -34,4 +34,35 @@ do { \ | |||
34 | raw_spin_unlock(&desc->lock); \ | 34 | raw_spin_unlock(&desc->lock); \ |
35 | } while(0) | 35 | } while(0) |
36 | 36 | ||
37 | #ifndef __ASSEMBLY__ | ||
38 | /* | ||
39 | * Entry/exit functions for chained handlers where the primary IRQ chip | ||
40 | * may implement either fasteoi or level-trigger flow control. | ||
41 | */ | ||
42 | static inline void chained_irq_enter(struct irq_chip *chip, | ||
43 | struct irq_desc *desc) | ||
44 | { | ||
45 | /* FastEOI controllers require no action on entry. */ | ||
46 | if (chip->irq_eoi) | ||
47 | return; | ||
48 | |||
49 | if (chip->irq_mask_ack) { | ||
50 | chip->irq_mask_ack(&desc->irq_data); | ||
51 | } else { | ||
52 | chip->irq_mask(&desc->irq_data); | ||
53 | if (chip->irq_ack) | ||
54 | chip->irq_ack(&desc->irq_data); | ||
55 | } | ||
56 | } | ||
57 | |||
58 | static inline void chained_irq_exit(struct irq_chip *chip, | ||
59 | struct irq_desc *desc) | ||
60 | { | ||
61 | if (chip->irq_eoi) | ||
62 | chip->irq_eoi(&desc->irq_data); | ||
63 | else | ||
64 | chip->irq_unmask(&desc->irq_data); | ||
65 | } | ||
66 | #endif | ||
67 | |||
37 | #endif | 68 | #endif |
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index d0ee74b7cf86..431077c5a867 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/compiler.h> | 16 | #include <linux/compiler.h> |
17 | #include <linux/const.h> | 17 | #include <linux/const.h> |
18 | #include <linux/types.h> | ||
18 | #include <mach/memory.h> | 19 | #include <mach/memory.h> |
19 | #include <asm/sizes.h> | 20 | #include <asm/sizes.h> |
20 | 21 | ||
@@ -133,20 +134,10 @@ | |||
133 | #endif | 134 | #endif |
134 | 135 | ||
135 | /* | 136 | /* |
136 | * Physical vs virtual RAM address space conversion. These are | ||
137 | * private definitions which should NOT be used outside memory.h | ||
138 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. | ||
139 | */ | ||
140 | #ifndef __virt_to_phys | ||
141 | #define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET) | ||
142 | #define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET) | ||
143 | #endif | ||
144 | |||
145 | /* | ||
146 | * Convert a physical address to a Page Frame Number and back | 137 | * Convert a physical address to a Page Frame Number and back |
147 | */ | 138 | */ |
148 | #define __phys_to_pfn(paddr) ((paddr) >> PAGE_SHIFT) | 139 | #define __phys_to_pfn(paddr) ((unsigned long)((paddr) >> PAGE_SHIFT)) |
149 | #define __pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) | 140 | #define __pfn_to_phys(pfn) ((phys_addr_t)(pfn) << PAGE_SHIFT) |
150 | 141 | ||
151 | /* | 142 | /* |
152 | * Convert a page to/from a physical address | 143 | * Convert a page to/from a physical address |
@@ -157,6 +148,62 @@ | |||
157 | #ifndef __ASSEMBLY__ | 148 | #ifndef __ASSEMBLY__ |
158 | 149 | ||
159 | /* | 150 | /* |
151 | * Physical vs virtual RAM address space conversion. These are | ||
152 | * private definitions which should NOT be used outside memory.h | ||
153 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. | ||
154 | */ | ||
155 | #ifndef __virt_to_phys | ||
156 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT | ||
157 | |||
158 | /* | ||
159 | * Constants used to force the right instruction encodings and shifts | ||
160 | * so that all we need to do is modify the 8-bit constant field. | ||
161 | */ | ||
162 | #define __PV_BITS_31_24 0x81000000 | ||
163 | #define __PV_BITS_23_16 0x00810000 | ||
164 | |||
165 | extern unsigned long __pv_phys_offset; | ||
166 | #define PHYS_OFFSET __pv_phys_offset | ||
167 | |||
168 | #define __pv_stub(from,to,instr,type) \ | ||
169 | __asm__("@ __pv_stub\n" \ | ||
170 | "1: " instr " %0, %1, %2\n" \ | ||
171 | " .pushsection .pv_table,\"a\"\n" \ | ||
172 | " .long 1b\n" \ | ||
173 | " .popsection\n" \ | ||
174 | : "=r" (to) \ | ||
175 | : "r" (from), "I" (type)) | ||
176 | |||
177 | static inline unsigned long __virt_to_phys(unsigned long x) | ||
178 | { | ||
179 | unsigned long t; | ||
180 | __pv_stub(x, t, "add", __PV_BITS_31_24); | ||
181 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT | ||
182 | __pv_stub(t, t, "add", __PV_BITS_23_16); | ||
183 | #endif | ||
184 | return t; | ||
185 | } | ||
186 | |||
187 | static inline unsigned long __phys_to_virt(unsigned long x) | ||
188 | { | ||
189 | unsigned long t; | ||
190 | __pv_stub(x, t, "sub", __PV_BITS_31_24); | ||
191 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT | ||
192 | __pv_stub(t, t, "sub", __PV_BITS_23_16); | ||
193 | #endif | ||
194 | return t; | ||
195 | } | ||
196 | #else | ||
197 | #define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET) | ||
198 | #define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET) | ||
199 | #endif | ||
200 | #endif | ||
201 | |||
202 | #ifndef PHYS_OFFSET | ||
203 | #define PHYS_OFFSET PLAT_PHYS_OFFSET | ||
204 | #endif | ||
205 | |||
206 | /* | ||
160 | * The DMA mask corresponding to the maximum bus address allocatable | 207 | * The DMA mask corresponding to the maximum bus address allocatable |
161 | * using GFP_DMA. The default here places no restriction on DMA | 208 | * using GFP_DMA. The default here places no restriction on DMA |
162 | * allocations. This must be the smallest DMA mask in the system, | 209 | * allocations. This must be the smallest DMA mask in the system, |
@@ -188,12 +235,12 @@ | |||
188 | * translation for translating DMA addresses. Use the driver | 235 | * translation for translating DMA addresses. Use the driver |
189 | * DMA support - see dma-mapping.h. | 236 | * DMA support - see dma-mapping.h. |
190 | */ | 237 | */ |
191 | static inline unsigned long virt_to_phys(const volatile void *x) | 238 | static inline phys_addr_t virt_to_phys(const volatile void *x) |
192 | { | 239 | { |
193 | return __virt_to_phys((unsigned long)(x)); | 240 | return __virt_to_phys((unsigned long)(x)); |
194 | } | 241 | } |
195 | 242 | ||
196 | static inline void *phys_to_virt(unsigned long x) | 243 | static inline void *phys_to_virt(phys_addr_t x) |
197 | { | 244 | { |
198 | return (void *)(__phys_to_virt((unsigned long)(x))); | 245 | return (void *)(__phys_to_virt((unsigned long)(x))); |
199 | } | 246 | } |
diff --git a/arch/arm/include/asm/module.h b/arch/arm/include/asm/module.h index 12c8e680cbff..543b44916d2c 100644 --- a/arch/arm/include/asm/module.h +++ b/arch/arm/include/asm/module.h | |||
@@ -25,8 +25,31 @@ struct mod_arch_specific { | |||
25 | }; | 25 | }; |
26 | 26 | ||
27 | /* | 27 | /* |
28 | * Include the ARM architecture version. | 28 | * Add the ARM architecture version to the version magic string |
29 | */ | 29 | */ |
30 | #define MODULE_ARCH_VERMAGIC "ARMv" __stringify(__LINUX_ARM_ARCH__) " " | 30 | #define MODULE_ARCH_VERMAGIC_ARMVSN "ARMv" __stringify(__LINUX_ARM_ARCH__) " " |
31 | |||
32 | /* Add __virt_to_phys patching state as well */ | ||
33 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT | ||
34 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT | ||
35 | #define MODULE_ARCH_VERMAGIC_P2V "p2v16 " | ||
36 | #else | ||
37 | #define MODULE_ARCH_VERMAGIC_P2V "p2v8 " | ||
38 | #endif | ||
39 | #else | ||
40 | #define MODULE_ARCH_VERMAGIC_P2V "" | ||
41 | #endif | ||
42 | |||
43 | /* Add instruction set architecture tag to distinguish ARM/Thumb kernels */ | ||
44 | #ifdef CONFIG_THUMB2_KERNEL | ||
45 | #define MODULE_ARCH_VERMAGIC_ARMTHUMB "thumb2 " | ||
46 | #else | ||
47 | #define MODULE_ARCH_VERMAGIC_ARMTHUMB "" | ||
48 | #endif | ||
49 | |||
50 | #define MODULE_ARCH_VERMAGIC \ | ||
51 | MODULE_ARCH_VERMAGIC_ARMVSN \ | ||
52 | MODULE_ARCH_VERMAGIC_ARMTHUMB \ | ||
53 | MODULE_ARCH_VERMAGIC_P2V | ||
31 | 54 | ||
32 | #endif /* _ASM_ARM_MODULE_H */ | 55 | #endif /* _ASM_ARM_MODULE_H */ |
diff --git a/arch/arm/include/asm/outercache.h b/arch/arm/include/asm/outercache.h index fc1900925275..348d513afa92 100644 --- a/arch/arm/include/asm/outercache.h +++ b/arch/arm/include/asm/outercache.h | |||
@@ -31,6 +31,7 @@ struct outer_cache_fns { | |||
31 | #ifdef CONFIG_OUTER_CACHE_SYNC | 31 | #ifdef CONFIG_OUTER_CACHE_SYNC |
32 | void (*sync)(void); | 32 | void (*sync)(void); |
33 | #endif | 33 | #endif |
34 | void (*set_debug)(unsigned long); | ||
34 | }; | 35 | }; |
35 | 36 | ||
36 | #ifdef CONFIG_OUTER_CACHE | 37 | #ifdef CONFIG_OUTER_CACHE |
diff --git a/arch/arm/include/asm/proc-fns.h b/arch/arm/include/asm/proc-fns.h index 8fdae9bc9abb..8ec535e11fd7 100644 --- a/arch/arm/include/asm/proc-fns.h +++ b/arch/arm/include/asm/proc-fns.h | |||
@@ -13,250 +13,86 @@ | |||
13 | 13 | ||
14 | #ifdef __KERNEL__ | 14 | #ifdef __KERNEL__ |
15 | 15 | ||
16 | #include <asm/glue-proc.h> | ||
17 | #include <asm/page.h> | ||
16 | 18 | ||
17 | /* | 19 | #ifndef __ASSEMBLY__ |
18 | * Work out if we need multiple CPU support | 20 | |
19 | */ | 21 | struct mm_struct; |
20 | #undef MULTI_CPU | ||
21 | #undef CPU_NAME | ||
22 | 22 | ||
23 | /* | 23 | /* |
24 | * CPU_NAME - the prefix for CPU related functions | 24 | * Don't change this structure - ASM code relies on it. |
25 | */ | 25 | */ |
26 | 26 | extern struct processor { | |
27 | #ifdef CONFIG_CPU_ARM610 | 27 | /* MISC |
28 | # ifdef CPU_NAME | 28 | * get data abort address/flags |
29 | # undef MULTI_CPU | 29 | */ |
30 | # define MULTI_CPU | 30 | void (*_data_abort)(unsigned long pc); |
31 | # else | 31 | /* |
32 | # define CPU_NAME cpu_arm6 | 32 | * Retrieve prefetch fault address |
33 | # endif | 33 | */ |
34 | #endif | 34 | unsigned long (*_prefetch_abort)(unsigned long lr); |
35 | 35 | /* | |
36 | #ifdef CONFIG_CPU_ARM7TDMI | 36 | * Set up any processor specifics |
37 | # ifdef CPU_NAME | 37 | */ |
38 | # undef MULTI_CPU | 38 | void (*_proc_init)(void); |
39 | # define MULTI_CPU | 39 | /* |
40 | # else | 40 | * Disable any processor specifics |
41 | # define CPU_NAME cpu_arm7tdmi | 41 | */ |
42 | # endif | 42 | void (*_proc_fin)(void); |
43 | #endif | 43 | /* |
44 | 44 | * Special stuff for a reset | |
45 | #ifdef CONFIG_CPU_ARM710 | 45 | */ |
46 | # ifdef CPU_NAME | 46 | void (*reset)(unsigned long addr) __attribute__((noreturn)); |
47 | # undef MULTI_CPU | 47 | /* |
48 | # define MULTI_CPU | 48 | * Idle the processor |
49 | # else | 49 | */ |
50 | # define CPU_NAME cpu_arm7 | 50 | int (*_do_idle)(void); |
51 | # endif | 51 | /* |
52 | #endif | 52 | * Processor architecture specific |
53 | 53 | */ | |
54 | #ifdef CONFIG_CPU_ARM720T | 54 | /* |
55 | # ifdef CPU_NAME | 55 | * clean a virtual address range from the |
56 | # undef MULTI_CPU | 56 | * D-cache without flushing the cache. |
57 | # define MULTI_CPU | 57 | */ |
58 | # else | 58 | void (*dcache_clean_area)(void *addr, int size); |
59 | # define CPU_NAME cpu_arm720 | 59 | |
60 | # endif | 60 | /* |
61 | #endif | 61 | * Set the page table |
62 | 62 | */ | |
63 | #ifdef CONFIG_CPU_ARM740T | 63 | void (*switch_mm)(unsigned long pgd_phys, struct mm_struct *mm); |
64 | # ifdef CPU_NAME | 64 | /* |
65 | # undef MULTI_CPU | 65 | * Set a possibly extended PTE. Non-extended PTEs should |
66 | # define MULTI_CPU | 66 | * ignore 'ext'. |
67 | # else | 67 | */ |
68 | # define CPU_NAME cpu_arm740 | 68 | void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext); |
69 | # endif | 69 | |
70 | #endif | 70 | /* Suspend/resume */ |
71 | 71 | unsigned int suspend_size; | |
72 | #ifdef CONFIG_CPU_ARM9TDMI | 72 | void (*do_suspend)(void *); |
73 | # ifdef CPU_NAME | 73 | void (*do_resume)(void *); |
74 | # undef MULTI_CPU | 74 | } processor; |
75 | # define MULTI_CPU | ||
76 | # else | ||
77 | # define CPU_NAME cpu_arm9tdmi | ||
78 | # endif | ||
79 | #endif | ||
80 | |||
81 | #ifdef CONFIG_CPU_ARM920T | ||
82 | # ifdef CPU_NAME | ||
83 | # undef MULTI_CPU | ||
84 | # define MULTI_CPU | ||
85 | # else | ||
86 | # define CPU_NAME cpu_arm920 | ||
87 | # endif | ||
88 | #endif | ||
89 | |||
90 | #ifdef CONFIG_CPU_ARM922T | ||
91 | # ifdef CPU_NAME | ||
92 | # undef MULTI_CPU | ||
93 | # define MULTI_CPU | ||
94 | # else | ||
95 | # define CPU_NAME cpu_arm922 | ||
96 | # endif | ||
97 | #endif | ||
98 | |||
99 | #ifdef CONFIG_CPU_FA526 | ||
100 | # ifdef CPU_NAME | ||
101 | # undef MULTI_CPU | ||
102 | # define MULTI_CPU | ||
103 | # else | ||
104 | # define CPU_NAME cpu_fa526 | ||
105 | # endif | ||
106 | #endif | ||
107 | |||
108 | #ifdef CONFIG_CPU_ARM925T | ||
109 | # ifdef CPU_NAME | ||
110 | # undef MULTI_CPU | ||
111 | # define MULTI_CPU | ||
112 | # else | ||
113 | # define CPU_NAME cpu_arm925 | ||
114 | # endif | ||
115 | #endif | ||
116 | |||
117 | #ifdef CONFIG_CPU_ARM926T | ||
118 | # ifdef CPU_NAME | ||
119 | # undef MULTI_CPU | ||
120 | # define MULTI_CPU | ||
121 | # else | ||
122 | # define CPU_NAME cpu_arm926 | ||
123 | # endif | ||
124 | #endif | ||
125 | |||
126 | #ifdef CONFIG_CPU_ARM940T | ||
127 | # ifdef CPU_NAME | ||
128 | # undef MULTI_CPU | ||
129 | # define MULTI_CPU | ||
130 | # else | ||
131 | # define CPU_NAME cpu_arm940 | ||
132 | # endif | ||
133 | #endif | ||
134 | |||
135 | #ifdef CONFIG_CPU_ARM946E | ||
136 | # ifdef CPU_NAME | ||
137 | # undef MULTI_CPU | ||
138 | # define MULTI_CPU | ||
139 | # else | ||
140 | # define CPU_NAME cpu_arm946 | ||
141 | # endif | ||
142 | #endif | ||
143 | |||
144 | #ifdef CONFIG_CPU_SA110 | ||
145 | # ifdef CPU_NAME | ||
146 | # undef MULTI_CPU | ||
147 | # define MULTI_CPU | ||
148 | # else | ||
149 | # define CPU_NAME cpu_sa110 | ||
150 | # endif | ||
151 | #endif | ||
152 | |||
153 | #ifdef CONFIG_CPU_SA1100 | ||
154 | # ifdef CPU_NAME | ||
155 | # undef MULTI_CPU | ||
156 | # define MULTI_CPU | ||
157 | # else | ||
158 | # define CPU_NAME cpu_sa1100 | ||
159 | # endif | ||
160 | #endif | ||
161 | |||
162 | #ifdef CONFIG_CPU_ARM1020 | ||
163 | # ifdef CPU_NAME | ||
164 | # undef MULTI_CPU | ||
165 | # define MULTI_CPU | ||
166 | # else | ||
167 | # define CPU_NAME cpu_arm1020 | ||
168 | # endif | ||
169 | #endif | ||
170 | |||
171 | #ifdef CONFIG_CPU_ARM1020E | ||
172 | # ifdef CPU_NAME | ||
173 | # undef MULTI_CPU | ||
174 | # define MULTI_CPU | ||
175 | # else | ||
176 | # define CPU_NAME cpu_arm1020e | ||
177 | # endif | ||
178 | #endif | ||
179 | |||
180 | #ifdef CONFIG_CPU_ARM1022 | ||
181 | # ifdef CPU_NAME | ||
182 | # undef MULTI_CPU | ||
183 | # define MULTI_CPU | ||
184 | # else | ||
185 | # define CPU_NAME cpu_arm1022 | ||
186 | # endif | ||
187 | #endif | ||
188 | |||
189 | #ifdef CONFIG_CPU_ARM1026 | ||
190 | # ifdef CPU_NAME | ||
191 | # undef MULTI_CPU | ||
192 | # define MULTI_CPU | ||
193 | # else | ||
194 | # define CPU_NAME cpu_arm1026 | ||
195 | # endif | ||
196 | #endif | ||
197 | |||
198 | #ifdef CONFIG_CPU_XSCALE | ||
199 | # ifdef CPU_NAME | ||
200 | # undef MULTI_CPU | ||
201 | # define MULTI_CPU | ||
202 | # else | ||
203 | # define CPU_NAME cpu_xscale | ||
204 | # endif | ||
205 | #endif | ||
206 | |||
207 | #ifdef CONFIG_CPU_XSC3 | ||
208 | # ifdef CPU_NAME | ||
209 | # undef MULTI_CPU | ||
210 | # define MULTI_CPU | ||
211 | # else | ||
212 | # define CPU_NAME cpu_xsc3 | ||
213 | # endif | ||
214 | #endif | ||
215 | |||
216 | #ifdef CONFIG_CPU_MOHAWK | ||
217 | # ifdef CPU_NAME | ||
218 | # undef MULTI_CPU | ||
219 | # define MULTI_CPU | ||
220 | # else | ||
221 | # define CPU_NAME cpu_mohawk | ||
222 | # endif | ||
223 | #endif | ||
224 | |||
225 | #ifdef CONFIG_CPU_FEROCEON | ||
226 | # ifdef CPU_NAME | ||
227 | # undef MULTI_CPU | ||
228 | # define MULTI_CPU | ||
229 | # else | ||
230 | # define CPU_NAME cpu_feroceon | ||
231 | # endif | ||
232 | #endif | ||
233 | |||
234 | #ifdef CONFIG_CPU_V6 | ||
235 | # ifdef CPU_NAME | ||
236 | # undef MULTI_CPU | ||
237 | # define MULTI_CPU | ||
238 | # else | ||
239 | # define CPU_NAME cpu_v6 | ||
240 | # endif | ||
241 | #endif | ||
242 | |||
243 | #ifdef CONFIG_CPU_V7 | ||
244 | # ifdef CPU_NAME | ||
245 | # undef MULTI_CPU | ||
246 | # define MULTI_CPU | ||
247 | # else | ||
248 | # define CPU_NAME cpu_v7 | ||
249 | # endif | ||
250 | #endif | ||
251 | |||
252 | #ifndef __ASSEMBLY__ | ||
253 | 75 | ||
254 | #ifndef MULTI_CPU | 76 | #ifndef MULTI_CPU |
255 | #include <asm/cpu-single.h> | 77 | extern void cpu_proc_init(void); |
78 | extern void cpu_proc_fin(void); | ||
79 | extern int cpu_do_idle(void); | ||
80 | extern void cpu_dcache_clean_area(void *, int); | ||
81 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); | ||
82 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext); | ||
83 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); | ||
256 | #else | 84 | #else |
257 | #include <asm/cpu-multi32.h> | 85 | #define cpu_proc_init() processor._proc_init() |
86 | #define cpu_proc_fin() processor._proc_fin() | ||
87 | #define cpu_reset(addr) processor.reset(addr) | ||
88 | #define cpu_do_idle() processor._do_idle() | ||
89 | #define cpu_dcache_clean_area(addr,sz) processor.dcache_clean_area(addr,sz) | ||
90 | #define cpu_set_pte_ext(ptep,pte,ext) processor.set_pte_ext(ptep,pte,ext) | ||
91 | #define cpu_do_switch_mm(pgd,mm) processor.switch_mm(pgd,mm) | ||
258 | #endif | 92 | #endif |
259 | 93 | ||
94 | extern void cpu_resume(void); | ||
95 | |||
260 | #include <asm/memory.h> | 96 | #include <asm/memory.h> |
261 | 97 | ||
262 | #ifdef CONFIG_MMU | 98 | #ifdef CONFIG_MMU |
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index 67357baaeeeb..b2d9df5667af 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
@@ -29,19 +29,7 @@ | |||
29 | #define STACK_TOP_MAX TASK_SIZE | 29 | #define STACK_TOP_MAX TASK_SIZE |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | union debug_insn { | ||
33 | u32 arm; | ||
34 | u16 thumb; | ||
35 | }; | ||
36 | |||
37 | struct debug_entry { | ||
38 | u32 address; | ||
39 | union debug_insn insn; | ||
40 | }; | ||
41 | |||
42 | struct debug_info { | 32 | struct debug_info { |
43 | int nsaved; | ||
44 | struct debug_entry bp[2]; | ||
45 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | 33 | #ifdef CONFIG_HAVE_HW_BREAKPOINT |
46 | struct perf_event *hbp[ARM_MAX_HBP_SLOTS]; | 34 | struct perf_event *hbp[ARM_MAX_HBP_SLOTS]; |
47 | #endif | 35 | #endif |
@@ -95,7 +83,7 @@ extern void release_thread(struct task_struct *); | |||
95 | 83 | ||
96 | unsigned long get_wchan(struct task_struct *p); | 84 | unsigned long get_wchan(struct task_struct *p); |
97 | 85 | ||
98 | #if __LINUX_ARM_ARCH__ == 6 | 86 | #if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327) |
99 | #define cpu_relax() smp_mb() | 87 | #define cpu_relax() smp_mb() |
100 | #else | 88 | #else |
101 | #define cpu_relax() barrier() | 89 | #define cpu_relax() barrier() |
diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h index 783d50f32618..a8ff22b2a391 100644 --- a/arch/arm/include/asm/ptrace.h +++ b/arch/arm/include/asm/ptrace.h | |||
@@ -130,8 +130,6 @@ struct pt_regs { | |||
130 | 130 | ||
131 | #ifdef __KERNEL__ | 131 | #ifdef __KERNEL__ |
132 | 132 | ||
133 | #define arch_has_single_step() (1) | ||
134 | |||
135 | #define user_mode(regs) \ | 133 | #define user_mode(regs) \ |
136 | (((regs)->ARM_cpsr & 0xf) == 0) | 134 | (((regs)->ARM_cpsr & 0xf) == 0) |
137 | 135 | ||
diff --git a/arch/arm/include/asm/smp_scu.h b/arch/arm/include/asm/smp_scu.h index 2376835015d6..4eb6d005ffaa 100644 --- a/arch/arm/include/asm/smp_scu.h +++ b/arch/arm/include/asm/smp_scu.h | |||
@@ -1,7 +1,14 @@ | |||
1 | #ifndef __ASMARM_ARCH_SCU_H | 1 | #ifndef __ASMARM_ARCH_SCU_H |
2 | #define __ASMARM_ARCH_SCU_H | 2 | #define __ASMARM_ARCH_SCU_H |
3 | 3 | ||
4 | #define SCU_PM_NORMAL 0 | ||
5 | #define SCU_PM_DORMANT 2 | ||
6 | #define SCU_PM_POWEROFF 3 | ||
7 | |||
8 | #ifndef __ASSEMBLER__ | ||
4 | unsigned int scu_get_core_count(void __iomem *); | 9 | unsigned int scu_get_core_count(void __iomem *); |
5 | void scu_enable(void __iomem *); | 10 | void scu_enable(void __iomem *); |
11 | int scu_power_mode(void __iomem *, unsigned int); | ||
12 | #endif | ||
6 | 13 | ||
7 | #endif | 14 | #endif |
diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h index 17eb355707dd..fdd3820edff8 100644 --- a/arch/arm/include/asm/spinlock.h +++ b/arch/arm/include/asm/spinlock.h | |||
@@ -5,17 +5,52 @@ | |||
5 | #error SMP not supported on pre-ARMv6 CPUs | 5 | #error SMP not supported on pre-ARMv6 CPUs |
6 | #endif | 6 | #endif |
7 | 7 | ||
8 | /* | ||
9 | * sev and wfe are ARMv6K extensions. Uniprocessor ARMv6 may not have the K | ||
10 | * extensions, so when running on UP, we have to patch these instructions away. | ||
11 | */ | ||
12 | #define ALT_SMP(smp, up) \ | ||
13 | "9998: " smp "\n" \ | ||
14 | " .pushsection \".alt.smp.init\", \"a\"\n" \ | ||
15 | " .long 9998b\n" \ | ||
16 | " " up "\n" \ | ||
17 | " .popsection\n" | ||
18 | |||
19 | #ifdef CONFIG_THUMB2_KERNEL | ||
20 | #define SEV ALT_SMP("sev.w", "nop.w") | ||
21 | /* | ||
22 | * For Thumb-2, special care is needed to ensure that the conditional WFE | ||
23 | * instruction really does assemble to exactly 4 bytes (as required by | ||
24 | * the SMP_ON_UP fixup code). By itself "wfene" might cause the | ||
25 | * assembler to insert a extra (16-bit) IT instruction, depending on the | ||
26 | * presence or absence of neighbouring conditional instructions. | ||
27 | * | ||
28 | * To avoid this unpredictableness, an approprite IT is inserted explicitly: | ||
29 | * the assembler won't change IT instructions which are explicitly present | ||
30 | * in the input. | ||
31 | */ | ||
32 | #define WFE(cond) ALT_SMP( \ | ||
33 | "it " cond "\n\t" \ | ||
34 | "wfe" cond ".n", \ | ||
35 | \ | ||
36 | "nop.w" \ | ||
37 | ) | ||
38 | #else | ||
39 | #define SEV ALT_SMP("sev", "nop") | ||
40 | #define WFE(cond) ALT_SMP("wfe" cond, "nop") | ||
41 | #endif | ||
42 | |||
8 | static inline void dsb_sev(void) | 43 | static inline void dsb_sev(void) |
9 | { | 44 | { |
10 | #if __LINUX_ARM_ARCH__ >= 7 | 45 | #if __LINUX_ARM_ARCH__ >= 7 |
11 | __asm__ __volatile__ ( | 46 | __asm__ __volatile__ ( |
12 | "dsb\n" | 47 | "dsb\n" |
13 | "sev" | 48 | SEV |
14 | ); | 49 | ); |
15 | #elif defined(CONFIG_CPU_32v6K) | 50 | #else |
16 | __asm__ __volatile__ ( | 51 | __asm__ __volatile__ ( |
17 | "mcr p15, 0, %0, c7, c10, 4\n" | 52 | "mcr p15, 0, %0, c7, c10, 4\n" |
18 | "sev" | 53 | SEV |
19 | : : "r" (0) | 54 | : : "r" (0) |
20 | ); | 55 | ); |
21 | #endif | 56 | #endif |
@@ -46,9 +81,7 @@ static inline void arch_spin_lock(arch_spinlock_t *lock) | |||
46 | __asm__ __volatile__( | 81 | __asm__ __volatile__( |
47 | "1: ldrex %0, [%1]\n" | 82 | "1: ldrex %0, [%1]\n" |
48 | " teq %0, #0\n" | 83 | " teq %0, #0\n" |
49 | #ifdef CONFIG_CPU_32v6K | 84 | WFE("ne") |
50 | " wfene\n" | ||
51 | #endif | ||
52 | " strexeq %0, %2, [%1]\n" | 85 | " strexeq %0, %2, [%1]\n" |
53 | " teqeq %0, #0\n" | 86 | " teqeq %0, #0\n" |
54 | " bne 1b" | 87 | " bne 1b" |
@@ -107,9 +140,7 @@ static inline void arch_write_lock(arch_rwlock_t *rw) | |||
107 | __asm__ __volatile__( | 140 | __asm__ __volatile__( |
108 | "1: ldrex %0, [%1]\n" | 141 | "1: ldrex %0, [%1]\n" |
109 | " teq %0, #0\n" | 142 | " teq %0, #0\n" |
110 | #ifdef CONFIG_CPU_32v6K | 143 | WFE("ne") |
111 | " wfene\n" | ||
112 | #endif | ||
113 | " strexeq %0, %2, [%1]\n" | 144 | " strexeq %0, %2, [%1]\n" |
114 | " teq %0, #0\n" | 145 | " teq %0, #0\n" |
115 | " bne 1b" | 146 | " bne 1b" |
@@ -176,9 +207,7 @@ static inline void arch_read_lock(arch_rwlock_t *rw) | |||
176 | "1: ldrex %0, [%2]\n" | 207 | "1: ldrex %0, [%2]\n" |
177 | " adds %0, %0, #1\n" | 208 | " adds %0, %0, #1\n" |
178 | " strexpl %1, %0, [%2]\n" | 209 | " strexpl %1, %0, [%2]\n" |
179 | #ifdef CONFIG_CPU_32v6K | 210 | WFE("mi") |
180 | " wfemi\n" | ||
181 | #endif | ||
182 | " rsbpls %0, %1, #0\n" | 211 | " rsbpls %0, %1, #0\n" |
183 | " bmi 1b" | 212 | " bmi 1b" |
184 | : "=&r" (tmp), "=&r" (tmp2) | 213 | : "=&r" (tmp), "=&r" (tmp2) |
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 97f6d60297d5..9a87823642d0 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
@@ -347,6 +347,7 @@ void cpu_idle_wait(void); | |||
347 | #include <asm-generic/cmpxchg-local.h> | 347 | #include <asm-generic/cmpxchg-local.h> |
348 | 348 | ||
349 | #if __LINUX_ARM_ARCH__ < 6 | 349 | #if __LINUX_ARM_ARCH__ < 6 |
350 | /* min ARCH < ARMv6 */ | ||
350 | 351 | ||
351 | #ifdef CONFIG_SMP | 352 | #ifdef CONFIG_SMP |
352 | #error "SMP is not supported on this platform" | 353 | #error "SMP is not supported on this platform" |
@@ -365,7 +366,7 @@ void cpu_idle_wait(void); | |||
365 | #include <asm-generic/cmpxchg.h> | 366 | #include <asm-generic/cmpxchg.h> |
366 | #endif | 367 | #endif |
367 | 368 | ||
368 | #else /* __LINUX_ARM_ARCH__ >= 6 */ | 369 | #else /* min ARCH >= ARMv6 */ |
369 | 370 | ||
370 | extern void __bad_cmpxchg(volatile void *ptr, int size); | 371 | extern void __bad_cmpxchg(volatile void *ptr, int size); |
371 | 372 | ||
@@ -379,7 +380,7 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, | |||
379 | unsigned long oldval, res; | 380 | unsigned long oldval, res; |
380 | 381 | ||
381 | switch (size) { | 382 | switch (size) { |
382 | #ifdef CONFIG_CPU_32v6K | 383 | #ifndef CONFIG_CPU_V6 /* min ARCH >= ARMv6K */ |
383 | case 1: | 384 | case 1: |
384 | do { | 385 | do { |
385 | asm volatile("@ __cmpxchg1\n" | 386 | asm volatile("@ __cmpxchg1\n" |
@@ -404,7 +405,7 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, | |||
404 | : "memory", "cc"); | 405 | : "memory", "cc"); |
405 | } while (res); | 406 | } while (res); |
406 | break; | 407 | break; |
407 | #endif /* CONFIG_CPU_32v6K */ | 408 | #endif |
408 | case 4: | 409 | case 4: |
409 | do { | 410 | do { |
410 | asm volatile("@ __cmpxchg4\n" | 411 | asm volatile("@ __cmpxchg4\n" |
@@ -450,12 +451,12 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr, | |||
450 | unsigned long ret; | 451 | unsigned long ret; |
451 | 452 | ||
452 | switch (size) { | 453 | switch (size) { |
453 | #ifndef CONFIG_CPU_32v6K | 454 | #ifdef CONFIG_CPU_V6 /* min ARCH == ARMv6 */ |
454 | case 1: | 455 | case 1: |
455 | case 2: | 456 | case 2: |
456 | ret = __cmpxchg_local_generic(ptr, old, new, size); | 457 | ret = __cmpxchg_local_generic(ptr, old, new, size); |
457 | break; | 458 | break; |
458 | #endif /* !CONFIG_CPU_32v6K */ | 459 | #endif |
459 | default: | 460 | default: |
460 | ret = __cmpxchg(ptr, old, new, size); | 461 | ret = __cmpxchg(ptr, old, new, size); |
461 | } | 462 | } |
@@ -469,7 +470,7 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr, | |||
469 | (unsigned long)(n), \ | 470 | (unsigned long)(n), \ |
470 | sizeof(*(ptr)))) | 471 | sizeof(*(ptr)))) |
471 | 472 | ||
472 | #ifdef CONFIG_CPU_32v6K | 473 | #ifndef CONFIG_CPU_V6 /* min ARCH >= ARMv6K */ |
473 | 474 | ||
474 | /* | 475 | /* |
475 | * Note : ARMv7-M (currently unsupported by Linux) does not support | 476 | * Note : ARMv7-M (currently unsupported by Linux) does not support |
@@ -524,11 +525,11 @@ static inline unsigned long long __cmpxchg64_mb(volatile void *ptr, | |||
524 | (unsigned long long)(o), \ | 525 | (unsigned long long)(o), \ |
525 | (unsigned long long)(n))) | 526 | (unsigned long long)(n))) |
526 | 527 | ||
527 | #else /* !CONFIG_CPU_32v6K */ | 528 | #else /* min ARCH = ARMv6 */ |
528 | 529 | ||
529 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) | 530 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) |
530 | 531 | ||
531 | #endif /* CONFIG_CPU_32v6K */ | 532 | #endif |
532 | 533 | ||
533 | #endif /* __LINUX_ARM_ARCH__ >= 6 */ | 534 | #endif /* __LINUX_ARM_ARCH__ >= 6 */ |
534 | 535 | ||
diff --git a/arch/arm/include/asm/tls.h b/arch/arm/include/asm/tls.h index e71d6ff8d104..60843eb0f61c 100644 --- a/arch/arm/include/asm/tls.h +++ b/arch/arm/include/asm/tls.h | |||
@@ -28,15 +28,14 @@ | |||
28 | #define tls_emu 1 | 28 | #define tls_emu 1 |
29 | #define has_tls_reg 1 | 29 | #define has_tls_reg 1 |
30 | #define set_tls set_tls_none | 30 | #define set_tls set_tls_none |
31 | #elif __LINUX_ARM_ARCH__ >= 7 || \ | 31 | #elif defined(CONFIG_CPU_V6) |
32 | (__LINUX_ARM_ARCH__ == 6 && defined(CONFIG_CPU_32v6K)) | ||
33 | #define tls_emu 0 | ||
34 | #define has_tls_reg 1 | ||
35 | #define set_tls set_tls_v6k | ||
36 | #elif __LINUX_ARM_ARCH__ == 6 | ||
37 | #define tls_emu 0 | 32 | #define tls_emu 0 |
38 | #define has_tls_reg (elf_hwcap & HWCAP_TLS) | 33 | #define has_tls_reg (elf_hwcap & HWCAP_TLS) |
39 | #define set_tls set_tls_v6 | 34 | #define set_tls set_tls_v6 |
35 | #elif defined(CONFIG_CPU_32v6K) | ||
36 | #define tls_emu 0 | ||
37 | #define has_tls_reg 1 | ||
38 | #define set_tls set_tls_v6k | ||
40 | #else | 39 | #else |
41 | #define tls_emu 0 | 40 | #define tls_emu 0 |
42 | #define has_tls_reg 0 | 41 | #define has_tls_reg 0 |
diff --git a/arch/arm/include/asm/traps.h b/arch/arm/include/asm/traps.h index 1b960d5ef6a5..f90756dc16dc 100644 --- a/arch/arm/include/asm/traps.h +++ b/arch/arm/include/asm/traps.h | |||
@@ -45,6 +45,7 @@ static inline int in_exception_text(unsigned long ptr) | |||
45 | 45 | ||
46 | extern void __init early_trap_init(void); | 46 | extern void __init early_trap_init(void); |
47 | extern void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame); | 47 | extern void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame); |
48 | extern void ptrace_break(struct task_struct *tsk, struct pt_regs *regs); | ||
48 | 49 | ||
49 | extern void *vectors_page; | 50 | extern void *vectors_page; |
50 | 51 | ||
diff --git a/arch/arm/include/asm/user.h b/arch/arm/include/asm/user.h index 05ac4b06876a..35917b3a97f9 100644 --- a/arch/arm/include/asm/user.h +++ b/arch/arm/include/asm/user.h | |||
@@ -71,7 +71,7 @@ struct user{ | |||
71 | /* the registers. */ | 71 | /* the registers. */ |
72 | unsigned long magic; /* To uniquely identify a core file */ | 72 | unsigned long magic; /* To uniquely identify a core file */ |
73 | char u_comm[32]; /* User command that was responsible */ | 73 | char u_comm[32]; /* User command that was responsible */ |
74 | int u_debugreg[8]; | 74 | int u_debugreg[8]; /* No longer used */ |
75 | struct user_fp u_fp; /* FP state */ | 75 | struct user_fp u_fp; /* FP state */ |
76 | struct user_fp_struct * u_fp0;/* Used by gdb to help find the values for */ | 76 | struct user_fp_struct * u_fp0;/* Used by gdb to help find the values for */ |
77 | /* the FP registers. */ | 77 | /* the FP registers. */ |
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 185ee822c935..74554f1742d7 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
@@ -29,6 +29,7 @@ obj-$(CONFIG_MODULES) += armksyms.o module.o | |||
29 | obj-$(CONFIG_ARTHUR) += arthur.o | 29 | obj-$(CONFIG_ARTHUR) += arthur.o |
30 | obj-$(CONFIG_ISA_DMA) += dma-isa.o | 30 | obj-$(CONFIG_ISA_DMA) += dma-isa.o |
31 | obj-$(CONFIG_PCI) += bios32.o isa.o | 31 | obj-$(CONFIG_PCI) += bios32.o isa.o |
32 | obj-$(CONFIG_PM) += sleep.o | ||
32 | obj-$(CONFIG_HAVE_SCHED_CLOCK) += sched_clock.o | 33 | obj-$(CONFIG_HAVE_SCHED_CLOCK) += sched_clock.o |
33 | obj-$(CONFIG_SMP) += smp.o smp_tlb.o | 34 | obj-$(CONFIG_SMP) += smp.o smp_tlb.o |
34 | obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o | 35 | obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o |
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index e5e1e5387678..acca35aebe28 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
@@ -140,24 +140,18 @@ EXPORT_SYMBOL(__aeabi_ulcmp); | |||
140 | #endif | 140 | #endif |
141 | 141 | ||
142 | /* bitops */ | 142 | /* bitops */ |
143 | EXPORT_SYMBOL(_set_bit_le); | 143 | EXPORT_SYMBOL(_set_bit); |
144 | EXPORT_SYMBOL(_test_and_set_bit_le); | 144 | EXPORT_SYMBOL(_test_and_set_bit); |
145 | EXPORT_SYMBOL(_clear_bit_le); | 145 | EXPORT_SYMBOL(_clear_bit); |
146 | EXPORT_SYMBOL(_test_and_clear_bit_le); | 146 | EXPORT_SYMBOL(_test_and_clear_bit); |
147 | EXPORT_SYMBOL(_change_bit_le); | 147 | EXPORT_SYMBOL(_change_bit); |
148 | EXPORT_SYMBOL(_test_and_change_bit_le); | 148 | EXPORT_SYMBOL(_test_and_change_bit); |
149 | EXPORT_SYMBOL(_find_first_zero_bit_le); | 149 | EXPORT_SYMBOL(_find_first_zero_bit_le); |
150 | EXPORT_SYMBOL(_find_next_zero_bit_le); | 150 | EXPORT_SYMBOL(_find_next_zero_bit_le); |
151 | EXPORT_SYMBOL(_find_first_bit_le); | 151 | EXPORT_SYMBOL(_find_first_bit_le); |
152 | EXPORT_SYMBOL(_find_next_bit_le); | 152 | EXPORT_SYMBOL(_find_next_bit_le); |
153 | 153 | ||
154 | #ifdef __ARMEB__ | 154 | #ifdef __ARMEB__ |
155 | EXPORT_SYMBOL(_set_bit_be); | ||
156 | EXPORT_SYMBOL(_test_and_set_bit_be); | ||
157 | EXPORT_SYMBOL(_clear_bit_be); | ||
158 | EXPORT_SYMBOL(_test_and_clear_bit_be); | ||
159 | EXPORT_SYMBOL(_change_bit_be); | ||
160 | EXPORT_SYMBOL(_test_and_change_bit_be); | ||
161 | EXPORT_SYMBOL(_find_first_zero_bit_be); | 155 | EXPORT_SYMBOL(_find_first_zero_bit_be); |
162 | EXPORT_SYMBOL(_find_next_zero_bit_be); | 156 | EXPORT_SYMBOL(_find_next_zero_bit_be); |
163 | EXPORT_SYMBOL(_find_first_bit_be); | 157 | EXPORT_SYMBOL(_find_first_bit_be); |
@@ -170,3 +164,7 @@ EXPORT_SYMBOL(mcount); | |||
170 | #endif | 164 | #endif |
171 | EXPORT_SYMBOL(__gnu_mcount_nc); | 165 | EXPORT_SYMBOL(__gnu_mcount_nc); |
172 | #endif | 166 | #endif |
167 | |||
168 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT | ||
169 | EXPORT_SYMBOL(__pv_phys_offset); | ||
170 | #endif | ||
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index 82da66172132..927522cfc12e 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c | |||
@@ -13,6 +13,9 @@ | |||
13 | #include <linux/sched.h> | 13 | #include <linux/sched.h> |
14 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
15 | #include <linux/dma-mapping.h> | 15 | #include <linux/dma-mapping.h> |
16 | #include <asm/cacheflush.h> | ||
17 | #include <asm/glue-df.h> | ||
18 | #include <asm/glue-pf.h> | ||
16 | #include <asm/mach/arch.h> | 19 | #include <asm/mach/arch.h> |
17 | #include <asm/thread_info.h> | 20 | #include <asm/thread_info.h> |
18 | #include <asm/memory.h> | 21 | #include <asm/memory.h> |
@@ -114,6 +117,14 @@ int main(void) | |||
114 | #ifdef MULTI_PABORT | 117 | #ifdef MULTI_PABORT |
115 | DEFINE(PROCESSOR_PABT_FUNC, offsetof(struct processor, _prefetch_abort)); | 118 | DEFINE(PROCESSOR_PABT_FUNC, offsetof(struct processor, _prefetch_abort)); |
116 | #endif | 119 | #endif |
120 | #ifdef MULTI_CPU | ||
121 | DEFINE(CPU_SLEEP_SIZE, offsetof(struct processor, suspend_size)); | ||
122 | DEFINE(CPU_DO_SUSPEND, offsetof(struct processor, do_suspend)); | ||
123 | DEFINE(CPU_DO_RESUME, offsetof(struct processor, do_resume)); | ||
124 | #endif | ||
125 | #ifdef MULTI_CACHE | ||
126 | DEFINE(CACHE_FLUSH_KERN_ALL, offsetof(struct cpu_cache_fns, flush_kern_all)); | ||
127 | #endif | ||
117 | BLANK(); | 128 | BLANK(); |
118 | DEFINE(DMA_BIDIRECTIONAL, DMA_BIDIRECTIONAL); | 129 | DEFINE(DMA_BIDIRECTIONAL, DMA_BIDIRECTIONAL); |
119 | DEFINE(DMA_TO_DEVICE, DMA_TO_DEVICE); | 130 | DEFINE(DMA_TO_DEVICE, DMA_TO_DEVICE); |
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index c6273a3bfc25..d86fcd44b220 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c | |||
@@ -583,6 +583,11 @@ void __init pci_common_init(struct hw_pci *hw) | |||
583 | * Assign resources. | 583 | * Assign resources. |
584 | */ | 584 | */ |
585 | pci_bus_assign_resources(bus); | 585 | pci_bus_assign_resources(bus); |
586 | |||
587 | /* | ||
588 | * Enable bridges | ||
589 | */ | ||
590 | pci_enable_bridges(bus); | ||
586 | } | 591 | } |
587 | 592 | ||
588 | /* | 593 | /* |
diff --git a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S index a0f07521ca8a..d2d983be096d 100644 --- a/arch/arm/kernel/debug.S +++ b/arch/arm/kernel/debug.S | |||
@@ -25,7 +25,7 @@ | |||
25 | .macro addruart, rp, rv | 25 | .macro addruart, rp, rv |
26 | .endm | 26 | .endm |
27 | 27 | ||
28 | #if defined(CONFIG_CPU_V6) | 28 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) |
29 | 29 | ||
30 | .macro senduart, rd, rx | 30 | .macro senduart, rd, rx |
31 | mcr p14, 0, \rd, c0, c5, 0 | 31 | mcr p14, 0, \rd, c0, c5, 0 |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 2b46fea36c9f..e8d885676807 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -16,7 +16,8 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <asm/memory.h> | 18 | #include <asm/memory.h> |
19 | #include <asm/glue.h> | 19 | #include <asm/glue-df.h> |
20 | #include <asm/glue-pf.h> | ||
20 | #include <asm/vfpmacros.h> | 21 | #include <asm/vfpmacros.h> |
21 | #include <mach/entry-macro.S> | 22 | #include <mach/entry-macro.S> |
22 | #include <asm/thread_notify.h> | 23 | #include <asm/thread_notify.h> |
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index ae9464900168..051166c2a932 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S | |||
@@ -76,13 +76,13 @@ | |||
76 | #ifndef CONFIG_THUMB2_KERNEL | 76 | #ifndef CONFIG_THUMB2_KERNEL |
77 | .macro svc_exit, rpsr | 77 | .macro svc_exit, rpsr |
78 | msr spsr_cxsf, \rpsr | 78 | msr spsr_cxsf, \rpsr |
79 | #if defined(CONFIG_CPU_32v6K) | 79 | #if defined(CONFIG_CPU_V6) |
80 | clrex @ clear the exclusive monitor | ||
81 | ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr | ||
82 | #elif defined (CONFIG_CPU_V6) | ||
83 | ldr r0, [sp] | 80 | ldr r0, [sp] |
84 | strex r1, r2, [sp] @ clear the exclusive monitor | 81 | strex r1, r2, [sp] @ clear the exclusive monitor |
85 | ldmib sp, {r1 - pc}^ @ load r1 - pc, cpsr | 82 | ldmib sp, {r1 - pc}^ @ load r1 - pc, cpsr |
83 | #elif defined(CONFIG_CPU_32v6K) | ||
84 | clrex @ clear the exclusive monitor | ||
85 | ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr | ||
86 | #else | 86 | #else |
87 | ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr | 87 | ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr |
88 | #endif | 88 | #endif |
@@ -92,10 +92,10 @@ | |||
92 | ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr | 92 | ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr |
93 | ldr lr, [sp, #\offset + S_PC]! @ get pc | 93 | ldr lr, [sp, #\offset + S_PC]! @ get pc |
94 | msr spsr_cxsf, r1 @ save in spsr_svc | 94 | msr spsr_cxsf, r1 @ save in spsr_svc |
95 | #if defined(CONFIG_CPU_32v6K) | 95 | #if defined(CONFIG_CPU_V6) |
96 | clrex @ clear the exclusive monitor | ||
97 | #elif defined (CONFIG_CPU_V6) | ||
98 | strex r1, r2, [sp] @ clear the exclusive monitor | 96 | strex r1, r2, [sp] @ clear the exclusive monitor |
97 | #elif defined(CONFIG_CPU_32v6K) | ||
98 | clrex @ clear the exclusive monitor | ||
99 | #endif | 99 | #endif |
100 | .if \fast | 100 | .if \fast |
101 | ldmdb sp, {r1 - lr}^ @ get calling r1 - lr | 101 | ldmdb sp, {r1 - lr}^ @ get calling r1 - lr |
diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S index 8f57515bbdb0..c84b57d27d07 100644 --- a/arch/arm/kernel/head-common.S +++ b/arch/arm/kernel/head-common.S | |||
@@ -25,83 +25,6 @@ | |||
25 | * machine ID for example). | 25 | * machine ID for example). |
26 | */ | 26 | */ |
27 | __HEAD | 27 | __HEAD |
28 | __error_a: | ||
29 | #ifdef CONFIG_DEBUG_LL | ||
30 | mov r4, r1 @ preserve machine ID | ||
31 | adr r0, str_a1 | ||
32 | bl printascii | ||
33 | mov r0, r4 | ||
34 | bl printhex8 | ||
35 | adr r0, str_a2 | ||
36 | bl printascii | ||
37 | adr r3, __lookup_machine_type_data | ||
38 | ldmia r3, {r4, r5, r6} @ get machine desc list | ||
39 | sub r4, r3, r4 @ get offset between virt&phys | ||
40 | add r5, r5, r4 @ convert virt addresses to | ||
41 | add r6, r6, r4 @ physical address space | ||
42 | 1: ldr r0, [r5, #MACHINFO_TYPE] @ get machine type | ||
43 | bl printhex8 | ||
44 | mov r0, #'\t' | ||
45 | bl printch | ||
46 | ldr r0, [r5, #MACHINFO_NAME] @ get machine name | ||
47 | add r0, r0, r4 | ||
48 | bl printascii | ||
49 | mov r0, #'\n' | ||
50 | bl printch | ||
51 | add r5, r5, #SIZEOF_MACHINE_DESC @ next machine_desc | ||
52 | cmp r5, r6 | ||
53 | blo 1b | ||
54 | adr r0, str_a3 | ||
55 | bl printascii | ||
56 | b __error | ||
57 | ENDPROC(__error_a) | ||
58 | |||
59 | str_a1: .asciz "\nError: unrecognized/unsupported machine ID (r1 = 0x" | ||
60 | str_a2: .asciz ").\n\nAvailable machine support:\n\nID (hex)\tNAME\n" | ||
61 | str_a3: .asciz "\nPlease check your kernel config and/or bootloader.\n" | ||
62 | .align | ||
63 | #else | ||
64 | b __error | ||
65 | #endif | ||
66 | |||
67 | /* | ||
68 | * Lookup machine architecture in the linker-build list of architectures. | ||
69 | * Note that we can't use the absolute addresses for the __arch_info | ||
70 | * lists since we aren't running with the MMU on (and therefore, we are | ||
71 | * not in the correct address space). We have to calculate the offset. | ||
72 | * | ||
73 | * r1 = machine architecture number | ||
74 | * Returns: | ||
75 | * r3, r4, r6 corrupted | ||
76 | * r5 = mach_info pointer in physical address space | ||
77 | */ | ||
78 | __lookup_machine_type: | ||
79 | adr r3, __lookup_machine_type_data | ||
80 | ldmia r3, {r4, r5, r6} | ||
81 | sub r3, r3, r4 @ get offset between virt&phys | ||
82 | add r5, r5, r3 @ convert virt addresses to | ||
83 | add r6, r6, r3 @ physical address space | ||
84 | 1: ldr r3, [r5, #MACHINFO_TYPE] @ get machine type | ||
85 | teq r3, r1 @ matches loader number? | ||
86 | beq 2f @ found | ||
87 | add r5, r5, #SIZEOF_MACHINE_DESC @ next machine_desc | ||
88 | cmp r5, r6 | ||
89 | blo 1b | ||
90 | mov r5, #0 @ unknown machine | ||
91 | 2: mov pc, lr | ||
92 | ENDPROC(__lookup_machine_type) | ||
93 | |||
94 | /* | ||
95 | * Look in arch/arm/kernel/arch.[ch] for information about the | ||
96 | * __arch_info structures. | ||
97 | */ | ||
98 | .align 2 | ||
99 | .type __lookup_machine_type_data, %object | ||
100 | __lookup_machine_type_data: | ||
101 | .long . | ||
102 | .long __arch_info_begin | ||
103 | .long __arch_info_end | ||
104 | .size __lookup_machine_type_data, . - __lookup_machine_type_data | ||
105 | 28 | ||
106 | /* Determine validity of the r2 atags pointer. The heuristic requires | 29 | /* Determine validity of the r2 atags pointer. The heuristic requires |
107 | * that the pointer be aligned, in the first 16k of physical RAM and | 30 | * that the pointer be aligned, in the first 16k of physical RAM and |
@@ -109,8 +32,6 @@ __lookup_machine_type_data: | |||
109 | * of this function may be more lenient with the physical address and | 32 | * of this function may be more lenient with the physical address and |
110 | * may also be able to move the ATAGS block if necessary. | 33 | * may also be able to move the ATAGS block if necessary. |
111 | * | 34 | * |
112 | * r8 = machinfo | ||
113 | * | ||
114 | * Returns: | 35 | * Returns: |
115 | * r2 either valid atags pointer, or zero | 36 | * r2 either valid atags pointer, or zero |
116 | * r5, r6 corrupted | 37 | * r5, r6 corrupted |
@@ -185,17 +106,6 @@ __mmap_switched_data: | |||
185 | .size __mmap_switched_data, . - __mmap_switched_data | 106 | .size __mmap_switched_data, . - __mmap_switched_data |
186 | 107 | ||
187 | /* | 108 | /* |
188 | * This provides a C-API version of __lookup_machine_type | ||
189 | */ | ||
190 | ENTRY(lookup_machine_type) | ||
191 | stmfd sp!, {r4 - r6, lr} | ||
192 | mov r1, r0 | ||
193 | bl __lookup_machine_type | ||
194 | mov r0, r5 | ||
195 | ldmfd sp!, {r4 - r6, pc} | ||
196 | ENDPROC(lookup_machine_type) | ||
197 | |||
198 | /* | ||
199 | * This provides a C-API version of __lookup_processor_type | 109 | * This provides a C-API version of __lookup_processor_type |
200 | */ | 110 | */ |
201 | ENTRY(lookup_processor_type) | 111 | ENTRY(lookup_processor_type) |
diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index 814ce1a73270..6b1e0ad9ec3b 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S | |||
@@ -44,9 +44,6 @@ ENTRY(stext) | |||
44 | bl __lookup_processor_type @ r5=procinfo r9=cpuid | 44 | bl __lookup_processor_type @ r5=procinfo r9=cpuid |
45 | movs r10, r5 @ invalid processor (r5=0)? | 45 | movs r10, r5 @ invalid processor (r5=0)? |
46 | beq __error_p @ yes, error 'p' | 46 | beq __error_p @ yes, error 'p' |
47 | bl __lookup_machine_type @ r5=machinfo | ||
48 | movs r8, r5 @ invalid machine (r5=0)? | ||
49 | beq __error_a @ yes, error 'a' | ||
50 | 47 | ||
51 | adr lr, BSYM(__after_proc_init) @ return (PIC) address | 48 | adr lr, BSYM(__after_proc_init) @ return (PIC) address |
52 | ARM( add pc, r10, #PROCINFO_INITFUNC ) | 49 | ARM( add pc, r10, #PROCINFO_INITFUNC ) |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index f06ff9feb0db..c9173cfbbc74 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -26,14 +26,6 @@ | |||
26 | #include <mach/debug-macro.S> | 26 | #include <mach/debug-macro.S> |
27 | #endif | 27 | #endif |
28 | 28 | ||
29 | #if (PHYS_OFFSET & 0x001fffff) | ||
30 | #error "PHYS_OFFSET must be at an even 2MiB boundary!" | ||
31 | #endif | ||
32 | |||
33 | #define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET) | ||
34 | #define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET) | ||
35 | |||
36 | |||
37 | /* | 29 | /* |
38 | * swapper_pg_dir is the virtual address of the initial page table. | 30 | * swapper_pg_dir is the virtual address of the initial page table. |
39 | * We place the page tables 16K below KERNEL_RAM_VADDR. Therefore, we must | 31 | * We place the page tables 16K below KERNEL_RAM_VADDR. Therefore, we must |
@@ -41,6 +33,7 @@ | |||
41 | * the least significant 16 bits to be 0x8000, but we could probably | 33 | * the least significant 16 bits to be 0x8000, but we could probably |
42 | * relax this restriction to KERNEL_RAM_VADDR >= PAGE_OFFSET + 0x4000. | 34 | * relax this restriction to KERNEL_RAM_VADDR >= PAGE_OFFSET + 0x4000. |
43 | */ | 35 | */ |
36 | #define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET) | ||
44 | #if (KERNEL_RAM_VADDR & 0xffff) != 0x8000 | 37 | #if (KERNEL_RAM_VADDR & 0xffff) != 0x8000 |
45 | #error KERNEL_RAM_VADDR must start at 0xXXXX8000 | 38 | #error KERNEL_RAM_VADDR must start at 0xXXXX8000 |
46 | #endif | 39 | #endif |
@@ -48,8 +41,8 @@ | |||
48 | .globl swapper_pg_dir | 41 | .globl swapper_pg_dir |
49 | .equ swapper_pg_dir, KERNEL_RAM_VADDR - 0x4000 | 42 | .equ swapper_pg_dir, KERNEL_RAM_VADDR - 0x4000 |
50 | 43 | ||
51 | .macro pgtbl, rd | 44 | .macro pgtbl, rd, phys |
52 | ldr \rd, =(KERNEL_RAM_PADDR - 0x4000) | 45 | add \rd, \phys, #TEXT_OFFSET - 0x4000 |
53 | .endm | 46 | .endm |
54 | 47 | ||
55 | #ifdef CONFIG_XIP_KERNEL | 48 | #ifdef CONFIG_XIP_KERNEL |
@@ -87,25 +80,33 @@ ENTRY(stext) | |||
87 | movs r10, r5 @ invalid processor (r5=0)? | 80 | movs r10, r5 @ invalid processor (r5=0)? |
88 | THUMB( it eq ) @ force fixup-able long branch encoding | 81 | THUMB( it eq ) @ force fixup-able long branch encoding |
89 | beq __error_p @ yes, error 'p' | 82 | beq __error_p @ yes, error 'p' |
90 | bl __lookup_machine_type @ r5=machinfo | 83 | |
91 | movs r8, r5 @ invalid machine (r5=0)? | 84 | #ifndef CONFIG_XIP_KERNEL |
92 | THUMB( it eq ) @ force fixup-able long branch encoding | 85 | adr r3, 2f |
93 | beq __error_a @ yes, error 'a' | 86 | ldmia r3, {r4, r8} |
87 | sub r4, r3, r4 @ (PHYS_OFFSET - PAGE_OFFSET) | ||
88 | add r8, r8, r4 @ PHYS_OFFSET | ||
89 | #else | ||
90 | ldr r8, =PLAT_PHYS_OFFSET | ||
91 | #endif | ||
94 | 92 | ||
95 | /* | 93 | /* |
96 | * r1 = machine no, r2 = atags, | 94 | * r1 = machine no, r2 = atags, |
97 | * r8 = machinfo, r9 = cpuid, r10 = procinfo | 95 | * r8 = phys_offset, r9 = cpuid, r10 = procinfo |
98 | */ | 96 | */ |
99 | bl __vet_atags | 97 | bl __vet_atags |
100 | #ifdef CONFIG_SMP_ON_UP | 98 | #ifdef CONFIG_SMP_ON_UP |
101 | bl __fixup_smp | 99 | bl __fixup_smp |
102 | #endif | 100 | #endif |
101 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT | ||
102 | bl __fixup_pv_table | ||
103 | #endif | ||
103 | bl __create_page_tables | 104 | bl __create_page_tables |
104 | 105 | ||
105 | /* | 106 | /* |
106 | * The following calls CPU specific code in a position independent | 107 | * The following calls CPU specific code in a position independent |
107 | * manner. See arch/arm/mm/proc-*.S for details. r10 = base of | 108 | * manner. See arch/arm/mm/proc-*.S for details. r10 = base of |
108 | * xxx_proc_info structure selected by __lookup_machine_type | 109 | * xxx_proc_info structure selected by __lookup_processor_type |
109 | * above. On return, the CPU will be ready for the MMU to be | 110 | * above. On return, the CPU will be ready for the MMU to be |
110 | * turned on, and r0 will hold the CPU control register value. | 111 | * turned on, and r0 will hold the CPU control register value. |
111 | */ | 112 | */ |
@@ -118,22 +119,24 @@ ENTRY(stext) | |||
118 | 1: b __enable_mmu | 119 | 1: b __enable_mmu |
119 | ENDPROC(stext) | 120 | ENDPROC(stext) |
120 | .ltorg | 121 | .ltorg |
122 | #ifndef CONFIG_XIP_KERNEL | ||
123 | 2: .long . | ||
124 | .long PAGE_OFFSET | ||
125 | #endif | ||
121 | 126 | ||
122 | /* | 127 | /* |
123 | * Setup the initial page tables. We only setup the barest | 128 | * Setup the initial page tables. We only setup the barest |
124 | * amount which are required to get the kernel running, which | 129 | * amount which are required to get the kernel running, which |
125 | * generally means mapping in the kernel code. | 130 | * generally means mapping in the kernel code. |
126 | * | 131 | * |
127 | * r8 = machinfo | 132 | * r8 = phys_offset, r9 = cpuid, r10 = procinfo |
128 | * r9 = cpuid | ||
129 | * r10 = procinfo | ||
130 | * | 133 | * |
131 | * Returns: | 134 | * Returns: |
132 | * r0, r3, r5-r7 corrupted | 135 | * r0, r3, r5-r7 corrupted |
133 | * r4 = physical page table address | 136 | * r4 = physical page table address |
134 | */ | 137 | */ |
135 | __create_page_tables: | 138 | __create_page_tables: |
136 | pgtbl r4 @ page table address | 139 | pgtbl r4, r8 @ page table address |
137 | 140 | ||
138 | /* | 141 | /* |
139 | * Clear the 16K level 1 swapper page table | 142 | * Clear the 16K level 1 swapper page table |
@@ -189,10 +192,8 @@ __create_page_tables: | |||
189 | /* | 192 | /* |
190 | * Map some ram to cover our .data and .bss areas. | 193 | * Map some ram to cover our .data and .bss areas. |
191 | */ | 194 | */ |
192 | orr r3, r7, #(KERNEL_RAM_PADDR & 0xff000000) | 195 | add r3, r8, #TEXT_OFFSET |
193 | .if (KERNEL_RAM_PADDR & 0x00f00000) | 196 | orr r3, r3, r7 |
194 | orr r3, r3, #(KERNEL_RAM_PADDR & 0x00f00000) | ||
195 | .endif | ||
196 | add r0, r4, #(KERNEL_RAM_VADDR & 0xff000000) >> 18 | 197 | add r0, r4, #(KERNEL_RAM_VADDR & 0xff000000) >> 18 |
197 | str r3, [r0, #(KERNEL_RAM_VADDR & 0x00f00000) >> 18]! | 198 | str r3, [r0, #(KERNEL_RAM_VADDR & 0x00f00000) >> 18]! |
198 | ldr r6, =(_end - 1) | 199 | ldr r6, =(_end - 1) |
@@ -205,14 +206,17 @@ __create_page_tables: | |||
205 | #endif | 206 | #endif |
206 | 207 | ||
207 | /* | 208 | /* |
208 | * Then map first 1MB of ram in case it contains our boot params. | 209 | * Then map boot params address in r2 or |
210 | * the first 1MB of ram if boot params address is not specified. | ||
209 | */ | 211 | */ |
210 | add r0, r4, #PAGE_OFFSET >> 18 | 212 | mov r0, r2, lsr #20 |
211 | orr r6, r7, #(PHYS_OFFSET & 0xff000000) | 213 | movs r0, r0, lsl #20 |
212 | .if (PHYS_OFFSET & 0x00f00000) | 214 | moveq r0, r8 |
213 | orr r6, r6, #(PHYS_OFFSET & 0x00f00000) | 215 | sub r3, r0, r8 |
214 | .endif | 216 | add r3, r3, #PAGE_OFFSET |
215 | str r6, [r0] | 217 | add r3, r4, r3, lsr #18 |
218 | orr r6, r7, r0 | ||
219 | str r6, [r3] | ||
216 | 220 | ||
217 | #ifdef CONFIG_DEBUG_LL | 221 | #ifdef CONFIG_DEBUG_LL |
218 | #ifndef CONFIG_DEBUG_ICEDCC | 222 | #ifndef CONFIG_DEBUG_ICEDCC |
@@ -457,4 +461,129 @@ ENTRY(fixup_smp) | |||
457 | ldmfd sp!, {r4 - r6, pc} | 461 | ldmfd sp!, {r4 - r6, pc} |
458 | ENDPROC(fixup_smp) | 462 | ENDPROC(fixup_smp) |
459 | 463 | ||
464 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT | ||
465 | |||
466 | /* __fixup_pv_table - patch the stub instructions with the delta between | ||
467 | * PHYS_OFFSET and PAGE_OFFSET, which is assumed to be 16MiB aligned and | ||
468 | * can be expressed by an immediate shifter operand. The stub instruction | ||
469 | * has a form of '(add|sub) rd, rn, #imm'. | ||
470 | */ | ||
471 | __HEAD | ||
472 | __fixup_pv_table: | ||
473 | adr r0, 1f | ||
474 | ldmia r0, {r3-r5, r7} | ||
475 | sub r3, r0, r3 @ PHYS_OFFSET - PAGE_OFFSET | ||
476 | add r4, r4, r3 @ adjust table start address | ||
477 | add r5, r5, r3 @ adjust table end address | ||
478 | add r7, r7, r3 @ adjust __pv_phys_offset address | ||
479 | str r8, [r7] @ save computed PHYS_OFFSET to __pv_phys_offset | ||
480 | #ifndef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT | ||
481 | mov r6, r3, lsr #24 @ constant for add/sub instructions | ||
482 | teq r3, r6, lsl #24 @ must be 16MiB aligned | ||
483 | #else | ||
484 | mov r6, r3, lsr #16 @ constant for add/sub instructions | ||
485 | teq r3, r6, lsl #16 @ must be 64kiB aligned | ||
486 | #endif | ||
487 | THUMB( it ne @ cross section branch ) | ||
488 | bne __error | ||
489 | str r6, [r7, #4] @ save to __pv_offset | ||
490 | b __fixup_a_pv_table | ||
491 | ENDPROC(__fixup_pv_table) | ||
492 | |||
493 | .align | ||
494 | 1: .long . | ||
495 | .long __pv_table_begin | ||
496 | .long __pv_table_end | ||
497 | 2: .long __pv_phys_offset | ||
498 | |||
499 | .text | ||
500 | __fixup_a_pv_table: | ||
501 | #ifdef CONFIG_THUMB2_KERNEL | ||
502 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT | ||
503 | lsls r0, r6, #24 | ||
504 | lsr r6, #8 | ||
505 | beq 1f | ||
506 | clz r7, r0 | ||
507 | lsr r0, #24 | ||
508 | lsl r0, r7 | ||
509 | bic r0, 0x0080 | ||
510 | lsrs r7, #1 | ||
511 | orrcs r0, #0x0080 | ||
512 | orr r0, r0, r7, lsl #12 | ||
513 | #endif | ||
514 | 1: lsls r6, #24 | ||
515 | beq 4f | ||
516 | clz r7, r6 | ||
517 | lsr r6, #24 | ||
518 | lsl r6, r7 | ||
519 | bic r6, #0x0080 | ||
520 | lsrs r7, #1 | ||
521 | orrcs r6, #0x0080 | ||
522 | orr r6, r6, r7, lsl #12 | ||
523 | orr r6, #0x4000 | ||
524 | b 4f | ||
525 | 2: @ at this point the C flag is always clear | ||
526 | add r7, r3 | ||
527 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT | ||
528 | ldrh ip, [r7] | ||
529 | tst ip, 0x0400 @ the i bit tells us LS or MS byte | ||
530 | beq 3f | ||
531 | cmp r0, #0 @ set C flag, and ... | ||
532 | biceq ip, 0x0400 @ immediate zero value has a special encoding | ||
533 | streqh ip, [r7] @ that requires the i bit cleared | ||
534 | #endif | ||
535 | 3: ldrh ip, [r7, #2] | ||
536 | and ip, 0x8f00 | ||
537 | orrcc ip, r6 @ mask in offset bits 31-24 | ||
538 | orrcs ip, r0 @ mask in offset bits 23-16 | ||
539 | strh ip, [r7, #2] | ||
540 | 4: cmp r4, r5 | ||
541 | ldrcc r7, [r4], #4 @ use branch for delay slot | ||
542 | bcc 2b | ||
543 | bx lr | ||
544 | #else | ||
545 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT | ||
546 | and r0, r6, #255 @ offset bits 23-16 | ||
547 | mov r6, r6, lsr #8 @ offset bits 31-24 | ||
548 | #else | ||
549 | mov r0, #0 @ just in case... | ||
550 | #endif | ||
551 | b 3f | ||
552 | 2: ldr ip, [r7, r3] | ||
553 | bic ip, ip, #0x000000ff | ||
554 | tst ip, #0x400 @ rotate shift tells us LS or MS byte | ||
555 | orrne ip, ip, r6 @ mask in offset bits 31-24 | ||
556 | orreq ip, ip, r0 @ mask in offset bits 23-16 | ||
557 | str ip, [r7, r3] | ||
558 | 3: cmp r4, r5 | ||
559 | ldrcc r7, [r4], #4 @ use branch for delay slot | ||
560 | bcc 2b | ||
561 | mov pc, lr | ||
562 | #endif | ||
563 | ENDPROC(__fixup_a_pv_table) | ||
564 | |||
565 | ENTRY(fixup_pv_table) | ||
566 | stmfd sp!, {r4 - r7, lr} | ||
567 | ldr r2, 2f @ get address of __pv_phys_offset | ||
568 | mov r3, #0 @ no offset | ||
569 | mov r4, r0 @ r0 = table start | ||
570 | add r5, r0, r1 @ r1 = table size | ||
571 | ldr r6, [r2, #4] @ get __pv_offset | ||
572 | bl __fixup_a_pv_table | ||
573 | ldmfd sp!, {r4 - r7, pc} | ||
574 | ENDPROC(fixup_pv_table) | ||
575 | |||
576 | .align | ||
577 | 2: .long __pv_phys_offset | ||
578 | |||
579 | .data | ||
580 | .globl __pv_phys_offset | ||
581 | .type __pv_phys_offset, %object | ||
582 | __pv_phys_offset: | ||
583 | .long 0 | ||
584 | .size __pv_phys_offset, . - __pv_phys_offset | ||
585 | __pv_offset: | ||
586 | .long 0 | ||
587 | #endif | ||
588 | |||
460 | #include "head-common.S" | 589 | #include "head-common.S" |
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 28536e352deb..3535d3793e65 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c | |||
@@ -179,14 +179,21 @@ int __init arch_probe_nr_irqs(void) | |||
179 | 179 | ||
180 | #ifdef CONFIG_HOTPLUG_CPU | 180 | #ifdef CONFIG_HOTPLUG_CPU |
181 | 181 | ||
182 | static void route_irq(struct irq_desc *desc, unsigned int irq, unsigned int cpu) | 182 | static bool migrate_one_irq(struct irq_data *d) |
183 | { | 183 | { |
184 | pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->irq_data.node, cpu); | 184 | unsigned int cpu = cpumask_any_and(d->affinity, cpu_online_mask); |
185 | bool ret = false; | ||
185 | 186 | ||
186 | raw_spin_lock_irq(&desc->lock); | 187 | if (cpu >= nr_cpu_ids) { |
187 | desc->irq_data.chip->irq_set_affinity(&desc->irq_data, | 188 | cpu = cpumask_any(cpu_online_mask); |
188 | cpumask_of(cpu), false); | 189 | ret = true; |
189 | raw_spin_unlock_irq(&desc->lock); | 190 | } |
191 | |||
192 | pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", d->irq, d->node, cpu); | ||
193 | |||
194 | d->chip->irq_set_affinity(d, cpumask_of(cpu), true); | ||
195 | |||
196 | return ret; | ||
190 | } | 197 | } |
191 | 198 | ||
192 | /* | 199 | /* |
@@ -198,25 +205,30 @@ void migrate_irqs(void) | |||
198 | { | 205 | { |
199 | unsigned int i, cpu = smp_processor_id(); | 206 | unsigned int i, cpu = smp_processor_id(); |
200 | struct irq_desc *desc; | 207 | struct irq_desc *desc; |
208 | unsigned long flags; | ||
209 | |||
210 | local_irq_save(flags); | ||
201 | 211 | ||
202 | for_each_irq_desc(i, desc) { | 212 | for_each_irq_desc(i, desc) { |
203 | struct irq_data *d = &desc->irq_data; | 213 | struct irq_data *d = &desc->irq_data; |
214 | bool affinity_broken = false; | ||
204 | 215 | ||
205 | if (d->node == cpu) { | 216 | raw_spin_lock(&desc->lock); |
206 | unsigned int newcpu = cpumask_any_and(d->affinity, | 217 | do { |
207 | cpu_online_mask); | 218 | if (desc->action == NULL) |
208 | if (newcpu >= nr_cpu_ids) { | 219 | break; |
209 | if (printk_ratelimit()) | ||
210 | printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n", | ||
211 | i, cpu); | ||
212 | 220 | ||
213 | cpumask_setall(d->affinity); | 221 | if (d->node != cpu) |
214 | newcpu = cpumask_any_and(d->affinity, | 222 | break; |
215 | cpu_online_mask); | ||
216 | } | ||
217 | 223 | ||
218 | route_irq(desc, i, newcpu); | 224 | affinity_broken = migrate_one_irq(d); |
219 | } | 225 | } while (0); |
226 | raw_spin_unlock(&desc->lock); | ||
227 | |||
228 | if (affinity_broken && printk_ratelimit()) | ||
229 | pr_warning("IRQ%u no longer affine to CPU%u\n", i, cpu); | ||
220 | } | 230 | } |
231 | |||
232 | local_irq_restore(flags); | ||
221 | } | 233 | } |
222 | #endif /* CONFIG_HOTPLUG_CPU */ | 234 | #endif /* CONFIG_HOTPLUG_CPU */ |
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c index 6d4105e6872f..fee7c36349eb 100644 --- a/arch/arm/kernel/module.c +++ b/arch/arm/kernel/module.c | |||
@@ -76,6 +76,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, | |||
76 | for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) { | 76 | for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) { |
77 | unsigned long loc; | 77 | unsigned long loc; |
78 | Elf32_Sym *sym; | 78 | Elf32_Sym *sym; |
79 | const char *symname; | ||
79 | s32 offset; | 80 | s32 offset; |
80 | #ifdef CONFIG_THUMB2_KERNEL | 81 | #ifdef CONFIG_THUMB2_KERNEL |
81 | u32 upper, lower, sign, j1, j2; | 82 | u32 upper, lower, sign, j1, j2; |
@@ -83,18 +84,18 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, | |||
83 | 84 | ||
84 | offset = ELF32_R_SYM(rel->r_info); | 85 | offset = ELF32_R_SYM(rel->r_info); |
85 | if (offset < 0 || offset > (symsec->sh_size / sizeof(Elf32_Sym))) { | 86 | if (offset < 0 || offset > (symsec->sh_size / sizeof(Elf32_Sym))) { |
86 | printk(KERN_ERR "%s: bad relocation, section %d reloc %d\n", | 87 | pr_err("%s: section %u reloc %u: bad relocation sym offset\n", |
87 | module->name, relindex, i); | 88 | module->name, relindex, i); |
88 | return -ENOEXEC; | 89 | return -ENOEXEC; |
89 | } | 90 | } |
90 | 91 | ||
91 | sym = ((Elf32_Sym *)symsec->sh_addr) + offset; | 92 | sym = ((Elf32_Sym *)symsec->sh_addr) + offset; |
93 | symname = strtab + sym->st_name; | ||
92 | 94 | ||
93 | if (rel->r_offset < 0 || rel->r_offset > dstsec->sh_size - sizeof(u32)) { | 95 | if (rel->r_offset < 0 || rel->r_offset > dstsec->sh_size - sizeof(u32)) { |
94 | printk(KERN_ERR "%s: out of bounds relocation, " | 96 | pr_err("%s: section %u reloc %u sym '%s': out of bounds relocation, offset %d size %u\n", |
95 | "section %d reloc %d offset %d size %d\n", | 97 | module->name, relindex, i, symname, |
96 | module->name, relindex, i, rel->r_offset, | 98 | rel->r_offset, dstsec->sh_size); |
97 | dstsec->sh_size); | ||
98 | return -ENOEXEC; | 99 | return -ENOEXEC; |
99 | } | 100 | } |
100 | 101 | ||
@@ -120,10 +121,10 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, | |||
120 | if (offset & 3 || | 121 | if (offset & 3 || |
121 | offset <= (s32)0xfe000000 || | 122 | offset <= (s32)0xfe000000 || |
122 | offset >= (s32)0x02000000) { | 123 | offset >= (s32)0x02000000) { |
123 | printk(KERN_ERR | 124 | pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n", |
124 | "%s: relocation out of range, section " | 125 | module->name, relindex, i, symname, |
125 | "%d reloc %d sym '%s'\n", module->name, | 126 | ELF32_R_TYPE(rel->r_info), loc, |
126 | relindex, i, strtab + sym->st_name); | 127 | sym->st_value); |
127 | return -ENOEXEC; | 128 | return -ENOEXEC; |
128 | } | 129 | } |
129 | 130 | ||
@@ -196,10 +197,10 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, | |||
196 | if (!(offset & 1) || | 197 | if (!(offset & 1) || |
197 | offset <= (s32)0xff000000 || | 198 | offset <= (s32)0xff000000 || |
198 | offset >= (s32)0x01000000) { | 199 | offset >= (s32)0x01000000) { |
199 | printk(KERN_ERR | 200 | pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n", |
200 | "%s: relocation out of range, section " | 201 | module->name, relindex, i, symname, |
201 | "%d reloc %d sym '%s'\n", module->name, | 202 | ELF32_R_TYPE(rel->r_info), loc, |
202 | relindex, i, strtab + sym->st_name); | 203 | sym->st_value); |
203 | return -ENOEXEC; | 204 | return -ENOEXEC; |
204 | } | 205 | } |
205 | 206 | ||
@@ -282,12 +283,13 @@ static const Elf_Shdr *find_mod_section(const Elf32_Ehdr *hdr, | |||
282 | return NULL; | 283 | return NULL; |
283 | } | 284 | } |
284 | 285 | ||
286 | extern void fixup_pv_table(const void *, unsigned long); | ||
285 | extern void fixup_smp(const void *, unsigned long); | 287 | extern void fixup_smp(const void *, unsigned long); |
286 | 288 | ||
287 | int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, | 289 | int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, |
288 | struct module *mod) | 290 | struct module *mod) |
289 | { | 291 | { |
290 | const Elf_Shdr * __maybe_unused s = NULL; | 292 | const Elf_Shdr *s = NULL; |
291 | #ifdef CONFIG_ARM_UNWIND | 293 | #ifdef CONFIG_ARM_UNWIND |
292 | const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 294 | const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; |
293 | const Elf_Shdr *sechdrs_end = sechdrs + hdr->e_shnum; | 295 | const Elf_Shdr *sechdrs_end = sechdrs + hdr->e_shnum; |
@@ -332,6 +334,11 @@ int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, | |||
332 | maps[i].txt_sec->sh_addr, | 334 | maps[i].txt_sec->sh_addr, |
333 | maps[i].txt_sec->sh_size); | 335 | maps[i].txt_sec->sh_size); |
334 | #endif | 336 | #endif |
337 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT | ||
338 | s = find_mod_section(hdr, sechdrs, ".pv_table"); | ||
339 | if (s) | ||
340 | fixup_pv_table((void *)s->sh_addr, s->sh_size); | ||
341 | #endif | ||
335 | s = find_mod_section(hdr, sechdrs, ".alt.smp.init"); | 342 | s = find_mod_section(hdr, sechdrs, ".alt.smp.init"); |
336 | if (s && !is_smp()) | 343 | if (s && !is_smp()) |
337 | fixup_smp((void *)s->sh_addr, s->sh_size); | 344 | fixup_smp((void *)s->sh_addr, s->sh_size); |
diff --git a/arch/arm/kernel/perf_event_v6.c b/arch/arm/kernel/perf_event_v6.c index c058bfc8532b..6fc2d228db55 100644 --- a/arch/arm/kernel/perf_event_v6.c +++ b/arch/arm/kernel/perf_event_v6.c | |||
@@ -30,7 +30,7 @@ | |||
30 | * enable the interrupt. | 30 | * enable the interrupt. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #ifdef CONFIG_CPU_V6 | 33 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) |
34 | enum armv6_perf_types { | 34 | enum armv6_perf_types { |
35 | ARMV6_PERFCTR_ICACHE_MISS = 0x0, | 35 | ARMV6_PERFCTR_ICACHE_MISS = 0x0, |
36 | ARMV6_PERFCTR_IBUF_STALL = 0x1, | 36 | ARMV6_PERFCTR_IBUF_STALL = 0x1, |
@@ -669,4 +669,4 @@ static const struct arm_pmu *__init armv6mpcore_pmu_init(void) | |||
669 | { | 669 | { |
670 | return NULL; | 670 | return NULL; |
671 | } | 671 | } |
672 | #endif /* CONFIG_CPU_V6 */ | 672 | #endif /* CONFIG_CPU_V6 || CONFIG_CPU_V6K */ |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index b13e70f63d71..2bf27f364d09 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
@@ -26,8 +26,6 @@ | |||
26 | #include <asm/system.h> | 26 | #include <asm/system.h> |
27 | #include <asm/traps.h> | 27 | #include <asm/traps.h> |
28 | 28 | ||
29 | #include "ptrace.h" | ||
30 | |||
31 | #define REG_PC 15 | 29 | #define REG_PC 15 |
32 | #define REG_PSR 16 | 30 | #define REG_PSR 16 |
33 | /* | 31 | /* |
@@ -184,389 +182,12 @@ put_user_reg(struct task_struct *task, int offset, long data) | |||
184 | return ret; | 182 | return ret; |
185 | } | 183 | } |
186 | 184 | ||
187 | static inline int | ||
188 | read_u32(struct task_struct *task, unsigned long addr, u32 *res) | ||
189 | { | ||
190 | int ret; | ||
191 | |||
192 | ret = access_process_vm(task, addr, res, sizeof(*res), 0); | ||
193 | |||
194 | return ret == sizeof(*res) ? 0 : -EIO; | ||
195 | } | ||
196 | |||
197 | static inline int | ||
198 | read_instr(struct task_struct *task, unsigned long addr, u32 *res) | ||
199 | { | ||
200 | int ret; | ||
201 | |||
202 | if (addr & 1) { | ||
203 | u16 val; | ||
204 | ret = access_process_vm(task, addr & ~1, &val, sizeof(val), 0); | ||
205 | ret = ret == sizeof(val) ? 0 : -EIO; | ||
206 | *res = val; | ||
207 | } else { | ||
208 | u32 val; | ||
209 | ret = access_process_vm(task, addr & ~3, &val, sizeof(val), 0); | ||
210 | ret = ret == sizeof(val) ? 0 : -EIO; | ||
211 | *res = val; | ||
212 | } | ||
213 | return ret; | ||
214 | } | ||
215 | |||
216 | /* | ||
217 | * Get value of register `rn' (in the instruction) | ||
218 | */ | ||
219 | static unsigned long | ||
220 | ptrace_getrn(struct task_struct *child, unsigned long insn) | ||
221 | { | ||
222 | unsigned int reg = (insn >> 16) & 15; | ||
223 | unsigned long val; | ||
224 | |||
225 | val = get_user_reg(child, reg); | ||
226 | if (reg == 15) | ||
227 | val += 8; | ||
228 | |||
229 | return val; | ||
230 | } | ||
231 | |||
232 | /* | ||
233 | * Get value of operand 2 (in an ALU instruction) | ||
234 | */ | ||
235 | static unsigned long | ||
236 | ptrace_getaluop2(struct task_struct *child, unsigned long insn) | ||
237 | { | ||
238 | unsigned long val; | ||
239 | int shift; | ||
240 | int type; | ||
241 | |||
242 | if (insn & 1 << 25) { | ||
243 | val = insn & 255; | ||
244 | shift = (insn >> 8) & 15; | ||
245 | type = 3; | ||
246 | } else { | ||
247 | val = get_user_reg (child, insn & 15); | ||
248 | |||
249 | if (insn & (1 << 4)) | ||
250 | shift = (int)get_user_reg (child, (insn >> 8) & 15); | ||
251 | else | ||
252 | shift = (insn >> 7) & 31; | ||
253 | |||
254 | type = (insn >> 5) & 3; | ||
255 | } | ||
256 | |||
257 | switch (type) { | ||
258 | case 0: val <<= shift; break; | ||
259 | case 1: val >>= shift; break; | ||
260 | case 2: | ||
261 | val = (((signed long)val) >> shift); | ||
262 | break; | ||
263 | case 3: | ||
264 | val = (val >> shift) | (val << (32 - shift)); | ||
265 | break; | ||
266 | } | ||
267 | return val; | ||
268 | } | ||
269 | |||
270 | /* | ||
271 | * Get value of operand 2 (in a LDR instruction) | ||
272 | */ | ||
273 | static unsigned long | ||
274 | ptrace_getldrop2(struct task_struct *child, unsigned long insn) | ||
275 | { | ||
276 | unsigned long val; | ||
277 | int shift; | ||
278 | int type; | ||
279 | |||
280 | val = get_user_reg(child, insn & 15); | ||
281 | shift = (insn >> 7) & 31; | ||
282 | type = (insn >> 5) & 3; | ||
283 | |||
284 | switch (type) { | ||
285 | case 0: val <<= shift; break; | ||
286 | case 1: val >>= shift; break; | ||
287 | case 2: | ||
288 | val = (((signed long)val) >> shift); | ||
289 | break; | ||
290 | case 3: | ||
291 | val = (val >> shift) | (val << (32 - shift)); | ||
292 | break; | ||
293 | } | ||
294 | return val; | ||
295 | } | ||
296 | |||
297 | #define OP_MASK 0x01e00000 | ||
298 | #define OP_AND 0x00000000 | ||
299 | #define OP_EOR 0x00200000 | ||
300 | #define OP_SUB 0x00400000 | ||
301 | #define OP_RSB 0x00600000 | ||
302 | #define OP_ADD 0x00800000 | ||
303 | #define OP_ADC 0x00a00000 | ||
304 | #define OP_SBC 0x00c00000 | ||
305 | #define OP_RSC 0x00e00000 | ||
306 | #define OP_ORR 0x01800000 | ||
307 | #define OP_MOV 0x01a00000 | ||
308 | #define OP_BIC 0x01c00000 | ||
309 | #define OP_MVN 0x01e00000 | ||
310 | |||
311 | static unsigned long | ||
312 | get_branch_address(struct task_struct *child, unsigned long pc, unsigned long insn) | ||
313 | { | ||
314 | u32 alt = 0; | ||
315 | |||
316 | switch (insn & 0x0e000000) { | ||
317 | case 0x00000000: | ||
318 | case 0x02000000: { | ||
319 | /* | ||
320 | * data processing | ||
321 | */ | ||
322 | long aluop1, aluop2, ccbit; | ||
323 | |||
324 | if ((insn & 0x0fffffd0) == 0x012fff10) { | ||
325 | /* | ||
326 | * bx or blx | ||
327 | */ | ||
328 | alt = get_user_reg(child, insn & 15); | ||
329 | break; | ||
330 | } | ||
331 | |||
332 | |||
333 | if ((insn & 0xf000) != 0xf000) | ||
334 | break; | ||
335 | |||
336 | aluop1 = ptrace_getrn(child, insn); | ||
337 | aluop2 = ptrace_getaluop2(child, insn); | ||
338 | ccbit = get_user_reg(child, REG_PSR) & PSR_C_BIT ? 1 : 0; | ||
339 | |||
340 | switch (insn & OP_MASK) { | ||
341 | case OP_AND: alt = aluop1 & aluop2; break; | ||
342 | case OP_EOR: alt = aluop1 ^ aluop2; break; | ||
343 | case OP_SUB: alt = aluop1 - aluop2; break; | ||
344 | case OP_RSB: alt = aluop2 - aluop1; break; | ||
345 | case OP_ADD: alt = aluop1 + aluop2; break; | ||
346 | case OP_ADC: alt = aluop1 + aluop2 + ccbit; break; | ||
347 | case OP_SBC: alt = aluop1 - aluop2 + ccbit; break; | ||
348 | case OP_RSC: alt = aluop2 - aluop1 + ccbit; break; | ||
349 | case OP_ORR: alt = aluop1 | aluop2; break; | ||
350 | case OP_MOV: alt = aluop2; break; | ||
351 | case OP_BIC: alt = aluop1 & ~aluop2; break; | ||
352 | case OP_MVN: alt = ~aluop2; break; | ||
353 | } | ||
354 | break; | ||
355 | } | ||
356 | |||
357 | case 0x04000000: | ||
358 | case 0x06000000: | ||
359 | /* | ||
360 | * ldr | ||
361 | */ | ||
362 | if ((insn & 0x0010f000) == 0x0010f000) { | ||
363 | unsigned long base; | ||
364 | |||
365 | base = ptrace_getrn(child, insn); | ||
366 | if (insn & 1 << 24) { | ||
367 | long aluop2; | ||
368 | |||
369 | if (insn & 0x02000000) | ||
370 | aluop2 = ptrace_getldrop2(child, insn); | ||
371 | else | ||
372 | aluop2 = insn & 0xfff; | ||
373 | |||
374 | if (insn & 1 << 23) | ||
375 | base += aluop2; | ||
376 | else | ||
377 | base -= aluop2; | ||
378 | } | ||
379 | read_u32(child, base, &alt); | ||
380 | } | ||
381 | break; | ||
382 | |||
383 | case 0x08000000: | ||
384 | /* | ||
385 | * ldm | ||
386 | */ | ||
387 | if ((insn & 0x00108000) == 0x00108000) { | ||
388 | unsigned long base; | ||
389 | unsigned int nr_regs; | ||
390 | |||
391 | if (insn & (1 << 23)) { | ||
392 | nr_regs = hweight16(insn & 65535) << 2; | ||
393 | |||
394 | if (!(insn & (1 << 24))) | ||
395 | nr_regs -= 4; | ||
396 | } else { | ||
397 | if (insn & (1 << 24)) | ||
398 | nr_regs = -4; | ||
399 | else | ||
400 | nr_regs = 0; | ||
401 | } | ||
402 | |||
403 | base = ptrace_getrn(child, insn); | ||
404 | |||
405 | read_u32(child, base + nr_regs, &alt); | ||
406 | break; | ||
407 | } | ||
408 | break; | ||
409 | |||
410 | case 0x0a000000: { | ||
411 | /* | ||
412 | * bl or b | ||
413 | */ | ||
414 | signed long displ; | ||
415 | /* It's a branch/branch link: instead of trying to | ||
416 | * figure out whether the branch will be taken or not, | ||
417 | * we'll put a breakpoint at both locations. This is | ||
418 | * simpler, more reliable, and probably not a whole lot | ||
419 | * slower than the alternative approach of emulating the | ||
420 | * branch. | ||
421 | */ | ||
422 | displ = (insn & 0x00ffffff) << 8; | ||
423 | displ = (displ >> 6) + 8; | ||
424 | if (displ != 0 && displ != 4) | ||
425 | alt = pc + displ; | ||
426 | } | ||
427 | break; | ||
428 | } | ||
429 | |||
430 | return alt; | ||
431 | } | ||
432 | |||
433 | static int | ||
434 | swap_insn(struct task_struct *task, unsigned long addr, | ||
435 | void *old_insn, void *new_insn, int size) | ||
436 | { | ||
437 | int ret; | ||
438 | |||
439 | ret = access_process_vm(task, addr, old_insn, size, 0); | ||
440 | if (ret == size) | ||
441 | ret = access_process_vm(task, addr, new_insn, size, 1); | ||
442 | return ret; | ||
443 | } | ||
444 | |||
445 | static void | ||
446 | add_breakpoint(struct task_struct *task, struct debug_info *dbg, unsigned long addr) | ||
447 | { | ||
448 | int nr = dbg->nsaved; | ||
449 | |||
450 | if (nr < 2) { | ||
451 | u32 new_insn = BREAKINST_ARM; | ||
452 | int res; | ||
453 | |||
454 | res = swap_insn(task, addr, &dbg->bp[nr].insn, &new_insn, 4); | ||
455 | |||
456 | if (res == 4) { | ||
457 | dbg->bp[nr].address = addr; | ||
458 | dbg->nsaved += 1; | ||
459 | } | ||
460 | } else | ||
461 | printk(KERN_ERR "ptrace: too many breakpoints\n"); | ||
462 | } | ||
463 | |||
464 | /* | ||
465 | * Clear one breakpoint in the user program. We copy what the hardware | ||
466 | * does and use bit 0 of the address to indicate whether this is a Thumb | ||
467 | * breakpoint or an ARM breakpoint. | ||
468 | */ | ||
469 | static void clear_breakpoint(struct task_struct *task, struct debug_entry *bp) | ||
470 | { | ||
471 | unsigned long addr = bp->address; | ||
472 | union debug_insn old_insn; | ||
473 | int ret; | ||
474 | |||
475 | if (addr & 1) { | ||
476 | ret = swap_insn(task, addr & ~1, &old_insn.thumb, | ||
477 | &bp->insn.thumb, 2); | ||
478 | |||
479 | if (ret != 2 || old_insn.thumb != BREAKINST_THUMB) | ||
480 | printk(KERN_ERR "%s:%d: corrupted Thumb breakpoint at " | ||
481 | "0x%08lx (0x%04x)\n", task->comm, | ||
482 | task_pid_nr(task), addr, old_insn.thumb); | ||
483 | } else { | ||
484 | ret = swap_insn(task, addr & ~3, &old_insn.arm, | ||
485 | &bp->insn.arm, 4); | ||
486 | |||
487 | if (ret != 4 || old_insn.arm != BREAKINST_ARM) | ||
488 | printk(KERN_ERR "%s:%d: corrupted ARM breakpoint at " | ||
489 | "0x%08lx (0x%08x)\n", task->comm, | ||
490 | task_pid_nr(task), addr, old_insn.arm); | ||
491 | } | ||
492 | } | ||
493 | |||
494 | void ptrace_set_bpt(struct task_struct *child) | ||
495 | { | ||
496 | struct pt_regs *regs; | ||
497 | unsigned long pc; | ||
498 | u32 insn; | ||
499 | int res; | ||
500 | |||
501 | regs = task_pt_regs(child); | ||
502 | pc = instruction_pointer(regs); | ||
503 | |||
504 | if (thumb_mode(regs)) { | ||
505 | printk(KERN_WARNING "ptrace: can't handle thumb mode\n"); | ||
506 | return; | ||
507 | } | ||
508 | |||
509 | res = read_instr(child, pc, &insn); | ||
510 | if (!res) { | ||
511 | struct debug_info *dbg = &child->thread.debug; | ||
512 | unsigned long alt; | ||
513 | |||
514 | dbg->nsaved = 0; | ||
515 | |||
516 | alt = get_branch_address(child, pc, insn); | ||
517 | if (alt) | ||
518 | add_breakpoint(child, dbg, alt); | ||
519 | |||
520 | /* | ||
521 | * Note that we ignore the result of setting the above | ||
522 | * breakpoint since it may fail. When it does, this is | ||
523 | * not so much an error, but a forewarning that we may | ||
524 | * be receiving a prefetch abort shortly. | ||
525 | * | ||
526 | * If we don't set this breakpoint here, then we can | ||
527 | * lose control of the thread during single stepping. | ||
528 | */ | ||
529 | if (!alt || predicate(insn) != PREDICATE_ALWAYS) | ||
530 | add_breakpoint(child, dbg, pc + 4); | ||
531 | } | ||
532 | } | ||
533 | |||
534 | /* | ||
535 | * Ensure no single-step breakpoint is pending. Returns non-zero | ||
536 | * value if child was being single-stepped. | ||
537 | */ | ||
538 | void ptrace_cancel_bpt(struct task_struct *child) | ||
539 | { | ||
540 | int i, nsaved = child->thread.debug.nsaved; | ||
541 | |||
542 | child->thread.debug.nsaved = 0; | ||
543 | |||
544 | if (nsaved > 2) { | ||
545 | printk("ptrace_cancel_bpt: bogus nsaved: %d!\n", nsaved); | ||
546 | nsaved = 2; | ||
547 | } | ||
548 | |||
549 | for (i = 0; i < nsaved; i++) | ||
550 | clear_breakpoint(child, &child->thread.debug.bp[i]); | ||
551 | } | ||
552 | |||
553 | void user_disable_single_step(struct task_struct *task) | ||
554 | { | ||
555 | task->ptrace &= ~PT_SINGLESTEP; | ||
556 | ptrace_cancel_bpt(task); | ||
557 | } | ||
558 | |||
559 | void user_enable_single_step(struct task_struct *task) | ||
560 | { | ||
561 | task->ptrace |= PT_SINGLESTEP; | ||
562 | } | ||
563 | |||
564 | /* | 185 | /* |
565 | * Called by kernel/ptrace.c when detaching.. | 186 | * Called by kernel/ptrace.c when detaching.. |
566 | */ | 187 | */ |
567 | void ptrace_disable(struct task_struct *child) | 188 | void ptrace_disable(struct task_struct *child) |
568 | { | 189 | { |
569 | user_disable_single_step(child); | 190 | /* Nothing to do. */ |
570 | } | 191 | } |
571 | 192 | ||
572 | /* | 193 | /* |
@@ -576,8 +197,6 @@ void ptrace_break(struct task_struct *tsk, struct pt_regs *regs) | |||
576 | { | 197 | { |
577 | siginfo_t info; | 198 | siginfo_t info; |
578 | 199 | ||
579 | ptrace_cancel_bpt(tsk); | ||
580 | |||
581 | info.si_signo = SIGTRAP; | 200 | info.si_signo = SIGTRAP; |
582 | info.si_errno = 0; | 201 | info.si_errno = 0; |
583 | info.si_code = TRAP_BRKPT; | 202 | info.si_code = TRAP_BRKPT; |
diff --git a/arch/arm/kernel/ptrace.h b/arch/arm/kernel/ptrace.h deleted file mode 100644 index 3926605b82ea..000000000000 --- a/arch/arm/kernel/ptrace.h +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/kernel/ptrace.h | ||
3 | * | ||
4 | * Copyright (C) 2000-2003 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 version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #include <linux/ptrace.h> | ||
11 | |||
12 | extern void ptrace_cancel_bpt(struct task_struct *); | ||
13 | extern void ptrace_set_bpt(struct task_struct *); | ||
14 | extern void ptrace_break(struct task_struct *, struct pt_regs *); | ||
15 | |||
16 | /* | ||
17 | * Send SIGTRAP if we're single-stepping | ||
18 | */ | ||
19 | static inline void single_step_trap(struct task_struct *task) | ||
20 | { | ||
21 | if (task->ptrace & PT_SINGLESTEP) { | ||
22 | ptrace_cancel_bpt(task); | ||
23 | send_sig(SIGTRAP, task, 1); | ||
24 | } | ||
25 | } | ||
26 | |||
27 | static inline void single_step_clear(struct task_struct *task) | ||
28 | { | ||
29 | if (task->ptrace & PT_SINGLESTEP) | ||
30 | ptrace_cancel_bpt(task); | ||
31 | } | ||
32 | |||
33 | static inline void single_step_set(struct task_struct *task) | ||
34 | { | ||
35 | if (task->ptrace & PT_SINGLESTEP) | ||
36 | ptrace_set_bpt(task); | ||
37 | } | ||
diff --git a/arch/arm/kernel/return_address.c b/arch/arm/kernel/return_address.c index df246da4ceca..0b13a72f855d 100644 --- a/arch/arm/kernel/return_address.c +++ b/arch/arm/kernel/return_address.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * the Free Software Foundation. | 9 | * the Free Software Foundation. |
10 | */ | 10 | */ |
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/ftrace.h> | ||
12 | 13 | ||
13 | #if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) | 14 | #if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) |
14 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 5ea4fb718b97..d1da92174277 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -308,7 +308,22 @@ static void __init cacheid_init(void) | |||
308 | * already provide the required functionality. | 308 | * already provide the required functionality. |
309 | */ | 309 | */ |
310 | extern struct proc_info_list *lookup_processor_type(unsigned int); | 310 | extern struct proc_info_list *lookup_processor_type(unsigned int); |
311 | extern struct machine_desc *lookup_machine_type(unsigned int); | 311 | |
312 | static void __init early_print(const char *str, ...) | ||
313 | { | ||
314 | extern void printascii(const char *); | ||
315 | char buf[256]; | ||
316 | va_list ap; | ||
317 | |||
318 | va_start(ap, str); | ||
319 | vsnprintf(buf, sizeof(buf), str, ap); | ||
320 | va_end(ap); | ||
321 | |||
322 | #ifdef CONFIG_DEBUG_LL | ||
323 | printascii(buf); | ||
324 | #endif | ||
325 | printk("%s", buf); | ||
326 | } | ||
312 | 327 | ||
313 | static void __init feat_v6_fixup(void) | 328 | static void __init feat_v6_fixup(void) |
314 | { | 329 | { |
@@ -426,21 +441,29 @@ void cpu_init(void) | |||
426 | 441 | ||
427 | static struct machine_desc * __init setup_machine(unsigned int nr) | 442 | static struct machine_desc * __init setup_machine(unsigned int nr) |
428 | { | 443 | { |
429 | struct machine_desc *list; | 444 | extern struct machine_desc __arch_info_begin[], __arch_info_end[]; |
445 | struct machine_desc *p; | ||
430 | 446 | ||
431 | /* | 447 | /* |
432 | * locate machine in the list of supported machines. | 448 | * locate machine in the list of supported machines. |
433 | */ | 449 | */ |
434 | list = lookup_machine_type(nr); | 450 | for (p = __arch_info_begin; p < __arch_info_end; p++) |
435 | if (!list) { | 451 | if (nr == p->nr) { |
436 | printk("Machine configuration botched (nr %d), unable " | 452 | printk("Machine: %s\n", p->name); |
437 | "to continue.\n", nr); | 453 | return p; |
438 | while (1); | 454 | } |
439 | } | ||
440 | 455 | ||
441 | printk("Machine: %s\n", list->name); | 456 | early_print("\n" |
457 | "Error: unrecognized/unsupported machine ID (r1 = 0x%08x).\n\n" | ||
458 | "Available machine support:\n\nID (hex)\tNAME\n", nr); | ||
442 | 459 | ||
443 | return list; | 460 | for (p = __arch_info_begin; p < __arch_info_end; p++) |
461 | early_print("%08x\t%s\n", p->nr, p->name); | ||
462 | |||
463 | early_print("\nPlease check your kernel config and/or bootloader.\n"); | ||
464 | |||
465 | while (true) | ||
466 | /* can't use cpu_relax() here as it may require MMU setup */; | ||
444 | } | 467 | } |
445 | 468 | ||
446 | static int __init arm_add_memory(unsigned long start, unsigned long size) | 469 | static int __init arm_add_memory(unsigned long start, unsigned long size) |
@@ -703,7 +726,7 @@ static struct init_tags { | |||
703 | { tag_size(tag_core), ATAG_CORE }, | 726 | { tag_size(tag_core), ATAG_CORE }, |
704 | { 1, PAGE_SIZE, 0xff }, | 727 | { 1, PAGE_SIZE, 0xff }, |
705 | { tag_size(tag_mem32), ATAG_MEM }, | 728 | { tag_size(tag_mem32), ATAG_MEM }, |
706 | { MEM_SIZE, PHYS_OFFSET }, | 729 | { MEM_SIZE }, |
707 | { 0, ATAG_NONE } | 730 | { 0, ATAG_NONE } |
708 | }; | 731 | }; |
709 | 732 | ||
@@ -802,6 +825,8 @@ void __init setup_arch(char **cmdline_p) | |||
802 | struct machine_desc *mdesc; | 825 | struct machine_desc *mdesc; |
803 | char *from = default_command_line; | 826 | char *from = default_command_line; |
804 | 827 | ||
828 | init_tags.mem.start = PHYS_OFFSET; | ||
829 | |||
805 | unwind_init(); | 830 | unwind_init(); |
806 | 831 | ||
807 | setup_processor(); | 832 | setup_processor(); |
@@ -814,8 +839,25 @@ void __init setup_arch(char **cmdline_p) | |||
814 | 839 | ||
815 | if (__atags_pointer) | 840 | if (__atags_pointer) |
816 | tags = phys_to_virt(__atags_pointer); | 841 | tags = phys_to_virt(__atags_pointer); |
817 | else if (mdesc->boot_params) | 842 | else if (mdesc->boot_params) { |
818 | tags = phys_to_virt(mdesc->boot_params); | 843 | #ifdef CONFIG_MMU |
844 | /* | ||
845 | * We still are executing with a minimal MMU mapping created | ||
846 | * with the presumption that the machine default for this | ||
847 | * is located in the first MB of RAM. Anything else will | ||
848 | * fault and silently hang the kernel at this point. | ||
849 | */ | ||
850 | if (mdesc->boot_params < PHYS_OFFSET || | ||
851 | mdesc->boot_params >= PHYS_OFFSET + SZ_1M) { | ||
852 | printk(KERN_WARNING | ||
853 | "Default boot params at physical 0x%08lx out of reach\n", | ||
854 | mdesc->boot_params); | ||
855 | } else | ||
856 | #endif | ||
857 | { | ||
858 | tags = phys_to_virt(mdesc->boot_params); | ||
859 | } | ||
860 | } | ||
819 | 861 | ||
820 | #if defined(CONFIG_DEPRECATED_PARAM_STRUCT) | 862 | #if defined(CONFIG_DEPRECATED_PARAM_STRUCT) |
821 | /* | 863 | /* |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index abaf8445ce25..cb8398317644 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <asm/unistd.h> | 20 | #include <asm/unistd.h> |
21 | #include <asm/vfp.h> | 21 | #include <asm/vfp.h> |
22 | 22 | ||
23 | #include "ptrace.h" | ||
24 | #include "signal.h" | 23 | #include "signal.h" |
25 | 24 | ||
26 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 25 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
@@ -348,8 +347,6 @@ asmlinkage int sys_sigreturn(struct pt_regs *regs) | |||
348 | if (restore_sigframe(regs, frame)) | 347 | if (restore_sigframe(regs, frame)) |
349 | goto badframe; | 348 | goto badframe; |
350 | 349 | ||
351 | single_step_trap(current); | ||
352 | |||
353 | return regs->ARM_r0; | 350 | return regs->ARM_r0; |
354 | 351 | ||
355 | badframe: | 352 | badframe: |
@@ -383,8 +380,6 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) | |||
383 | if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT) | 380 | if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT) |
384 | goto badframe; | 381 | goto badframe; |
385 | 382 | ||
386 | single_step_trap(current); | ||
387 | |||
388 | return regs->ARM_r0; | 383 | return regs->ARM_r0; |
389 | 384 | ||
390 | badframe: | 385 | badframe: |
@@ -706,8 +701,6 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
706 | if (try_to_freeze()) | 701 | if (try_to_freeze()) |
707 | goto no_signal; | 702 | goto no_signal; |
708 | 703 | ||
709 | single_step_clear(current); | ||
710 | |||
711 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 704 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
712 | if (signr > 0) { | 705 | if (signr > 0) { |
713 | sigset_t *oldset; | 706 | sigset_t *oldset; |
@@ -726,7 +719,6 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
726 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 719 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
727 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 720 | clear_thread_flag(TIF_RESTORE_SIGMASK); |
728 | } | 721 | } |
729 | single_step_set(current); | ||
730 | return; | 722 | return; |
731 | } | 723 | } |
732 | 724 | ||
@@ -772,7 +764,6 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
772 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 764 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
773 | } | 765 | } |
774 | } | 766 | } |
775 | single_step_set(current); | ||
776 | } | 767 | } |
777 | 768 | ||
778 | asmlinkage void | 769 | asmlinkage void |
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S new file mode 100644 index 000000000000..bfad698a02e7 --- /dev/null +++ b/arch/arm/kernel/sleep.S | |||
@@ -0,0 +1,134 @@ | |||
1 | #include <linux/linkage.h> | ||
2 | #include <linux/threads.h> | ||
3 | #include <asm/asm-offsets.h> | ||
4 | #include <asm/assembler.h> | ||
5 | #include <asm/glue-cache.h> | ||
6 | #include <asm/glue-proc.h> | ||
7 | #include <asm/system.h> | ||
8 | .text | ||
9 | |||
10 | /* | ||
11 | * Save CPU state for a suspend | ||
12 | * r1 = v:p offset | ||
13 | * r3 = virtual return function | ||
14 | * Note: sp is decremented to allocate space for CPU state on stack | ||
15 | * r0-r3,r9,r10,lr corrupted | ||
16 | */ | ||
17 | ENTRY(cpu_suspend) | ||
18 | mov r9, lr | ||
19 | #ifdef MULTI_CPU | ||
20 | ldr r10, =processor | ||
21 | mov r2, sp @ current virtual SP | ||
22 | ldr r0, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state | ||
23 | ldr ip, [r10, #CPU_DO_RESUME] @ virtual resume function | ||
24 | sub sp, sp, r0 @ allocate CPU state on stack | ||
25 | mov r0, sp @ save pointer | ||
26 | add ip, ip, r1 @ convert resume fn to phys | ||
27 | stmfd sp!, {r1, r2, r3, ip} @ save v:p, virt SP, retfn, phys resume fn | ||
28 | ldr r3, =sleep_save_sp | ||
29 | add r2, sp, r1 @ convert SP to phys | ||
30 | #ifdef CONFIG_SMP | ||
31 | ALT_SMP(mrc p15, 0, lr, c0, c0, 5) | ||
32 | ALT_UP(mov lr, #0) | ||
33 | and lr, lr, #15 | ||
34 | str r2, [r3, lr, lsl #2] @ save phys SP | ||
35 | #else | ||
36 | str r2, [r3] @ save phys SP | ||
37 | #endif | ||
38 | mov lr, pc | ||
39 | ldr pc, [r10, #CPU_DO_SUSPEND] @ save CPU state | ||
40 | #else | ||
41 | mov r2, sp @ current virtual SP | ||
42 | ldr r0, =cpu_suspend_size | ||
43 | sub sp, sp, r0 @ allocate CPU state on stack | ||
44 | mov r0, sp @ save pointer | ||
45 | stmfd sp!, {r1, r2, r3} @ save v:p, virt SP, return fn | ||
46 | ldr r3, =sleep_save_sp | ||
47 | add r2, sp, r1 @ convert SP to phys | ||
48 | #ifdef CONFIG_SMP | ||
49 | ALT_SMP(mrc p15, 0, lr, c0, c0, 5) | ||
50 | ALT_UP(mov lr, #0) | ||
51 | and lr, lr, #15 | ||
52 | str r2, [r3, lr, lsl #2] @ save phys SP | ||
53 | #else | ||
54 | str r2, [r3] @ save phys SP | ||
55 | #endif | ||
56 | bl cpu_do_suspend | ||
57 | #endif | ||
58 | |||
59 | @ flush data cache | ||
60 | #ifdef MULTI_CACHE | ||
61 | ldr r10, =cpu_cache | ||
62 | mov lr, r9 | ||
63 | ldr pc, [r10, #CACHE_FLUSH_KERN_ALL] | ||
64 | #else | ||
65 | mov lr, r9 | ||
66 | b __cpuc_flush_kern_all | ||
67 | #endif | ||
68 | ENDPROC(cpu_suspend) | ||
69 | .ltorg | ||
70 | |||
71 | /* | ||
72 | * r0 = control register value | ||
73 | * r1 = v:p offset (preserved by cpu_do_resume) | ||
74 | * r2 = phys page table base | ||
75 | * r3 = L1 section flags | ||
76 | */ | ||
77 | ENTRY(cpu_resume_mmu) | ||
78 | adr r4, cpu_resume_turn_mmu_on | ||
79 | mov r4, r4, lsr #20 | ||
80 | orr r3, r3, r4, lsl #20 | ||
81 | ldr r5, [r2, r4, lsl #2] @ save old mapping | ||
82 | str r3, [r2, r4, lsl #2] @ setup 1:1 mapping for mmu code | ||
83 | sub r2, r2, r1 | ||
84 | ldr r3, =cpu_resume_after_mmu | ||
85 | bic r1, r0, #CR_C @ ensure D-cache is disabled | ||
86 | b cpu_resume_turn_mmu_on | ||
87 | ENDPROC(cpu_resume_mmu) | ||
88 | .ltorg | ||
89 | .align 5 | ||
90 | cpu_resume_turn_mmu_on: | ||
91 | mcr p15, 0, r1, c1, c0, 0 @ turn on MMU, I-cache, etc | ||
92 | mrc p15, 0, r1, c0, c0, 0 @ read id reg | ||
93 | mov r1, r1 | ||
94 | mov r1, r1 | ||
95 | mov pc, r3 @ jump to virtual address | ||
96 | ENDPROC(cpu_resume_turn_mmu_on) | ||
97 | cpu_resume_after_mmu: | ||
98 | str r5, [r2, r4, lsl #2] @ restore old mapping | ||
99 | mcr p15, 0, r0, c1, c0, 0 @ turn on D-cache | ||
100 | mov pc, lr | ||
101 | ENDPROC(cpu_resume_after_mmu) | ||
102 | |||
103 | /* | ||
104 | * Note: Yes, part of the following code is located into the .data section. | ||
105 | * This is to allow sleep_save_sp to be accessed with a relative load | ||
106 | * while we can't rely on any MMU translation. We could have put | ||
107 | * sleep_save_sp in the .text section as well, but some setups might | ||
108 | * insist on it to be truly read-only. | ||
109 | */ | ||
110 | .data | ||
111 | .align | ||
112 | ENTRY(cpu_resume) | ||
113 | #ifdef CONFIG_SMP | ||
114 | adr r0, sleep_save_sp | ||
115 | ALT_SMP(mrc p15, 0, r1, c0, c0, 5) | ||
116 | ALT_UP(mov r1, #0) | ||
117 | and r1, r1, #15 | ||
118 | ldr r0, [r0, r1, lsl #2] @ stack phys addr | ||
119 | #else | ||
120 | ldr r0, sleep_save_sp @ stack phys addr | ||
121 | #endif | ||
122 | msr cpsr_c, #PSR_I_BIT | PSR_F_BIT | SVC_MODE @ set SVC, irqs off | ||
123 | #ifdef MULTI_CPU | ||
124 | ldmia r0!, {r1, sp, lr, pc} @ load v:p, stack, return fn, resume fn | ||
125 | #else | ||
126 | ldmia r0!, {r1, sp, lr} @ load v:p, stack, return fn | ||
127 | b cpu_do_resume | ||
128 | #endif | ||
129 | ENDPROC(cpu_resume) | ||
130 | |||
131 | sleep_save_sp: | ||
132 | .rept CONFIG_NR_CPUS | ||
133 | .long 0 @ preserve stack phys ptr here | ||
134 | .endr | ||
diff --git a/arch/arm/kernel/smp_scu.c b/arch/arm/kernel/smp_scu.c index 9ab4149bd983..a1e757c3439b 100644 --- a/arch/arm/kernel/smp_scu.c +++ b/arch/arm/kernel/smp_scu.c | |||
@@ -50,3 +50,26 @@ void __init scu_enable(void __iomem *scu_base) | |||
50 | */ | 50 | */ |
51 | flush_cache_all(); | 51 | flush_cache_all(); |
52 | } | 52 | } |
53 | |||
54 | /* | ||
55 | * Set the executing CPUs power mode as defined. This will be in | ||
56 | * preparation for it executing a WFI instruction. | ||
57 | * | ||
58 | * This function must be called with preemption disabled, and as it | ||
59 | * has the side effect of disabling coherency, caches must have been | ||
60 | * flushed. Interrupts must also have been disabled. | ||
61 | */ | ||
62 | int scu_power_mode(void __iomem *scu_base, unsigned int mode) | ||
63 | { | ||
64 | unsigned int val; | ||
65 | int cpu = smp_processor_id(); | ||
66 | |||
67 | if (mode > 3 || mode == 1 || cpu > 3) | ||
68 | return -EINVAL; | ||
69 | |||
70 | val = __raw_readb(scu_base + SCU_CPU_STATUS + cpu) & ~0x03; | ||
71 | val |= mode; | ||
72 | __raw_writeb(val, scu_base + SCU_CPU_STATUS + cpu); | ||
73 | |||
74 | return 0; | ||
75 | } | ||
diff --git a/arch/arm/kernel/tcm.c b/arch/arm/kernel/tcm.c index 26685c2f7a49..f5cf660eefcc 100644 --- a/arch/arm/kernel/tcm.c +++ b/arch/arm/kernel/tcm.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/string.h> /* memcpy */ | 15 | #include <linux/string.h> /* memcpy */ |
16 | #include <asm/cputype.h> | 16 | #include <asm/cputype.h> |
17 | #include <asm/mach/map.h> | 17 | #include <asm/mach/map.h> |
18 | #include <mach/memory.h> | 18 | #include <asm/memory.h> |
19 | #include "tcm.h" | 19 | #include "tcm.h" |
20 | 20 | ||
21 | static struct gen_pool *tcm_pool; | 21 | static struct gen_pool *tcm_pool; |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index ee57640ba2bb..21ac43f1c2d0 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/kexec.h> | 23 | #include <linux/kexec.h> |
24 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
25 | #include <linux/init.h> | 25 | #include <linux/init.h> |
26 | #include <linux/sched.h> | ||
26 | 27 | ||
27 | #include <asm/atomic.h> | 28 | #include <asm/atomic.h> |
28 | #include <asm/cacheflush.h> | 29 | #include <asm/cacheflush.h> |
@@ -32,7 +33,6 @@ | |||
32 | #include <asm/unwind.h> | 33 | #include <asm/unwind.h> |
33 | #include <asm/tls.h> | 34 | #include <asm/tls.h> |
34 | 35 | ||
35 | #include "ptrace.h" | ||
36 | #include "signal.h" | 36 | #include "signal.h" |
37 | 37 | ||
38 | static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" }; | 38 | static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" }; |
@@ -256,7 +256,7 @@ static int __die(const char *str, int err, struct thread_info *thread, struct pt | |||
256 | return ret; | 256 | return ret; |
257 | } | 257 | } |
258 | 258 | ||
259 | DEFINE_SPINLOCK(die_lock); | 259 | static DEFINE_SPINLOCK(die_lock); |
260 | 260 | ||
261 | /* | 261 | /* |
262 | * This function is protected against re-entrancy. | 262 | * This function is protected against re-entrancy. |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 28fea9b2d129..b4348e62ef06 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -64,6 +64,10 @@ SECTIONS | |||
64 | __smpalt_end = .; | 64 | __smpalt_end = .; |
65 | #endif | 65 | #endif |
66 | 66 | ||
67 | __pv_table_begin = .; | ||
68 | *(.pv_table) | ||
69 | __pv_table_end = .; | ||
70 | |||
67 | INIT_SETUP(16) | 71 | INIT_SETUP(16) |
68 | 72 | ||
69 | INIT_CALLS | 73 | INIT_CALLS |
diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h index d42252918bfb..10d868a5a481 100644 --- a/arch/arm/lib/bitops.h +++ b/arch/arm/lib/bitops.h | |||
@@ -1,44 +1,52 @@ | |||
1 | 1 | #if __LINUX_ARM_ARCH__ >= 6 | |
2 | #if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_32v6K) | ||
3 | .macro bitop, instr | 2 | .macro bitop, instr |
3 | ands ip, r1, #3 | ||
4 | strneb r1, [ip] @ assert word-aligned | ||
4 | mov r2, #1 | 5 | mov r2, #1 |
5 | and r3, r0, #7 @ Get bit offset | 6 | and r3, r0, #31 @ Get bit offset |
6 | add r1, r1, r0, lsr #3 @ Get byte offset | 7 | mov r0, r0, lsr #5 |
8 | add r1, r1, r0, lsl #2 @ Get word offset | ||
7 | mov r3, r2, lsl r3 | 9 | mov r3, r2, lsl r3 |
8 | 1: ldrexb r2, [r1] | 10 | 1: ldrex r2, [r1] |
9 | \instr r2, r2, r3 | 11 | \instr r2, r2, r3 |
10 | strexb r0, r2, [r1] | 12 | strex r0, r2, [r1] |
11 | cmp r0, #0 | 13 | cmp r0, #0 |
12 | bne 1b | 14 | bne 1b |
13 | mov pc, lr | 15 | bx lr |
14 | .endm | 16 | .endm |
15 | 17 | ||
16 | .macro testop, instr, store | 18 | .macro testop, instr, store |
17 | and r3, r0, #7 @ Get bit offset | 19 | ands ip, r1, #3 |
20 | strneb r1, [ip] @ assert word-aligned | ||
18 | mov r2, #1 | 21 | mov r2, #1 |
19 | add r1, r1, r0, lsr #3 @ Get byte offset | 22 | and r3, r0, #31 @ Get bit offset |
23 | mov r0, r0, lsr #5 | ||
24 | add r1, r1, r0, lsl #2 @ Get word offset | ||
20 | mov r3, r2, lsl r3 @ create mask | 25 | mov r3, r2, lsl r3 @ create mask |
21 | smp_dmb | 26 | smp_dmb |
22 | 1: ldrexb r2, [r1] | 27 | 1: ldrex r2, [r1] |
23 | ands r0, r2, r3 @ save old value of bit | 28 | ands r0, r2, r3 @ save old value of bit |
24 | \instr r2, r2, r3 @ toggle bit | 29 | \instr r2, r2, r3 @ toggle bit |
25 | strexb ip, r2, [r1] | 30 | strex ip, r2, [r1] |
26 | cmp ip, #0 | 31 | cmp ip, #0 |
27 | bne 1b | 32 | bne 1b |
28 | smp_dmb | 33 | smp_dmb |
29 | cmp r0, #0 | 34 | cmp r0, #0 |
30 | movne r0, #1 | 35 | movne r0, #1 |
31 | 2: mov pc, lr | 36 | 2: bx lr |
32 | .endm | 37 | .endm |
33 | #else | 38 | #else |
34 | .macro bitop, instr | 39 | .macro bitop, instr |
35 | and r2, r0, #7 | 40 | ands ip, r1, #3 |
41 | strneb r1, [ip] @ assert word-aligned | ||
42 | and r2, r0, #31 | ||
43 | mov r0, r0, lsr #5 | ||
36 | mov r3, #1 | 44 | mov r3, #1 |
37 | mov r3, r3, lsl r2 | 45 | mov r3, r3, lsl r2 |
38 | save_and_disable_irqs ip | 46 | save_and_disable_irqs ip |
39 | ldrb r2, [r1, r0, lsr #3] | 47 | ldr r2, [r1, r0, lsl #2] |
40 | \instr r2, r2, r3 | 48 | \instr r2, r2, r3 |
41 | strb r2, [r1, r0, lsr #3] | 49 | str r2, [r1, r0, lsl #2] |
42 | restore_irqs ip | 50 | restore_irqs ip |
43 | mov pc, lr | 51 | mov pc, lr |
44 | .endm | 52 | .endm |
@@ -52,11 +60,13 @@ | |||
52 | * to avoid dirtying the data cache. | 60 | * to avoid dirtying the data cache. |
53 | */ | 61 | */ |
54 | .macro testop, instr, store | 62 | .macro testop, instr, store |
55 | add r1, r1, r0, lsr #3 | 63 | ands ip, r1, #3 |
56 | and r3, r0, #7 | 64 | strneb r1, [ip] @ assert word-aligned |
57 | mov r0, #1 | 65 | and r3, r0, #31 |
66 | mov r0, r0, lsr #5 | ||
58 | save_and_disable_irqs ip | 67 | save_and_disable_irqs ip |
59 | ldrb r2, [r1] | 68 | ldr r2, [r1, r0, lsl #2]! |
69 | mov r0, #1 | ||
60 | tst r2, r0, lsl r3 | 70 | tst r2, r0, lsl r3 |
61 | \instr r2, r2, r0, lsl r3 | 71 | \instr r2, r2, r0, lsl r3 |
62 | \store r2, [r1] | 72 | \store r2, [r1] |
diff --git a/arch/arm/lib/changebit.S b/arch/arm/lib/changebit.S index 80f3115cbee2..68ed5b62e839 100644 --- a/arch/arm/lib/changebit.S +++ b/arch/arm/lib/changebit.S | |||
@@ -12,12 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | /* Purpose : Function to change a bit | 15 | ENTRY(_change_bit) |
16 | * Prototype: int change_bit(int bit, void *addr) | ||
17 | */ | ||
18 | ENTRY(_change_bit_be) | ||
19 | eor r0, r0, #0x18 @ big endian byte ordering | ||
20 | ENTRY(_change_bit_le) | ||
21 | bitop eor | 16 | bitop eor |
22 | ENDPROC(_change_bit_be) | 17 | ENDPROC(_change_bit) |
23 | ENDPROC(_change_bit_le) | ||
diff --git a/arch/arm/lib/clearbit.S b/arch/arm/lib/clearbit.S index 1a63e43a1df0..4c04c3b51eeb 100644 --- a/arch/arm/lib/clearbit.S +++ b/arch/arm/lib/clearbit.S | |||
@@ -12,13 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | /* | 15 | ENTRY(_clear_bit) |
16 | * Purpose : Function to clear a bit | ||
17 | * Prototype: int clear_bit(int bit, void *addr) | ||
18 | */ | ||
19 | ENTRY(_clear_bit_be) | ||
20 | eor r0, r0, #0x18 @ big endian byte ordering | ||
21 | ENTRY(_clear_bit_le) | ||
22 | bitop bic | 16 | bitop bic |
23 | ENDPROC(_clear_bit_be) | 17 | ENDPROC(_clear_bit) |
24 | ENDPROC(_clear_bit_le) | ||
diff --git a/arch/arm/lib/setbit.S b/arch/arm/lib/setbit.S index 1dd7176c4b2b..bbee5c66a23e 100644 --- a/arch/arm/lib/setbit.S +++ b/arch/arm/lib/setbit.S | |||
@@ -12,13 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | /* | 15 | ENTRY(_set_bit) |
16 | * Purpose : Function to set a bit | ||
17 | * Prototype: int set_bit(int bit, void *addr) | ||
18 | */ | ||
19 | ENTRY(_set_bit_be) | ||
20 | eor r0, r0, #0x18 @ big endian byte ordering | ||
21 | ENTRY(_set_bit_le) | ||
22 | bitop orr | 16 | bitop orr |
23 | ENDPROC(_set_bit_be) | 17 | ENDPROC(_set_bit) |
24 | ENDPROC(_set_bit_le) | ||
diff --git a/arch/arm/lib/testchangebit.S b/arch/arm/lib/testchangebit.S index 5c98dc567f0f..15a4d431f229 100644 --- a/arch/arm/lib/testchangebit.S +++ b/arch/arm/lib/testchangebit.S | |||
@@ -12,9 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | ENTRY(_test_and_change_bit_be) | 15 | ENTRY(_test_and_change_bit) |
16 | eor r0, r0, #0x18 @ big endian byte ordering | 16 | testop eor, str |
17 | ENTRY(_test_and_change_bit_le) | 17 | ENDPROC(_test_and_change_bit) |
18 | testop eor, strb | ||
19 | ENDPROC(_test_and_change_bit_be) | ||
20 | ENDPROC(_test_and_change_bit_le) | ||
diff --git a/arch/arm/lib/testclearbit.S b/arch/arm/lib/testclearbit.S index 543d7094d18e..521b66b5b95d 100644 --- a/arch/arm/lib/testclearbit.S +++ b/arch/arm/lib/testclearbit.S | |||
@@ -12,9 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | ENTRY(_test_and_clear_bit_be) | 15 | ENTRY(_test_and_clear_bit) |
16 | eor r0, r0, #0x18 @ big endian byte ordering | 16 | testop bicne, strne |
17 | ENTRY(_test_and_clear_bit_le) | 17 | ENDPROC(_test_and_clear_bit) |
18 | testop bicne, strneb | ||
19 | ENDPROC(_test_and_clear_bit_be) | ||
20 | ENDPROC(_test_and_clear_bit_le) | ||
diff --git a/arch/arm/lib/testsetbit.S b/arch/arm/lib/testsetbit.S index 0b3f390401ce..1c98cc2185bb 100644 --- a/arch/arm/lib/testsetbit.S +++ b/arch/arm/lib/testsetbit.S | |||
@@ -12,9 +12,6 @@ | |||
12 | #include "bitops.h" | 12 | #include "bitops.h" |
13 | .text | 13 | .text |
14 | 14 | ||
15 | ENTRY(_test_and_set_bit_be) | 15 | ENTRY(_test_and_set_bit) |
16 | eor r0, r0, #0x18 @ big endian byte ordering | 16 | testop orreq, streq |
17 | ENTRY(_test_and_set_bit_le) | 17 | ENDPROC(_test_and_set_bit) |
18 | testop orreq, streqb | ||
19 | ENDPROC(_test_and_set_bit_be) | ||
20 | ENDPROC(_test_and_set_bit_le) | ||
diff --git a/arch/arm/mach-aaec2000/include/mach/memory.h b/arch/arm/mach-aaec2000/include/mach/memory.h index 4f93c567a35a..4a10bf0bd369 100644 --- a/arch/arm/mach-aaec2000/include/mach/memory.h +++ b/arch/arm/mach-aaec2000/include/mach/memory.h | |||
@@ -12,6 +12,6 @@ | |||
12 | #define __ASM_ARCH_MEMORY_H | 12 | #define __ASM_ARCH_MEMORY_H |
13 | 13 | ||
14 | 14 | ||
15 | #define PHYS_OFFSET UL(0xf0000000) | 15 | #define PLAT_PHYS_OFFSET UL(0xf0000000) |
16 | 16 | ||
17 | #endif /* __ASM_ARCH_MEMORY_H */ | 17 | #endif /* __ASM_ARCH_MEMORY_H */ |
diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c index 0a99b3cedd7a..17f7d9b32142 100644 --- a/arch/arm/mach-at91/board-snapper9260.c +++ b/arch/arm/mach-at91/board-snapper9260.c | |||
@@ -153,6 +153,7 @@ static struct i2c_board_info __initdata snapper9260_i2c_devices[] = { | |||
153 | { | 153 | { |
154 | /* RTC */ | 154 | /* RTC */ |
155 | I2C_BOARD_INFO("isl1208", 0x6f), | 155 | I2C_BOARD_INFO("isl1208", 0x6f), |
156 | .irq = gpio_to_irq(AT91_PIN_PA31), | ||
156 | }, | 157 | }, |
157 | }; | 158 | }; |
158 | 159 | ||
diff --git a/arch/arm/mach-at91/include/mach/gpio.h b/arch/arm/mach-at91/include/mach/gpio.h index bfdd8ab26dc8..ddeb64536756 100644 --- a/arch/arm/mach-at91/include/mach/gpio.h +++ b/arch/arm/mach-at91/include/mach/gpio.h | |||
@@ -220,15 +220,8 @@ extern void at91_gpio_resume(void); | |||
220 | #define gpio_set_value __gpio_set_value | 220 | #define gpio_set_value __gpio_set_value |
221 | #define gpio_cansleep __gpio_cansleep | 221 | #define gpio_cansleep __gpio_cansleep |
222 | 222 | ||
223 | static inline int gpio_to_irq(unsigned gpio) | 223 | #define gpio_to_irq(gpio) (gpio) |
224 | { | 224 | #define irq_to_gpio(irq) (irq) |
225 | return gpio; | ||
226 | } | ||
227 | |||
228 | static inline int irq_to_gpio(unsigned irq) | ||
229 | { | ||
230 | return irq; | ||
231 | } | ||
232 | 225 | ||
233 | #endif /* __ASSEMBLY__ */ | 226 | #endif /* __ASSEMBLY__ */ |
234 | 227 | ||
diff --git a/arch/arm/mach-at91/include/mach/memory.h b/arch/arm/mach-at91/include/mach/memory.h index 14f4ef4b6a9e..c2cfe5040642 100644 --- a/arch/arm/mach-at91/include/mach/memory.h +++ b/arch/arm/mach-at91/include/mach/memory.h | |||
@@ -23,6 +23,6 @@ | |||
23 | 23 | ||
24 | #include <mach/hardware.h> | 24 | #include <mach/hardware.h> |
25 | 25 | ||
26 | #define PHYS_OFFSET (AT91_SDRAM_BASE) | 26 | #define PLAT_PHYS_OFFSET (AT91_SDRAM_BASE) |
27 | 27 | ||
28 | #endif | 28 | #endif |
diff --git a/arch/arm/mach-bcmring/include/mach/hardware.h b/arch/arm/mach-bcmring/include/mach/hardware.h index 447eb340c611..8bf3564fba50 100644 --- a/arch/arm/mach-bcmring/include/mach/hardware.h +++ b/arch/arm/mach-bcmring/include/mach/hardware.h | |||
@@ -31,7 +31,7 @@ | |||
31 | * *_SIZE is the size of the region | 31 | * *_SIZE is the size of the region |
32 | * *_BASE is the virtual address | 32 | * *_BASE is the virtual address |
33 | */ | 33 | */ |
34 | #define RAM_START PHYS_OFFSET | 34 | #define RAM_START PLAT_PHYS_OFFSET |
35 | 35 | ||
36 | #define RAM_SIZE (CFG_GLOBAL_RAM_SIZE-CFG_GLOBAL_RAM_SIZE_RESERVED) | 36 | #define RAM_SIZE (CFG_GLOBAL_RAM_SIZE-CFG_GLOBAL_RAM_SIZE_RESERVED) |
37 | #define RAM_BASE PAGE_OFFSET | 37 | #define RAM_BASE PAGE_OFFSET |
diff --git a/arch/arm/mach-bcmring/include/mach/memory.h b/arch/arm/mach-bcmring/include/mach/memory.h index 114f942bb4f3..15162e4c75f9 100644 --- a/arch/arm/mach-bcmring/include/mach/memory.h +++ b/arch/arm/mach-bcmring/include/mach/memory.h | |||
@@ -23,7 +23,7 @@ | |||
23 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. | 23 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. |
24 | */ | 24 | */ |
25 | 25 | ||
26 | #define PHYS_OFFSET CFG_GLOBAL_RAM_BASE | 26 | #define PLAT_PHYS_OFFSET CFG_GLOBAL_RAM_BASE |
27 | 27 | ||
28 | /* | 28 | /* |
29 | * Maximum DMA memory allowed is 14M | 29 | * Maximum DMA memory allowed is 14M |
diff --git a/arch/arm/mach-clps711x/include/mach/memory.h b/arch/arm/mach-clps711x/include/mach/memory.h index f45c8e892cb5..3a032a67725c 100644 --- a/arch/arm/mach-clps711x/include/mach/memory.h +++ b/arch/arm/mach-clps711x/include/mach/memory.h | |||
@@ -23,7 +23,7 @@ | |||
23 | /* | 23 | /* |
24 | * Physical DRAM offset. | 24 | * Physical DRAM offset. |
25 | */ | 25 | */ |
26 | #define PHYS_OFFSET UL(0xc0000000) | 26 | #define PLAT_PHYS_OFFSET UL(0xc0000000) |
27 | 27 | ||
28 | #if !defined(CONFIG_ARCH_CDB89712) && !defined (CONFIG_ARCH_AUTCPU12) | 28 | #if !defined(CONFIG_ARCH_CDB89712) && !defined (CONFIG_ARCH_AUTCPU12) |
29 | 29 | ||
diff --git a/arch/arm/mach-cns3xxx/include/mach/memory.h b/arch/arm/mach-cns3xxx/include/mach/memory.h index 3b6b769b7a27..dc16c5c5d86b 100644 --- a/arch/arm/mach-cns3xxx/include/mach/memory.h +++ b/arch/arm/mach-cns3xxx/include/mach/memory.h | |||
@@ -13,7 +13,7 @@ | |||
13 | /* | 13 | /* |
14 | * Physical DRAM offset. | 14 | * Physical DRAM offset. |
15 | */ | 15 | */ |
16 | #define PHYS_OFFSET UL(0x00000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
17 | 17 | ||
18 | #define __phys_to_bus(x) ((x) + PHYS_OFFSET) | 18 | #define __phys_to_bus(x) ((x) + PHYS_OFFSET) |
19 | #define __bus_to_phys(x) ((x) - PHYS_OFFSET) | 19 | #define __bus_to_phys(x) ((x) - PHYS_OFFSET) |
diff --git a/arch/arm/mach-davinci/include/mach/memory.h b/arch/arm/mach-davinci/include/mach/memory.h index 22eb97c1c30b..78822723f382 100644 --- a/arch/arm/mach-davinci/include/mach/memory.h +++ b/arch/arm/mach-davinci/include/mach/memory.h | |||
@@ -26,9 +26,9 @@ | |||
26 | #if defined(CONFIG_ARCH_DAVINCI_DA8XX) && defined(CONFIG_ARCH_DAVINCI_DMx) | 26 | #if defined(CONFIG_ARCH_DAVINCI_DA8XX) && defined(CONFIG_ARCH_DAVINCI_DMx) |
27 | #error Cannot enable DaVinci and DA8XX platforms concurrently | 27 | #error Cannot enable DaVinci and DA8XX platforms concurrently |
28 | #elif defined(CONFIG_ARCH_DAVINCI_DA8XX) | 28 | #elif defined(CONFIG_ARCH_DAVINCI_DA8XX) |
29 | #define PHYS_OFFSET DA8XX_DDR_BASE | 29 | #define PLAT_PHYS_OFFSET DA8XX_DDR_BASE |
30 | #else | 30 | #else |
31 | #define PHYS_OFFSET DAVINCI_DDR_BASE | 31 | #define PLAT_PHYS_OFFSET DAVINCI_DDR_BASE |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | #define DDR2_SDRCR_OFFSET 0xc | 34 | #define DDR2_SDRCR_OFFSET 0xc |
diff --git a/arch/arm/mach-dove/Kconfig b/arch/arm/mach-dove/Kconfig index a4ed3900912a..dd937c526a45 100644 --- a/arch/arm/mach-dove/Kconfig +++ b/arch/arm/mach-dove/Kconfig | |||
@@ -9,7 +9,7 @@ config MACH_DOVE_DB | |||
9 | Say 'Y' here if you want your kernel to support the | 9 | Say 'Y' here if you want your kernel to support the |
10 | Marvell DB-MV88AP510 Development Board. | 10 | Marvell DB-MV88AP510 Development Board. |
11 | 11 | ||
12 | config MACH_CM_A510 | 12 | config MACH_CM_A510 |
13 | bool "CompuLab CM-A510 Board" | 13 | bool "CompuLab CM-A510 Board" |
14 | help | 14 | help |
15 | Say 'Y' here if you want your kernel to support the | 15 | Say 'Y' here if you want your kernel to support the |
diff --git a/arch/arm/mach-dove/include/mach/memory.h b/arch/arm/mach-dove/include/mach/memory.h index d66872074946..bbc93fee6c75 100644 --- a/arch/arm/mach-dove/include/mach/memory.h +++ b/arch/arm/mach-dove/include/mach/memory.h | |||
@@ -5,6 +5,6 @@ | |||
5 | #ifndef __ASM_ARCH_MEMORY_H | 5 | #ifndef __ASM_ARCH_MEMORY_H |
6 | #define __ASM_ARCH_MEMORY_H | 6 | #define __ASM_ARCH_MEMORY_H |
7 | 7 | ||
8 | #define PHYS_OFFSET UL(0x00000000) | 8 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
9 | 9 | ||
10 | #endif | 10 | #endif |
diff --git a/arch/arm/mach-ebsa110/include/mach/memory.h b/arch/arm/mach-ebsa110/include/mach/memory.h index 0ca66d080c69..8e49066ad850 100644 --- a/arch/arm/mach-ebsa110/include/mach/memory.h +++ b/arch/arm/mach-ebsa110/include/mach/memory.h | |||
@@ -19,7 +19,7 @@ | |||
19 | /* | 19 | /* |
20 | * Physical DRAM offset. | 20 | * Physical DRAM offset. |
21 | */ | 21 | */ |
22 | #define PHYS_OFFSET UL(0x00000000) | 22 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
23 | 23 | ||
24 | /* | 24 | /* |
25 | * Cache flushing area - SRAM | 25 | * Cache flushing area - SRAM |
diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index 4b0431652131..9969bb115f60 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c | |||
@@ -30,8 +30,13 @@ | |||
30 | #include <linux/gpio.h> | 30 | #include <linux/gpio.h> |
31 | #include <linux/i2c.h> | 31 | #include <linux/i2c.h> |
32 | #include <linux/i2c-gpio.h> | 32 | #include <linux/i2c-gpio.h> |
33 | #include <linux/spi/spi.h> | ||
34 | |||
35 | #include <sound/cs4271.h> | ||
33 | 36 | ||
34 | #include <mach/hardware.h> | 37 | #include <mach/hardware.h> |
38 | #include <mach/fb.h> | ||
39 | #include <mach/ep93xx_spi.h> | ||
35 | 40 | ||
36 | #include <asm/mach-types.h> | 41 | #include <asm/mach-types.h> |
37 | #include <asm/mach/arch.h> | 42 | #include <asm/mach/arch.h> |
@@ -93,6 +98,83 @@ static void __init edb93xx_register_i2c(void) | |||
93 | 98 | ||
94 | 99 | ||
95 | /************************************************************************* | 100 | /************************************************************************* |
101 | * EDB93xx SPI peripheral handling | ||
102 | *************************************************************************/ | ||
103 | static struct cs4271_platform_data edb93xx_cs4271_data = { | ||
104 | .gpio_nreset = -EINVAL, /* filled in later */ | ||
105 | }; | ||
106 | |||
107 | static int edb93xx_cs4271_hw_setup(struct spi_device *spi) | ||
108 | { | ||
109 | return gpio_request_one(EP93XX_GPIO_LINE_EGPIO6, | ||
110 | GPIOF_OUT_INIT_HIGH, spi->modalias); | ||
111 | } | ||
112 | |||
113 | static void edb93xx_cs4271_hw_cleanup(struct spi_device *spi) | ||
114 | { | ||
115 | gpio_free(EP93XX_GPIO_LINE_EGPIO6); | ||
116 | } | ||
117 | |||
118 | static void edb93xx_cs4271_hw_cs_control(struct spi_device *spi, int value) | ||
119 | { | ||
120 | gpio_set_value(EP93XX_GPIO_LINE_EGPIO6, value); | ||
121 | } | ||
122 | |||
123 | static struct ep93xx_spi_chip_ops edb93xx_cs4271_hw = { | ||
124 | .setup = edb93xx_cs4271_hw_setup, | ||
125 | .cleanup = edb93xx_cs4271_hw_cleanup, | ||
126 | .cs_control = edb93xx_cs4271_hw_cs_control, | ||
127 | }; | ||
128 | |||
129 | static struct spi_board_info edb93xx_spi_board_info[] __initdata = { | ||
130 | { | ||
131 | .modalias = "cs4271", | ||
132 | .platform_data = &edb93xx_cs4271_data, | ||
133 | .controller_data = &edb93xx_cs4271_hw, | ||
134 | .max_speed_hz = 6000000, | ||
135 | .bus_num = 0, | ||
136 | .chip_select = 0, | ||
137 | .mode = SPI_MODE_3, | ||
138 | }, | ||
139 | }; | ||
140 | |||
141 | static struct ep93xx_spi_info edb93xx_spi_info __initdata = { | ||
142 | .num_chipselect = ARRAY_SIZE(edb93xx_spi_board_info), | ||
143 | }; | ||
144 | |||
145 | static void __init edb93xx_register_spi(void) | ||
146 | { | ||
147 | if (machine_is_edb9301() || machine_is_edb9302()) | ||
148 | edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_EGPIO1; | ||
149 | else if (machine_is_edb9302a() || machine_is_edb9307a()) | ||
150 | edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_H(2); | ||
151 | else if (machine_is_edb9315a()) | ||
152 | edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_EGPIO14; | ||
153 | |||
154 | ep93xx_register_spi(&edb93xx_spi_info, edb93xx_spi_board_info, | ||
155 | ARRAY_SIZE(edb93xx_spi_board_info)); | ||
156 | } | ||
157 | |||
158 | |||
159 | /************************************************************************* | ||
160 | * EDB93xx I2S | ||
161 | *************************************************************************/ | ||
162 | static int __init edb93xx_has_audio(void) | ||
163 | { | ||
164 | return (machine_is_edb9301() || machine_is_edb9302() || | ||
165 | machine_is_edb9302a() || machine_is_edb9307a() || | ||
166 | machine_is_edb9315a()); | ||
167 | } | ||
168 | |||
169 | static void __init edb93xx_register_i2s(void) | ||
170 | { | ||
171 | if (edb93xx_has_audio()) { | ||
172 | ep93xx_register_i2s(); | ||
173 | } | ||
174 | } | ||
175 | |||
176 | |||
177 | /************************************************************************* | ||
96 | * EDB93xx pwm | 178 | * EDB93xx pwm |
97 | *************************************************************************/ | 179 | *************************************************************************/ |
98 | static void __init edb93xx_register_pwm(void) | 180 | static void __init edb93xx_register_pwm(void) |
@@ -111,13 +193,47 @@ static void __init edb93xx_register_pwm(void) | |||
111 | } | 193 | } |
112 | 194 | ||
113 | 195 | ||
196 | /************************************************************************* | ||
197 | * EDB93xx framebuffer | ||
198 | *************************************************************************/ | ||
199 | static struct ep93xxfb_mach_info __initdata edb93xxfb_info = { | ||
200 | .num_modes = EP93XXFB_USE_MODEDB, | ||
201 | .bpp = 16, | ||
202 | .flags = 0, | ||
203 | }; | ||
204 | |||
205 | static int __init edb93xx_has_fb(void) | ||
206 | { | ||
207 | /* These platforms have an ep93xx with video capability */ | ||
208 | return machine_is_edb9307() || machine_is_edb9307a() || | ||
209 | machine_is_edb9312() || machine_is_edb9315() || | ||
210 | machine_is_edb9315a(); | ||
211 | } | ||
212 | |||
213 | static void __init edb93xx_register_fb(void) | ||
214 | { | ||
215 | if (!edb93xx_has_fb()) | ||
216 | return; | ||
217 | |||
218 | if (machine_is_edb9307a() || machine_is_edb9315a()) | ||
219 | edb93xxfb_info.flags |= EP93XXFB_USE_SDCSN0; | ||
220 | else | ||
221 | edb93xxfb_info.flags |= EP93XXFB_USE_SDCSN3; | ||
222 | |||
223 | ep93xx_register_fb(&edb93xxfb_info); | ||
224 | } | ||
225 | |||
226 | |||
114 | static void __init edb93xx_init_machine(void) | 227 | static void __init edb93xx_init_machine(void) |
115 | { | 228 | { |
116 | ep93xx_init_devices(); | 229 | ep93xx_init_devices(); |
117 | edb93xx_register_flash(); | 230 | edb93xx_register_flash(); |
118 | ep93xx_register_eth(&edb93xx_eth_data, 1); | 231 | ep93xx_register_eth(&edb93xx_eth_data, 1); |
119 | edb93xx_register_i2c(); | 232 | edb93xx_register_i2c(); |
233 | edb93xx_register_spi(); | ||
234 | edb93xx_register_i2s(); | ||
120 | edb93xx_register_pwm(); | 235 | edb93xx_register_pwm(); |
236 | edb93xx_register_fb(); | ||
121 | } | 237 | } |
122 | 238 | ||
123 | 239 | ||
diff --git a/arch/arm/mach-ep93xx/gpio.c b/arch/arm/mach-ep93xx/gpio.c index bec34b834958..a889fa7c3ba1 100644 --- a/arch/arm/mach-ep93xx/gpio.c +++ b/arch/arm/mach-ep93xx/gpio.c | |||
@@ -61,7 +61,7 @@ static inline void ep93xx_gpio_int_mask(unsigned line) | |||
61 | gpio_int_unmasked[line >> 3] &= ~(1 << (line & 7)); | 61 | gpio_int_unmasked[line >> 3] &= ~(1 << (line & 7)); |
62 | } | 62 | } |
63 | 63 | ||
64 | void ep93xx_gpio_int_debounce(unsigned int irq, int enable) | 64 | static void ep93xx_gpio_int_debounce(unsigned int irq, bool enable) |
65 | { | 65 | { |
66 | int line = irq_to_gpio(irq); | 66 | int line = irq_to_gpio(irq); |
67 | int port = line >> 3; | 67 | int port = line >> 3; |
@@ -75,7 +75,6 @@ void ep93xx_gpio_int_debounce(unsigned int irq, int enable) | |||
75 | __raw_writeb(gpio_int_debounce[port], | 75 | __raw_writeb(gpio_int_debounce[port], |
76 | EP93XX_GPIO_REG(int_debounce_register_offset[port])); | 76 | EP93XX_GPIO_REG(int_debounce_register_offset[port])); |
77 | } | 77 | } |
78 | EXPORT_SYMBOL(ep93xx_gpio_int_debounce); | ||
79 | 78 | ||
80 | static void ep93xx_gpio_ab_irq_handler(unsigned int irq, struct irq_desc *desc) | 79 | static void ep93xx_gpio_ab_irq_handler(unsigned int irq, struct irq_desc *desc) |
81 | { | 80 | { |
@@ -335,6 +334,20 @@ static void ep93xx_gpio_set(struct gpio_chip *chip, unsigned offset, int val) | |||
335 | local_irq_restore(flags); | 334 | local_irq_restore(flags); |
336 | } | 335 | } |
337 | 336 | ||
337 | static int ep93xx_gpio_set_debounce(struct gpio_chip *chip, | ||
338 | unsigned offset, unsigned debounce) | ||
339 | { | ||
340 | int gpio = chip->base + offset; | ||
341 | int irq = gpio_to_irq(gpio); | ||
342 | |||
343 | if (irq < 0) | ||
344 | return -EINVAL; | ||
345 | |||
346 | ep93xx_gpio_int_debounce(irq, debounce ? true : false); | ||
347 | |||
348 | return 0; | ||
349 | } | ||
350 | |||
338 | static void ep93xx_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) | 351 | static void ep93xx_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) |
339 | { | 352 | { |
340 | struct ep93xx_gpio_chip *ep93xx_chip = to_ep93xx_gpio_chip(chip); | 353 | struct ep93xx_gpio_chip *ep93xx_chip = to_ep93xx_gpio_chip(chip); |
@@ -434,6 +447,18 @@ void __init ep93xx_gpio_init(void) | |||
434 | EP93XX_SYSCON_DEVCFG_GONIDE | | 447 | EP93XX_SYSCON_DEVCFG_GONIDE | |
435 | EP93XX_SYSCON_DEVCFG_HONIDE); | 448 | EP93XX_SYSCON_DEVCFG_HONIDE); |
436 | 449 | ||
437 | for (i = 0; i < ARRAY_SIZE(ep93xx_gpio_banks); i++) | 450 | for (i = 0; i < ARRAY_SIZE(ep93xx_gpio_banks); i++) { |
438 | gpiochip_add(&ep93xx_gpio_banks[i].chip); | 451 | struct gpio_chip *chip = &ep93xx_gpio_banks[i].chip; |
452 | |||
453 | /* | ||
454 | * Ports A, B, and F support input debouncing when | ||
455 | * used as interrupts. | ||
456 | */ | ||
457 | if (!strcmp(chip->label, "A") || | ||
458 | !strcmp(chip->label, "B") || | ||
459 | !strcmp(chip->label, "F")) | ||
460 | chip->set_debounce = ep93xx_gpio_set_debounce; | ||
461 | |||
462 | gpiochip_add(chip); | ||
463 | } | ||
439 | } | 464 | } |
diff --git a/arch/arm/mach-ep93xx/include/mach/gpio.h b/arch/arm/mach-ep93xx/include/mach/gpio.h index c991b149bdf2..c57152c231f1 100644 --- a/arch/arm/mach-ep93xx/include/mach/gpio.h +++ b/arch/arm/mach-ep93xx/include/mach/gpio.h | |||
@@ -99,8 +99,6 @@ | |||
99 | /* maximum value for irq capable line identifiers */ | 99 | /* maximum value for irq capable line identifiers */ |
100 | #define EP93XX_GPIO_LINE_MAX_IRQ EP93XX_GPIO_LINE_F(7) | 100 | #define EP93XX_GPIO_LINE_MAX_IRQ EP93XX_GPIO_LINE_F(7) |
101 | 101 | ||
102 | extern void ep93xx_gpio_int_debounce(unsigned int irq, int enable); | ||
103 | |||
104 | /* new generic GPIO API - see Documentation/gpio.txt */ | 102 | /* new generic GPIO API - see Documentation/gpio.txt */ |
105 | 103 | ||
106 | #include <asm-generic/gpio.h> | 104 | #include <asm-generic/gpio.h> |
diff --git a/arch/arm/mach-ep93xx/include/mach/memory.h b/arch/arm/mach-ep93xx/include/mach/memory.h index 554064e90307..c9400cf0051c 100644 --- a/arch/arm/mach-ep93xx/include/mach/memory.h +++ b/arch/arm/mach-ep93xx/include/mach/memory.h | |||
@@ -6,15 +6,15 @@ | |||
6 | #define __ASM_ARCH_MEMORY_H | 6 | #define __ASM_ARCH_MEMORY_H |
7 | 7 | ||
8 | #if defined(CONFIG_EP93XX_SDCE3_SYNC_PHYS_OFFSET) | 8 | #if defined(CONFIG_EP93XX_SDCE3_SYNC_PHYS_OFFSET) |
9 | #define PHYS_OFFSET UL(0x00000000) | 9 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
10 | #elif defined(CONFIG_EP93XX_SDCE0_PHYS_OFFSET) | 10 | #elif defined(CONFIG_EP93XX_SDCE0_PHYS_OFFSET) |
11 | #define PHYS_OFFSET UL(0xc0000000) | 11 | #define PLAT_PHYS_OFFSET UL(0xc0000000) |
12 | #elif defined(CONFIG_EP93XX_SDCE1_PHYS_OFFSET) | 12 | #elif defined(CONFIG_EP93XX_SDCE1_PHYS_OFFSET) |
13 | #define PHYS_OFFSET UL(0xd0000000) | 13 | #define PLAT_PHYS_OFFSET UL(0xd0000000) |
14 | #elif defined(CONFIG_EP93XX_SDCE2_PHYS_OFFSET) | 14 | #elif defined(CONFIG_EP93XX_SDCE2_PHYS_OFFSET) |
15 | #define PHYS_OFFSET UL(0xe0000000) | 15 | #define PLAT_PHYS_OFFSET UL(0xe0000000) |
16 | #elif defined(CONFIG_EP93XX_SDCE3_ASYNC_PHYS_OFFSET) | 16 | #elif defined(CONFIG_EP93XX_SDCE3_ASYNC_PHYS_OFFSET) |
17 | #define PHYS_OFFSET UL(0xf0000000) | 17 | #define PLAT_PHYS_OFFSET UL(0xf0000000) |
18 | #else | 18 | #else |
19 | #error "Kconfig bug: No EP93xx PHYS_OFFSET set" | 19 | #error "Kconfig bug: No EP93xx PHYS_OFFSET set" |
20 | #endif | 20 | #endif |
diff --git a/arch/arm/mach-footbridge/dc21285-timer.c b/arch/arm/mach-footbridge/dc21285-timer.c index bc5e83fb5819..a921fe92b858 100644 --- a/arch/arm/mach-footbridge/dc21285-timer.c +++ b/arch/arm/mach-footbridge/dc21285-timer.c | |||
@@ -4,10 +4,11 @@ | |||
4 | * Copyright (C) 1998 Russell King. | 4 | * Copyright (C) 1998 Russell King. |
5 | * Copyright (C) 1998 Phil Blundell | 5 | * Copyright (C) 1998 Phil Blundell |
6 | */ | 6 | */ |
7 | #include <linux/clockchips.h> | ||
8 | #include <linux/clocksource.h> | ||
7 | #include <linux/init.h> | 9 | #include <linux/init.h> |
8 | #include <linux/interrupt.h> | 10 | #include <linux/interrupt.h> |
9 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
10 | #include <linux/spinlock.h> | ||
11 | 12 | ||
12 | #include <asm/irq.h> | 13 | #include <asm/irq.h> |
13 | 14 | ||
@@ -16,32 +17,76 @@ | |||
16 | 17 | ||
17 | #include "common.h" | 18 | #include "common.h" |
18 | 19 | ||
19 | /* | 20 | static cycle_t cksrc_dc21285_read(struct clocksource *cs) |
20 | * Footbridge timer 1 support. | 21 | { |
21 | */ | 22 | return cs->mask - *CSR_TIMER2_VALUE; |
22 | static unsigned long timer1_latch; | 23 | } |
23 | 24 | ||
24 | static unsigned long timer1_gettimeoffset (void) | 25 | static int cksrc_dc21285_enable(struct clocksource *cs) |
25 | { | 26 | { |
26 | unsigned long value = timer1_latch - *CSR_TIMER1_VALUE; | 27 | *CSR_TIMER2_LOAD = cs->mask; |
28 | *CSR_TIMER2_CLR = 0; | ||
29 | *CSR_TIMER2_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_DIV16; | ||
30 | return 0; | ||
31 | } | ||
27 | 32 | ||
28 | return ((tick_nsec / 1000) * value) / timer1_latch; | 33 | static int cksrc_dc21285_disable(struct clocksource *cs) |
34 | { | ||
35 | *CSR_TIMER2_CNTL = 0; | ||
29 | } | 36 | } |
30 | 37 | ||
31 | static irqreturn_t | 38 | static struct clocksource cksrc_dc21285 = { |
32 | timer1_interrupt(int irq, void *dev_id) | 39 | .name = "dc21285_timer2", |
40 | .rating = 200, | ||
41 | .read = cksrc_dc21285_read, | ||
42 | .enable = cksrc_dc21285_enable, | ||
43 | .disable = cksrc_dc21285_disable, | ||
44 | .mask = CLOCKSOURCE_MASK(24), | ||
45 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
46 | }; | ||
47 | |||
48 | static void ckevt_dc21285_set_mode(enum clock_event_mode mode, | ||
49 | struct clock_event_device *c) | ||
33 | { | 50 | { |
51 | switch (mode) { | ||
52 | case CLOCK_EVT_MODE_RESUME: | ||
53 | case CLOCK_EVT_MODE_PERIODIC: | ||
54 | *CSR_TIMER1_CLR = 0; | ||
55 | *CSR_TIMER1_LOAD = (mem_fclk_21285 + 8 * HZ) / (16 * HZ); | ||
56 | *CSR_TIMER1_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_AUTORELOAD | | ||
57 | TIMER_CNTL_DIV16; | ||
58 | break; | ||
59 | |||
60 | default: | ||
61 | *CSR_TIMER1_CNTL = 0; | ||
62 | break; | ||
63 | } | ||
64 | } | ||
65 | |||
66 | static struct clock_event_device ckevt_dc21285 = { | ||
67 | .name = "dc21285_timer1", | ||
68 | .features = CLOCK_EVT_FEAT_PERIODIC, | ||
69 | .rating = 200, | ||
70 | .irq = IRQ_TIMER1, | ||
71 | .set_mode = ckevt_dc21285_set_mode, | ||
72 | }; | ||
73 | |||
74 | static irqreturn_t timer1_interrupt(int irq, void *dev_id) | ||
75 | { | ||
76 | struct clock_event_device *ce = dev_id; | ||
77 | |||
34 | *CSR_TIMER1_CLR = 0; | 78 | *CSR_TIMER1_CLR = 0; |
35 | 79 | ||
36 | timer_tick(); | 80 | ce->event_handler(ce); |
37 | 81 | ||
38 | return IRQ_HANDLED; | 82 | return IRQ_HANDLED; |
39 | } | 83 | } |
40 | 84 | ||
41 | static struct irqaction footbridge_timer_irq = { | 85 | static struct irqaction footbridge_timer_irq = { |
42 | .name = "Timer1 timer tick", | 86 | .name = "dc21285_timer1", |
43 | .handler = timer1_interrupt, | 87 | .handler = timer1_interrupt, |
44 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | 88 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, |
89 | .dev_id = &ckevt_dc21285, | ||
45 | }; | 90 | }; |
46 | 91 | ||
47 | /* | 92 | /* |
@@ -49,16 +94,19 @@ static struct irqaction footbridge_timer_irq = { | |||
49 | */ | 94 | */ |
50 | static void __init footbridge_timer_init(void) | 95 | static void __init footbridge_timer_init(void) |
51 | { | 96 | { |
52 | timer1_latch = (mem_fclk_21285 + 8 * HZ) / (16 * HZ); | 97 | struct clock_event_device *ce = &ckevt_dc21285; |
98 | |||
99 | clocksource_register_hz(&cksrc_dc21285, (mem_fclk_21285 + 8) / 16); | ||
100 | |||
101 | setup_irq(ce->irq, &footbridge_timer_irq); | ||
53 | 102 | ||
54 | *CSR_TIMER1_CLR = 0; | 103 | clockevents_calc_mult_shift(ce, mem_fclk_21285, 5); |
55 | *CSR_TIMER1_LOAD = timer1_latch; | 104 | ce->max_delta_ns = clockevent_delta2ns(0xffffff, ce); |
56 | *CSR_TIMER1_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_AUTORELOAD | TIMER_CNTL_DIV16; | 105 | ce->min_delta_ns = clockevent_delta2ns(0x000004, ce); |
57 | 106 | ||
58 | setup_irq(IRQ_TIMER1, &footbridge_timer_irq); | 107 | clockevents_register_device(ce); |
59 | } | 108 | } |
60 | 109 | ||
61 | struct sys_timer footbridge_timer = { | 110 | struct sys_timer footbridge_timer = { |
62 | .init = footbridge_timer_init, | 111 | .init = footbridge_timer_init, |
63 | .offset = timer1_gettimeoffset, | ||
64 | }; | 112 | }; |
diff --git a/arch/arm/mach-footbridge/include/mach/hardware.h b/arch/arm/mach-footbridge/include/mach/hardware.h index 51dd902043ad..b6fdf23ecf6c 100644 --- a/arch/arm/mach-footbridge/include/mach/hardware.h +++ b/arch/arm/mach-footbridge/include/mach/hardware.h | |||
@@ -23,26 +23,33 @@ | |||
23 | * 0xf9000000 0x50000000 1MB Cache flush | 23 | * 0xf9000000 0x50000000 1MB Cache flush |
24 | * 0xf0000000 0x80000000 16MB ISA memory | 24 | * 0xf0000000 0x80000000 16MB ISA memory |
25 | */ | 25 | */ |
26 | |||
27 | #ifdef CONFIG_MMU | ||
28 | #define MMU_IO(a, b) (a) | ||
29 | #else | ||
30 | #define MMU_IO(a, b) (b) | ||
31 | #endif | ||
32 | |||
26 | #define XBUS_SIZE 0x00100000 | 33 | #define XBUS_SIZE 0x00100000 |
27 | #define XBUS_BASE 0xff800000 | 34 | #define XBUS_BASE MMU_IO(0xff800000, 0x40000000) |
28 | 35 | ||
29 | #define ARMCSR_SIZE 0x00100000 | 36 | #define ARMCSR_SIZE 0x00100000 |
30 | #define ARMCSR_BASE 0xfe000000 | 37 | #define ARMCSR_BASE MMU_IO(0xfe000000, 0x42000000) |
31 | 38 | ||
32 | #define WFLUSH_SIZE 0x00100000 | 39 | #define WFLUSH_SIZE 0x00100000 |
33 | #define WFLUSH_BASE 0xfd000000 | 40 | #define WFLUSH_BASE MMU_IO(0xfd000000, 0x78000000) |
34 | 41 | ||
35 | #define PCIIACK_SIZE 0x00100000 | 42 | #define PCIIACK_SIZE 0x00100000 |
36 | #define PCIIACK_BASE 0xfc000000 | 43 | #define PCIIACK_BASE MMU_IO(0xfc000000, 0x79000000) |
37 | 44 | ||
38 | #define PCICFG1_SIZE 0x01000000 | 45 | #define PCICFG1_SIZE 0x01000000 |
39 | #define PCICFG1_BASE 0xfb000000 | 46 | #define PCICFG1_BASE MMU_IO(0xfb000000, 0x7a000000) |
40 | 47 | ||
41 | #define PCICFG0_SIZE 0x01000000 | 48 | #define PCICFG0_SIZE 0x01000000 |
42 | #define PCICFG0_BASE 0xfa000000 | 49 | #define PCICFG0_BASE MMU_IO(0xfa000000, 0x7b000000) |
43 | 50 | ||
44 | #define PCIMEM_SIZE 0x01000000 | 51 | #define PCIMEM_SIZE 0x01000000 |
45 | #define PCIMEM_BASE 0xf0000000 | 52 | #define PCIMEM_BASE MMU_IO(0xf0000000, 0x80000000) |
46 | 53 | ||
47 | #define XBUS_LEDS ((volatile unsigned char *)(XBUS_BASE + 0x12000)) | 54 | #define XBUS_LEDS ((volatile unsigned char *)(XBUS_BASE + 0x12000)) |
48 | #define XBUS_LED_AMBER (1 << 0) | 55 | #define XBUS_LED_AMBER (1 << 0) |
diff --git a/arch/arm/mach-footbridge/include/mach/io.h b/arch/arm/mach-footbridge/include/mach/io.h index 101a4fe90bde..32e4cc397c28 100644 --- a/arch/arm/mach-footbridge/include/mach/io.h +++ b/arch/arm/mach-footbridge/include/mach/io.h | |||
@@ -14,8 +14,14 @@ | |||
14 | #ifndef __ASM_ARM_ARCH_IO_H | 14 | #ifndef __ASM_ARM_ARCH_IO_H |
15 | #define __ASM_ARM_ARCH_IO_H | 15 | #define __ASM_ARM_ARCH_IO_H |
16 | 16 | ||
17 | #define PCIO_SIZE 0x00100000 | 17 | #ifdef CONFIG_MMU |
18 | #define PCIO_BASE 0xff000000 | 18 | #define MMU_IO(a, b) (a) |
19 | #else | ||
20 | #define MMU_IO(a, b) (b) | ||
21 | #endif | ||
22 | |||
23 | #define PCIO_SIZE 0x00100000 | ||
24 | #define PCIO_BASE MMU_IO(0xff000000, 0x7c000000) | ||
19 | 25 | ||
20 | #define IO_SPACE_LIMIT 0xffff | 26 | #define IO_SPACE_LIMIT 0xffff |
21 | 27 | ||
diff --git a/arch/arm/mach-footbridge/include/mach/memory.h b/arch/arm/mach-footbridge/include/mach/memory.h index 8d64f4574087..5c6df377f969 100644 --- a/arch/arm/mach-footbridge/include/mach/memory.h +++ b/arch/arm/mach-footbridge/include/mach/memory.h | |||
@@ -62,7 +62,7 @@ extern unsigned long __bus_to_pfn(unsigned long); | |||
62 | /* | 62 | /* |
63 | * Physical DRAM offset. | 63 | * Physical DRAM offset. |
64 | */ | 64 | */ |
65 | #define PHYS_OFFSET UL(0x00000000) | 65 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
66 | 66 | ||
67 | #define FLUSH_BASE_PHYS 0x50000000 | 67 | #define FLUSH_BASE_PHYS 0x50000000 |
68 | 68 | ||
diff --git a/arch/arm/mach-footbridge/isa-timer.c b/arch/arm/mach-footbridge/isa-timer.c index f488fa2082d7..441c6ce0d555 100644 --- a/arch/arm/mach-footbridge/isa-timer.c +++ b/arch/arm/mach-footbridge/isa-timer.c | |||
@@ -4,10 +4,13 @@ | |||
4 | * Copyright (C) 1998 Russell King. | 4 | * Copyright (C) 1998 Russell King. |
5 | * Copyright (C) 1998 Phil Blundell | 5 | * Copyright (C) 1998 Phil Blundell |
6 | */ | 6 | */ |
7 | #include <linux/clockchips.h> | ||
8 | #include <linux/clocksource.h> | ||
7 | #include <linux/init.h> | 9 | #include <linux/init.h> |
8 | #include <linux/interrupt.h> | 10 | #include <linux/interrupt.h> |
9 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
10 | #include <linux/io.h> | 12 | #include <linux/io.h> |
13 | #include <linux/timex.h> | ||
11 | 14 | ||
12 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
13 | 16 | ||
@@ -15,77 +18,115 @@ | |||
15 | 18 | ||
16 | #include "common.h" | 19 | #include "common.h" |
17 | 20 | ||
18 | /* | 21 | #define PIT_MODE 0x43 |
19 | * ISA timer tick support | 22 | #define PIT_CH0 0x40 |
20 | */ | 23 | |
21 | #define mSEC_10_from_14 ((14318180 + 100) / 200) | 24 | #define PIT_LATCH ((PIT_TICK_RATE + HZ / 2) / HZ) |
22 | 25 | ||
23 | static unsigned long isa_gettimeoffset(void) | 26 | static cycle_t pit_read(struct clocksource *cs) |
24 | { | 27 | { |
28 | unsigned long flags; | ||
29 | static int old_count; | ||
30 | static u32 old_jifs; | ||
25 | int count; | 31 | int count; |
32 | u32 jifs; | ||
26 | 33 | ||
27 | static int count_p = (mSEC_10_from_14/6); /* for the first call after boot */ | 34 | raw_local_irq_save(flags); |
28 | static unsigned long jiffies_p = 0; | ||
29 | 35 | ||
30 | /* | 36 | jifs = jiffies; |
31 | * cache volatile jiffies temporarily; we have IRQs turned off. | 37 | outb_p(0x00, PIT_MODE); /* latch the count */ |
32 | */ | 38 | count = inb_p(PIT_CH0); /* read the latched count */ |
33 | unsigned long jiffies_t; | 39 | count |= inb_p(PIT_CH0) << 8; |
34 | 40 | ||
35 | /* timer count may underflow right here */ | 41 | if (count > old_count && jifs == old_jifs) |
36 | outb_p(0x00, 0x43); /* latch the count ASAP */ | 42 | count = old_count; |
37 | 43 | ||
38 | count = inb_p(0x40); /* read the latched count */ | 44 | old_count = count; |
45 | old_jifs = jifs; | ||
39 | 46 | ||
40 | /* | 47 | raw_local_irq_restore(flags); |
41 | * We do this guaranteed double memory access instead of a _p | ||
42 | * postfix in the previous port access. Wheee, hackady hack | ||
43 | */ | ||
44 | jiffies_t = jiffies; | ||
45 | 48 | ||
46 | count |= inb_p(0x40) << 8; | 49 | count = (PIT_LATCH - 1) - count; |
47 | 50 | ||
48 | /* Detect timer underflows. If we haven't had a timer tick since | 51 | return (cycle_t)(jifs * PIT_LATCH) + count; |
49 | the last time we were called, and time is apparently going | 52 | } |
50 | backwards, the counter must have wrapped during this routine. */ | ||
51 | if ((jiffies_t == jiffies_p) && (count > count_p)) | ||
52 | count -= (mSEC_10_from_14/6); | ||
53 | else | ||
54 | jiffies_p = jiffies_t; | ||
55 | 53 | ||
56 | count_p = count; | 54 | static struct clocksource pit_cs = { |
55 | .name = "pit", | ||
56 | .rating = 110, | ||
57 | .read = pit_read, | ||
58 | .mask = CLOCKSOURCE_MASK(32), | ||
59 | }; | ||
57 | 60 | ||
58 | count = (((mSEC_10_from_14/6)-1) - count) * (tick_nsec / 1000); | 61 | static void pit_set_mode(enum clock_event_mode mode, |
59 | count = (count + (mSEC_10_from_14/6)/2) / (mSEC_10_from_14/6); | 62 | struct clock_event_device *evt) |
63 | { | ||
64 | unsigned long flags; | ||
65 | |||
66 | raw_local_irq_save(flags); | ||
67 | |||
68 | switch (mode) { | ||
69 | case CLOCK_EVT_MODE_PERIODIC: | ||
70 | outb_p(0x34, PIT_MODE); | ||
71 | outb_p(PIT_LATCH & 0xff, PIT_CH0); | ||
72 | outb_p(PIT_LATCH >> 8, PIT_CH0); | ||
73 | break; | ||
74 | |||
75 | case CLOCK_EVT_MODE_SHUTDOWN: | ||
76 | case CLOCK_EVT_MODE_UNUSED: | ||
77 | outb_p(0x30, PIT_MODE); | ||
78 | outb_p(0, PIT_CH0); | ||
79 | outb_p(0, PIT_CH0); | ||
80 | break; | ||
81 | |||
82 | case CLOCK_EVT_MODE_ONESHOT: | ||
83 | case CLOCK_EVT_MODE_RESUME: | ||
84 | break; | ||
85 | } | ||
86 | local_irq_restore(flags); | ||
87 | } | ||
60 | 88 | ||
61 | return count; | 89 | static int pit_set_next_event(unsigned long delta, |
90 | struct clock_event_device *evt) | ||
91 | { | ||
92 | return 0; | ||
62 | } | 93 | } |
63 | 94 | ||
64 | static irqreturn_t | 95 | static struct clock_event_device pit_ce = { |
65 | isa_timer_interrupt(int irq, void *dev_id) | 96 | .name = "pit", |
97 | .features = CLOCK_EVT_FEAT_PERIODIC, | ||
98 | .set_mode = pit_set_mode, | ||
99 | .set_next_event = pit_set_next_event, | ||
100 | .shift = 32, | ||
101 | }; | ||
102 | |||
103 | static irqreturn_t pit_timer_interrupt(int irq, void *dev_id) | ||
66 | { | 104 | { |
67 | timer_tick(); | 105 | struct clock_event_device *ce = dev_id; |
106 | ce->event_handler(ce); | ||
68 | return IRQ_HANDLED; | 107 | return IRQ_HANDLED; |
69 | } | 108 | } |
70 | 109 | ||
71 | static struct irqaction isa_timer_irq = { | 110 | static struct irqaction pit_timer_irq = { |
72 | .name = "ISA timer tick", | 111 | .name = "pit", |
73 | .handler = isa_timer_interrupt, | 112 | .handler = pit_timer_interrupt, |
74 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | 113 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, |
114 | .dev_id = &pit_ce, | ||
75 | }; | 115 | }; |
76 | 116 | ||
77 | static void __init isa_timer_init(void) | 117 | static void __init isa_timer_init(void) |
78 | { | 118 | { |
79 | /* enable PIT timer */ | 119 | pit_ce.cpumask = cpumask_of(smp_processor_id()); |
80 | /* set for periodic (4) and LSB/MSB write (0x30) */ | 120 | pit_ce.mult = div_sc(PIT_TICK_RATE, NSEC_PER_SEC, pit_ce.shift); |
81 | outb(0x34, 0x43); | 121 | pit_ce.max_delta_ns = clockevent_delta2ns(0x7fff, &pit_ce); |
82 | outb((mSEC_10_from_14/6) & 0xFF, 0x40); | 122 | pit_ce.min_delta_ns = clockevent_delta2ns(0x000f, &pit_ce); |
83 | outb((mSEC_10_from_14/6) >> 8, 0x40); | 123 | |
124 | clocksource_register_hz(&pit_cs, PIT_TICK_RATE); | ||
84 | 125 | ||
85 | setup_irq(IRQ_ISA_TIMER, &isa_timer_irq); | 126 | setup_irq(pit_ce.irq, &pit_timer_irq); |
127 | clockevents_register_device(&pit_ce); | ||
86 | } | 128 | } |
87 | 129 | ||
88 | struct sys_timer isa_timer = { | 130 | struct sys_timer isa_timer = { |
89 | .init = isa_timer_init, | 131 | .init = isa_timer_init, |
90 | .offset = isa_gettimeoffset, | ||
91 | }; | 132 | }; |
diff --git a/arch/arm/mach-gemini/board-nas4220b.c b/arch/arm/mach-gemini/board-nas4220b.c index 2ba096de0034..0cf7a07c3f3f 100644 --- a/arch/arm/mach-gemini/board-nas4220b.c +++ b/arch/arm/mach-gemini/board-nas4220b.c | |||
@@ -98,6 +98,7 @@ static void __init ib4220b_init(void) | |||
98 | platform_register_pflash(SZ_16M, NULL, 0); | 98 | platform_register_pflash(SZ_16M, NULL, 0); |
99 | platform_device_register(&ib4220b_led_device); | 99 | platform_device_register(&ib4220b_led_device); |
100 | platform_device_register(&ib4220b_key_device); | 100 | platform_device_register(&ib4220b_key_device); |
101 | platform_register_rtc(); | ||
101 | } | 102 | } |
102 | 103 | ||
103 | MACHINE_START(NAS4220B, "Raidsonic NAS IB-4220-B") | 104 | MACHINE_START(NAS4220B, "Raidsonic NAS IB-4220-B") |
diff --git a/arch/arm/mach-gemini/board-rut1xx.c b/arch/arm/mach-gemini/board-rut1xx.c index a9a0d8b01942..4fa09af99495 100644 --- a/arch/arm/mach-gemini/board-rut1xx.c +++ b/arch/arm/mach-gemini/board-rut1xx.c | |||
@@ -82,6 +82,7 @@ static void __init rut1xx_init(void) | |||
82 | platform_register_pflash(SZ_8M, NULL, 0); | 82 | platform_register_pflash(SZ_8M, NULL, 0); |
83 | platform_device_register(&rut1xx_leds); | 83 | platform_device_register(&rut1xx_leds); |
84 | platform_device_register(&rut1xx_keys_device); | 84 | platform_device_register(&rut1xx_keys_device); |
85 | platform_register_rtc(); | ||
85 | } | 86 | } |
86 | 87 | ||
87 | MACHINE_START(RUT100, "Teltonika RUT100") | 88 | MACHINE_START(RUT100, "Teltonika RUT100") |
diff --git a/arch/arm/mach-gemini/board-wbd111.c b/arch/arm/mach-gemini/board-wbd111.c index 8b88d50d4337..af7b68a6b258 100644 --- a/arch/arm/mach-gemini/board-wbd111.c +++ b/arch/arm/mach-gemini/board-wbd111.c | |||
@@ -130,6 +130,7 @@ static void __init wbd111_init(void) | |||
130 | wbd111_num_partitions); | 130 | wbd111_num_partitions); |
131 | platform_device_register(&wbd111_leds_device); | 131 | platform_device_register(&wbd111_leds_device); |
132 | platform_device_register(&wbd111_keys_device); | 132 | platform_device_register(&wbd111_keys_device); |
133 | platform_register_rtc(); | ||
133 | } | 134 | } |
134 | 135 | ||
135 | MACHINE_START(WBD111, "Wiliboard WBD-111") | 136 | MACHINE_START(WBD111, "Wiliboard WBD-111") |
diff --git a/arch/arm/mach-gemini/board-wbd222.c b/arch/arm/mach-gemini/board-wbd222.c index 1eebcecd1c33..99e5bbecf923 100644 --- a/arch/arm/mach-gemini/board-wbd222.c +++ b/arch/arm/mach-gemini/board-wbd222.c | |||
@@ -130,6 +130,7 @@ static void __init wbd222_init(void) | |||
130 | wbd222_num_partitions); | 130 | wbd222_num_partitions); |
131 | platform_device_register(&wbd222_leds_device); | 131 | platform_device_register(&wbd222_leds_device); |
132 | platform_device_register(&wbd222_keys_device); | 132 | platform_device_register(&wbd222_keys_device); |
133 | platform_register_rtc(); | ||
133 | } | 134 | } |
134 | 135 | ||
135 | MACHINE_START(WBD222, "Wiliboard WBD-222") | 136 | MACHINE_START(WBD222, "Wiliboard WBD-222") |
diff --git a/arch/arm/mach-gemini/common.h b/arch/arm/mach-gemini/common.h index 9392834a214f..7670c39acb2f 100644 --- a/arch/arm/mach-gemini/common.h +++ b/arch/arm/mach-gemini/common.h | |||
@@ -18,6 +18,7 @@ extern void gemini_map_io(void); | |||
18 | extern void gemini_init_irq(void); | 18 | extern void gemini_init_irq(void); |
19 | extern void gemini_timer_init(void); | 19 | extern void gemini_timer_init(void); |
20 | extern void gemini_gpio_init(void); | 20 | extern void gemini_gpio_init(void); |
21 | extern void platform_register_rtc(void); | ||
21 | 22 | ||
22 | /* Common platform devices registration functions */ | 23 | /* Common platform devices registration functions */ |
23 | extern int platform_register_uart(void); | 24 | extern int platform_register_uart(void); |
diff --git a/arch/arm/mach-gemini/devices.c b/arch/arm/mach-gemini/devices.c index 6b525253d027..5cff29818b73 100644 --- a/arch/arm/mach-gemini/devices.c +++ b/arch/arm/mach-gemini/devices.c | |||
@@ -90,3 +90,29 @@ int platform_register_pflash(unsigned int size, struct mtd_partition *parts, | |||
90 | 90 | ||
91 | return platform_device_register(&pflash_device); | 91 | return platform_device_register(&pflash_device); |
92 | } | 92 | } |
93 | |||
94 | static struct resource gemini_rtc_resources[] = { | ||
95 | [0] = { | ||
96 | .start = GEMINI_RTC_BASE, | ||
97 | .end = GEMINI_RTC_BASE + 0x24, | ||
98 | .flags = IORESOURCE_MEM, | ||
99 | }, | ||
100 | [1] = { | ||
101 | .start = IRQ_RTC, | ||
102 | .end = IRQ_RTC, | ||
103 | .flags = IORESOURCE_IRQ, | ||
104 | }, | ||
105 | }; | ||
106 | |||
107 | static struct platform_device gemini_rtc_device = { | ||
108 | .name = "rtc-gemini", | ||
109 | .id = 0, | ||
110 | .num_resources = ARRAY_SIZE(gemini_rtc_resources), | ||
111 | .resource = gemini_rtc_resources, | ||
112 | }; | ||
113 | |||
114 | int __init platform_register_rtc(void) | ||
115 | { | ||
116 | return platform_device_register(&gemini_rtc_device); | ||
117 | } | ||
118 | |||
diff --git a/arch/arm/mach-gemini/include/mach/memory.h b/arch/arm/mach-gemini/include/mach/memory.h index 2d14d5bf1f9f..a50915f764d8 100644 --- a/arch/arm/mach-gemini/include/mach/memory.h +++ b/arch/arm/mach-gemini/include/mach/memory.h | |||
@@ -11,9 +11,9 @@ | |||
11 | #define __MACH_MEMORY_H | 11 | #define __MACH_MEMORY_H |
12 | 12 | ||
13 | #ifdef CONFIG_GEMINI_MEM_SWAP | 13 | #ifdef CONFIG_GEMINI_MEM_SWAP |
14 | # define PHYS_OFFSET UL(0x00000000) | 14 | # define PLAT_PHYS_OFFSET UL(0x00000000) |
15 | #else | 15 | #else |
16 | # define PHYS_OFFSET UL(0x10000000) | 16 | # define PLAT_PHYS_OFFSET UL(0x10000000) |
17 | #endif | 17 | #endif |
18 | 18 | ||
19 | #endif /* __MACH_MEMORY_H */ | 19 | #endif /* __MACH_MEMORY_H */ |
diff --git a/arch/arm/mach-h720x/include/mach/memory.h b/arch/arm/mach-h720x/include/mach/memory.h index ef4c1e26f18e..9d3687651462 100644 --- a/arch/arm/mach-h720x/include/mach/memory.h +++ b/arch/arm/mach-h720x/include/mach/memory.h | |||
@@ -7,7 +7,7 @@ | |||
7 | #ifndef __ASM_ARCH_MEMORY_H | 7 | #ifndef __ASM_ARCH_MEMORY_H |
8 | #define __ASM_ARCH_MEMORY_H | 8 | #define __ASM_ARCH_MEMORY_H |
9 | 9 | ||
10 | #define PHYS_OFFSET UL(0x40000000) | 10 | #define PLAT_PHYS_OFFSET UL(0x40000000) |
11 | /* | 11 | /* |
12 | * This is the maximum DMA address that can be DMAd to. | 12 | * This is the maximum DMA address that can be DMAd to. |
13 | * There should not be more than (0xd0000000 - 0xc0000000) | 13 | * There should not be more than (0xd0000000 - 0xc0000000) |
diff --git a/arch/arm/mach-integrator/include/mach/memory.h b/arch/arm/mach-integrator/include/mach/memory.h index 991f24d2c115..334d5e271889 100644 --- a/arch/arm/mach-integrator/include/mach/memory.h +++ b/arch/arm/mach-integrator/include/mach/memory.h | |||
@@ -23,7 +23,7 @@ | |||
23 | /* | 23 | /* |
24 | * Physical DRAM offset. | 24 | * Physical DRAM offset. |
25 | */ | 25 | */ |
26 | #define PHYS_OFFSET UL(0x00000000) | 26 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
27 | 27 | ||
28 | #define BUS_OFFSET UL(0x80000000) | 28 | #define BUS_OFFSET UL(0x80000000) |
29 | #define __virt_to_bus(x) ((x) - PAGE_OFFSET + BUS_OFFSET) | 29 | #define __virt_to_bus(x) ((x) - PAGE_OFFSET + BUS_OFFSET) |
diff --git a/arch/arm/mach-iop13xx/include/mach/memory.h b/arch/arm/mach-iop13xx/include/mach/memory.h index 3ad455318868..1afa99ef97fa 100644 --- a/arch/arm/mach-iop13xx/include/mach/memory.h +++ b/arch/arm/mach-iop13xx/include/mach/memory.h | |||
@@ -6,7 +6,7 @@ | |||
6 | /* | 6 | /* |
7 | * Physical DRAM offset. | 7 | * Physical DRAM offset. |
8 | */ | 8 | */ |
9 | #define PHYS_OFFSET UL(0x00000000) | 9 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
10 | 10 | ||
11 | #ifndef __ASSEMBLY__ | 11 | #ifndef __ASSEMBLY__ |
12 | 12 | ||
diff --git a/arch/arm/mach-iop32x/include/mach/memory.h b/arch/arm/mach-iop32x/include/mach/memory.h index c30f6450ad50..169cc239f76c 100644 --- a/arch/arm/mach-iop32x/include/mach/memory.h +++ b/arch/arm/mach-iop32x/include/mach/memory.h | |||
@@ -8,6 +8,6 @@ | |||
8 | /* | 8 | /* |
9 | * Physical DRAM offset. | 9 | * Physical DRAM offset. |
10 | */ | 10 | */ |
11 | #define PHYS_OFFSET UL(0xa0000000) | 11 | #define PLAT_PHYS_OFFSET UL(0xa0000000) |
12 | 12 | ||
13 | #endif | 13 | #endif |
diff --git a/arch/arm/mach-iop33x/include/mach/memory.h b/arch/arm/mach-iop33x/include/mach/memory.h index a30a96aa6d2d..8e1daf7006b6 100644 --- a/arch/arm/mach-iop33x/include/mach/memory.h +++ b/arch/arm/mach-iop33x/include/mach/memory.h | |||
@@ -8,6 +8,6 @@ | |||
8 | /* | 8 | /* |
9 | * Physical DRAM offset. | 9 | * Physical DRAM offset. |
10 | */ | 10 | */ |
11 | #define PHYS_OFFSET UL(0x00000000) | 11 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
12 | 12 | ||
13 | #endif | 13 | #endif |
diff --git a/arch/arm/mach-ixp2000/include/mach/memory.h b/arch/arm/mach-ixp2000/include/mach/memory.h index 98e3471be15b..5f0c4fd4076a 100644 --- a/arch/arm/mach-ixp2000/include/mach/memory.h +++ b/arch/arm/mach-ixp2000/include/mach/memory.h | |||
@@ -13,7 +13,7 @@ | |||
13 | #ifndef __ASM_ARCH_MEMORY_H | 13 | #ifndef __ASM_ARCH_MEMORY_H |
14 | #define __ASM_ARCH_MEMORY_H | 14 | #define __ASM_ARCH_MEMORY_H |
15 | 15 | ||
16 | #define PHYS_OFFSET UL(0x00000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
17 | 17 | ||
18 | #include <mach/ixp2000-regs.h> | 18 | #include <mach/ixp2000-regs.h> |
19 | 19 | ||
diff --git a/arch/arm/mach-ixp23xx/include/mach/memory.h b/arch/arm/mach-ixp23xx/include/mach/memory.h index 6ef65d813f16..6cf0704e946a 100644 --- a/arch/arm/mach-ixp23xx/include/mach/memory.h +++ b/arch/arm/mach-ixp23xx/include/mach/memory.h | |||
@@ -17,7 +17,7 @@ | |||
17 | /* | 17 | /* |
18 | * Physical DRAM offset. | 18 | * Physical DRAM offset. |
19 | */ | 19 | */ |
20 | #define PHYS_OFFSET (0x00000000) | 20 | #define PLAT_PHYS_OFFSET (0x00000000) |
21 | 21 | ||
22 | #define IXP23XX_PCI_SDRAM_OFFSET (*((volatile int *)IXP23XX_PCI_SDRAM_BAR) & 0xfffffff0) | 22 | #define IXP23XX_PCI_SDRAM_OFFSET (*((volatile int *)IXP23XX_PCI_SDRAM_BAR) & 0xfffffff0) |
23 | 23 | ||
diff --git a/arch/arm/mach-ixp4xx/include/mach/memory.h b/arch/arm/mach-ixp4xx/include/mach/memory.h index 0136eaa29224..6d388c9d0e20 100644 --- a/arch/arm/mach-ixp4xx/include/mach/memory.h +++ b/arch/arm/mach-ixp4xx/include/mach/memory.h | |||
@@ -12,7 +12,7 @@ | |||
12 | /* | 12 | /* |
13 | * Physical DRAM offset. | 13 | * Physical DRAM offset. |
14 | */ | 14 | */ |
15 | #define PHYS_OFFSET UL(0x00000000) | 15 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
16 | 16 | ||
17 | #if !defined(__ASSEMBLY__) && defined(CONFIG_PCI) | 17 | #if !defined(__ASSEMBLY__) && defined(CONFIG_PCI) |
18 | 18 | ||
diff --git a/arch/arm/mach-kirkwood/include/mach/memory.h b/arch/arm/mach-kirkwood/include/mach/memory.h index 45431e131465..4600b44e3ad3 100644 --- a/arch/arm/mach-kirkwood/include/mach/memory.h +++ b/arch/arm/mach-kirkwood/include/mach/memory.h | |||
@@ -5,6 +5,6 @@ | |||
5 | #ifndef __ASM_ARCH_MEMORY_H | 5 | #ifndef __ASM_ARCH_MEMORY_H |
6 | #define __ASM_ARCH_MEMORY_H | 6 | #define __ASM_ARCH_MEMORY_H |
7 | 7 | ||
8 | #define PHYS_OFFSET UL(0x00000000) | 8 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
9 | 9 | ||
10 | #endif | 10 | #endif |
diff --git a/arch/arm/mach-ks8695/include/mach/memory.h b/arch/arm/mach-ks8695/include/mach/memory.h index bace9a681adc..f7e1b9bce345 100644 --- a/arch/arm/mach-ks8695/include/mach/memory.h +++ b/arch/arm/mach-ks8695/include/mach/memory.h | |||
@@ -18,7 +18,7 @@ | |||
18 | /* | 18 | /* |
19 | * Physical SRAM offset. | 19 | * Physical SRAM offset. |
20 | */ | 20 | */ |
21 | #define PHYS_OFFSET KS8695_SDRAM_PA | 21 | #define PLAT_PHYS_OFFSET KS8695_SDRAM_PA |
22 | 22 | ||
23 | #ifndef __ASSEMBLY__ | 23 | #ifndef __ASSEMBLY__ |
24 | 24 | ||
diff --git a/arch/arm/mach-lh7a40x/include/mach/memory.h b/arch/arm/mach-lh7a40x/include/mach/memory.h index edb8f5faf5d5..f77bde80fe41 100644 --- a/arch/arm/mach-lh7a40x/include/mach/memory.h +++ b/arch/arm/mach-lh7a40x/include/mach/memory.h | |||
@@ -17,7 +17,7 @@ | |||
17 | /* | 17 | /* |
18 | * Physical DRAM offset. | 18 | * Physical DRAM offset. |
19 | */ | 19 | */ |
20 | #define PHYS_OFFSET UL(0xc0000000) | 20 | #define PLAT_PHYS_OFFSET UL(0xc0000000) |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * Sparsemem version of the above | 23 | * Sparsemem version of the above |
diff --git a/arch/arm/mach-loki/include/mach/memory.h b/arch/arm/mach-loki/include/mach/memory.h index 2ed7e6e732c2..66366657a875 100644 --- a/arch/arm/mach-loki/include/mach/memory.h +++ b/arch/arm/mach-loki/include/mach/memory.h | |||
@@ -5,6 +5,6 @@ | |||
5 | #ifndef __ASM_ARCH_MEMORY_H | 5 | #ifndef __ASM_ARCH_MEMORY_H |
6 | #define __ASM_ARCH_MEMORY_H | 6 | #define __ASM_ARCH_MEMORY_H |
7 | 7 | ||
8 | #define PHYS_OFFSET UL(0x00000000) | 8 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
9 | 9 | ||
10 | #endif | 10 | #endif |
diff --git a/arch/arm/mach-lpc32xx/include/mach/memory.h b/arch/arm/mach-lpc32xx/include/mach/memory.h index 044e1acecbe6..a647dd624afa 100644 --- a/arch/arm/mach-lpc32xx/include/mach/memory.h +++ b/arch/arm/mach-lpc32xx/include/mach/memory.h | |||
@@ -22,6 +22,6 @@ | |||
22 | /* | 22 | /* |
23 | * Physical DRAM offset of bank 0 | 23 | * Physical DRAM offset of bank 0 |
24 | */ | 24 | */ |
25 | #define PHYS_OFFSET UL(0x80000000) | 25 | #define PLAT_PHYS_OFFSET UL(0x80000000) |
26 | 26 | ||
27 | #endif | 27 | #endif |
diff --git a/arch/arm/mach-mmp/include/mach/memory.h b/arch/arm/mach-mmp/include/mach/memory.h index bdb21d70714c..d68b50a2d6a0 100644 --- a/arch/arm/mach-mmp/include/mach/memory.h +++ b/arch/arm/mach-mmp/include/mach/memory.h | |||
@@ -9,6 +9,6 @@ | |||
9 | #ifndef __ASM_MACH_MEMORY_H | 9 | #ifndef __ASM_MACH_MEMORY_H |
10 | #define __ASM_MACH_MEMORY_H | 10 | #define __ASM_MACH_MEMORY_H |
11 | 11 | ||
12 | #define PHYS_OFFSET UL(0x00000000) | 12 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
13 | 13 | ||
14 | #endif /* __ASM_MACH_MEMORY_H */ | 14 | #endif /* __ASM_MACH_MEMORY_H */ |
diff --git a/arch/arm/mach-msm/board-msm7x27.c b/arch/arm/mach-msm/board-msm7x27.c index e7a76eff57d9..08fcd40a8cbd 100644 --- a/arch/arm/mach-msm/board-msm7x27.c +++ b/arch/arm/mach-msm/board-msm7x27.c | |||
@@ -132,7 +132,7 @@ static void __init msm7x2x_map_io(void) | |||
132 | MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF") | 132 | MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF") |
133 | #ifdef CONFIG_MSM_DEBUG_UART | 133 | #ifdef CONFIG_MSM_DEBUG_UART |
134 | #endif | 134 | #endif |
135 | .boot_params = PHYS_OFFSET + 0x100, | 135 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
136 | .map_io = msm7x2x_map_io, | 136 | .map_io = msm7x2x_map_io, |
137 | .init_irq = msm7x2x_init_irq, | 137 | .init_irq = msm7x2x_init_irq, |
138 | .init_machine = msm7x2x_init, | 138 | .init_machine = msm7x2x_init, |
@@ -142,7 +142,7 @@ MACHINE_END | |||
142 | MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA") | 142 | MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA") |
143 | #ifdef CONFIG_MSM_DEBUG_UART | 143 | #ifdef CONFIG_MSM_DEBUG_UART |
144 | #endif | 144 | #endif |
145 | .boot_params = PHYS_OFFSET + 0x100, | 145 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
146 | .map_io = msm7x2x_map_io, | 146 | .map_io = msm7x2x_map_io, |
147 | .init_irq = msm7x2x_init_irq, | 147 | .init_irq = msm7x2x_init_irq, |
148 | .init_machine = msm7x2x_init, | 148 | .init_machine = msm7x2x_init, |
@@ -152,7 +152,7 @@ MACHINE_END | |||
152 | MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF") | 152 | MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF") |
153 | #ifdef CONFIG_MSM_DEBUG_UART | 153 | #ifdef CONFIG_MSM_DEBUG_UART |
154 | #endif | 154 | #endif |
155 | .boot_params = PHYS_OFFSET + 0x100, | 155 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
156 | .map_io = msm7x2x_map_io, | 156 | .map_io = msm7x2x_map_io, |
157 | .init_irq = msm7x2x_init_irq, | 157 | .init_irq = msm7x2x_init_irq, |
158 | .init_machine = msm7x2x_init, | 158 | .init_machine = msm7x2x_init, |
@@ -162,7 +162,7 @@ MACHINE_END | |||
162 | MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA") | 162 | MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA") |
163 | #ifdef CONFIG_MSM_DEBUG_UART | 163 | #ifdef CONFIG_MSM_DEBUG_UART |
164 | #endif | 164 | #endif |
165 | .boot_params = PHYS_OFFSET + 0x100, | 165 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
166 | .map_io = msm7x2x_map_io, | 166 | .map_io = msm7x2x_map_io, |
167 | .init_irq = msm7x2x_init_irq, | 167 | .init_irq = msm7x2x_init_irq, |
168 | .init_machine = msm7x2x_init, | 168 | .init_machine = msm7x2x_init, |
diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c index 6f3b9735e970..25db8fd71a70 100644 --- a/arch/arm/mach-msm/board-msm7x30.c +++ b/arch/arm/mach-msm/board-msm7x30.c | |||
@@ -26,11 +26,11 @@ | |||
26 | 26 | ||
27 | #include <asm/mach-types.h> | 27 | #include <asm/mach-types.h> |
28 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
29 | #include <asm/memory.h> | ||
29 | #include <asm/setup.h> | 30 | #include <asm/setup.h> |
30 | 31 | ||
31 | #include <mach/gpio.h> | 32 | #include <mach/gpio.h> |
32 | #include <mach/board.h> | 33 | #include <mach/board.h> |
33 | #include <mach/memory.h> | ||
34 | #include <mach/msm_iomap.h> | 34 | #include <mach/msm_iomap.h> |
35 | #include <mach/dma.h> | 35 | #include <mach/dma.h> |
36 | 36 | ||
@@ -85,7 +85,7 @@ static void __init msm7x30_map_io(void) | |||
85 | MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") | 85 | MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") |
86 | #ifdef CONFIG_MSM_DEBUG_UART | 86 | #ifdef CONFIG_MSM_DEBUG_UART |
87 | #endif | 87 | #endif |
88 | .boot_params = PHYS_OFFSET + 0x100, | 88 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
89 | .map_io = msm7x30_map_io, | 89 | .map_io = msm7x30_map_io, |
90 | .init_irq = msm7x30_init_irq, | 90 | .init_irq = msm7x30_init_irq, |
91 | .init_machine = msm7x30_init, | 91 | .init_machine = msm7x30_init, |
@@ -95,7 +95,7 @@ MACHINE_END | |||
95 | MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA") | 95 | MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA") |
96 | #ifdef CONFIG_MSM_DEBUG_UART | 96 | #ifdef CONFIG_MSM_DEBUG_UART |
97 | #endif | 97 | #endif |
98 | .boot_params = PHYS_OFFSET + 0x100, | 98 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
99 | .map_io = msm7x30_map_io, | 99 | .map_io = msm7x30_map_io, |
100 | .init_irq = msm7x30_init_irq, | 100 | .init_irq = msm7x30_init_irq, |
101 | .init_machine = msm7x30_init, | 101 | .init_machine = msm7x30_init, |
@@ -105,7 +105,7 @@ MACHINE_END | |||
105 | MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID") | 105 | MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID") |
106 | #ifdef CONFIG_MSM_DEBUG_UART | 106 | #ifdef CONFIG_MSM_DEBUG_UART |
107 | #endif | 107 | #endif |
108 | .boot_params = PHYS_OFFSET + 0x100, | 108 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
109 | .map_io = msm7x30_map_io, | 109 | .map_io = msm7x30_map_io, |
110 | .init_irq = msm7x30_init_irq, | 110 | .init_irq = msm7x30_init_irq, |
111 | .init_machine = msm7x30_init, | 111 | .init_machine = msm7x30_init, |
diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c index 6dde8185205f..15c2bbd2ef81 100644 --- a/arch/arm/mach-msm/board-qsd8x50.c +++ b/arch/arm/mach-msm/board-qsd8x50.c | |||
@@ -118,7 +118,7 @@ static void __init qsd8x50_init(void) | |||
118 | MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") | 118 | MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") |
119 | #ifdef CONFIG_MSM_DEBUG_UART | 119 | #ifdef CONFIG_MSM_DEBUG_UART |
120 | #endif | 120 | #endif |
121 | .boot_params = PHYS_OFFSET + 0x100, | 121 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
122 | .map_io = qsd8x50_map_io, | 122 | .map_io = qsd8x50_map_io, |
123 | .init_irq = qsd8x50_init_irq, | 123 | .init_irq = qsd8x50_init_irq, |
124 | .init_machine = qsd8x50_init, | 124 | .init_machine = qsd8x50_init, |
@@ -128,7 +128,7 @@ MACHINE_END | |||
128 | MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5") | 128 | MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5") |
129 | #ifdef CONFIG_MSM_DEBUG_UART | 129 | #ifdef CONFIG_MSM_DEBUG_UART |
130 | #endif | 130 | #endif |
131 | .boot_params = PHYS_OFFSET + 0x100, | 131 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
132 | .map_io = qsd8x50_map_io, | 132 | .map_io = qsd8x50_map_io, |
133 | .init_irq = qsd8x50_init_irq, | 133 | .init_irq = qsd8x50_init_irq, |
134 | .init_machine = qsd8x50_init, | 134 | .init_machine = qsd8x50_init, |
diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c index 8919ffb17196..83604f526f0f 100644 --- a/arch/arm/mach-msm/board-sapphire.c +++ b/arch/arm/mach-msm/board-sapphire.c | |||
@@ -107,7 +107,7 @@ MACHINE_START(SAPPHIRE, "sapphire") | |||
107 | /* Maintainer: Brian Swetland <swetland@google.com> */ | 107 | /* Maintainer: Brian Swetland <swetland@google.com> */ |
108 | #ifdef CONFIG_MSM_DEBUG_UART | 108 | #ifdef CONFIG_MSM_DEBUG_UART |
109 | #endif | 109 | #endif |
110 | .boot_params = PHYS_OFFSET + 0x100, | 110 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
111 | .fixup = sapphire_fixup, | 111 | .fixup = sapphire_fixup, |
112 | .map_io = sapphire_map_io, | 112 | .map_io = sapphire_map_io, |
113 | .init_irq = sapphire_init_irq, | 113 | .init_irq = sapphire_init_irq, |
diff --git a/arch/arm/mach-msm/include/mach/memory.h b/arch/arm/mach-msm/include/mach/memory.h index 070e17d237f1..176875df241f 100644 --- a/arch/arm/mach-msm/include/mach/memory.h +++ b/arch/arm/mach-msm/include/mach/memory.h | |||
@@ -18,15 +18,15 @@ | |||
18 | 18 | ||
19 | /* physical offset of RAM */ | 19 | /* physical offset of RAM */ |
20 | #if defined(CONFIG_ARCH_QSD8X50) && defined(CONFIG_MSM_SOC_REV_A) | 20 | #if defined(CONFIG_ARCH_QSD8X50) && defined(CONFIG_MSM_SOC_REV_A) |
21 | #define PHYS_OFFSET UL(0x00000000) | 21 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
22 | #elif defined(CONFIG_ARCH_QSD8X50) | 22 | #elif defined(CONFIG_ARCH_QSD8X50) |
23 | #define PHYS_OFFSET UL(0x20000000) | 23 | #define PLAT_PHYS_OFFSET UL(0x20000000) |
24 | #elif defined(CONFIG_ARCH_MSM7X30) | 24 | #elif defined(CONFIG_ARCH_MSM7X30) |
25 | #define PHYS_OFFSET UL(0x00200000) | 25 | #define PLAT_PHYS_OFFSET UL(0x00200000) |
26 | #elif defined(CONFIG_ARCH_MSM8X60) | 26 | #elif defined(CONFIG_ARCH_MSM8X60) |
27 | #define PHYS_OFFSET UL(0x40200000) | 27 | #define PLAT_PHYS_OFFSET UL(0x40200000) |
28 | #else | 28 | #else |
29 | #define PHYS_OFFSET UL(0x10000000) | 29 | #define PLAT_PHYS_OFFSET UL(0x10000000) |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #endif | 32 | #endif |
diff --git a/arch/arm/mach-mv78xx0/include/mach/memory.h b/arch/arm/mach-mv78xx0/include/mach/memory.h index e663042d307f..a648c51f2e42 100644 --- a/arch/arm/mach-mv78xx0/include/mach/memory.h +++ b/arch/arm/mach-mv78xx0/include/mach/memory.h | |||
@@ -5,6 +5,6 @@ | |||
5 | #ifndef __ASM_ARCH_MEMORY_H | 5 | #ifndef __ASM_ARCH_MEMORY_H |
6 | #define __ASM_ARCH_MEMORY_H | 6 | #define __ASM_ARCH_MEMORY_H |
7 | 7 | ||
8 | #define PHYS_OFFSET UL(0x00000000) | 8 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
9 | 9 | ||
10 | #endif | 10 | #endif |
diff --git a/arch/arm/mach-mx3/mach-kzm_arm11_01.c b/arch/arm/mach-mx3/mach-kzm_arm11_01.c index a5f3eb24e4d5..df1a6ce8e3e1 100644 --- a/arch/arm/mach-mx3/mach-kzm_arm11_01.c +++ b/arch/arm/mach-mx3/mach-kzm_arm11_01.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include <asm/irq.h> | 28 | #include <asm/irq.h> |
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | #include <asm/memory.h> | ||
30 | #include <asm/setup.h> | 31 | #include <asm/setup.h> |
31 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
32 | #include <asm/mach/irq.h> | 33 | #include <asm/mach/irq.h> |
@@ -36,7 +37,6 @@ | |||
36 | #include <mach/clock.h> | 37 | #include <mach/clock.h> |
37 | #include <mach/common.h> | 38 | #include <mach/common.h> |
38 | #include <mach/iomux-mx3.h> | 39 | #include <mach/iomux-mx3.h> |
39 | #include <mach/memory.h> | ||
40 | 40 | ||
41 | #include "devices-imx31.h" | 41 | #include "devices-imx31.h" |
42 | #include "devices.h" | 42 | #include "devices.h" |
diff --git a/arch/arm/mach-mxs/gpio.c b/arch/arm/mach-mxs/gpio.c index cb0c0e83a527..61991e4dde44 100644 --- a/arch/arm/mach-mxs/gpio.c +++ b/arch/arm/mach-mxs/gpio.c | |||
@@ -68,29 +68,29 @@ static void set_gpio_irqenable(struct mxs_gpio_port *port, u32 index, | |||
68 | } | 68 | } |
69 | } | 69 | } |
70 | 70 | ||
71 | static void mxs_gpio_ack_irq(u32 irq) | 71 | static void mxs_gpio_ack_irq(struct irq_data *d) |
72 | { | 72 | { |
73 | u32 gpio = irq_to_gpio(irq); | 73 | u32 gpio = irq_to_gpio(d->irq); |
74 | clear_gpio_irqstatus(&mxs_gpio_ports[gpio / 32], gpio & 0x1f); | 74 | clear_gpio_irqstatus(&mxs_gpio_ports[gpio / 32], gpio & 0x1f); |
75 | } | 75 | } |
76 | 76 | ||
77 | static void mxs_gpio_mask_irq(u32 irq) | 77 | static void mxs_gpio_mask_irq(struct irq_data *d) |
78 | { | 78 | { |
79 | u32 gpio = irq_to_gpio(irq); | 79 | u32 gpio = irq_to_gpio(d->irq); |
80 | set_gpio_irqenable(&mxs_gpio_ports[gpio / 32], gpio & 0x1f, 0); | 80 | set_gpio_irqenable(&mxs_gpio_ports[gpio / 32], gpio & 0x1f, 0); |
81 | } | 81 | } |
82 | 82 | ||
83 | static void mxs_gpio_unmask_irq(u32 irq) | 83 | static void mxs_gpio_unmask_irq(struct irq_data *d) |
84 | { | 84 | { |
85 | u32 gpio = irq_to_gpio(irq); | 85 | u32 gpio = irq_to_gpio(d->irq); |
86 | set_gpio_irqenable(&mxs_gpio_ports[gpio / 32], gpio & 0x1f, 1); | 86 | set_gpio_irqenable(&mxs_gpio_ports[gpio / 32], gpio & 0x1f, 1); |
87 | } | 87 | } |
88 | 88 | ||
89 | static int mxs_gpio_get(struct gpio_chip *chip, unsigned offset); | 89 | static int mxs_gpio_get(struct gpio_chip *chip, unsigned offset); |
90 | 90 | ||
91 | static int mxs_gpio_set_irq_type(u32 irq, u32 type) | 91 | static int mxs_gpio_set_irq_type(struct irq_data *d, unsigned int type) |
92 | { | 92 | { |
93 | u32 gpio = irq_to_gpio(irq); | 93 | u32 gpio = irq_to_gpio(d->irq); |
94 | u32 pin_mask = 1 << (gpio & 31); | 94 | u32 pin_mask = 1 << (gpio & 31); |
95 | struct mxs_gpio_port *port = &mxs_gpio_ports[gpio / 32]; | 95 | struct mxs_gpio_port *port = &mxs_gpio_ports[gpio / 32]; |
96 | void __iomem *pin_addr; | 96 | void __iomem *pin_addr; |
@@ -160,9 +160,9 @@ static void mxs_gpio_irq_handler(u32 irq, struct irq_desc *desc) | |||
160 | * @param enable enable as wake-up if equal to non-zero | 160 | * @param enable enable as wake-up if equal to non-zero |
161 | * @return This function returns 0 on success. | 161 | * @return This function returns 0 on success. |
162 | */ | 162 | */ |
163 | static int mxs_gpio_set_wake_irq(u32 irq, u32 enable) | 163 | static int mxs_gpio_set_wake_irq(struct irq_data *d, unsigned int enable) |
164 | { | 164 | { |
165 | u32 gpio = irq_to_gpio(irq); | 165 | u32 gpio = irq_to_gpio(d->irq); |
166 | u32 gpio_idx = gpio & 0x1f; | 166 | u32 gpio_idx = gpio & 0x1f; |
167 | struct mxs_gpio_port *port = &mxs_gpio_ports[gpio / 32]; | 167 | struct mxs_gpio_port *port = &mxs_gpio_ports[gpio / 32]; |
168 | 168 | ||
@@ -182,11 +182,11 @@ static int mxs_gpio_set_wake_irq(u32 irq, u32 enable) | |||
182 | } | 182 | } |
183 | 183 | ||
184 | static struct irq_chip gpio_irq_chip = { | 184 | static struct irq_chip gpio_irq_chip = { |
185 | .ack = mxs_gpio_ack_irq, | 185 | .irq_ack = mxs_gpio_ack_irq, |
186 | .mask = mxs_gpio_mask_irq, | 186 | .irq_mask = mxs_gpio_mask_irq, |
187 | .unmask = mxs_gpio_unmask_irq, | 187 | .irq_unmask = mxs_gpio_unmask_irq, |
188 | .set_type = mxs_gpio_set_irq_type, | 188 | .irq_set_type = mxs_gpio_set_irq_type, |
189 | .set_wake = mxs_gpio_set_wake_irq, | 189 | .irq_set_wake = mxs_gpio_set_wake_irq, |
190 | }; | 190 | }; |
191 | 191 | ||
192 | static void mxs_set_gpio_direction(struct gpio_chip *chip, unsigned offset, | 192 | static void mxs_set_gpio_direction(struct gpio_chip *chip, unsigned offset, |
diff --git a/arch/arm/mach-mxs/icoll.c b/arch/arm/mach-mxs/icoll.c index 5dd43ba70058..0f4c120fc169 100644 --- a/arch/arm/mach-mxs/icoll.c +++ b/arch/arm/mach-mxs/icoll.c | |||
@@ -34,7 +34,7 @@ | |||
34 | 34 | ||
35 | static void __iomem *icoll_base = MXS_IO_ADDRESS(MXS_ICOLL_BASE_ADDR); | 35 | static void __iomem *icoll_base = MXS_IO_ADDRESS(MXS_ICOLL_BASE_ADDR); |
36 | 36 | ||
37 | static void icoll_ack_irq(unsigned int irq) | 37 | static void icoll_ack_irq(struct irq_data *d) |
38 | { | 38 | { |
39 | /* | 39 | /* |
40 | * The Interrupt Collector is able to prioritize irqs. | 40 | * The Interrupt Collector is able to prioritize irqs. |
@@ -45,22 +45,22 @@ static void icoll_ack_irq(unsigned int irq) | |||
45 | icoll_base + HW_ICOLL_LEVELACK); | 45 | icoll_base + HW_ICOLL_LEVELACK); |
46 | } | 46 | } |
47 | 47 | ||
48 | static void icoll_mask_irq(unsigned int irq) | 48 | static void icoll_mask_irq(struct irq_data *d) |
49 | { | 49 | { |
50 | __raw_writel(BM_ICOLL_INTERRUPTn_ENABLE, | 50 | __raw_writel(BM_ICOLL_INTERRUPTn_ENABLE, |
51 | icoll_base + HW_ICOLL_INTERRUPTn_CLR(irq)); | 51 | icoll_base + HW_ICOLL_INTERRUPTn_CLR(d->irq)); |
52 | } | 52 | } |
53 | 53 | ||
54 | static void icoll_unmask_irq(unsigned int irq) | 54 | static void icoll_unmask_irq(struct irq_data *d) |
55 | { | 55 | { |
56 | __raw_writel(BM_ICOLL_INTERRUPTn_ENABLE, | 56 | __raw_writel(BM_ICOLL_INTERRUPTn_ENABLE, |
57 | icoll_base + HW_ICOLL_INTERRUPTn_SET(irq)); | 57 | icoll_base + HW_ICOLL_INTERRUPTn_SET(d->irq)); |
58 | } | 58 | } |
59 | 59 | ||
60 | static struct irq_chip mxs_icoll_chip = { | 60 | static struct irq_chip mxs_icoll_chip = { |
61 | .ack = icoll_ack_irq, | 61 | .irq_ack = icoll_ack_irq, |
62 | .mask = icoll_mask_irq, | 62 | .irq_mask = icoll_mask_irq, |
63 | .unmask = icoll_unmask_irq, | 63 | .irq_unmask = icoll_unmask_irq, |
64 | }; | 64 | }; |
65 | 65 | ||
66 | void __init icoll_init_irq(void) | 66 | void __init icoll_init_irq(void) |
diff --git a/arch/arm/mach-netx/include/mach/memory.h b/arch/arm/mach-netx/include/mach/memory.h index 9a363f297f90..59561496c36e 100644 --- a/arch/arm/mach-netx/include/mach/memory.h +++ b/arch/arm/mach-netx/include/mach/memory.h | |||
@@ -20,7 +20,7 @@ | |||
20 | #ifndef __ASM_ARCH_MEMORY_H | 20 | #ifndef __ASM_ARCH_MEMORY_H |
21 | #define __ASM_ARCH_MEMORY_H | 21 | #define __ASM_ARCH_MEMORY_H |
22 | 22 | ||
23 | #define PHYS_OFFSET UL(0x80000000) | 23 | #define PLAT_PHYS_OFFSET UL(0x80000000) |
24 | 24 | ||
25 | #endif | 25 | #endif |
26 | 26 | ||
diff --git a/arch/arm/mach-nomadik/include/mach/memory.h b/arch/arm/mach-nomadik/include/mach/memory.h index 1e5689d98ecd..d3325211ba6a 100644 --- a/arch/arm/mach-nomadik/include/mach/memory.h +++ b/arch/arm/mach-nomadik/include/mach/memory.h | |||
@@ -23,6 +23,6 @@ | |||
23 | /* | 23 | /* |
24 | * Physical DRAM offset. | 24 | * Physical DRAM offset. |
25 | */ | 25 | */ |
26 | #define PHYS_OFFSET UL(0x00000000) | 26 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
27 | 27 | ||
28 | #endif | 28 | #endif |
diff --git a/arch/arm/mach-ns9xxx/include/mach/memory.h b/arch/arm/mach-ns9xxx/include/mach/memory.h index 6107193adbfe..5c65aee6e7a9 100644 --- a/arch/arm/mach-ns9xxx/include/mach/memory.h +++ b/arch/arm/mach-ns9xxx/include/mach/memory.h | |||
@@ -19,6 +19,6 @@ | |||
19 | #define NS9XXX_CS2STAT_LENGTH UL(0x1000) | 19 | #define NS9XXX_CS2STAT_LENGTH UL(0x1000) |
20 | #define NS9XXX_CS3STAT_LENGTH UL(0x1000) | 20 | #define NS9XXX_CS3STAT_LENGTH UL(0x1000) |
21 | 21 | ||
22 | #define PHYS_OFFSET UL(0x00000000) | 22 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
23 | 23 | ||
24 | #endif | 24 | #endif |
diff --git a/arch/arm/mach-nuc93x/include/mach/memory.h b/arch/arm/mach-nuc93x/include/mach/memory.h index 323ab0db3f7d..ef9864b002a6 100644 --- a/arch/arm/mach-nuc93x/include/mach/memory.h +++ b/arch/arm/mach-nuc93x/include/mach/memory.h | |||
@@ -16,6 +16,6 @@ | |||
16 | #ifndef __ASM_ARCH_MEMORY_H | 16 | #ifndef __ASM_ARCH_MEMORY_H |
17 | #define __ASM_ARCH_MEMORY_H | 17 | #define __ASM_ARCH_MEMORY_H |
18 | 18 | ||
19 | #define PHYS_OFFSET UL(0x00000000) | 19 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
20 | 20 | ||
21 | #endif | 21 | #endif |
diff --git a/arch/arm/mach-omap1/include/mach/debug-macro.S b/arch/arm/mach-omap1/include/mach/debug-macro.S index 6a0fa0462365..62856044eb63 100644 --- a/arch/arm/mach-omap1/include/mach/debug-macro.S +++ b/arch/arm/mach-omap1/include/mach/debug-macro.S | |||
@@ -17,6 +17,9 @@ | |||
17 | 17 | ||
18 | #include <plat/serial.h> | 18 | #include <plat/serial.h> |
19 | 19 | ||
20 | #define omap_uart_v2p(x) ((x) - PAGE_OFFSET + PLAT_PHYS_OFFSET) | ||
21 | #define omap_uart_p2v(x) ((x) - PLAT_PHYS_OFFSET + PAGE_OFFSET) | ||
22 | |||
20 | .pushsection .data | 23 | .pushsection .data |
21 | omap_uart_phys: .word 0x0 | 24 | omap_uart_phys: .word 0x0 |
22 | omap_uart_virt: .word 0x0 | 25 | omap_uart_virt: .word 0x0 |
@@ -33,7 +36,7 @@ omap_uart_virt: .word 0x0 | |||
33 | /* Use omap_uart_phys/virt if already configured */ | 36 | /* Use omap_uart_phys/virt if already configured */ |
34 | 9: mrc p15, 0, \rp, c1, c0 | 37 | 9: mrc p15, 0, \rp, c1, c0 |
35 | tst \rp, #1 @ MMU enabled? | 38 | tst \rp, #1 @ MMU enabled? |
36 | ldreq \rp, =__virt_to_phys(omap_uart_phys) @ MMU not enabled | 39 | ldreq \rp, =omap_uart_v2p(omap_uart_phys) @ MMU disabled |
37 | ldrne \rp, =omap_uart_phys @ MMU enabled | 40 | ldrne \rp, =omap_uart_phys @ MMU enabled |
38 | add \rv, \rp, #4 @ omap_uart_virt | 41 | add \rv, \rp, #4 @ omap_uart_virt |
39 | ldr \rp, [\rp, #0] | 42 | ldr \rp, [\rp, #0] |
@@ -46,7 +49,7 @@ omap_uart_virt: .word 0x0 | |||
46 | mrc p15, 0, \rp, c1, c0 | 49 | mrc p15, 0, \rp, c1, c0 |
47 | tst \rp, #1 @ MMU enabled? | 50 | tst \rp, #1 @ MMU enabled? |
48 | ldreq \rp, =OMAP_UART_INFO @ MMU not enabled | 51 | ldreq \rp, =OMAP_UART_INFO @ MMU not enabled |
49 | ldrne \rp, =__phys_to_virt(OMAP_UART_INFO) @ MMU enabled | 52 | ldrne \rp, =omap_uart_p2v(OMAP_UART_INFO) @ MMU enabled |
50 | ldr \rp, [\rp, #0] | 53 | ldr \rp, [\rp, #0] |
51 | 54 | ||
52 | /* Select the UART to use based on the UART1 scratchpad value */ | 55 | /* Select the UART to use based on the UART1 scratchpad value */ |
@@ -73,7 +76,7 @@ omap_uart_virt: .word 0x0 | |||
73 | 98: add \rp, \rp, #0xff000000 @ phys base | 76 | 98: add \rp, \rp, #0xff000000 @ phys base |
74 | mrc p15, 0, \rv, c1, c0 | 77 | mrc p15, 0, \rv, c1, c0 |
75 | tst \rv, #1 @ MMU enabled? | 78 | tst \rv, #1 @ MMU enabled? |
76 | ldreq \rv, =__virt_to_phys(omap_uart_phys) @ MMU not enabled | 79 | ldreq \rv, =omap_uart_v2p(omap_uart_phys) @ MMU disabled |
77 | ldrne \rv, =omap_uart_phys @ MMU enabled | 80 | ldrne \rv, =omap_uart_phys @ MMU enabled |
78 | str \rp, [\rv, #0] | 81 | str \rp, [\rv, #0] |
79 | sub \rp, \rp, #0xff000000 @ phys base | 82 | sub \rp, \rp, #0xff000000 @ phys base |
diff --git a/arch/arm/mach-omap1/pm.h b/arch/arm/mach-omap1/pm.h index 56a647986ae9..cd926dcb5e7f 100644 --- a/arch/arm/mach-omap1/pm.h +++ b/arch/arm/mach-omap1/pm.h | |||
@@ -123,9 +123,9 @@ extern void allow_idle_sleep(void); | |||
123 | extern void omap1_pm_idle(void); | 123 | extern void omap1_pm_idle(void); |
124 | extern void omap1_pm_suspend(void); | 124 | extern void omap1_pm_suspend(void); |
125 | 125 | ||
126 | extern void omap7xx_cpu_suspend(unsigned short, unsigned short); | 126 | extern void omap7xx_cpu_suspend(unsigned long, unsigned long); |
127 | extern void omap1510_cpu_suspend(unsigned short, unsigned short); | 127 | extern void omap1510_cpu_suspend(unsigned long, unsigned long); |
128 | extern void omap1610_cpu_suspend(unsigned short, unsigned short); | 128 | extern void omap1610_cpu_suspend(unsigned long, unsigned long); |
129 | extern void omap7xx_idle_loop_suspend(void); | 129 | extern void omap7xx_idle_loop_suspend(void); |
130 | extern void omap1510_idle_loop_suspend(void); | 130 | extern void omap1510_idle_loop_suspend(void); |
131 | extern void omap1610_idle_loop_suspend(void); | 131 | extern void omap1610_idle_loop_suspend(void); |
diff --git a/arch/arm/mach-omap1/sleep.S b/arch/arm/mach-omap1/sleep.S index ef771ce8b030..c875bdc902c5 100644 --- a/arch/arm/mach-omap1/sleep.S +++ b/arch/arm/mach-omap1/sleep.S | |||
@@ -58,6 +58,7 @@ | |||
58 | */ | 58 | */ |
59 | 59 | ||
60 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | 60 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) |
61 | .align 3 | ||
61 | ENTRY(omap7xx_cpu_suspend) | 62 | ENTRY(omap7xx_cpu_suspend) |
62 | 63 | ||
63 | @ save registers on stack | 64 | @ save registers on stack |
@@ -137,6 +138,7 @@ ENTRY(omap7xx_cpu_suspend_sz) | |||
137 | #endif /* CONFIG_ARCH_OMAP730 || CONFIG_ARCH_OMAP850 */ | 138 | #endif /* CONFIG_ARCH_OMAP730 || CONFIG_ARCH_OMAP850 */ |
138 | 139 | ||
139 | #ifdef CONFIG_ARCH_OMAP15XX | 140 | #ifdef CONFIG_ARCH_OMAP15XX |
141 | .align 3 | ||
140 | ENTRY(omap1510_cpu_suspend) | 142 | ENTRY(omap1510_cpu_suspend) |
141 | 143 | ||
142 | @ save registers on stack | 144 | @ save registers on stack |
@@ -211,6 +213,7 @@ ENTRY(omap1510_cpu_suspend_sz) | |||
211 | #endif /* CONFIG_ARCH_OMAP15XX */ | 213 | #endif /* CONFIG_ARCH_OMAP15XX */ |
212 | 214 | ||
213 | #if defined(CONFIG_ARCH_OMAP16XX) | 215 | #if defined(CONFIG_ARCH_OMAP16XX) |
216 | .align 3 | ||
214 | ENTRY(omap1610_cpu_suspend) | 217 | ENTRY(omap1610_cpu_suspend) |
215 | 218 | ||
216 | @ save registers on stack | 219 | @ save registers on stack |
diff --git a/arch/arm/mach-omap1/sram.S b/arch/arm/mach-omap1/sram.S index 7724e520d07c..692587d07ea5 100644 --- a/arch/arm/mach-omap1/sram.S +++ b/arch/arm/mach-omap1/sram.S | |||
@@ -18,6 +18,7 @@ | |||
18 | /* | 18 | /* |
19 | * Reprograms ULPD and CKCTL. | 19 | * Reprograms ULPD and CKCTL. |
20 | */ | 20 | */ |
21 | .align 3 | ||
21 | ENTRY(omap1_sram_reprogram_clock) | 22 | ENTRY(omap1_sram_reprogram_clock) |
22 | stmfd sp!, {r0 - r12, lr} @ save registers on stack | 23 | stmfd sp!, {r0 - r12, lr} @ save registers on stack |
23 | 24 | ||
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 1a2cf6226a55..b69fa0a0299e 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -45,6 +45,7 @@ config ARCH_OMAP4 | |||
45 | select CPU_V7 | 45 | select CPU_V7 |
46 | select ARM_GIC | 46 | select ARM_GIC |
47 | select PL310_ERRATA_588369 | 47 | select PL310_ERRATA_588369 |
48 | select PL310_ERRATA_727915 | ||
48 | select ARM_ERRATA_720789 | 49 | select ARM_ERRATA_720789 |
49 | select ARCH_HAS_OPP | 50 | select ARCH_HAS_OPP |
50 | select PM_OPP if PM | 51 | select PM_OPP if PM |
diff --git a/arch/arm/mach-omap2/include/mach/debug-macro.S b/arch/arm/mach-omap2/include/mach/debug-macro.S index 6a4d4136002e..6049f465ec84 100644 --- a/arch/arm/mach-omap2/include/mach/debug-macro.S +++ b/arch/arm/mach-omap2/include/mach/debug-macro.S | |||
@@ -19,6 +19,9 @@ | |||
19 | 19 | ||
20 | #define UART_OFFSET(addr) ((addr) & 0x00ffffff) | 20 | #define UART_OFFSET(addr) ((addr) & 0x00ffffff) |
21 | 21 | ||
22 | #define omap_uart_v2p(x) ((x) - PAGE_OFFSET + PLAT_PHYS_OFFSET) | ||
23 | #define omap_uart_p2v(x) ((x) - PLAT_PHYS_OFFSET + PAGE_OFFSET) | ||
24 | |||
22 | .pushsection .data | 25 | .pushsection .data |
23 | omap_uart_phys: .word 0 | 26 | omap_uart_phys: .word 0 |
24 | omap_uart_virt: .word 0 | 27 | omap_uart_virt: .word 0 |
@@ -36,7 +39,7 @@ omap_uart_lsr: .word 0 | |||
36 | /* Use omap_uart_phys/virt if already configured */ | 39 | /* Use omap_uart_phys/virt if already configured */ |
37 | 10: mrc p15, 0, \rp, c1, c0 | 40 | 10: mrc p15, 0, \rp, c1, c0 |
38 | tst \rp, #1 @ MMU enabled? | 41 | tst \rp, #1 @ MMU enabled? |
39 | ldreq \rp, =__virt_to_phys(omap_uart_phys) @ MMU not enabled | 42 | ldreq \rp, =omap_uart_v2p(omap_uart_phys) @ MMU disabled |
40 | ldrne \rp, =omap_uart_phys @ MMU enabled | 43 | ldrne \rp, =omap_uart_phys @ MMU enabled |
41 | add \rv, \rp, #4 @ omap_uart_virt | 44 | add \rv, \rp, #4 @ omap_uart_virt |
42 | ldr \rp, [\rp, #0] | 45 | ldr \rp, [\rp, #0] |
@@ -49,7 +52,7 @@ omap_uart_lsr: .word 0 | |||
49 | mrc p15, 0, \rp, c1, c0 | 52 | mrc p15, 0, \rp, c1, c0 |
50 | tst \rp, #1 @ MMU enabled? | 53 | tst \rp, #1 @ MMU enabled? |
51 | ldreq \rp, =OMAP_UART_INFO @ MMU not enabled | 54 | ldreq \rp, =OMAP_UART_INFO @ MMU not enabled |
52 | ldrne \rp, =__phys_to_virt(OMAP_UART_INFO) @ MMU enabled | 55 | ldrne \rp, =omap_uart_p2v(OMAP_UART_INFO) @ MMU enabled |
53 | ldr \rp, [\rp, #0] | 56 | ldr \rp, [\rp, #0] |
54 | 57 | ||
55 | /* Select the UART to use based on the UART1 scratchpad value */ | 58 | /* Select the UART to use based on the UART1 scratchpad value */ |
@@ -94,7 +97,7 @@ omap_uart_lsr: .word 0 | |||
94 | 95: ldr \rp, =ZOOM_UART_BASE | 97 | 95: ldr \rp, =ZOOM_UART_BASE |
95 | mrc p15, 0, \rv, c1, c0 | 98 | mrc p15, 0, \rv, c1, c0 |
96 | tst \rv, #1 @ MMU enabled? | 99 | tst \rv, #1 @ MMU enabled? |
97 | ldreq \rv, =__virt_to_phys(omap_uart_phys) @ MMU not enabled | 100 | ldreq \rv, =omap_uart_v2p(omap_uart_phys) @ MMU disabled |
98 | ldrne \rv, =omap_uart_phys @ MMU enabled | 101 | ldrne \rv, =omap_uart_phys @ MMU enabled |
99 | str \rp, [\rv, #0] | 102 | str \rp, [\rv, #0] |
100 | ldr \rp, =ZOOM_UART_VIRT | 103 | ldr \rp, =ZOOM_UART_VIRT |
@@ -109,7 +112,7 @@ omap_uart_lsr: .word 0 | |||
109 | 98: add \rp, \rp, #0x48000000 @ phys base | 112 | 98: add \rp, \rp, #0x48000000 @ phys base |
110 | mrc p15, 0, \rv, c1, c0 | 113 | mrc p15, 0, \rv, c1, c0 |
111 | tst \rv, #1 @ MMU enabled? | 114 | tst \rv, #1 @ MMU enabled? |
112 | ldreq \rv, =__virt_to_phys(omap_uart_phys) @ MMU not enabled | 115 | ldreq \rv, =omap_uart_v2p(omap_uart_phys) @ MMU disabled |
113 | ldrne \rv, =omap_uart_phys @ MMU enabled | 116 | ldrne \rv, =omap_uart_phys @ MMU enabled |
114 | str \rp, [\rv, #0] | 117 | str \rp, [\rv, #0] |
115 | sub \rp, \rp, #0x48000000 @ phys base | 118 | sub \rp, \rp, #0x48000000 @ phys base |
@@ -131,7 +134,7 @@ omap_uart_lsr: .word 0 | |||
131 | .macro busyuart,rd,rx | 134 | .macro busyuart,rd,rx |
132 | 1001: mrc p15, 0, \rd, c1, c0 | 135 | 1001: mrc p15, 0, \rd, c1, c0 |
133 | tst \rd, #1 @ MMU enabled? | 136 | tst \rd, #1 @ MMU enabled? |
134 | ldreq \rd, =__virt_to_phys(omap_uart_lsr) @ MMU not enabled | 137 | ldreq \rd, =omap_uart_v2p(omap_uart_lsr) @ MMU disabled |
135 | ldrne \rd, =omap_uart_lsr @ MMU enabled | 138 | ldrne \rd, =omap_uart_lsr @ MMU enabled |
136 | ldr \rd, [\rd, #0] | 139 | ldr \rd, [\rd, #0] |
137 | ldrb \rd, [\rx, \rd] | 140 | ldrb \rd, [\rx, \rd] |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 19268647ce36..9ef8c29dd817 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -52,6 +52,12 @@ static void omap4_l2x0_disable(void) | |||
52 | omap_smc1(0x102, 0x0); | 52 | omap_smc1(0x102, 0x0); |
53 | } | 53 | } |
54 | 54 | ||
55 | static void omap4_l2x0_set_debug(unsigned long val) | ||
56 | { | ||
57 | /* Program PL310 L2 Cache controller debug register */ | ||
58 | omap_smc1(0x100, val); | ||
59 | } | ||
60 | |||
55 | static int __init omap_l2_cache_init(void) | 61 | static int __init omap_l2_cache_init(void) |
56 | { | 62 | { |
57 | u32 aux_ctrl = 0; | 63 | u32 aux_ctrl = 0; |
@@ -99,6 +105,7 @@ static int __init omap_l2_cache_init(void) | |||
99 | * specific one | 105 | * specific one |
100 | */ | 106 | */ |
101 | outer_cache.disable = omap4_l2x0_disable; | 107 | outer_cache.disable = omap4_l2x0_disable; |
108 | outer_cache.set_debug = omap4_l2x0_set_debug; | ||
102 | 109 | ||
103 | return 0; | 110 | return 0; |
104 | } | 111 | } |
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index 1c1b0ab5b978..39580e6060e8 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
@@ -92,7 +92,7 @@ extern void omap24xx_idle_loop_suspend(void); | |||
92 | extern void omap24xx_cpu_suspend(u32 dll_ctrl, void __iomem *sdrc_dlla_ctrl, | 92 | extern void omap24xx_cpu_suspend(u32 dll_ctrl, void __iomem *sdrc_dlla_ctrl, |
93 | void __iomem *sdrc_power); | 93 | void __iomem *sdrc_power); |
94 | extern void omap34xx_cpu_suspend(u32 *addr, int save_state); | 94 | extern void omap34xx_cpu_suspend(u32 *addr, int save_state); |
95 | extern void save_secure_ram_context(u32 *addr); | 95 | extern int save_secure_ram_context(u32 *addr); |
96 | extern void omap3_save_scratchpad_contents(void); | 96 | extern void omap3_save_scratchpad_contents(void); |
97 | 97 | ||
98 | extern unsigned int omap24xx_idle_loop_suspend_sz; | 98 | extern unsigned int omap24xx_idle_loop_suspend_sz; |
diff --git a/arch/arm/mach-omap2/sleep24xx.S b/arch/arm/mach-omap2/sleep24xx.S index c7780cc8d919..b5071a47ec39 100644 --- a/arch/arm/mach-omap2/sleep24xx.S +++ b/arch/arm/mach-omap2/sleep24xx.S | |||
@@ -47,6 +47,7 @@ | |||
47 | * Note: This code get's copied to internal SRAM at boot. When the OMAP | 47 | * Note: This code get's copied to internal SRAM at boot. When the OMAP |
48 | * wakes up it continues execution at the point it went to sleep. | 48 | * wakes up it continues execution at the point it went to sleep. |
49 | */ | 49 | */ |
50 | .align 3 | ||
50 | ENTRY(omap24xx_idle_loop_suspend) | 51 | ENTRY(omap24xx_idle_loop_suspend) |
51 | stmfd sp!, {r0, lr} @ save registers on stack | 52 | stmfd sp!, {r0, lr} @ save registers on stack |
52 | mov r0, #0 @ clear for mcr setup | 53 | mov r0, #0 @ clear for mcr setup |
@@ -82,6 +83,7 @@ ENTRY(omap24xx_idle_loop_suspend_sz) | |||
82 | * The DLL load value is not kept in RETENTION or OFF. It needs to be restored | 83 | * The DLL load value is not kept in RETENTION or OFF. It needs to be restored |
83 | * at wake | 84 | * at wake |
84 | */ | 85 | */ |
86 | .align 3 | ||
85 | ENTRY(omap24xx_cpu_suspend) | 87 | ENTRY(omap24xx_cpu_suspend) |
86 | stmfd sp!, {r0 - r12, lr} @ save registers on stack | 88 | stmfd sp!, {r0 - r12, lr} @ save registers on stack |
87 | mov r3, #0x0 @ clear for mcr call | 89 | mov r3, #0x0 @ clear for mcr call |
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S index 98d8232808b8..951a0be66cf7 100644 --- a/arch/arm/mach-omap2/sleep34xx.S +++ b/arch/arm/mach-omap2/sleep34xx.S | |||
@@ -118,6 +118,7 @@ ENTRY(enable_omap3630_toggle_l2_on_restore) | |||
118 | 118 | ||
119 | .text | 119 | .text |
120 | /* Function to call rom code to save secure ram context */ | 120 | /* Function to call rom code to save secure ram context */ |
121 | .align 3 | ||
121 | ENTRY(save_secure_ram_context) | 122 | ENTRY(save_secure_ram_context) |
122 | stmfd sp!, {r1-r12, lr} @ save registers on stack | 123 | stmfd sp!, {r1-r12, lr} @ save registers on stack |
123 | adr r3, api_params @ r3 points to parameters | 124 | adr r3, api_params @ r3 points to parameters |
@@ -169,6 +170,7 @@ ENTRY(save_secure_ram_context_sz) | |||
169 | * depending on the low power mode (non-OFF vs OFF modes), | 170 | * depending on the low power mode (non-OFF vs OFF modes), |
170 | * cf. 'Resume path for xxx mode' comments. | 171 | * cf. 'Resume path for xxx mode' comments. |
171 | */ | 172 | */ |
173 | .align 3 | ||
172 | ENTRY(omap34xx_cpu_suspend) | 174 | ENTRY(omap34xx_cpu_suspend) |
173 | stmfd sp!, {r0-r12, lr} @ save registers on stack | 175 | stmfd sp!, {r0-r12, lr} @ save registers on stack |
174 | 176 | ||
diff --git a/arch/arm/mach-omap2/sram242x.S b/arch/arm/mach-omap2/sram242x.S index 055310cc77de..ff9b9dbcb30e 100644 --- a/arch/arm/mach-omap2/sram242x.S +++ b/arch/arm/mach-omap2/sram242x.S | |||
@@ -39,6 +39,7 @@ | |||
39 | 39 | ||
40 | .text | 40 | .text |
41 | 41 | ||
42 | .align 3 | ||
42 | ENTRY(omap242x_sram_ddr_init) | 43 | ENTRY(omap242x_sram_ddr_init) |
43 | stmfd sp!, {r0 - r12, lr} @ save registers on stack | 44 | stmfd sp!, {r0 - r12, lr} @ save registers on stack |
44 | 45 | ||
@@ -143,6 +144,7 @@ ENTRY(omap242x_sram_ddr_init_sz) | |||
143 | * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR] | 144 | * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR] |
144 | * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0 | 145 | * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0 |
145 | */ | 146 | */ |
147 | .align 3 | ||
146 | ENTRY(omap242x_sram_reprogram_sdrc) | 148 | ENTRY(omap242x_sram_reprogram_sdrc) |
147 | stmfd sp!, {r0 - r10, lr} @ save registers on stack | 149 | stmfd sp!, {r0 - r10, lr} @ save registers on stack |
148 | mov r3, #0x0 @ clear for mrc call | 150 | mov r3, #0x0 @ clear for mrc call |
@@ -238,6 +240,7 @@ ENTRY(omap242x_sram_reprogram_sdrc_sz) | |||
238 | /* | 240 | /* |
239 | * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode. | 241 | * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode. |
240 | */ | 242 | */ |
243 | .align 3 | ||
241 | ENTRY(omap242x_sram_set_prcm) | 244 | ENTRY(omap242x_sram_set_prcm) |
242 | stmfd sp!, {r0-r12, lr} @ regs to stack | 245 | stmfd sp!, {r0-r12, lr} @ regs to stack |
243 | adr r4, pbegin @ addr of preload start | 246 | adr r4, pbegin @ addr of preload start |
diff --git a/arch/arm/mach-omap2/sram243x.S b/arch/arm/mach-omap2/sram243x.S index f9007580aea3..76730209fa0e 100644 --- a/arch/arm/mach-omap2/sram243x.S +++ b/arch/arm/mach-omap2/sram243x.S | |||
@@ -39,6 +39,7 @@ | |||
39 | 39 | ||
40 | .text | 40 | .text |
41 | 41 | ||
42 | .align 3 | ||
42 | ENTRY(omap243x_sram_ddr_init) | 43 | ENTRY(omap243x_sram_ddr_init) |
43 | stmfd sp!, {r0 - r12, lr} @ save registers on stack | 44 | stmfd sp!, {r0 - r12, lr} @ save registers on stack |
44 | 45 | ||
@@ -143,6 +144,7 @@ ENTRY(omap243x_sram_ddr_init_sz) | |||
143 | * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR] | 144 | * r0 = [PRCM_FULL | PRCM_HALF] r1 = SDRC_DLLA_CTRL value r2 = [DDR | SDR] |
144 | * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0 | 145 | * PRCM_FULL = 2, PRCM_HALF = 1, DDR = 1, SDR = 0 |
145 | */ | 146 | */ |
147 | .align 3 | ||
146 | ENTRY(omap243x_sram_reprogram_sdrc) | 148 | ENTRY(omap243x_sram_reprogram_sdrc) |
147 | stmfd sp!, {r0 - r10, lr} @ save registers on stack | 149 | stmfd sp!, {r0 - r10, lr} @ save registers on stack |
148 | mov r3, #0x0 @ clear for mrc call | 150 | mov r3, #0x0 @ clear for mrc call |
@@ -238,6 +240,7 @@ ENTRY(omap243x_sram_reprogram_sdrc_sz) | |||
238 | /* | 240 | /* |
239 | * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode. | 241 | * Set dividers and pll. Also recalculate DLL value for DDR and unlock mode. |
240 | */ | 242 | */ |
243 | .align 3 | ||
241 | ENTRY(omap243x_sram_set_prcm) | 244 | ENTRY(omap243x_sram_set_prcm) |
242 | stmfd sp!, {r0-r12, lr} @ regs to stack | 245 | stmfd sp!, {r0-r12, lr} @ regs to stack |
243 | adr r4, pbegin @ addr of preload start | 246 | adr r4, pbegin @ addr of preload start |
diff --git a/arch/arm/mach-omap2/sram34xx.S b/arch/arm/mach-omap2/sram34xx.S index 7f893a29d500..25011ca2145d 100644 --- a/arch/arm/mach-omap2/sram34xx.S +++ b/arch/arm/mach-omap2/sram34xx.S | |||
@@ -111,6 +111,7 @@ | |||
111 | * since it will cause the ARM MMU to attempt to walk the page tables. | 111 | * since it will cause the ARM MMU to attempt to walk the page tables. |
112 | * These crashes may be intermittent. | 112 | * These crashes may be intermittent. |
113 | */ | 113 | */ |
114 | .align 3 | ||
114 | ENTRY(omap3_sram_configure_core_dpll) | 115 | ENTRY(omap3_sram_configure_core_dpll) |
115 | stmfd sp!, {r1-r12, lr} @ store regs to stack | 116 | stmfd sp!, {r1-r12, lr} @ store regs to stack |
116 | 117 | ||
diff --git a/arch/arm/mach-orion5x/include/mach/memory.h b/arch/arm/mach-orion5x/include/mach/memory.h index 52a2955d0f87..6769917882fe 100644 --- a/arch/arm/mach-orion5x/include/mach/memory.h +++ b/arch/arm/mach-orion5x/include/mach/memory.h | |||
@@ -7,6 +7,6 @@ | |||
7 | #ifndef __ASM_ARCH_MEMORY_H | 7 | #ifndef __ASM_ARCH_MEMORY_H |
8 | #define __ASM_ARCH_MEMORY_H | 8 | #define __ASM_ARCH_MEMORY_H |
9 | 9 | ||
10 | #define PHYS_OFFSET UL(0x00000000) | 10 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
11 | 11 | ||
12 | #endif | 12 | #endif |
diff --git a/arch/arm/mach-pnx4008/include/mach/memory.h b/arch/arm/mach-pnx4008/include/mach/memory.h index 0e8770081058..1275db61cee5 100644 --- a/arch/arm/mach-pnx4008/include/mach/memory.h +++ b/arch/arm/mach-pnx4008/include/mach/memory.h | |||
@@ -16,6 +16,6 @@ | |||
16 | /* | 16 | /* |
17 | * Physical DRAM offset. | 17 | * Physical DRAM offset. |
18 | */ | 18 | */ |
19 | #define PHYS_OFFSET UL(0x80000000) | 19 | #define PLAT_PHYS_OFFSET UL(0x80000000) |
20 | 20 | ||
21 | #endif | 21 | #endif |
diff --git a/arch/arm/mach-pxa/balloon3.c b/arch/arm/mach-pxa/balloon3.c index a134a1413e01..e194d928cdaa 100644 --- a/arch/arm/mach-pxa/balloon3.c +++ b/arch/arm/mach-pxa/balloon3.c | |||
@@ -829,5 +829,5 @@ MACHINE_START(BALLOON3, "Balloon3") | |||
829 | .init_irq = balloon3_init_irq, | 829 | .init_irq = balloon3_init_irq, |
830 | .timer = &pxa_timer, | 830 | .timer = &pxa_timer, |
831 | .init_machine = balloon3_init, | 831 | .init_machine = balloon3_init, |
832 | .boot_params = PHYS_OFFSET + 0x100, | 832 | .boot_params = PLAT_PHYS_OFFSET + 0x100, |
833 | MACHINE_END | 833 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/include/mach/memory.h b/arch/arm/mach-pxa/include/mach/memory.h index 92361a66b223..7f68724dcc27 100644 --- a/arch/arm/mach-pxa/include/mach/memory.h +++ b/arch/arm/mach-pxa/include/mach/memory.h | |||
@@ -15,7 +15,7 @@ | |||
15 | /* | 15 | /* |
16 | * Physical DRAM offset. | 16 | * Physical DRAM offset. |
17 | */ | 17 | */ |
18 | #define PHYS_OFFSET UL(0xa0000000) | 18 | #define PLAT_PHYS_OFFSET UL(0xa0000000) |
19 | 19 | ||
20 | #if !defined(__ASSEMBLY__) && defined(CONFIG_MACH_ARMCORE) && defined(CONFIG_PCI) | 20 | #if !defined(__ASSEMBLY__) && defined(CONFIG_MACH_ARMCORE) && defined(CONFIG_PCI) |
21 | void cmx2xx_pci_adjust_zones(unsigned long *size, unsigned long *holes); | 21 | void cmx2xx_pci_adjust_zones(unsigned long *size, unsigned long *holes); |
diff --git a/arch/arm/mach-pxa/include/mach/pm.h b/arch/arm/mach-pxa/include/mach/pm.h index fd8360c6839d..f15afe012995 100644 --- a/arch/arm/mach-pxa/include/mach/pm.h +++ b/arch/arm/mach-pxa/include/mach/pm.h | |||
@@ -22,9 +22,8 @@ struct pxa_cpu_pm_fns { | |||
22 | extern struct pxa_cpu_pm_fns *pxa_cpu_pm_fns; | 22 | extern struct pxa_cpu_pm_fns *pxa_cpu_pm_fns; |
23 | 23 | ||
24 | /* sleep.S */ | 24 | /* sleep.S */ |
25 | extern void pxa25x_cpu_suspend(unsigned int); | 25 | extern void pxa25x_cpu_suspend(unsigned int, long); |
26 | extern void pxa27x_cpu_suspend(unsigned int); | 26 | extern void pxa27x_cpu_suspend(unsigned int, long); |
27 | extern void pxa_cpu_resume(void); | ||
28 | 27 | ||
29 | extern int pxa_pm_enter(suspend_state_t state); | 28 | extern int pxa_pm_enter(suspend_state_t state); |
30 | extern int pxa_pm_prepare(void); | 29 | extern int pxa_pm_prepare(void); |
diff --git a/arch/arm/mach-pxa/palmz72.c b/arch/arm/mach-pxa/palmz72.c index 7bf4017326e3..3010193b081e 100644 --- a/arch/arm/mach-pxa/palmz72.c +++ b/arch/arm/mach-pxa/palmz72.c | |||
@@ -212,7 +212,7 @@ static unsigned long store_ptr; | |||
212 | static int palmz72_pm_suspend(struct sys_device *dev, pm_message_t msg) | 212 | static int palmz72_pm_suspend(struct sys_device *dev, pm_message_t msg) |
213 | { | 213 | { |
214 | /* setup the resume_info struct for the original bootloader */ | 214 | /* setup the resume_info struct for the original bootloader */ |
215 | palmz72_resume_info.resume_addr = (u32) pxa_cpu_resume; | 215 | palmz72_resume_info.resume_addr = (u32) cpu_resume; |
216 | 216 | ||
217 | /* Storing memory touched by ROM */ | 217 | /* Storing memory touched by ROM */ |
218 | store_ptr = *PALMZ72_SAVE_DWORD; | 218 | store_ptr = *PALMZ72_SAVE_DWORD; |
diff --git a/arch/arm/mach-pxa/pm.c b/arch/arm/mach-pxa/pm.c index 1807c9abdde0..51e1583265b2 100644 --- a/arch/arm/mach-pxa/pm.c +++ b/arch/arm/mach-pxa/pm.c | |||
@@ -67,11 +67,6 @@ int pxa_pm_enter(suspend_state_t state) | |||
67 | 67 | ||
68 | EXPORT_SYMBOL_GPL(pxa_pm_enter); | 68 | EXPORT_SYMBOL_GPL(pxa_pm_enter); |
69 | 69 | ||
70 | unsigned long sleep_phys_sp(void *sp) | ||
71 | { | ||
72 | return virt_to_phys(sp); | ||
73 | } | ||
74 | |||
75 | static int pxa_pm_valid(suspend_state_t state) | 70 | static int pxa_pm_valid(suspend_state_t state) |
76 | { | 71 | { |
77 | if (pxa_cpu_pm_fns) | 72 | if (pxa_cpu_pm_fns) |
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index b166b1d845d7..6bde5956358d 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -244,7 +244,7 @@ static void pxa25x_cpu_pm_enter(suspend_state_t state) | |||
244 | 244 | ||
245 | switch (state) { | 245 | switch (state) { |
246 | case PM_SUSPEND_MEM: | 246 | case PM_SUSPEND_MEM: |
247 | pxa25x_cpu_suspend(PWRMODE_SLEEP); | 247 | pxa25x_cpu_suspend(PWRMODE_SLEEP, PLAT_PHYS_OFFSET - PAGE_OFFSET); |
248 | break; | 248 | break; |
249 | } | 249 | } |
250 | } | 250 | } |
@@ -252,7 +252,7 @@ static void pxa25x_cpu_pm_enter(suspend_state_t state) | |||
252 | static int pxa25x_cpu_pm_prepare(void) | 252 | static int pxa25x_cpu_pm_prepare(void) |
253 | { | 253 | { |
254 | /* set resume return address */ | 254 | /* set resume return address */ |
255 | PSPR = virt_to_phys(pxa_cpu_resume); | 255 | PSPR = virt_to_phys(cpu_resume); |
256 | return 0; | 256 | return 0; |
257 | } | 257 | } |
258 | 258 | ||
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 987301ff4c33..28b11be00b3f 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c | |||
@@ -300,7 +300,7 @@ void pxa27x_cpu_pm_enter(suspend_state_t state) | |||
300 | pxa_cpu_standby(); | 300 | pxa_cpu_standby(); |
301 | break; | 301 | break; |
302 | case PM_SUSPEND_MEM: | 302 | case PM_SUSPEND_MEM: |
303 | pxa27x_cpu_suspend(pwrmode); | 303 | pxa27x_cpu_suspend(pwrmode, PLAT_PHYS_OFFSET - PAGE_OFFSET); |
304 | break; | 304 | break; |
305 | } | 305 | } |
306 | } | 306 | } |
@@ -313,7 +313,7 @@ static int pxa27x_cpu_pm_valid(suspend_state_t state) | |||
313 | static int pxa27x_cpu_pm_prepare(void) | 313 | static int pxa27x_cpu_pm_prepare(void) |
314 | { | 314 | { |
315 | /* set resume return address */ | 315 | /* set resume return address */ |
316 | PSPR = virt_to_phys(pxa_cpu_resume); | 316 | PSPR = virt_to_phys(cpu_resume); |
317 | return 0; | 317 | return 0; |
318 | } | 318 | } |
319 | 319 | ||
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index a7a19e1cd640..1230343d9c70 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c | |||
@@ -142,8 +142,7 @@ static void pxa3xx_cpu_pm_suspend(void) | |||
142 | volatile unsigned long *p = (volatile void *)0xc0000000; | 142 | volatile unsigned long *p = (volatile void *)0xc0000000; |
143 | unsigned long saved_data = *p; | 143 | unsigned long saved_data = *p; |
144 | 144 | ||
145 | extern void pxa3xx_cpu_suspend(void); | 145 | extern void pxa3xx_cpu_suspend(long); |
146 | extern void pxa3xx_cpu_resume(void); | ||
147 | 146 | ||
148 | /* resuming from D2 requires the HSIO2/BOOT/TPM clocks enabled */ | 147 | /* resuming from D2 requires the HSIO2/BOOT/TPM clocks enabled */ |
149 | CKENA |= (1 << CKEN_BOOT) | (1 << CKEN_TPM); | 148 | CKENA |= (1 << CKEN_BOOT) | (1 << CKEN_TPM); |
@@ -161,9 +160,9 @@ static void pxa3xx_cpu_pm_suspend(void) | |||
161 | PSPR = 0x5c014000; | 160 | PSPR = 0x5c014000; |
162 | 161 | ||
163 | /* overwrite with the resume address */ | 162 | /* overwrite with the resume address */ |
164 | *p = virt_to_phys(pxa3xx_cpu_resume); | 163 | *p = virt_to_phys(cpu_resume); |
165 | 164 | ||
166 | pxa3xx_cpu_suspend(); | 165 | pxa3xx_cpu_suspend(PLAT_PHYS_OFFSET - PAGE_OFFSET); |
167 | 166 | ||
168 | *p = saved_data; | 167 | *p = saved_data; |
169 | 168 | ||
diff --git a/arch/arm/mach-pxa/sleep.S b/arch/arm/mach-pxa/sleep.S index c551da86baf6..6f5368899d84 100644 --- a/arch/arm/mach-pxa/sleep.S +++ b/arch/arm/mach-pxa/sleep.S | |||
@@ -22,133 +22,26 @@ | |||
22 | 22 | ||
23 | .text | 23 | .text |
24 | 24 | ||
25 | pxa_cpu_save_cp: | ||
26 | @ get coprocessor registers | ||
27 | mrc p14, 0, r3, c6, c0, 0 @ clock configuration, for turbo mode | ||
28 | mrc p15, 0, r4, c15, c1, 0 @ CP access reg | ||
29 | mrc p15, 0, r5, c13, c0, 0 @ PID | ||
30 | mrc p15, 0, r6, c3, c0, 0 @ domain ID | ||
31 | mrc p15, 0, r7, c2, c0, 0 @ translation table base addr | ||
32 | mrc p15, 0, r8, c1, c1, 0 @ auxiliary control reg | ||
33 | mrc p15, 0, r9, c1, c0, 0 @ control reg | ||
34 | |||
35 | bic r3, r3, #2 @ clear frequency change bit | ||
36 | |||
37 | @ store them plus current virtual stack ptr on stack | ||
38 | mov r10, sp | ||
39 | stmfd sp!, {r3 - r10} | ||
40 | |||
41 | mov pc, lr | ||
42 | |||
43 | pxa_cpu_save_sp: | ||
44 | @ preserve phys address of stack | ||
45 | mov r0, sp | ||
46 | str lr, [sp, #-4]! | ||
47 | bl sleep_phys_sp | ||
48 | ldr r1, =sleep_save_sp | ||
49 | str r0, [r1] | ||
50 | ldr pc, [sp], #4 | ||
51 | |||
52 | #ifdef CONFIG_PXA3xx | 25 | #ifdef CONFIG_PXA3xx |
53 | /* | 26 | /* |
54 | * pxa3xx_cpu_suspend() - forces CPU into sleep state (S2D3C4) | 27 | * pxa3xx_cpu_suspend() - forces CPU into sleep state (S2D3C4) |
55 | * | 28 | * |
56 | * NOTE: unfortunately, pxa_cpu_save_cp can not be reused here since | 29 | * r0 = v:p offset |
57 | * the auxiliary control register address is different between pxa3xx | ||
58 | * and pxa{25x,27x} | ||
59 | */ | 30 | */ |
60 | |||
61 | ENTRY(pxa3xx_cpu_suspend) | 31 | ENTRY(pxa3xx_cpu_suspend) |
62 | 32 | ||
63 | #ifndef CONFIG_IWMMXT | 33 | #ifndef CONFIG_IWMMXT |
64 | mra r2, r3, acc0 | 34 | mra r2, r3, acc0 |
65 | #endif | 35 | #endif |
66 | stmfd sp!, {r2 - r12, lr} @ save registers on stack | 36 | stmfd sp!, {r2 - r12, lr} @ save registers on stack |
67 | 37 | mov r1, r0 | |
68 | mrc p14, 0, r3, c6, c0, 0 @ clock configuration, for turbo mode | 38 | ldr r3, =pxa_cpu_resume @ resume function |
69 | mrc p15, 0, r4, c15, c1, 0 @ CP access reg | 39 | bl cpu_suspend |
70 | mrc p15, 0, r5, c13, c0, 0 @ PID | ||
71 | mrc p15, 0, r6, c3, c0, 0 @ domain ID | ||
72 | mrc p15, 0, r7, c2, c0, 0 @ translation table base addr | ||
73 | mrc p15, 0, r8, c1, c0, 1 @ auxiliary control reg | ||
74 | mrc p15, 0, r9, c1, c0, 0 @ control reg | ||
75 | |||
76 | bic r3, r3, #2 @ clear frequency change bit | ||
77 | |||
78 | @ store them plus current virtual stack ptr on stack | ||
79 | mov r10, sp | ||
80 | stmfd sp!, {r3 - r10} | ||
81 | |||
82 | @ store physical address of stack pointer | ||
83 | mov r0, sp | ||
84 | bl sleep_phys_sp | ||
85 | ldr r1, =sleep_save_sp | ||
86 | str r0, [r1] | ||
87 | |||
88 | @ clean data cache | ||
89 | bl xsc3_flush_kern_cache_all | ||
90 | 40 | ||
91 | mov r0, #0x06 @ S2D3C4 mode | 41 | mov r0, #0x06 @ S2D3C4 mode |
92 | mcr p14, 0, r0, c7, c0, 0 @ enter sleep | 42 | mcr p14, 0, r0, c7, c0, 0 @ enter sleep |
93 | 43 | ||
94 | 20: b 20b @ waiting for sleep | 44 | 20: b 20b @ waiting for sleep |
95 | |||
96 | .data | ||
97 | .align 5 | ||
98 | /* | ||
99 | * pxa3xx_cpu_resume | ||
100 | */ | ||
101 | |||
102 | ENTRY(pxa3xx_cpu_resume) | ||
103 | |||
104 | mov r0, #PSR_I_BIT | PSR_F_BIT | SVC_MODE @ set SVC, irqs off | ||
105 | msr cpsr_c, r0 | ||
106 | |||
107 | ldr r0, sleep_save_sp @ stack phys addr | ||
108 | ldmfd r0, {r3 - r9, sp} @ CP regs + virt stack ptr | ||
109 | |||
110 | mov r1, #0 | ||
111 | mcr p15, 0, r1, c7, c7, 0 @ invalidate I & D caches, BTB | ||
112 | mcr p15, 0, r1, c7, c10, 4 @ drain write (&fill) buffer | ||
113 | mcr p15, 0, r1, c7, c5, 4 @ flush prefetch buffer | ||
114 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | ||
115 | |||
116 | mcr p14, 0, r3, c6, c0, 0 @ clock configuration, turbo mode. | ||
117 | mcr p15, 0, r4, c15, c1, 0 @ CP access reg | ||
118 | mcr p15, 0, r5, c13, c0, 0 @ PID | ||
119 | mcr p15, 0, r6, c3, c0, 0 @ domain ID | ||
120 | mcr p15, 0, r7, c2, c0, 0 @ translation table base addr | ||
121 | mcr p15, 0, r8, c1, c0, 1 @ auxiliary control reg | ||
122 | |||
123 | @ temporarily map resume_turn_on_mmu into the page table, | ||
124 | @ otherwise prefetch abort occurs after MMU is turned on | ||
125 | mov r1, r7 | ||
126 | bic r1, r1, #0x00ff | ||
127 | bic r1, r1, #0x3f00 | ||
128 | ldr r2, =0x542e | ||
129 | |||
130 | adr r3, resume_turn_on_mmu | ||
131 | mov r3, r3, lsr #20 | ||
132 | orr r4, r2, r3, lsl #20 | ||
133 | ldr r5, [r1, r3, lsl #2] | ||
134 | str r4, [r1, r3, lsl #2] | ||
135 | |||
136 | @ Mapping page table address in the page table | ||
137 | mov r6, r1, lsr #20 | ||
138 | orr r7, r2, r6, lsl #20 | ||
139 | ldr r8, [r1, r6, lsl #2] | ||
140 | str r7, [r1, r6, lsl #2] | ||
141 | |||
142 | ldr r2, =pxa3xx_resume_after_mmu @ absolute virtual address | ||
143 | b resume_turn_on_mmu @ cache align execution | ||
144 | |||
145 | .text | ||
146 | pxa3xx_resume_after_mmu: | ||
147 | /* restore the temporary mapping */ | ||
148 | str r5, [r1, r3, lsl #2] | ||
149 | str r8, [r1, r6, lsl #2] | ||
150 | b resume_after_mmu | ||
151 | |||
152 | #endif /* CONFIG_PXA3xx */ | 45 | #endif /* CONFIG_PXA3xx */ |
153 | 46 | ||
154 | #ifdef CONFIG_PXA27x | 47 | #ifdef CONFIG_PXA27x |
@@ -158,28 +51,23 @@ pxa3xx_resume_after_mmu: | |||
158 | * Forces CPU into sleep state. | 51 | * Forces CPU into sleep state. |
159 | * | 52 | * |
160 | * r0 = value for PWRMODE M field for desired sleep state | 53 | * r0 = value for PWRMODE M field for desired sleep state |
54 | * r1 = v:p offset | ||
161 | */ | 55 | */ |
162 | |||
163 | ENTRY(pxa27x_cpu_suspend) | 56 | ENTRY(pxa27x_cpu_suspend) |
164 | 57 | ||
165 | #ifndef CONFIG_IWMMXT | 58 | #ifndef CONFIG_IWMMXT |
166 | mra r2, r3, acc0 | 59 | mra r2, r3, acc0 |
167 | #endif | 60 | #endif |
168 | stmfd sp!, {r2 - r12, lr} @ save registers on stack | 61 | stmfd sp!, {r2 - r12, lr} @ save registers on stack |
169 | 62 | mov r4, r0 @ save sleep mode | |
170 | bl pxa_cpu_save_cp | 63 | ldr r3, =pxa_cpu_resume @ resume function |
171 | 64 | bl cpu_suspend | |
172 | mov r5, r0 @ save sleep mode | ||
173 | bl pxa_cpu_save_sp | ||
174 | |||
175 | @ clean data cache | ||
176 | bl xscale_flush_kern_cache_all | ||
177 | 65 | ||
178 | @ Put the processor to sleep | 66 | @ Put the processor to sleep |
179 | @ (also workaround for sighting 28071) | 67 | @ (also workaround for sighting 28071) |
180 | 68 | ||
181 | @ prepare value for sleep mode | 69 | @ prepare value for sleep mode |
182 | mov r1, r5 @ sleep mode | 70 | mov r1, r4 @ sleep mode |
183 | 71 | ||
184 | @ prepare pointer to physical address 0 (virtual mapping in generic.c) | 72 | @ prepare pointer to physical address 0 (virtual mapping in generic.c) |
185 | mov r2, #UNCACHED_PHYS_0 | 73 | mov r2, #UNCACHED_PHYS_0 |
@@ -216,21 +104,16 @@ ENTRY(pxa27x_cpu_suspend) | |||
216 | * Forces CPU into sleep state. | 104 | * Forces CPU into sleep state. |
217 | * | 105 | * |
218 | * r0 = value for PWRMODE M field for desired sleep state | 106 | * r0 = value for PWRMODE M field for desired sleep state |
107 | * r1 = v:p offset | ||
219 | */ | 108 | */ |
220 | 109 | ||
221 | ENTRY(pxa25x_cpu_suspend) | 110 | ENTRY(pxa25x_cpu_suspend) |
222 | stmfd sp!, {r2 - r12, lr} @ save registers on stack | 111 | stmfd sp!, {r2 - r12, lr} @ save registers on stack |
223 | 112 | mov r4, r0 @ save sleep mode | |
224 | bl pxa_cpu_save_cp | 113 | ldr r3, =pxa_cpu_resume @ resume function |
225 | 114 | bl cpu_suspend | |
226 | mov r5, r0 @ save sleep mode | ||
227 | bl pxa_cpu_save_sp | ||
228 | |||
229 | @ clean data cache | ||
230 | bl xscale_flush_kern_cache_all | ||
231 | |||
232 | @ prepare value for sleep mode | 115 | @ prepare value for sleep mode |
233 | mov r1, r5 @ sleep mode | 116 | mov r1, r4 @ sleep mode |
234 | 117 | ||
235 | @ prepare pointer to physical address 0 (virtual mapping in generic.c) | 118 | @ prepare pointer to physical address 0 (virtual mapping in generic.c) |
236 | mov r2, #UNCACHED_PHYS_0 | 119 | mov r2, #UNCACHED_PHYS_0 |
@@ -317,53 +200,9 @@ pxa_cpu_do_suspend: | |||
317 | * pxa_cpu_resume() | 200 | * pxa_cpu_resume() |
318 | * | 201 | * |
319 | * entry point from bootloader into kernel during resume | 202 | * entry point from bootloader into kernel during resume |
320 | * | ||
321 | * Note: Yes, part of the following code is located into the .data section. | ||
322 | * This is to allow sleep_save_sp to be accessed with a relative load | ||
323 | * while we can't rely on any MMU translation. We could have put | ||
324 | * sleep_save_sp in the .text section as well, but some setups might | ||
325 | * insist on it to be truly read-only. | ||
326 | */ | 203 | */ |
327 | |||
328 | .data | ||
329 | .align 5 | ||
330 | ENTRY(pxa_cpu_resume) | ||
331 | mov r0, #PSR_I_BIT | PSR_F_BIT | SVC_MODE @ set SVC, irqs off | ||
332 | msr cpsr_c, r0 | ||
333 | |||
334 | ldr r0, sleep_save_sp @ stack phys addr | ||
335 | ldr r2, =resume_after_mmu @ its absolute virtual address | ||
336 | ldmfd r0, {r3 - r9, sp} @ CP regs + virt stack ptr | ||
337 | |||
338 | mov r1, #0 | ||
339 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | ||
340 | mcr p15, 0, r1, c7, c7, 0 @ invalidate I & D caches, BTB | ||
341 | |||
342 | mcr p14, 0, r3, c6, c0, 0 @ clock configuration, turbo mode. | ||
343 | mcr p15, 0, r4, c15, c1, 0 @ CP access reg | ||
344 | mcr p15, 0, r5, c13, c0, 0 @ PID | ||
345 | mcr p15, 0, r6, c3, c0, 0 @ domain ID | ||
346 | mcr p15, 0, r7, c2, c0, 0 @ translation table base addr | ||
347 | mcr p15, 0, r8, c1, c1, 0 @ auxiliary control reg | ||
348 | b resume_turn_on_mmu @ cache align execution | ||
349 | |||
350 | .align 5 | 204 | .align 5 |
351 | resume_turn_on_mmu: | 205 | pxa_cpu_resume: |
352 | mcr p15, 0, r9, c1, c0, 0 @ turn on MMU, caches, etc. | ||
353 | |||
354 | @ Let us ensure we jump to resume_after_mmu only when the mcr above | ||
355 | @ actually took effect. They call it the "cpwait" operation. | ||
356 | mrc p15, 0, r0, c2, c0, 0 @ queue a dependency on CP15 | ||
357 | sub pc, r2, r0, lsr #32 @ jump to virtual addr | ||
358 | nop | ||
359 | nop | ||
360 | nop | ||
361 | |||
362 | sleep_save_sp: | ||
363 | .word 0 @ preserve stack phys ptr here | ||
364 | |||
365 | .text | ||
366 | resume_after_mmu: | ||
367 | ldmfd sp!, {r2, r3} | 206 | ldmfd sp!, {r2, r3} |
368 | #ifndef CONFIG_IWMMXT | 207 | #ifndef CONFIG_IWMMXT |
369 | mar acc0, r2, r3 | 208 | mar acc0, r2, r3 |
diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c index f4b053b35815..b92aa3b8c4f7 100644 --- a/arch/arm/mach-pxa/zeus.c +++ b/arch/arm/mach-pxa/zeus.c | |||
@@ -676,7 +676,7 @@ static struct pxa2xx_udc_mach_info zeus_udc_info = { | |||
676 | static void zeus_power_off(void) | 676 | static void zeus_power_off(void) |
677 | { | 677 | { |
678 | local_irq_disable(); | 678 | local_irq_disable(); |
679 | pxa27x_cpu_suspend(PWRMODE_DEEPSLEEP); | 679 | pxa27x_cpu_suspend(PWRMODE_DEEPSLEEP, PLAT_PHYS_OFFSET - PAGE_OFFSET); |
680 | } | 680 | } |
681 | #else | 681 | #else |
682 | #define zeus_power_off NULL | 682 | #define zeus_power_off NULL |
diff --git a/arch/arm/mach-realview/Kconfig b/arch/arm/mach-realview/Kconfig index 7ca138a943a9..b9a9805e4828 100644 --- a/arch/arm/mach-realview/Kconfig +++ b/arch/arm/mach-realview/Kconfig | |||
@@ -19,7 +19,7 @@ config REALVIEW_EB_A9MP | |||
19 | config REALVIEW_EB_ARM11MP | 19 | config REALVIEW_EB_ARM11MP |
20 | bool "Support ARM11MPCore Tile" | 20 | bool "Support ARM11MPCore Tile" |
21 | depends on MACH_REALVIEW_EB | 21 | depends on MACH_REALVIEW_EB |
22 | select CPU_V6 | 22 | select CPU_V6K |
23 | select ARCH_HAS_BARRIERS if SMP | 23 | select ARCH_HAS_BARRIERS if SMP |
24 | help | 24 | help |
25 | Enable support for the ARM11MPCore tile fitted to the Realview(R) | 25 | Enable support for the ARM11MPCore tile fitted to the Realview(R) |
@@ -36,7 +36,7 @@ config REALVIEW_EB_ARM11MP_REVB | |||
36 | 36 | ||
37 | config MACH_REALVIEW_PB11MP | 37 | config MACH_REALVIEW_PB11MP |
38 | bool "Support RealView(R) Platform Baseboard for ARM11MPCore" | 38 | bool "Support RealView(R) Platform Baseboard for ARM11MPCore" |
39 | select CPU_V6 | 39 | select CPU_V6K |
40 | select ARM_GIC | 40 | select ARM_GIC |
41 | select HAVE_PATA_PLATFORM | 41 | select HAVE_PATA_PLATFORM |
42 | select ARCH_HAS_BARRIERS if SMP | 42 | select ARCH_HAS_BARRIERS if SMP |
@@ -45,6 +45,7 @@ config MACH_REALVIEW_PB11MP | |||
45 | the ARM11MPCore. This platform has an on-board ARM11MPCore and has | 45 | the ARM11MPCore. This platform has an on-board ARM11MPCore and has |
46 | support for PCI-E and Compact Flash. | 46 | support for PCI-E and Compact Flash. |
47 | 47 | ||
48 | # ARMv6 CPU without K extensions, but does have the new exclusive ops | ||
48 | config MACH_REALVIEW_PB1176 | 49 | config MACH_REALVIEW_PB1176 |
49 | bool "Support RealView(R) Platform Baseboard for ARM1176JZF-S" | 50 | bool "Support RealView(R) Platform Baseboard for ARM1176JZF-S" |
50 | select CPU_V6 | 51 | select CPU_V6 |
diff --git a/arch/arm/mach-realview/include/mach/memory.h b/arch/arm/mach-realview/include/mach/memory.h index 5dafc157b276..e05fc2c4c080 100644 --- a/arch/arm/mach-realview/include/mach/memory.h +++ b/arch/arm/mach-realview/include/mach/memory.h | |||
@@ -24,9 +24,9 @@ | |||
24 | * Physical DRAM offset. | 24 | * Physical DRAM offset. |
25 | */ | 25 | */ |
26 | #ifdef CONFIG_REALVIEW_HIGH_PHYS_OFFSET | 26 | #ifdef CONFIG_REALVIEW_HIGH_PHYS_OFFSET |
27 | #define PHYS_OFFSET UL(0x70000000) | 27 | #define PLAT_PHYS_OFFSET UL(0x70000000) |
28 | #else | 28 | #else |
29 | #define PHYS_OFFSET UL(0x00000000) | 29 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #if !defined(__ASSEMBLY__) && defined(CONFIG_ZONE_DMA) | 32 | #if !defined(__ASSEMBLY__) && defined(CONFIG_ZONE_DMA) |
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 6ef5c5e528b2..8ede983b861c 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
@@ -484,7 +484,7 @@ static void __init realview_eb_init(void) | |||
484 | 484 | ||
485 | MACHINE_START(REALVIEW_EB, "ARM-RealView EB") | 485 | MACHINE_START(REALVIEW_EB, "ARM-RealView EB") |
486 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 486 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
487 | .boot_params = PHYS_OFFSET + 0x00000100, | 487 | .boot_params = PLAT_PHYS_OFFSET + 0x00000100, |
488 | .fixup = realview_fixup, | 488 | .fixup = realview_fixup, |
489 | .map_io = realview_eb_map_io, | 489 | .map_io = realview_eb_map_io, |
490 | .init_irq = gic_init_irq, | 490 | .init_irq = gic_init_irq, |
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index cbdc97a5685f..9f26369555c7 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c | |||
@@ -379,7 +379,7 @@ static void __init realview_pb1176_init(void) | |||
379 | 379 | ||
380 | MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") | 380 | MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") |
381 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 381 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
382 | .boot_params = PHYS_OFFSET + 0x00000100, | 382 | .boot_params = PLAT_PHYS_OFFSET + 0x00000100, |
383 | .fixup = realview_pb1176_fixup, | 383 | .fixup = realview_pb1176_fixup, |
384 | .map_io = realview_pb1176_map_io, | 384 | .map_io = realview_pb1176_map_io, |
385 | .init_irq = gic_init_irq, | 385 | .init_irq = gic_init_irq, |
diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 8e8ab7d29a6a..dea06b2da3a2 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c | |||
@@ -381,7 +381,7 @@ static void __init realview_pb11mp_init(void) | |||
381 | 381 | ||
382 | MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") | 382 | MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") |
383 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 383 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
384 | .boot_params = PHYS_OFFSET + 0x00000100, | 384 | .boot_params = PLAT_PHYS_OFFSET + 0x00000100, |
385 | .fixup = realview_fixup, | 385 | .fixup = realview_fixup, |
386 | .map_io = realview_pb11mp_map_io, | 386 | .map_io = realview_pb11mp_map_io, |
387 | .init_irq = gic_init_irq, | 387 | .init_irq = gic_init_irq, |
diff --git a/arch/arm/mach-realview/realview_pba8.c b/arch/arm/mach-realview/realview_pba8.c index 841118e3e118..7d0f1734a217 100644 --- a/arch/arm/mach-realview/realview_pba8.c +++ b/arch/arm/mach-realview/realview_pba8.c | |||
@@ -331,7 +331,7 @@ static void __init realview_pba8_init(void) | |||
331 | 331 | ||
332 | MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") | 332 | MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") |
333 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 333 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
334 | .boot_params = PHYS_OFFSET + 0x00000100, | 334 | .boot_params = PLAT_PHYS_OFFSET + 0x00000100, |
335 | .fixup = realview_fixup, | 335 | .fixup = realview_fixup, |
336 | .map_io = realview_pba8_map_io, | 336 | .map_io = realview_pba8_map_io, |
337 | .init_irq = gic_init_irq, | 337 | .init_irq = gic_init_irq, |
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index 02b755b009db..b89e28f8853e 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c | |||
@@ -414,7 +414,7 @@ static void __init realview_pbx_init(void) | |||
414 | 414 | ||
415 | MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") | 415 | MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") |
416 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 416 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
417 | .boot_params = PHYS_OFFSET + 0x00000100, | 417 | .boot_params = PLAT_PHYS_OFFSET + 0x00000100, |
418 | .fixup = realview_pbx_fixup, | 418 | .fixup = realview_pbx_fixup, |
419 | .map_io = realview_pbx_map_io, | 419 | .map_io = realview_pbx_map_io, |
420 | .init_irq = gic_init_irq, | 420 | .init_irq = gic_init_irq, |
diff --git a/arch/arm/mach-rpc/include/mach/memory.h b/arch/arm/mach-rpc/include/mach/memory.h index 78191bf25192..18a221093bf5 100644 --- a/arch/arm/mach-rpc/include/mach/memory.h +++ b/arch/arm/mach-rpc/include/mach/memory.h | |||
@@ -21,7 +21,7 @@ | |||
21 | /* | 21 | /* |
22 | * Physical DRAM offset. | 22 | * Physical DRAM offset. |
23 | */ | 23 | */ |
24 | #define PHYS_OFFSET UL(0x10000000) | 24 | #define PLAT_PHYS_OFFSET UL(0x10000000) |
25 | 25 | ||
26 | /* | 26 | /* |
27 | * Cache flushing area - ROM | 27 | * Cache flushing area - ROM |
diff --git a/arch/arm/mach-s3c2400/include/mach/memory.h b/arch/arm/mach-s3c2400/include/mach/memory.h index cf5901ffd385..3f33670dd012 100644 --- a/arch/arm/mach-s3c2400/include/mach/memory.h +++ b/arch/arm/mach-s3c2400/include/mach/memory.h | |||
@@ -15,6 +15,6 @@ | |||
15 | #ifndef __ASM_ARCH_MEMORY_H | 15 | #ifndef __ASM_ARCH_MEMORY_H |
16 | #define __ASM_ARCH_MEMORY_H | 16 | #define __ASM_ARCH_MEMORY_H |
17 | 17 | ||
18 | #define PHYS_OFFSET UL(0x0C000000) | 18 | #define PLAT_PHYS_OFFSET UL(0x0C000000) |
19 | 19 | ||
20 | #endif | 20 | #endif |
diff --git a/arch/arm/mach-s3c2410/include/mach/memory.h b/arch/arm/mach-s3c2410/include/mach/memory.h index 6f1e5871ae4b..f92b97b89c0c 100644 --- a/arch/arm/mach-s3c2410/include/mach/memory.h +++ b/arch/arm/mach-s3c2410/include/mach/memory.h | |||
@@ -11,6 +11,6 @@ | |||
11 | #ifndef __ASM_ARCH_MEMORY_H | 11 | #ifndef __ASM_ARCH_MEMORY_H |
12 | #define __ASM_ARCH_MEMORY_H | 12 | #define __ASM_ARCH_MEMORY_H |
13 | 13 | ||
14 | #define PHYS_OFFSET UL(0x30000000) | 14 | #define PLAT_PHYS_OFFSET UL(0x30000000) |
15 | 15 | ||
16 | #endif | 16 | #endif |
diff --git a/arch/arm/mach-s3c24a0/include/mach/memory.h b/arch/arm/mach-s3c24a0/include/mach/memory.h index 7d74fd5c8d66..7d208a71b172 100644 --- a/arch/arm/mach-s3c24a0/include/mach/memory.h +++ b/arch/arm/mach-s3c24a0/include/mach/memory.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #ifndef __ASM_ARCH_24A0_MEMORY_H | 11 | #ifndef __ASM_ARCH_24A0_MEMORY_H |
12 | #define __ASM_ARCH_24A0_MEMORY_H __FILE__ | 12 | #define __ASM_ARCH_24A0_MEMORY_H __FILE__ |
13 | 13 | ||
14 | #define PHYS_OFFSET UL(0x10000000) | 14 | #define PLAT_PHYS_OFFSET UL(0x10000000) |
15 | 15 | ||
16 | #define __virt_to_bus(x) __virt_to_phys(x) | 16 | #define __virt_to_bus(x) __virt_to_phys(x) |
17 | #define __bus_to_virt(x) __phys_to_virt(x) | 17 | #define __bus_to_virt(x) __phys_to_virt(x) |
diff --git a/arch/arm/mach-s3c64xx/include/mach/memory.h b/arch/arm/mach-s3c64xx/include/mach/memory.h index 42cc54e2ee30..4760cdae1eb6 100644 --- a/arch/arm/mach-s3c64xx/include/mach/memory.h +++ b/arch/arm/mach-s3c64xx/include/mach/memory.h | |||
@@ -13,7 +13,7 @@ | |||
13 | #ifndef __ASM_ARCH_MEMORY_H | 13 | #ifndef __ASM_ARCH_MEMORY_H |
14 | #define __ASM_ARCH_MEMORY_H | 14 | #define __ASM_ARCH_MEMORY_H |
15 | 15 | ||
16 | #define PHYS_OFFSET UL(0x50000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x50000000) |
17 | 17 | ||
18 | #define CONSISTENT_DMA_SIZE SZ_8M | 18 | #define CONSISTENT_DMA_SIZE SZ_8M |
19 | 19 | ||
diff --git a/arch/arm/mach-s3c64xx/sleep.S b/arch/arm/mach-s3c64xx/sleep.S index b2ef44317368..afe5a762f46e 100644 --- a/arch/arm/mach-s3c64xx/sleep.S +++ b/arch/arm/mach-s3c64xx/sleep.S | |||
@@ -32,25 +32,13 @@ | |||
32 | * code after resume. | 32 | * code after resume. |
33 | * | 33 | * |
34 | * entry: | 34 | * entry: |
35 | * r0 = pointer to the save block | 35 | * r1 = v:p offset |
36 | */ | 36 | */ |
37 | 37 | ||
38 | ENTRY(s3c_cpu_save) | 38 | ENTRY(s3c_cpu_save) |
39 | stmfd sp!, { r4 - r12, lr } | 39 | stmfd sp!, { r4 - r12, lr } |
40 | 40 | ldr r3, =resume_with_mmu | |
41 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | 41 | bl cpu_suspend |
42 | mrc p15, 0, r5, c3, c0, 0 @ Domain ID | ||
43 | mrc p15, 0, r6, c2, c0, 0 @ Translation Table BASE0 | ||
44 | mrc p15, 0, r7, c2, c0, 1 @ Translation Table BASE1 | ||
45 | mrc p15, 0, r8, c2, c0, 2 @ Translation Table Control | ||
46 | mrc p15, 0, r9, c1, c0, 0 @ Control register | ||
47 | mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register | ||
48 | mrc p15, 0, r11, c1, c0, 2 @ Co-processor access controls | ||
49 | |||
50 | stmia r0, { r4 - r13 } @ Save CP registers and SP | ||
51 | |||
52 | @@ save our state to ram | ||
53 | bl s3c_pm_cb_flushcache | ||
54 | 42 | ||
55 | @@ call final suspend code | 43 | @@ call final suspend code |
56 | ldr r0, =pm_cpu_sleep | 44 | ldr r0, =pm_cpu_sleep |
@@ -61,18 +49,6 @@ ENTRY(s3c_cpu_save) | |||
61 | resume_with_mmu: | 49 | resume_with_mmu: |
62 | ldmfd sp!, { r4 - r12, pc } @ return, from sp from s3c_cpu_save | 50 | ldmfd sp!, { r4 - r12, pc } @ return, from sp from s3c_cpu_save |
63 | 51 | ||
64 | .data | ||
65 | |||
66 | /* the next bit is code, but it requires easy access to the | ||
67 | * s3c_sleep_save_phys data before the MMU is switched on, so | ||
68 | * we store the code that needs this variable in the .data where | ||
69 | * the value can be written to (the .text segment is RO). | ||
70 | */ | ||
71 | |||
72 | .global s3c_sleep_save_phys | ||
73 | s3c_sleep_save_phys: | ||
74 | .word 0 | ||
75 | |||
76 | /* Sleep magic, the word before the resume entry point so that the | 52 | /* Sleep magic, the word before the resume entry point so that the |
77 | * bootloader can check for a resumeable image. */ | 53 | * bootloader can check for a resumeable image. */ |
78 | 54 | ||
@@ -110,35 +86,4 @@ ENTRY(s3c_cpu_resume) | |||
110 | orr r0, r0, #1 << 15 @ GPN15 | 86 | orr r0, r0, #1 << 15 @ GPN15 |
111 | str r0, [ r3, #S3C64XX_GPNDAT ] | 87 | str r0, [ r3, #S3C64XX_GPNDAT ] |
112 | #endif | 88 | #endif |
113 | 89 | b cpu_resume | |
114 | /* __v6_setup from arch/arm/mm/proc-v6.S, ensure that the caches | ||
115 | * are thoroughly cleaned just in case the bootloader didn't do it | ||
116 | * for us. */ | ||
117 | mov r0, #0 | ||
118 | mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache | ||
119 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache | ||
120 | mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache | ||
121 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | ||
122 | @@mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs | ||
123 | @@mcr p15, 0, r0, c7, c7, 0 @ Invalidate I + D caches | ||
124 | |||
125 | ldr r0, s3c_sleep_save_phys | ||
126 | ldmia r0, { r4 - r13 } | ||
127 | |||
128 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
129 | mcr p15, 0, r5, c3, c0, 0 @ Domain ID | ||
130 | mcr p15, 0, r6, c2, c0, 0 @ Translation Table BASE0 | ||
131 | mcr p15, 0, r7, c2, c0, 1 @ Translation Table BASE1 | ||
132 | mcr p15, 0, r8, c2, c0, 2 @ Translation Table Control | ||
133 | mcr p15, 0, r10, c1, c0, 1 @ Auxiliary control register | ||
134 | |||
135 | mov r0, #0 @ restore copro access controls | ||
136 | mcr p15, 0, r11, c1, c0, 2 @ Co-processor access controls | ||
137 | mcr p15, 0, r0, c7, c5, 4 | ||
138 | |||
139 | ldr r2, =resume_with_mmu | ||
140 | mcr p15, 0, r9, c1, c0, 0 /* turn mmu back on */ | ||
141 | nop | ||
142 | mov pc, r2 /* jump back */ | ||
143 | |||
144 | .end | ||
diff --git a/arch/arm/mach-s5p6442/include/mach/memory.h b/arch/arm/mach-s5p6442/include/mach/memory.h index 9ddd877ba2ea..cfe259dded33 100644 --- a/arch/arm/mach-s5p6442/include/mach/memory.h +++ b/arch/arm/mach-s5p6442/include/mach/memory.h | |||
@@ -13,7 +13,7 @@ | |||
13 | #ifndef __ASM_ARCH_MEMORY_H | 13 | #ifndef __ASM_ARCH_MEMORY_H |
14 | #define __ASM_ARCH_MEMORY_H | 14 | #define __ASM_ARCH_MEMORY_H |
15 | 15 | ||
16 | #define PHYS_OFFSET UL(0x20000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x20000000) |
17 | #define CONSISTENT_DMA_SIZE SZ_8M | 17 | #define CONSISTENT_DMA_SIZE SZ_8M |
18 | 18 | ||
19 | #endif /* __ASM_ARCH_MEMORY_H */ | 19 | #endif /* __ASM_ARCH_MEMORY_H */ |
diff --git a/arch/arm/mach-s5p64x0/include/mach/memory.h b/arch/arm/mach-s5p64x0/include/mach/memory.h index 1b036b0a24ce..365a6eb4b88f 100644 --- a/arch/arm/mach-s5p64x0/include/mach/memory.h +++ b/arch/arm/mach-s5p64x0/include/mach/memory.h | |||
@@ -13,7 +13,7 @@ | |||
13 | #ifndef __ASM_ARCH_MEMORY_H | 13 | #ifndef __ASM_ARCH_MEMORY_H |
14 | #define __ASM_ARCH_MEMORY_H __FILE__ | 14 | #define __ASM_ARCH_MEMORY_H __FILE__ |
15 | 15 | ||
16 | #define PHYS_OFFSET UL(0x20000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x20000000) |
17 | #define CONSISTENT_DMA_SIZE SZ_8M | 17 | #define CONSISTENT_DMA_SIZE SZ_8M |
18 | 18 | ||
19 | #endif /* __ASM_ARCH_MEMORY_H */ | 19 | #endif /* __ASM_ARCH_MEMORY_H */ |
diff --git a/arch/arm/mach-s5pc100/include/mach/memory.h b/arch/arm/mach-s5pc100/include/mach/memory.h index 4b60d18179f7..bda4e79fd5fc 100644 --- a/arch/arm/mach-s5pc100/include/mach/memory.h +++ b/arch/arm/mach-s5pc100/include/mach/memory.h | |||
@@ -13,6 +13,6 @@ | |||
13 | #ifndef __ASM_ARCH_MEMORY_H | 13 | #ifndef __ASM_ARCH_MEMORY_H |
14 | #define __ASM_ARCH_MEMORY_H | 14 | #define __ASM_ARCH_MEMORY_H |
15 | 15 | ||
16 | #define PHYS_OFFSET UL(0x20000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x20000000) |
17 | 17 | ||
18 | #endif | 18 | #endif |
diff --git a/arch/arm/mach-s5pv210/include/mach/memory.h b/arch/arm/mach-s5pv210/include/mach/memory.h index d503e0c4ce4f..7b5fcf0da0c4 100644 --- a/arch/arm/mach-s5pv210/include/mach/memory.h +++ b/arch/arm/mach-s5pv210/include/mach/memory.h | |||
@@ -13,7 +13,7 @@ | |||
13 | #ifndef __ASM_ARCH_MEMORY_H | 13 | #ifndef __ASM_ARCH_MEMORY_H |
14 | #define __ASM_ARCH_MEMORY_H | 14 | #define __ASM_ARCH_MEMORY_H |
15 | 15 | ||
16 | #define PHYS_OFFSET UL(0x20000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x20000000) |
17 | #define CONSISTENT_DMA_SIZE (SZ_8M + SZ_4M + SZ_2M) | 17 | #define CONSISTENT_DMA_SIZE (SZ_8M + SZ_4M + SZ_2M) |
18 | 18 | ||
19 | /* | 19 | /* |
diff --git a/arch/arm/mach-s5pv210/sleep.S b/arch/arm/mach-s5pv210/sleep.S index d4d222b716b4..a3d649466fb1 100644 --- a/arch/arm/mach-s5pv210/sleep.S +++ b/arch/arm/mach-s5pv210/sleep.S | |||
@@ -35,50 +35,24 @@ | |||
35 | /* s3c_cpu_save | 35 | /* s3c_cpu_save |
36 | * | 36 | * |
37 | * entry: | 37 | * entry: |
38 | * r0 = save address (virtual addr of s3c_sleep_save_phys) | 38 | * r1 = v:p offset |
39 | */ | 39 | */ |
40 | 40 | ||
41 | ENTRY(s3c_cpu_save) | 41 | ENTRY(s3c_cpu_save) |
42 | 42 | ||
43 | stmfd sp!, { r3 - r12, lr } | 43 | stmfd sp!, { r3 - r12, lr } |
44 | 44 | ldr r3, =resume_with_mmu | |
45 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | 45 | bl cpu_suspend |
46 | mrc p15, 0, r5, c3, c0, 0 @ Domain ID | ||
47 | mrc p15, 0, r6, c2, c0, 0 @ Translation Table BASE0 | ||
48 | mrc p15, 0, r7, c2, c0, 1 @ Translation Table BASE1 | ||
49 | mrc p15, 0, r8, c2, c0, 2 @ Translation Table Control | ||
50 | mrc p15, 0, r9, c1, c0, 0 @ Control register | ||
51 | mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register | ||
52 | mrc p15, 0, r11, c1, c0, 2 @ Co-processor access controls | ||
53 | mrc p15, 0, r12, c10, c2, 0 @ Read PRRR | ||
54 | mrc p15, 0, r3, c10, c2, 1 @ READ NMRR | ||
55 | |||
56 | stmia r0, { r3 - r13 } | ||
57 | |||
58 | bl s3c_pm_cb_flushcache | ||
59 | 46 | ||
60 | ldr r0, =pm_cpu_sleep | 47 | ldr r0, =pm_cpu_sleep |
61 | ldr r0, [ r0 ] | 48 | ldr r0, [ r0 ] |
62 | mov pc, r0 | 49 | mov pc, r0 |
63 | 50 | ||
64 | resume_with_mmu: | 51 | resume_with_mmu: |
65 | /* | ||
66 | * After MMU is turned on, restore the previous MMU table. | ||
67 | */ | ||
68 | ldr r9 , =(PAGE_OFFSET - PHYS_OFFSET) | ||
69 | add r4, r4, r9 | ||
70 | str r12, [r4] | ||
71 | |||
72 | ldmfd sp!, { r3 - r12, pc } | 52 | ldmfd sp!, { r3 - r12, pc } |
73 | 53 | ||
74 | .ltorg | 54 | .ltorg |
75 | 55 | ||
76 | .data | ||
77 | |||
78 | .global s3c_sleep_save_phys | ||
79 | s3c_sleep_save_phys: | ||
80 | .word 0 | ||
81 | |||
82 | /* sleep magic, to allow the bootloader to check for an valid | 56 | /* sleep magic, to allow the bootloader to check for an valid |
83 | * image to resume to. Must be the first word before the | 57 | * image to resume to. Must be the first word before the |
84 | * s3c_cpu_resume entry. | 58 | * s3c_cpu_resume entry. |
@@ -96,75 +70,4 @@ s3c_sleep_save_phys: | |||
96 | */ | 70 | */ |
97 | 71 | ||
98 | ENTRY(s3c_cpu_resume) | 72 | ENTRY(s3c_cpu_resume) |
99 | mov r0, #PSR_I_BIT | PSR_F_BIT | SVC_MODE | 73 | b cpu_resume |
100 | msr cpsr_c, r0 | ||
101 | |||
102 | mov r1, #0 | ||
103 | mcr p15, 0, r1, c8, c7, 0 @ invalidate TLBs | ||
104 | mcr p15, 0, r1, c7, c5, 0 @ invalidate I Cache | ||
105 | |||
106 | ldr r0, s3c_sleep_save_phys @ address of restore block | ||
107 | ldmia r0, { r3 - r13 } | ||
108 | |||
109 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
110 | mcr p15, 0, r5, c3, c0, 0 @ Domain ID | ||
111 | |||
112 | mcr p15, 0, r8, c2, c0, 2 @ Translation Table Control | ||
113 | mcr p15, 0, r7, c2, c0, 1 @ Translation Table BASE1 | ||
114 | mcr p15, 0, r6, c2, c0, 0 @ Translation Table BASE0 | ||
115 | |||
116 | mcr p15, 0, r10, c1, c0, 1 @ Auxiliary control register | ||
117 | |||
118 | mov r0, #0 | ||
119 | mcr p15, 0, r0, c8, c7, 0 @ Invalidate I & D TLB | ||
120 | |||
121 | mov r0, #0 @ restore copro access | ||
122 | mcr p15, 0, r11, c1, c0, 2 @ Co-processor access | ||
123 | mcr p15, 0, r0, c7, c5, 4 | ||
124 | |||
125 | mcr p15, 0, r12, c10, c2, 0 @ write PRRR | ||
126 | mcr p15, 0, r3, c10, c2, 1 @ write NMRR | ||
127 | |||
128 | /* | ||
129 | * In Cortex-A8, when MMU is turned on, the pipeline is flushed. | ||
130 | * And there are no valid entries in the MMU table at this point. | ||
131 | * So before turning on the MMU, the MMU entry for the DRAM address | ||
132 | * range is added. After the MMU is turned on, the other entries | ||
133 | * in the MMU table will be restored. | ||
134 | */ | ||
135 | |||
136 | /* r6 = Translation Table BASE0 */ | ||
137 | mov r4, r6 | ||
138 | mov r4, r4, LSR #14 | ||
139 | mov r4, r4, LSL #14 | ||
140 | |||
141 | /* Load address for adding to MMU table list */ | ||
142 | ldr r11, =0xE010F000 @ INFORM0 reg. | ||
143 | ldr r10, [r11, #0] | ||
144 | mov r10, r10, LSR #18 | ||
145 | bic r10, r10, #0x3 | ||
146 | orr r4, r4, r10 | ||
147 | |||
148 | /* Calculate MMU table entry */ | ||
149 | mov r10, r10, LSL #18 | ||
150 | ldr r5, =0x40E | ||
151 | orr r10, r10, r5 | ||
152 | |||
153 | /* Back up originally data */ | ||
154 | ldr r12, [r4] | ||
155 | |||
156 | /* Add calculated MMU table entry into MMU table list */ | ||
157 | str r10, [r4] | ||
158 | |||
159 | ldr r2, =resume_with_mmu | ||
160 | mcr p15, 0, r9, c1, c0, 0 @ turn on MMU, etc | ||
161 | |||
162 | nop | ||
163 | nop | ||
164 | nop | ||
165 | nop | ||
166 | nop @ second-to-last before mmu | ||
167 | |||
168 | mov pc, r2 @ go back to virtual address | ||
169 | |||
170 | .ltorg | ||
diff --git a/arch/arm/mach-s5pv310/include/mach/memory.h b/arch/arm/mach-s5pv310/include/mach/memory.h index 1dffb4823245..470b01bf8614 100644 --- a/arch/arm/mach-s5pv310/include/mach/memory.h +++ b/arch/arm/mach-s5pv310/include/mach/memory.h | |||
@@ -13,7 +13,7 @@ | |||
13 | #ifndef __ASM_ARCH_MEMORY_H | 13 | #ifndef __ASM_ARCH_MEMORY_H |
14 | #define __ASM_ARCH_MEMORY_H __FILE__ | 14 | #define __ASM_ARCH_MEMORY_H __FILE__ |
15 | 15 | ||
16 | #define PHYS_OFFSET UL(0x40000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x40000000) |
17 | 17 | ||
18 | /* Maximum of 256MiB in one bank */ | 18 | /* Maximum of 256MiB in one bank */ |
19 | #define MAX_PHYSMEM_BITS 32 | 19 | #define MAX_PHYSMEM_BITS 32 |
diff --git a/arch/arm/mach-sa1100/include/mach/memory.h b/arch/arm/mach-sa1100/include/mach/memory.h index 128a1dfa96b9..a44da6a2916c 100644 --- a/arch/arm/mach-sa1100/include/mach/memory.h +++ b/arch/arm/mach-sa1100/include/mach/memory.h | |||
@@ -12,7 +12,7 @@ | |||
12 | /* | 12 | /* |
13 | * Physical DRAM offset is 0xc0000000 on the SA1100 | 13 | * Physical DRAM offset is 0xc0000000 on the SA1100 |
14 | */ | 14 | */ |
15 | #define PHYS_OFFSET UL(0xc0000000) | 15 | #define PLAT_PHYS_OFFSET UL(0xc0000000) |
16 | 16 | ||
17 | #ifndef __ASSEMBLY__ | 17 | #ifndef __ASSEMBLY__ |
18 | 18 | ||
diff --git a/arch/arm/mach-sa1100/pm.c b/arch/arm/mach-sa1100/pm.c index ab9fc4470d36..c4661aab22fb 100644 --- a/arch/arm/mach-sa1100/pm.c +++ b/arch/arm/mach-sa1100/pm.c | |||
@@ -32,8 +32,7 @@ | |||
32 | #include <asm/system.h> | 32 | #include <asm/system.h> |
33 | #include <asm/mach/time.h> | 33 | #include <asm/mach/time.h> |
34 | 34 | ||
35 | extern void sa1100_cpu_suspend(void); | 35 | extern void sa1100_cpu_suspend(long); |
36 | extern void sa1100_cpu_resume(void); | ||
37 | 36 | ||
38 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x | 37 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x |
39 | #define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] | 38 | #define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] |
@@ -73,10 +72,10 @@ static int sa11x0_pm_enter(suspend_state_t state) | |||
73 | RCSR = RCSR_HWR | RCSR_SWR | RCSR_WDR | RCSR_SMR; | 72 | RCSR = RCSR_HWR | RCSR_SWR | RCSR_WDR | RCSR_SMR; |
74 | 73 | ||
75 | /* set resume return address */ | 74 | /* set resume return address */ |
76 | PSPR = virt_to_phys(sa1100_cpu_resume); | 75 | PSPR = virt_to_phys(cpu_resume); |
77 | 76 | ||
78 | /* go zzz */ | 77 | /* go zzz */ |
79 | sa1100_cpu_suspend(); | 78 | sa1100_cpu_suspend(PLAT_PHYS_OFFSET - PAGE_OFFSET); |
80 | 79 | ||
81 | cpu_init(); | 80 | cpu_init(); |
82 | 81 | ||
@@ -115,11 +114,6 @@ static int sa11x0_pm_enter(suspend_state_t state) | |||
115 | return 0; | 114 | return 0; |
116 | } | 115 | } |
117 | 116 | ||
118 | unsigned long sleep_phys_sp(void *sp) | ||
119 | { | ||
120 | return virt_to_phys(sp); | ||
121 | } | ||
122 | |||
123 | static const struct platform_suspend_ops sa11x0_pm_ops = { | 117 | static const struct platform_suspend_ops sa11x0_pm_ops = { |
124 | .enter = sa11x0_pm_enter, | 118 | .enter = sa11x0_pm_enter, |
125 | .valid = suspend_valid_only_mem, | 119 | .valid = suspend_valid_only_mem, |
diff --git a/arch/arm/mach-sa1100/sleep.S b/arch/arm/mach-sa1100/sleep.S index 80f31bad707c..04f2a618d4ef 100644 --- a/arch/arm/mach-sa1100/sleep.S +++ b/arch/arm/mach-sa1100/sleep.S | |||
@@ -20,12 +20,7 @@ | |||
20 | #include <asm/assembler.h> | 20 | #include <asm/assembler.h> |
21 | #include <mach/hardware.h> | 21 | #include <mach/hardware.h> |
22 | 22 | ||
23 | |||
24 | |||
25 | .text | 23 | .text |
26 | |||
27 | |||
28 | |||
29 | /* | 24 | /* |
30 | * sa1100_cpu_suspend() | 25 | * sa1100_cpu_suspend() |
31 | * | 26 | * |
@@ -34,27 +29,10 @@ | |||
34 | */ | 29 | */ |
35 | 30 | ||
36 | ENTRY(sa1100_cpu_suspend) | 31 | ENTRY(sa1100_cpu_suspend) |
37 | |||
38 | stmfd sp!, {r4 - r12, lr} @ save registers on stack | 32 | stmfd sp!, {r4 - r12, lr} @ save registers on stack |
39 | 33 | mov r1, r0 | |
40 | @ get coprocessor registers | 34 | ldr r3, =sa1100_cpu_resume @ return function |
41 | mrc p15, 0, r4, c3, c0, 0 @ domain ID | 35 | bl cpu_suspend |
42 | mrc p15, 0, r5, c2, c0, 0 @ translation table base addr | ||
43 | mrc p15, 0, r6, c13, c0, 0 @ PID | ||
44 | mrc p15, 0, r7, c1, c0, 0 @ control reg | ||
45 | |||
46 | @ store them plus current virtual stack ptr on stack | ||
47 | mov r8, sp | ||
48 | stmfd sp!, {r4 - r8} | ||
49 | |||
50 | @ preserve phys address of stack | ||
51 | mov r0, sp | ||
52 | bl sleep_phys_sp | ||
53 | ldr r1, =sleep_save_sp | ||
54 | str r0, [r1] | ||
55 | |||
56 | @ clean data cache and invalidate WB | ||
57 | bl v4wb_flush_kern_cache_all | ||
58 | 36 | ||
59 | @ disable clock switching | 37 | @ disable clock switching |
60 | mcr p15, 0, r1, c15, c2, 2 | 38 | mcr p15, 0, r1, c15, c2, 2 |
@@ -166,50 +144,8 @@ sa1110_sdram_controller_fix: | |||
166 | * cpu_sa1100_resume() | 144 | * cpu_sa1100_resume() |
167 | * | 145 | * |
168 | * entry point from bootloader into kernel during resume | 146 | * entry point from bootloader into kernel during resume |
169 | * | ||
170 | * Note: Yes, part of the following code is located into the .data section. | ||
171 | * This is to allow sleep_save_sp to be accessed with a relative load | ||
172 | * while we can't rely on any MMU translation. We could have put | ||
173 | * sleep_save_sp in the .text section as well, but some setups might | ||
174 | * insist on it to be truly read-only. | ||
175 | */ | 147 | */ |
176 | |||
177 | .data | ||
178 | .align 5 | ||
179 | ENTRY(sa1100_cpu_resume) | ||
180 | mov r0, #PSR_F_BIT | PSR_I_BIT | SVC_MODE | ||
181 | msr cpsr_c, r0 @ set SVC, irqs off | ||
182 | |||
183 | ldr r0, sleep_save_sp @ stack phys addr | ||
184 | ldr r2, =resume_after_mmu @ its absolute virtual address | ||
185 | ldmfd r0, {r4 - r7, sp} @ CP regs + virt stack ptr | ||
186 | |||
187 | mov r1, #0 | ||
188 | mcr p15, 0, r1, c8, c7, 0 @ flush I+D TLBs | ||
189 | mcr p15, 0, r1, c7, c7, 0 @ flush I&D cache | ||
190 | mcr p15, 0, r1, c9, c0, 0 @ invalidate RB | ||
191 | mcr p15, 0, r1, c9, c0, 5 @ allow user space to use RB | ||
192 | |||
193 | mcr p15, 0, r4, c3, c0, 0 @ domain ID | ||
194 | mcr p15, 0, r5, c2, c0, 0 @ translation table base addr | ||
195 | mcr p15, 0, r6, c13, c0, 0 @ PID | ||
196 | b resume_turn_on_mmu @ cache align execution | ||
197 | |||
198 | .align 5 | 148 | .align 5 |
199 | resume_turn_on_mmu: | 149 | sa1100_cpu_resume: |
200 | mcr p15, 0, r7, c1, c0, 0 @ turn on MMU, caches, etc. | ||
201 | nop | ||
202 | mov pc, r2 @ jump to virtual addr | ||
203 | nop | ||
204 | nop | ||
205 | nop | ||
206 | |||
207 | sleep_save_sp: | ||
208 | .word 0 @ preserve stack phys ptr here | ||
209 | |||
210 | .text | ||
211 | resume_after_mmu: | ||
212 | mcr p15, 0, r1, c15, c1, 2 @ enable clock switching | 150 | mcr p15, 0, r1, c15, c1, 2 @ enable clock switching |
213 | ldmfd sp!, {r4 - r12, pc} @ return to caller | 151 | ldmfd sp!, {r4 - r12, pc} @ return to caller |
214 | |||
215 | |||
diff --git a/arch/arm/mach-shark/include/mach/memory.h b/arch/arm/mach-shark/include/mach/memory.h index d9c4812f1c31..9afb17000008 100644 --- a/arch/arm/mach-shark/include/mach/memory.h +++ b/arch/arm/mach-shark/include/mach/memory.h | |||
@@ -15,7 +15,7 @@ | |||
15 | /* | 15 | /* |
16 | * Physical DRAM offset. | 16 | * Physical DRAM offset. |
17 | */ | 17 | */ |
18 | #define PHYS_OFFSET UL(0x08000000) | 18 | #define PLAT_PHYS_OFFSET UL(0x08000000) |
19 | 19 | ||
20 | #ifndef __ASSEMBLY__ | 20 | #ifndef __ASSEMBLY__ |
21 | 21 | ||
diff --git a/arch/arm/mach-shmobile/include/mach/memory.h b/arch/arm/mach-shmobile/include/mach/memory.h index 377584e57e03..ad00c3c258f4 100644 --- a/arch/arm/mach-shmobile/include/mach/memory.h +++ b/arch/arm/mach-shmobile/include/mach/memory.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef __ASM_MACH_MEMORY_H | 1 | #ifndef __ASM_MACH_MEMORY_H |
2 | #define __ASM_MACH_MEMORY_H | 2 | #define __ASM_MACH_MEMORY_H |
3 | 3 | ||
4 | #define PHYS_OFFSET UL(CONFIG_MEMORY_START) | 4 | #define PLAT_PHYS_OFFSET UL(CONFIG_MEMORY_START) |
5 | #define MEM_SIZE UL(CONFIG_MEMORY_SIZE) | 5 | #define MEM_SIZE UL(CONFIG_MEMORY_SIZE) |
6 | 6 | ||
7 | /* DMA memory at 0xf6000000 - 0xffdfffff */ | 7 | /* DMA memory at 0xf6000000 - 0xffdfffff */ |
diff --git a/arch/arm/mach-shmobile/include/mach/mmcif-ap4eb.h b/arch/arm/mach-shmobile/include/mach/mmcif-ap4eb.h new file mode 100644 index 000000000000..a8d02be8d2b6 --- /dev/null +++ b/arch/arm/mach-shmobile/include/mach/mmcif-ap4eb.h | |||
@@ -0,0 +1,29 @@ | |||
1 | #ifndef MMCIF_AP4EB_H | ||
2 | #define MMCIF_AP4EB_H | ||
3 | |||
4 | #define PORT185CR (void __iomem *)0xe60520b9 | ||
5 | #define PORT186CR (void __iomem *)0xe60520ba | ||
6 | #define PORT187CR (void __iomem *)0xe60520bb | ||
7 | #define PORT188CR (void __iomem *)0xe60520bc | ||
8 | |||
9 | #define PORTR191_160DR (void __iomem *)0xe6056014 | ||
10 | |||
11 | static inline void mmcif_init_progress(void) | ||
12 | { | ||
13 | /* Initialise LEDS1-4 | ||
14 | * registers: PORT185CR-PORT188CR (LED1-LED4 Control) | ||
15 | * value: 0x10 - enable output | ||
16 | */ | ||
17 | __raw_writeb(0x10, PORT185CR); | ||
18 | __raw_writeb(0x10, PORT186CR); | ||
19 | __raw_writeb(0x10, PORT187CR); | ||
20 | __raw_writeb(0x10, PORT188CR); | ||
21 | } | ||
22 | |||
23 | static inline void mmcif_update_progress(int n) | ||
24 | { | ||
25 | __raw_writel((__raw_readl(PORTR191_160DR) & ~(0xf << 25)) | | ||
26 | (1 << (25 + n)), PORTR191_160DR); | ||
27 | } | ||
28 | |||
29 | #endif /* MMCIF_AP4EB_H */ | ||
diff --git a/arch/arm/mach-shmobile/include/mach/mmcif-mackerel.h b/arch/arm/mach-shmobile/include/mach/mmcif-mackerel.h new file mode 100644 index 000000000000..4b4f6949a868 --- /dev/null +++ b/arch/arm/mach-shmobile/include/mach/mmcif-mackerel.h | |||
@@ -0,0 +1,39 @@ | |||
1 | #ifndef MMCIF_MACKEREL_H | ||
2 | #define MMCIF_MACKEREL_H | ||
3 | |||
4 | #define PORT0CR (void __iomem *)0xe6051000 | ||
5 | #define PORT1CR (void __iomem *)0xe6051001 | ||
6 | #define PORT2CR (void __iomem *)0xe6051002 | ||
7 | #define PORT159CR (void __iomem *)0xe605009f | ||
8 | |||
9 | #define PORTR031_000DR (void __iomem *)0xe6055000 | ||
10 | #define PORTL159_128DR (void __iomem *)0xe6054010 | ||
11 | |||
12 | static inline void mmcif_init_progress(void) | ||
13 | { | ||
14 | /* Initialise LEDS0-3 | ||
15 | * registers: PORT0CR-PORT2CR,PORT159CR (LED0-LED3 Control) | ||
16 | * value: 0x10 - enable output | ||
17 | */ | ||
18 | __raw_writeb(0x10, PORT0CR); | ||
19 | __raw_writeb(0x10, PORT1CR); | ||
20 | __raw_writeb(0x10, PORT2CR); | ||
21 | __raw_writeb(0x10, PORT159CR); | ||
22 | } | ||
23 | |||
24 | static inline void mmcif_update_progress(int n) | ||
25 | { | ||
26 | unsigned a = 0, b = 0; | ||
27 | |||
28 | if (n < 3) | ||
29 | a = 1 << n; | ||
30 | else | ||
31 | b = 1 << 31; | ||
32 | |||
33 | __raw_writel((__raw_readl(PORTR031_000DR) & ~0x7) | a, | ||
34 | PORTR031_000DR); | ||
35 | __raw_writel((__raw_readl(PORTL159_128DR) & ~(1 << 31)) | b, | ||
36 | PORTL159_128DR); | ||
37 | } | ||
38 | |||
39 | #endif /* MMCIF_MACKEREL_H */ | ||
diff --git a/arch/arm/mach-shmobile/include/mach/mmcif.h b/arch/arm/mach-shmobile/include/mach/mmcif.h new file mode 100644 index 000000000000..f4dc3279cf03 --- /dev/null +++ b/arch/arm/mach-shmobile/include/mach/mmcif.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef MMCIF_H | ||
2 | #define MMCIF_H | ||
3 | |||
4 | /************************************************** | ||
5 | * | ||
6 | * board specific settings | ||
7 | * | ||
8 | **************************************************/ | ||
9 | |||
10 | #ifdef CONFIG_MACH_AP4EVB | ||
11 | #include "mach/mmcif-ap4eb.h" | ||
12 | #elif CONFIG_MACH_MACKEREL | ||
13 | #include "mach/mmcif-mackerel.h" | ||
14 | #else | ||
15 | #error "unsupported board." | ||
16 | #endif | ||
17 | |||
18 | #endif /* MMCIF_H */ | ||
diff --git a/arch/arm/mach-spear3xx/clock.c b/arch/arm/mach-spear3xx/clock.c index 18febf92f20a..98bc7edc95a6 100644 --- a/arch/arm/mach-spear3xx/clock.c +++ b/arch/arm/mach-spear3xx/clock.c | |||
@@ -13,8 +13,8 @@ | |||
13 | 13 | ||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <mach/misc_regs.h> | ||
17 | #include <plat/clock.h> | 16 | #include <plat/clock.h> |
17 | #include <mach/misc_regs.h> | ||
18 | 18 | ||
19 | /* root clks */ | 19 | /* root clks */ |
20 | /* 32 KHz oscillator clock */ | 20 | /* 32 KHz oscillator clock */ |
@@ -39,18 +39,43 @@ static struct clk rtc_clk = { | |||
39 | }; | 39 | }; |
40 | 40 | ||
41 | /* clock derived from 24 MHz osc clk */ | 41 | /* clock derived from 24 MHz osc clk */ |
42 | /* pll masks structure */ | ||
43 | static struct pll_clk_masks pll1_masks = { | ||
44 | .mode_mask = PLL_MODE_MASK, | ||
45 | .mode_shift = PLL_MODE_SHIFT, | ||
46 | .norm_fdbk_m_mask = PLL_NORM_FDBK_M_MASK, | ||
47 | .norm_fdbk_m_shift = PLL_NORM_FDBK_M_SHIFT, | ||
48 | .dith_fdbk_m_mask = PLL_DITH_FDBK_M_MASK, | ||
49 | .dith_fdbk_m_shift = PLL_DITH_FDBK_M_SHIFT, | ||
50 | .div_p_mask = PLL_DIV_P_MASK, | ||
51 | .div_p_shift = PLL_DIV_P_SHIFT, | ||
52 | .div_n_mask = PLL_DIV_N_MASK, | ||
53 | .div_n_shift = PLL_DIV_N_SHIFT, | ||
54 | }; | ||
55 | |||
42 | /* pll1 configuration structure */ | 56 | /* pll1 configuration structure */ |
43 | static struct pll_clk_config pll1_config = { | 57 | static struct pll_clk_config pll1_config = { |
44 | .mode_reg = PLL1_CTR, | 58 | .mode_reg = PLL1_CTR, |
45 | .cfg_reg = PLL1_FRQ, | 59 | .cfg_reg = PLL1_FRQ, |
60 | .masks = &pll1_masks, | ||
61 | }; | ||
62 | |||
63 | /* pll rate configuration table, in ascending order of rates */ | ||
64 | struct pll_rate_tbl pll_rtbl[] = { | ||
65 | {.mode = 0, .m = 0x85, .n = 0x0C, .p = 0x1}, /* 266 MHz */ | ||
66 | {.mode = 0, .m = 0xA6, .n = 0x0C, .p = 0x1}, /* 332 MHz */ | ||
46 | }; | 67 | }; |
47 | 68 | ||
48 | /* PLL1 clock */ | 69 | /* PLL1 clock */ |
49 | static struct clk pll1_clk = { | 70 | static struct clk pll1_clk = { |
71 | .flags = ENABLED_ON_INIT, | ||
50 | .pclk = &osc_24m_clk, | 72 | .pclk = &osc_24m_clk, |
51 | .en_reg = PLL1_CTR, | 73 | .en_reg = PLL1_CTR, |
52 | .en_reg_bit = PLL_ENABLE, | 74 | .en_reg_bit = PLL_ENABLE, |
53 | .recalc = &pll1_clk_recalc, | 75 | .calc_rate = &pll_calc_rate, |
76 | .recalc = &pll_clk_recalc, | ||
77 | .set_rate = &pll_clk_set_rate, | ||
78 | .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1}, | ||
54 | .private_data = &pll1_config, | 79 | .private_data = &pll1_config, |
55 | }; | 80 | }; |
56 | 81 | ||
@@ -76,36 +101,83 @@ static struct clk cpu_clk = { | |||
76 | .recalc = &follow_parent, | 101 | .recalc = &follow_parent, |
77 | }; | 102 | }; |
78 | 103 | ||
104 | /* ahb masks structure */ | ||
105 | static struct bus_clk_masks ahb_masks = { | ||
106 | .mask = PLL_HCLK_RATIO_MASK, | ||
107 | .shift = PLL_HCLK_RATIO_SHIFT, | ||
108 | }; | ||
109 | |||
79 | /* ahb configuration structure */ | 110 | /* ahb configuration structure */ |
80 | static struct bus_clk_config ahb_config = { | 111 | static struct bus_clk_config ahb_config = { |
81 | .reg = CORE_CLK_CFG, | 112 | .reg = CORE_CLK_CFG, |
82 | .mask = PLL_HCLK_RATIO_MASK, | 113 | .masks = &ahb_masks, |
83 | .shift = PLL_HCLK_RATIO_SHIFT, | 114 | }; |
115 | |||
116 | /* ahb rate configuration table, in ascending order of rates */ | ||
117 | struct bus_rate_tbl bus_rtbl[] = { | ||
118 | {.div = 3}, /* == parent divided by 4 */ | ||
119 | {.div = 2}, /* == parent divided by 3 */ | ||
120 | {.div = 1}, /* == parent divided by 2 */ | ||
121 | {.div = 0}, /* == parent divided by 1 */ | ||
84 | }; | 122 | }; |
85 | 123 | ||
86 | /* ahb clock */ | 124 | /* ahb clock */ |
87 | static struct clk ahb_clk = { | 125 | static struct clk ahb_clk = { |
88 | .flags = ALWAYS_ENABLED, | 126 | .flags = ALWAYS_ENABLED, |
89 | .pclk = &pll1_clk, | 127 | .pclk = &pll1_clk, |
128 | .calc_rate = &bus_calc_rate, | ||
90 | .recalc = &bus_clk_recalc, | 129 | .recalc = &bus_clk_recalc, |
130 | .set_rate = &bus_clk_set_rate, | ||
131 | .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2}, | ||
91 | .private_data = &ahb_config, | 132 | .private_data = &ahb_config, |
92 | }; | 133 | }; |
93 | 134 | ||
94 | /* uart configurations */ | 135 | /* auxiliary synthesizers masks */ |
95 | static struct aux_clk_config uart_config = { | 136 | static struct aux_clk_masks aux_masks = { |
137 | .eq_sel_mask = AUX_EQ_SEL_MASK, | ||
138 | .eq_sel_shift = AUX_EQ_SEL_SHIFT, | ||
139 | .eq1_mask = AUX_EQ1_SEL, | ||
140 | .eq2_mask = AUX_EQ2_SEL, | ||
141 | .xscale_sel_mask = AUX_XSCALE_MASK, | ||
142 | .xscale_sel_shift = AUX_XSCALE_SHIFT, | ||
143 | .yscale_sel_mask = AUX_YSCALE_MASK, | ||
144 | .yscale_sel_shift = AUX_YSCALE_SHIFT, | ||
145 | }; | ||
146 | |||
147 | /* uart synth configurations */ | ||
148 | static struct aux_clk_config uart_synth_config = { | ||
96 | .synth_reg = UART_CLK_SYNT, | 149 | .synth_reg = UART_CLK_SYNT, |
150 | .masks = &aux_masks, | ||
151 | }; | ||
152 | |||
153 | /* aux rate configuration table, in ascending order of rates */ | ||
154 | struct aux_rate_tbl aux_rtbl[] = { | ||
155 | /* For PLL1 = 332 MHz */ | ||
156 | {.xscale = 1, .yscale = 8, .eq = 1}, /* 41.5 MHz */ | ||
157 | {.xscale = 1, .yscale = 4, .eq = 1}, /* 83 MHz */ | ||
158 | {.xscale = 1, .yscale = 2, .eq = 1}, /* 166 MHz */ | ||
159 | }; | ||
160 | |||
161 | /* uart synth clock */ | ||
162 | static struct clk uart_synth_clk = { | ||
163 | .en_reg = UART_CLK_SYNT, | ||
164 | .en_reg_bit = AUX_SYNT_ENB, | ||
165 | .pclk = &pll1_clk, | ||
166 | .calc_rate = &aux_calc_rate, | ||
167 | .recalc = &aux_clk_recalc, | ||
168 | .set_rate = &aux_clk_set_rate, | ||
169 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 1}, | ||
170 | .private_data = &uart_synth_config, | ||
97 | }; | 171 | }; |
98 | 172 | ||
99 | /* uart parents */ | 173 | /* uart parents */ |
100 | static struct pclk_info uart_pclk_info[] = { | 174 | static struct pclk_info uart_pclk_info[] = { |
101 | { | 175 | { |
102 | .pclk = &pll1_clk, | 176 | .pclk = &uart_synth_clk, |
103 | .pclk_mask = AUX_CLK_PLL1_MASK, | 177 | .pclk_val = AUX_CLK_PLL1_VAL, |
104 | .scalable = 1, | ||
105 | }, { | 178 | }, { |
106 | .pclk = &pll3_48m_clk, | 179 | .pclk = &pll3_48m_clk, |
107 | .pclk_mask = AUX_CLK_PLL3_MASK, | 180 | .pclk_val = AUX_CLK_PLL3_VAL, |
108 | .scalable = 0, | ||
109 | }, | 181 | }, |
110 | }; | 182 | }; |
111 | 183 | ||
@@ -123,25 +195,35 @@ static struct clk uart_clk = { | |||
123 | .en_reg_bit = UART_CLK_ENB, | 195 | .en_reg_bit = UART_CLK_ENB, |
124 | .pclk_sel = &uart_pclk_sel, | 196 | .pclk_sel = &uart_pclk_sel, |
125 | .pclk_sel_shift = UART_CLK_SHIFT, | 197 | .pclk_sel_shift = UART_CLK_SHIFT, |
126 | .recalc = &aux_clk_recalc, | 198 | .recalc = &follow_parent, |
127 | .private_data = &uart_config, | ||
128 | }; | 199 | }; |
129 | 200 | ||
130 | /* firda configurations */ | 201 | /* firda configurations */ |
131 | static struct aux_clk_config firda_config = { | 202 | static struct aux_clk_config firda_synth_config = { |
132 | .synth_reg = FIRDA_CLK_SYNT, | 203 | .synth_reg = FIRDA_CLK_SYNT, |
204 | .masks = &aux_masks, | ||
205 | }; | ||
206 | |||
207 | /* firda synth clock */ | ||
208 | static struct clk firda_synth_clk = { | ||
209 | .en_reg = FIRDA_CLK_SYNT, | ||
210 | .en_reg_bit = AUX_SYNT_ENB, | ||
211 | .pclk = &pll1_clk, | ||
212 | .calc_rate = &aux_calc_rate, | ||
213 | .recalc = &aux_clk_recalc, | ||
214 | .set_rate = &aux_clk_set_rate, | ||
215 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 1}, | ||
216 | .private_data = &firda_synth_config, | ||
133 | }; | 217 | }; |
134 | 218 | ||
135 | /* firda parents */ | 219 | /* firda parents */ |
136 | static struct pclk_info firda_pclk_info[] = { | 220 | static struct pclk_info firda_pclk_info[] = { |
137 | { | 221 | { |
138 | .pclk = &pll1_clk, | 222 | .pclk = &firda_synth_clk, |
139 | .pclk_mask = AUX_CLK_PLL1_MASK, | 223 | .pclk_val = AUX_CLK_PLL1_VAL, |
140 | .scalable = 1, | ||
141 | }, { | 224 | }, { |
142 | .pclk = &pll3_48m_clk, | 225 | .pclk = &pll3_48m_clk, |
143 | .pclk_mask = AUX_CLK_PLL3_MASK, | 226 | .pclk_val = AUX_CLK_PLL3_VAL, |
144 | .scalable = 0, | ||
145 | }, | 227 | }, |
146 | }; | 228 | }; |
147 | 229 | ||
@@ -159,73 +241,155 @@ static struct clk firda_clk = { | |||
159 | .en_reg_bit = FIRDA_CLK_ENB, | 241 | .en_reg_bit = FIRDA_CLK_ENB, |
160 | .pclk_sel = &firda_pclk_sel, | 242 | .pclk_sel = &firda_pclk_sel, |
161 | .pclk_sel_shift = FIRDA_CLK_SHIFT, | 243 | .pclk_sel_shift = FIRDA_CLK_SHIFT, |
162 | .recalc = &aux_clk_recalc, | 244 | .recalc = &follow_parent, |
163 | .private_data = &firda_config, | 245 | }; |
246 | |||
247 | /* gpt synthesizer masks */ | ||
248 | static struct gpt_clk_masks gpt_masks = { | ||
249 | .mscale_sel_mask = GPT_MSCALE_MASK, | ||
250 | .mscale_sel_shift = GPT_MSCALE_SHIFT, | ||
251 | .nscale_sel_mask = GPT_NSCALE_MASK, | ||
252 | .nscale_sel_shift = GPT_NSCALE_SHIFT, | ||
253 | }; | ||
254 | |||
255 | /* gpt rate configuration table, in ascending order of rates */ | ||
256 | struct gpt_rate_tbl gpt_rtbl[] = { | ||
257 | /* For pll1 = 332 MHz */ | ||
258 | {.mscale = 4, .nscale = 0}, /* 41.5 MHz */ | ||
259 | {.mscale = 2, .nscale = 0}, /* 55.3 MHz */ | ||
260 | {.mscale = 1, .nscale = 0}, /* 83 MHz */ | ||
261 | }; | ||
262 | |||
263 | /* gpt0 synth clk config*/ | ||
264 | static struct gpt_clk_config gpt0_synth_config = { | ||
265 | .synth_reg = PRSC1_CLK_CFG, | ||
266 | .masks = &gpt_masks, | ||
267 | }; | ||
268 | |||
269 | /* gpt synth clock */ | ||
270 | static struct clk gpt0_synth_clk = { | ||
271 | .flags = ALWAYS_ENABLED, | ||
272 | .pclk = &pll1_clk, | ||
273 | .calc_rate = &gpt_calc_rate, | ||
274 | .recalc = &gpt_clk_recalc, | ||
275 | .set_rate = &gpt_clk_set_rate, | ||
276 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
277 | .private_data = &gpt0_synth_config, | ||
164 | }; | 278 | }; |
165 | 279 | ||
166 | /* gpt parents */ | 280 | /* gpt parents */ |
167 | static struct pclk_info gpt_pclk_info[] = { | 281 | static struct pclk_info gpt0_pclk_info[] = { |
168 | { | 282 | { |
169 | .pclk = &pll1_clk, | 283 | .pclk = &gpt0_synth_clk, |
170 | .pclk_mask = AUX_CLK_PLL1_MASK, | 284 | .pclk_val = AUX_CLK_PLL1_VAL, |
171 | .scalable = 1, | ||
172 | }, { | 285 | }, { |
173 | .pclk = &pll3_48m_clk, | 286 | .pclk = &pll3_48m_clk, |
174 | .pclk_mask = AUX_CLK_PLL3_MASK, | 287 | .pclk_val = AUX_CLK_PLL3_VAL, |
175 | .scalable = 0, | ||
176 | }, | 288 | }, |
177 | }; | 289 | }; |
178 | 290 | ||
179 | /* gpt parent select structure */ | 291 | /* gpt parent select structure */ |
180 | static struct pclk_sel gpt_pclk_sel = { | 292 | static struct pclk_sel gpt0_pclk_sel = { |
181 | .pclk_info = gpt_pclk_info, | 293 | .pclk_info = gpt0_pclk_info, |
182 | .pclk_count = ARRAY_SIZE(gpt_pclk_info), | 294 | .pclk_count = ARRAY_SIZE(gpt0_pclk_info), |
183 | .pclk_sel_reg = PERIP_CLK_CFG, | 295 | .pclk_sel_reg = PERIP_CLK_CFG, |
184 | .pclk_sel_mask = GPT_CLK_MASK, | 296 | .pclk_sel_mask = GPT_CLK_MASK, |
185 | }; | 297 | }; |
186 | 298 | ||
187 | /* gpt0 configurations */ | ||
188 | static struct aux_clk_config gpt0_config = { | ||
189 | .synth_reg = PRSC1_CLK_CFG, | ||
190 | }; | ||
191 | |||
192 | /* gpt0 timer clock */ | 299 | /* gpt0 timer clock */ |
193 | static struct clk gpt0_clk = { | 300 | static struct clk gpt0_clk = { |
194 | .flags = ALWAYS_ENABLED, | 301 | .flags = ALWAYS_ENABLED, |
195 | .pclk_sel = &gpt_pclk_sel, | 302 | .pclk_sel = &gpt0_pclk_sel, |
196 | .pclk_sel_shift = GPT0_CLK_SHIFT, | 303 | .pclk_sel_shift = GPT0_CLK_SHIFT, |
197 | .recalc = &gpt_clk_recalc, | 304 | .recalc = &follow_parent, |
198 | .private_data = &gpt0_config, | ||
199 | }; | 305 | }; |
200 | 306 | ||
201 | /* gpt1 configurations */ | 307 | /* gpt1 synth clk configurations */ |
202 | static struct aux_clk_config gpt1_config = { | 308 | static struct gpt_clk_config gpt1_synth_config = { |
203 | .synth_reg = PRSC2_CLK_CFG, | 309 | .synth_reg = PRSC2_CLK_CFG, |
310 | .masks = &gpt_masks, | ||
311 | }; | ||
312 | |||
313 | /* gpt1 synth clock */ | ||
314 | static struct clk gpt1_synth_clk = { | ||
315 | .flags = ALWAYS_ENABLED, | ||
316 | .pclk = &pll1_clk, | ||
317 | .calc_rate = &gpt_calc_rate, | ||
318 | .recalc = &gpt_clk_recalc, | ||
319 | .set_rate = &gpt_clk_set_rate, | ||
320 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
321 | .private_data = &gpt1_synth_config, | ||
322 | }; | ||
323 | |||
324 | static struct pclk_info gpt1_pclk_info[] = { | ||
325 | { | ||
326 | .pclk = &gpt1_synth_clk, | ||
327 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
328 | }, { | ||
329 | .pclk = &pll3_48m_clk, | ||
330 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
331 | }, | ||
332 | }; | ||
333 | |||
334 | /* gpt parent select structure */ | ||
335 | static struct pclk_sel gpt1_pclk_sel = { | ||
336 | .pclk_info = gpt1_pclk_info, | ||
337 | .pclk_count = ARRAY_SIZE(gpt1_pclk_info), | ||
338 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
339 | .pclk_sel_mask = GPT_CLK_MASK, | ||
204 | }; | 340 | }; |
205 | 341 | ||
206 | /* gpt1 timer clock */ | 342 | /* gpt1 timer clock */ |
207 | static struct clk gpt1_clk = { | 343 | static struct clk gpt1_clk = { |
208 | .en_reg = PERIP1_CLK_ENB, | 344 | .en_reg = PERIP1_CLK_ENB, |
209 | .en_reg_bit = GPT1_CLK_ENB, | 345 | .en_reg_bit = GPT1_CLK_ENB, |
210 | .pclk_sel = &gpt_pclk_sel, | 346 | .pclk_sel = &gpt1_pclk_sel, |
211 | .pclk_sel_shift = GPT1_CLK_SHIFT, | 347 | .pclk_sel_shift = GPT1_CLK_SHIFT, |
212 | .recalc = &gpt_clk_recalc, | 348 | .recalc = &follow_parent, |
213 | .private_data = &gpt1_config, | ||
214 | }; | 349 | }; |
215 | 350 | ||
216 | /* gpt2 configurations */ | 351 | /* gpt2 synth clk configurations */ |
217 | static struct aux_clk_config gpt2_config = { | 352 | static struct gpt_clk_config gpt2_synth_config = { |
218 | .synth_reg = PRSC3_CLK_CFG, | 353 | .synth_reg = PRSC3_CLK_CFG, |
354 | .masks = &gpt_masks, | ||
355 | }; | ||
356 | |||
357 | /* gpt1 synth clock */ | ||
358 | static struct clk gpt2_synth_clk = { | ||
359 | .flags = ALWAYS_ENABLED, | ||
360 | .pclk = &pll1_clk, | ||
361 | .calc_rate = &gpt_calc_rate, | ||
362 | .recalc = &gpt_clk_recalc, | ||
363 | .set_rate = &gpt_clk_set_rate, | ||
364 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
365 | .private_data = &gpt2_synth_config, | ||
366 | }; | ||
367 | |||
368 | static struct pclk_info gpt2_pclk_info[] = { | ||
369 | { | ||
370 | .pclk = &gpt2_synth_clk, | ||
371 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
372 | }, { | ||
373 | .pclk = &pll3_48m_clk, | ||
374 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
375 | }, | ||
376 | }; | ||
377 | |||
378 | /* gpt parent select structure */ | ||
379 | static struct pclk_sel gpt2_pclk_sel = { | ||
380 | .pclk_info = gpt2_pclk_info, | ||
381 | .pclk_count = ARRAY_SIZE(gpt2_pclk_info), | ||
382 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
383 | .pclk_sel_mask = GPT_CLK_MASK, | ||
219 | }; | 384 | }; |
220 | 385 | ||
221 | /* gpt2 timer clock */ | 386 | /* gpt2 timer clock */ |
222 | static struct clk gpt2_clk = { | 387 | static struct clk gpt2_clk = { |
223 | .en_reg = PERIP1_CLK_ENB, | 388 | .en_reg = PERIP1_CLK_ENB, |
224 | .en_reg_bit = GPT2_CLK_ENB, | 389 | .en_reg_bit = GPT2_CLK_ENB, |
225 | .pclk_sel = &gpt_pclk_sel, | 390 | .pclk_sel = &gpt2_pclk_sel, |
226 | .pclk_sel_shift = GPT2_CLK_SHIFT, | 391 | .pclk_sel_shift = GPT2_CLK_SHIFT, |
227 | .recalc = &gpt_clk_recalc, | 392 | .recalc = &follow_parent, |
228 | .private_data = &gpt2_config, | ||
229 | }; | 393 | }; |
230 | 394 | ||
231 | /* clock derived from pll3 clk */ | 395 | /* clock derived from pll3 clk */ |
@@ -245,26 +409,27 @@ static struct clk usbd_clk = { | |||
245 | .recalc = &follow_parent, | 409 | .recalc = &follow_parent, |
246 | }; | 410 | }; |
247 | 411 | ||
248 | /* clcd clock */ | 412 | /* clock derived from ahb clk */ |
249 | static struct clk clcd_clk = { | 413 | /* apb masks structure */ |
250 | .flags = ALWAYS_ENABLED, | 414 | static struct bus_clk_masks apb_masks = { |
251 | .pclk = &pll3_48m_clk, | 415 | .mask = HCLK_PCLK_RATIO_MASK, |
252 | .recalc = &follow_parent, | 416 | .shift = HCLK_PCLK_RATIO_SHIFT, |
253 | }; | 417 | }; |
254 | 418 | ||
255 | /* clock derived from ahb clk */ | ||
256 | /* apb configuration structure */ | 419 | /* apb configuration structure */ |
257 | static struct bus_clk_config apb_config = { | 420 | static struct bus_clk_config apb_config = { |
258 | .reg = CORE_CLK_CFG, | 421 | .reg = CORE_CLK_CFG, |
259 | .mask = HCLK_PCLK_RATIO_MASK, | 422 | .masks = &apb_masks, |
260 | .shift = HCLK_PCLK_RATIO_SHIFT, | ||
261 | }; | 423 | }; |
262 | 424 | ||
263 | /* apb clock */ | 425 | /* apb clock */ |
264 | static struct clk apb_clk = { | 426 | static struct clk apb_clk = { |
265 | .flags = ALWAYS_ENABLED, | 427 | .flags = ALWAYS_ENABLED, |
266 | .pclk = &ahb_clk, | 428 | .pclk = &ahb_clk, |
429 | .calc_rate = &bus_calc_rate, | ||
267 | .recalc = &bus_clk_recalc, | 430 | .recalc = &bus_clk_recalc, |
431 | .set_rate = &bus_clk_set_rate, | ||
432 | .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2}, | ||
268 | .private_data = &apb_config, | 433 | .private_data = &apb_config, |
269 | }; | 434 | }; |
270 | 435 | ||
@@ -325,8 +490,17 @@ static struct clk adc_clk = { | |||
325 | .recalc = &follow_parent, | 490 | .recalc = &follow_parent, |
326 | }; | 491 | }; |
327 | 492 | ||
493 | #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320) | ||
494 | /* emi clock */ | ||
495 | static struct clk emi_clk = { | ||
496 | .flags = ALWAYS_ENABLED, | ||
497 | .pclk = &ahb_clk, | ||
498 | .recalc = &follow_parent, | ||
499 | }; | ||
500 | #endif | ||
501 | |||
328 | /* ssp clock */ | 502 | /* ssp clock */ |
329 | static struct clk ssp_clk = { | 503 | static struct clk ssp0_clk = { |
330 | .pclk = &apb_clk, | 504 | .pclk = &apb_clk, |
331 | .en_reg = PERIP1_CLK_ENB, | 505 | .en_reg = PERIP1_CLK_ENB, |
332 | .en_reg_bit = SSP_CLK_ENB, | 506 | .en_reg_bit = SSP_CLK_ENB, |
@@ -343,14 +517,145 @@ static struct clk gpio_clk = { | |||
343 | 517 | ||
344 | static struct clk dummy_apb_pclk; | 518 | static struct clk dummy_apb_pclk; |
345 | 519 | ||
520 | #if defined(CONFIG_MACH_SPEAR300) || defined(CONFIG_MACH_SPEAR310) || \ | ||
521 | defined(CONFIG_MACH_SPEAR320) | ||
522 | /* fsmc clock */ | ||
523 | static struct clk fsmc_clk = { | ||
524 | .flags = ALWAYS_ENABLED, | ||
525 | .pclk = &ahb_clk, | ||
526 | .recalc = &follow_parent, | ||
527 | }; | ||
528 | #endif | ||
529 | |||
530 | /* common clocks to spear310 and spear320 */ | ||
531 | #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320) | ||
532 | /* uart1 clock */ | ||
533 | static struct clk uart1_clk = { | ||
534 | .flags = ALWAYS_ENABLED, | ||
535 | .pclk = &apb_clk, | ||
536 | .recalc = &follow_parent, | ||
537 | }; | ||
538 | |||
539 | /* uart2 clock */ | ||
540 | static struct clk uart2_clk = { | ||
541 | .flags = ALWAYS_ENABLED, | ||
542 | .pclk = &apb_clk, | ||
543 | .recalc = &follow_parent, | ||
544 | }; | ||
545 | #endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */ | ||
546 | |||
547 | /* common clocks to spear300 and spear320 */ | ||
548 | #if defined(CONFIG_MACH_SPEAR300) || defined(CONFIG_MACH_SPEAR320) | ||
549 | /* clcd clock */ | ||
550 | static struct clk clcd_clk = { | ||
551 | .flags = ALWAYS_ENABLED, | ||
552 | .pclk = &pll3_48m_clk, | ||
553 | .recalc = &follow_parent, | ||
554 | }; | ||
555 | |||
556 | /* sdhci clock */ | ||
557 | static struct clk sdhci_clk = { | ||
558 | .flags = ALWAYS_ENABLED, | ||
559 | .pclk = &ahb_clk, | ||
560 | .recalc = &follow_parent, | ||
561 | }; | ||
562 | #endif /* CONFIG_MACH_SPEAR300 || CONFIG_MACH_SPEAR320 */ | ||
563 | |||
564 | /* spear300 machine specific clock structures */ | ||
565 | #ifdef CONFIG_MACH_SPEAR300 | ||
566 | /* gpio1 clock */ | ||
567 | static struct clk gpio1_clk = { | ||
568 | .flags = ALWAYS_ENABLED, | ||
569 | .pclk = &apb_clk, | ||
570 | .recalc = &follow_parent, | ||
571 | }; | ||
572 | |||
573 | /* keyboard clock */ | ||
574 | static struct clk kbd_clk = { | ||
575 | .flags = ALWAYS_ENABLED, | ||
576 | .pclk = &apb_clk, | ||
577 | .recalc = &follow_parent, | ||
578 | }; | ||
579 | |||
580 | #endif | ||
581 | |||
582 | /* spear310 machine specific clock structures */ | ||
583 | #ifdef CONFIG_MACH_SPEAR310 | ||
584 | /* uart3 clock */ | ||
585 | static struct clk uart3_clk = { | ||
586 | .flags = ALWAYS_ENABLED, | ||
587 | .pclk = &apb_clk, | ||
588 | .recalc = &follow_parent, | ||
589 | }; | ||
590 | |||
591 | /* uart4 clock */ | ||
592 | static struct clk uart4_clk = { | ||
593 | .flags = ALWAYS_ENABLED, | ||
594 | .pclk = &apb_clk, | ||
595 | .recalc = &follow_parent, | ||
596 | }; | ||
597 | |||
598 | /* uart5 clock */ | ||
599 | static struct clk uart5_clk = { | ||
600 | .flags = ALWAYS_ENABLED, | ||
601 | .pclk = &apb_clk, | ||
602 | .recalc = &follow_parent, | ||
603 | }; | ||
604 | #endif | ||
605 | |||
606 | /* spear320 machine specific clock structures */ | ||
607 | #ifdef CONFIG_MACH_SPEAR320 | ||
608 | /* can0 clock */ | ||
609 | static struct clk can0_clk = { | ||
610 | .flags = ALWAYS_ENABLED, | ||
611 | .pclk = &apb_clk, | ||
612 | .recalc = &follow_parent, | ||
613 | }; | ||
614 | |||
615 | /* can1 clock */ | ||
616 | static struct clk can1_clk = { | ||
617 | .flags = ALWAYS_ENABLED, | ||
618 | .pclk = &apb_clk, | ||
619 | .recalc = &follow_parent, | ||
620 | }; | ||
621 | |||
622 | /* i2c1 clock */ | ||
623 | static struct clk i2c1_clk = { | ||
624 | .flags = ALWAYS_ENABLED, | ||
625 | .pclk = &ahb_clk, | ||
626 | .recalc = &follow_parent, | ||
627 | }; | ||
628 | |||
629 | /* ssp1 clock */ | ||
630 | static struct clk ssp1_clk = { | ||
631 | .flags = ALWAYS_ENABLED, | ||
632 | .pclk = &apb_clk, | ||
633 | .recalc = &follow_parent, | ||
634 | }; | ||
635 | |||
636 | /* ssp2 clock */ | ||
637 | static struct clk ssp2_clk = { | ||
638 | .flags = ALWAYS_ENABLED, | ||
639 | .pclk = &apb_clk, | ||
640 | .recalc = &follow_parent, | ||
641 | }; | ||
642 | |||
643 | /* pwm clock */ | ||
644 | static struct clk pwm_clk = { | ||
645 | .flags = ALWAYS_ENABLED, | ||
646 | .pclk = &apb_clk, | ||
647 | .recalc = &follow_parent, | ||
648 | }; | ||
649 | #endif | ||
650 | |||
346 | /* array of all spear 3xx clock lookups */ | 651 | /* array of all spear 3xx clock lookups */ |
347 | static struct clk_lookup spear_clk_lookups[] = { | 652 | static struct clk_lookup spear_clk_lookups[] = { |
348 | { .con_id = "apb_pclk", .clk = &dummy_apb_pclk}, | 653 | { .con_id = "apb_pclk", .clk = &dummy_apb_pclk}, |
349 | /* root clks */ | 654 | /* root clks */ |
350 | { .con_id = "osc_32k_clk", .clk = &osc_32k_clk}, | 655 | { .con_id = "osc_32k_clk", .clk = &osc_32k_clk}, |
351 | { .con_id = "osc_24m_clk", .clk = &osc_24m_clk}, | 656 | { .con_id = "osc_24m_clk", .clk = &osc_24m_clk}, |
352 | /* clock derived from 32 KHz osc clk */ | 657 | /* clock derived from 32 KHz osc clk */ |
353 | { .dev_id = "rtc", .clk = &rtc_clk}, | 658 | { .dev_id = "rtc-spear", .clk = &rtc_clk}, |
354 | /* clock derived from 24 MHz osc clk */ | 659 | /* clock derived from 24 MHz osc clk */ |
355 | { .con_id = "pll1_clk", .clk = &pll1_clk}, | 660 | { .con_id = "pll1_clk", .clk = &pll1_clk}, |
356 | { .con_id = "pll3_48m_clk", .clk = &pll3_48m_clk}, | 661 | { .con_id = "pll3_48m_clk", .clk = &pll3_48m_clk}, |
@@ -358,18 +663,22 @@ static struct clk_lookup spear_clk_lookups[] = { | |||
358 | /* clock derived from pll1 clk */ | 663 | /* clock derived from pll1 clk */ |
359 | { .con_id = "cpu_clk", .clk = &cpu_clk}, | 664 | { .con_id = "cpu_clk", .clk = &cpu_clk}, |
360 | { .con_id = "ahb_clk", .clk = &ahb_clk}, | 665 | { .con_id = "ahb_clk", .clk = &ahb_clk}, |
666 | { .con_id = "uart_synth_clk", .clk = &uart_synth_clk}, | ||
667 | { .con_id = "firda_synth_clk", .clk = &firda_synth_clk}, | ||
668 | { .con_id = "gpt0_synth_clk", .clk = &gpt0_synth_clk}, | ||
669 | { .con_id = "gpt1_synth_clk", .clk = &gpt1_synth_clk}, | ||
670 | { .con_id = "gpt2_synth_clk", .clk = &gpt2_synth_clk}, | ||
361 | { .dev_id = "uart", .clk = &uart_clk}, | 671 | { .dev_id = "uart", .clk = &uart_clk}, |
362 | { .dev_id = "firda", .clk = &firda_clk}, | 672 | { .dev_id = "firda", .clk = &firda_clk}, |
363 | { .dev_id = "gpt0", .clk = &gpt0_clk}, | 673 | { .dev_id = "gpt0", .clk = &gpt0_clk}, |
364 | { .dev_id = "gpt1", .clk = &gpt1_clk}, | 674 | { .dev_id = "gpt1", .clk = &gpt1_clk}, |
365 | { .dev_id = "gpt2", .clk = &gpt2_clk}, | 675 | { .dev_id = "gpt2", .clk = &gpt2_clk}, |
366 | /* clock derived from pll3 clk */ | 676 | /* clock derived from pll3 clk */ |
367 | { .dev_id = "usbh", .clk = &usbh_clk}, | 677 | { .dev_id = "designware_udc", .clk = &usbd_clk}, |
368 | { .dev_id = "usbd", .clk = &usbd_clk}, | 678 | { .con_id = "usbh_clk", .clk = &usbh_clk}, |
369 | { .dev_id = "clcd", .clk = &clcd_clk}, | ||
370 | /* clock derived from ahb clk */ | 679 | /* clock derived from ahb clk */ |
371 | { .con_id = "apb_clk", .clk = &apb_clk}, | 680 | { .con_id = "apb_clk", .clk = &apb_clk}, |
372 | { .dev_id = "i2c", .clk = &i2c_clk}, | 681 | { .dev_id = "i2c_designware.0", .clk = &i2c_clk}, |
373 | { .dev_id = "dma", .clk = &dma_clk}, | 682 | { .dev_id = "dma", .clk = &dma_clk}, |
374 | { .dev_id = "jpeg", .clk = &jpeg_clk}, | 683 | { .dev_id = "jpeg", .clk = &jpeg_clk}, |
375 | { .dev_id = "gmac", .clk = &gmac_clk}, | 684 | { .dev_id = "gmac", .clk = &gmac_clk}, |
@@ -377,8 +686,50 @@ static struct clk_lookup spear_clk_lookups[] = { | |||
377 | { .dev_id = "c3", .clk = &c3_clk}, | 686 | { .dev_id = "c3", .clk = &c3_clk}, |
378 | /* clock derived from apb clk */ | 687 | /* clock derived from apb clk */ |
379 | { .dev_id = "adc", .clk = &adc_clk}, | 688 | { .dev_id = "adc", .clk = &adc_clk}, |
380 | { .dev_id = "ssp", .clk = &ssp_clk}, | 689 | { .dev_id = "ssp-pl022.0", .clk = &ssp0_clk}, |
381 | { .dev_id = "gpio", .clk = &gpio_clk}, | 690 | { .dev_id = "gpio", .clk = &gpio_clk}, |
691 | #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320) | ||
692 | { .dev_id = "physmap-flash", .clk = &emi_clk}, | ||
693 | #endif | ||
694 | #if defined(CONFIG_MACH_SPEAR300) || defined(CONFIG_MACH_SPEAR310) || \ | ||
695 | defined(CONFIG_MACH_SPEAR320) | ||
696 | { .con_id = "fsmc", .clk = &fsmc_clk}, | ||
697 | #endif | ||
698 | |||
699 | /* common clocks to spear310 and spear320 */ | ||
700 | #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320) | ||
701 | { .dev_id = "uart1", .clk = &uart1_clk}, | ||
702 | { .dev_id = "uart2", .clk = &uart2_clk}, | ||
703 | #endif | ||
704 | |||
705 | /* common clock to spear300 and spear320 */ | ||
706 | #if defined(CONFIG_MACH_SPEAR300) || defined(CONFIG_MACH_SPEAR320) | ||
707 | { .dev_id = "clcd", .clk = &clcd_clk}, | ||
708 | { .dev_id = "sdhci", .clk = &sdhci_clk}, | ||
709 | #endif /* CONFIG_MACH_SPEAR300 || CONFIG_MACH_SPEAR320 */ | ||
710 | |||
711 | /* spear300 machine specific clock structures */ | ||
712 | #ifdef CONFIG_MACH_SPEAR300 | ||
713 | { .dev_id = "gpio1", .clk = &gpio1_clk}, | ||
714 | { .dev_id = "keyboard", .clk = &kbd_clk}, | ||
715 | #endif | ||
716 | |||
717 | /* spear310 machine specific clock structures */ | ||
718 | #ifdef CONFIG_MACH_SPEAR310 | ||
719 | { .dev_id = "uart3", .clk = &uart3_clk}, | ||
720 | { .dev_id = "uart4", .clk = &uart4_clk}, | ||
721 | { .dev_id = "uart5", .clk = &uart5_clk}, | ||
722 | |||
723 | #endif | ||
724 | /* spear320 machine specific clock structures */ | ||
725 | #ifdef CONFIG_MACH_SPEAR320 | ||
726 | { .dev_id = "c_can_platform.0", .clk = &can0_clk}, | ||
727 | { .dev_id = "c_can_platform.1", .clk = &can1_clk}, | ||
728 | { .dev_id = "i2c_designware.1", .clk = &i2c1_clk}, | ||
729 | { .dev_id = "ssp-pl022.1", .clk = &ssp1_clk}, | ||
730 | { .dev_id = "ssp-pl022.2", .clk = &ssp2_clk}, | ||
731 | { .dev_id = "pwm", .clk = &pwm_clk}, | ||
732 | #endif | ||
382 | }; | 733 | }; |
383 | 734 | ||
384 | void __init clk_init(void) | 735 | void __init clk_init(void) |
diff --git a/arch/arm/mach-spear3xx/include/mach/entry-macro.S b/arch/arm/mach-spear3xx/include/mach/entry-macro.S index 947625d6b48d..53da4224ba3d 100644 --- a/arch/arm/mach-spear3xx/include/mach/entry-macro.S +++ b/arch/arm/mach-spear3xx/include/mach/entry-macro.S | |||
@@ -11,9 +11,8 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <mach/hardware.h> | ||
15 | #include <mach/spear.h> | ||
16 | #include <asm/hardware/vic.h> | 14 | #include <asm/hardware/vic.h> |
15 | #include <mach/hardware.h> | ||
17 | 16 | ||
18 | .macro disable_fiq | 17 | .macro disable_fiq |
19 | .endm | 18 | .endm |
diff --git a/arch/arm/mach-spear3xx/include/mach/generic.h b/arch/arm/mach-spear3xx/include/mach/generic.h index af7e02c909a3..8e30636909ef 100644 --- a/arch/arm/mach-spear3xx/include/mach/generic.h +++ b/arch/arm/mach-spear3xx/include/mach/generic.h | |||
@@ -14,11 +14,11 @@ | |||
14 | #ifndef __MACH_GENERIC_H | 14 | #ifndef __MACH_GENERIC_H |
15 | #define __MACH_GENERIC_H | 15 | #define __MACH_GENERIC_H |
16 | 16 | ||
17 | #include <asm/mach/time.h> | ||
18 | #include <asm/mach/map.h> | ||
19 | #include <linux/init.h> | 17 | #include <linux/init.h> |
20 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
21 | #include <linux/amba/bus.h> | 19 | #include <linux/amba/bus.h> |
20 | #include <asm/mach/time.h> | ||
21 | #include <asm/mach/map.h> | ||
22 | #include <plat/padmux.h> | 22 | #include <plat/padmux.h> |
23 | 23 | ||
24 | /* spear3xx declarations */ | 24 | /* spear3xx declarations */ |
@@ -33,14 +33,14 @@ | |||
33 | /* Add spear3xx family device structure declarations here */ | 33 | /* Add spear3xx family device structure declarations here */ |
34 | extern struct amba_device gpio_device; | 34 | extern struct amba_device gpio_device; |
35 | extern struct amba_device uart_device; | 35 | extern struct amba_device uart_device; |
36 | extern struct sys_timer spear_sys_timer; | 36 | extern struct sys_timer spear3xx_timer; |
37 | 37 | ||
38 | /* Add spear3xx family function declarations here */ | 38 | /* Add spear3xx family function declarations here */ |
39 | void __init clk_init(void); | 39 | void __init clk_init(void); |
40 | void __init spear_setup_timer(void); | ||
40 | void __init spear3xx_map_io(void); | 41 | void __init spear3xx_map_io(void); |
41 | void __init spear3xx_init_irq(void); | 42 | void __init spear3xx_init_irq(void); |
42 | void __init spear3xx_init(void); | 43 | void __init spear3xx_init(void); |
43 | void spear_pmx_init(struct pmx_driver *pmx_driver, uint base, uint size); | ||
44 | 44 | ||
45 | /* pad mux declarations */ | 45 | /* pad mux declarations */ |
46 | #define PMX_FIRDA_MASK (1 << 14) | 46 | #define PMX_FIRDA_MASK (1 << 14) |
@@ -129,12 +129,10 @@ extern struct pmx_dev pmx_telecom_camera; | |||
129 | extern struct pmx_dev pmx_telecom_dac; | 129 | extern struct pmx_dev pmx_telecom_dac; |
130 | extern struct pmx_dev pmx_telecom_i2s; | 130 | extern struct pmx_dev pmx_telecom_i2s; |
131 | extern struct pmx_dev pmx_telecom_boot_pins; | 131 | extern struct pmx_dev pmx_telecom_boot_pins; |
132 | extern struct pmx_dev pmx_telecom_sdio_4bit; | 132 | extern struct pmx_dev pmx_telecom_sdhci_4bit; |
133 | extern struct pmx_dev pmx_telecom_sdio_8bit; | 133 | extern struct pmx_dev pmx_telecom_sdhci_8bit; |
134 | extern struct pmx_dev pmx_gpio1; | 134 | extern struct pmx_dev pmx_gpio1; |
135 | 135 | ||
136 | void spear300_pmx_init(void); | ||
137 | |||
138 | /* Add spear300 machine function declarations here */ | 136 | /* Add spear300 machine function declarations here */ |
139 | void __init spear300_init(void); | 137 | void __init spear300_init(void); |
140 | 138 | ||
@@ -154,8 +152,6 @@ extern struct pmx_dev pmx_fsmc; | |||
154 | extern struct pmx_dev pmx_rs485_0_1; | 152 | extern struct pmx_dev pmx_rs485_0_1; |
155 | extern struct pmx_dev pmx_tdm0; | 153 | extern struct pmx_dev pmx_tdm0; |
156 | 154 | ||
157 | void spear310_pmx_init(void); | ||
158 | |||
159 | /* Add spear310 machine function declarations here */ | 155 | /* Add spear310 machine function declarations here */ |
160 | void __init spear310_init(void); | 156 | void __init spear310_init(void); |
161 | 157 | ||
@@ -176,14 +172,14 @@ extern struct pmx_dev pmx_clcd; | |||
176 | extern struct pmx_dev pmx_emi; | 172 | extern struct pmx_dev pmx_emi; |
177 | extern struct pmx_dev pmx_fsmc; | 173 | extern struct pmx_dev pmx_fsmc; |
178 | extern struct pmx_dev pmx_spp; | 174 | extern struct pmx_dev pmx_spp; |
179 | extern struct pmx_dev pmx_sdio; | 175 | extern struct pmx_dev pmx_sdhci; |
180 | extern struct pmx_dev pmx_i2s; | 176 | extern struct pmx_dev pmx_i2s; |
181 | extern struct pmx_dev pmx_uart1; | 177 | extern struct pmx_dev pmx_uart1; |
182 | extern struct pmx_dev pmx_uart1_modem; | 178 | extern struct pmx_dev pmx_uart1_modem; |
183 | extern struct pmx_dev pmx_uart2; | 179 | extern struct pmx_dev pmx_uart2; |
184 | extern struct pmx_dev pmx_touchscreen; | 180 | extern struct pmx_dev pmx_touchscreen; |
185 | extern struct pmx_dev pmx_can; | 181 | extern struct pmx_dev pmx_can; |
186 | extern struct pmx_dev pmx_sdio_led; | 182 | extern struct pmx_dev pmx_sdhci_led; |
187 | extern struct pmx_dev pmx_pwm0; | 183 | extern struct pmx_dev pmx_pwm0; |
188 | extern struct pmx_dev pmx_pwm1; | 184 | extern struct pmx_dev pmx_pwm1; |
189 | extern struct pmx_dev pmx_pwm2; | 185 | extern struct pmx_dev pmx_pwm2; |
@@ -195,8 +191,6 @@ extern struct pmx_dev pmx_smii0; | |||
195 | extern struct pmx_dev pmx_smii1; | 191 | extern struct pmx_dev pmx_smii1; |
196 | extern struct pmx_dev pmx_i2c1; | 192 | extern struct pmx_dev pmx_i2c1; |
197 | 193 | ||
198 | void spear320_pmx_init(void); | ||
199 | |||
200 | /* Add spear320 machine function declarations here */ | 194 | /* Add spear320 machine function declarations here */ |
201 | void __init spear320_init(void); | 195 | void __init spear320_init(void); |
202 | 196 | ||
diff --git a/arch/arm/mach-spear3xx/include/mach/hardware.h b/arch/arm/mach-spear3xx/include/mach/hardware.h index 4a86e6a3c444..4660c0d8ec0d 100644 --- a/arch/arm/mach-spear3xx/include/mach/hardware.h +++ b/arch/arm/mach-spear3xx/include/mach/hardware.h | |||
@@ -14,6 +14,9 @@ | |||
14 | #ifndef __MACH_HARDWARE_H | 14 | #ifndef __MACH_HARDWARE_H |
15 | #define __MACH_HARDWARE_H | 15 | #define __MACH_HARDWARE_H |
16 | 16 | ||
17 | #include <plat/hardware.h> | ||
18 | #include <mach/spear.h> | ||
19 | |||
17 | /* Vitual to physical translation of statically mapped space */ | 20 | /* Vitual to physical translation of statically mapped space */ |
18 | #define IO_ADDRESS(x) (x | 0xF0000000) | 21 | #define IO_ADDRESS(x) (x | 0xF0000000) |
19 | 22 | ||
diff --git a/arch/arm/mach-spear3xx/include/mach/irqs.h b/arch/arm/mach-spear3xx/include/mach/irqs.h index 7f940b818473..a1a7f481866d 100644 --- a/arch/arm/mach-spear3xx/include/mach/irqs.h +++ b/arch/arm/mach-spear3xx/include/mach/irqs.h | |||
@@ -69,7 +69,7 @@ | |||
69 | #define IRQ_CLCD IRQ_GEN_RAS_3 | 69 | #define IRQ_CLCD IRQ_GEN_RAS_3 |
70 | 70 | ||
71 | /* IRQs sharing IRQ_INTRCOMM_RAS_ARM */ | 71 | /* IRQs sharing IRQ_INTRCOMM_RAS_ARM */ |
72 | #define IRQ_SDIO IRQ_INTRCOMM_RAS_ARM | 72 | #define IRQ_SDHCI IRQ_INTRCOMM_RAS_ARM |
73 | 73 | ||
74 | /* GPIO pins virtual irqs */ | 74 | /* GPIO pins virtual irqs */ |
75 | #define SPEAR_GPIO_INT_BASE (VIRQ_START + 9) | 75 | #define SPEAR_GPIO_INT_BASE (VIRQ_START + 9) |
@@ -115,7 +115,7 @@ | |||
115 | #define VIRQ_SPP (VIRQ_START + 2) | 115 | #define VIRQ_SPP (VIRQ_START + 2) |
116 | 116 | ||
117 | /* IRQs sharing IRQ_GEN_RAS_2 */ | 117 | /* IRQs sharing IRQ_GEN_RAS_2 */ |
118 | #define IRQ_SDIO IRQ_GEN_RAS_2 | 118 | #define IRQ_SDHCI IRQ_GEN_RAS_2 |
119 | 119 | ||
120 | /* IRQs sharing IRQ_GEN_RAS_3 */ | 120 | /* IRQs sharing IRQ_GEN_RAS_3 */ |
121 | #define VIRQ_PLGPIO (VIRQ_START + 3) | 121 | #define VIRQ_PLGPIO (VIRQ_START + 3) |
diff --git a/arch/arm/mach-spear3xx/include/mach/misc_regs.h b/arch/arm/mach-spear3xx/include/mach/misc_regs.h index 38d767a1aba0..5bd8cd8d4852 100644 --- a/arch/arm/mach-spear3xx/include/mach/misc_regs.h +++ b/arch/arm/mach-spear3xx/include/mach/misc_regs.h | |||
@@ -14,16 +14,16 @@ | |||
14 | #ifndef __MACH_MISC_REGS_H | 14 | #ifndef __MACH_MISC_REGS_H |
15 | #define __MACH_MISC_REGS_H | 15 | #define __MACH_MISC_REGS_H |
16 | 16 | ||
17 | #include <mach/spear.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | #define MISC_BASE VA_SPEAR3XX_ICM3_MISC_REG_BASE | 19 | #define MISC_BASE IOMEM(VA_SPEAR3XX_ICM3_MISC_REG_BASE) |
20 | 20 | ||
21 | #define SOC_CFG_CTR ((unsigned int *)(MISC_BASE + 0x000)) | 21 | #define SOC_CFG_CTR (MISC_BASE + 0x000) |
22 | #define DIAG_CFG_CTR ((unsigned int *)(MISC_BASE + 0x004)) | 22 | #define DIAG_CFG_CTR (MISC_BASE + 0x004) |
23 | #define PLL1_CTR ((unsigned int *)(MISC_BASE + 0x008)) | 23 | #define PLL1_CTR (MISC_BASE + 0x008) |
24 | #define PLL1_FRQ ((unsigned int *)(MISC_BASE + 0x00C)) | 24 | #define PLL1_FRQ (MISC_BASE + 0x00C) |
25 | #define PLL1_MOD ((unsigned int *)(MISC_BASE + 0x010)) | 25 | #define PLL1_MOD (MISC_BASE + 0x010) |
26 | #define PLL2_CTR ((unsigned int *)(MISC_BASE + 0x014)) | 26 | #define PLL2_CTR (MISC_BASE + 0x014) |
27 | /* PLL_CTR register masks */ | 27 | /* PLL_CTR register masks */ |
28 | #define PLL_ENABLE 2 | 28 | #define PLL_ENABLE 2 |
29 | #define PLL_MODE_SHIFT 4 | 29 | #define PLL_MODE_SHIFT 4 |
@@ -33,7 +33,7 @@ | |||
33 | #define PLL_MODE_DITH_DSB 2 | 33 | #define PLL_MODE_DITH_DSB 2 |
34 | #define PLL_MODE_DITH_SSB 3 | 34 | #define PLL_MODE_DITH_SSB 3 |
35 | 35 | ||
36 | #define PLL2_FRQ ((unsigned int *)(MISC_BASE + 0x018)) | 36 | #define PLL2_FRQ (MISC_BASE + 0x018) |
37 | /* PLL FRQ register masks */ | 37 | /* PLL FRQ register masks */ |
38 | #define PLL_DIV_N_SHIFT 0 | 38 | #define PLL_DIV_N_SHIFT 0 |
39 | #define PLL_DIV_N_MASK 0xFF | 39 | #define PLL_DIV_N_MASK 0xFF |
@@ -44,16 +44,16 @@ | |||
44 | #define PLL_DITH_FDBK_M_SHIFT 16 | 44 | #define PLL_DITH_FDBK_M_SHIFT 16 |
45 | #define PLL_DITH_FDBK_M_MASK 0xFFFF | 45 | #define PLL_DITH_FDBK_M_MASK 0xFFFF |
46 | 46 | ||
47 | #define PLL2_MOD ((unsigned int *)(MISC_BASE + 0x01C)) | 47 | #define PLL2_MOD (MISC_BASE + 0x01C) |
48 | #define PLL_CLK_CFG ((unsigned int *)(MISC_BASE + 0x020)) | 48 | #define PLL_CLK_CFG (MISC_BASE + 0x020) |
49 | #define CORE_CLK_CFG ((unsigned int *)(MISC_BASE + 0x024)) | 49 | #define CORE_CLK_CFG (MISC_BASE + 0x024) |
50 | /* CORE CLK CFG register masks */ | 50 | /* CORE CLK CFG register masks */ |
51 | #define PLL_HCLK_RATIO_SHIFT 10 | 51 | #define PLL_HCLK_RATIO_SHIFT 10 |
52 | #define PLL_HCLK_RATIO_MASK 0x3 | 52 | #define PLL_HCLK_RATIO_MASK 0x3 |
53 | #define HCLK_PCLK_RATIO_SHIFT 8 | 53 | #define HCLK_PCLK_RATIO_SHIFT 8 |
54 | #define HCLK_PCLK_RATIO_MASK 0x3 | 54 | #define HCLK_PCLK_RATIO_MASK 0x3 |
55 | 55 | ||
56 | #define PERIP_CLK_CFG ((unsigned int *)(MISC_BASE + 0x028)) | 56 | #define PERIP_CLK_CFG (MISC_BASE + 0x028) |
57 | /* PERIP_CLK_CFG register masks */ | 57 | /* PERIP_CLK_CFG register masks */ |
58 | #define UART_CLK_SHIFT 4 | 58 | #define UART_CLK_SHIFT 4 |
59 | #define UART_CLK_MASK 0x1 | 59 | #define UART_CLK_MASK 0x1 |
@@ -63,10 +63,10 @@ | |||
63 | #define GPT1_CLK_SHIFT 11 | 63 | #define GPT1_CLK_SHIFT 11 |
64 | #define GPT2_CLK_SHIFT 12 | 64 | #define GPT2_CLK_SHIFT 12 |
65 | #define GPT_CLK_MASK 0x1 | 65 | #define GPT_CLK_MASK 0x1 |
66 | #define AUX_CLK_PLL3_MASK 0 | 66 | #define AUX_CLK_PLL3_VAL 0 |
67 | #define AUX_CLK_PLL1_MASK 1 | 67 | #define AUX_CLK_PLL1_VAL 1 |
68 | 68 | ||
69 | #define PERIP1_CLK_ENB ((unsigned int *)(MISC_BASE + 0x02C)) | 69 | #define PERIP1_CLK_ENB (MISC_BASE + 0x02C) |
70 | /* PERIP1_CLK_ENB register masks */ | 70 | /* PERIP1_CLK_ENB register masks */ |
71 | #define UART_CLK_ENB 3 | 71 | #define UART_CLK_ENB 3 |
72 | #define SSP_CLK_ENB 5 | 72 | #define SSP_CLK_ENB 5 |
@@ -85,34 +85,35 @@ | |||
85 | #define USBH_CLK_ENB 25 | 85 | #define USBH_CLK_ENB 25 |
86 | #define C3_CLK_ENB 31 | 86 | #define C3_CLK_ENB 31 |
87 | 87 | ||
88 | #define SOC_CORE_ID ((unsigned int *)(MISC_BASE + 0x030)) | 88 | #define SOC_CORE_ID (MISC_BASE + 0x030) |
89 | #define RAS_CLK_ENB ((unsigned int *)(MISC_BASE + 0x034)) | 89 | #define RAS_CLK_ENB (MISC_BASE + 0x034) |
90 | #define PERIP1_SOF_RST ((unsigned int *)(MISC_BASE + 0x038)) | 90 | #define PERIP1_SOF_RST (MISC_BASE + 0x038) |
91 | /* PERIP1_SOF_RST register masks */ | 91 | /* PERIP1_SOF_RST register masks */ |
92 | #define JPEG_SOF_RST 8 | 92 | #define JPEG_SOF_RST 8 |
93 | 93 | ||
94 | #define SOC_USER_ID ((unsigned int *)(MISC_BASE + 0x03C)) | 94 | #define SOC_USER_ID (MISC_BASE + 0x03C) |
95 | #define RAS_SOF_RST ((unsigned int *)(MISC_BASE + 0x040)) | 95 | #define RAS_SOF_RST (MISC_BASE + 0x040) |
96 | #define PRSC1_CLK_CFG ((unsigned int *)(MISC_BASE + 0x044)) | 96 | #define PRSC1_CLK_CFG (MISC_BASE + 0x044) |
97 | #define PRSC2_CLK_CFG ((unsigned int *)(MISC_BASE + 0x048)) | 97 | #define PRSC2_CLK_CFG (MISC_BASE + 0x048) |
98 | #define PRSC3_CLK_CFG ((unsigned int *)(MISC_BASE + 0x04C)) | 98 | #define PRSC3_CLK_CFG (MISC_BASE + 0x04C) |
99 | /* gpt synthesizer register masks */ | 99 | /* gpt synthesizer register masks */ |
100 | #define GPT_MSCALE_SHIFT 0 | 100 | #define GPT_MSCALE_SHIFT 0 |
101 | #define GPT_MSCALE_MASK 0xFFF | 101 | #define GPT_MSCALE_MASK 0xFFF |
102 | #define GPT_NSCALE_SHIFT 12 | 102 | #define GPT_NSCALE_SHIFT 12 |
103 | #define GPT_NSCALE_MASK 0xF | 103 | #define GPT_NSCALE_MASK 0xF |
104 | 104 | ||
105 | #define AMEM_CLK_CFG ((unsigned int *)(MISC_BASE + 0x050)) | 105 | #define AMEM_CLK_CFG (MISC_BASE + 0x050) |
106 | #define EXPI_CLK_CFG ((unsigned int *)(MISC_BASE + 0x054)) | 106 | #define EXPI_CLK_CFG (MISC_BASE + 0x054) |
107 | #define CLCD_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x05C)) | 107 | #define CLCD_CLK_SYNT (MISC_BASE + 0x05C) |
108 | #define FIRDA_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x060)) | 108 | #define FIRDA_CLK_SYNT (MISC_BASE + 0x060) |
109 | #define UART_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x064)) | 109 | #define UART_CLK_SYNT (MISC_BASE + 0x064) |
110 | #define GMAC_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x068)) | 110 | #define GMAC_CLK_SYNT (MISC_BASE + 0x068) |
111 | #define RAS1_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x06C)) | 111 | #define RAS1_CLK_SYNT (MISC_BASE + 0x06C) |
112 | #define RAS2_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x070)) | 112 | #define RAS2_CLK_SYNT (MISC_BASE + 0x070) |
113 | #define RAS3_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x074)) | 113 | #define RAS3_CLK_SYNT (MISC_BASE + 0x074) |
114 | #define RAS4_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x078)) | 114 | #define RAS4_CLK_SYNT (MISC_BASE + 0x078) |
115 | /* aux clk synthesiser register masks for irda to ras4 */ | 115 | /* aux clk synthesiser register masks for irda to ras4 */ |
116 | #define AUX_SYNT_ENB 31 | ||
116 | #define AUX_EQ_SEL_SHIFT 30 | 117 | #define AUX_EQ_SEL_SHIFT 30 |
117 | #define AUX_EQ_SEL_MASK 1 | 118 | #define AUX_EQ_SEL_MASK 1 |
118 | #define AUX_EQ1_SEL 0 | 119 | #define AUX_EQ1_SEL 0 |
@@ -122,42 +123,42 @@ | |||
122 | #define AUX_YSCALE_SHIFT 0 | 123 | #define AUX_YSCALE_SHIFT 0 |
123 | #define AUX_YSCALE_MASK 0xFFF | 124 | #define AUX_YSCALE_MASK 0xFFF |
124 | 125 | ||
125 | #define ICM1_ARB_CFG ((unsigned int *)(MISC_BASE + 0x07C)) | 126 | #define ICM1_ARB_CFG (MISC_BASE + 0x07C) |
126 | #define ICM2_ARB_CFG ((unsigned int *)(MISC_BASE + 0x080)) | 127 | #define ICM2_ARB_CFG (MISC_BASE + 0x080) |
127 | #define ICM3_ARB_CFG ((unsigned int *)(MISC_BASE + 0x084)) | 128 | #define ICM3_ARB_CFG (MISC_BASE + 0x084) |
128 | #define ICM4_ARB_CFG ((unsigned int *)(MISC_BASE + 0x088)) | 129 | #define ICM4_ARB_CFG (MISC_BASE + 0x088) |
129 | #define ICM5_ARB_CFG ((unsigned int *)(MISC_BASE + 0x08C)) | 130 | #define ICM5_ARB_CFG (MISC_BASE + 0x08C) |
130 | #define ICM6_ARB_CFG ((unsigned int *)(MISC_BASE + 0x090)) | 131 | #define ICM6_ARB_CFG (MISC_BASE + 0x090) |
131 | #define ICM7_ARB_CFG ((unsigned int *)(MISC_BASE + 0x094)) | 132 | #define ICM7_ARB_CFG (MISC_BASE + 0x094) |
132 | #define ICM8_ARB_CFG ((unsigned int *)(MISC_BASE + 0x098)) | 133 | #define ICM8_ARB_CFG (MISC_BASE + 0x098) |
133 | #define ICM9_ARB_CFG ((unsigned int *)(MISC_BASE + 0x09C)) | 134 | #define ICM9_ARB_CFG (MISC_BASE + 0x09C) |
134 | #define DMA_CHN_CFG ((unsigned int *)(MISC_BASE + 0x0A0)) | 135 | #define DMA_CHN_CFG (MISC_BASE + 0x0A0) |
135 | #define USB2_PHY_CFG ((unsigned int *)(MISC_BASE + 0x0A4)) | 136 | #define USB2_PHY_CFG (MISC_BASE + 0x0A4) |
136 | #define GMAC_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0A8)) | 137 | #define GMAC_CFG_CTR (MISC_BASE + 0x0A8) |
137 | #define EXPI_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0AC)) | 138 | #define EXPI_CFG_CTR (MISC_BASE + 0x0AC) |
138 | #define PRC1_LOCK_CTR ((unsigned int *)(MISC_BASE + 0x0C0)) | 139 | #define PRC1_LOCK_CTR (MISC_BASE + 0x0C0) |
139 | #define PRC2_LOCK_CTR ((unsigned int *)(MISC_BASE + 0x0C4)) | 140 | #define PRC2_LOCK_CTR (MISC_BASE + 0x0C4) |
140 | #define PRC3_LOCK_CTR ((unsigned int *)(MISC_BASE + 0x0C8)) | 141 | #define PRC3_LOCK_CTR (MISC_BASE + 0x0C8) |
141 | #define PRC4_LOCK_CTR ((unsigned int *)(MISC_BASE + 0x0CC)) | 142 | #define PRC4_LOCK_CTR (MISC_BASE + 0x0CC) |
142 | #define PRC1_IRQ_CTR ((unsigned int *)(MISC_BASE + 0x0D0)) | 143 | #define PRC1_IRQ_CTR (MISC_BASE + 0x0D0) |
143 | #define PRC2_IRQ_CTR ((unsigned int *)(MISC_BASE + 0x0D4)) | 144 | #define PRC2_IRQ_CTR (MISC_BASE + 0x0D4) |
144 | #define PRC3_IRQ_CTR ((unsigned int *)(MISC_BASE + 0x0D8)) | 145 | #define PRC3_IRQ_CTR (MISC_BASE + 0x0D8) |
145 | #define PRC4_IRQ_CTR ((unsigned int *)(MISC_BASE + 0x0DC)) | 146 | #define PRC4_IRQ_CTR (MISC_BASE + 0x0DC) |
146 | #define PWRDOWN_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0E0)) | 147 | #define PWRDOWN_CFG_CTR (MISC_BASE + 0x0E0) |
147 | #define COMPSSTL_1V8_CFG ((unsigned int *)(MISC_BASE + 0x0E4)) | 148 | #define COMPSSTL_1V8_CFG (MISC_BASE + 0x0E4) |
148 | #define COMPSSTL_2V5_CFG ((unsigned int *)(MISC_BASE + 0x0E8)) | 149 | #define COMPSSTL_2V5_CFG (MISC_BASE + 0x0E8) |
149 | #define COMPCOR_3V3_CFG ((unsigned int *)(MISC_BASE + 0x0EC)) | 150 | #define COMPCOR_3V3_CFG (MISC_BASE + 0x0EC) |
150 | #define SSTLPAD_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0F0)) | 151 | #define SSTLPAD_CFG_CTR (MISC_BASE + 0x0F0) |
151 | #define BIST1_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0F4)) | 152 | #define BIST1_CFG_CTR (MISC_BASE + 0x0F4) |
152 | #define BIST2_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0F8)) | 153 | #define BIST2_CFG_CTR (MISC_BASE + 0x0F8) |
153 | #define BIST3_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0FC)) | 154 | #define BIST3_CFG_CTR (MISC_BASE + 0x0FC) |
154 | #define BIST4_CFG_CTR ((unsigned int *)(MISC_BASE + 0x100)) | 155 | #define BIST4_CFG_CTR (MISC_BASE + 0x100) |
155 | #define BIST5_CFG_CTR ((unsigned int *)(MISC_BASE + 0x104)) | 156 | #define BIST5_CFG_CTR (MISC_BASE + 0x104) |
156 | #define BIST1_STS_RES ((unsigned int *)(MISC_BASE + 0x108)) | 157 | #define BIST1_STS_RES (MISC_BASE + 0x108) |
157 | #define BIST2_STS_RES ((unsigned int *)(MISC_BASE + 0x10C)) | 158 | #define BIST2_STS_RES (MISC_BASE + 0x10C) |
158 | #define BIST3_STS_RES ((unsigned int *)(MISC_BASE + 0x110)) | 159 | #define BIST3_STS_RES (MISC_BASE + 0x110) |
159 | #define BIST4_STS_RES ((unsigned int *)(MISC_BASE + 0x114)) | 160 | #define BIST4_STS_RES (MISC_BASE + 0x114) |
160 | #define BIST5_STS_RES ((unsigned int *)(MISC_BASE + 0x118)) | 161 | #define BIST5_STS_RES (MISC_BASE + 0x118) |
161 | #define SYSERR_CFG_CTR ((unsigned int *)(MISC_BASE + 0x11C)) | 162 | #define SYSERR_CFG_CTR (MISC_BASE + 0x11C) |
162 | 163 | ||
163 | #endif /* __MACH_MISC_REGS_H */ | 164 | #endif /* __MACH_MISC_REGS_H */ |
diff --git a/arch/arm/mach-spear3xx/include/mach/spear.h b/arch/arm/mach-spear3xx/include/mach/spear.h index dcca8568a486..63fd98356919 100644 --- a/arch/arm/mach-spear3xx/include/mach/spear.h +++ b/arch/arm/mach-spear3xx/include/mach/spear.h | |||
@@ -14,124 +14,61 @@ | |||
14 | #ifndef __MACH_SPEAR3XX_H | 14 | #ifndef __MACH_SPEAR3XX_H |
15 | #define __MACH_SPEAR3XX_H | 15 | #define __MACH_SPEAR3XX_H |
16 | 16 | ||
17 | #include <mach/hardware.h> | 17 | #include <asm/memory.h> |
18 | #include <mach/spear300.h> | 18 | #include <mach/spear300.h> |
19 | #include <mach/spear310.h> | 19 | #include <mach/spear310.h> |
20 | #include <mach/spear320.h> | 20 | #include <mach/spear320.h> |
21 | 21 | ||
22 | #define SPEAR3XX_ML_SDRAM_BASE 0x00000000 | 22 | #define SPEAR3XX_ML_SDRAM_BASE UL(0x00000000) |
23 | #define SPEAR3XX_ML_SDRAM_SIZE 0x40000000 | ||
24 | 23 | ||
25 | #define SPEAR3XX_ICM9_BASE 0xC0000000 | 24 | #define SPEAR3XX_ICM9_BASE UL(0xC0000000) |
26 | #define SPEAR3XX_ICM9_SIZE 0x10000000 | ||
27 | 25 | ||
28 | /* ICM1 - Low speed connection */ | 26 | /* ICM1 - Low speed connection */ |
29 | #define SPEAR3XX_ICM1_2_BASE 0xD0000000 | 27 | #define SPEAR3XX_ICM1_2_BASE UL(0xD0000000) |
30 | #define SPEAR3XX_ICM1_2_SIZE 0x10000000 | 28 | #define SPEAR3XX_ICM1_UART_BASE UL(0xD0000000) |
31 | |||
32 | #define SPEAR3XX_ICM1_UART_BASE 0xD0000000 | ||
33 | #define VA_SPEAR3XX_ICM1_UART_BASE IO_ADDRESS(SPEAR3XX_ICM1_UART_BASE) | 29 | #define VA_SPEAR3XX_ICM1_UART_BASE IO_ADDRESS(SPEAR3XX_ICM1_UART_BASE) |
34 | #define SPEAR3XX_ICM1_UART_SIZE 0x00080000 | 30 | #define SPEAR3XX_ICM1_ADC_BASE UL(0xD0080000) |
35 | 31 | #define SPEAR3XX_ICM1_SSP_BASE UL(0xD0100000) | |
36 | #define SPEAR3XX_ICM1_ADC_BASE 0xD0080000 | 32 | #define SPEAR3XX_ICM1_I2C_BASE UL(0xD0180000) |
37 | #define SPEAR3XX_ICM1_ADC_SIZE 0x00080000 | 33 | #define SPEAR3XX_ICM1_JPEG_BASE UL(0xD0800000) |
38 | 34 | #define SPEAR3XX_ICM1_IRDA_BASE UL(0xD1000000) | |
39 | #define SPEAR3XX_ICM1_SSP_BASE 0xD0100000 | 35 | #define SPEAR3XX_ICM1_SRAM_BASE UL(0xD2800000) |
40 | #define SPEAR3XX_ICM1_SSP_SIZE 0x00080000 | ||
41 | |||
42 | #define SPEAR3XX_ICM1_I2C_BASE 0xD0180000 | ||
43 | #define SPEAR3XX_ICM1_I2C_SIZE 0x00080000 | ||
44 | |||
45 | #define SPEAR3XX_ICM1_JPEG_BASE 0xD0800000 | ||
46 | #define SPEAR3XX_ICM1_JPEG_SIZE 0x00800000 | ||
47 | |||
48 | #define SPEAR3XX_ICM1_IRDA_BASE 0xD1000000 | ||
49 | #define SPEAR3XX_ICM1_IRDA_SIZE 0x00080000 | ||
50 | |||
51 | #define SPEAR3XX_ICM1_SRAM_BASE 0xD2800000 | ||
52 | #define SPEAR3XX_ICM1_SRAM_SIZE 0x05800000 | ||
53 | 36 | ||
54 | /* ICM2 - Application Subsystem */ | 37 | /* ICM2 - Application Subsystem */ |
55 | #define SPEAR3XX_ICM2_HWACCEL0_BASE 0xD8800000 | 38 | #define SPEAR3XX_ICM2_HWACCEL0_BASE UL(0xD8800000) |
56 | #define SPEAR3XX_ICM2_HWACCEL0_SIZE 0x00800000 | 39 | #define SPEAR3XX_ICM2_HWACCEL1_BASE UL(0xD9000000) |
57 | |||
58 | #define SPEAR3XX_ICM2_HWACCEL1_BASE 0xD9000000 | ||
59 | #define SPEAR3XX_ICM2_HWACCEL1_SIZE 0x00800000 | ||
60 | 40 | ||
61 | /* ICM4 - High Speed Connection */ | 41 | /* ICM4 - High Speed Connection */ |
62 | #define SPEAR3XX_ICM4_BASE 0xE0000000 | 42 | #define SPEAR3XX_ICM4_BASE UL(0xE0000000) |
63 | #define SPEAR3XX_ICM4_SIZE 0x08000000 | 43 | #define SPEAR3XX_ICM4_MII_BASE UL(0xE0800000) |
64 | 44 | #define SPEAR3XX_ICM4_USBD_FIFO_BASE UL(0xE1000000) | |
65 | #define SPEAR3XX_ICM4_MII_BASE 0xE0800000 | 45 | #define SPEAR3XX_ICM4_USBD_CSR_BASE UL(0xE1100000) |
66 | #define SPEAR3XX_ICM4_MII_SIZE 0x00800000 | 46 | #define SPEAR3XX_ICM4_USBD_PLDT_BASE UL(0xE1200000) |
67 | 47 | #define SPEAR3XX_ICM4_USB_EHCI0_1_BASE UL(0xE1800000) | |
68 | #define SPEAR3XX_ICM4_USBD_FIFO_BASE 0xE1000000 | 48 | #define SPEAR3XX_ICM4_USB_OHCI0_BASE UL(0xE1900000) |
69 | #define SPEAR3XX_ICM4_USBD_FIFO_SIZE 0x00100000 | 49 | #define SPEAR3XX_ICM4_USB_OHCI1_BASE UL(0xE2100000) |
70 | 50 | #define SPEAR3XX_ICM4_USB_ARB_BASE UL(0xE2800000) | |
71 | #define SPEAR3XX_ICM4_USBD_CSR_BASE 0xE1100000 | ||
72 | #define SPEAR3XX_ICM4_USBD_CSR_SIZE 0x00100000 | ||
73 | |||
74 | #define SPEAR3XX_ICM4_USBD_PLDT_BASE 0xE1200000 | ||
75 | #define SPEAR3XX_ICM4_USBD_PLDT_SIZE 0x00100000 | ||
76 | |||
77 | #define SPEAR3XX_ICM4_USB_EHCI0_1_BASE 0xE1800000 | ||
78 | #define SPEAR3XX_ICM4_USB_EHCI0_1_SIZE 0x00100000 | ||
79 | |||
80 | #define SPEAR3XX_ICM4_USB_OHCI0_BASE 0xE1900000 | ||
81 | #define SPEAR3XX_ICM4_USB_OHCI0_SIZE 0x00100000 | ||
82 | |||
83 | #define SPEAR3XX_ICM4_USB_OHCI1_BASE 0xE2100000 | ||
84 | #define SPEAR3XX_ICM4_USB_OHCI1_SIZE 0x00100000 | ||
85 | |||
86 | #define SPEAR3XX_ICM4_USB_ARB_BASE 0xE2800000 | ||
87 | #define SPEAR3XX_ICM4_USB_ARB_SIZE 0x00010000 | ||
88 | 51 | ||
89 | /* ML1 - Multi Layer CPU Subsystem */ | 52 | /* ML1 - Multi Layer CPU Subsystem */ |
90 | #define SPEAR3XX_ICM3_ML1_2_BASE 0xF0000000 | 53 | #define SPEAR3XX_ICM3_ML1_2_BASE UL(0xF0000000) |
91 | #define SPEAR3XX_ICM3_ML1_2_SIZE 0x0F000000 | 54 | #define SPEAR3XX_ML1_TMR_BASE UL(0xF0000000) |
92 | 55 | #define SPEAR3XX_ML1_VIC_BASE UL(0xF1100000) | |
93 | #define SPEAR3XX_ML1_TMR_BASE 0xF0000000 | ||
94 | #define SPEAR3XX_ML1_TMR_SIZE 0x00100000 | ||
95 | |||
96 | #define SPEAR3XX_ML1_VIC_BASE 0xF1100000 | ||
97 | #define VA_SPEAR3XX_ML1_VIC_BASE IO_ADDRESS(SPEAR3XX_ML1_VIC_BASE) | 56 | #define VA_SPEAR3XX_ML1_VIC_BASE IO_ADDRESS(SPEAR3XX_ML1_VIC_BASE) |
98 | #define SPEAR3XX_ML1_VIC_SIZE 0x00100000 | ||
99 | 57 | ||
100 | /* ICM3 - Basic Subsystem */ | 58 | /* ICM3 - Basic Subsystem */ |
101 | #define SPEAR3XX_ICM3_SMEM_BASE 0xF8000000 | 59 | #define SPEAR3XX_ICM3_SMEM_BASE UL(0xF8000000) |
102 | #define SPEAR3XX_ICM3_SMEM_SIZE 0x04000000 | 60 | #define SPEAR3XX_ICM3_SMI_CTRL_BASE UL(0xFC000000) |
103 | 61 | #define SPEAR3XX_ICM3_DMA_BASE UL(0xFC400000) | |
104 | #define SPEAR3XX_ICM3_SMI_CTRL_BASE 0xFC000000 | 62 | #define SPEAR3XX_ICM3_SDRAM_CTRL_BASE UL(0xFC600000) |
105 | #define SPEAR3XX_ICM3_SMI_CTRL_SIZE 0x00200000 | 63 | #define SPEAR3XX_ICM3_TMR0_BASE UL(0xFC800000) |
106 | 64 | #define SPEAR3XX_ICM3_WDT_BASE UL(0xFC880000) | |
107 | #define SPEAR3XX_ICM3_DMA_BASE 0xFC400000 | 65 | #define SPEAR3XX_ICM3_RTC_BASE UL(0xFC900000) |
108 | #define SPEAR3XX_ICM3_DMA_SIZE 0x00200000 | 66 | #define SPEAR3XX_ICM3_GPIO_BASE UL(0xFC980000) |
109 | 67 | #define SPEAR3XX_ICM3_SYS_CTRL_BASE UL(0xFCA00000) | |
110 | #define SPEAR3XX_ICM3_SDRAM_CTRL_BASE 0xFC600000 | ||
111 | #define SPEAR3XX_ICM3_SDRAM_CTRL_SIZE 0x00200000 | ||
112 | |||
113 | #define SPEAR3XX_ICM3_TMR0_BASE 0xFC800000 | ||
114 | #define SPEAR3XX_ICM3_TMR0_SIZE 0x00080000 | ||
115 | |||
116 | #define SPEAR3XX_ICM3_WDT_BASE 0xFC880000 | ||
117 | #define SPEAR3XX_ICM3_WDT_SIZE 0x00080000 | ||
118 | |||
119 | #define SPEAR3XX_ICM3_RTC_BASE 0xFC900000 | ||
120 | #define SPEAR3XX_ICM3_RTC_SIZE 0x00080000 | ||
121 | |||
122 | #define SPEAR3XX_ICM3_GPIO_BASE 0xFC980000 | ||
123 | #define SPEAR3XX_ICM3_GPIO_SIZE 0x00080000 | ||
124 | |||
125 | #define SPEAR3XX_ICM3_SYS_CTRL_BASE 0xFCA00000 | ||
126 | #define VA_SPEAR3XX_ICM3_SYS_CTRL_BASE IO_ADDRESS(SPEAR3XX_ICM3_SYS_CTRL_BASE) | 68 | #define VA_SPEAR3XX_ICM3_SYS_CTRL_BASE IO_ADDRESS(SPEAR3XX_ICM3_SYS_CTRL_BASE) |
127 | #define SPEAR3XX_ICM3_SYS_CTRL_SIZE 0x00080000 | 69 | #define SPEAR3XX_ICM3_MISC_REG_BASE UL(0xFCA80000) |
128 | |||
129 | #define SPEAR3XX_ICM3_MISC_REG_BASE 0xFCA80000 | ||
130 | #define VA_SPEAR3XX_ICM3_MISC_REG_BASE IO_ADDRESS(SPEAR3XX_ICM3_MISC_REG_BASE) | 70 | #define VA_SPEAR3XX_ICM3_MISC_REG_BASE IO_ADDRESS(SPEAR3XX_ICM3_MISC_REG_BASE) |
131 | #define SPEAR3XX_ICM3_MISC_REG_SIZE 0x00080000 | 71 | #define SPEAR3XX_ICM3_TMR1_BASE UL(0xFCB00000) |
132 | |||
133 | #define SPEAR3XX_ICM3_TMR1_BASE 0xFCB00000 | ||
134 | #define SPEAR3XX_ICM3_TMR1_SIZE 0x00080000 | ||
135 | 72 | ||
136 | /* Debug uart for linux, will be used for debug and uncompress messages */ | 73 | /* Debug uart for linux, will be used for debug and uncompress messages */ |
137 | #define SPEAR_DBG_UART_BASE SPEAR3XX_ICM1_UART_BASE | 74 | #define SPEAR_DBG_UART_BASE SPEAR3XX_ICM1_UART_BASE |
diff --git a/arch/arm/mach-spear3xx/include/mach/spear300.h b/arch/arm/mach-spear3xx/include/mach/spear300.h index ccaa76522ee2..c723515f8853 100644 --- a/arch/arm/mach-spear3xx/include/mach/spear300.h +++ b/arch/arm/mach-spear3xx/include/mach/spear300.h | |||
@@ -17,11 +17,9 @@ | |||
17 | #define __MACH_SPEAR300_H | 17 | #define __MACH_SPEAR300_H |
18 | 18 | ||
19 | /* Base address of various IPs */ | 19 | /* Base address of various IPs */ |
20 | #define SPEAR300_TELECOM_BASE 0x50000000 | 20 | #define SPEAR300_TELECOM_BASE UL(0x50000000) |
21 | #define SPEAR300_TELECOM_SIZE 0x10000000 | ||
22 | 21 | ||
23 | /* Interrupt registers offsets and masks */ | 22 | /* Interrupt registers offsets and masks */ |
24 | #define SPEAR300_TELECOM_REG_SIZE 0x00010000 | ||
25 | #define INT_ENB_MASK_REG 0x54 | 23 | #define INT_ENB_MASK_REG 0x54 |
26 | #define INT_STS_MASK_REG 0x58 | 24 | #define INT_STS_MASK_REG 0x58 |
27 | #define IT_PERS_S_IRQ_MASK (1 << 0) | 25 | #define IT_PERS_S_IRQ_MASK (1 << 0) |
@@ -36,47 +34,20 @@ | |||
36 | 34 | ||
37 | #define SHIRQ_RAS1_MASK 0x1FF | 35 | #define SHIRQ_RAS1_MASK 0x1FF |
38 | 36 | ||
39 | #define SPEAR300_CLCD_BASE 0x60000000 | 37 | #define SPEAR300_CLCD_BASE UL(0x60000000) |
40 | #define SPEAR300_CLCD_SIZE 0x10000000 | 38 | #define SPEAR300_SDHCI_BASE UL(0x70000000) |
41 | 39 | #define SPEAR300_NAND_0_BASE UL(0x80000000) | |
42 | #define SPEAR300_SDIO_BASE 0x70000000 | 40 | #define SPEAR300_NAND_1_BASE UL(0x84000000) |
43 | #define SPEAR300_SDIO_SIZE 0x10000000 | 41 | #define SPEAR300_NAND_2_BASE UL(0x88000000) |
44 | 42 | #define SPEAR300_NAND_3_BASE UL(0x8c000000) | |
45 | #define SPEAR300_NAND_0_BASE 0x80000000 | 43 | #define SPEAR300_NOR_0_BASE UL(0x90000000) |
46 | #define SPEAR300_NAND_0_SIZE 0x04000000 | 44 | #define SPEAR300_NOR_1_BASE UL(0x91000000) |
47 | 45 | #define SPEAR300_NOR_2_BASE UL(0x92000000) | |
48 | #define SPEAR300_NAND_1_BASE 0x84000000 | 46 | #define SPEAR300_NOR_3_BASE UL(0x93000000) |
49 | #define SPEAR300_NAND_1_SIZE 0x04000000 | 47 | #define SPEAR300_FSMC_BASE UL(0x94000000) |
50 | 48 | #define SPEAR300_SOC_CONFIG_BASE UL(0x99000000) | |
51 | #define SPEAR300_NAND_2_BASE 0x88000000 | 49 | #define SPEAR300_KEYBOARD_BASE UL(0xA0000000) |
52 | #define SPEAR300_NAND_2_SIZE 0x04000000 | 50 | #define SPEAR300_GPIO_BASE UL(0xA9000000) |
53 | |||
54 | #define SPEAR300_NAND_3_BASE 0x8c000000 | ||
55 | #define SPEAR300_NAND_3_SIZE 0x04000000 | ||
56 | |||
57 | #define SPEAR300_NOR_0_BASE 0x90000000 | ||
58 | #define SPEAR300_NOR_0_SIZE 0x01000000 | ||
59 | |||
60 | #define SPEAR300_NOR_1_BASE 0x91000000 | ||
61 | #define SPEAR300_NOR_1_SIZE 0x01000000 | ||
62 | |||
63 | #define SPEAR300_NOR_2_BASE 0x92000000 | ||
64 | #define SPEAR300_NOR_2_SIZE 0x01000000 | ||
65 | |||
66 | #define SPEAR300_NOR_3_BASE 0x93000000 | ||
67 | #define SPEAR300_NOR_3_SIZE 0x01000000 | ||
68 | |||
69 | #define SPEAR300_FSMC_BASE 0x94000000 | ||
70 | #define SPEAR300_FSMC_SIZE 0x05000000 | ||
71 | |||
72 | #define SPEAR300_SOC_CONFIG_BASE 0x99000000 | ||
73 | #define SPEAR300_SOC_CONFIG_SIZE 0x00000008 | ||
74 | |||
75 | #define SPEAR300_KEYBOARD_BASE 0xA0000000 | ||
76 | #define SPEAR300_KEYBOARD_SIZE 0x09000000 | ||
77 | |||
78 | #define SPEAR300_GPIO_BASE 0xA9000000 | ||
79 | #define SPEAR300_GPIO_SIZE 0x07000000 | ||
80 | 51 | ||
81 | #endif /* __MACH_SPEAR300_H */ | 52 | #endif /* __MACH_SPEAR300_H */ |
82 | 53 | ||
diff --git a/arch/arm/mach-spear3xx/include/mach/spear310.h b/arch/arm/mach-spear3xx/include/mach/spear310.h index b27bb8af3309..1e853479b8cd 100644 --- a/arch/arm/mach-spear3xx/include/mach/spear310.h +++ b/arch/arm/mach-spear3xx/include/mach/spear310.h | |||
@@ -16,30 +16,18 @@ | |||
16 | #ifndef __MACH_SPEAR310_H | 16 | #ifndef __MACH_SPEAR310_H |
17 | #define __MACH_SPEAR310_H | 17 | #define __MACH_SPEAR310_H |
18 | 18 | ||
19 | #define SPEAR310_NAND_BASE 0x40000000 | 19 | #define SPEAR310_NAND_BASE UL(0x40000000) |
20 | #define SPEAR310_NAND_SIZE 0x04000000 | 20 | #define SPEAR310_FSMC_BASE UL(0x44000000) |
21 | #define SPEAR310_UART1_BASE UL(0xB2000000) | ||
22 | #define SPEAR310_UART2_BASE UL(0xB2080000) | ||
23 | #define SPEAR310_UART3_BASE UL(0xB2100000) | ||
24 | #define SPEAR310_UART4_BASE UL(0xB2180000) | ||
25 | #define SPEAR310_UART5_BASE UL(0xB2200000) | ||
26 | #define SPEAR310_HDLC_BASE UL(0xB2800000) | ||
27 | #define SPEAR310_RS485_0_BASE UL(0xB3000000) | ||
28 | #define SPEAR310_RS485_1_BASE UL(0xB3800000) | ||
29 | #define SPEAR310_SOC_CONFIG_BASE UL(0xB4000000) | ||
21 | 30 | ||
22 | #define SPEAR310_FSMC_BASE 0x44000000 | ||
23 | #define SPEAR310_FSMC_SIZE 0x01000000 | ||
24 | |||
25 | #define SPEAR310_UART1_BASE 0xB2000000 | ||
26 | #define SPEAR310_UART2_BASE 0xB2080000 | ||
27 | #define SPEAR310_UART3_BASE 0xB2100000 | ||
28 | #define SPEAR310_UART4_BASE 0xB2180000 | ||
29 | #define SPEAR310_UART5_BASE 0xB2200000 | ||
30 | #define SPEAR310_UART_SIZE 0x00080000 | ||
31 | |||
32 | #define SPEAR310_HDLC_BASE 0xB2800000 | ||
33 | #define SPEAR310_HDLC_SIZE 0x00800000 | ||
34 | |||
35 | #define SPEAR310_RS485_0_BASE 0xB3000000 | ||
36 | #define SPEAR310_RS485_0_SIZE 0x00800000 | ||
37 | |||
38 | #define SPEAR310_RS485_1_BASE 0xB3800000 | ||
39 | #define SPEAR310_RS485_1_SIZE 0x00800000 | ||
40 | |||
41 | #define SPEAR310_SOC_CONFIG_BASE 0xB4000000 | ||
42 | #define SPEAR310_SOC_CONFIG_SIZE 0x00000070 | ||
43 | /* Interrupt registers offsets and masks */ | 31 | /* Interrupt registers offsets and masks */ |
44 | #define INT_STS_MASK_REG 0x04 | 32 | #define INT_STS_MASK_REG 0x04 |
45 | #define SMII0_IRQ_MASK (1 << 0) | 33 | #define SMII0_IRQ_MASK (1 << 0) |
diff --git a/arch/arm/mach-spear3xx/include/mach/spear320.h b/arch/arm/mach-spear3xx/include/mach/spear320.h index 53677e464d4b..940f0d85d959 100644 --- a/arch/arm/mach-spear3xx/include/mach/spear320.h +++ b/arch/arm/mach-spear3xx/include/mach/spear320.h | |||
@@ -16,54 +16,25 @@ | |||
16 | #ifndef __MACH_SPEAR320_H | 16 | #ifndef __MACH_SPEAR320_H |
17 | #define __MACH_SPEAR320_H | 17 | #define __MACH_SPEAR320_H |
18 | 18 | ||
19 | #define SPEAR320_EMI_CTRL_BASE 0x40000000 | 19 | #define SPEAR320_EMI_CTRL_BASE UL(0x40000000) |
20 | #define SPEAR320_EMI_CTRL_SIZE 0x08000000 | 20 | #define SPEAR320_FSMC_BASE UL(0x4C000000) |
21 | #define SPEAR320_NAND_BASE UL(0x50000000) | ||
22 | #define SPEAR320_I2S_BASE UL(0x60000000) | ||
23 | #define SPEAR320_SDHCI_BASE UL(0x70000000) | ||
24 | #define SPEAR320_CLCD_BASE UL(0x90000000) | ||
25 | #define SPEAR320_PAR_PORT_BASE UL(0xA0000000) | ||
26 | #define SPEAR320_CAN0_BASE UL(0xA1000000) | ||
27 | #define SPEAR320_CAN1_BASE UL(0xA2000000) | ||
28 | #define SPEAR320_UART1_BASE UL(0xA3000000) | ||
29 | #define SPEAR320_UART2_BASE UL(0xA4000000) | ||
30 | #define SPEAR320_SSP0_BASE UL(0xA5000000) | ||
31 | #define SPEAR320_SSP1_BASE UL(0xA6000000) | ||
32 | #define SPEAR320_I2C_BASE UL(0xA7000000) | ||
33 | #define SPEAR320_PWM_BASE UL(0xA8000000) | ||
34 | #define SPEAR320_SMII0_BASE UL(0xAA000000) | ||
35 | #define SPEAR320_SMII1_BASE UL(0xAB000000) | ||
36 | #define SPEAR320_SOC_CONFIG_BASE UL(0xB3000000) | ||
21 | 37 | ||
22 | #define SPEAR320_FSMC_BASE 0x4C000000 | ||
23 | #define SPEAR320_FSMC_SIZE 0x01000000 | ||
24 | |||
25 | #define SPEAR320_I2S_BASE 0x60000000 | ||
26 | #define SPEAR320_I2S_SIZE 0x10000000 | ||
27 | |||
28 | #define SPEAR320_SDIO_BASE 0x70000000 | ||
29 | #define SPEAR320_SDIO_SIZE 0x10000000 | ||
30 | |||
31 | #define SPEAR320_CLCD_BASE 0x90000000 | ||
32 | #define SPEAR320_CLCD_SIZE 0x10000000 | ||
33 | |||
34 | #define SPEAR320_PAR_PORT_BASE 0xA0000000 | ||
35 | #define SPEAR320_PAR_PORT_SIZE 0x01000000 | ||
36 | |||
37 | #define SPEAR320_CAN0_BASE 0xA1000000 | ||
38 | #define SPEAR320_CAN0_SIZE 0x01000000 | ||
39 | |||
40 | #define SPEAR320_CAN1_BASE 0xA2000000 | ||
41 | #define SPEAR320_CAN1_SIZE 0x01000000 | ||
42 | |||
43 | #define SPEAR320_UART1_BASE 0xA3000000 | ||
44 | #define SPEAR320_UART2_BASE 0xA4000000 | ||
45 | #define SPEAR320_UART_SIZE 0x01000000 | ||
46 | |||
47 | #define SPEAR320_SSP0_BASE 0xA5000000 | ||
48 | #define SPEAR320_SSP0_SIZE 0x01000000 | ||
49 | |||
50 | #define SPEAR320_SSP1_BASE 0xA6000000 | ||
51 | #define SPEAR320_SSP1_SIZE 0x01000000 | ||
52 | |||
53 | #define SPEAR320_I2C_BASE 0xA7000000 | ||
54 | #define SPEAR320_I2C_SIZE 0x01000000 | ||
55 | |||
56 | #define SPEAR320_PWM_BASE 0xA8000000 | ||
57 | #define SPEAR320_PWM_SIZE 0x01000000 | ||
58 | |||
59 | #define SPEAR320_SMII0_BASE 0xAA000000 | ||
60 | #define SPEAR320_SMII0_SIZE 0x01000000 | ||
61 | |||
62 | #define SPEAR320_SMII1_BASE 0xAB000000 | ||
63 | #define SPEAR320_SMII1_SIZE 0x01000000 | ||
64 | |||
65 | #define SPEAR320_SOC_CONFIG_BASE 0xB3000000 | ||
66 | #define SPEAR320_SOC_CONFIG_SIZE 0x00000070 | ||
67 | /* Interrupt registers offsets and masks */ | 38 | /* Interrupt registers offsets and masks */ |
68 | #define INT_STS_MASK_REG 0x04 | 39 | #define INT_STS_MASK_REG 0x04 |
69 | #define INT_CLR_MASK_REG 0x04 | 40 | #define INT_CLR_MASK_REG 0x04 |
@@ -74,7 +45,7 @@ | |||
74 | #define EMI_IRQ_MASK (1 << 7) | 45 | #define EMI_IRQ_MASK (1 << 7) |
75 | #define CLCD_IRQ_MASK (1 << 8) | 46 | #define CLCD_IRQ_MASK (1 << 8) |
76 | #define SPP_IRQ_MASK (1 << 9) | 47 | #define SPP_IRQ_MASK (1 << 9) |
77 | #define SDIO_IRQ_MASK (1 << 10) | 48 | #define SDHCI_IRQ_MASK (1 << 10) |
78 | #define CAN_U_IRQ_MASK (1 << 11) | 49 | #define CAN_U_IRQ_MASK (1 << 11) |
79 | #define CAN_L_IRQ_MASK (1 << 12) | 50 | #define CAN_L_IRQ_MASK (1 << 12) |
80 | #define UART1_IRQ_MASK (1 << 13) | 51 | #define UART1_IRQ_MASK (1 << 13) |
diff --git a/arch/arm/mach-spear3xx/spear300.c b/arch/arm/mach-spear3xx/spear300.c index 5aa2d54ebfaa..2697e65adf86 100644 --- a/arch/arm/mach-spear3xx/spear300.c +++ b/arch/arm/mach-spear3xx/spear300.c | |||
@@ -15,9 +15,9 @@ | |||
15 | #include <linux/amba/pl061.h> | 15 | #include <linux/amba/pl061.h> |
16 | #include <linux/ptrace.h> | 16 | #include <linux/ptrace.h> |
17 | #include <asm/irq.h> | 17 | #include <asm/irq.h> |
18 | #include <mach/generic.h> | ||
19 | #include <mach/spear.h> | ||
20 | #include <plat/shirq.h> | 18 | #include <plat/shirq.h> |
19 | #include <mach/generic.h> | ||
20 | #include <mach/hardware.h> | ||
21 | 21 | ||
22 | /* pad multiplexing support */ | 22 | /* pad multiplexing support */ |
23 | /* muxing registers */ | 23 | /* muxing registers */ |
@@ -310,7 +310,7 @@ struct pmx_dev pmx_telecom_boot_pins = { | |||
310 | .enb_on_reset = 1, | 310 | .enb_on_reset = 1, |
311 | }; | 311 | }; |
312 | 312 | ||
313 | struct pmx_dev_mode pmx_telecom_sdio_4bit_modes[] = { | 313 | struct pmx_dev_mode pmx_telecom_sdhci_4bit_modes[] = { |
314 | { | 314 | { |
315 | .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE | | 315 | .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE | |
316 | HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE | | 316 | HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE | |
@@ -323,14 +323,14 @@ struct pmx_dev_mode pmx_telecom_sdio_4bit_modes[] = { | |||
323 | }, | 323 | }, |
324 | }; | 324 | }; |
325 | 325 | ||
326 | struct pmx_dev pmx_telecom_sdio_4bit = { | 326 | struct pmx_dev pmx_telecom_sdhci_4bit = { |
327 | .name = "telecom_sdio_4bit", | 327 | .name = "telecom_sdhci_4bit", |
328 | .modes = pmx_telecom_sdio_4bit_modes, | 328 | .modes = pmx_telecom_sdhci_4bit_modes, |
329 | .mode_count = ARRAY_SIZE(pmx_telecom_sdio_4bit_modes), | 329 | .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_4bit_modes), |
330 | .enb_on_reset = 1, | 330 | .enb_on_reset = 1, |
331 | }; | 331 | }; |
332 | 332 | ||
333 | struct pmx_dev_mode pmx_telecom_sdio_8bit_modes[] = { | 333 | struct pmx_dev_mode pmx_telecom_sdhci_8bit_modes[] = { |
334 | { | 334 | { |
335 | .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE | | 335 | .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE | |
336 | HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE | | 336 | HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE | |
@@ -342,10 +342,10 @@ struct pmx_dev_mode pmx_telecom_sdio_8bit_modes[] = { | |||
342 | }, | 342 | }, |
343 | }; | 343 | }; |
344 | 344 | ||
345 | struct pmx_dev pmx_telecom_sdio_8bit = { | 345 | struct pmx_dev pmx_telecom_sdhci_8bit = { |
346 | .name = "telecom_sdio_8bit", | 346 | .name = "telecom_sdhci_8bit", |
347 | .modes = pmx_telecom_sdio_8bit_modes, | 347 | .modes = pmx_telecom_sdhci_8bit_modes, |
348 | .mode_count = ARRAY_SIZE(pmx_telecom_sdio_8bit_modes), | 348 | .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_8bit_modes), |
349 | .enb_on_reset = 1, | 349 | .enb_on_reset = 1, |
350 | }; | 350 | }; |
351 | 351 | ||
@@ -370,26 +370,6 @@ struct pmx_driver pmx_driver = { | |||
370 | .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff}, | 370 | .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff}, |
371 | }; | 371 | }; |
372 | 372 | ||
373 | /* Add spear300 specific devices here */ | ||
374 | /* arm gpio1 device registration */ | ||
375 | static struct pl061_platform_data gpio1_plat_data = { | ||
376 | .gpio_base = 8, | ||
377 | .irq_base = SPEAR_GPIO1_INT_BASE, | ||
378 | }; | ||
379 | |||
380 | struct amba_device gpio1_device = { | ||
381 | .dev = { | ||
382 | .init_name = "gpio1", | ||
383 | .platform_data = &gpio1_plat_data, | ||
384 | }, | ||
385 | .res = { | ||
386 | .start = SPEAR300_GPIO_BASE, | ||
387 | .end = SPEAR300_GPIO_BASE + SPEAR300_GPIO_SIZE - 1, | ||
388 | .flags = IORESOURCE_MEM, | ||
389 | }, | ||
390 | .irq = {VIRQ_GPIO1, NO_IRQ}, | ||
391 | }; | ||
392 | |||
393 | /* spear3xx shared irq */ | 373 | /* spear3xx shared irq */ |
394 | struct shirq_dev_config shirq_ras1_config[] = { | 374 | struct shirq_dev_config shirq_ras1_config[] = { |
395 | { | 375 | { |
@@ -443,6 +423,26 @@ struct spear_shirq shirq_ras1 = { | |||
443 | }, | 423 | }, |
444 | }; | 424 | }; |
445 | 425 | ||
426 | /* Add spear300 specific devices here */ | ||
427 | /* arm gpio1 device registration */ | ||
428 | static struct pl061_platform_data gpio1_plat_data = { | ||
429 | .gpio_base = 8, | ||
430 | .irq_base = SPEAR_GPIO1_INT_BASE, | ||
431 | }; | ||
432 | |||
433 | struct amba_device gpio1_device = { | ||
434 | .dev = { | ||
435 | .init_name = "gpio1", | ||
436 | .platform_data = &gpio1_plat_data, | ||
437 | }, | ||
438 | .res = { | ||
439 | .start = SPEAR300_GPIO_BASE, | ||
440 | .end = SPEAR300_GPIO_BASE + SZ_4K - 1, | ||
441 | .flags = IORESOURCE_MEM, | ||
442 | }, | ||
443 | .irq = {VIRQ_GPIO1, NO_IRQ}, | ||
444 | }; | ||
445 | |||
446 | /* spear300 routines */ | 446 | /* spear300 routines */ |
447 | void __init spear300_init(void) | 447 | void __init spear300_init(void) |
448 | { | 448 | { |
@@ -452,17 +452,21 @@ void __init spear300_init(void) | |||
452 | spear3xx_init(); | 452 | spear3xx_init(); |
453 | 453 | ||
454 | /* shared irq registration */ | 454 | /* shared irq registration */ |
455 | shirq_ras1.regs.base = | 455 | shirq_ras1.regs.base = ioremap(SPEAR300_TELECOM_BASE, SZ_4K); |
456 | ioremap(SPEAR300_TELECOM_BASE, SPEAR300_TELECOM_REG_SIZE); | ||
457 | if (shirq_ras1.regs.base) { | 456 | if (shirq_ras1.regs.base) { |
458 | ret = spear_shirq_register(&shirq_ras1); | 457 | ret = spear_shirq_register(&shirq_ras1); |
459 | if (ret) | 458 | if (ret) |
460 | printk(KERN_ERR "Error registering Shared IRQ\n"); | 459 | printk(KERN_ERR "Error registering Shared IRQ\n"); |
461 | } | 460 | } |
462 | } | ||
463 | 461 | ||
464 | void spear300_pmx_init(void) | 462 | /* pmx initialization */ |
465 | { | 463 | pmx_driver.base = ioremap(SPEAR300_SOC_CONFIG_BASE, SZ_4K); |
466 | spear_pmx_init(&pmx_driver, SPEAR300_SOC_CONFIG_BASE, | 464 | if (pmx_driver.base) { |
467 | SPEAR300_SOC_CONFIG_SIZE); | 465 | ret = pmx_register(&pmx_driver); |
466 | if (ret) | ||
467 | printk(KERN_ERR "padmux: registeration failed. err no" | ||
468 | ": %d\n", ret); | ||
469 | /* Free Mapping, device selection already done */ | ||
470 | iounmap(pmx_driver.base); | ||
471 | } | ||
468 | } | 472 | } |
diff --git a/arch/arm/mach-spear3xx/spear300_evb.c b/arch/arm/mach-spear3xx/spear300_evb.c index bb21db152a23..42d2253ef540 100644 --- a/arch/arm/mach-spear3xx/spear300_evb.c +++ b/arch/arm/mach-spear3xx/spear300_evb.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <asm/mach/arch.h> | 14 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 15 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 16 | #include <mach/generic.h> |
17 | #include <mach/spear.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | /* padmux devices to enable */ | 19 | /* padmux devices to enable */ |
20 | static struct pmx_dev *pmx_devs[] = { | 20 | static struct pmx_dev *pmx_devs[] = { |
@@ -28,7 +28,7 @@ static struct pmx_dev *pmx_devs[] = { | |||
28 | /* spear300 specific devices */ | 28 | /* spear300 specific devices */ |
29 | &pmx_fsmc_2_chips, | 29 | &pmx_fsmc_2_chips, |
30 | &pmx_clcd, | 30 | &pmx_clcd, |
31 | &pmx_telecom_sdio_4bit, | 31 | &pmx_telecom_sdhci_4bit, |
32 | &pmx_gpio1, | 32 | &pmx_gpio1, |
33 | }; | 33 | }; |
34 | 34 | ||
@@ -51,14 +51,13 @@ static void __init spear300_evb_init(void) | |||
51 | { | 51 | { |
52 | unsigned int i; | 52 | unsigned int i; |
53 | 53 | ||
54 | /* call spear300 machine init function */ | 54 | /* padmux initialization, must be done before spear300_init */ |
55 | spear300_init(); | ||
56 | |||
57 | /* padmux initialization */ | ||
58 | pmx_driver.mode = &photo_frame_mode; | 55 | pmx_driver.mode = &photo_frame_mode; |
59 | pmx_driver.devs = pmx_devs; | 56 | pmx_driver.devs = pmx_devs; |
60 | pmx_driver.devs_count = ARRAY_SIZE(pmx_devs); | 57 | pmx_driver.devs_count = ARRAY_SIZE(pmx_devs); |
61 | spear300_pmx_init(); | 58 | |
59 | /* call spear300 machine init function */ | ||
60 | spear300_init(); | ||
62 | 61 | ||
63 | /* Add Platform Devices */ | 62 | /* Add Platform Devices */ |
64 | platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs)); | 63 | platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs)); |
@@ -72,6 +71,6 @@ MACHINE_START(SPEAR300, "ST-SPEAR300-EVB") | |||
72 | .boot_params = 0x00000100, | 71 | .boot_params = 0x00000100, |
73 | .map_io = spear3xx_map_io, | 72 | .map_io = spear3xx_map_io, |
74 | .init_irq = spear3xx_init_irq, | 73 | .init_irq = spear3xx_init_irq, |
75 | .timer = &spear_sys_timer, | 74 | .timer = &spear3xx_timer, |
76 | .init_machine = spear300_evb_init, | 75 | .init_machine = spear300_evb_init, |
77 | MACHINE_END | 76 | MACHINE_END |
diff --git a/arch/arm/mach-spear3xx/spear310.c b/arch/arm/mach-spear3xx/spear310.c index 53b41b52d7ee..5c0a67b60c2a 100644 --- a/arch/arm/mach-spear3xx/spear310.c +++ b/arch/arm/mach-spear3xx/spear310.c | |||
@@ -13,9 +13,9 @@ | |||
13 | 13 | ||
14 | #include <linux/ptrace.h> | 14 | #include <linux/ptrace.h> |
15 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
16 | #include <mach/generic.h> | ||
17 | #include <mach/spear.h> | ||
18 | #include <plat/shirq.h> | 16 | #include <plat/shirq.h> |
17 | #include <mach/generic.h> | ||
18 | #include <mach/hardware.h> | ||
19 | 19 | ||
20 | /* pad multiplexing support */ | 20 | /* pad multiplexing support */ |
21 | /* muxing registers */ | 21 | /* muxing registers */ |
@@ -139,8 +139,6 @@ struct pmx_driver pmx_driver = { | |||
139 | .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff}, | 139 | .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff}, |
140 | }; | 140 | }; |
141 | 141 | ||
142 | /* Add spear310 specific devices here */ | ||
143 | |||
144 | /* spear3xx shared irq */ | 142 | /* spear3xx shared irq */ |
145 | struct shirq_dev_config shirq_ras1_config[] = { | 143 | struct shirq_dev_config shirq_ras1_config[] = { |
146 | { | 144 | { |
@@ -257,6 +255,8 @@ struct spear_shirq shirq_intrcomm_ras = { | |||
257 | }, | 255 | }, |
258 | }; | 256 | }; |
259 | 257 | ||
258 | /* Add spear310 specific devices here */ | ||
259 | |||
260 | /* spear310 routines */ | 260 | /* spear310 routines */ |
261 | void __init spear310_init(void) | 261 | void __init spear310_init(void) |
262 | { | 262 | { |
@@ -267,7 +267,7 @@ void __init spear310_init(void) | |||
267 | spear3xx_init(); | 267 | spear3xx_init(); |
268 | 268 | ||
269 | /* shared irq registration */ | 269 | /* shared irq registration */ |
270 | base = ioremap(SPEAR310_SOC_CONFIG_BASE, SPEAR310_SOC_CONFIG_SIZE); | 270 | base = ioremap(SPEAR310_SOC_CONFIG_BASE, SZ_4K); |
271 | if (base) { | 271 | if (base) { |
272 | /* shirq 1 */ | 272 | /* shirq 1 */ |
273 | shirq_ras1.regs.base = base; | 273 | shirq_ras1.regs.base = base; |
@@ -293,10 +293,11 @@ void __init spear310_init(void) | |||
293 | if (ret) | 293 | if (ret) |
294 | printk(KERN_ERR "Error registering Shared IRQ 4\n"); | 294 | printk(KERN_ERR "Error registering Shared IRQ 4\n"); |
295 | } | 295 | } |
296 | } | ||
297 | 296 | ||
298 | void spear310_pmx_init(void) | 297 | /* pmx initialization */ |
299 | { | 298 | pmx_driver.base = base; |
300 | spear_pmx_init(&pmx_driver, SPEAR310_SOC_CONFIG_BASE, | 299 | ret = pmx_register(&pmx_driver); |
301 | SPEAR310_SOC_CONFIG_SIZE); | 300 | if (ret) |
301 | printk(KERN_ERR "padmux: registeration failed. err no: %d\n", | ||
302 | ret); | ||
302 | } | 303 | } |
diff --git a/arch/arm/mach-spear3xx/spear310_evb.c b/arch/arm/mach-spear3xx/spear310_evb.c index 7facf6643199..2d7f333bd67b 100644 --- a/arch/arm/mach-spear3xx/spear310_evb.c +++ b/arch/arm/mach-spear3xx/spear310_evb.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <asm/mach/arch.h> | 14 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 15 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 16 | #include <mach/generic.h> |
17 | #include <mach/spear.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | /* padmux devices to enable */ | 19 | /* padmux devices to enable */ |
20 | static struct pmx_dev *pmx_devs[] = { | 20 | static struct pmx_dev *pmx_devs[] = { |
@@ -58,14 +58,13 @@ static void __init spear310_evb_init(void) | |||
58 | { | 58 | { |
59 | unsigned int i; | 59 | unsigned int i; |
60 | 60 | ||
61 | /* call spear310 machine init function */ | 61 | /* padmux initialization, must be done before spear310_init */ |
62 | spear310_init(); | ||
63 | |||
64 | /* padmux initialization */ | ||
65 | pmx_driver.mode = NULL; | 62 | pmx_driver.mode = NULL; |
66 | pmx_driver.devs = pmx_devs; | 63 | pmx_driver.devs = pmx_devs; |
67 | pmx_driver.devs_count = ARRAY_SIZE(pmx_devs); | 64 | pmx_driver.devs_count = ARRAY_SIZE(pmx_devs); |
68 | spear310_pmx_init(); | 65 | |
66 | /* call spear310 machine init function */ | ||
67 | spear310_init(); | ||
69 | 68 | ||
70 | /* Add Platform Devices */ | 69 | /* Add Platform Devices */ |
71 | platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs)); | 70 | platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs)); |
@@ -79,6 +78,6 @@ MACHINE_START(SPEAR310, "ST-SPEAR310-EVB") | |||
79 | .boot_params = 0x00000100, | 78 | .boot_params = 0x00000100, |
80 | .map_io = spear3xx_map_io, | 79 | .map_io = spear3xx_map_io, |
81 | .init_irq = spear3xx_init_irq, | 80 | .init_irq = spear3xx_init_irq, |
82 | .timer = &spear_sys_timer, | 81 | .timer = &spear3xx_timer, |
83 | .init_machine = spear310_evb_init, | 82 | .init_machine = spear310_evb_init, |
84 | MACHINE_END | 83 | MACHINE_END |
diff --git a/arch/arm/mach-spear3xx/spear320.c b/arch/arm/mach-spear3xx/spear320.c index 88b465284c36..741c1f414cbd 100644 --- a/arch/arm/mach-spear3xx/spear320.c +++ b/arch/arm/mach-spear3xx/spear320.c | |||
@@ -13,9 +13,9 @@ | |||
13 | 13 | ||
14 | #include <linux/ptrace.h> | 14 | #include <linux/ptrace.h> |
15 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
16 | #include <mach/generic.h> | ||
17 | #include <mach/spear.h> | ||
18 | #include <plat/shirq.h> | 16 | #include <plat/shirq.h> |
17 | #include <mach/generic.h> | ||
18 | #include <mach/hardware.h> | ||
19 | 19 | ||
20 | /* pad multiplexing support */ | 20 | /* pad multiplexing support */ |
21 | /* muxing registers */ | 21 | /* muxing registers */ |
@@ -110,7 +110,7 @@ struct pmx_dev pmx_spp = { | |||
110 | .enb_on_reset = 1, | 110 | .enb_on_reset = 1, |
111 | }; | 111 | }; |
112 | 112 | ||
113 | struct pmx_dev_mode pmx_sdio_modes[] = { | 113 | struct pmx_dev_mode pmx_sdhci_modes[] = { |
114 | { | 114 | { |
115 | .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | | 115 | .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | |
116 | SMALL_PRINTERS_MODE, | 116 | SMALL_PRINTERS_MODE, |
@@ -118,10 +118,10 @@ struct pmx_dev_mode pmx_sdio_modes[] = { | |||
118 | }, | 118 | }, |
119 | }; | 119 | }; |
120 | 120 | ||
121 | struct pmx_dev pmx_sdio = { | 121 | struct pmx_dev pmx_sdhci = { |
122 | .name = "sdio", | 122 | .name = "sdhci", |
123 | .modes = pmx_sdio_modes, | 123 | .modes = pmx_sdhci_modes, |
124 | .mode_count = ARRAY_SIZE(pmx_sdio_modes), | 124 | .mode_count = ARRAY_SIZE(pmx_sdhci_modes), |
125 | .enb_on_reset = 1, | 125 | .enb_on_reset = 1, |
126 | }; | 126 | }; |
127 | 127 | ||
@@ -215,17 +215,17 @@ struct pmx_dev pmx_can = { | |||
215 | .enb_on_reset = 1, | 215 | .enb_on_reset = 1, |
216 | }; | 216 | }; |
217 | 217 | ||
218 | struct pmx_dev_mode pmx_sdio_led_modes[] = { | 218 | struct pmx_dev_mode pmx_sdhci_led_modes[] = { |
219 | { | 219 | { |
220 | .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE, | 220 | .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE, |
221 | .mask = PMX_SSP_CS_MASK, | 221 | .mask = PMX_SSP_CS_MASK, |
222 | }, | 222 | }, |
223 | }; | 223 | }; |
224 | 224 | ||
225 | struct pmx_dev pmx_sdio_led = { | 225 | struct pmx_dev pmx_sdhci_led = { |
226 | .name = "sdio_led", | 226 | .name = "sdhci_led", |
227 | .modes = pmx_sdio_led_modes, | 227 | .modes = pmx_sdhci_led_modes, |
228 | .mode_count = ARRAY_SIZE(pmx_sdio_led_modes), | 228 | .mode_count = ARRAY_SIZE(pmx_sdhci_led_modes), |
229 | .enb_on_reset = 1, | 229 | .enb_on_reset = 1, |
230 | }; | 230 | }; |
231 | 231 | ||
@@ -384,8 +384,6 @@ struct pmx_driver pmx_driver = { | |||
384 | .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff}, | 384 | .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff}, |
385 | }; | 385 | }; |
386 | 386 | ||
387 | /* Add spear320 specific devices here */ | ||
388 | |||
389 | /* spear3xx shared irq */ | 387 | /* spear3xx shared irq */ |
390 | struct shirq_dev_config shirq_ras1_config[] = { | 388 | struct shirq_dev_config shirq_ras1_config[] = { |
391 | { | 389 | { |
@@ -510,6 +508,8 @@ struct spear_shirq shirq_intrcomm_ras = { | |||
510 | }, | 508 | }, |
511 | }; | 509 | }; |
512 | 510 | ||
511 | /* Add spear320 specific devices here */ | ||
512 | |||
513 | /* spear320 routines */ | 513 | /* spear320 routines */ |
514 | void __init spear320_init(void) | 514 | void __init spear320_init(void) |
515 | { | 515 | { |
@@ -520,7 +520,7 @@ void __init spear320_init(void) | |||
520 | spear3xx_init(); | 520 | spear3xx_init(); |
521 | 521 | ||
522 | /* shared irq registration */ | 522 | /* shared irq registration */ |
523 | base = ioremap(SPEAR320_SOC_CONFIG_BASE, SPEAR320_SOC_CONFIG_SIZE); | 523 | base = ioremap(SPEAR320_SOC_CONFIG_BASE, SZ_4K); |
524 | if (base) { | 524 | if (base) { |
525 | /* shirq 1 */ | 525 | /* shirq 1 */ |
526 | shirq_ras1.regs.base = base; | 526 | shirq_ras1.regs.base = base; |
@@ -540,10 +540,11 @@ void __init spear320_init(void) | |||
540 | if (ret) | 540 | if (ret) |
541 | printk(KERN_ERR "Error registering Shared IRQ 4\n"); | 541 | printk(KERN_ERR "Error registering Shared IRQ 4\n"); |
542 | } | 542 | } |
543 | } | ||
544 | 543 | ||
545 | void spear320_pmx_init(void) | 544 | /* pmx initialization */ |
546 | { | 545 | pmx_driver.base = base; |
547 | spear_pmx_init(&pmx_driver, SPEAR320_SOC_CONFIG_BASE, | 546 | ret = pmx_register(&pmx_driver); |
548 | SPEAR320_SOC_CONFIG_SIZE); | 547 | if (ret) |
548 | printk(KERN_ERR "padmux: registeration failed. err no: %d\n", | ||
549 | ret); | ||
549 | } | 550 | } |
diff --git a/arch/arm/mach-spear3xx/spear320_evb.c b/arch/arm/mach-spear3xx/spear320_evb.c index 62ac685a4135..8213e4b66c14 100644 --- a/arch/arm/mach-spear3xx/spear320_evb.c +++ b/arch/arm/mach-spear3xx/spear320_evb.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <asm/mach/arch.h> | 14 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 15 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 16 | #include <mach/generic.h> |
17 | #include <mach/spear.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | /* padmux devices to enable */ | 19 | /* padmux devices to enable */ |
20 | static struct pmx_dev *pmx_devs[] = { | 20 | static struct pmx_dev *pmx_devs[] = { |
@@ -26,7 +26,7 @@ static struct pmx_dev *pmx_devs[] = { | |||
26 | 26 | ||
27 | /* spear320 specific devices */ | 27 | /* spear320 specific devices */ |
28 | &pmx_fsmc, | 28 | &pmx_fsmc, |
29 | &pmx_sdio, | 29 | &pmx_sdhci, |
30 | &pmx_i2s, | 30 | &pmx_i2s, |
31 | &pmx_uart1, | 31 | &pmx_uart1, |
32 | &pmx_uart2, | 32 | &pmx_uart2, |
@@ -55,14 +55,13 @@ static void __init spear320_evb_init(void) | |||
55 | { | 55 | { |
56 | unsigned int i; | 56 | unsigned int i; |
57 | 57 | ||
58 | /* call spear320 machine init function */ | 58 | /* padmux initialization, must be done before spear320_init */ |
59 | spear320_init(); | ||
60 | |||
61 | /* padmux initialization */ | ||
62 | pmx_driver.mode = &auto_net_mii_mode; | 59 | pmx_driver.mode = &auto_net_mii_mode; |
63 | pmx_driver.devs = pmx_devs; | 60 | pmx_driver.devs = pmx_devs; |
64 | pmx_driver.devs_count = ARRAY_SIZE(pmx_devs); | 61 | pmx_driver.devs_count = ARRAY_SIZE(pmx_devs); |
65 | spear320_pmx_init(); | 62 | |
63 | /* call spear320 machine init function */ | ||
64 | spear320_init(); | ||
66 | 65 | ||
67 | /* Add Platform Devices */ | 66 | /* Add Platform Devices */ |
68 | platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs)); | 67 | platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs)); |
@@ -76,6 +75,6 @@ MACHINE_START(SPEAR320, "ST-SPEAR320-EVB") | |||
76 | .boot_params = 0x00000100, | 75 | .boot_params = 0x00000100, |
77 | .map_io = spear3xx_map_io, | 76 | .map_io = spear3xx_map_io, |
78 | .init_irq = spear3xx_init_irq, | 77 | .init_irq = spear3xx_init_irq, |
79 | .timer = &spear_sys_timer, | 78 | .timer = &spear3xx_timer, |
80 | .init_machine = spear320_evb_init, | 79 | .init_machine = spear320_evb_init, |
81 | MACHINE_END | 80 | MACHINE_END |
diff --git a/arch/arm/mach-spear3xx/spear3xx.c b/arch/arm/mach-spear3xx/spear3xx.c index 52f553c8c46d..d3ba8ca1bc59 100644 --- a/arch/arm/mach-spear3xx/spear3xx.c +++ b/arch/arm/mach-spear3xx/spear3xx.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <asm/irq.h> | 19 | #include <asm/irq.h> |
20 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
21 | #include <mach/generic.h> | 21 | #include <mach/generic.h> |
22 | #include <mach/spear.h> | 22 | #include <mach/hardware.h> |
23 | 23 | ||
24 | /* Add spear3xx machines common devices here */ | 24 | /* Add spear3xx machines common devices here */ |
25 | /* gpio device registration */ | 25 | /* gpio device registration */ |
@@ -35,7 +35,7 @@ struct amba_device gpio_device = { | |||
35 | }, | 35 | }, |
36 | .res = { | 36 | .res = { |
37 | .start = SPEAR3XX_ICM3_GPIO_BASE, | 37 | .start = SPEAR3XX_ICM3_GPIO_BASE, |
38 | .end = SPEAR3XX_ICM3_GPIO_BASE + SPEAR3XX_ICM3_GPIO_SIZE - 1, | 38 | .end = SPEAR3XX_ICM3_GPIO_BASE + SZ_4K - 1, |
39 | .flags = IORESOURCE_MEM, | 39 | .flags = IORESOURCE_MEM, |
40 | }, | 40 | }, |
41 | .irq = {IRQ_BASIC_GPIO, NO_IRQ}, | 41 | .irq = {IRQ_BASIC_GPIO, NO_IRQ}, |
@@ -48,7 +48,7 @@ struct amba_device uart_device = { | |||
48 | }, | 48 | }, |
49 | .res = { | 49 | .res = { |
50 | .start = SPEAR3XX_ICM1_UART_BASE, | 50 | .start = SPEAR3XX_ICM1_UART_BASE, |
51 | .end = SPEAR3XX_ICM1_UART_BASE + SPEAR3XX_ICM1_UART_SIZE - 1, | 51 | .end = SPEAR3XX_ICM1_UART_BASE + SZ_4K - 1, |
52 | .flags = IORESOURCE_MEM, | 52 | .flags = IORESOURCE_MEM, |
53 | }, | 53 | }, |
54 | .irq = {IRQ_UART, NO_IRQ}, | 54 | .irq = {IRQ_UART, NO_IRQ}, |
@@ -71,22 +71,22 @@ struct map_desc spear3xx_io_desc[] __initdata = { | |||
71 | { | 71 | { |
72 | .virtual = VA_SPEAR3XX_ICM1_UART_BASE, | 72 | .virtual = VA_SPEAR3XX_ICM1_UART_BASE, |
73 | .pfn = __phys_to_pfn(SPEAR3XX_ICM1_UART_BASE), | 73 | .pfn = __phys_to_pfn(SPEAR3XX_ICM1_UART_BASE), |
74 | .length = SPEAR3XX_ICM1_UART_SIZE, | 74 | .length = SZ_4K, |
75 | .type = MT_DEVICE | 75 | .type = MT_DEVICE |
76 | }, { | 76 | }, { |
77 | .virtual = VA_SPEAR3XX_ML1_VIC_BASE, | 77 | .virtual = VA_SPEAR3XX_ML1_VIC_BASE, |
78 | .pfn = __phys_to_pfn(SPEAR3XX_ML1_VIC_BASE), | 78 | .pfn = __phys_to_pfn(SPEAR3XX_ML1_VIC_BASE), |
79 | .length = SPEAR3XX_ML1_VIC_SIZE, | 79 | .length = SZ_4K, |
80 | .type = MT_DEVICE | 80 | .type = MT_DEVICE |
81 | }, { | 81 | }, { |
82 | .virtual = VA_SPEAR3XX_ICM3_SYS_CTRL_BASE, | 82 | .virtual = VA_SPEAR3XX_ICM3_SYS_CTRL_BASE, |
83 | .pfn = __phys_to_pfn(SPEAR3XX_ICM3_SYS_CTRL_BASE), | 83 | .pfn = __phys_to_pfn(SPEAR3XX_ICM3_SYS_CTRL_BASE), |
84 | .length = SPEAR3XX_ICM3_SYS_CTRL_SIZE, | 84 | .length = SZ_4K, |
85 | .type = MT_DEVICE | 85 | .type = MT_DEVICE |
86 | }, { | 86 | }, { |
87 | .virtual = VA_SPEAR3XX_ICM3_MISC_REG_BASE, | 87 | .virtual = VA_SPEAR3XX_ICM3_MISC_REG_BASE, |
88 | .pfn = __phys_to_pfn(SPEAR3XX_ICM3_MISC_REG_BASE), | 88 | .pfn = __phys_to_pfn(SPEAR3XX_ICM3_MISC_REG_BASE), |
89 | .length = SPEAR3XX_ICM3_MISC_REG_SIZE, | 89 | .length = SZ_4K, |
90 | .type = MT_DEVICE | 90 | .type = MT_DEVICE |
91 | }, | 91 | }, |
92 | }; | 92 | }; |
@@ -523,26 +523,35 @@ struct pmx_dev pmx_plgpio_45_46_49_50 = { | |||
523 | .mode_count = ARRAY_SIZE(pmx_plgpio_45_46_49_50_modes), | 523 | .mode_count = ARRAY_SIZE(pmx_plgpio_45_46_49_50_modes), |
524 | .enb_on_reset = 1, | 524 | .enb_on_reset = 1, |
525 | }; | 525 | }; |
526 | #endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */ | ||
526 | 527 | ||
527 | #endif | 528 | static void __init spear3xx_timer_init(void) |
528 | |||
529 | /* spear padmux initialization function */ | ||
530 | void spear_pmx_init(struct pmx_driver *pmx_driver, uint base, uint size) | ||
531 | { | 529 | { |
532 | int ret = 0; | 530 | char pclk_name[] = "pll3_48m_clk"; |
531 | struct clk *gpt_clk, *pclk; | ||
532 | |||
533 | /* get the system timer clock */ | ||
534 | gpt_clk = clk_get_sys("gpt0", NULL); | ||
535 | if (IS_ERR(gpt_clk)) { | ||
536 | pr_err("%s:couldn't get clk for gpt\n", __func__); | ||
537 | BUG(); | ||
538 | } | ||
533 | 539 | ||
534 | /* pad mux initialization */ | 540 | /* get the suitable parent clock for timer*/ |
535 | pmx_driver->base = ioremap(base, size); | 541 | pclk = clk_get(NULL, pclk_name); |
536 | if (!pmx_driver->base) { | 542 | if (IS_ERR(pclk)) { |
537 | ret = -ENOMEM; | 543 | pr_err("%s:couldn't get %s as parent for gpt\n", |
538 | goto pmx_fail; | 544 | __func__, pclk_name); |
545 | BUG(); | ||
539 | } | 546 | } |
540 | 547 | ||
541 | ret = pmx_register(pmx_driver); | 548 | clk_set_parent(gpt_clk, pclk); |
542 | iounmap(pmx_driver->base); | 549 | clk_put(gpt_clk); |
550 | clk_put(pclk); | ||
543 | 551 | ||
544 | pmx_fail: | 552 | spear_setup_timer(); |
545 | if (ret) | ||
546 | printk(KERN_ERR "padmux: registration failed. err no: %d\n", | ||
547 | ret); | ||
548 | } | 553 | } |
554 | |||
555 | struct sys_timer spear3xx_timer = { | ||
556 | .init = spear3xx_timer_init, | ||
557 | }; | ||
diff --git a/arch/arm/mach-spear6xx/clock.c b/arch/arm/mach-spear6xx/clock.c index 36ff056b7321..88b748b5be80 100644 --- a/arch/arm/mach-spear6xx/clock.c +++ b/arch/arm/mach-spear6xx/clock.c | |||
@@ -13,8 +13,8 @@ | |||
13 | 13 | ||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <mach/misc_regs.h> | ||
17 | #include <plat/clock.h> | 16 | #include <plat/clock.h> |
17 | #include <mach/misc_regs.h> | ||
18 | 18 | ||
19 | /* root clks */ | 19 | /* root clks */ |
20 | /* 32 KHz oscillator clock */ | 20 | /* 32 KHz oscillator clock */ |
@@ -39,18 +39,43 @@ static struct clk rtc_clk = { | |||
39 | }; | 39 | }; |
40 | 40 | ||
41 | /* clock derived from 30 MHz osc clk */ | 41 | /* clock derived from 30 MHz osc clk */ |
42 | /* pll masks structure */ | ||
43 | static struct pll_clk_masks pll1_masks = { | ||
44 | .mode_mask = PLL_MODE_MASK, | ||
45 | .mode_shift = PLL_MODE_SHIFT, | ||
46 | .norm_fdbk_m_mask = PLL_NORM_FDBK_M_MASK, | ||
47 | .norm_fdbk_m_shift = PLL_NORM_FDBK_M_SHIFT, | ||
48 | .dith_fdbk_m_mask = PLL_DITH_FDBK_M_MASK, | ||
49 | .dith_fdbk_m_shift = PLL_DITH_FDBK_M_SHIFT, | ||
50 | .div_p_mask = PLL_DIV_P_MASK, | ||
51 | .div_p_shift = PLL_DIV_P_SHIFT, | ||
52 | .div_n_mask = PLL_DIV_N_MASK, | ||
53 | .div_n_shift = PLL_DIV_N_SHIFT, | ||
54 | }; | ||
55 | |||
42 | /* pll1 configuration structure */ | 56 | /* pll1 configuration structure */ |
43 | static struct pll_clk_config pll1_config = { | 57 | static struct pll_clk_config pll1_config = { |
44 | .mode_reg = PLL1_CTR, | 58 | .mode_reg = PLL1_CTR, |
45 | .cfg_reg = PLL1_FRQ, | 59 | .cfg_reg = PLL1_FRQ, |
60 | .masks = &pll1_masks, | ||
61 | }; | ||
62 | |||
63 | /* pll rate configuration table, in ascending order of rates */ | ||
64 | struct pll_rate_tbl pll_rtbl[] = { | ||
65 | {.mode = 0, .m = 0x85, .n = 0x0C, .p = 0x1}, /* 266 MHz */ | ||
66 | {.mode = 0, .m = 0xA6, .n = 0x0C, .p = 0x1}, /* 332 MHz */ | ||
46 | }; | 67 | }; |
47 | 68 | ||
48 | /* PLL1 clock */ | 69 | /* PLL1 clock */ |
49 | static struct clk pll1_clk = { | 70 | static struct clk pll1_clk = { |
71 | .flags = ENABLED_ON_INIT, | ||
50 | .pclk = &osc_30m_clk, | 72 | .pclk = &osc_30m_clk, |
51 | .en_reg = PLL1_CTR, | 73 | .en_reg = PLL1_CTR, |
52 | .en_reg_bit = PLL_ENABLE, | 74 | .en_reg_bit = PLL_ENABLE, |
53 | .recalc = &pll1_clk_recalc, | 75 | .calc_rate = &pll_calc_rate, |
76 | .recalc = &pll_clk_recalc, | ||
77 | .set_rate = &pll_clk_set_rate, | ||
78 | .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1}, | ||
54 | .private_data = &pll1_config, | 79 | .private_data = &pll1_config, |
55 | }; | 80 | }; |
56 | 81 | ||
@@ -76,31 +101,83 @@ static struct clk cpu_clk = { | |||
76 | .recalc = &follow_parent, | 101 | .recalc = &follow_parent, |
77 | }; | 102 | }; |
78 | 103 | ||
104 | /* ahb masks structure */ | ||
105 | static struct bus_clk_masks ahb_masks = { | ||
106 | .mask = PLL_HCLK_RATIO_MASK, | ||
107 | .shift = PLL_HCLK_RATIO_SHIFT, | ||
108 | }; | ||
109 | |||
79 | /* ahb configuration structure */ | 110 | /* ahb configuration structure */ |
80 | static struct bus_clk_config ahb_config = { | 111 | static struct bus_clk_config ahb_config = { |
81 | .reg = CORE_CLK_CFG, | 112 | .reg = CORE_CLK_CFG, |
82 | .mask = PLL_HCLK_RATIO_MASK, | 113 | .masks = &ahb_masks, |
83 | .shift = PLL_HCLK_RATIO_SHIFT, | 114 | }; |
115 | |||
116 | /* ahb rate configuration table, in ascending order of rates */ | ||
117 | struct bus_rate_tbl bus_rtbl[] = { | ||
118 | {.div = 3}, /* == parent divided by 4 */ | ||
119 | {.div = 2}, /* == parent divided by 3 */ | ||
120 | {.div = 1}, /* == parent divided by 2 */ | ||
121 | {.div = 0}, /* == parent divided by 1 */ | ||
84 | }; | 122 | }; |
85 | 123 | ||
86 | /* ahb clock */ | 124 | /* ahb clock */ |
87 | static struct clk ahb_clk = { | 125 | static struct clk ahb_clk = { |
88 | .flags = ALWAYS_ENABLED, | 126 | .flags = ALWAYS_ENABLED, |
89 | .pclk = &pll1_clk, | 127 | .pclk = &pll1_clk, |
128 | .calc_rate = &bus_calc_rate, | ||
90 | .recalc = &bus_clk_recalc, | 129 | .recalc = &bus_clk_recalc, |
130 | .set_rate = &bus_clk_set_rate, | ||
131 | .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2}, | ||
91 | .private_data = &ahb_config, | 132 | .private_data = &ahb_config, |
92 | }; | 133 | }; |
93 | 134 | ||
135 | /* auxiliary synthesizers masks */ | ||
136 | static struct aux_clk_masks aux_masks = { | ||
137 | .eq_sel_mask = AUX_EQ_SEL_MASK, | ||
138 | .eq_sel_shift = AUX_EQ_SEL_SHIFT, | ||
139 | .eq1_mask = AUX_EQ1_SEL, | ||
140 | .eq2_mask = AUX_EQ2_SEL, | ||
141 | .xscale_sel_mask = AUX_XSCALE_MASK, | ||
142 | .xscale_sel_shift = AUX_XSCALE_SHIFT, | ||
143 | .yscale_sel_mask = AUX_YSCALE_MASK, | ||
144 | .yscale_sel_shift = AUX_YSCALE_SHIFT, | ||
145 | }; | ||
146 | |||
147 | /* uart configurations */ | ||
148 | static struct aux_clk_config uart_synth_config = { | ||
149 | .synth_reg = UART_CLK_SYNT, | ||
150 | .masks = &aux_masks, | ||
151 | }; | ||
152 | |||
153 | /* aux rate configuration table, in ascending order of rates */ | ||
154 | struct aux_rate_tbl aux_rtbl[] = { | ||
155 | /* For PLL1 = 332 MHz */ | ||
156 | {.xscale = 1, .yscale = 8, .eq = 1}, /* 41.5 MHz */ | ||
157 | {.xscale = 1, .yscale = 4, .eq = 1}, /* 83 MHz */ | ||
158 | {.xscale = 1, .yscale = 2, .eq = 1}, /* 166 MHz */ | ||
159 | }; | ||
160 | |||
161 | /* uart synth clock */ | ||
162 | static struct clk uart_synth_clk = { | ||
163 | .en_reg = UART_CLK_SYNT, | ||
164 | .en_reg_bit = AUX_SYNT_ENB, | ||
165 | .pclk = &pll1_clk, | ||
166 | .calc_rate = &aux_calc_rate, | ||
167 | .recalc = &aux_clk_recalc, | ||
168 | .set_rate = &aux_clk_set_rate, | ||
169 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2}, | ||
170 | .private_data = &uart_synth_config, | ||
171 | }; | ||
172 | |||
94 | /* uart parents */ | 173 | /* uart parents */ |
95 | static struct pclk_info uart_pclk_info[] = { | 174 | static struct pclk_info uart_pclk_info[] = { |
96 | { | 175 | { |
97 | .pclk = &pll1_clk, | 176 | .pclk = &uart_synth_clk, |
98 | .pclk_mask = AUX_CLK_PLL1_MASK, | 177 | .pclk_val = AUX_CLK_PLL1_VAL, |
99 | .scalable = 1, | ||
100 | }, { | 178 | }, { |
101 | .pclk = &pll3_48m_clk, | 179 | .pclk = &pll3_48m_clk, |
102 | .pclk_mask = AUX_CLK_PLL3_MASK, | 180 | .pclk_val = AUX_CLK_PLL3_VAL, |
103 | .scalable = 0, | ||
104 | }, | 181 | }, |
105 | }; | 182 | }; |
106 | 183 | ||
@@ -112,19 +189,13 @@ static struct pclk_sel uart_pclk_sel = { | |||
112 | .pclk_sel_mask = UART_CLK_MASK, | 189 | .pclk_sel_mask = UART_CLK_MASK, |
113 | }; | 190 | }; |
114 | 191 | ||
115 | /* uart configurations */ | ||
116 | static struct aux_clk_config uart_config = { | ||
117 | .synth_reg = UART_CLK_SYNT, | ||
118 | }; | ||
119 | |||
120 | /* uart0 clock */ | 192 | /* uart0 clock */ |
121 | static struct clk uart0_clk = { | 193 | static struct clk uart0_clk = { |
122 | .en_reg = PERIP1_CLK_ENB, | 194 | .en_reg = PERIP1_CLK_ENB, |
123 | .en_reg_bit = UART0_CLK_ENB, | 195 | .en_reg_bit = UART0_CLK_ENB, |
124 | .pclk_sel = &uart_pclk_sel, | 196 | .pclk_sel = &uart_pclk_sel, |
125 | .pclk_sel_shift = UART_CLK_SHIFT, | 197 | .pclk_sel_shift = UART_CLK_SHIFT, |
126 | .recalc = &aux_clk_recalc, | 198 | .recalc = &follow_parent, |
127 | .private_data = &uart_config, | ||
128 | }; | 199 | }; |
129 | 200 | ||
130 | /* uart1 clock */ | 201 | /* uart1 clock */ |
@@ -133,25 +204,35 @@ static struct clk uart1_clk = { | |||
133 | .en_reg_bit = UART1_CLK_ENB, | 204 | .en_reg_bit = UART1_CLK_ENB, |
134 | .pclk_sel = &uart_pclk_sel, | 205 | .pclk_sel = &uart_pclk_sel, |
135 | .pclk_sel_shift = UART_CLK_SHIFT, | 206 | .pclk_sel_shift = UART_CLK_SHIFT, |
136 | .recalc = &aux_clk_recalc, | 207 | .recalc = &follow_parent, |
137 | .private_data = &uart_config, | ||
138 | }; | 208 | }; |
139 | 209 | ||
140 | /* firda configurations */ | 210 | /* firda configurations */ |
141 | static struct aux_clk_config firda_config = { | 211 | static struct aux_clk_config firda_synth_config = { |
142 | .synth_reg = FIRDA_CLK_SYNT, | 212 | .synth_reg = FIRDA_CLK_SYNT, |
213 | .masks = &aux_masks, | ||
214 | }; | ||
215 | |||
216 | /* firda synth clock */ | ||
217 | static struct clk firda_synth_clk = { | ||
218 | .en_reg = FIRDA_CLK_SYNT, | ||
219 | .en_reg_bit = AUX_SYNT_ENB, | ||
220 | .pclk = &pll1_clk, | ||
221 | .calc_rate = &aux_calc_rate, | ||
222 | .recalc = &aux_clk_recalc, | ||
223 | .set_rate = &aux_clk_set_rate, | ||
224 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2}, | ||
225 | .private_data = &firda_synth_config, | ||
143 | }; | 226 | }; |
144 | 227 | ||
145 | /* firda parents */ | 228 | /* firda parents */ |
146 | static struct pclk_info firda_pclk_info[] = { | 229 | static struct pclk_info firda_pclk_info[] = { |
147 | { | 230 | { |
148 | .pclk = &pll1_clk, | 231 | .pclk = &firda_synth_clk, |
149 | .pclk_mask = AUX_CLK_PLL1_MASK, | 232 | .pclk_val = AUX_CLK_PLL1_VAL, |
150 | .scalable = 1, | ||
151 | }, { | 233 | }, { |
152 | .pclk = &pll3_48m_clk, | 234 | .pclk = &pll3_48m_clk, |
153 | .pclk_mask = AUX_CLK_PLL3_MASK, | 235 | .pclk_val = AUX_CLK_PLL3_VAL, |
154 | .scalable = 0, | ||
155 | }, | 236 | }, |
156 | }; | 237 | }; |
157 | 238 | ||
@@ -169,25 +250,35 @@ static struct clk firda_clk = { | |||
169 | .en_reg_bit = FIRDA_CLK_ENB, | 250 | .en_reg_bit = FIRDA_CLK_ENB, |
170 | .pclk_sel = &firda_pclk_sel, | 251 | .pclk_sel = &firda_pclk_sel, |
171 | .pclk_sel_shift = FIRDA_CLK_SHIFT, | 252 | .pclk_sel_shift = FIRDA_CLK_SHIFT, |
172 | .recalc = &aux_clk_recalc, | 253 | .recalc = &follow_parent, |
173 | .private_data = &firda_config, | ||
174 | }; | 254 | }; |
175 | 255 | ||
176 | /* clcd configurations */ | 256 | /* clcd configurations */ |
177 | static struct aux_clk_config clcd_config = { | 257 | static struct aux_clk_config clcd_synth_config = { |
178 | .synth_reg = CLCD_CLK_SYNT, | 258 | .synth_reg = CLCD_CLK_SYNT, |
259 | .masks = &aux_masks, | ||
260 | }; | ||
261 | |||
262 | /* firda synth clock */ | ||
263 | static struct clk clcd_synth_clk = { | ||
264 | .en_reg = CLCD_CLK_SYNT, | ||
265 | .en_reg_bit = AUX_SYNT_ENB, | ||
266 | .pclk = &pll1_clk, | ||
267 | .calc_rate = &aux_calc_rate, | ||
268 | .recalc = &aux_clk_recalc, | ||
269 | .set_rate = &aux_clk_set_rate, | ||
270 | .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2}, | ||
271 | .private_data = &clcd_synth_config, | ||
179 | }; | 272 | }; |
180 | 273 | ||
181 | /* clcd parents */ | 274 | /* clcd parents */ |
182 | static struct pclk_info clcd_pclk_info[] = { | 275 | static struct pclk_info clcd_pclk_info[] = { |
183 | { | 276 | { |
184 | .pclk = &pll1_clk, | 277 | .pclk = &clcd_synth_clk, |
185 | .pclk_mask = AUX_CLK_PLL1_MASK, | 278 | .pclk_val = AUX_CLK_PLL1_VAL, |
186 | .scalable = 1, | ||
187 | }, { | 279 | }, { |
188 | .pclk = &pll3_48m_clk, | 280 | .pclk = &pll3_48m_clk, |
189 | .pclk_mask = AUX_CLK_PLL3_MASK, | 281 | .pclk_val = AUX_CLK_PLL3_VAL, |
190 | .scalable = 0, | ||
191 | }, | 282 | }, |
192 | }; | 283 | }; |
193 | 284 | ||
@@ -205,82 +296,173 @@ static struct clk clcd_clk = { | |||
205 | .en_reg_bit = CLCD_CLK_ENB, | 296 | .en_reg_bit = CLCD_CLK_ENB, |
206 | .pclk_sel = &clcd_pclk_sel, | 297 | .pclk_sel = &clcd_pclk_sel, |
207 | .pclk_sel_shift = CLCD_CLK_SHIFT, | 298 | .pclk_sel_shift = CLCD_CLK_SHIFT, |
208 | .recalc = &aux_clk_recalc, | 299 | .recalc = &follow_parent, |
209 | .private_data = &clcd_config, | 300 | }; |
301 | |||
302 | /* gpt synthesizer masks */ | ||
303 | static struct gpt_clk_masks gpt_masks = { | ||
304 | .mscale_sel_mask = GPT_MSCALE_MASK, | ||
305 | .mscale_sel_shift = GPT_MSCALE_SHIFT, | ||
306 | .nscale_sel_mask = GPT_NSCALE_MASK, | ||
307 | .nscale_sel_shift = GPT_NSCALE_SHIFT, | ||
308 | }; | ||
309 | |||
310 | /* gpt rate configuration table, in ascending order of rates */ | ||
311 | struct gpt_rate_tbl gpt_rtbl[] = { | ||
312 | /* For pll1 = 332 MHz */ | ||
313 | {.mscale = 4, .nscale = 0}, /* 41.5 MHz */ | ||
314 | {.mscale = 2, .nscale = 0}, /* 55.3 MHz */ | ||
315 | {.mscale = 1, .nscale = 0}, /* 83 MHz */ | ||
316 | }; | ||
317 | |||
318 | /* gpt0 synth clk config*/ | ||
319 | static struct gpt_clk_config gpt0_synth_config = { | ||
320 | .synth_reg = PRSC1_CLK_CFG, | ||
321 | .masks = &gpt_masks, | ||
322 | }; | ||
323 | |||
324 | /* gpt synth clock */ | ||
325 | static struct clk gpt0_synth_clk = { | ||
326 | .flags = ALWAYS_ENABLED, | ||
327 | .pclk = &pll1_clk, | ||
328 | .calc_rate = &gpt_calc_rate, | ||
329 | .recalc = &gpt_clk_recalc, | ||
330 | .set_rate = &gpt_clk_set_rate, | ||
331 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
332 | .private_data = &gpt0_synth_config, | ||
210 | }; | 333 | }; |
211 | 334 | ||
212 | /* gpt parents */ | 335 | /* gpt parents */ |
213 | static struct pclk_info gpt_pclk_info[] = { | 336 | static struct pclk_info gpt0_pclk_info[] = { |
214 | { | 337 | { |
215 | .pclk = &pll1_clk, | 338 | .pclk = &gpt0_synth_clk, |
216 | .pclk_mask = AUX_CLK_PLL1_MASK, | 339 | .pclk_val = AUX_CLK_PLL1_VAL, |
217 | .scalable = 1, | ||
218 | }, { | 340 | }, { |
219 | .pclk = &pll3_48m_clk, | 341 | .pclk = &pll3_48m_clk, |
220 | .pclk_mask = AUX_CLK_PLL3_MASK, | 342 | .pclk_val = AUX_CLK_PLL3_VAL, |
221 | .scalable = 0, | ||
222 | }, | 343 | }, |
223 | }; | 344 | }; |
224 | 345 | ||
225 | /* gpt parent select structure */ | 346 | /* gpt parent select structure */ |
226 | static struct pclk_sel gpt_pclk_sel = { | 347 | static struct pclk_sel gpt0_pclk_sel = { |
227 | .pclk_info = gpt_pclk_info, | 348 | .pclk_info = gpt0_pclk_info, |
228 | .pclk_count = ARRAY_SIZE(gpt_pclk_info), | 349 | .pclk_count = ARRAY_SIZE(gpt0_pclk_info), |
229 | .pclk_sel_reg = PERIP_CLK_CFG, | 350 | .pclk_sel_reg = PERIP_CLK_CFG, |
230 | .pclk_sel_mask = GPT_CLK_MASK, | 351 | .pclk_sel_mask = GPT_CLK_MASK, |
231 | }; | 352 | }; |
232 | 353 | ||
233 | /* gpt0_1 configurations */ | ||
234 | static struct aux_clk_config gpt0_1_config = { | ||
235 | .synth_reg = PRSC1_CLK_CFG, | ||
236 | }; | ||
237 | |||
238 | /* gpt0 ARM1 subsystem timer clock */ | 354 | /* gpt0 ARM1 subsystem timer clock */ |
239 | static struct clk gpt0_clk = { | 355 | static struct clk gpt0_clk = { |
240 | .flags = ALWAYS_ENABLED, | 356 | .flags = ALWAYS_ENABLED, |
241 | .pclk_sel = &gpt_pclk_sel, | 357 | .pclk_sel = &gpt0_pclk_sel, |
242 | .pclk_sel_shift = GPT0_CLK_SHIFT, | 358 | .pclk_sel_shift = GPT0_CLK_SHIFT, |
243 | .recalc = &gpt_clk_recalc, | 359 | .recalc = &follow_parent, |
244 | .private_data = &gpt0_1_config, | 360 | }; |
361 | |||
362 | |||
363 | /* Note: gpt0 and gpt1 share same parent clocks */ | ||
364 | /* gpt parent select structure */ | ||
365 | static struct pclk_sel gpt1_pclk_sel = { | ||
366 | .pclk_info = gpt0_pclk_info, | ||
367 | .pclk_count = ARRAY_SIZE(gpt0_pclk_info), | ||
368 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
369 | .pclk_sel_mask = GPT_CLK_MASK, | ||
245 | }; | 370 | }; |
246 | 371 | ||
247 | /* gpt1 timer clock */ | 372 | /* gpt1 timer clock */ |
248 | static struct clk gpt1_clk = { | 373 | static struct clk gpt1_clk = { |
249 | .flags = ALWAYS_ENABLED, | 374 | .flags = ALWAYS_ENABLED, |
250 | .pclk_sel = &gpt_pclk_sel, | 375 | .pclk_sel = &gpt1_pclk_sel, |
251 | .pclk_sel_shift = GPT1_CLK_SHIFT, | 376 | .pclk_sel_shift = GPT1_CLK_SHIFT, |
252 | .recalc = &gpt_clk_recalc, | 377 | .recalc = &follow_parent, |
253 | .private_data = &gpt0_1_config, | ||
254 | }; | 378 | }; |
255 | 379 | ||
256 | /* gpt2 configurations */ | 380 | /* gpt2 synth clk config*/ |
257 | static struct aux_clk_config gpt2_config = { | 381 | static struct gpt_clk_config gpt2_synth_config = { |
258 | .synth_reg = PRSC2_CLK_CFG, | 382 | .synth_reg = PRSC2_CLK_CFG, |
383 | .masks = &gpt_masks, | ||
384 | }; | ||
385 | |||
386 | /* gpt synth clock */ | ||
387 | static struct clk gpt2_synth_clk = { | ||
388 | .flags = ALWAYS_ENABLED, | ||
389 | .pclk = &pll1_clk, | ||
390 | .calc_rate = &gpt_calc_rate, | ||
391 | .recalc = &gpt_clk_recalc, | ||
392 | .set_rate = &gpt_clk_set_rate, | ||
393 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
394 | .private_data = &gpt2_synth_config, | ||
395 | }; | ||
396 | |||
397 | /* gpt parents */ | ||
398 | static struct pclk_info gpt2_pclk_info[] = { | ||
399 | { | ||
400 | .pclk = &gpt2_synth_clk, | ||
401 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
402 | }, { | ||
403 | .pclk = &pll3_48m_clk, | ||
404 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
405 | }, | ||
406 | }; | ||
407 | |||
408 | /* gpt parent select structure */ | ||
409 | static struct pclk_sel gpt2_pclk_sel = { | ||
410 | .pclk_info = gpt2_pclk_info, | ||
411 | .pclk_count = ARRAY_SIZE(gpt2_pclk_info), | ||
412 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
413 | .pclk_sel_mask = GPT_CLK_MASK, | ||
259 | }; | 414 | }; |
260 | 415 | ||
261 | /* gpt2 timer clock */ | 416 | /* gpt2 timer clock */ |
262 | static struct clk gpt2_clk = { | 417 | static struct clk gpt2_clk = { |
263 | .en_reg = PERIP1_CLK_ENB, | 418 | .flags = ALWAYS_ENABLED, |
264 | .en_reg_bit = GPT2_CLK_ENB, | 419 | .pclk_sel = &gpt2_pclk_sel, |
265 | .pclk_sel = &gpt_pclk_sel, | ||
266 | .pclk_sel_shift = GPT2_CLK_SHIFT, | 420 | .pclk_sel_shift = GPT2_CLK_SHIFT, |
267 | .recalc = &gpt_clk_recalc, | 421 | .recalc = &follow_parent, |
268 | .private_data = &gpt2_config, | ||
269 | }; | 422 | }; |
270 | 423 | ||
271 | /* gpt3 configurations */ | 424 | /* gpt3 synth clk config*/ |
272 | static struct aux_clk_config gpt3_config = { | 425 | static struct gpt_clk_config gpt3_synth_config = { |
273 | .synth_reg = PRSC3_CLK_CFG, | 426 | .synth_reg = PRSC3_CLK_CFG, |
427 | .masks = &gpt_masks, | ||
428 | }; | ||
429 | |||
430 | /* gpt synth clock */ | ||
431 | static struct clk gpt3_synth_clk = { | ||
432 | .flags = ALWAYS_ENABLED, | ||
433 | .pclk = &pll1_clk, | ||
434 | .calc_rate = &gpt_calc_rate, | ||
435 | .recalc = &gpt_clk_recalc, | ||
436 | .set_rate = &gpt_clk_set_rate, | ||
437 | .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2}, | ||
438 | .private_data = &gpt3_synth_config, | ||
439 | }; | ||
440 | |||
441 | /* gpt parents */ | ||
442 | static struct pclk_info gpt3_pclk_info[] = { | ||
443 | { | ||
444 | .pclk = &gpt3_synth_clk, | ||
445 | .pclk_val = AUX_CLK_PLL1_VAL, | ||
446 | }, { | ||
447 | .pclk = &pll3_48m_clk, | ||
448 | .pclk_val = AUX_CLK_PLL3_VAL, | ||
449 | }, | ||
450 | }; | ||
451 | |||
452 | /* gpt parent select structure */ | ||
453 | static struct pclk_sel gpt3_pclk_sel = { | ||
454 | .pclk_info = gpt3_pclk_info, | ||
455 | .pclk_count = ARRAY_SIZE(gpt3_pclk_info), | ||
456 | .pclk_sel_reg = PERIP_CLK_CFG, | ||
457 | .pclk_sel_mask = GPT_CLK_MASK, | ||
274 | }; | 458 | }; |
275 | 459 | ||
276 | /* gpt3 timer clock */ | 460 | /* gpt3 timer clock */ |
277 | static struct clk gpt3_clk = { | 461 | static struct clk gpt3_clk = { |
278 | .en_reg = PERIP1_CLK_ENB, | 462 | .flags = ALWAYS_ENABLED, |
279 | .en_reg_bit = GPT3_CLK_ENB, | 463 | .pclk_sel = &gpt3_pclk_sel, |
280 | .pclk_sel = &gpt_pclk_sel, | ||
281 | .pclk_sel_shift = GPT3_CLK_SHIFT, | 464 | .pclk_sel_shift = GPT3_CLK_SHIFT, |
282 | .recalc = &gpt_clk_recalc, | 465 | .recalc = &follow_parent, |
283 | .private_data = &gpt3_config, | ||
284 | }; | 466 | }; |
285 | 467 | ||
286 | /* clock derived from pll3 clk */ | 468 | /* clock derived from pll3 clk */ |
@@ -309,18 +491,26 @@ static struct clk usbd_clk = { | |||
309 | }; | 491 | }; |
310 | 492 | ||
311 | /* clock derived from ahb clk */ | 493 | /* clock derived from ahb clk */ |
494 | /* apb masks structure */ | ||
495 | static struct bus_clk_masks apb_masks = { | ||
496 | .mask = HCLK_PCLK_RATIO_MASK, | ||
497 | .shift = HCLK_PCLK_RATIO_SHIFT, | ||
498 | }; | ||
499 | |||
312 | /* apb configuration structure */ | 500 | /* apb configuration structure */ |
313 | static struct bus_clk_config apb_config = { | 501 | static struct bus_clk_config apb_config = { |
314 | .reg = CORE_CLK_CFG, | 502 | .reg = CORE_CLK_CFG, |
315 | .mask = HCLK_PCLK_RATIO_MASK, | 503 | .masks = &apb_masks, |
316 | .shift = HCLK_PCLK_RATIO_SHIFT, | ||
317 | }; | 504 | }; |
318 | 505 | ||
319 | /* apb clock */ | 506 | /* apb clock */ |
320 | static struct clk apb_clk = { | 507 | static struct clk apb_clk = { |
321 | .flags = ALWAYS_ENABLED, | 508 | .flags = ALWAYS_ENABLED, |
322 | .pclk = &ahb_clk, | 509 | .pclk = &ahb_clk, |
510 | .calc_rate = &bus_calc_rate, | ||
323 | .recalc = &bus_clk_recalc, | 511 | .recalc = &bus_clk_recalc, |
512 | .set_rate = &bus_clk_set_rate, | ||
513 | .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2}, | ||
324 | .private_data = &apb_config, | 514 | .private_data = &apb_config, |
325 | }; | 515 | }; |
326 | 516 | ||
@@ -432,12 +622,12 @@ static struct clk dummy_apb_pclk; | |||
432 | 622 | ||
433 | /* array of all spear 6xx clock lookups */ | 623 | /* array of all spear 6xx clock lookups */ |
434 | static struct clk_lookup spear_clk_lookups[] = { | 624 | static struct clk_lookup spear_clk_lookups[] = { |
435 | { .con_id = "apb_pclk", .clk = &dummy_apb_pclk}, | 625 | { .con_id = "apb_pclk", .clk = &dummy_apb_pclk}, |
436 | /* root clks */ | 626 | /* root clks */ |
437 | { .con_id = "osc_32k_clk", .clk = &osc_32k_clk}, | 627 | { .con_id = "osc_32k_clk", .clk = &osc_32k_clk}, |
438 | { .con_id = "osc_30m_clk", .clk = &osc_30m_clk}, | 628 | { .con_id = "osc_30m_clk", .clk = &osc_30m_clk}, |
439 | /* clock derived from 32 KHz os clk */ | 629 | /* clock derived from 32 KHz os clk */ |
440 | { .dev_id = "rtc", .clk = &rtc_clk}, | 630 | { .dev_id = "rtc-spear", .clk = &rtc_clk}, |
441 | /* clock derived from 30 MHz os clk */ | 631 | /* clock derived from 30 MHz os clk */ |
442 | { .con_id = "pll1_clk", .clk = &pll1_clk}, | 632 | { .con_id = "pll1_clk", .clk = &pll1_clk}, |
443 | { .con_id = "pll3_48m_clk", .clk = &pll3_48m_clk}, | 633 | { .con_id = "pll3_48m_clk", .clk = &pll3_48m_clk}, |
@@ -445,6 +635,12 @@ static struct clk_lookup spear_clk_lookups[] = { | |||
445 | /* clock derived from pll1 clk */ | 635 | /* clock derived from pll1 clk */ |
446 | { .con_id = "cpu_clk", .clk = &cpu_clk}, | 636 | { .con_id = "cpu_clk", .clk = &cpu_clk}, |
447 | { .con_id = "ahb_clk", .clk = &ahb_clk}, | 637 | { .con_id = "ahb_clk", .clk = &ahb_clk}, |
638 | { .con_id = "uart_synth_clk", .clk = &uart_synth_clk}, | ||
639 | { .con_id = "firda_synth_clk", .clk = &firda_synth_clk}, | ||
640 | { .con_id = "clcd_synth_clk", .clk = &clcd_synth_clk}, | ||
641 | { .con_id = "gpt0_synth_clk", .clk = &gpt0_synth_clk}, | ||
642 | { .con_id = "gpt2_synth_clk", .clk = &gpt2_synth_clk}, | ||
643 | { .con_id = "gpt3_synth_clk", .clk = &gpt3_synth_clk}, | ||
448 | { .dev_id = "uart0", .clk = &uart0_clk}, | 644 | { .dev_id = "uart0", .clk = &uart0_clk}, |
449 | { .dev_id = "uart1", .clk = &uart1_clk}, | 645 | { .dev_id = "uart1", .clk = &uart1_clk}, |
450 | { .dev_id = "firda", .clk = &firda_clk}, | 646 | { .dev_id = "firda", .clk = &firda_clk}, |
@@ -454,22 +650,22 @@ static struct clk_lookup spear_clk_lookups[] = { | |||
454 | { .dev_id = "gpt2", .clk = &gpt2_clk}, | 650 | { .dev_id = "gpt2", .clk = &gpt2_clk}, |
455 | { .dev_id = "gpt3", .clk = &gpt3_clk}, | 651 | { .dev_id = "gpt3", .clk = &gpt3_clk}, |
456 | /* clock derived from pll3 clk */ | 652 | /* clock derived from pll3 clk */ |
457 | { .dev_id = "usbh0", .clk = &usbh0_clk}, | 653 | { .dev_id = "designware_udc", .clk = &usbd_clk}, |
458 | { .dev_id = "usbh1", .clk = &usbh1_clk}, | 654 | { .con_id = "usbh.0_clk", .clk = &usbh0_clk}, |
459 | { .dev_id = "usbd", .clk = &usbd_clk}, | 655 | { .con_id = "usbh.1_clk", .clk = &usbh1_clk}, |
460 | /* clock derived from ahb clk */ | 656 | /* clock derived from ahb clk */ |
461 | { .con_id = "apb_clk", .clk = &apb_clk}, | 657 | { .con_id = "apb_clk", .clk = &apb_clk}, |
462 | { .dev_id = "i2c", .clk = &i2c_clk}, | 658 | { .dev_id = "i2c_designware.0", .clk = &i2c_clk}, |
463 | { .dev_id = "dma", .clk = &dma_clk}, | 659 | { .dev_id = "dma", .clk = &dma_clk}, |
464 | { .dev_id = "jpeg", .clk = &jpeg_clk}, | 660 | { .dev_id = "jpeg", .clk = &jpeg_clk}, |
465 | { .dev_id = "gmac", .clk = &gmac_clk}, | 661 | { .dev_id = "gmac", .clk = &gmac_clk}, |
466 | { .dev_id = "smi", .clk = &smi_clk}, | 662 | { .dev_id = "smi", .clk = &smi_clk}, |
467 | { .dev_id = "fsmc", .clk = &fsmc_clk}, | 663 | { .con_id = "fsmc", .clk = &fsmc_clk}, |
468 | /* clock derived from apb clk */ | 664 | /* clock derived from apb clk */ |
469 | { .dev_id = "adc", .clk = &adc_clk}, | 665 | { .dev_id = "adc", .clk = &adc_clk}, |
470 | { .dev_id = "ssp0", .clk = &ssp0_clk}, | 666 | { .dev_id = "ssp-pl022.0", .clk = &ssp0_clk}, |
471 | { .dev_id = "ssp1", .clk = &ssp1_clk}, | 667 | { .dev_id = "ssp-pl022.1", .clk = &ssp1_clk}, |
472 | { .dev_id = "ssp2", .clk = &ssp2_clk}, | 668 | { .dev_id = "ssp-pl022.2", .clk = &ssp2_clk}, |
473 | { .dev_id = "gpio0", .clk = &gpio0_clk}, | 669 | { .dev_id = "gpio0", .clk = &gpio0_clk}, |
474 | { .dev_id = "gpio1", .clk = &gpio1_clk}, | 670 | { .dev_id = "gpio1", .clk = &gpio1_clk}, |
475 | { .dev_id = "gpio2", .clk = &gpio2_clk}, | 671 | { .dev_id = "gpio2", .clk = &gpio2_clk}, |
diff --git a/arch/arm/mach-spear6xx/include/mach/entry-macro.S b/arch/arm/mach-spear6xx/include/mach/entry-macro.S index 9eaecaeafcf0..8a0b0ed7b203 100644 --- a/arch/arm/mach-spear6xx/include/mach/entry-macro.S +++ b/arch/arm/mach-spear6xx/include/mach/entry-macro.S | |||
@@ -11,9 +11,8 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <mach/hardware.h> | ||
15 | #include <mach/spear.h> | ||
16 | #include <asm/hardware/vic.h> | 14 | #include <asm/hardware/vic.h> |
15 | #include <mach/hardware.h> | ||
17 | 16 | ||
18 | .macro disable_fiq | 17 | .macro disable_fiq |
19 | .endm | 18 | .endm |
diff --git a/arch/arm/mach-spear6xx/include/mach/generic.h b/arch/arm/mach-spear6xx/include/mach/generic.h index 16205a538756..94cf4a648b57 100644 --- a/arch/arm/mach-spear6xx/include/mach/generic.h +++ b/arch/arm/mach-spear6xx/include/mach/generic.h | |||
@@ -14,11 +14,11 @@ | |||
14 | #ifndef __MACH_GENERIC_H | 14 | #ifndef __MACH_GENERIC_H |
15 | #define __MACH_GENERIC_H | 15 | #define __MACH_GENERIC_H |
16 | 16 | ||
17 | #include <asm/mach/time.h> | ||
18 | #include <asm/mach/map.h> | ||
19 | #include <linux/init.h> | 17 | #include <linux/init.h> |
20 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
21 | #include <linux/amba/bus.h> | 19 | #include <linux/amba/bus.h> |
20 | #include <asm/mach/time.h> | ||
21 | #include <asm/mach/map.h> | ||
22 | 22 | ||
23 | /* | 23 | /* |
24 | * Each GPT has 2 timer channels | 24 | * Each GPT has 2 timer channels |
@@ -31,9 +31,10 @@ | |||
31 | /* Add spear6xx family device structure declarations here */ | 31 | /* Add spear6xx family device structure declarations here */ |
32 | extern struct amba_device gpio_device[]; | 32 | extern struct amba_device gpio_device[]; |
33 | extern struct amba_device uart_device[]; | 33 | extern struct amba_device uart_device[]; |
34 | extern struct sys_timer spear_sys_timer; | 34 | extern struct sys_timer spear6xx_timer; |
35 | 35 | ||
36 | /* Add spear6xx family function declarations here */ | 36 | /* Add spear6xx family function declarations here */ |
37 | void __init spear_setup_timer(void); | ||
37 | void __init spear6xx_map_io(void); | 38 | void __init spear6xx_map_io(void); |
38 | void __init spear6xx_init_irq(void); | 39 | void __init spear6xx_init_irq(void); |
39 | void __init spear6xx_init(void); | 40 | void __init spear6xx_init(void); |
diff --git a/arch/arm/mach-spear6xx/include/mach/hardware.h b/arch/arm/mach-spear6xx/include/mach/hardware.h index 7545116deca9..0b3f96ae2848 100644 --- a/arch/arm/mach-spear6xx/include/mach/hardware.h +++ b/arch/arm/mach-spear6xx/include/mach/hardware.h | |||
@@ -14,8 +14,10 @@ | |||
14 | #ifndef __MACH_HARDWARE_H | 14 | #ifndef __MACH_HARDWARE_H |
15 | #define __MACH_HARDWARE_H | 15 | #define __MACH_HARDWARE_H |
16 | 16 | ||
17 | #include <plat/hardware.h> | ||
18 | #include <mach/spear.h> | ||
19 | |||
17 | /* Vitual to physical translation of statically mapped space */ | 20 | /* Vitual to physical translation of statically mapped space */ |
18 | #define IO_ADDRESS(x) (x | 0xF0000000) | 21 | #define IO_ADDRESS(x) (x | 0xF0000000) |
19 | 22 | ||
20 | #endif /* __MACH_HARDWARE_H */ | 23 | #endif /* __MACH_HARDWARE_H */ |
21 | |||
diff --git a/arch/arm/mach-spear6xx/include/mach/misc_regs.h b/arch/arm/mach-spear6xx/include/mach/misc_regs.h index 03908036b0d0..68c20a007b0d 100644 --- a/arch/arm/mach-spear6xx/include/mach/misc_regs.h +++ b/arch/arm/mach-spear6xx/include/mach/misc_regs.h | |||
@@ -14,16 +14,16 @@ | |||
14 | #ifndef __MACH_MISC_REGS_H | 14 | #ifndef __MACH_MISC_REGS_H |
15 | #define __MACH_MISC_REGS_H | 15 | #define __MACH_MISC_REGS_H |
16 | 16 | ||
17 | #include <mach/spear.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | #define MISC_BASE VA_SPEAR6XX_ICM3_MISC_REG_BASE | 19 | #define MISC_BASE IOMEM(VA_SPEAR6XX_ICM3_MISC_REG_BASE) |
20 | 20 | ||
21 | #define SOC_CFG_CTR ((unsigned int *)(MISC_BASE + 0x000)) | 21 | #define SOC_CFG_CTR (MISC_BASE + 0x000) |
22 | #define DIAG_CFG_CTR ((unsigned int *)(MISC_BASE + 0x004)) | 22 | #define DIAG_CFG_CTR (MISC_BASE + 0x004) |
23 | #define PLL1_CTR ((unsigned int *)(MISC_BASE + 0x008)) | 23 | #define PLL1_CTR (MISC_BASE + 0x008) |
24 | #define PLL1_FRQ ((unsigned int *)(MISC_BASE + 0x00C)) | 24 | #define PLL1_FRQ (MISC_BASE + 0x00C) |
25 | #define PLL1_MOD ((unsigned int *)(MISC_BASE + 0x010)) | 25 | #define PLL1_MOD (MISC_BASE + 0x010) |
26 | #define PLL2_CTR ((unsigned int *)(MISC_BASE + 0x014)) | 26 | #define PLL2_CTR (MISC_BASE + 0x014) |
27 | /* PLL_CTR register masks */ | 27 | /* PLL_CTR register masks */ |
28 | #define PLL_ENABLE 2 | 28 | #define PLL_ENABLE 2 |
29 | #define PLL_MODE_SHIFT 4 | 29 | #define PLL_MODE_SHIFT 4 |
@@ -33,7 +33,7 @@ | |||
33 | #define PLL_MODE_DITH_DSB 2 | 33 | #define PLL_MODE_DITH_DSB 2 |
34 | #define PLL_MODE_DITH_SSB 3 | 34 | #define PLL_MODE_DITH_SSB 3 |
35 | 35 | ||
36 | #define PLL2_FRQ ((unsigned int *)(MISC_BASE + 0x018)) | 36 | #define PLL2_FRQ (MISC_BASE + 0x018) |
37 | /* PLL FRQ register masks */ | 37 | /* PLL FRQ register masks */ |
38 | #define PLL_DIV_N_SHIFT 0 | 38 | #define PLL_DIV_N_SHIFT 0 |
39 | #define PLL_DIV_N_MASK 0xFF | 39 | #define PLL_DIV_N_MASK 0xFF |
@@ -44,16 +44,16 @@ | |||
44 | #define PLL_DITH_FDBK_M_SHIFT 16 | 44 | #define PLL_DITH_FDBK_M_SHIFT 16 |
45 | #define PLL_DITH_FDBK_M_MASK 0xFFFF | 45 | #define PLL_DITH_FDBK_M_MASK 0xFFFF |
46 | 46 | ||
47 | #define PLL2_MOD ((unsigned int *)(MISC_BASE + 0x01C)) | 47 | #define PLL2_MOD (MISC_BASE + 0x01C) |
48 | #define PLL_CLK_CFG ((unsigned int *)(MISC_BASE + 0x020)) | 48 | #define PLL_CLK_CFG (MISC_BASE + 0x020) |
49 | #define CORE_CLK_CFG ((unsigned int *)(MISC_BASE + 0x024)) | 49 | #define CORE_CLK_CFG (MISC_BASE + 0x024) |
50 | /* CORE CLK CFG register masks */ | 50 | /* CORE CLK CFG register masks */ |
51 | #define PLL_HCLK_RATIO_SHIFT 10 | 51 | #define PLL_HCLK_RATIO_SHIFT 10 |
52 | #define PLL_HCLK_RATIO_MASK 0x3 | 52 | #define PLL_HCLK_RATIO_MASK 0x3 |
53 | #define HCLK_PCLK_RATIO_SHIFT 8 | 53 | #define HCLK_PCLK_RATIO_SHIFT 8 |
54 | #define HCLK_PCLK_RATIO_MASK 0x3 | 54 | #define HCLK_PCLK_RATIO_MASK 0x3 |
55 | 55 | ||
56 | #define PERIP_CLK_CFG ((unsigned int *)(MISC_BASE + 0x028)) | 56 | #define PERIP_CLK_CFG (MISC_BASE + 0x028) |
57 | /* PERIP_CLK_CFG register masks */ | 57 | /* PERIP_CLK_CFG register masks */ |
58 | #define CLCD_CLK_SHIFT 2 | 58 | #define CLCD_CLK_SHIFT 2 |
59 | #define CLCD_CLK_MASK 0x3 | 59 | #define CLCD_CLK_MASK 0x3 |
@@ -66,10 +66,10 @@ | |||
66 | #define GPT2_CLK_SHIFT 11 | 66 | #define GPT2_CLK_SHIFT 11 |
67 | #define GPT3_CLK_SHIFT 12 | 67 | #define GPT3_CLK_SHIFT 12 |
68 | #define GPT_CLK_MASK 0x1 | 68 | #define GPT_CLK_MASK 0x1 |
69 | #define AUX_CLK_PLL3_MASK 0 | 69 | #define AUX_CLK_PLL3_VAL 0 |
70 | #define AUX_CLK_PLL1_MASK 1 | 70 | #define AUX_CLK_PLL1_VAL 1 |
71 | 71 | ||
72 | #define PERIP1_CLK_ENB ((unsigned int *)(MISC_BASE + 0x02C)) | 72 | #define PERIP1_CLK_ENB (MISC_BASE + 0x02C) |
73 | /* PERIP1_CLK_ENB register masks */ | 73 | /* PERIP1_CLK_ENB register masks */ |
74 | #define UART0_CLK_ENB 3 | 74 | #define UART0_CLK_ENB 3 |
75 | #define UART1_CLK_ENB 4 | 75 | #define UART1_CLK_ENB 4 |
@@ -95,34 +95,35 @@ | |||
95 | #define USBH0_CLK_ENB 25 | 95 | #define USBH0_CLK_ENB 25 |
96 | #define USBH1_CLK_ENB 26 | 96 | #define USBH1_CLK_ENB 26 |
97 | 97 | ||
98 | #define SOC_CORE_ID ((unsigned int *)(MISC_BASE + 0x030)) | 98 | #define SOC_CORE_ID (MISC_BASE + 0x030) |
99 | #define RAS_CLK_ENB ((unsigned int *)(MISC_BASE + 0x034)) | 99 | #define RAS_CLK_ENB (MISC_BASE + 0x034) |
100 | #define PERIP1_SOF_RST ((unsigned int *)(MISC_BASE + 0x038)) | 100 | #define PERIP1_SOF_RST (MISC_BASE + 0x038) |
101 | /* PERIP1_SOF_RST register masks */ | 101 | /* PERIP1_SOF_RST register masks */ |
102 | #define JPEG_SOF_RST 8 | 102 | #define JPEG_SOF_RST 8 |
103 | 103 | ||
104 | #define SOC_USER_ID ((unsigned int *)(MISC_BASE + 0x03C)) | 104 | #define SOC_USER_ID (MISC_BASE + 0x03C) |
105 | #define RAS_SOF_RST ((unsigned int *)(MISC_BASE + 0x040)) | 105 | #define RAS_SOF_RST (MISC_BASE + 0x040) |
106 | #define PRSC1_CLK_CFG ((unsigned int *)(MISC_BASE + 0x044)) | 106 | #define PRSC1_CLK_CFG (MISC_BASE + 0x044) |
107 | #define PRSC2_CLK_CFG ((unsigned int *)(MISC_BASE + 0x048)) | 107 | #define PRSC2_CLK_CFG (MISC_BASE + 0x048) |
108 | #define PRSC3_CLK_CFG ((unsigned int *)(MISC_BASE + 0x04C)) | 108 | #define PRSC3_CLK_CFG (MISC_BASE + 0x04C) |
109 | /* gpt synthesizer register masks */ | 109 | /* gpt synthesizer register masks */ |
110 | #define GPT_MSCALE_SHIFT 0 | 110 | #define GPT_MSCALE_SHIFT 0 |
111 | #define GPT_MSCALE_MASK 0xFFF | 111 | #define GPT_MSCALE_MASK 0xFFF |
112 | #define GPT_NSCALE_SHIFT 12 | 112 | #define GPT_NSCALE_SHIFT 12 |
113 | #define GPT_NSCALE_MASK 0xF | 113 | #define GPT_NSCALE_MASK 0xF |
114 | 114 | ||
115 | #define AMEM_CLK_CFG ((unsigned int *)(MISC_BASE + 0x050)) | 115 | #define AMEM_CLK_CFG (MISC_BASE + 0x050) |
116 | #define EXPI_CLK_CFG ((unsigned int *)(MISC_BASE + 0x054)) | 116 | #define EXPI_CLK_CFG (MISC_BASE + 0x054) |
117 | #define CLCD_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x05C)) | 117 | #define CLCD_CLK_SYNT (MISC_BASE + 0x05C) |
118 | #define FIRDA_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x060)) | 118 | #define FIRDA_CLK_SYNT (MISC_BASE + 0x060) |
119 | #define UART_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x064)) | 119 | #define UART_CLK_SYNT (MISC_BASE + 0x064) |
120 | #define GMAC_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x068)) | 120 | #define GMAC_CLK_SYNT (MISC_BASE + 0x068) |
121 | #define RAS1_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x06C)) | 121 | #define RAS1_CLK_SYNT (MISC_BASE + 0x06C) |
122 | #define RAS2_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x070)) | 122 | #define RAS2_CLK_SYNT (MISC_BASE + 0x070) |
123 | #define RAS3_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x074)) | 123 | #define RAS3_CLK_SYNT (MISC_BASE + 0x074) |
124 | #define RAS4_CLK_SYNT ((unsigned int *)(MISC_BASE + 0x078)) | 124 | #define RAS4_CLK_SYNT (MISC_BASE + 0x078) |
125 | /* aux clk synthesiser register masks for irda to ras4 */ | 125 | /* aux clk synthesiser register masks for irda to ras4 */ |
126 | #define AUX_SYNT_ENB 31 | ||
126 | #define AUX_EQ_SEL_SHIFT 30 | 127 | #define AUX_EQ_SEL_SHIFT 30 |
127 | #define AUX_EQ_SEL_MASK 1 | 128 | #define AUX_EQ_SEL_MASK 1 |
128 | #define AUX_EQ1_SEL 0 | 129 | #define AUX_EQ1_SEL 0 |
@@ -132,42 +133,42 @@ | |||
132 | #define AUX_YSCALE_SHIFT 0 | 133 | #define AUX_YSCALE_SHIFT 0 |
133 | #define AUX_YSCALE_MASK 0xFFF | 134 | #define AUX_YSCALE_MASK 0xFFF |
134 | 135 | ||
135 | #define ICM1_ARB_CFG ((unsigned int *)(MISC_BASE + 0x07C)) | 136 | #define ICM1_ARB_CFG (MISC_BASE + 0x07C) |
136 | #define ICM2_ARB_CFG ((unsigned int *)(MISC_BASE + 0x080)) | 137 | #define ICM2_ARB_CFG (MISC_BASE + 0x080) |
137 | #define ICM3_ARB_CFG ((unsigned int *)(MISC_BASE + 0x084)) | 138 | #define ICM3_ARB_CFG (MISC_BASE + 0x084) |
138 | #define ICM4_ARB_CFG ((unsigned int *)(MISC_BASE + 0x088)) | 139 | #define ICM4_ARB_CFG (MISC_BASE + 0x088) |
139 | #define ICM5_ARB_CFG ((unsigned int *)(MISC_BASE + 0x08C)) | 140 | #define ICM5_ARB_CFG (MISC_BASE + 0x08C) |
140 | #define ICM6_ARB_CFG ((unsigned int *)(MISC_BASE + 0x090)) | 141 | #define ICM6_ARB_CFG (MISC_BASE + 0x090) |
141 | #define ICM7_ARB_CFG ((unsigned int *)(MISC_BASE + 0x094)) | 142 | #define ICM7_ARB_CFG (MISC_BASE + 0x094) |
142 | #define ICM8_ARB_CFG ((unsigned int *)(MISC_BASE + 0x098)) | 143 | #define ICM8_ARB_CFG (MISC_BASE + 0x098) |
143 | #define ICM9_ARB_CFG ((unsigned int *)(MISC_BASE + 0x09C)) | 144 | #define ICM9_ARB_CFG (MISC_BASE + 0x09C) |
144 | #define DMA_CHN_CFG ((unsigned int *)(MISC_BASE + 0x0A0)) | 145 | #define DMA_CHN_CFG (MISC_BASE + 0x0A0) |
145 | #define USB2_PHY_CFG ((unsigned int *)(MISC_BASE + 0x0A4)) | 146 | #define USB2_PHY_CFG (MISC_BASE + 0x0A4) |
146 | #define GMAC_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0A8)) | 147 | #define GMAC_CFG_CTR (MISC_BASE + 0x0A8) |
147 | #define EXPI_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0AC)) | 148 | #define EXPI_CFG_CTR (MISC_BASE + 0x0AC) |
148 | #define PRC1_LOCK_CTR ((unsigned int *)(MISC_BASE + 0x0C0)) | 149 | #define PRC1_LOCK_CTR (MISC_BASE + 0x0C0) |
149 | #define PRC2_LOCK_CTR ((unsigned int *)(MISC_BASE + 0x0C4)) | 150 | #define PRC2_LOCK_CTR (MISC_BASE + 0x0C4) |
150 | #define PRC3_LOCK_CTR ((unsigned int *)(MISC_BASE + 0x0C8)) | 151 | #define PRC3_LOCK_CTR (MISC_BASE + 0x0C8) |
151 | #define PRC4_LOCK_CTR ((unsigned int *)(MISC_BASE + 0x0CC)) | 152 | #define PRC4_LOCK_CTR (MISC_BASE + 0x0CC) |
152 | #define PRC1_IRQ_CTR ((unsigned int *)(MISC_BASE + 0x0D0)) | 153 | #define PRC1_IRQ_CTR (MISC_BASE + 0x0D0) |
153 | #define PRC2_IRQ_CTR ((unsigned int *)(MISC_BASE + 0x0D4)) | 154 | #define PRC2_IRQ_CTR (MISC_BASE + 0x0D4) |
154 | #define PRC3_IRQ_CTR ((unsigned int *)(MISC_BASE + 0x0D8)) | 155 | #define PRC3_IRQ_CTR (MISC_BASE + 0x0D8) |
155 | #define PRC4_IRQ_CTR ((unsigned int *)(MISC_BASE + 0x0DC)) | 156 | #define PRC4_IRQ_CTR (MISC_BASE + 0x0DC) |
156 | #define PWRDOWN_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0E0)) | 157 | #define PWRDOWN_CFG_CTR (MISC_BASE + 0x0E0) |
157 | #define COMPSSTL_1V8_CFG ((unsigned int *)(MISC_BASE + 0x0E4)) | 158 | #define COMPSSTL_1V8_CFG (MISC_BASE + 0x0E4) |
158 | #define COMPSSTL_2V5_CFG ((unsigned int *)(MISC_BASE + 0x0E8)) | 159 | #define COMPSSTL_2V5_CFG (MISC_BASE + 0x0E8) |
159 | #define COMPCOR_3V3_CFG ((unsigned int *)(MISC_BASE + 0x0EC)) | 160 | #define COMPCOR_3V3_CFG (MISC_BASE + 0x0EC) |
160 | #define SSTLPAD_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0F0)) | 161 | #define SSTLPAD_CFG_CTR (MISC_BASE + 0x0F0) |
161 | #define BIST1_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0F4)) | 162 | #define BIST1_CFG_CTR (MISC_BASE + 0x0F4) |
162 | #define BIST2_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0F8)) | 163 | #define BIST2_CFG_CTR (MISC_BASE + 0x0F8) |
163 | #define BIST3_CFG_CTR ((unsigned int *)(MISC_BASE + 0x0FC)) | 164 | #define BIST3_CFG_CTR (MISC_BASE + 0x0FC) |
164 | #define BIST4_CFG_CTR ((unsigned int *)(MISC_BASE + 0x100)) | 165 | #define BIST4_CFG_CTR (MISC_BASE + 0x100) |
165 | #define BIST5_CFG_CTR ((unsigned int *)(MISC_BASE + 0x104)) | 166 | #define BIST5_CFG_CTR (MISC_BASE + 0x104) |
166 | #define BIST1_STS_RES ((unsigned int *)(MISC_BASE + 0x108)) | 167 | #define BIST1_STS_RES (MISC_BASE + 0x108) |
167 | #define BIST2_STS_RES ((unsigned int *)(MISC_BASE + 0x10C)) | 168 | #define BIST2_STS_RES (MISC_BASE + 0x10C) |
168 | #define BIST3_STS_RES ((unsigned int *)(MISC_BASE + 0x110)) | 169 | #define BIST3_STS_RES (MISC_BASE + 0x110) |
169 | #define BIST4_STS_RES ((unsigned int *)(MISC_BASE + 0x114)) | 170 | #define BIST4_STS_RES (MISC_BASE + 0x114) |
170 | #define BIST5_STS_RES ((unsigned int *)(MISC_BASE + 0x118)) | 171 | #define BIST5_STS_RES (MISC_BASE + 0x118) |
171 | #define SYSERR_CFG_CTR ((unsigned int *)(MISC_BASE + 0x11C)) | 172 | #define SYSERR_CFG_CTR (MISC_BASE + 0x11C) |
172 | 173 | ||
173 | #endif /* __MACH_MISC_REGS_H */ | 174 | #endif /* __MACH_MISC_REGS_H */ |
diff --git a/arch/arm/mach-spear6xx/include/mach/spear.h b/arch/arm/mach-spear6xx/include/mach/spear.h index a835f5b6b182..7fd621532def 100644 --- a/arch/arm/mach-spear6xx/include/mach/spear.h +++ b/arch/arm/mach-spear6xx/include/mach/spear.h | |||
@@ -14,153 +14,70 @@ | |||
14 | #ifndef __MACH_SPEAR6XX_H | 14 | #ifndef __MACH_SPEAR6XX_H |
15 | #define __MACH_SPEAR6XX_H | 15 | #define __MACH_SPEAR6XX_H |
16 | 16 | ||
17 | #include <mach/hardware.h> | 17 | #include <asm/memory.h> |
18 | #include <mach/spear600.h> | 18 | #include <mach/spear600.h> |
19 | 19 | ||
20 | #define SPEAR6XX_ML_SDRAM_BASE 0x00000000 | 20 | #define SPEAR6XX_ML_SDRAM_BASE UL(0x00000000) |
21 | #define SPEAR6XX_ML_SDRAM_SIZE 0x40000000 | ||
22 | |||
23 | /* ICM1 - Low speed connection */ | 21 | /* ICM1 - Low speed connection */ |
24 | #define SPEAR6XX_ICM1_BASE 0xD0000000 | 22 | #define SPEAR6XX_ICM1_BASE UL(0xD0000000) |
25 | #define SPEAR6XX_ICM1_SIZE 0x08000000 | ||
26 | 23 | ||
27 | #define SPEAR6XX_ICM1_UART0_BASE 0xD0000000 | 24 | #define SPEAR6XX_ICM1_UART0_BASE UL(0xD0000000) |
28 | #define VA_SPEAR6XX_ICM1_UART0_BASE IO_ADDRESS(SPEAR6XX_ICM1_UART0_BASE) | 25 | #define VA_SPEAR6XX_ICM1_UART0_BASE IO_ADDRESS(SPEAR6XX_ICM1_UART0_BASE) |
29 | #define SPEAR6XX_ICM1_UART0_SIZE 0x00080000 | ||
30 | |||
31 | #define SPEAR6XX_ICM1_UART1_BASE 0xD0080000 | ||
32 | #define SPEAR6XX_ICM1_UART1_SIZE 0x00080000 | ||
33 | |||
34 | #define SPEAR6XX_ICM1_SSP0_BASE 0xD0100000 | ||
35 | #define SPEAR6XX_ICM1_SSP0_SIZE 0x00080000 | ||
36 | |||
37 | #define SPEAR6XX_ICM1_SSP1_BASE 0xD0180000 | ||
38 | #define SPEAR6XX_ICM1_SSP1_SIZE 0x00080000 | ||
39 | |||
40 | #define SPEAR6XX_ICM1_I2C_BASE 0xD0200000 | ||
41 | #define SPEAR6XX_ICM1_I2C_SIZE 0x00080000 | ||
42 | 26 | ||
43 | #define SPEAR6XX_ICM1_JPEG_BASE 0xD0800000 | 27 | #define SPEAR6XX_ICM1_UART1_BASE UL(0xD0080000) |
44 | #define SPEAR6XX_ICM1_JPEG_SIZE 0x00800000 | 28 | #define SPEAR6XX_ICM1_SSP0_BASE UL(0xD0100000) |
45 | 29 | #define SPEAR6XX_ICM1_SSP1_BASE UL(0xD0180000) | |
46 | #define SPEAR6XX_ICM1_IRDA_BASE 0xD1000000 | 30 | #define SPEAR6XX_ICM1_I2C_BASE UL(0xD0200000) |
47 | #define SPEAR6XX_ICM1_IRDA_SIZE 0x00800000 | 31 | #define SPEAR6XX_ICM1_JPEG_BASE UL(0xD0800000) |
48 | 32 | #define SPEAR6XX_ICM1_IRDA_BASE UL(0xD1000000) | |
49 | #define SPEAR6XX_ICM1_FSMC_BASE 0xD1800000 | 33 | #define SPEAR6XX_ICM1_FSMC_BASE UL(0xD1800000) |
50 | #define SPEAR6XX_ICM1_FSMC_SIZE 0x00800000 | 34 | #define SPEAR6XX_ICM1_NAND_BASE UL(0xD2000000) |
51 | 35 | #define SPEAR6XX_ICM1_SRAM_BASE UL(0xD2800000) | |
52 | #define SPEAR6XX_ICM1_NAND_BASE 0xD2000000 | ||
53 | #define SPEAR6XX_ICM1_NAND_SIZE 0x00800000 | ||
54 | |||
55 | #define SPEAR6XX_ICM1_SRAM_BASE 0xD2800000 | ||
56 | #define SPEAR6XX_ICM1_SRAM_SIZE 0x00800000 | ||
57 | 36 | ||
58 | /* ICM2 - Application Subsystem */ | 37 | /* ICM2 - Application Subsystem */ |
59 | #define SPEAR6XX_ICM2_BASE 0xD8000000 | 38 | #define SPEAR6XX_ICM2_BASE UL(0xD8000000) |
60 | #define SPEAR6XX_ICM2_SIZE 0x08000000 | 39 | #define SPEAR6XX_ICM2_TMR0_BASE UL(0xD8000000) |
61 | 40 | #define SPEAR6XX_ICM2_TMR1_BASE UL(0xD8080000) | |
62 | #define SPEAR6XX_ICM2_TMR0_BASE 0xD8000000 | 41 | #define SPEAR6XX_ICM2_GPIO_BASE UL(0xD8100000) |
63 | #define SPEAR6XX_ICM2_TMR0_SIZE 0x00080000 | 42 | #define SPEAR6XX_ICM2_SSP2_BASE UL(0xD8180000) |
64 | 43 | #define SPEAR6XX_ICM2_ADC_BASE UL(0xD8200000) | |
65 | #define SPEAR6XX_ICM2_TMR1_BASE 0xD8080000 | ||
66 | #define SPEAR6XX_ICM2_TMR1_SIZE 0x00080000 | ||
67 | |||
68 | #define SPEAR6XX_ICM2_GPIO_BASE 0xD8100000 | ||
69 | #define SPEAR6XX_ICM2_GPIO_SIZE 0x00080000 | ||
70 | |||
71 | #define SPEAR6XX_ICM2_SPI2_BASE 0xD8180000 | ||
72 | #define SPEAR6XX_ICM2_SPI2_SIZE 0x00080000 | ||
73 | |||
74 | #define SPEAR6XX_ICM2_ADC_BASE 0xD8200000 | ||
75 | #define SPEAR6XX_ICM2_ADC_SIZE 0x00080000 | ||
76 | 44 | ||
77 | /* ML-1, 2 - Multi Layer CPU Subsystem */ | 45 | /* ML-1, 2 - Multi Layer CPU Subsystem */ |
78 | #define SPEAR6XX_ML_CPU_BASE 0xF0000000 | 46 | #define SPEAR6XX_ML_CPU_BASE UL(0xF0000000) |
79 | #define SPEAR6XX_ML_CPU_SIZE 0x08000000 | 47 | #define SPEAR6XX_CPU_TMR_BASE UL(0xF0000000) |
80 | 48 | #define SPEAR6XX_CPU_GPIO_BASE UL(0xF0100000) | |
81 | #define SPEAR6XX_CPU_TMR_BASE 0xF0000000 | 49 | #define SPEAR6XX_CPU_VIC_SEC_BASE UL(0xF1000000) |
82 | #define SPEAR6XX_CPU_TMR_SIZE 0x00100000 | ||
83 | |||
84 | #define SPEAR6XX_CPU_GPIO_BASE 0xF0100000 | ||
85 | #define SPEAR6XX_CPU_GPIO_SIZE 0x00100000 | ||
86 | |||
87 | #define SPEAR6XX_CPU_VIC_SEC_BASE 0xF1000000 | ||
88 | #define VA_SPEAR6XX_CPU_VIC_SEC_BASE IO_ADDRESS(SPEAR6XX_CPU_VIC_SEC_BASE) | 50 | #define VA_SPEAR6XX_CPU_VIC_SEC_BASE IO_ADDRESS(SPEAR6XX_CPU_VIC_SEC_BASE) |
89 | #define SPEAR6XX_CPU_VIC_SEC_SIZE 0x00100000 | 51 | #define SPEAR6XX_CPU_VIC_PRI_BASE UL(0xF1100000) |
90 | |||
91 | #define SPEAR6XX_CPU_VIC_PRI_BASE 0xF1100000 | ||
92 | #define VA_SPEAR6XX_CPU_VIC_PRI_BASE IO_ADDRESS(SPEAR6XX_CPU_VIC_PRI_BASE) | 52 | #define VA_SPEAR6XX_CPU_VIC_PRI_BASE IO_ADDRESS(SPEAR6XX_CPU_VIC_PRI_BASE) |
93 | #define SPEAR6XX_CPU_VIC_PRI_SIZE 0x00100000 | ||
94 | 53 | ||
95 | /* ICM3 - Basic Subsystem */ | 54 | /* ICM3 - Basic Subsystem */ |
96 | #define SPEAR6XX_ICM3_BASE 0xF8000000 | 55 | #define SPEAR6XX_ICM3_BASE UL(0xF8000000) |
97 | #define SPEAR6XX_ICM3_SIZE 0x08000000 | 56 | #define SPEAR6XX_ICM3_SMEM_BASE UL(0xF8000000) |
98 | 57 | #define SPEAR6XX_ICM3_SMI_CTRL_BASE UL(0xFC000000) | |
99 | #define SPEAR6XX_ICM3_SMEM_BASE 0xF8000000 | 58 | #define SPEAR6XX_ICM3_CLCD_BASE UL(0xFC200000) |
100 | #define SPEAR6XX_ICM3_SMEM_SIZE 0x04000000 | 59 | #define SPEAR6XX_ICM3_DMA_BASE UL(0xFC400000) |
101 | 60 | #define SPEAR6XX_ICM3_SDRAM_CTRL_BASE UL(0xFC600000) | |
102 | #define SPEAR6XX_ICM3_SMI_CTRL_BASE 0xFC000000 | 61 | #define SPEAR6XX_ICM3_TMR_BASE UL(0xFC800000) |
103 | #define SPEAR6XX_ICM3_SMI_CTRL_SIZE 0x00200000 | 62 | #define SPEAR6XX_ICM3_WDT_BASE UL(0xFC880000) |
104 | 63 | #define SPEAR6XX_ICM3_RTC_BASE UL(0xFC900000) | |
105 | #define SPEAR6XX_ICM3_CLCD_BASE 0xFC200000 | 64 | #define SPEAR6XX_ICM3_GPIO_BASE UL(0xFC980000) |
106 | #define SPEAR6XX_ICM3_CLCD_SIZE 0x00200000 | 65 | #define SPEAR6XX_ICM3_SYS_CTRL_BASE UL(0xFCA00000) |
107 | |||
108 | #define SPEAR6XX_ICM3_DMA_BASE 0xFC400000 | ||
109 | #define SPEAR6XX_ICM3_DMA_SIZE 0x00200000 | ||
110 | |||
111 | #define SPEAR6XX_ICM3_SDRAM_CTRL_BASE 0xFC600000 | ||
112 | #define SPEAR6XX_ICM3_SDRAM_CTRL_SIZE 0x00200000 | ||
113 | |||
114 | #define SPEAR6XX_ICM3_TMR_BASE 0xFC800000 | ||
115 | #define SPEAR6XX_ICM3_TMR_SIZE 0x00080000 | ||
116 | |||
117 | #define SPEAR6XX_ICM3_WDT_BASE 0xFC880000 | ||
118 | #define SPEAR6XX_ICM3_WDT_SIZE 0x00080000 | ||
119 | |||
120 | #define SPEAR6XX_ICM3_RTC_BASE 0xFC900000 | ||
121 | #define SPEAR6XX_ICM3_RTC_SIZE 0x00080000 | ||
122 | |||
123 | #define SPEAR6XX_ICM3_GPIO_BASE 0xFC980000 | ||
124 | #define SPEAR6XX_ICM3_GPIO_SIZE 0x00080000 | ||
125 | |||
126 | #define SPEAR6XX_ICM3_SYS_CTRL_BASE 0xFCA00000 | ||
127 | #define VA_SPEAR6XX_ICM3_SYS_CTRL_BASE IO_ADDRESS(SPEAR6XX_ICM3_SYS_CTRL_BASE) | 66 | #define VA_SPEAR6XX_ICM3_SYS_CTRL_BASE IO_ADDRESS(SPEAR6XX_ICM3_SYS_CTRL_BASE) |
128 | #define SPEAR6XX_ICM3_SYS_CTRL_SIZE 0x00080000 | 67 | #define SPEAR6XX_ICM3_MISC_REG_BASE UL(0xFCA80000) |
129 | |||
130 | #define SPEAR6XX_ICM3_MISC_REG_BASE 0xFCA80000 | ||
131 | #define VA_SPEAR6XX_ICM3_MISC_REG_BASE IO_ADDRESS(SPEAR6XX_ICM3_MISC_REG_BASE) | 68 | #define VA_SPEAR6XX_ICM3_MISC_REG_BASE IO_ADDRESS(SPEAR6XX_ICM3_MISC_REG_BASE) |
132 | #define SPEAR6XX_ICM3_MISC_REG_SIZE 0x00080000 | ||
133 | 69 | ||
134 | /* ICM4 - High Speed Connection */ | 70 | /* ICM4 - High Speed Connection */ |
135 | #define SPEAR6XX_ICM4_BASE 0xE0000000 | 71 | #define SPEAR6XX_ICM4_BASE UL(0xE0000000) |
136 | #define SPEAR6XX_ICM4_SIZE 0x08000000 | 72 | #define SPEAR6XX_ICM4_GMAC_BASE UL(0xE0800000) |
137 | 73 | #define SPEAR6XX_ICM4_USBD_FIFO_BASE UL(0xE1000000) | |
138 | #define SPEAR6XX_ICM4_GMAC_BASE 0xE0800000 | 74 | #define SPEAR6XX_ICM4_USBD_CSR_BASE UL(0xE1100000) |
139 | #define SPEAR6XX_ICM4_GMAC_SIZE 0x00800000 | 75 | #define SPEAR6XX_ICM4_USBD_PLDT_BASE UL(0xE1200000) |
140 | 76 | #define SPEAR6XX_ICM4_USB_EHCI0_BASE UL(0xE1800000) | |
141 | #define SPEAR6XX_ICM4_USBD_FIFO_BASE 0xE1000000 | 77 | #define SPEAR6XX_ICM4_USB_OHCI0_BASE UL(0xE1900000) |
142 | #define SPEAR6XX_ICM4_USBD_FIFO_SIZE 0x00100000 | 78 | #define SPEAR6XX_ICM4_USB_EHCI1_BASE UL(0xE2000000) |
143 | 79 | #define SPEAR6XX_ICM4_USB_OHCI1_BASE UL(0xE2100000) | |
144 | #define SPEAR6XX_ICM4_USBD_CSR_BASE 0xE1100000 | 80 | #define SPEAR6XX_ICM4_USB_ARB_BASE UL(0xE2800000) |
145 | #define SPEAR6XX_ICM4_USBD_CSR_SIZE 0x00100000 | ||
146 | |||
147 | #define SPEAR6XX_ICM4_USBD_PLDT_BASE 0xE1200000 | ||
148 | #define SPEAR6XX_ICM4_USBD_PLDT_SIZE 0x00100000 | ||
149 | |||
150 | #define SPEAR6XX_ICM4_USB_EHCI0_BASE 0xE1800000 | ||
151 | #define SPEAR6XX_ICM4_USB_EHCI0_SIZE 0x00100000 | ||
152 | |||
153 | #define SPEAR6XX_ICM4_USB_OHCI0_BASE 0xE1900000 | ||
154 | #define SPEAR6XX_ICM4_USB_OHCI0_SIZE 0x00100000 | ||
155 | |||
156 | #define SPEAR6XX_ICM4_USB_EHCI1_BASE 0xE2000000 | ||
157 | #define SPEAR6XX_ICM4_USB_EHCI1_SIZE 0x00100000 | ||
158 | |||
159 | #define SPEAR6XX_ICM4_USB_OHCI1_BASE 0xE2100000 | ||
160 | #define SPEAR6XX_ICM4_USB_OHCI1_SIZE 0x00100000 | ||
161 | |||
162 | #define SPEAR6XX_ICM4_USB_ARB_BASE 0xE2800000 | ||
163 | #define SPEAR6XX_ICM4_USB_ARB_SIZE 0x00010000 | ||
164 | 81 | ||
165 | /* Debug uart for linux, will be used for debug and uncompress messages */ | 82 | /* Debug uart for linux, will be used for debug and uncompress messages */ |
166 | #define SPEAR_DBG_UART_BASE SPEAR6XX_ICM1_UART0_BASE | 83 | #define SPEAR_DBG_UART_BASE SPEAR6XX_ICM1_UART0_BASE |
diff --git a/arch/arm/mach-spear6xx/spear600.c b/arch/arm/mach-spear6xx/spear600.c index 5c484c433dc1..d0e6eeae9b04 100644 --- a/arch/arm/mach-spear6xx/spear600.c +++ b/arch/arm/mach-spear6xx/spear600.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <linux/ptrace.h> | 14 | #include <linux/ptrace.h> |
15 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
16 | #include <mach/generic.h> | 16 | #include <mach/generic.h> |
17 | #include <mach/spear.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | /* Add spear600 specific devices here */ | 19 | /* Add spear600 specific devices here */ |
20 | 20 | ||
diff --git a/arch/arm/mach-spear6xx/spear600_evb.c b/arch/arm/mach-spear6xx/spear600_evb.c index daff8d04f7b6..f19cefe91a2b 100644 --- a/arch/arm/mach-spear6xx/spear600_evb.c +++ b/arch/arm/mach-spear6xx/spear600_evb.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <asm/mach/arch.h> | 14 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 15 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 16 | #include <mach/generic.h> |
17 | #include <mach/spear.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | static struct amba_device *amba_devs[] __initdata = { | 19 | static struct amba_device *amba_devs[] __initdata = { |
20 | &gpio_device[0], | 20 | &gpio_device[0], |
@@ -46,6 +46,6 @@ MACHINE_START(SPEAR600, "ST-SPEAR600-EVB") | |||
46 | .boot_params = 0x00000100, | 46 | .boot_params = 0x00000100, |
47 | .map_io = spear6xx_map_io, | 47 | .map_io = spear6xx_map_io, |
48 | .init_irq = spear6xx_init_irq, | 48 | .init_irq = spear6xx_init_irq, |
49 | .timer = &spear_sys_timer, | 49 | .timer = &spear6xx_timer, |
50 | .init_machine = spear600_evb_init, | 50 | .init_machine = spear600_evb_init, |
51 | MACHINE_END | 51 | MACHINE_END |
diff --git a/arch/arm/mach-spear6xx/spear6xx.c b/arch/arm/mach-spear6xx/spear6xx.c index f2fe14e8471d..981812961ac7 100644 --- a/arch/arm/mach-spear6xx/spear6xx.c +++ b/arch/arm/mach-spear6xx/spear6xx.c | |||
@@ -18,9 +18,9 @@ | |||
18 | #include <asm/hardware/vic.h> | 18 | #include <asm/hardware/vic.h> |
19 | #include <asm/irq.h> | 19 | #include <asm/irq.h> |
20 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
21 | #include <mach/irqs.h> | ||
22 | #include <mach/generic.h> | 21 | #include <mach/generic.h> |
23 | #include <mach/spear.h> | 22 | #include <mach/hardware.h> |
23 | #include <mach/irqs.h> | ||
24 | 24 | ||
25 | /* Add spear6xx machines common devices here */ | 25 | /* Add spear6xx machines common devices here */ |
26 | /* uart device registration */ | 26 | /* uart device registration */ |
@@ -31,8 +31,7 @@ struct amba_device uart_device[] = { | |||
31 | }, | 31 | }, |
32 | .res = { | 32 | .res = { |
33 | .start = SPEAR6XX_ICM1_UART0_BASE, | 33 | .start = SPEAR6XX_ICM1_UART0_BASE, |
34 | .end = SPEAR6XX_ICM1_UART0_BASE + | 34 | .end = SPEAR6XX_ICM1_UART0_BASE + SZ_4K - 1, |
35 | SPEAR6XX_ICM1_UART0_SIZE - 1, | ||
36 | .flags = IORESOURCE_MEM, | 35 | .flags = IORESOURCE_MEM, |
37 | }, | 36 | }, |
38 | .irq = {IRQ_UART_0, NO_IRQ}, | 37 | .irq = {IRQ_UART_0, NO_IRQ}, |
@@ -42,8 +41,7 @@ struct amba_device uart_device[] = { | |||
42 | }, | 41 | }, |
43 | .res = { | 42 | .res = { |
44 | .start = SPEAR6XX_ICM1_UART1_BASE, | 43 | .start = SPEAR6XX_ICM1_UART1_BASE, |
45 | .end = SPEAR6XX_ICM1_UART1_BASE + | 44 | .end = SPEAR6XX_ICM1_UART1_BASE + SZ_4K - 1, |
46 | SPEAR6XX_ICM1_UART1_SIZE - 1, | ||
47 | .flags = IORESOURCE_MEM, | 45 | .flags = IORESOURCE_MEM, |
48 | }, | 46 | }, |
49 | .irq = {IRQ_UART_1, NO_IRQ}, | 47 | .irq = {IRQ_UART_1, NO_IRQ}, |
@@ -72,8 +70,7 @@ struct amba_device gpio_device[] = { | |||
72 | }, | 70 | }, |
73 | .res = { | 71 | .res = { |
74 | .start = SPEAR6XX_CPU_GPIO_BASE, | 72 | .start = SPEAR6XX_CPU_GPIO_BASE, |
75 | .end = SPEAR6XX_CPU_GPIO_BASE + | 73 | .end = SPEAR6XX_CPU_GPIO_BASE + SZ_4K - 1, |
76 | SPEAR6XX_CPU_GPIO_SIZE - 1, | ||
77 | .flags = IORESOURCE_MEM, | 74 | .flags = IORESOURCE_MEM, |
78 | }, | 75 | }, |
79 | .irq = {IRQ_LOCAL_GPIO, NO_IRQ}, | 76 | .irq = {IRQ_LOCAL_GPIO, NO_IRQ}, |
@@ -84,8 +81,7 @@ struct amba_device gpio_device[] = { | |||
84 | }, | 81 | }, |
85 | .res = { | 82 | .res = { |
86 | .start = SPEAR6XX_ICM3_GPIO_BASE, | 83 | .start = SPEAR6XX_ICM3_GPIO_BASE, |
87 | .end = SPEAR6XX_ICM3_GPIO_BASE + | 84 | .end = SPEAR6XX_ICM3_GPIO_BASE + SZ_4K - 1, |
88 | SPEAR6XX_ICM3_GPIO_SIZE - 1, | ||
89 | .flags = IORESOURCE_MEM, | 85 | .flags = IORESOURCE_MEM, |
90 | }, | 86 | }, |
91 | .irq = {IRQ_BASIC_GPIO, NO_IRQ}, | 87 | .irq = {IRQ_BASIC_GPIO, NO_IRQ}, |
@@ -96,8 +92,7 @@ struct amba_device gpio_device[] = { | |||
96 | }, | 92 | }, |
97 | .res = { | 93 | .res = { |
98 | .start = SPEAR6XX_ICM2_GPIO_BASE, | 94 | .start = SPEAR6XX_ICM2_GPIO_BASE, |
99 | .end = SPEAR6XX_ICM2_GPIO_BASE + | 95 | .end = SPEAR6XX_ICM2_GPIO_BASE + SZ_4K - 1, |
100 | SPEAR6XX_ICM2_GPIO_SIZE - 1, | ||
101 | .flags = IORESOURCE_MEM, | 96 | .flags = IORESOURCE_MEM, |
102 | }, | 97 | }, |
103 | .irq = {IRQ_APPL_GPIO, NO_IRQ}, | 98 | .irq = {IRQ_APPL_GPIO, NO_IRQ}, |
@@ -122,27 +117,27 @@ static struct map_desc spear6xx_io_desc[] __initdata = { | |||
122 | { | 117 | { |
123 | .virtual = VA_SPEAR6XX_ICM1_UART0_BASE, | 118 | .virtual = VA_SPEAR6XX_ICM1_UART0_BASE, |
124 | .pfn = __phys_to_pfn(SPEAR6XX_ICM1_UART0_BASE), | 119 | .pfn = __phys_to_pfn(SPEAR6XX_ICM1_UART0_BASE), |
125 | .length = SPEAR6XX_ICM1_UART0_SIZE, | 120 | .length = SZ_4K, |
126 | .type = MT_DEVICE | 121 | .type = MT_DEVICE |
127 | }, { | 122 | }, { |
128 | .virtual = VA_SPEAR6XX_CPU_VIC_PRI_BASE, | 123 | .virtual = VA_SPEAR6XX_CPU_VIC_PRI_BASE, |
129 | .pfn = __phys_to_pfn(SPEAR6XX_CPU_VIC_PRI_BASE), | 124 | .pfn = __phys_to_pfn(SPEAR6XX_CPU_VIC_PRI_BASE), |
130 | .length = SPEAR6XX_CPU_VIC_PRI_SIZE, | 125 | .length = SZ_4K, |
131 | .type = MT_DEVICE | 126 | .type = MT_DEVICE |
132 | }, { | 127 | }, { |
133 | .virtual = VA_SPEAR6XX_CPU_VIC_SEC_BASE, | 128 | .virtual = VA_SPEAR6XX_CPU_VIC_SEC_BASE, |
134 | .pfn = __phys_to_pfn(SPEAR6XX_CPU_VIC_SEC_BASE), | 129 | .pfn = __phys_to_pfn(SPEAR6XX_CPU_VIC_SEC_BASE), |
135 | .length = SPEAR6XX_CPU_VIC_SEC_SIZE, | 130 | .length = SZ_4K, |
136 | .type = MT_DEVICE | 131 | .type = MT_DEVICE |
137 | }, { | 132 | }, { |
138 | .virtual = VA_SPEAR6XX_ICM3_SYS_CTRL_BASE, | 133 | .virtual = VA_SPEAR6XX_ICM3_SYS_CTRL_BASE, |
139 | .pfn = __phys_to_pfn(SPEAR6XX_ICM3_SYS_CTRL_BASE), | 134 | .pfn = __phys_to_pfn(SPEAR6XX_ICM3_SYS_CTRL_BASE), |
140 | .length = SPEAR6XX_ICM3_MISC_REG_BASE, | 135 | .length = SZ_4K, |
141 | .type = MT_DEVICE | 136 | .type = MT_DEVICE |
142 | }, { | 137 | }, { |
143 | .virtual = VA_SPEAR6XX_ICM3_MISC_REG_BASE, | 138 | .virtual = VA_SPEAR6XX_ICM3_MISC_REG_BASE, |
144 | .pfn = __phys_to_pfn(SPEAR6XX_ICM3_MISC_REG_BASE), | 139 | .pfn = __phys_to_pfn(SPEAR6XX_ICM3_MISC_REG_BASE), |
145 | .length = SPEAR6XX_ICM3_MISC_REG_SIZE, | 140 | .length = SZ_4K, |
146 | .type = MT_DEVICE | 141 | .type = MT_DEVICE |
147 | }, | 142 | }, |
148 | }; | 143 | }; |
@@ -155,3 +150,34 @@ void __init spear6xx_map_io(void) | |||
155 | /* This will initialize clock framework */ | 150 | /* This will initialize clock framework */ |
156 | clk_init(); | 151 | clk_init(); |
157 | } | 152 | } |
153 | |||
154 | static void __init spear6xx_timer_init(void) | ||
155 | { | ||
156 | char pclk_name[] = "pll3_48m_clk"; | ||
157 | struct clk *gpt_clk, *pclk; | ||
158 | |||
159 | /* get the system timer clock */ | ||
160 | gpt_clk = clk_get_sys("gpt0", NULL); | ||
161 | if (IS_ERR(gpt_clk)) { | ||
162 | pr_err("%s:couldn't get clk for gpt\n", __func__); | ||
163 | BUG(); | ||
164 | } | ||
165 | |||
166 | /* get the suitable parent clock for timer*/ | ||
167 | pclk = clk_get(NULL, pclk_name); | ||
168 | if (IS_ERR(pclk)) { | ||
169 | pr_err("%s:couldn't get %s as parent for gpt\n", | ||
170 | __func__, pclk_name); | ||
171 | BUG(); | ||
172 | } | ||
173 | |||
174 | clk_set_parent(gpt_clk, pclk); | ||
175 | clk_put(gpt_clk); | ||
176 | clk_put(pclk); | ||
177 | |||
178 | spear_setup_timer(); | ||
179 | } | ||
180 | |||
181 | struct sys_timer spear6xx_timer = { | ||
182 | .init = spear6xx_timer_init, | ||
183 | }; | ||
diff --git a/arch/arm/mach-tcc8k/board-tcc8000-sdk.c b/arch/arm/mach-tcc8k/board-tcc8000-sdk.c index 7991415e666b..fb6426ddeb77 100644 --- a/arch/arm/mach-tcc8k/board-tcc8000-sdk.c +++ b/arch/arm/mach-tcc8k/board-tcc8000-sdk.c | |||
@@ -54,7 +54,7 @@ static void __init tcc8k_map_io(void) | |||
54 | } | 54 | } |
55 | 55 | ||
56 | MACHINE_START(TCC8000_SDK, "Telechips TCC8000-SDK Demo Board") | 56 | MACHINE_START(TCC8000_SDK, "Telechips TCC8000-SDK Demo Board") |
57 | .boot_params = PHYS_OFFSET + 0x00000100, | 57 | .boot_params = PLAT_PHYS_OFFSET + 0x00000100, |
58 | .map_io = tcc8k_map_io, | 58 | .map_io = tcc8k_map_io, |
59 | .init_irq = tcc8k_init_irq, | 59 | .init_irq = tcc8k_init_irq, |
60 | .init_machine = tcc8k_init, | 60 | .init_machine = tcc8k_init, |
diff --git a/arch/arm/mach-tegra/include/mach/memory.h b/arch/arm/mach-tegra/include/mach/memory.h index 6151bab62af2..537db3aa81a7 100644 --- a/arch/arm/mach-tegra/include/mach/memory.h +++ b/arch/arm/mach-tegra/include/mach/memory.h | |||
@@ -22,7 +22,7 @@ | |||
22 | #define __MACH_TEGRA_MEMORY_H | 22 | #define __MACH_TEGRA_MEMORY_H |
23 | 23 | ||
24 | /* physical offset of RAM */ | 24 | /* physical offset of RAM */ |
25 | #define PHYS_OFFSET UL(0) | 25 | #define PLAT_PHYS_OFFSET UL(0) |
26 | 26 | ||
27 | #endif | 27 | #endif |
28 | 28 | ||
diff --git a/arch/arm/mach-u300/include/mach/memory.h b/arch/arm/mach-u300/include/mach/memory.h index bf134bcc129d..888e2e351ee1 100644 --- a/arch/arm/mach-u300/include/mach/memory.h +++ b/arch/arm/mach-u300/include/mach/memory.h | |||
@@ -15,17 +15,17 @@ | |||
15 | 15 | ||
16 | #ifdef CONFIG_MACH_U300_DUAL_RAM | 16 | #ifdef CONFIG_MACH_U300_DUAL_RAM |
17 | 17 | ||
18 | #define PHYS_OFFSET UL(0x48000000) | 18 | #define PLAT_PHYS_OFFSET UL(0x48000000) |
19 | #define BOOT_PARAMS_OFFSET (PHYS_OFFSET + 0x100) | 19 | #define BOOT_PARAMS_OFFSET (PHYS_OFFSET + 0x100) |
20 | 20 | ||
21 | #else | 21 | #else |
22 | 22 | ||
23 | #ifdef CONFIG_MACH_U300_2MB_ALIGNMENT_FIX | 23 | #ifdef CONFIG_MACH_U300_2MB_ALIGNMENT_FIX |
24 | #define PHYS_OFFSET (0x28000000 + \ | 24 | #define PLAT_PHYS_OFFSET (0x28000000 + \ |
25 | (CONFIG_MACH_U300_ACCESS_MEM_SIZE - \ | 25 | (CONFIG_MACH_U300_ACCESS_MEM_SIZE - \ |
26 | (CONFIG_MACH_U300_ACCESS_MEM_SIZE & 1))*1024*1024) | 26 | (CONFIG_MACH_U300_ACCESS_MEM_SIZE & 1))*1024*1024) |
27 | #else | 27 | #else |
28 | #define PHYS_OFFSET (0x28000000 + \ | 28 | #define PLAT_PHYS_OFFSET (0x28000000 + \ |
29 | (CONFIG_MACH_U300_ACCESS_MEM_SIZE + \ | 29 | (CONFIG_MACH_U300_ACCESS_MEM_SIZE + \ |
30 | (CONFIG_MACH_U300_ACCESS_MEM_SIZE & 1))*1024*1024) | 30 | (CONFIG_MACH_U300_ACCESS_MEM_SIZE & 1))*1024*1024) |
31 | #endif | 31 | #endif |
diff --git a/arch/arm/mach-u300/u300.c b/arch/arm/mach-u300/u300.c index 07c35a846424..48b3b7f39966 100644 --- a/arch/arm/mach-u300/u300.c +++ b/arch/arm/mach-u300/u300.c | |||
@@ -19,9 +19,9 @@ | |||
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
21 | #include <mach/platform.h> | 21 | #include <mach/platform.h> |
22 | #include <mach/memory.h> | ||
23 | #include <asm/mach-types.h> | 22 | #include <asm/mach-types.h> |
24 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
24 | #include <asm/memory.h> | ||
25 | 25 | ||
26 | static void __init u300_reserve(void) | 26 | static void __init u300_reserve(void) |
27 | { | 27 | { |
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index 247caa3400d0..203b986280f5 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig | |||
@@ -6,6 +6,7 @@ config UX500_SOC_COMMON | |||
6 | select ARM_GIC | 6 | select ARM_GIC |
7 | select HAS_MTU | 7 | select HAS_MTU |
8 | select NOMADIK_GPIO | 8 | select NOMADIK_GPIO |
9 | select ARM_ERRATA_753970 | ||
9 | 10 | ||
10 | menu "Ux500 SoC" | 11 | menu "Ux500 SoC" |
11 | 12 | ||
diff --git a/arch/arm/mach-ux500/include/mach/memory.h b/arch/arm/mach-ux500/include/mach/memory.h index 510571a59e25..2ef697a67006 100644 --- a/arch/arm/mach-ux500/include/mach/memory.h +++ b/arch/arm/mach-ux500/include/mach/memory.h | |||
@@ -12,7 +12,7 @@ | |||
12 | /* | 12 | /* |
13 | * Physical DRAM offset. | 13 | * Physical DRAM offset. |
14 | */ | 14 | */ |
15 | #define PHYS_OFFSET UL(0x00000000) | 15 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
16 | #define BUS_OFFSET UL(0x00000000) | 16 | #define BUS_OFFSET UL(0x00000000) |
17 | 17 | ||
18 | #endif | 18 | #endif |
diff --git a/arch/arm/mach-versatile/include/mach/memory.h b/arch/arm/mach-versatile/include/mach/memory.h index 79aeab86b903..dacc9d8e4e6a 100644 --- a/arch/arm/mach-versatile/include/mach/memory.h +++ b/arch/arm/mach-versatile/include/mach/memory.h | |||
@@ -23,6 +23,6 @@ | |||
23 | /* | 23 | /* |
24 | * Physical DRAM offset. | 24 | * Physical DRAM offset. |
25 | */ | 25 | */ |
26 | #define PHYS_OFFSET UL(0x00000000) | 26 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
27 | 27 | ||
28 | #endif | 28 | #endif |
diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index e628402b754c..e9bccc5230c9 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c | |||
@@ -243,7 +243,7 @@ static void __init ct_ca9x4_init(void) | |||
243 | } | 243 | } |
244 | 244 | ||
245 | MACHINE_START(VEXPRESS, "ARM-Versatile Express CA9x4") | 245 | MACHINE_START(VEXPRESS, "ARM-Versatile Express CA9x4") |
246 | .boot_params = PHYS_OFFSET + 0x00000100, | 246 | .boot_params = PLAT_PHYS_OFFSET + 0x00000100, |
247 | .map_io = ct_ca9x4_map_io, | 247 | .map_io = ct_ca9x4_map_io, |
248 | .init_irq = ct_ca9x4_init_irq, | 248 | .init_irq = ct_ca9x4_init_irq, |
249 | #if 0 | 249 | #if 0 |
diff --git a/arch/arm/mach-vexpress/include/mach/memory.h b/arch/arm/mach-vexpress/include/mach/memory.h index be28232ae639..5b7fcd439d87 100644 --- a/arch/arm/mach-vexpress/include/mach/memory.h +++ b/arch/arm/mach-vexpress/include/mach/memory.h | |||
@@ -20,6 +20,6 @@ | |||
20 | #ifndef __ASM_ARCH_MEMORY_H | 20 | #ifndef __ASM_ARCH_MEMORY_H |
21 | #define __ASM_ARCH_MEMORY_H | 21 | #define __ASM_ARCH_MEMORY_H |
22 | 22 | ||
23 | #define PHYS_OFFSET UL(0x60000000) | 23 | #define PLAT_PHYS_OFFSET UL(0x60000000) |
24 | 24 | ||
25 | #endif | 25 | #endif |
diff --git a/arch/arm/mach-vt8500/Kconfig b/arch/arm/mach-vt8500/Kconfig new file mode 100644 index 000000000000..2c20a341c11a --- /dev/null +++ b/arch/arm/mach-vt8500/Kconfig | |||
@@ -0,0 +1,73 @@ | |||
1 | if ARCH_VT8500 | ||
2 | |||
3 | config VTWM_VERSION_VT8500 | ||
4 | bool | ||
5 | |||
6 | config VTWM_VERSION_WM8505 | ||
7 | bool | ||
8 | |||
9 | config MACH_BV07 | ||
10 | bool "Benign BV07-8500 Mini Netbook" | ||
11 | depends on ARCH_VT8500 | ||
12 | select VTWM_VERSION_VT8500 | ||
13 | help | ||
14 | Add support for the inexpensive 7-inch netbooks sold by many | ||
15 | Chinese distributors under various names. Note that there are | ||
16 | many hardware implementations in identical exterior, make sure | ||
17 | that yours is indeed based on a VIA VT8500 chip. | ||
18 | |||
19 | config MACH_WM8505_7IN_NETBOOK | ||
20 | bool "WM8505 7-inch generic netbook" | ||
21 | depends on ARCH_VT8500 | ||
22 | select VTWM_VERSION_WM8505 | ||
23 | help | ||
24 | Add support for the inexpensive 7-inch netbooks sold by many | ||
25 | Chinese distributors under various names. Note that there are | ||
26 | many hardware implementations in identical exterior, make sure | ||
27 | that yours is indeed based on a WonderMedia WM8505 chip. | ||
28 | |||
29 | comment "LCD panel size" | ||
30 | |||
31 | config WMT_PANEL_800X480 | ||
32 | bool "7-inch with 800x480 resolution" | ||
33 | depends on (FB_VT8500 || FB_WM8505) | ||
34 | default y | ||
35 | help | ||
36 | These are found in most of the netbooks in generic cases, as | ||
37 | well as in Eken M001 tablets and possibly elsewhere. | ||
38 | |||
39 | To select this panel at runtime, say y here and append | ||
40 | 'panel=800x480' to your kernel command line. Otherwise, the | ||
41 | largest one available will be used. | ||
42 | |||
43 | config WMT_PANEL_800X600 | ||
44 | bool "8-inch with 800x600 resolution" | ||
45 | depends on (FB_VT8500 || FB_WM8505) | ||
46 | help | ||
47 | These are found in Eken M003 tablets and possibly elsewhere. | ||
48 | |||
49 | To select this panel at runtime, say y here and append | ||
50 | 'panel=800x600' to your kernel command line. Otherwise, the | ||
51 | largest one available will be used. | ||
52 | |||
53 | config WMT_PANEL_1024X576 | ||
54 | bool "10-inch with 1024x576 resolution" | ||
55 | depends on (FB_VT8500 || FB_WM8505) | ||
56 | help | ||
57 | These are found in CherryPal netbooks and possibly elsewhere. | ||
58 | |||
59 | To select this panel at runtime, say y here and append | ||
60 | 'panel=1024x576' to your kernel command line. Otherwise, the | ||
61 | largest one available will be used. | ||
62 | |||
63 | config WMT_PANEL_1024X600 | ||
64 | bool "10-inch with 1024x600 resolution" | ||
65 | depends on (FB_VT8500 || FB_WM8505) | ||
66 | help | ||
67 | These are found in Eken M006 tablets and possibly elsewhere. | ||
68 | |||
69 | To select this panel at runtime, say y here and append | ||
70 | 'panel=1024x600' to your kernel command line. Otherwise, the | ||
71 | largest one available will be used. | ||
72 | |||
73 | endif | ||
diff --git a/arch/arm/mach-vt8500/Makefile b/arch/arm/mach-vt8500/Makefile new file mode 100644 index 000000000000..81aedb7c893c --- /dev/null +++ b/arch/arm/mach-vt8500/Makefile | |||
@@ -0,0 +1,9 @@ | |||
1 | obj-y += devices.o gpio.o irq.o timer.o | ||
2 | |||
3 | obj-$(CONFIG_VTWM_VERSION_VT8500) += devices-vt8500.o | ||
4 | obj-$(CONFIG_VTWM_VERSION_WM8505) += devices-wm8505.o | ||
5 | |||
6 | obj-$(CONFIG_MACH_BV07) += bv07.o | ||
7 | obj-$(CONFIG_MACH_WM8505_7IN_NETBOOK) += wm8505_7in.o | ||
8 | |||
9 | obj-$(CONFIG_HAVE_PWM) += pwm.o | ||
diff --git a/arch/arm/mach-vt8500/Makefile.boot b/arch/arm/mach-vt8500/Makefile.boot new file mode 100644 index 000000000000..a8acc4e24902 --- /dev/null +++ b/arch/arm/mach-vt8500/Makefile.boot | |||
@@ -0,0 +1,3 @@ | |||
1 | zreladdr-y := 0x00008000 | ||
2 | params_phys-y := 0x00000100 | ||
3 | initrd_phys-y := 0x01000000 | ||
diff --git a/arch/arm/mach-vt8500/bv07.c b/arch/arm/mach-vt8500/bv07.c new file mode 100644 index 000000000000..94a261d86bf0 --- /dev/null +++ b/arch/arm/mach-vt8500/bv07.c | |||
@@ -0,0 +1,77 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/bv07.c | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | #include <linux/io.h> | ||
22 | #include <linux/pm.h> | ||
23 | |||
24 | #include <asm/mach-types.h> | ||
25 | #include <asm/mach/arch.h> | ||
26 | |||
27 | #include "devices.h" | ||
28 | |||
29 | static void __iomem *pmc_hiber; | ||
30 | |||
31 | static struct platform_device *devices[] __initdata = { | ||
32 | &vt8500_device_uart0, | ||
33 | &vt8500_device_lcdc, | ||
34 | &vt8500_device_ehci, | ||
35 | &vt8500_device_ge_rops, | ||
36 | &vt8500_device_pwm, | ||
37 | &vt8500_device_pwmbl, | ||
38 | &vt8500_device_rtc, | ||
39 | }; | ||
40 | |||
41 | static void vt8500_power_off(void) | ||
42 | { | ||
43 | local_irq_disable(); | ||
44 | writew(5, pmc_hiber); | ||
45 | asm("mcr%? p15, 0, %0, c7, c0, 4" : : "r" (0)); | ||
46 | } | ||
47 | |||
48 | void __init bv07_init(void) | ||
49 | { | ||
50 | #ifdef CONFIG_FB_VT8500 | ||
51 | void __iomem *gpio_mux_reg = ioremap(wmt_gpio_base + 0x200, 4); | ||
52 | if (gpio_mux_reg) { | ||
53 | writel(readl(gpio_mux_reg) | 1, gpio_mux_reg); | ||
54 | iounmap(gpio_mux_reg); | ||
55 | } else { | ||
56 | printk(KERN_ERR "Could not remap the GPIO mux register, display may not work properly!\n"); | ||
57 | } | ||
58 | #endif | ||
59 | pmc_hiber = ioremap(wmt_pmc_base + 0x12, 2); | ||
60 | if (pmc_hiber) | ||
61 | pm_power_off = &vt8500_power_off; | ||
62 | else | ||
63 | printk(KERN_ERR "PMC Hibernation register could not be remapped, not enabling power off!\n"); | ||
64 | |||
65 | vt8500_set_resources(); | ||
66 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
67 | vt8500_gpio_init(); | ||
68 | } | ||
69 | |||
70 | MACHINE_START(BV07, "Benign BV07 Mini Netbook") | ||
71 | .boot_params = 0x00000100, | ||
72 | .reserve = vt8500_reserve_mem, | ||
73 | .map_io = vt8500_map_io, | ||
74 | .init_irq = vt8500_init_irq, | ||
75 | .timer = &vt8500_timer, | ||
76 | .init_machine = bv07_init, | ||
77 | MACHINE_END | ||
diff --git a/arch/arm/mach-vt8500/devices-vt8500.c b/arch/arm/mach-vt8500/devices-vt8500.c new file mode 100644 index 000000000000..19519aeecf37 --- /dev/null +++ b/arch/arm/mach-vt8500/devices-vt8500.c | |||
@@ -0,0 +1,91 @@ | |||
1 | /* linux/arch/arm/mach-vt8500/devices-vt8500.c | ||
2 | * | ||
3 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/vt8500_regs.h> | ||
19 | #include <mach/vt8500_irqs.h> | ||
20 | #include <mach/i8042.h> | ||
21 | #include "devices.h" | ||
22 | |||
23 | void __init vt8500_set_resources(void) | ||
24 | { | ||
25 | struct resource tmp[3]; | ||
26 | |||
27 | tmp[0] = wmt_mmio_res(VT8500_LCDC_BASE, SZ_1K); | ||
28 | tmp[1] = wmt_irq_res(IRQ_LCDC); | ||
29 | wmt_res_add(&vt8500_device_lcdc, tmp, 2); | ||
30 | |||
31 | tmp[0] = wmt_mmio_res(VT8500_UART0_BASE, 0x1040); | ||
32 | tmp[1] = wmt_irq_res(IRQ_UART0); | ||
33 | wmt_res_add(&vt8500_device_uart0, tmp, 2); | ||
34 | |||
35 | tmp[0] = wmt_mmio_res(VT8500_UART1_BASE, 0x1040); | ||
36 | tmp[1] = wmt_irq_res(IRQ_UART1); | ||
37 | wmt_res_add(&vt8500_device_uart1, tmp, 2); | ||
38 | |||
39 | tmp[0] = wmt_mmio_res(VT8500_UART2_BASE, 0x1040); | ||
40 | tmp[1] = wmt_irq_res(IRQ_UART2); | ||
41 | wmt_res_add(&vt8500_device_uart2, tmp, 2); | ||
42 | |||
43 | tmp[0] = wmt_mmio_res(VT8500_UART3_BASE, 0x1040); | ||
44 | tmp[1] = wmt_irq_res(IRQ_UART3); | ||
45 | wmt_res_add(&vt8500_device_uart3, tmp, 2); | ||
46 | |||
47 | tmp[0] = wmt_mmio_res(VT8500_EHCI_BASE, SZ_512); | ||
48 | tmp[1] = wmt_irq_res(IRQ_EHCI); | ||
49 | wmt_res_add(&vt8500_device_ehci, tmp, 2); | ||
50 | |||
51 | tmp[0] = wmt_mmio_res(VT8500_GEGEA_BASE, SZ_256); | ||
52 | wmt_res_add(&vt8500_device_ge_rops, tmp, 1); | ||
53 | |||
54 | tmp[0] = wmt_mmio_res(VT8500_PWM_BASE, 0x44); | ||
55 | wmt_res_add(&vt8500_device_pwm, tmp, 1); | ||
56 | |||
57 | tmp[0] = wmt_mmio_res(VT8500_RTC_BASE, 0x2c); | ||
58 | tmp[1] = wmt_irq_res(IRQ_RTC); | ||
59 | tmp[2] = wmt_irq_res(IRQ_RTCSM); | ||
60 | wmt_res_add(&vt8500_device_rtc, tmp, 3); | ||
61 | } | ||
62 | |||
63 | static void __init vt8500_set_externs(void) | ||
64 | { | ||
65 | /* Non-resource-aware stuff */ | ||
66 | wmt_ic_base = VT8500_IC_BASE; | ||
67 | wmt_gpio_base = VT8500_GPIO_BASE; | ||
68 | wmt_pmc_base = VT8500_PMC_BASE; | ||
69 | wmt_i8042_base = VT8500_PS2_BASE; | ||
70 | |||
71 | wmt_nr_irqs = VT8500_NR_IRQS; | ||
72 | wmt_timer_irq = IRQ_PMCOS0; | ||
73 | wmt_gpio_ext_irq[0] = IRQ_EXT0; | ||
74 | wmt_gpio_ext_irq[1] = IRQ_EXT1; | ||
75 | wmt_gpio_ext_irq[2] = IRQ_EXT2; | ||
76 | wmt_gpio_ext_irq[3] = IRQ_EXT3; | ||
77 | wmt_gpio_ext_irq[4] = IRQ_EXT4; | ||
78 | wmt_gpio_ext_irq[5] = IRQ_EXT5; | ||
79 | wmt_gpio_ext_irq[6] = IRQ_EXT6; | ||
80 | wmt_gpio_ext_irq[7] = IRQ_EXT7; | ||
81 | wmt_i8042_kbd_irq = IRQ_PS2KBD; | ||
82 | wmt_i8042_aux_irq = IRQ_PS2MOUSE; | ||
83 | } | ||
84 | |||
85 | void __init vt8500_map_io(void) | ||
86 | { | ||
87 | iotable_init(wmt_io_desc, ARRAY_SIZE(wmt_io_desc)); | ||
88 | |||
89 | /* Should be done before interrupts and timers are initialized */ | ||
90 | vt8500_set_externs(); | ||
91 | } | ||
diff --git a/arch/arm/mach-vt8500/devices-wm8505.c b/arch/arm/mach-vt8500/devices-wm8505.c new file mode 100644 index 000000000000..db4594e029f4 --- /dev/null +++ b/arch/arm/mach-vt8500/devices-wm8505.c | |||
@@ -0,0 +1,99 @@ | |||
1 | /* linux/arch/arm/mach-vt8500/devices-wm8505.c | ||
2 | * | ||
3 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/wm8505_regs.h> | ||
19 | #include <mach/wm8505_irqs.h> | ||
20 | #include <mach/i8042.h> | ||
21 | #include "devices.h" | ||
22 | |||
23 | void __init wm8505_set_resources(void) | ||
24 | { | ||
25 | struct resource tmp[3]; | ||
26 | |||
27 | tmp[0] = wmt_mmio_res(WM8505_GOVR_BASE, SZ_512); | ||
28 | wmt_res_add(&vt8500_device_wm8505_fb, tmp, 1); | ||
29 | |||
30 | tmp[0] = wmt_mmio_res(WM8505_UART0_BASE, 0x1040); | ||
31 | tmp[1] = wmt_irq_res(IRQ_UART0); | ||
32 | wmt_res_add(&vt8500_device_uart0, tmp, 2); | ||
33 | |||
34 | tmp[0] = wmt_mmio_res(WM8505_UART1_BASE, 0x1040); | ||
35 | tmp[1] = wmt_irq_res(IRQ_UART1); | ||
36 | wmt_res_add(&vt8500_device_uart1, tmp, 2); | ||
37 | |||
38 | tmp[0] = wmt_mmio_res(WM8505_UART2_BASE, 0x1040); | ||
39 | tmp[1] = wmt_irq_res(IRQ_UART2); | ||
40 | wmt_res_add(&vt8500_device_uart2, tmp, 2); | ||
41 | |||
42 | tmp[0] = wmt_mmio_res(WM8505_UART3_BASE, 0x1040); | ||
43 | tmp[1] = wmt_irq_res(IRQ_UART3); | ||
44 | wmt_res_add(&vt8500_device_uart3, tmp, 2); | ||
45 | |||
46 | tmp[0] = wmt_mmio_res(WM8505_UART4_BASE, 0x1040); | ||
47 | tmp[1] = wmt_irq_res(IRQ_UART4); | ||
48 | wmt_res_add(&vt8500_device_uart4, tmp, 2); | ||
49 | |||
50 | tmp[0] = wmt_mmio_res(WM8505_UART5_BASE, 0x1040); | ||
51 | tmp[1] = wmt_irq_res(IRQ_UART5); | ||
52 | wmt_res_add(&vt8500_device_uart5, tmp, 2); | ||
53 | |||
54 | tmp[0] = wmt_mmio_res(WM8505_EHCI_BASE, SZ_512); | ||
55 | tmp[1] = wmt_irq_res(IRQ_EHCI); | ||
56 | wmt_res_add(&vt8500_device_ehci, tmp, 2); | ||
57 | |||
58 | tmp[0] = wmt_mmio_res(WM8505_GEGEA_BASE, SZ_256); | ||
59 | wmt_res_add(&vt8500_device_ge_rops, tmp, 1); | ||
60 | |||
61 | tmp[0] = wmt_mmio_res(WM8505_PWM_BASE, 0x44); | ||
62 | wmt_res_add(&vt8500_device_pwm, tmp, 1); | ||
63 | |||
64 | tmp[0] = wmt_mmio_res(WM8505_RTC_BASE, 0x2c); | ||
65 | tmp[1] = wmt_irq_res(IRQ_RTC); | ||
66 | tmp[2] = wmt_irq_res(IRQ_RTCSM); | ||
67 | wmt_res_add(&vt8500_device_rtc, tmp, 3); | ||
68 | } | ||
69 | |||
70 | static void __init wm8505_set_externs(void) | ||
71 | { | ||
72 | /* Non-resource-aware stuff */ | ||
73 | wmt_ic_base = WM8505_IC_BASE; | ||
74 | wmt_sic_base = WM8505_SIC_BASE; | ||
75 | wmt_gpio_base = WM8505_GPIO_BASE; | ||
76 | wmt_pmc_base = WM8505_PMC_BASE; | ||
77 | wmt_i8042_base = WM8505_PS2_BASE; | ||
78 | |||
79 | wmt_nr_irqs = WM8505_NR_IRQS; | ||
80 | wmt_timer_irq = IRQ_PMCOS0; | ||
81 | wmt_gpio_ext_irq[0] = IRQ_EXT0; | ||
82 | wmt_gpio_ext_irq[1] = IRQ_EXT1; | ||
83 | wmt_gpio_ext_irq[2] = IRQ_EXT2; | ||
84 | wmt_gpio_ext_irq[3] = IRQ_EXT3; | ||
85 | wmt_gpio_ext_irq[4] = IRQ_EXT4; | ||
86 | wmt_gpio_ext_irq[5] = IRQ_EXT5; | ||
87 | wmt_gpio_ext_irq[6] = IRQ_EXT6; | ||
88 | wmt_gpio_ext_irq[7] = IRQ_EXT7; | ||
89 | wmt_i8042_kbd_irq = IRQ_PS2KBD; | ||
90 | wmt_i8042_aux_irq = IRQ_PS2MOUSE; | ||
91 | } | ||
92 | |||
93 | void __init wm8505_map_io(void) | ||
94 | { | ||
95 | iotable_init(wmt_io_desc, ARRAY_SIZE(wmt_io_desc)); | ||
96 | |||
97 | /* Should be done before interrupts and timers are initialized */ | ||
98 | wm8505_set_externs(); | ||
99 | } | ||
diff --git a/arch/arm/mach-vt8500/devices.c b/arch/arm/mach-vt8500/devices.c new file mode 100644 index 000000000000..1fcdc36b358d --- /dev/null +++ b/arch/arm/mach-vt8500/devices.c | |||
@@ -0,0 +1,270 @@ | |||
1 | /* linux/arch/arm/mach-vt8500/devices.c | ||
2 | * | ||
3 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/device.h> | ||
19 | #include <linux/dma-mapping.h> | ||
20 | #include <linux/platform_device.h> | ||
21 | #include <linux/pwm_backlight.h> | ||
22 | #include <linux/memblock.h> | ||
23 | |||
24 | #include <asm/mach/arch.h> | ||
25 | |||
26 | #include <mach/vt8500fb.h> | ||
27 | #include <mach/i8042.h> | ||
28 | #include "devices.h" | ||
29 | |||
30 | /* These can't use resources currently */ | ||
31 | unsigned long wmt_ic_base __initdata; | ||
32 | unsigned long wmt_sic_base __initdata; | ||
33 | unsigned long wmt_gpio_base __initdata; | ||
34 | unsigned long wmt_pmc_base __initdata; | ||
35 | unsigned long wmt_i8042_base __initdata; | ||
36 | |||
37 | int wmt_nr_irqs __initdata; | ||
38 | int wmt_timer_irq __initdata; | ||
39 | int wmt_gpio_ext_irq[8] __initdata; | ||
40 | |||
41 | /* Should remain accessible after init. | ||
42 | * i8042 driver desperately calls for attention... | ||
43 | */ | ||
44 | int wmt_i8042_kbd_irq; | ||
45 | int wmt_i8042_aux_irq; | ||
46 | |||
47 | static u64 fb_dma_mask = DMA_BIT_MASK(32); | ||
48 | |||
49 | struct platform_device vt8500_device_lcdc = { | ||
50 | .name = "vt8500-lcd", | ||
51 | .id = 0, | ||
52 | .dev = { | ||
53 | .dma_mask = &fb_dma_mask, | ||
54 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
55 | }, | ||
56 | }; | ||
57 | |||
58 | struct platform_device vt8500_device_wm8505_fb = { | ||
59 | .name = "wm8505-fb", | ||
60 | .id = 0, | ||
61 | }; | ||
62 | |||
63 | /* Smallest to largest */ | ||
64 | static struct vt8500fb_platform_data panels[] = { | ||
65 | #ifdef CONFIG_WMT_PANEL_800X480 | ||
66 | { | ||
67 | .xres_virtual = 800, | ||
68 | .yres_virtual = 480 * 2, | ||
69 | .mode = { | ||
70 | .name = "800x480", | ||
71 | .xres = 800, | ||
72 | .yres = 480, | ||
73 | .left_margin = 88, | ||
74 | .right_margin = 40, | ||
75 | .upper_margin = 32, | ||
76 | .lower_margin = 11, | ||
77 | .hsync_len = 0, | ||
78 | .vsync_len = 1, | ||
79 | .vmode = FB_VMODE_NONINTERLACED, | ||
80 | }, | ||
81 | }, | ||
82 | #endif | ||
83 | #ifdef CONFIG_WMT_PANEL_800X600 | ||
84 | { | ||
85 | .xres_virtual = 800, | ||
86 | .yres_virtual = 600 * 2, | ||
87 | .mode = { | ||
88 | .name = "800x600", | ||
89 | .xres = 800, | ||
90 | .yres = 600, | ||
91 | .left_margin = 88, | ||
92 | .right_margin = 40, | ||
93 | .upper_margin = 32, | ||
94 | .lower_margin = 11, | ||
95 | .hsync_len = 0, | ||
96 | .vsync_len = 1, | ||
97 | .vmode = FB_VMODE_NONINTERLACED, | ||
98 | }, | ||
99 | }, | ||
100 | #endif | ||
101 | #ifdef CONFIG_WMT_PANEL_1024X576 | ||
102 | { | ||
103 | .xres_virtual = 1024, | ||
104 | .yres_virtual = 576 * 2, | ||
105 | .mode = { | ||
106 | .name = "1024x576", | ||
107 | .xres = 1024, | ||
108 | .yres = 576, | ||
109 | .left_margin = 40, | ||
110 | .right_margin = 24, | ||
111 | .upper_margin = 32, | ||
112 | .lower_margin = 11, | ||
113 | .hsync_len = 96, | ||
114 | .vsync_len = 2, | ||
115 | .vmode = FB_VMODE_NONINTERLACED, | ||
116 | }, | ||
117 | }, | ||
118 | #endif | ||
119 | #ifdef CONFIG_WMT_PANEL_1024X600 | ||
120 | { | ||
121 | .xres_virtual = 1024, | ||
122 | .yres_virtual = 600 * 2, | ||
123 | .mode = { | ||
124 | .name = "1024x600", | ||
125 | .xres = 1024, | ||
126 | .yres = 600, | ||
127 | .left_margin = 66, | ||
128 | .right_margin = 2, | ||
129 | .upper_margin = 19, | ||
130 | .lower_margin = 1, | ||
131 | .hsync_len = 23, | ||
132 | .vsync_len = 8, | ||
133 | .vmode = FB_VMODE_NONINTERLACED, | ||
134 | }, | ||
135 | }, | ||
136 | #endif | ||
137 | }; | ||
138 | |||
139 | static int current_panel_idx __initdata = ARRAY_SIZE(panels) - 1; | ||
140 | |||
141 | static int __init panel_setup(char *str) | ||
142 | { | ||
143 | int i; | ||
144 | |||
145 | for (i = 0; i < ARRAY_SIZE(panels); i++) { | ||
146 | if (strcmp(panels[i].mode.name, str) == 0) { | ||
147 | current_panel_idx = i; | ||
148 | break; | ||
149 | } | ||
150 | } | ||
151 | return 0; | ||
152 | } | ||
153 | |||
154 | early_param("panel", panel_setup); | ||
155 | |||
156 | static inline void preallocate_fb(struct vt8500fb_platform_data *p, | ||
157 | unsigned long align) { | ||
158 | p->video_mem_len = (p->xres_virtual * p->yres_virtual * 4) >> | ||
159 | (p->bpp > 16 ? 0 : (p->bpp > 8 ? 1 : | ||
160 | (8 / p->bpp) + 1)); | ||
161 | p->video_mem_phys = (unsigned long)memblock_alloc(p->video_mem_len, | ||
162 | align); | ||
163 | p->video_mem_virt = phys_to_virt(p->video_mem_phys); | ||
164 | } | ||
165 | |||
166 | struct platform_device vt8500_device_uart0 = { | ||
167 | .name = "vt8500_serial", | ||
168 | .id = 0, | ||
169 | }; | ||
170 | |||
171 | struct platform_device vt8500_device_uart1 = { | ||
172 | .name = "vt8500_serial", | ||
173 | .id = 1, | ||
174 | }; | ||
175 | |||
176 | struct platform_device vt8500_device_uart2 = { | ||
177 | .name = "vt8500_serial", | ||
178 | .id = 2, | ||
179 | }; | ||
180 | |||
181 | struct platform_device vt8500_device_uart3 = { | ||
182 | .name = "vt8500_serial", | ||
183 | .id = 3, | ||
184 | }; | ||
185 | |||
186 | struct platform_device vt8500_device_uart4 = { | ||
187 | .name = "vt8500_serial", | ||
188 | .id = 4, | ||
189 | }; | ||
190 | |||
191 | struct platform_device vt8500_device_uart5 = { | ||
192 | .name = "vt8500_serial", | ||
193 | .id = 5, | ||
194 | }; | ||
195 | |||
196 | static u64 ehci_dma_mask = DMA_BIT_MASK(32); | ||
197 | |||
198 | struct platform_device vt8500_device_ehci = { | ||
199 | .name = "vt8500-ehci", | ||
200 | .id = 0, | ||
201 | .dev = { | ||
202 | .dma_mask = &ehci_dma_mask, | ||
203 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
204 | }, | ||
205 | }; | ||
206 | |||
207 | struct platform_device vt8500_device_ge_rops = { | ||
208 | .name = "wmt_ge_rops", | ||
209 | .id = -1, | ||
210 | }; | ||
211 | |||
212 | struct platform_device vt8500_device_pwm = { | ||
213 | .name = "vt8500-pwm", | ||
214 | .id = 0, | ||
215 | }; | ||
216 | |||
217 | static struct platform_pwm_backlight_data vt8500_pwmbl_data = { | ||
218 | .pwm_id = 0, | ||
219 | .max_brightness = 128, | ||
220 | .dft_brightness = 70, | ||
221 | .pwm_period_ns = 250000, /* revisit when clocks are implemented */ | ||
222 | }; | ||
223 | |||
224 | struct platform_device vt8500_device_pwmbl = { | ||
225 | .name = "pwm-backlight", | ||
226 | .id = 0, | ||
227 | .dev = { | ||
228 | .platform_data = &vt8500_pwmbl_data, | ||
229 | }, | ||
230 | }; | ||
231 | |||
232 | struct platform_device vt8500_device_rtc = { | ||
233 | .name = "vt8500-rtc", | ||
234 | .id = 0, | ||
235 | }; | ||
236 | |||
237 | struct map_desc wmt_io_desc[] __initdata = { | ||
238 | /* SoC MMIO registers */ | ||
239 | [0] = { | ||
240 | .virtual = 0xf8000000, | ||
241 | .pfn = __phys_to_pfn(0xd8000000), | ||
242 | .length = 0x00390000, /* max of all chip variants */ | ||
243 | .type = MT_DEVICE | ||
244 | }, | ||
245 | /* PCI I/O space, numbers tied to those in <mach/io.h> */ | ||
246 | [1] = { | ||
247 | .virtual = 0xf0000000, | ||
248 | .pfn = __phys_to_pfn(0xc0000000), | ||
249 | .length = SZ_64K, | ||
250 | .type = MT_DEVICE | ||
251 | }, | ||
252 | }; | ||
253 | |||
254 | void __init vt8500_reserve_mem(void) | ||
255 | { | ||
256 | #ifdef CONFIG_FB_VT8500 | ||
257 | panels[current_panel_idx].bpp = 16; /* Always use RGB565 */ | ||
258 | preallocate_fb(&panels[current_panel_idx], SZ_4M); | ||
259 | vt8500_device_lcdc.dev.platform_data = &panels[current_panel_idx]; | ||
260 | #endif | ||
261 | } | ||
262 | |||
263 | void __init wm8505_reserve_mem(void) | ||
264 | { | ||
265 | #if defined CONFIG_FB_WM8505 | ||
266 | panels[current_panel_idx].bpp = 32; /* Always use RGB888 */ | ||
267 | preallocate_fb(&panels[current_panel_idx], 32); | ||
268 | vt8500_device_wm8505_fb.dev.platform_data = &panels[current_panel_idx]; | ||
269 | #endif | ||
270 | } | ||
diff --git a/arch/arm/mach-vt8500/devices.h b/arch/arm/mach-vt8500/devices.h new file mode 100644 index 000000000000..188d4e17f35c --- /dev/null +++ b/arch/arm/mach-vt8500/devices.h | |||
@@ -0,0 +1,88 @@ | |||
1 | /* linux/arch/arm/mach-vt8500/devices.h | ||
2 | * | ||
3 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #ifndef __ARCH_ARM_MACH_VT8500_DEVICES_H | ||
17 | #define __ARCH_ARM_MACH_VT8500_DEVICES_H | ||
18 | |||
19 | #include <linux/platform_device.h> | ||
20 | #include <asm/mach/map.h> | ||
21 | |||
22 | void __init vt8500_init_irq(void); | ||
23 | void __init wm8505_init_irq(void); | ||
24 | void __init vt8500_map_io(void); | ||
25 | void __init wm8505_map_io(void); | ||
26 | void __init vt8500_reserve_mem(void); | ||
27 | void __init wm8505_reserve_mem(void); | ||
28 | void __init vt8500_gpio_init(void); | ||
29 | void __init vt8500_set_resources(void); | ||
30 | void __init wm8505_set_resources(void); | ||
31 | |||
32 | extern unsigned long wmt_ic_base __initdata; | ||
33 | extern unsigned long wmt_sic_base __initdata; | ||
34 | extern unsigned long wmt_gpio_base __initdata; | ||
35 | extern unsigned long wmt_pmc_base __initdata; | ||
36 | |||
37 | extern int wmt_nr_irqs __initdata; | ||
38 | extern int wmt_timer_irq __initdata; | ||
39 | extern int wmt_gpio_ext_irq[8] __initdata; | ||
40 | |||
41 | extern struct map_desc wmt_io_desc[2] __initdata; | ||
42 | |||
43 | static inline struct resource wmt_mmio_res(u32 start, u32 size) | ||
44 | { | ||
45 | struct resource tmp = { | ||
46 | .flags = IORESOURCE_MEM, | ||
47 | .start = start, | ||
48 | .end = start + size - 1, | ||
49 | }; | ||
50 | |||
51 | return tmp; | ||
52 | } | ||
53 | |||
54 | static inline struct resource wmt_irq_res(int irq) | ||
55 | { | ||
56 | struct resource tmp = { | ||
57 | .flags = IORESOURCE_IRQ, | ||
58 | .start = irq, | ||
59 | .end = irq, | ||
60 | }; | ||
61 | |||
62 | return tmp; | ||
63 | } | ||
64 | |||
65 | static inline void wmt_res_add(struct platform_device *pdev, | ||
66 | const struct resource *res, unsigned int num) | ||
67 | { | ||
68 | if (unlikely(platform_device_add_resources(pdev, res, num))) | ||
69 | pr_err("Failed to assign resources\n"); | ||
70 | } | ||
71 | |||
72 | extern struct sys_timer vt8500_timer; | ||
73 | |||
74 | extern struct platform_device vt8500_device_uart0; | ||
75 | extern struct platform_device vt8500_device_uart1; | ||
76 | extern struct platform_device vt8500_device_uart2; | ||
77 | extern struct platform_device vt8500_device_uart3; | ||
78 | extern struct platform_device vt8500_device_uart4; | ||
79 | extern struct platform_device vt8500_device_uart5; | ||
80 | |||
81 | extern struct platform_device vt8500_device_lcdc; | ||
82 | extern struct platform_device vt8500_device_wm8505_fb; | ||
83 | extern struct platform_device vt8500_device_ehci; | ||
84 | extern struct platform_device vt8500_device_ge_rops; | ||
85 | extern struct platform_device vt8500_device_pwm; | ||
86 | extern struct platform_device vt8500_device_pwmbl; | ||
87 | extern struct platform_device vt8500_device_rtc; | ||
88 | #endif | ||
diff --git a/arch/arm/mach-vt8500/gpio.c b/arch/arm/mach-vt8500/gpio.c new file mode 100644 index 000000000000..2bcc0ec783df --- /dev/null +++ b/arch/arm/mach-vt8500/gpio.c | |||
@@ -0,0 +1,240 @@ | |||
1 | /* linux/arch/arm/mach-vt8500/gpio.c | ||
2 | * | ||
3 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <linux/gpio.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/irq.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | #include "devices.h" | ||
22 | |||
23 | #define to_vt8500(__chip) container_of(__chip, struct vt8500_gpio_chip, chip) | ||
24 | |||
25 | #define ENABLE_REGS 0x0 | ||
26 | #define DIRECTION_REGS 0x20 | ||
27 | #define OUTVALUE_REGS 0x40 | ||
28 | #define INVALUE_REGS 0x60 | ||
29 | |||
30 | #define EXT_REGOFF 0x1c | ||
31 | |||
32 | static void __iomem *regbase; | ||
33 | |||
34 | struct vt8500_gpio_chip { | ||
35 | struct gpio_chip chip; | ||
36 | unsigned int shift; | ||
37 | unsigned int regoff; | ||
38 | }; | ||
39 | |||
40 | static int gpio_to_irq_map[8]; | ||
41 | |||
42 | static int vt8500_muxed_gpio_request(struct gpio_chip *chip, | ||
43 | unsigned offset) | ||
44 | { | ||
45 | struct vt8500_gpio_chip *vt8500_chip = to_vt8500(chip); | ||
46 | unsigned val = readl(regbase + ENABLE_REGS + vt8500_chip->regoff); | ||
47 | |||
48 | val |= (1 << vt8500_chip->shift << offset); | ||
49 | writel(val, regbase + ENABLE_REGS + vt8500_chip->regoff); | ||
50 | |||
51 | return 0; | ||
52 | } | ||
53 | |||
54 | static void vt8500_muxed_gpio_free(struct gpio_chip *chip, | ||
55 | unsigned offset) | ||
56 | { | ||
57 | struct vt8500_gpio_chip *vt8500_chip = to_vt8500(chip); | ||
58 | unsigned val = readl(regbase + ENABLE_REGS + vt8500_chip->regoff); | ||
59 | |||
60 | val &= ~(1 << vt8500_chip->shift << offset); | ||
61 | writel(val, regbase + ENABLE_REGS + vt8500_chip->regoff); | ||
62 | } | ||
63 | |||
64 | static int vt8500_muxed_gpio_direction_input(struct gpio_chip *chip, | ||
65 | unsigned offset) | ||
66 | { | ||
67 | struct vt8500_gpio_chip *vt8500_chip = to_vt8500(chip); | ||
68 | unsigned val = readl(regbase + DIRECTION_REGS + vt8500_chip->regoff); | ||
69 | |||
70 | val &= ~(1 << vt8500_chip->shift << offset); | ||
71 | writel(val, regbase + DIRECTION_REGS + vt8500_chip->regoff); | ||
72 | |||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | static int vt8500_muxed_gpio_direction_output(struct gpio_chip *chip, | ||
77 | unsigned offset, int value) | ||
78 | { | ||
79 | struct vt8500_gpio_chip *vt8500_chip = to_vt8500(chip); | ||
80 | unsigned val = readl(regbase + DIRECTION_REGS + vt8500_chip->regoff); | ||
81 | |||
82 | val |= (1 << vt8500_chip->shift << offset); | ||
83 | writel(val, regbase + DIRECTION_REGS + vt8500_chip->regoff); | ||
84 | |||
85 | if (value) { | ||
86 | val = readl(regbase + OUTVALUE_REGS + vt8500_chip->regoff); | ||
87 | val |= (1 << vt8500_chip->shift << offset); | ||
88 | writel(val, regbase + OUTVALUE_REGS + vt8500_chip->regoff); | ||
89 | } | ||
90 | return 0; | ||
91 | } | ||
92 | |||
93 | static int vt8500_muxed_gpio_get_value(struct gpio_chip *chip, | ||
94 | unsigned offset) | ||
95 | { | ||
96 | struct vt8500_gpio_chip *vt8500_chip = to_vt8500(chip); | ||
97 | |||
98 | return (readl(regbase + INVALUE_REGS + vt8500_chip->regoff) | ||
99 | >> vt8500_chip->shift >> offset) & 1; | ||
100 | } | ||
101 | |||
102 | static void vt8500_muxed_gpio_set_value(struct gpio_chip *chip, | ||
103 | unsigned offset, int value) | ||
104 | { | ||
105 | struct vt8500_gpio_chip *vt8500_chip = to_vt8500(chip); | ||
106 | unsigned val = readl(regbase + INVALUE_REGS + vt8500_chip->regoff); | ||
107 | |||
108 | if (value) | ||
109 | val |= (1 << vt8500_chip->shift << offset); | ||
110 | else | ||
111 | val &= ~(1 << vt8500_chip->shift << offset); | ||
112 | |||
113 | writel(val, regbase + INVALUE_REGS + vt8500_chip->regoff); | ||
114 | } | ||
115 | |||
116 | #define VT8500_GPIO_BANK(__name, __shift, __off, __base, __num) \ | ||
117 | { \ | ||
118 | .chip = { \ | ||
119 | .label = __name, \ | ||
120 | .request = vt8500_muxed_gpio_request, \ | ||
121 | .free = vt8500_muxed_gpio_free, \ | ||
122 | .direction_input = vt8500_muxed_gpio_direction_input, \ | ||
123 | .direction_output = vt8500_muxed_gpio_direction_output, \ | ||
124 | .get = vt8500_muxed_gpio_get_value, \ | ||
125 | .set = vt8500_muxed_gpio_set_value, \ | ||
126 | .can_sleep = 0, \ | ||
127 | .base = __base, \ | ||
128 | .ngpio = __num, \ | ||
129 | }, \ | ||
130 | .shift = __shift, \ | ||
131 | .regoff = __off, \ | ||
132 | } | ||
133 | |||
134 | static struct vt8500_gpio_chip vt8500_muxed_gpios[] = { | ||
135 | VT8500_GPIO_BANK("uart0", 0, 0x0, 8, 4), | ||
136 | VT8500_GPIO_BANK("uart1", 4, 0x0, 12, 4), | ||
137 | VT8500_GPIO_BANK("spi0", 8, 0x0, 16, 4), | ||
138 | VT8500_GPIO_BANK("spi1", 12, 0x0, 20, 4), | ||
139 | VT8500_GPIO_BANK("spi2", 16, 0x0, 24, 4), | ||
140 | VT8500_GPIO_BANK("pwmout", 24, 0x0, 28, 2), | ||
141 | |||
142 | VT8500_GPIO_BANK("sdmmc", 0, 0x4, 30, 11), | ||
143 | VT8500_GPIO_BANK("ms", 16, 0x4, 41, 7), | ||
144 | VT8500_GPIO_BANK("i2c0", 24, 0x4, 48, 2), | ||
145 | VT8500_GPIO_BANK("i2c1", 26, 0x4, 50, 2), | ||
146 | |||
147 | VT8500_GPIO_BANK("mii", 0, 0x8, 52, 20), | ||
148 | VT8500_GPIO_BANK("see", 20, 0x8, 72, 4), | ||
149 | VT8500_GPIO_BANK("ide", 24, 0x8, 76, 7), | ||
150 | |||
151 | VT8500_GPIO_BANK("ccir", 0, 0xc, 83, 19), | ||
152 | |||
153 | VT8500_GPIO_BANK("ts", 8, 0x10, 102, 11), | ||
154 | |||
155 | VT8500_GPIO_BANK("lcd", 0, 0x14, 113, 23), | ||
156 | }; | ||
157 | |||
158 | static int vt8500_gpio_direction_input(struct gpio_chip *chip, | ||
159 | unsigned offset) | ||
160 | { | ||
161 | unsigned val = readl(regbase + DIRECTION_REGS + EXT_REGOFF); | ||
162 | |||
163 | val &= ~(1 << offset); | ||
164 | writel(val, regbase + DIRECTION_REGS + EXT_REGOFF); | ||
165 | return 0; | ||
166 | } | ||
167 | |||
168 | static int vt8500_gpio_direction_output(struct gpio_chip *chip, | ||
169 | unsigned offset, int value) | ||
170 | { | ||
171 | unsigned val = readl(regbase + DIRECTION_REGS + EXT_REGOFF); | ||
172 | |||
173 | val |= (1 << offset); | ||
174 | writel(val, regbase + DIRECTION_REGS + EXT_REGOFF); | ||
175 | |||
176 | if (value) { | ||
177 | val = readl(regbase + OUTVALUE_REGS + EXT_REGOFF); | ||
178 | val |= (1 << offset); | ||
179 | writel(val, regbase + OUTVALUE_REGS + EXT_REGOFF); | ||
180 | } | ||
181 | return 0; | ||
182 | } | ||
183 | |||
184 | static int vt8500_gpio_get_value(struct gpio_chip *chip, | ||
185 | unsigned offset) | ||
186 | { | ||
187 | return (readl(regbase + INVALUE_REGS + EXT_REGOFF) >> offset) & 1; | ||
188 | } | ||
189 | |||
190 | static void vt8500_gpio_set_value(struct gpio_chip *chip, | ||
191 | unsigned offset, int value) | ||
192 | { | ||
193 | unsigned val = readl(regbase + OUTVALUE_REGS + EXT_REGOFF); | ||
194 | |||
195 | if (value) | ||
196 | val |= (1 << offset); | ||
197 | else | ||
198 | val &= ~(1 << offset); | ||
199 | |||
200 | writel(val, regbase + OUTVALUE_REGS + EXT_REGOFF); | ||
201 | } | ||
202 | |||
203 | static int vt8500_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | ||
204 | { | ||
205 | if (offset > 7) | ||
206 | return -EINVAL; | ||
207 | |||
208 | return gpio_to_irq_map[offset]; | ||
209 | } | ||
210 | |||
211 | static struct gpio_chip vt8500_external_gpios = { | ||
212 | .label = "extgpio", | ||
213 | .direction_input = vt8500_gpio_direction_input, | ||
214 | .direction_output = vt8500_gpio_direction_output, | ||
215 | .get = vt8500_gpio_get_value, | ||
216 | .set = vt8500_gpio_set_value, | ||
217 | .to_irq = vt8500_gpio_to_irq, | ||
218 | .can_sleep = 0, | ||
219 | .base = 0, | ||
220 | .ngpio = 8, | ||
221 | }; | ||
222 | |||
223 | void __init vt8500_gpio_init(void) | ||
224 | { | ||
225 | int i; | ||
226 | |||
227 | for (i = 0; i < 8; i++) | ||
228 | gpio_to_irq_map[i] = wmt_gpio_ext_irq[i]; | ||
229 | |||
230 | regbase = ioremap(wmt_gpio_base, SZ_64K); | ||
231 | if (!regbase) { | ||
232 | printk(KERN_ERR "Failed to map MMIO registers for GPIO\n"); | ||
233 | return; | ||
234 | } | ||
235 | |||
236 | gpiochip_add(&vt8500_external_gpios); | ||
237 | |||
238 | for (i = 0; i < ARRAY_SIZE(vt8500_muxed_gpios); i++) | ||
239 | gpiochip_add(&vt8500_muxed_gpios[i].chip); | ||
240 | } | ||
diff --git a/arch/arm/mach-vt8500/include/mach/debug-macro.S b/arch/arm/mach-vt8500/include/mach/debug-macro.S new file mode 100644 index 000000000000..f1191626ad51 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/debug-macro.S | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/debug-macro.S | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
5 | * | ||
6 | * Debugging macro include header | ||
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, rp, rv | ||
15 | mov \rp, #0x00200000 | ||
16 | orr \rv, \rp, #0xf8000000 | ||
17 | orr \rp, \rp, #0xd8000000 | ||
18 | .endm | ||
19 | |||
20 | .macro senduart,rd,rx | ||
21 | strb \rd, [\rx, #0] | ||
22 | .endm | ||
23 | |||
24 | .macro busyuart,rd,rx | ||
25 | 1001: ldr \rd, [\rx, #0x1c] | ||
26 | ands \rd, \rd, #0x2 | ||
27 | bne 1001b | ||
28 | .endm | ||
29 | |||
30 | .macro waituart,rd,rx | ||
31 | .endm | ||
diff --git a/arch/arm/mach-vt8500/include/mach/entry-macro.S b/arch/arm/mach-vt8500/include/mach/entry-macro.S new file mode 100644 index 000000000000..92684c7eaed3 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/entry-macro.S | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/entry-macro.S | ||
3 | * | ||
4 | * Low-level IRQ helper macros for VIA VT8500 | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | .macro disable_fiq | ||
12 | .endm | ||
13 | |||
14 | .macro get_irqnr_preamble, base, tmp | ||
15 | @ physical 0xd8140000 is virtual 0xf8140000 | ||
16 | mov \base, #0xf8000000 | ||
17 | orr \base, \base, #0x00140000 | ||
18 | .endm | ||
19 | |||
20 | .macro arch_ret_to_user, tmp1, tmp2 | ||
21 | .endm | ||
22 | |||
23 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
24 | ldr \irqnr, [\base] | ||
25 | cmp \irqnr, #63 @ may be false positive, check interrupt status | ||
26 | bne 1001f | ||
27 | ldr \irqstat, [\base, #0x84] | ||
28 | ands \irqstat, #0x80000000 | ||
29 | moveq \irqnr, #0 | ||
30 | 1001: | ||
31 | .endm | ||
32 | |||
diff --git a/arch/arm/mach-vt8500/include/mach/gpio.h b/arch/arm/mach-vt8500/include/mach/gpio.h new file mode 100644 index 000000000000..94ff27678a46 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/gpio.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #include <asm-generic/gpio.h> | ||
2 | |||
3 | #define gpio_get_value __gpio_get_value | ||
4 | #define gpio_set_value __gpio_set_value | ||
5 | #define gpio_cansleep __gpio_cansleep | ||
6 | #define gpio_to_irq __gpio_to_irq | ||
diff --git a/arch/arm/mach-vt8500/include/mach/hardware.h b/arch/arm/mach-vt8500/include/mach/hardware.h new file mode 100644 index 000000000000..db4163f72c39 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/hardware.h | |||
@@ -0,0 +1,12 @@ | |||
1 | /* arch/arm/mach-vt8500/include/mach/hardware.h | ||
2 | * | ||
3 | * This software is licensed under the terms of the GNU General Public | ||
4 | * License version 2, as published by the Free Software Foundation, and | ||
5 | * may be copied, distributed, and modified under those terms. | ||
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 | */ | ||
diff --git a/arch/arm/mach-vt8500/include/mach/i8042.h b/arch/arm/mach-vt8500/include/mach/i8042.h new file mode 100644 index 000000000000..cd7143cad6f3 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/i8042.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* arch/arm/mach-vt8500/include/mach/i8042.h | ||
2 | * | ||
3 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | extern unsigned long wmt_i8042_base __initdata; | ||
17 | extern int wmt_i8042_kbd_irq; | ||
18 | extern int wmt_i8042_aux_irq; | ||
diff --git a/arch/arm/mach-vt8500/include/mach/io.h b/arch/arm/mach-vt8500/include/mach/io.h new file mode 100644 index 000000000000..9077239f78c9 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/io.h | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/io.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov | ||
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 | #ifndef __ASM_ARM_ARCH_IO_H | ||
21 | #define __ASM_ARM_ARCH_IO_H | ||
22 | |||
23 | #define IO_SPACE_LIMIT 0xffff | ||
24 | |||
25 | #define __io(a) __typesafe_io((a) + 0xf0000000) | ||
26 | #define __mem_pci(a) (a) | ||
27 | |||
28 | #endif | ||
diff --git a/arch/arm/mach-vt8500/include/mach/irqs.h b/arch/arm/mach-vt8500/include/mach/irqs.h new file mode 100644 index 000000000000..a129fd1222fb --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/irqs.h | |||
@@ -0,0 +1,22 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/irqs.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | /* This value is just to make the core happy, never used otherwise */ | ||
22 | #define NR_IRQS 128 | ||
diff --git a/arch/arm/mach-vt8500/include/mach/memory.h b/arch/arm/mach-vt8500/include/mach/memory.h new file mode 100644 index 000000000000..175f914eff93 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/memory.h | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/memory.h | ||
3 | * | ||
4 | * Copyright (C) 2003 ARM Limited | ||
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 | #ifndef __ASM_ARCH_MEMORY_H | ||
21 | #define __ASM_ARCH_MEMORY_H | ||
22 | |||
23 | /* | ||
24 | * Physical DRAM offset. | ||
25 | */ | ||
26 | #define PHYS_OFFSET UL(0x00000000) | ||
27 | |||
28 | #endif | ||
diff --git a/arch/arm/mach-vt8500/include/mach/system.h b/arch/arm/mach-vt8500/include/mach/system.h new file mode 100644 index 000000000000..d6c757eaf26b --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/system.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/system.h | ||
3 | * | ||
4 | */ | ||
5 | #include <asm/io.h> | ||
6 | |||
7 | /* PM Software Reset request register */ | ||
8 | #define VT8500_PMSR_VIRT 0xf8130060 | ||
9 | |||
10 | static inline void arch_idle(void) | ||
11 | { | ||
12 | cpu_do_idle(); | ||
13 | } | ||
14 | |||
15 | static inline void arch_reset(char mode, const char *cmd) | ||
16 | { | ||
17 | writel(1, VT8500_PMSR_VIRT); | ||
18 | } | ||
diff --git a/arch/arm/mach-vt8500/include/mach/timex.h b/arch/arm/mach-vt8500/include/mach/timex.h new file mode 100644 index 000000000000..8487e4c690b7 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/timex.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/timex.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | #ifndef MACH_TIMEX_H | ||
22 | #define MACH_TIMEX_H | ||
23 | |||
24 | #define CLOCK_TICK_RATE (3000000) | ||
25 | |||
26 | #endif /* MACH_TIMEX_H */ | ||
diff --git a/arch/arm/mach-vt8500/include/mach/uncompress.h b/arch/arm/mach-vt8500/include/mach/uncompress.h new file mode 100644 index 000000000000..bb9e2d23fee3 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/uncompress.h | |||
@@ -0,0 +1,37 @@ | |||
1 | /* arch/arm/mach-vt8500/include/mach/uncompress.h | ||
2 | * | ||
3 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
4 | * | ||
5 | * Based on arch/arm/mach-dove/include/mach/uncompress.h | ||
6 | * | ||
7 | * This software is licensed under the terms of the GNU General Public | ||
8 | * License version 2, as published by the Free Software Foundation, and | ||
9 | * may be copied, distributed, and modified under those terms. | ||
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 | */ | ||
17 | |||
18 | #define UART0_PHYS 0xd8200000 | ||
19 | #include <asm/io.h> | ||
20 | |||
21 | static void putc(const char c) | ||
22 | { | ||
23 | while (readb(UART0_PHYS + 0x1c) & 0x2) | ||
24 | /* Tx busy, wait and poll */; | ||
25 | |||
26 | writeb(c, UART0_PHYS); | ||
27 | } | ||
28 | |||
29 | static void flush(void) | ||
30 | { | ||
31 | } | ||
32 | |||
33 | /* | ||
34 | * nothing to do | ||
35 | */ | ||
36 | #define arch_decomp_setup() | ||
37 | #define arch_decomp_wdog() | ||
diff --git a/arch/arm/mach-vt8500/include/mach/vmalloc.h b/arch/arm/mach-vt8500/include/mach/vmalloc.h new file mode 100644 index 000000000000..4642290ce416 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/vmalloc.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/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 0xd0000000UL | ||
diff --git a/arch/arm/mach-vt8500/include/mach/vt8500_irqs.h b/arch/arm/mach-vt8500/include/mach/vt8500_irqs.h new file mode 100644 index 000000000000..ecfee9124711 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/vt8500_irqs.h | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/vt8500_irqs.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | /* VT8500 Interrupt Sources */ | ||
22 | |||
23 | #define IRQ_JPEGENC 0 /* JPEG Encoder */ | ||
24 | #define IRQ_JPEGDEC 1 /* JPEG Decoder */ | ||
25 | /* Reserved */ | ||
26 | #define IRQ_PATA 3 /* PATA Controller */ | ||
27 | /* Reserved */ | ||
28 | #define IRQ_DMA 5 /* DMA Controller */ | ||
29 | #define IRQ_EXT0 6 /* External Interrupt 0 */ | ||
30 | #define IRQ_EXT1 7 /* External Interrupt 1 */ | ||
31 | #define IRQ_GE 8 /* Graphic Engine */ | ||
32 | #define IRQ_GOV 9 /* Graphic Overlay Engine */ | ||
33 | #define IRQ_ETHER 10 /* Ethernet MAC */ | ||
34 | #define IRQ_MPEGTS 11 /* Transport Stream Interface */ | ||
35 | #define IRQ_LCDC 12 /* LCD Controller */ | ||
36 | #define IRQ_EXT2 13 /* External Interrupt 2 */ | ||
37 | #define IRQ_EXT3 14 /* External Interrupt 3 */ | ||
38 | #define IRQ_EXT4 15 /* External Interrupt 4 */ | ||
39 | #define IRQ_CIPHER 16 /* Cipher */ | ||
40 | #define IRQ_VPP 17 /* Video Post-Processor */ | ||
41 | #define IRQ_I2C1 18 /* I2C 1 */ | ||
42 | #define IRQ_I2C0 19 /* I2C 0 */ | ||
43 | #define IRQ_SDMMC 20 /* SD/MMC Controller */ | ||
44 | #define IRQ_SDMMC_DMA 21 /* SD/MMC Controller DMA */ | ||
45 | #define IRQ_PMC_WU 22 /* Power Management Controller Wakeup */ | ||
46 | /* Reserved */ | ||
47 | #define IRQ_SPI0 24 /* SPI 0 */ | ||
48 | #define IRQ_SPI1 25 /* SPI 1 */ | ||
49 | #define IRQ_SPI2 26 /* SPI 2 */ | ||
50 | #define IRQ_LCDDF 27 /* LCD Data Formatter */ | ||
51 | #define IRQ_NAND 28 /* NAND Flash Controller */ | ||
52 | #define IRQ_NAND_DMA 29 /* NAND Flash Controller DMA */ | ||
53 | #define IRQ_MS 30 /* MemoryStick Controller */ | ||
54 | #define IRQ_MS_DMA 31 /* MemoryStick Controller DMA */ | ||
55 | #define IRQ_UART0 32 /* UART 0 */ | ||
56 | #define IRQ_UART1 33 /* UART 1 */ | ||
57 | #define IRQ_I2S 34 /* I2S */ | ||
58 | #define IRQ_PCM 35 /* PCM */ | ||
59 | #define IRQ_PMCOS0 36 /* PMC OS Timer 0 */ | ||
60 | #define IRQ_PMCOS1 37 /* PMC OS Timer 1 */ | ||
61 | #define IRQ_PMCOS2 38 /* PMC OS Timer 2 */ | ||
62 | #define IRQ_PMCOS3 39 /* PMC OS Timer 3 */ | ||
63 | #define IRQ_VPU 40 /* Video Processing Unit */ | ||
64 | #define IRQ_VID 41 /* Video Digital Input Interface */ | ||
65 | #define IRQ_AC97 42 /* AC97 Interface */ | ||
66 | #define IRQ_EHCI 43 /* USB */ | ||
67 | #define IRQ_NOR 44 /* NOR Flash Controller */ | ||
68 | #define IRQ_PS2MOUSE 45 /* PS/2 Mouse */ | ||
69 | #define IRQ_PS2KBD 46 /* PS/2 Keyboard */ | ||
70 | #define IRQ_UART2 47 /* UART 2 */ | ||
71 | #define IRQ_RTC 48 /* RTC Interrupt */ | ||
72 | #define IRQ_RTCSM 49 /* RTC Second/Minute Update Interrupt */ | ||
73 | #define IRQ_UART3 50 /* UART 3 */ | ||
74 | #define IRQ_ADC 51 /* ADC */ | ||
75 | #define IRQ_EXT5 52 /* External Interrupt 5 */ | ||
76 | #define IRQ_EXT6 53 /* External Interrupt 6 */ | ||
77 | #define IRQ_EXT7 54 /* External Interrupt 7 */ | ||
78 | #define IRQ_CIR 55 /* CIR */ | ||
79 | #define IRQ_DMA0 56 /* DMA Channel 0 */ | ||
80 | #define IRQ_DMA1 57 /* DMA Channel 1 */ | ||
81 | #define IRQ_DMA2 58 /* DMA Channel 2 */ | ||
82 | #define IRQ_DMA3 59 /* DMA Channel 3 */ | ||
83 | #define IRQ_DMA4 60 /* DMA Channel 4 */ | ||
84 | #define IRQ_DMA5 61 /* DMA Channel 5 */ | ||
85 | #define IRQ_DMA6 62 /* DMA Channel 6 */ | ||
86 | #define IRQ_DMA7 63 /* DMA Channel 7 */ | ||
87 | |||
88 | #define VT8500_NR_IRQS 64 | ||
diff --git a/arch/arm/mach-vt8500/include/mach/vt8500_regs.h b/arch/arm/mach-vt8500/include/mach/vt8500_regs.h new file mode 100644 index 000000000000..29c63ecb2383 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/vt8500_regs.h | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/vt8500_regs.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | #ifndef __ASM_ARM_ARCH_VT8500_REGS_H | ||
21 | #define __ASM_ARM_ARCH_VT8500_REGS_H | ||
22 | |||
23 | /* VT8500 Registers Map */ | ||
24 | |||
25 | #define VT8500_REGS_START_PHYS 0xd8000000 /* Start of MMIO registers */ | ||
26 | #define VT8500_REGS_START_VIRT 0xf8000000 /* Virtual mapping start */ | ||
27 | |||
28 | #define VT8500_DDR_BASE 0xd8000000 /* 1k DDR/DDR2 Memory | ||
29 | Controller */ | ||
30 | #define VT8500_DMA_BASE 0xd8001000 /* 1k DMA Controller */ | ||
31 | #define VT8500_SFLASH_BASE 0xd8002000 /* 1k Serial Flash Memory | ||
32 | Controller */ | ||
33 | #define VT8500_ETHER_BASE 0xd8004000 /* 1k Ethernet MAC 0 */ | ||
34 | #define VT8500_CIPHER_BASE 0xd8006000 /* 4k Cipher */ | ||
35 | #define VT8500_USB_BASE 0xd8007800 /* 2k USB OTG */ | ||
36 | # define VT8500_EHCI_BASE 0xd8007900 /* EHCI */ | ||
37 | # define VT8500_UHCI_BASE 0xd8007b01 /* UHCI */ | ||
38 | #define VT8500_PATA_BASE 0xd8008000 /* 512 PATA */ | ||
39 | #define VT8500_PS2_BASE 0xd8008800 /* 1k PS/2 */ | ||
40 | #define VT8500_NAND_BASE 0xd8009000 /* 1k NAND Controller */ | ||
41 | #define VT8500_NOR_BASE 0xd8009400 /* 1k NOR Controller */ | ||
42 | #define VT8500_SDMMC_BASE 0xd800a000 /* 1k SD/MMC Controller */ | ||
43 | #define VT8500_MS_BASE 0xd800b000 /* 1k MS/MSPRO Controller */ | ||
44 | #define VT8500_LCDC_BASE 0xd800e400 /* 1k LCD Controller */ | ||
45 | #define VT8500_VPU_BASE 0xd8050000 /* 256 VPU */ | ||
46 | #define VT8500_GOV_BASE 0xd8050300 /* 256 GOV */ | ||
47 | #define VT8500_GEGEA_BASE 0xd8050400 /* 768 GE/GE Alpha Mixing */ | ||
48 | #define VT8500_LCDF_BASE 0xd8050900 /* 256 LCD Formatter */ | ||
49 | #define VT8500_VID_BASE 0xd8050a00 /* 256 VID */ | ||
50 | #define VT8500_VPP_BASE 0xd8050b00 /* 256 VPP */ | ||
51 | #define VT8500_TSBK_BASE 0xd80f4000 /* 4k TSBK */ | ||
52 | #define VT8500_JPEGDEC_BASE 0xd80fe000 /* 4k JPEG Decoder */ | ||
53 | #define VT8500_JPEGENC_BASE 0xd80ff000 /* 4k JPEG Encoder */ | ||
54 | #define VT8500_RTC_BASE 0xd8100000 /* 64k RTC */ | ||
55 | #define VT8500_GPIO_BASE 0xd8110000 /* 64k GPIO Configuration */ | ||
56 | #define VT8500_SCC_BASE 0xd8120000 /* 64k System Configuration*/ | ||
57 | #define VT8500_PMC_BASE 0xd8130000 /* 64k PMC Configuration */ | ||
58 | #define VT8500_IC_BASE 0xd8140000 /* 64k Interrupt Controller*/ | ||
59 | #define VT8500_UART0_BASE 0xd8200000 /* 64k UART 0 */ | ||
60 | #define VT8500_UART2_BASE 0xd8210000 /* 64k UART 2 */ | ||
61 | #define VT8500_PWM_BASE 0xd8220000 /* 64k PWM Configuration */ | ||
62 | #define VT8500_SPI0_BASE 0xd8240000 /* 64k SPI 0 */ | ||
63 | #define VT8500_SPI1_BASE 0xd8250000 /* 64k SPI 1 */ | ||
64 | #define VT8500_CIR_BASE 0xd8270000 /* 64k CIR */ | ||
65 | #define VT8500_I2C0_BASE 0xd8280000 /* 64k I2C 0 */ | ||
66 | #define VT8500_AC97_BASE 0xd8290000 /* 64k AC97 */ | ||
67 | #define VT8500_SPI2_BASE 0xd82a0000 /* 64k SPI 2 */ | ||
68 | #define VT8500_UART1_BASE 0xd82b0000 /* 64k UART 1 */ | ||
69 | #define VT8500_UART3_BASE 0xd82c0000 /* 64k UART 3 */ | ||
70 | #define VT8500_PCM_BASE 0xd82d0000 /* 64k PCM */ | ||
71 | #define VT8500_I2C1_BASE 0xd8320000 /* 64k I2C 1 */ | ||
72 | #define VT8500_I2S_BASE 0xd8330000 /* 64k I2S */ | ||
73 | #define VT8500_ADC_BASE 0xd8340000 /* 64k ADC */ | ||
74 | |||
75 | #define VT8500_REGS_END_PHYS 0xd834ffff /* End of MMIO registers */ | ||
76 | #define VT8500_REGS_LENGTH (VT8500_REGS_END_PHYS \ | ||
77 | - VT8500_REGS_START_PHYS + 1) | ||
78 | |||
79 | #endif | ||
diff --git a/arch/arm/mach-vt8500/include/mach/vt8500fb.h b/arch/arm/mach-vt8500/include/mach/vt8500fb.h new file mode 100644 index 000000000000..7f399c370fe0 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/vt8500fb.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * VT8500/WM8505 Frame Buffer platform data definitions | ||
3 | * | ||
4 | * Copyright (C) 2010 Ed Spiridonov <edo.rus@gmail.com> | ||
5 | * | ||
6 | * This software is licensed under the terms of the GNU General Public | ||
7 | * License version 2, as published by the Free Software Foundation, and | ||
8 | * may be copied, distributed, and modified under those terms. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #ifndef _VT8500FB_H | ||
17 | #define _VT8500FB_H | ||
18 | |||
19 | #include <linux/fb.h> | ||
20 | |||
21 | struct vt8500fb_platform_data { | ||
22 | struct fb_videomode mode; | ||
23 | u32 xres_virtual; | ||
24 | u32 yres_virtual; | ||
25 | u32 bpp; | ||
26 | unsigned long video_mem_phys; | ||
27 | void *video_mem_virt; | ||
28 | unsigned long video_mem_len; | ||
29 | }; | ||
30 | |||
31 | #endif /* _VT8500FB_H */ | ||
diff --git a/arch/arm/mach-vt8500/include/mach/wm8505_irqs.h b/arch/arm/mach-vt8500/include/mach/wm8505_irqs.h new file mode 100644 index 000000000000..6128627ac753 --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/wm8505_irqs.h | |||
@@ -0,0 +1,115 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/wm8505_irqs.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | /* WM8505 Interrupt Sources */ | ||
22 | |||
23 | #define IRQ_UHCI 0 /* UHC FS (UHCI?) */ | ||
24 | #define IRQ_EHCI 1 /* UHC HS */ | ||
25 | #define IRQ_UDCDMA 2 /* UDC DMA */ | ||
26 | /* Reserved */ | ||
27 | #define IRQ_PS2MOUSE 4 /* PS/2 Mouse */ | ||
28 | #define IRQ_UDC 5 /* UDC */ | ||
29 | #define IRQ_EXT0 6 /* External Interrupt 0 */ | ||
30 | #define IRQ_EXT1 7 /* External Interrupt 1 */ | ||
31 | #define IRQ_KEYPAD 8 /* Keypad */ | ||
32 | #define IRQ_DMA 9 /* DMA Controller */ | ||
33 | #define IRQ_ETHER 10 /* Ethernet MAC */ | ||
34 | /* Reserved */ | ||
35 | /* Reserved */ | ||
36 | #define IRQ_EXT2 13 /* External Interrupt 2 */ | ||
37 | #define IRQ_EXT3 14 /* External Interrupt 3 */ | ||
38 | #define IRQ_EXT4 15 /* External Interrupt 4 */ | ||
39 | #define IRQ_APB 16 /* APB Bridge */ | ||
40 | #define IRQ_DMA0 17 /* DMA Channel 0 */ | ||
41 | #define IRQ_I2C1 18 /* I2C 1 */ | ||
42 | #define IRQ_I2C0 19 /* I2C 0 */ | ||
43 | #define IRQ_SDMMC 20 /* SD/MMC Controller */ | ||
44 | #define IRQ_SDMMC_DMA 21 /* SD/MMC Controller DMA */ | ||
45 | #define IRQ_PMC_WU 22 /* Power Management Controller Wakeup */ | ||
46 | #define IRQ_PS2KBD 23 /* PS/2 Keyboard */ | ||
47 | #define IRQ_SPI0 24 /* SPI 0 */ | ||
48 | #define IRQ_SPI1 25 /* SPI 1 */ | ||
49 | #define IRQ_SPI2 26 /* SPI 2 */ | ||
50 | #define IRQ_DMA1 27 /* DMA Channel 1 */ | ||
51 | #define IRQ_NAND 28 /* NAND Flash Controller */ | ||
52 | #define IRQ_NAND_DMA 29 /* NAND Flash Controller DMA */ | ||
53 | #define IRQ_UART5 30 /* UART 5 */ | ||
54 | #define IRQ_UART4 31 /* UART 4 */ | ||
55 | #define IRQ_UART0 32 /* UART 0 */ | ||
56 | #define IRQ_UART1 33 /* UART 1 */ | ||
57 | #define IRQ_DMA2 34 /* DMA Channel 2 */ | ||
58 | #define IRQ_I2S 35 /* I2S */ | ||
59 | #define IRQ_PMCOS0 36 /* PMC OS Timer 0 */ | ||
60 | #define IRQ_PMCOS1 37 /* PMC OS Timer 1 */ | ||
61 | #define IRQ_PMCOS2 38 /* PMC OS Timer 2 */ | ||
62 | #define IRQ_PMCOS3 39 /* PMC OS Timer 3 */ | ||
63 | #define IRQ_DMA3 40 /* DMA Channel 3 */ | ||
64 | #define IRQ_DMA4 41 /* DMA Channel 4 */ | ||
65 | #define IRQ_AC97 42 /* AC97 Interface */ | ||
66 | /* Reserved */ | ||
67 | #define IRQ_NOR 44 /* NOR Flash Controller */ | ||
68 | #define IRQ_DMA5 45 /* DMA Channel 5 */ | ||
69 | #define IRQ_DMA6 46 /* DMA Channel 6 */ | ||
70 | #define IRQ_UART2 47 /* UART 2 */ | ||
71 | #define IRQ_RTC 48 /* RTC Interrupt */ | ||
72 | #define IRQ_RTCSM 49 /* RTC Second/Minute Update Interrupt */ | ||
73 | #define IRQ_UART3 50 /* UART 3 */ | ||
74 | #define IRQ_DMA7 51 /* DMA Channel 7 */ | ||
75 | #define IRQ_EXT5 52 /* External Interrupt 5 */ | ||
76 | #define IRQ_EXT6 53 /* External Interrupt 6 */ | ||
77 | #define IRQ_EXT7 54 /* External Interrupt 7 */ | ||
78 | #define IRQ_CIR 55 /* CIR */ | ||
79 | #define IRQ_SIC0 56 /* SIC IRQ0 */ | ||
80 | #define IRQ_SIC1 57 /* SIC IRQ1 */ | ||
81 | #define IRQ_SIC2 58 /* SIC IRQ2 */ | ||
82 | #define IRQ_SIC3 59 /* SIC IRQ3 */ | ||
83 | #define IRQ_SIC4 60 /* SIC IRQ4 */ | ||
84 | #define IRQ_SIC5 61 /* SIC IRQ5 */ | ||
85 | #define IRQ_SIC6 62 /* SIC IRQ6 */ | ||
86 | #define IRQ_SIC7 63 /* SIC IRQ7 */ | ||
87 | /* Reserved */ | ||
88 | #define IRQ_JPEGDEC 65 /* JPEG Decoder */ | ||
89 | #define IRQ_SAE 66 /* SAE (?) */ | ||
90 | /* Reserved */ | ||
91 | #define IRQ_VPU 79 /* Video Processing Unit */ | ||
92 | #define IRQ_VPP 80 /* Video Post-Processor */ | ||
93 | #define IRQ_VID 81 /* Video Digital Input Interface */ | ||
94 | #define IRQ_SPU 82 /* SPU (?) */ | ||
95 | #define IRQ_PIP 83 /* PIP Error */ | ||
96 | #define IRQ_GE 84 /* Graphic Engine */ | ||
97 | #define IRQ_GOV 85 /* Graphic Overlay Engine */ | ||
98 | #define IRQ_DVO 86 /* Digital Video Output */ | ||
99 | /* Reserved */ | ||
100 | #define IRQ_DMA8 92 /* DMA Channel 8 */ | ||
101 | #define IRQ_DMA9 93 /* DMA Channel 9 */ | ||
102 | #define IRQ_DMA10 94 /* DMA Channel 10 */ | ||
103 | #define IRQ_DMA11 95 /* DMA Channel 11 */ | ||
104 | #define IRQ_DMA12 96 /* DMA Channel 12 */ | ||
105 | #define IRQ_DMA13 97 /* DMA Channel 13 */ | ||
106 | #define IRQ_DMA14 98 /* DMA Channel 14 */ | ||
107 | #define IRQ_DMA15 99 /* DMA Channel 15 */ | ||
108 | /* Reserved */ | ||
109 | #define IRQ_GOVW 111 /* GOVW (?) */ | ||
110 | #define IRQ_GOVRSDSCD 112 /* GOVR SDSCD (?) */ | ||
111 | #define IRQ_GOVRSDMIF 113 /* GOVR SDMIF (?) */ | ||
112 | #define IRQ_GOVRHDSCD 114 /* GOVR HDSCD (?) */ | ||
113 | #define IRQ_GOVRHDMIF 115 /* GOVR HDMIF (?) */ | ||
114 | |||
115 | #define WM8505_NR_IRQS 116 | ||
diff --git a/arch/arm/mach-vt8500/include/mach/wm8505_regs.h b/arch/arm/mach-vt8500/include/mach/wm8505_regs.h new file mode 100644 index 000000000000..df1550941efb --- /dev/null +++ b/arch/arm/mach-vt8500/include/mach/wm8505_regs.h | |||
@@ -0,0 +1,78 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/wm8505_regs.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | #ifndef __ASM_ARM_ARCH_WM8505_REGS_H | ||
21 | #define __ASM_ARM_ARCH_WM8505_REGS_H | ||
22 | |||
23 | /* WM8505 Registers Map */ | ||
24 | |||
25 | #define WM8505_REGS_START_PHYS 0xd8000000 /* Start of MMIO registers */ | ||
26 | #define WM8505_REGS_START_VIRT 0xf8000000 /* Virtual mapping start */ | ||
27 | |||
28 | #define WM8505_DDR_BASE 0xd8000400 /* 1k DDR/DDR2 Memory | ||
29 | Controller */ | ||
30 | #define WM8505_DMA_BASE 0xd8001800 /* 1k DMA Controller */ | ||
31 | #define WM8505_VDMA_BASE 0xd8001c00 /* 1k VDMA */ | ||
32 | #define WM8505_SFLASH_BASE 0xd8002000 /* 1k Serial Flash Memory | ||
33 | Controller */ | ||
34 | #define WM8505_ETHER_BASE 0xd8004000 /* 1k Ethernet MAC 0 */ | ||
35 | #define WM8505_CIPHER_BASE 0xd8006000 /* 4k Cipher */ | ||
36 | #define WM8505_USB_BASE 0xd8007000 /* 2k USB 2.0 Host */ | ||
37 | # define WM8505_EHCI_BASE 0xd8007100 /* EHCI */ | ||
38 | # define WM8505_UHCI_BASE 0xd8007301 /* UHCI */ | ||
39 | #define WM8505_PS2_BASE 0xd8008800 /* 1k PS/2 */ | ||
40 | #define WM8505_NAND_BASE 0xd8009000 /* 1k NAND Controller */ | ||
41 | #define WM8505_NOR_BASE 0xd8009400 /* 1k NOR Controller */ | ||
42 | #define WM8505_SDMMC_BASE 0xd800a000 /* 1k SD/MMC Controller */ | ||
43 | #define WM8505_VPU_BASE 0xd8050000 /* 256 VPU */ | ||
44 | #define WM8505_GOV_BASE 0xd8050300 /* 256 GOV */ | ||
45 | #define WM8505_GEGEA_BASE 0xd8050400 /* 768 GE/GE Alpha Mixing */ | ||
46 | #define WM8505_GOVR_BASE 0xd8050800 /* 512 GOVR (frambuffer) */ | ||
47 | #define WM8505_VID_BASE 0xd8050a00 /* 256 VID */ | ||
48 | #define WM8505_SCL_BASE 0xd8050d00 /* 256 SCL */ | ||
49 | #define WM8505_VPP_BASE 0xd8050f00 /* 256 VPP */ | ||
50 | #define WM8505_JPEGDEC_BASE 0xd80fe000 /* 4k JPEG Decoder */ | ||
51 | #define WM8505_RTC_BASE 0xd8100000 /* 64k RTC */ | ||
52 | #define WM8505_GPIO_BASE 0xd8110000 /* 64k GPIO Configuration */ | ||
53 | #define WM8505_SCC_BASE 0xd8120000 /* 64k System Configuration*/ | ||
54 | #define WM8505_PMC_BASE 0xd8130000 /* 64k PMC Configuration */ | ||
55 | #define WM8505_IC_BASE 0xd8140000 /* 64k Interrupt Controller*/ | ||
56 | #define WM8505_SIC_BASE 0xd8150000 /* 64k Secondary IC */ | ||
57 | #define WM8505_UART0_BASE 0xd8200000 /* 64k UART 0 */ | ||
58 | #define WM8505_UART2_BASE 0xd8210000 /* 64k UART 2 */ | ||
59 | #define WM8505_PWM_BASE 0xd8220000 /* 64k PWM Configuration */ | ||
60 | #define WM8505_SPI0_BASE 0xd8240000 /* 64k SPI 0 */ | ||
61 | #define WM8505_SPI1_BASE 0xd8250000 /* 64k SPI 1 */ | ||
62 | #define WM8505_KEYPAD_BASE 0xd8260000 /* 64k Keypad control */ | ||
63 | #define WM8505_CIR_BASE 0xd8270000 /* 64k CIR */ | ||
64 | #define WM8505_I2C0_BASE 0xd8280000 /* 64k I2C 0 */ | ||
65 | #define WM8505_AC97_BASE 0xd8290000 /* 64k AC97 */ | ||
66 | #define WM8505_SPI2_BASE 0xd82a0000 /* 64k SPI 2 */ | ||
67 | #define WM8505_UART1_BASE 0xd82b0000 /* 64k UART 1 */ | ||
68 | #define WM8505_UART3_BASE 0xd82c0000 /* 64k UART 3 */ | ||
69 | #define WM8505_I2C1_BASE 0xd8320000 /* 64k I2C 1 */ | ||
70 | #define WM8505_I2S_BASE 0xd8330000 /* 64k I2S */ | ||
71 | #define WM8505_UART4_BASE 0xd8370000 /* 64k UART 4 */ | ||
72 | #define WM8505_UART5_BASE 0xd8380000 /* 64k UART 5 */ | ||
73 | |||
74 | #define WM8505_REGS_END_PHYS 0xd838ffff /* End of MMIO registers */ | ||
75 | #define WM8505_REGS_LENGTH (WM8505_REGS_END_PHYS \ | ||
76 | - WM8505_REGS_START_PHYS + 1) | ||
77 | |||
78 | #endif | ||
diff --git a/arch/arm/mach-vt8500/irq.c b/arch/arm/mach-vt8500/irq.c new file mode 100644 index 000000000000..5f4ddde4f02a --- /dev/null +++ b/arch/arm/mach-vt8500/irq.c | |||
@@ -0,0 +1,177 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/irq.c | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | #include <linux/io.h> | ||
22 | #include <linux/irq.h> | ||
23 | #include <linux/interrupt.h> | ||
24 | |||
25 | #include <asm/irq.h> | ||
26 | |||
27 | #include "devices.h" | ||
28 | |||
29 | #define VT8500_IC_DCTR 0x40 /* Destination control | ||
30 | register, 64*u8 */ | ||
31 | #define VT8500_INT_ENABLE (1 << 3) | ||
32 | #define VT8500_TRIGGER_HIGH (0 << 4) | ||
33 | #define VT8500_TRIGGER_RISING (1 << 4) | ||
34 | #define VT8500_TRIGGER_FALLING (2 << 4) | ||
35 | #define VT8500_EDGE ( VT8500_TRIGGER_RISING \ | ||
36 | | VT8500_TRIGGER_FALLING) | ||
37 | #define VT8500_IC_STATUS 0x80 /* Interrupt status, 2*u32 */ | ||
38 | |||
39 | static void __iomem *ic_regbase; | ||
40 | static void __iomem *sic_regbase; | ||
41 | |||
42 | static void vt8500_irq_mask(unsigned int irq) | ||
43 | { | ||
44 | void __iomem *base = ic_regbase; | ||
45 | u8 edge; | ||
46 | |||
47 | if (irq >= 64) { | ||
48 | base = sic_regbase; | ||
49 | irq -= 64; | ||
50 | } | ||
51 | edge = readb(base + VT8500_IC_DCTR + irq) & VT8500_EDGE; | ||
52 | if (edge) { | ||
53 | void __iomem *stat_reg = base + VT8500_IC_STATUS | ||
54 | + (irq < 32 ? 0 : 4); | ||
55 | unsigned status = readl(stat_reg); | ||
56 | |||
57 | status |= (1 << (irq & 0x1f)); | ||
58 | writel(status, stat_reg); | ||
59 | } else { | ||
60 | u8 dctr = readb(base + VT8500_IC_DCTR + irq); | ||
61 | |||
62 | dctr &= ~VT8500_INT_ENABLE; | ||
63 | writeb(dctr, base + VT8500_IC_DCTR + irq); | ||
64 | } | ||
65 | } | ||
66 | |||
67 | static void vt8500_irq_unmask(unsigned int irq) | ||
68 | { | ||
69 | void __iomem *base = ic_regbase; | ||
70 | u8 dctr; | ||
71 | |||
72 | if (irq >= 64) { | ||
73 | base = sic_regbase; | ||
74 | irq -= 64; | ||
75 | } | ||
76 | dctr = readb(base + VT8500_IC_DCTR + irq); | ||
77 | dctr |= VT8500_INT_ENABLE; | ||
78 | writeb(dctr, base + VT8500_IC_DCTR + irq); | ||
79 | } | ||
80 | |||
81 | static int vt8500_irq_set_type(unsigned int irq, unsigned int flow_type) | ||
82 | { | ||
83 | void __iomem *base = ic_regbase; | ||
84 | unsigned int orig_irq = irq; | ||
85 | u8 dctr; | ||
86 | |||
87 | if (irq >= 64) { | ||
88 | base = sic_regbase; | ||
89 | irq -= 64; | ||
90 | } | ||
91 | |||
92 | dctr = readb(base + VT8500_IC_DCTR + irq); | ||
93 | dctr &= ~VT8500_EDGE; | ||
94 | |||
95 | switch (flow_type) { | ||
96 | case IRQF_TRIGGER_LOW: | ||
97 | return -EINVAL; | ||
98 | case IRQF_TRIGGER_HIGH: | ||
99 | dctr |= VT8500_TRIGGER_HIGH; | ||
100 | irq_desc[orig_irq].handle_irq = handle_level_irq; | ||
101 | break; | ||
102 | case IRQF_TRIGGER_FALLING: | ||
103 | dctr |= VT8500_TRIGGER_FALLING; | ||
104 | irq_desc[orig_irq].handle_irq = handle_edge_irq; | ||
105 | break; | ||
106 | case IRQF_TRIGGER_RISING: | ||
107 | dctr |= VT8500_TRIGGER_RISING; | ||
108 | irq_desc[orig_irq].handle_irq = handle_edge_irq; | ||
109 | break; | ||
110 | } | ||
111 | writeb(dctr, base + VT8500_IC_DCTR + irq); | ||
112 | |||
113 | return 0; | ||
114 | } | ||
115 | |||
116 | static struct irq_chip vt8500_irq_chip = { | ||
117 | .name = "vt8500", | ||
118 | .ack = vt8500_irq_mask, | ||
119 | .mask = vt8500_irq_mask, | ||
120 | .unmask = vt8500_irq_unmask, | ||
121 | .set_type = vt8500_irq_set_type, | ||
122 | }; | ||
123 | |||
124 | void __init vt8500_init_irq(void) | ||
125 | { | ||
126 | unsigned int i; | ||
127 | |||
128 | ic_regbase = ioremap(wmt_ic_base, SZ_64K); | ||
129 | |||
130 | if (ic_regbase) { | ||
131 | /* Enable rotating priority for IRQ */ | ||
132 | writel((1 << 6), ic_regbase + 0x20); | ||
133 | writel(0, ic_regbase + 0x24); | ||
134 | |||
135 | for (i = 0; i < wmt_nr_irqs; i++) { | ||
136 | /* Disable all interrupts and route them to IRQ */ | ||
137 | writeb(0x00, ic_regbase + VT8500_IC_DCTR + i); | ||
138 | |||
139 | set_irq_chip(i, &vt8500_irq_chip); | ||
140 | set_irq_handler(i, handle_level_irq); | ||
141 | set_irq_flags(i, IRQF_VALID); | ||
142 | } | ||
143 | } else { | ||
144 | printk(KERN_ERR "Unable to remap the Interrupt Controller registers, not enabling IRQs!\n"); | ||
145 | } | ||
146 | } | ||
147 | |||
148 | void __init wm8505_init_irq(void) | ||
149 | { | ||
150 | unsigned int i; | ||
151 | |||
152 | ic_regbase = ioremap(wmt_ic_base, SZ_64K); | ||
153 | sic_regbase = ioremap(wmt_sic_base, SZ_64K); | ||
154 | |||
155 | if (ic_regbase && sic_regbase) { | ||
156 | /* Enable rotating priority for IRQ */ | ||
157 | writel((1 << 6), ic_regbase + 0x20); | ||
158 | writel(0, ic_regbase + 0x24); | ||
159 | writel((1 << 6), sic_regbase + 0x20); | ||
160 | writel(0, sic_regbase + 0x24); | ||
161 | |||
162 | for (i = 0; i < wmt_nr_irqs; i++) { | ||
163 | /* Disable all interrupts and route them to IRQ */ | ||
164 | if (i < 64) | ||
165 | writeb(0x00, ic_regbase + VT8500_IC_DCTR + i); | ||
166 | else | ||
167 | writeb(0x00, sic_regbase + VT8500_IC_DCTR | ||
168 | + i - 64); | ||
169 | |||
170 | set_irq_chip(i, &vt8500_irq_chip); | ||
171 | set_irq_handler(i, handle_level_irq); | ||
172 | set_irq_flags(i, IRQF_VALID); | ||
173 | } | ||
174 | } else { | ||
175 | printk(KERN_ERR "Unable to remap the Interrupt Controller registers, not enabling IRQs!\n"); | ||
176 | } | ||
177 | } | ||
diff --git a/arch/arm/mach-vt8500/pwm.c b/arch/arm/mach-vt8500/pwm.c new file mode 100644 index 000000000000..8ad825e93592 --- /dev/null +++ b/arch/arm/mach-vt8500/pwm.c | |||
@@ -0,0 +1,265 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/pwm.c | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
5 | * | ||
6 | * This software is licensed under the terms of the GNU General Public | ||
7 | * License version 2, as published by the Free Software Foundation, and | ||
8 | * may be copied, distributed, and modified under those terms. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/slab.h> | ||
20 | #include <linux/err.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/pwm.h> | ||
23 | #include <linux/delay.h> | ||
24 | |||
25 | #include <asm/div64.h> | ||
26 | |||
27 | #define VT8500_NR_PWMS 4 | ||
28 | |||
29 | static DEFINE_MUTEX(pwm_lock); | ||
30 | static LIST_HEAD(pwm_list); | ||
31 | |||
32 | struct pwm_device { | ||
33 | struct list_head node; | ||
34 | struct platform_device *pdev; | ||
35 | |||
36 | const char *label; | ||
37 | |||
38 | void __iomem *regbase; | ||
39 | |||
40 | unsigned int use_count; | ||
41 | unsigned int pwm_id; | ||
42 | }; | ||
43 | |||
44 | #define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t) | ||
45 | static inline void pwm_busy_wait(void __iomem *reg, u8 bitmask) | ||
46 | { | ||
47 | int loops = msecs_to_loops(10); | ||
48 | while ((readb(reg) & bitmask) && --loops) | ||
49 | cpu_relax(); | ||
50 | |||
51 | if (unlikely(!loops)) | ||
52 | pr_warning("Waiting for status bits 0x%x to clear timed out\n", | ||
53 | bitmask); | ||
54 | } | ||
55 | |||
56 | int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | ||
57 | { | ||
58 | unsigned long long c; | ||
59 | unsigned long period_cycles, prescale, pv, dc; | ||
60 | |||
61 | if (pwm == NULL || period_ns == 0 || duty_ns > period_ns) | ||
62 | return -EINVAL; | ||
63 | |||
64 | c = 25000000/2; /* wild guess --- need to implement clocks */ | ||
65 | c = c * period_ns; | ||
66 | do_div(c, 1000000000); | ||
67 | period_cycles = c; | ||
68 | |||
69 | if (period_cycles < 1) | ||
70 | period_cycles = 1; | ||
71 | prescale = (period_cycles - 1) / 4096; | ||
72 | pv = period_cycles / (prescale + 1) - 1; | ||
73 | if (pv > 4095) | ||
74 | pv = 4095; | ||
75 | |||
76 | if (prescale > 1023) | ||
77 | return -EINVAL; | ||
78 | |||
79 | c = (unsigned long long)pv * duty_ns; | ||
80 | do_div(c, period_ns); | ||
81 | dc = c; | ||
82 | |||
83 | pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 1)); | ||
84 | writel(prescale, pwm->regbase + 0x4 + (pwm->pwm_id << 4)); | ||
85 | |||
86 | pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 2)); | ||
87 | writel(pv, pwm->regbase + 0x8 + (pwm->pwm_id << 4)); | ||
88 | |||
89 | pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 3)); | ||
90 | writel(dc, pwm->regbase + 0xc + (pwm->pwm_id << 4)); | ||
91 | |||
92 | return 0; | ||
93 | } | ||
94 | EXPORT_SYMBOL(pwm_config); | ||
95 | |||
96 | int pwm_enable(struct pwm_device *pwm) | ||
97 | { | ||
98 | pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 0)); | ||
99 | writel(5, pwm->regbase + (pwm->pwm_id << 4)); | ||
100 | return 0; | ||
101 | } | ||
102 | EXPORT_SYMBOL(pwm_enable); | ||
103 | |||
104 | void pwm_disable(struct pwm_device *pwm) | ||
105 | { | ||
106 | pwm_busy_wait(pwm->regbase + 0x40 + pwm->pwm_id, (1 << 0)); | ||
107 | writel(0, pwm->regbase + (pwm->pwm_id << 4)); | ||
108 | } | ||
109 | EXPORT_SYMBOL(pwm_disable); | ||
110 | |||
111 | struct pwm_device *pwm_request(int pwm_id, const char *label) | ||
112 | { | ||
113 | struct pwm_device *pwm; | ||
114 | int found = 0; | ||
115 | |||
116 | mutex_lock(&pwm_lock); | ||
117 | |||
118 | list_for_each_entry(pwm, &pwm_list, node) { | ||
119 | if (pwm->pwm_id == pwm_id) { | ||
120 | found = 1; | ||
121 | break; | ||
122 | } | ||
123 | } | ||
124 | |||
125 | if (found) { | ||
126 | if (pwm->use_count == 0) { | ||
127 | pwm->use_count++; | ||
128 | pwm->label = label; | ||
129 | } else { | ||
130 | pwm = ERR_PTR(-EBUSY); | ||
131 | } | ||
132 | } else { | ||
133 | pwm = ERR_PTR(-ENOENT); | ||
134 | } | ||
135 | |||
136 | mutex_unlock(&pwm_lock); | ||
137 | return pwm; | ||
138 | } | ||
139 | EXPORT_SYMBOL(pwm_request); | ||
140 | |||
141 | void pwm_free(struct pwm_device *pwm) | ||
142 | { | ||
143 | mutex_lock(&pwm_lock); | ||
144 | |||
145 | if (pwm->use_count) { | ||
146 | pwm->use_count--; | ||
147 | pwm->label = NULL; | ||
148 | } else { | ||
149 | pr_warning("PWM device already freed\n"); | ||
150 | } | ||
151 | |||
152 | mutex_unlock(&pwm_lock); | ||
153 | } | ||
154 | EXPORT_SYMBOL(pwm_free); | ||
155 | |||
156 | static inline void __add_pwm(struct pwm_device *pwm) | ||
157 | { | ||
158 | mutex_lock(&pwm_lock); | ||
159 | list_add_tail(&pwm->node, &pwm_list); | ||
160 | mutex_unlock(&pwm_lock); | ||
161 | } | ||
162 | |||
163 | static int __devinit pwm_probe(struct platform_device *pdev) | ||
164 | { | ||
165 | struct pwm_device *pwms; | ||
166 | struct resource *r; | ||
167 | int ret = 0; | ||
168 | int i; | ||
169 | |||
170 | pwms = kzalloc(sizeof(struct pwm_device) * VT8500_NR_PWMS, GFP_KERNEL); | ||
171 | if (pwms == NULL) { | ||
172 | dev_err(&pdev->dev, "failed to allocate memory\n"); | ||
173 | return -ENOMEM; | ||
174 | } | ||
175 | |||
176 | for (i = 0; i < VT8500_NR_PWMS; i++) { | ||
177 | pwms[i].use_count = 0; | ||
178 | pwms[i].pwm_id = i; | ||
179 | pwms[i].pdev = pdev; | ||
180 | } | ||
181 | |||
182 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
183 | if (r == NULL) { | ||
184 | dev_err(&pdev->dev, "no memory resource defined\n"); | ||
185 | ret = -ENODEV; | ||
186 | goto err_free; | ||
187 | } | ||
188 | |||
189 | r = request_mem_region(r->start, resource_size(r), pdev->name); | ||
190 | if (r == NULL) { | ||
191 | dev_err(&pdev->dev, "failed to request memory resource\n"); | ||
192 | ret = -EBUSY; | ||
193 | goto err_free; | ||
194 | } | ||
195 | |||
196 | pwms[0].regbase = ioremap(r->start, resource_size(r)); | ||
197 | if (pwms[0].regbase == NULL) { | ||
198 | dev_err(&pdev->dev, "failed to ioremap() registers\n"); | ||
199 | ret = -ENODEV; | ||
200 | goto err_free_mem; | ||
201 | } | ||
202 | |||
203 | for (i = 1; i < VT8500_NR_PWMS; i++) | ||
204 | pwms[i].regbase = pwms[0].regbase; | ||
205 | |||
206 | for (i = 0; i < VT8500_NR_PWMS; i++) | ||
207 | __add_pwm(&pwms[i]); | ||
208 | |||
209 | platform_set_drvdata(pdev, pwms); | ||
210 | return 0; | ||
211 | |||
212 | err_free_mem: | ||
213 | release_mem_region(r->start, resource_size(r)); | ||
214 | err_free: | ||
215 | kfree(pwms); | ||
216 | return ret; | ||
217 | } | ||
218 | |||
219 | static int __devexit pwm_remove(struct platform_device *pdev) | ||
220 | { | ||
221 | struct pwm_device *pwms; | ||
222 | struct resource *r; | ||
223 | int i; | ||
224 | |||
225 | pwms = platform_get_drvdata(pdev); | ||
226 | if (pwms == NULL) | ||
227 | return -ENODEV; | ||
228 | |||
229 | mutex_lock(&pwm_lock); | ||
230 | |||
231 | for (i = 0; i < VT8500_NR_PWMS; i++) | ||
232 | list_del(&pwms[i].node); | ||
233 | mutex_unlock(&pwm_lock); | ||
234 | |||
235 | iounmap(pwms[0].regbase); | ||
236 | |||
237 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
238 | release_mem_region(r->start, resource_size(r)); | ||
239 | |||
240 | kfree(pwms); | ||
241 | return 0; | ||
242 | } | ||
243 | |||
244 | static struct platform_driver pwm_driver = { | ||
245 | .driver = { | ||
246 | .name = "vt8500-pwm", | ||
247 | .owner = THIS_MODULE, | ||
248 | }, | ||
249 | .probe = pwm_probe, | ||
250 | .remove = __devexit_p(pwm_remove), | ||
251 | }; | ||
252 | |||
253 | static int __init pwm_init(void) | ||
254 | { | ||
255 | return platform_driver_register(&pwm_driver); | ||
256 | } | ||
257 | arch_initcall(pwm_init); | ||
258 | |||
259 | static void __exit pwm_exit(void) | ||
260 | { | ||
261 | platform_driver_unregister(&pwm_driver); | ||
262 | } | ||
263 | module_exit(pwm_exit); | ||
264 | |||
265 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/arm/mach-vt8500/timer.c b/arch/arm/mach-vt8500/timer.c new file mode 100644 index 000000000000..d5376c592ab6 --- /dev/null +++ b/arch/arm/mach-vt8500/timer.c | |||
@@ -0,0 +1,155 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/timer.c | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | #include <linux/io.h> | ||
22 | #include <linux/irq.h> | ||
23 | #include <linux/interrupt.h> | ||
24 | #include <linux/clocksource.h> | ||
25 | #include <linux/clockchips.h> | ||
26 | #include <linux/delay.h> | ||
27 | |||
28 | #include <asm/mach/time.h> | ||
29 | |||
30 | #include "devices.h" | ||
31 | |||
32 | #define VT8500_TIMER_OFFSET 0x0100 | ||
33 | #define TIMER_MATCH_VAL 0x0000 | ||
34 | #define TIMER_COUNT_VAL 0x0010 | ||
35 | #define TIMER_STATUS_VAL 0x0014 | ||
36 | #define TIMER_IER_VAL 0x001c /* interrupt enable */ | ||
37 | #define TIMER_CTRL_VAL 0x0020 | ||
38 | #define TIMER_AS_VAL 0x0024 /* access status */ | ||
39 | #define TIMER_COUNT_R_ACTIVE (1 << 5) /* not ready for read */ | ||
40 | #define TIMER_COUNT_W_ACTIVE (1 << 4) /* not ready for write */ | ||
41 | #define TIMER_MATCH_W_ACTIVE (1 << 0) /* not ready for write */ | ||
42 | #define VT8500_TIMER_HZ 3000000 | ||
43 | |||
44 | #define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t) | ||
45 | |||
46 | static void __iomem *regbase; | ||
47 | |||
48 | static cycle_t vt8500_timer_read(struct clocksource *cs) | ||
49 | { | ||
50 | int loops = msecs_to_loops(10); | ||
51 | writel(3, regbase + TIMER_CTRL_VAL); | ||
52 | while ((readl((regbase + TIMER_AS_VAL)) & TIMER_COUNT_R_ACTIVE) | ||
53 | && --loops) | ||
54 | cpu_relax(); | ||
55 | return readl(regbase + TIMER_COUNT_VAL); | ||
56 | } | ||
57 | |||
58 | struct clocksource clocksource = { | ||
59 | .name = "vt8500_timer", | ||
60 | .rating = 200, | ||
61 | .read = vt8500_timer_read, | ||
62 | .mask = CLOCKSOURCE_MASK(32), | ||
63 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
64 | }; | ||
65 | |||
66 | static int vt8500_timer_set_next_event(unsigned long cycles, | ||
67 | struct clock_event_device *evt) | ||
68 | { | ||
69 | int loops = msecs_to_loops(10); | ||
70 | cycle_t alarm = clocksource.read(&clocksource) + cycles; | ||
71 | while ((readl(regbase + TIMER_AS_VAL) & TIMER_MATCH_W_ACTIVE) | ||
72 | && --loops) | ||
73 | cpu_relax(); | ||
74 | writel((unsigned long)alarm, regbase + TIMER_MATCH_VAL); | ||
75 | |||
76 | if ((signed)(alarm - clocksource.read(&clocksource)) <= 16) | ||
77 | return -ETIME; | ||
78 | |||
79 | writel(1, regbase + TIMER_IER_VAL); | ||
80 | |||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | static void vt8500_timer_set_mode(enum clock_event_mode mode, | ||
85 | struct clock_event_device *evt) | ||
86 | { | ||
87 | switch (mode) { | ||
88 | case CLOCK_EVT_MODE_RESUME: | ||
89 | case CLOCK_EVT_MODE_PERIODIC: | ||
90 | break; | ||
91 | case CLOCK_EVT_MODE_ONESHOT: | ||
92 | case CLOCK_EVT_MODE_UNUSED: | ||
93 | case CLOCK_EVT_MODE_SHUTDOWN: | ||
94 | writel(readl(regbase + TIMER_CTRL_VAL) | 1, | ||
95 | regbase + TIMER_CTRL_VAL); | ||
96 | writel(0, regbase + TIMER_IER_VAL); | ||
97 | break; | ||
98 | } | ||
99 | } | ||
100 | |||
101 | struct clock_event_device clockevent = { | ||
102 | .name = "vt8500_timer", | ||
103 | .features = CLOCK_EVT_FEAT_ONESHOT, | ||
104 | .rating = 200, | ||
105 | .set_next_event = vt8500_timer_set_next_event, | ||
106 | .set_mode = vt8500_timer_set_mode, | ||
107 | }; | ||
108 | |||
109 | static irqreturn_t vt8500_timer_interrupt(int irq, void *dev_id) | ||
110 | { | ||
111 | struct clock_event_device *evt = dev_id; | ||
112 | writel(0xf, regbase + TIMER_STATUS_VAL); | ||
113 | evt->event_handler(evt); | ||
114 | |||
115 | return IRQ_HANDLED; | ||
116 | } | ||
117 | |||
118 | struct irqaction irq = { | ||
119 | .name = "vt8500_timer", | ||
120 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | ||
121 | .handler = vt8500_timer_interrupt, | ||
122 | .dev_id = &clockevent, | ||
123 | }; | ||
124 | |||
125 | static void __init vt8500_timer_init(void) | ||
126 | { | ||
127 | regbase = ioremap(wmt_pmc_base + VT8500_TIMER_OFFSET, 0x28); | ||
128 | if (!regbase) | ||
129 | printk(KERN_ERR "vt8500_timer_init: failed to map MMIO registers\n"); | ||
130 | |||
131 | writel(1, regbase + TIMER_CTRL_VAL); | ||
132 | writel(0xf, regbase + TIMER_STATUS_VAL); | ||
133 | writel(~0, regbase + TIMER_MATCH_VAL); | ||
134 | |||
135 | if (clocksource_register_hz(&clocksource, VT8500_TIMER_HZ)) | ||
136 | printk(KERN_ERR "vt8500_timer_init: clocksource_register failed for %s\n", | ||
137 | clocksource.name); | ||
138 | |||
139 | clockevents_calc_mult_shift(&clockevent, VT8500_TIMER_HZ, 4); | ||
140 | |||
141 | /* copy-pasted from mach-msm; no idea */ | ||
142 | clockevent.max_delta_ns = | ||
143 | clockevent_delta2ns(0xf0000000, &clockevent); | ||
144 | clockevent.min_delta_ns = clockevent_delta2ns(4, &clockevent); | ||
145 | clockevent.cpumask = cpumask_of(0); | ||
146 | |||
147 | if (setup_irq(wmt_timer_irq, &irq)) | ||
148 | printk(KERN_ERR "vt8500_timer_init: setup_irq failed for %s\n", | ||
149 | clockevent.name); | ||
150 | clockevents_register_device(&clockevent); | ||
151 | } | ||
152 | |||
153 | struct sys_timer vt8500_timer = { | ||
154 | .init = vt8500_timer_init | ||
155 | }; | ||
diff --git a/arch/arm/mach-vt8500/wm8505_7in.c b/arch/arm/mach-vt8500/wm8505_7in.c new file mode 100644 index 000000000000..e73aadbcafd6 --- /dev/null +++ b/arch/arm/mach-vt8500/wm8505_7in.c | |||
@@ -0,0 +1,77 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/wm8505_7in.c | ||
3 | * | ||
4 | * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> | ||
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 | #include <linux/io.h> | ||
22 | #include <linux/pm.h> | ||
23 | |||
24 | #include <asm/mach-types.h> | ||
25 | #include <asm/mach/arch.h> | ||
26 | |||
27 | #include "devices.h" | ||
28 | |||
29 | static void __iomem *pmc_hiber; | ||
30 | |||
31 | static struct platform_device *devices[] __initdata = { | ||
32 | &vt8500_device_uart0, | ||
33 | &vt8500_device_ehci, | ||
34 | &vt8500_device_wm8505_fb, | ||
35 | &vt8500_device_ge_rops, | ||
36 | &vt8500_device_pwm, | ||
37 | &vt8500_device_pwmbl, | ||
38 | &vt8500_device_rtc, | ||
39 | }; | ||
40 | |||
41 | static void vt8500_power_off(void) | ||
42 | { | ||
43 | local_irq_disable(); | ||
44 | writew(5, pmc_hiber); | ||
45 | asm("mcr%? p15, 0, %0, c7, c0, 4" : : "r" (0)); | ||
46 | } | ||
47 | |||
48 | void __init wm8505_7in_init(void) | ||
49 | { | ||
50 | #ifdef CONFIG_FB_WM8505 | ||
51 | void __iomem *gpio_mux_reg = ioremap(wmt_gpio_base + 0x200, 4); | ||
52 | if (gpio_mux_reg) { | ||
53 | writel(readl(gpio_mux_reg) | 0x80000000, gpio_mux_reg); | ||
54 | iounmap(gpio_mux_reg); | ||
55 | } else { | ||
56 | printk(KERN_ERR "Could not remap the GPIO mux register, display may not work properly!\n"); | ||
57 | } | ||
58 | #endif | ||
59 | pmc_hiber = ioremap(wmt_pmc_base + 0x12, 2); | ||
60 | if (pmc_hiber) | ||
61 | pm_power_off = &vt8500_power_off; | ||
62 | else | ||
63 | printk(KERN_ERR "PMC Hibernation register could not be remapped, not enabling power off!\n"); | ||
64 | |||
65 | wm8505_set_resources(); | ||
66 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
67 | vt8500_gpio_init(); | ||
68 | } | ||
69 | |||
70 | MACHINE_START(WM8505_7IN_NETBOOK, "WM8505 7-inch generic netbook") | ||
71 | .boot_params = 0x00000100, | ||
72 | .reserve = wm8505_reserve_mem, | ||
73 | .map_io = wm8505_map_io, | ||
74 | .init_irq = wm8505_init_irq, | ||
75 | .timer = &vt8500_timer, | ||
76 | .init_machine = wm8505_7in_init, | ||
77 | MACHINE_END | ||
diff --git a/arch/arm/mach-w90x900/include/mach/memory.h b/arch/arm/mach-w90x900/include/mach/memory.h index 971b80702c27..f02905ba7746 100644 --- a/arch/arm/mach-w90x900/include/mach/memory.h +++ b/arch/arm/mach-w90x900/include/mach/memory.h | |||
@@ -18,6 +18,6 @@ | |||
18 | #ifndef __ASM_ARCH_MEMORY_H | 18 | #ifndef __ASM_ARCH_MEMORY_H |
19 | #define __ASM_ARCH_MEMORY_H | 19 | #define __ASM_ARCH_MEMORY_H |
20 | 20 | ||
21 | #define PHYS_OFFSET UL(0x00000000) | 21 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
22 | 22 | ||
23 | #endif | 23 | #endif |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index e4509bae8fc4..89266382b536 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -390,7 +390,7 @@ config CPU_PJ4 | |||
390 | 390 | ||
391 | # ARMv6 | 391 | # ARMv6 |
392 | config CPU_V6 | 392 | config CPU_V6 |
393 | bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX || ARCH_DOVE | 393 | bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX |
394 | select CPU_32v6 | 394 | select CPU_32v6 |
395 | select CPU_ABRT_EV6 | 395 | select CPU_ABRT_EV6 |
396 | select CPU_PABRT_V6 | 396 | select CPU_PABRT_V6 |
@@ -402,16 +402,18 @@ config CPU_V6 | |||
402 | select CPU_TLB_V6 if MMU | 402 | select CPU_TLB_V6 if MMU |
403 | 403 | ||
404 | # ARMv6k | 404 | # ARMv6k |
405 | config CPU_32v6K | 405 | config CPU_V6K |
406 | bool "Support ARM V6K processor extensions" if !SMP | 406 | bool "Support ARM V6K processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX |
407 | depends on CPU_V6 || CPU_V7 | 407 | select CPU_32v6 |
408 | default y if SMP | 408 | select CPU_32v6K |
409 | help | 409 | select CPU_ABRT_EV6 |
410 | Say Y here if your ARMv6 processor supports the 'K' extension. | 410 | select CPU_PABRT_V6 |
411 | This enables the kernel to use some instructions not present | 411 | select CPU_CACHE_V6 |
412 | on previous processors, and as such a kernel build with this | 412 | select CPU_CACHE_VIPT |
413 | enabled will not boot on processors with do not support these | 413 | select CPU_CP15_MMU |
414 | instructions. | 414 | select CPU_HAS_ASID if MMU |
415 | select CPU_COPY_V6 if MMU | ||
416 | select CPU_TLB_V6 if MMU | ||
415 | 417 | ||
416 | # ARMv7 | 418 | # ARMv7 |
417 | config CPU_V7 | 419 | config CPU_V7 |
@@ -433,25 +435,33 @@ config CPU_32v3 | |||
433 | bool | 435 | bool |
434 | select TLS_REG_EMUL if SMP || !MMU | 436 | select TLS_REG_EMUL if SMP || !MMU |
435 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 437 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
438 | select CPU_USE_DOMAINS if MMU | ||
436 | 439 | ||
437 | config CPU_32v4 | 440 | config CPU_32v4 |
438 | bool | 441 | bool |
439 | select TLS_REG_EMUL if SMP || !MMU | 442 | select TLS_REG_EMUL if SMP || !MMU |
440 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 443 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
444 | select CPU_USE_DOMAINS if MMU | ||
441 | 445 | ||
442 | config CPU_32v4T | 446 | config CPU_32v4T |
443 | bool | 447 | bool |
444 | select TLS_REG_EMUL if SMP || !MMU | 448 | select TLS_REG_EMUL if SMP || !MMU |
445 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 449 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
450 | select CPU_USE_DOMAINS if MMU | ||
446 | 451 | ||
447 | config CPU_32v5 | 452 | config CPU_32v5 |
448 | bool | 453 | bool |
449 | select TLS_REG_EMUL if SMP || !MMU | 454 | select TLS_REG_EMUL if SMP || !MMU |
450 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 455 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
456 | select CPU_USE_DOMAINS if MMU | ||
451 | 457 | ||
452 | config CPU_32v6 | 458 | config CPU_32v6 |
453 | bool | 459 | bool |
454 | select TLS_REG_EMUL if !CPU_32v6K && !MMU | 460 | select TLS_REG_EMUL if !CPU_32v6K && !MMU |
461 | select CPU_USE_DOMAINS if CPU_V6 && MMU | ||
462 | |||
463 | config CPU_32v6K | ||
464 | bool | ||
455 | 465 | ||
456 | config CPU_32v7 | 466 | config CPU_32v7 |
457 | bool | 467 | bool |
@@ -607,8 +617,6 @@ config CPU_CP15_MPU | |||
607 | 617 | ||
608 | config CPU_USE_DOMAINS | 618 | config CPU_USE_DOMAINS |
609 | bool | 619 | bool |
610 | depends on MMU | ||
611 | default y if !CPU_32v6K | ||
612 | help | 620 | help |
613 | This option enables or disables the use of domain switching | 621 | This option enables or disables the use of domain switching |
614 | via the set_fs() function. | 622 | via the set_fs() function. |
@@ -623,7 +631,7 @@ comment "Processor Features" | |||
623 | 631 | ||
624 | config ARM_THUMB | 632 | config ARM_THUMB |
625 | bool "Support Thumb user binaries" | 633 | bool "Support Thumb user binaries" |
626 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V7 || CPU_FEROCEON | 634 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON |
627 | default y | 635 | default y |
628 | help | 636 | help |
629 | Say Y if you want to include kernel support for running user space | 637 | Say Y if you want to include kernel support for running user space |
@@ -644,7 +652,7 @@ config ARM_THUMBEE | |||
644 | 652 | ||
645 | config SWP_EMULATE | 653 | config SWP_EMULATE |
646 | bool "Emulate SWP/SWPB instructions" | 654 | bool "Emulate SWP/SWPB instructions" |
647 | depends on !CPU_USE_DOMAINS && CPU_V7 && !CPU_V6 | 655 | depends on !CPU_USE_DOMAINS && CPU_V7 |
648 | select HAVE_PROC_CPU if PROC_FS | 656 | select HAVE_PROC_CPU if PROC_FS |
649 | default y if SMP | 657 | default y if SMP |
650 | help | 658 | help |
@@ -681,7 +689,7 @@ config CPU_BIG_ENDIAN | |||
681 | config CPU_ENDIAN_BE8 | 689 | config CPU_ENDIAN_BE8 |
682 | bool | 690 | bool |
683 | depends on CPU_BIG_ENDIAN | 691 | depends on CPU_BIG_ENDIAN |
684 | default CPU_V6 || CPU_V7 | 692 | default CPU_V6 || CPU_V6K || CPU_V7 |
685 | help | 693 | help |
686 | Support for the BE-8 (big-endian) mode on ARMv6 and ARMv7 processors. | 694 | Support for the BE-8 (big-endian) mode on ARMv6 and ARMv7 processors. |
687 | 695 | ||
@@ -747,7 +755,7 @@ config CPU_CACHE_ROUND_ROBIN | |||
747 | 755 | ||
748 | config CPU_BPREDICT_DISABLE | 756 | config CPU_BPREDICT_DISABLE |
749 | bool "Disable branch prediction" | 757 | bool "Disable branch prediction" |
750 | depends on CPU_ARM1020 || CPU_V6 || CPU_MOHAWK || CPU_XSC3 || CPU_V7 || CPU_FA526 | 758 | depends on CPU_ARM1020 || CPU_V6 || CPU_V6K || CPU_MOHAWK || CPU_XSC3 || CPU_V7 || CPU_FA526 |
751 | help | 759 | help |
752 | Say Y here to disable branch prediction. If unsure, say N. | 760 | Say Y here to disable branch prediction. If unsure, say N. |
753 | 761 | ||
@@ -767,7 +775,7 @@ config NEEDS_SYSCALL_FOR_CMPXCHG | |||
767 | 775 | ||
768 | config DMA_CACHE_RWFO | 776 | config DMA_CACHE_RWFO |
769 | bool "Enable read/write for ownership DMA cache maintenance" | 777 | bool "Enable read/write for ownership DMA cache maintenance" |
770 | depends on CPU_V6 && SMP | 778 | depends on CPU_V6K && SMP |
771 | default y | 779 | default y |
772 | help | 780 | help |
773 | The Snoop Control Unit on ARM11MPCore does not detect the | 781 | The Snoop Control Unit on ARM11MPCore does not detect the |
@@ -823,7 +831,7 @@ config CACHE_L2X0 | |||
823 | config CACHE_PL310 | 831 | config CACHE_PL310 |
824 | bool | 832 | bool |
825 | depends on CACHE_L2X0 | 833 | depends on CACHE_L2X0 |
826 | default y if CPU_V7 && !CPU_V6 | 834 | default y if CPU_V7 && !(CPU_V6 || CPU_V6K) |
827 | help | 835 | help |
828 | This option enables optimisations for the PL310 cache | 836 | This option enables optimisations for the PL310 cache |
829 | controller. | 837 | controller. |
@@ -845,16 +853,21 @@ config CACHE_XSC3L2 | |||
845 | help | 853 | help |
846 | This option enables the L2 cache on XScale3. | 854 | This option enables the L2 cache on XScale3. |
847 | 855 | ||
856 | config ARM_L1_CACHE_SHIFT_6 | ||
857 | bool | ||
858 | help | ||
859 | Setting ARM L1 cache line size to 64 Bytes. | ||
860 | |||
848 | config ARM_L1_CACHE_SHIFT | 861 | config ARM_L1_CACHE_SHIFT |
849 | int | 862 | int |
850 | default 6 if ARM_L1_CACHE_SHIFT_6 | 863 | default 6 if ARM_L1_CACHE_SHIFT_6 |
851 | default 5 | 864 | default 5 |
852 | 865 | ||
853 | config ARM_DMA_MEM_BUFFERABLE | 866 | config ARM_DMA_MEM_BUFFERABLE |
854 | bool "Use non-cacheable memory for DMA" if CPU_V6 && !CPU_V7 | 867 | bool "Use non-cacheable memory for DMA" if (CPU_V6 || CPU_V6K) && !CPU_V7 |
855 | depends on !(MACH_REALVIEW_PB1176 || REALVIEW_EB_ARM11MP || \ | 868 | depends on !(MACH_REALVIEW_PB1176 || REALVIEW_EB_ARM11MP || \ |
856 | MACH_REALVIEW_PB11MP) | 869 | MACH_REALVIEW_PB11MP) |
857 | default y if CPU_V6 || CPU_V7 | 870 | default y if CPU_V6 || CPU_V6K || CPU_V7 |
858 | help | 871 | help |
859 | Historically, the kernel has used strongly ordered mappings to | 872 | Historically, the kernel has used strongly ordered mappings to |
860 | provide DMA coherent memory. With the advent of ARMv7, mapping | 873 | provide DMA coherent memory. With the advent of ARMv7, mapping |
diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index 00d74a04af3a..bca7e61928c7 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile | |||
@@ -90,6 +90,7 @@ obj-$(CONFIG_CPU_XSC3) += proc-xsc3.o | |||
90 | obj-$(CONFIG_CPU_MOHAWK) += proc-mohawk.o | 90 | obj-$(CONFIG_CPU_MOHAWK) += proc-mohawk.o |
91 | obj-$(CONFIG_CPU_FEROCEON) += proc-feroceon.o | 91 | obj-$(CONFIG_CPU_FEROCEON) += proc-feroceon.o |
92 | obj-$(CONFIG_CPU_V6) += proc-v6.o | 92 | obj-$(CONFIG_CPU_V6) += proc-v6.o |
93 | obj-$(CONFIG_CPU_V6K) += proc-v6.o | ||
93 | obj-$(CONFIG_CPU_V7) += proc-v7.o | 94 | obj-$(CONFIG_CPU_V7) += proc-v7.o |
94 | 95 | ||
95 | AFLAGS_proc-v6.o :=-Wa,-march=armv6 | 96 | AFLAGS_proc-v6.o :=-Wa,-march=armv6 |
diff --git a/arch/arm/mm/abort-ev6.S b/arch/arm/mm/abort-ev6.S index f332df7f0d37..1478aa522144 100644 --- a/arch/arm/mm/abort-ev6.S +++ b/arch/arm/mm/abort-ev6.S | |||
@@ -20,11 +20,11 @@ | |||
20 | */ | 20 | */ |
21 | .align 5 | 21 | .align 5 |
22 | ENTRY(v6_early_abort) | 22 | ENTRY(v6_early_abort) |
23 | #ifdef CONFIG_CPU_32v6K | 23 | #ifdef CONFIG_CPU_V6 |
24 | clrex | ||
25 | #else | ||
26 | sub r1, sp, #4 @ Get unused stack location | 24 | sub r1, sp, #4 @ Get unused stack location |
27 | strex r0, r1, [r1] @ Clear the exclusive monitor | 25 | strex r0, r1, [r1] @ Clear the exclusive monitor |
26 | #elif defined(CONFIG_CPU_32v6K) | ||
27 | clrex | ||
28 | #endif | 28 | #endif |
29 | mrc p15, 0, r1, c5, c0, 0 @ get FSR | 29 | mrc p15, 0, r1, c5, c0, 0 @ get FSR |
30 | mrc p15, 0, r0, c6, c0, 0 @ get FAR | 30 | mrc p15, 0, r0, c6, c0, 0 @ get FAR |
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index f2ce38e085d2..ef59099a5463 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
@@ -73,18 +73,24 @@ static inline void l2x0_inv_line(unsigned long addr) | |||
73 | writel_relaxed(addr, base + L2X0_INV_LINE_PA); | 73 | writel_relaxed(addr, base + L2X0_INV_LINE_PA); |
74 | } | 74 | } |
75 | 75 | ||
76 | #ifdef CONFIG_PL310_ERRATA_588369 | 76 | #if defined(CONFIG_PL310_ERRATA_588369) || defined(CONFIG_PL310_ERRATA_727915) |
77 | static void debug_writel(unsigned long val) | ||
78 | { | ||
79 | extern void omap_smc1(u32 fn, u32 arg); | ||
80 | 77 | ||
81 | /* | 78 | #define debug_writel(val) outer_cache.set_debug(val) |
82 | * Texas Instrument secure monitor api to modify the | 79 | |
83 | * PL310 Debug Control Register. | 80 | static void l2x0_set_debug(unsigned long val) |
84 | */ | 81 | { |
85 | omap_smc1(0x100, val); | 82 | writel_relaxed(val, l2x0_base + L2X0_DEBUG_CTRL); |
86 | } | 83 | } |
84 | #else | ||
85 | /* Optimised out for non-errata case */ | ||
86 | static inline void debug_writel(unsigned long val) | ||
87 | { | ||
88 | } | ||
89 | |||
90 | #define l2x0_set_debug NULL | ||
91 | #endif | ||
87 | 92 | ||
93 | #ifdef CONFIG_PL310_ERRATA_588369 | ||
88 | static inline void l2x0_flush_line(unsigned long addr) | 94 | static inline void l2x0_flush_line(unsigned long addr) |
89 | { | 95 | { |
90 | void __iomem *base = l2x0_base; | 96 | void __iomem *base = l2x0_base; |
@@ -97,11 +103,6 @@ static inline void l2x0_flush_line(unsigned long addr) | |||
97 | } | 103 | } |
98 | #else | 104 | #else |
99 | 105 | ||
100 | /* Optimised out for non-errata case */ | ||
101 | static inline void debug_writel(unsigned long val) | ||
102 | { | ||
103 | } | ||
104 | |||
105 | static inline void l2x0_flush_line(unsigned long addr) | 106 | static inline void l2x0_flush_line(unsigned long addr) |
106 | { | 107 | { |
107 | void __iomem *base = l2x0_base; | 108 | void __iomem *base = l2x0_base; |
@@ -125,9 +126,11 @@ static void l2x0_flush_all(void) | |||
125 | 126 | ||
126 | /* clean all ways */ | 127 | /* clean all ways */ |
127 | spin_lock_irqsave(&l2x0_lock, flags); | 128 | spin_lock_irqsave(&l2x0_lock, flags); |
129 | debug_writel(0x03); | ||
128 | writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_INV_WAY); | 130 | writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_INV_WAY); |
129 | cache_wait_way(l2x0_base + L2X0_CLEAN_INV_WAY, l2x0_way_mask); | 131 | cache_wait_way(l2x0_base + L2X0_CLEAN_INV_WAY, l2x0_way_mask); |
130 | cache_sync(); | 132 | cache_sync(); |
133 | debug_writel(0x00); | ||
131 | spin_unlock_irqrestore(&l2x0_lock, flags); | 134 | spin_unlock_irqrestore(&l2x0_lock, flags); |
132 | } | 135 | } |
133 | 136 | ||
@@ -335,6 +338,7 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask) | |||
335 | outer_cache.flush_all = l2x0_flush_all; | 338 | outer_cache.flush_all = l2x0_flush_all; |
336 | outer_cache.inv_all = l2x0_inv_all; | 339 | outer_cache.inv_all = l2x0_inv_all; |
337 | outer_cache.disable = l2x0_disable; | 340 | outer_cache.disable = l2x0_disable; |
341 | outer_cache.set_debug = l2x0_set_debug; | ||
338 | 342 | ||
339 | printk(KERN_INFO "%s cache controller enabled\n", type); | 343 | printk(KERN_INFO "%s cache controller enabled\n", type); |
340 | printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d B\n", | 344 | printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d B\n", |
diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index b0a98305055c..afe209e1e1f8 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c | |||
@@ -31,7 +31,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
31 | struct mm_struct *mm = current->mm; | 31 | struct mm_struct *mm = current->mm; |
32 | struct vm_area_struct *vma; | 32 | struct vm_area_struct *vma; |
33 | unsigned long start_addr; | 33 | unsigned long start_addr; |
34 | #ifdef CONFIG_CPU_V6 | 34 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) |
35 | unsigned int cache_type; | 35 | unsigned int cache_type; |
36 | int do_align = 0, aliasing = 0; | 36 | int do_align = 0, aliasing = 0; |
37 | 37 | ||
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 3c67e92f7d59..ff7b43b5885a 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -827,16 +827,6 @@ static void __init sanity_check_meminfo(void) | |||
827 | * rather difficult. | 827 | * rather difficult. |
828 | */ | 828 | */ |
829 | reason = "with VIPT aliasing cache"; | 829 | reason = "with VIPT aliasing cache"; |
830 | } else if (is_smp() && tlb_ops_need_broadcast()) { | ||
831 | /* | ||
832 | * kmap_high needs to occasionally flush TLB entries, | ||
833 | * however, if the TLB entries need to be broadcast | ||
834 | * we may deadlock: | ||
835 | * kmap_high(irqs off)->flush_all_zero_pkmaps-> | ||
836 | * flush_tlb_kernel_range->smp_call_function_many | ||
837 | * (must not be called with irqs off) | ||
838 | */ | ||
839 | reason = "without hardware TLB ops broadcasting"; | ||
840 | } | 830 | } |
841 | if (reason) { | 831 | if (reason) { |
842 | printk(KERN_CRIT "HIGHMEM is not supported %s, ignoring high memory\n", | 832 | printk(KERN_CRIT "HIGHMEM is not supported %s, ignoring high memory\n", |
diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S index bcf748d9f4e2..226e3d8351c2 100644 --- a/arch/arm/mm/proc-arm1020.S +++ b/arch/arm/mm/proc-arm1020.S | |||
@@ -493,6 +493,9 @@ arm1020_processor_functions: | |||
493 | .word cpu_arm1020_dcache_clean_area | 493 | .word cpu_arm1020_dcache_clean_area |
494 | .word cpu_arm1020_switch_mm | 494 | .word cpu_arm1020_switch_mm |
495 | .word cpu_arm1020_set_pte_ext | 495 | .word cpu_arm1020_set_pte_ext |
496 | .word 0 | ||
497 | .word 0 | ||
498 | .word 0 | ||
496 | .size arm1020_processor_functions, . - arm1020_processor_functions | 499 | .size arm1020_processor_functions, . - arm1020_processor_functions |
497 | 500 | ||
498 | .section ".rodata" | 501 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S index ab7ec26657ea..86d9c2cf0bce 100644 --- a/arch/arm/mm/proc-arm1020e.S +++ b/arch/arm/mm/proc-arm1020e.S | |||
@@ -474,6 +474,9 @@ arm1020e_processor_functions: | |||
474 | .word cpu_arm1020e_dcache_clean_area | 474 | .word cpu_arm1020e_dcache_clean_area |
475 | .word cpu_arm1020e_switch_mm | 475 | .word cpu_arm1020e_switch_mm |
476 | .word cpu_arm1020e_set_pte_ext | 476 | .word cpu_arm1020e_set_pte_ext |
477 | .word 0 | ||
478 | .word 0 | ||
479 | .word 0 | ||
477 | .size arm1020e_processor_functions, . - arm1020e_processor_functions | 480 | .size arm1020e_processor_functions, . - arm1020e_processor_functions |
478 | 481 | ||
479 | .section ".rodata" | 482 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S index 831c5e54e22f..83d3dd34f846 100644 --- a/arch/arm/mm/proc-arm1022.S +++ b/arch/arm/mm/proc-arm1022.S | |||
@@ -457,6 +457,9 @@ arm1022_processor_functions: | |||
457 | .word cpu_arm1022_dcache_clean_area | 457 | .word cpu_arm1022_dcache_clean_area |
458 | .word cpu_arm1022_switch_mm | 458 | .word cpu_arm1022_switch_mm |
459 | .word cpu_arm1022_set_pte_ext | 459 | .word cpu_arm1022_set_pte_ext |
460 | .word 0 | ||
461 | .word 0 | ||
462 | .word 0 | ||
460 | .size arm1022_processor_functions, . - arm1022_processor_functions | 463 | .size arm1022_processor_functions, . - arm1022_processor_functions |
461 | 464 | ||
462 | .section ".rodata" | 465 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S index e3f7e9a166bf..686043ee7281 100644 --- a/arch/arm/mm/proc-arm1026.S +++ b/arch/arm/mm/proc-arm1026.S | |||
@@ -452,6 +452,9 @@ arm1026_processor_functions: | |||
452 | .word cpu_arm1026_dcache_clean_area | 452 | .word cpu_arm1026_dcache_clean_area |
453 | .word cpu_arm1026_switch_mm | 453 | .word cpu_arm1026_switch_mm |
454 | .word cpu_arm1026_set_pte_ext | 454 | .word cpu_arm1026_set_pte_ext |
455 | .word 0 | ||
456 | .word 0 | ||
457 | .word 0 | ||
455 | .size arm1026_processor_functions, . - arm1026_processor_functions | 458 | .size arm1026_processor_functions, . - arm1026_processor_functions |
456 | 459 | ||
457 | .section .rodata | 460 | .section .rodata |
diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S index 6a7be1863edd..5f79dc4ce3fb 100644 --- a/arch/arm/mm/proc-arm6_7.S +++ b/arch/arm/mm/proc-arm6_7.S | |||
@@ -284,6 +284,9 @@ ENTRY(arm6_processor_functions) | |||
284 | .word cpu_arm6_dcache_clean_area | 284 | .word cpu_arm6_dcache_clean_area |
285 | .word cpu_arm6_switch_mm | 285 | .word cpu_arm6_switch_mm |
286 | .word cpu_arm6_set_pte_ext | 286 | .word cpu_arm6_set_pte_ext |
287 | .word 0 | ||
288 | .word 0 | ||
289 | .word 0 | ||
287 | .size arm6_processor_functions, . - arm6_processor_functions | 290 | .size arm6_processor_functions, . - arm6_processor_functions |
288 | 291 | ||
289 | /* | 292 | /* |
@@ -301,6 +304,9 @@ ENTRY(arm7_processor_functions) | |||
301 | .word cpu_arm7_dcache_clean_area | 304 | .word cpu_arm7_dcache_clean_area |
302 | .word cpu_arm7_switch_mm | 305 | .word cpu_arm7_switch_mm |
303 | .word cpu_arm7_set_pte_ext | 306 | .word cpu_arm7_set_pte_ext |
307 | .word 0 | ||
308 | .word 0 | ||
309 | .word 0 | ||
304 | .size arm7_processor_functions, . - arm7_processor_functions | 310 | .size arm7_processor_functions, . - arm7_processor_functions |
305 | 311 | ||
306 | .section ".rodata" | 312 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S index c285395f44b2..665266da143c 100644 --- a/arch/arm/mm/proc-arm720.S +++ b/arch/arm/mm/proc-arm720.S | |||
@@ -185,6 +185,9 @@ ENTRY(arm720_processor_functions) | |||
185 | .word cpu_arm720_dcache_clean_area | 185 | .word cpu_arm720_dcache_clean_area |
186 | .word cpu_arm720_switch_mm | 186 | .word cpu_arm720_switch_mm |
187 | .word cpu_arm720_set_pte_ext | 187 | .word cpu_arm720_set_pte_ext |
188 | .word 0 | ||
189 | .word 0 | ||
190 | .word 0 | ||
188 | .size arm720_processor_functions, . - arm720_processor_functions | 191 | .size arm720_processor_functions, . - arm720_processor_functions |
189 | 192 | ||
190 | .section ".rodata" | 193 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S index 38b27dcba727..6f9d12effee1 100644 --- a/arch/arm/mm/proc-arm740.S +++ b/arch/arm/mm/proc-arm740.S | |||
@@ -130,6 +130,9 @@ ENTRY(arm740_processor_functions) | |||
130 | .word cpu_arm740_dcache_clean_area | 130 | .word cpu_arm740_dcache_clean_area |
131 | .word cpu_arm740_switch_mm | 131 | .word cpu_arm740_switch_mm |
132 | .word 0 @ cpu_*_set_pte | 132 | .word 0 @ cpu_*_set_pte |
133 | .word 0 | ||
134 | .word 0 | ||
135 | .word 0 | ||
133 | .size arm740_processor_functions, . - arm740_processor_functions | 136 | .size arm740_processor_functions, . - arm740_processor_functions |
134 | 137 | ||
135 | .section ".rodata" | 138 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm7tdmi.S b/arch/arm/mm/proc-arm7tdmi.S index 0c9786de20af..e4c165ca6696 100644 --- a/arch/arm/mm/proc-arm7tdmi.S +++ b/arch/arm/mm/proc-arm7tdmi.S | |||
@@ -70,6 +70,9 @@ ENTRY(arm7tdmi_processor_functions) | |||
70 | .word cpu_arm7tdmi_dcache_clean_area | 70 | .word cpu_arm7tdmi_dcache_clean_area |
71 | .word cpu_arm7tdmi_switch_mm | 71 | .word cpu_arm7tdmi_switch_mm |
72 | .word 0 @ cpu_*_set_pte | 72 | .word 0 @ cpu_*_set_pte |
73 | .word 0 | ||
74 | .word 0 | ||
75 | .word 0 | ||
73 | .size arm7tdmi_processor_functions, . - arm7tdmi_processor_functions | 76 | .size arm7tdmi_processor_functions, . - arm7tdmi_processor_functions |
74 | 77 | ||
75 | .section ".rodata" | 78 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index 6109f278a904..219980ec8b6e 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S | |||
@@ -387,6 +387,40 @@ ENTRY(cpu_arm920_set_pte_ext) | |||
387 | #endif | 387 | #endif |
388 | mov pc, lr | 388 | mov pc, lr |
389 | 389 | ||
390 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ | ||
391 | .globl cpu_arm920_suspend_size | ||
392 | .equ cpu_arm920_suspend_size, 4 * 3 | ||
393 | #ifdef CONFIG_PM | ||
394 | ENTRY(cpu_arm920_do_suspend) | ||
395 | stmfd sp!, {r4 - r7, lr} | ||
396 | mrc p15, 0, r4, c13, c0, 0 @ PID | ||
397 | mrc p15, 0, r5, c3, c0, 0 @ Domain ID | ||
398 | mrc p15, 0, r6, c2, c0, 0 @ TTB address | ||
399 | mrc p15, 0, r7, c1, c0, 0 @ Control register | ||
400 | stmia r0, {r4 - r7} | ||
401 | ldmfd sp!, {r4 - r7, pc} | ||
402 | ENDPROC(cpu_arm920_do_suspend) | ||
403 | |||
404 | ENTRY(cpu_arm920_do_resume) | ||
405 | mov ip, #0 | ||
406 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I+D TLBs | ||
407 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I+D caches | ||
408 | ldmia r0, {r4 - r7} | ||
409 | mcr p15, 0, r4, c13, c0, 0 @ PID | ||
410 | mcr p15, 0, r5, c3, c0, 0 @ Domain ID | ||
411 | mcr p15, 0, r6, c2, c0, 0 @ TTB address | ||
412 | mov r0, r7 @ control register | ||
413 | mov r2, r6, lsr #14 @ get TTB0 base | ||
414 | mov r2, r2, lsl #14 | ||
415 | ldr r3, =PMD_TYPE_SECT | PMD_SECT_BUFFERABLE | \ | ||
416 | PMD_SECT_CACHEABLE | PMD_BIT4 | PMD_SECT_AP_WRITE | ||
417 | b cpu_resume_mmu | ||
418 | ENDPROC(cpu_arm920_do_resume) | ||
419 | #else | ||
420 | #define cpu_arm920_do_suspend 0 | ||
421 | #define cpu_arm920_do_resume 0 | ||
422 | #endif | ||
423 | |||
390 | __CPUINIT | 424 | __CPUINIT |
391 | 425 | ||
392 | .type __arm920_setup, #function | 426 | .type __arm920_setup, #function |
@@ -432,6 +466,9 @@ arm920_processor_functions: | |||
432 | .word cpu_arm920_dcache_clean_area | 466 | .word cpu_arm920_dcache_clean_area |
433 | .word cpu_arm920_switch_mm | 467 | .word cpu_arm920_switch_mm |
434 | .word cpu_arm920_set_pte_ext | 468 | .word cpu_arm920_set_pte_ext |
469 | .word cpu_arm920_suspend_size | ||
470 | .word cpu_arm920_do_suspend | ||
471 | .word cpu_arm920_do_resume | ||
435 | .size arm920_processor_functions, . - arm920_processor_functions | 472 | .size arm920_processor_functions, . - arm920_processor_functions |
436 | 473 | ||
437 | .section ".rodata" | 474 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S index bb2f0f46a5e6..36154b1e792a 100644 --- a/arch/arm/mm/proc-arm922.S +++ b/arch/arm/mm/proc-arm922.S | |||
@@ -436,6 +436,9 @@ arm922_processor_functions: | |||
436 | .word cpu_arm922_dcache_clean_area | 436 | .word cpu_arm922_dcache_clean_area |
437 | .word cpu_arm922_switch_mm | 437 | .word cpu_arm922_switch_mm |
438 | .word cpu_arm922_set_pte_ext | 438 | .word cpu_arm922_set_pte_ext |
439 | .word 0 | ||
440 | .word 0 | ||
441 | .word 0 | ||
439 | .size arm922_processor_functions, . - arm922_processor_functions | 442 | .size arm922_processor_functions, . - arm922_processor_functions |
440 | 443 | ||
441 | .section ".rodata" | 444 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S index c13e01accfe2..89c5e0009c4c 100644 --- a/arch/arm/mm/proc-arm925.S +++ b/arch/arm/mm/proc-arm925.S | |||
@@ -503,6 +503,9 @@ arm925_processor_functions: | |||
503 | .word cpu_arm925_dcache_clean_area | 503 | .word cpu_arm925_dcache_clean_area |
504 | .word cpu_arm925_switch_mm | 504 | .word cpu_arm925_switch_mm |
505 | .word cpu_arm925_set_pte_ext | 505 | .word cpu_arm925_set_pte_ext |
506 | .word 0 | ||
507 | .word 0 | ||
508 | .word 0 | ||
506 | .size arm925_processor_functions, . - arm925_processor_functions | 509 | .size arm925_processor_functions, . - arm925_processor_functions |
507 | 510 | ||
508 | .section ".rodata" | 511 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index 42eb4315740b..6a4bdb2c94a7 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S | |||
@@ -401,6 +401,40 @@ ENTRY(cpu_arm926_set_pte_ext) | |||
401 | #endif | 401 | #endif |
402 | mov pc, lr | 402 | mov pc, lr |
403 | 403 | ||
404 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ | ||
405 | .globl cpu_arm926_suspend_size | ||
406 | .equ cpu_arm926_suspend_size, 4 * 3 | ||
407 | #ifdef CONFIG_PM | ||
408 | ENTRY(cpu_arm926_do_suspend) | ||
409 | stmfd sp!, {r4 - r7, lr} | ||
410 | mrc p15, 0, r4, c13, c0, 0 @ PID | ||
411 | mrc p15, 0, r5, c3, c0, 0 @ Domain ID | ||
412 | mrc p15, 0, r6, c2, c0, 0 @ TTB address | ||
413 | mrc p15, 0, r7, c1, c0, 0 @ Control register | ||
414 | stmia r0, {r4 - r7} | ||
415 | ldmfd sp!, {r4 - r7, pc} | ||
416 | ENDPROC(cpu_arm926_do_suspend) | ||
417 | |||
418 | ENTRY(cpu_arm926_do_resume) | ||
419 | mov ip, #0 | ||
420 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I+D TLBs | ||
421 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I+D caches | ||
422 | ldmia r0, {r4 - r7} | ||
423 | mcr p15, 0, r4, c13, c0, 0 @ PID | ||
424 | mcr p15, 0, r5, c3, c0, 0 @ Domain ID | ||
425 | mcr p15, 0, r6, c2, c0, 0 @ TTB address | ||
426 | mov r0, r7 @ control register | ||
427 | mov r2, r6, lsr #14 @ get TTB0 base | ||
428 | mov r2, r2, lsl #14 | ||
429 | ldr r3, =PMD_TYPE_SECT | PMD_SECT_BUFFERABLE | \ | ||
430 | PMD_SECT_CACHEABLE | PMD_BIT4 | PMD_SECT_AP_WRITE | ||
431 | b cpu_resume_mmu | ||
432 | ENDPROC(cpu_arm926_do_resume) | ||
433 | #else | ||
434 | #define cpu_arm926_do_suspend 0 | ||
435 | #define cpu_arm926_do_resume 0 | ||
436 | #endif | ||
437 | |||
404 | __CPUINIT | 438 | __CPUINIT |
405 | 439 | ||
406 | .type __arm926_setup, #function | 440 | .type __arm926_setup, #function |
@@ -456,6 +490,9 @@ arm926_processor_functions: | |||
456 | .word cpu_arm926_dcache_clean_area | 490 | .word cpu_arm926_dcache_clean_area |
457 | .word cpu_arm926_switch_mm | 491 | .word cpu_arm926_switch_mm |
458 | .word cpu_arm926_set_pte_ext | 492 | .word cpu_arm926_set_pte_ext |
493 | .word cpu_arm926_suspend_size | ||
494 | .word cpu_arm926_do_suspend | ||
495 | .word cpu_arm926_do_resume | ||
459 | .size arm926_processor_functions, . - arm926_processor_functions | 496 | .size arm926_processor_functions, . - arm926_processor_functions |
460 | 497 | ||
461 | .section ".rodata" | 498 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S index 7b11cdb9935f..26aea3f71c26 100644 --- a/arch/arm/mm/proc-arm940.S +++ b/arch/arm/mm/proc-arm940.S | |||
@@ -363,6 +363,9 @@ ENTRY(arm940_processor_functions) | |||
363 | .word cpu_arm940_dcache_clean_area | 363 | .word cpu_arm940_dcache_clean_area |
364 | .word cpu_arm940_switch_mm | 364 | .word cpu_arm940_switch_mm |
365 | .word 0 @ cpu_*_set_pte | 365 | .word 0 @ cpu_*_set_pte |
366 | .word 0 | ||
367 | .word 0 | ||
368 | .word 0 | ||
366 | .size arm940_processor_functions, . - arm940_processor_functions | 369 | .size arm940_processor_functions, . - arm940_processor_functions |
367 | 370 | ||
368 | .section ".rodata" | 371 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S index 1a5bbf080342..8063345406fe 100644 --- a/arch/arm/mm/proc-arm946.S +++ b/arch/arm/mm/proc-arm946.S | |||
@@ -419,6 +419,9 @@ ENTRY(arm946_processor_functions) | |||
419 | .word cpu_arm946_dcache_clean_area | 419 | .word cpu_arm946_dcache_clean_area |
420 | .word cpu_arm946_switch_mm | 420 | .word cpu_arm946_switch_mm |
421 | .word 0 @ cpu_*_set_pte | 421 | .word 0 @ cpu_*_set_pte |
422 | .word 0 | ||
423 | .word 0 | ||
424 | .word 0 | ||
422 | .size arm946_processor_functions, . - arm946_processor_functions | 425 | .size arm946_processor_functions, . - arm946_processor_functions |
423 | 426 | ||
424 | .section ".rodata" | 427 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-arm9tdmi.S b/arch/arm/mm/proc-arm9tdmi.S index db67e3134d7a..7b7ebd4d096d 100644 --- a/arch/arm/mm/proc-arm9tdmi.S +++ b/arch/arm/mm/proc-arm9tdmi.S | |||
@@ -70,6 +70,9 @@ ENTRY(arm9tdmi_processor_functions) | |||
70 | .word cpu_arm9tdmi_dcache_clean_area | 70 | .word cpu_arm9tdmi_dcache_clean_area |
71 | .word cpu_arm9tdmi_switch_mm | 71 | .word cpu_arm9tdmi_switch_mm |
72 | .word 0 @ cpu_*_set_pte | 72 | .word 0 @ cpu_*_set_pte |
73 | .word 0 | ||
74 | .word 0 | ||
75 | .word 0 | ||
73 | .size arm9tdmi_processor_functions, . - arm9tdmi_processor_functions | 76 | .size arm9tdmi_processor_functions, . - arm9tdmi_processor_functions |
74 | 77 | ||
75 | .section ".rodata" | 78 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-fa526.S b/arch/arm/mm/proc-fa526.S index 7c9ad621f0e6..fc2a4ae15cf4 100644 --- a/arch/arm/mm/proc-fa526.S +++ b/arch/arm/mm/proc-fa526.S | |||
@@ -195,6 +195,9 @@ fa526_processor_functions: | |||
195 | .word cpu_fa526_dcache_clean_area | 195 | .word cpu_fa526_dcache_clean_area |
196 | .word cpu_fa526_switch_mm | 196 | .word cpu_fa526_switch_mm |
197 | .word cpu_fa526_set_pte_ext | 197 | .word cpu_fa526_set_pte_ext |
198 | .word 0 | ||
199 | .word 0 | ||
200 | .word 0 | ||
198 | .size fa526_processor_functions, . - fa526_processor_functions | 201 | .size fa526_processor_functions, . - fa526_processor_functions |
199 | 202 | ||
200 | .section ".rodata" | 203 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S index b4597edbff97..d3883eed7a4a 100644 --- a/arch/arm/mm/proc-feroceon.S +++ b/arch/arm/mm/proc-feroceon.S | |||
@@ -554,6 +554,9 @@ feroceon_processor_functions: | |||
554 | .word cpu_feroceon_dcache_clean_area | 554 | .word cpu_feroceon_dcache_clean_area |
555 | .word cpu_feroceon_switch_mm | 555 | .word cpu_feroceon_switch_mm |
556 | .word cpu_feroceon_set_pte_ext | 556 | .word cpu_feroceon_set_pte_ext |
557 | .word 0 | ||
558 | .word 0 | ||
559 | .word 0 | ||
557 | .size feroceon_processor_functions, . - feroceon_processor_functions | 560 | .size feroceon_processor_functions, . - feroceon_processor_functions |
558 | 561 | ||
559 | .section ".rodata" | 562 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S index 4458ee6aa713..9d4f2ae63370 100644 --- a/arch/arm/mm/proc-mohawk.S +++ b/arch/arm/mm/proc-mohawk.S | |||
@@ -388,6 +388,9 @@ mohawk_processor_functions: | |||
388 | .word cpu_mohawk_dcache_clean_area | 388 | .word cpu_mohawk_dcache_clean_area |
389 | .word cpu_mohawk_switch_mm | 389 | .word cpu_mohawk_switch_mm |
390 | .word cpu_mohawk_set_pte_ext | 390 | .word cpu_mohawk_set_pte_ext |
391 | .word 0 | ||
392 | .word 0 | ||
393 | .word 0 | ||
391 | .size mohawk_processor_functions, . - mohawk_processor_functions | 394 | .size mohawk_processor_functions, . - mohawk_processor_functions |
392 | 395 | ||
393 | .section ".rodata" | 396 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S index 5aa8d59c2e85..46f09ed16b98 100644 --- a/arch/arm/mm/proc-sa110.S +++ b/arch/arm/mm/proc-sa110.S | |||
@@ -203,6 +203,9 @@ ENTRY(sa110_processor_functions) | |||
203 | .word cpu_sa110_dcache_clean_area | 203 | .word cpu_sa110_dcache_clean_area |
204 | .word cpu_sa110_switch_mm | 204 | .word cpu_sa110_switch_mm |
205 | .word cpu_sa110_set_pte_ext | 205 | .word cpu_sa110_set_pte_ext |
206 | .word 0 | ||
207 | .word 0 | ||
208 | .word 0 | ||
206 | .size sa110_processor_functions, . - sa110_processor_functions | 209 | .size sa110_processor_functions, . - sa110_processor_functions |
207 | 210 | ||
208 | .section ".rodata" | 211 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 2ac4e6f10713..74483d1977fe 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S | |||
@@ -169,6 +169,42 @@ ENTRY(cpu_sa1100_set_pte_ext) | |||
169 | #endif | 169 | #endif |
170 | mov pc, lr | 170 | mov pc, lr |
171 | 171 | ||
172 | .globl cpu_sa1100_suspend_size | ||
173 | .equ cpu_sa1100_suspend_size, 4*4 | ||
174 | #ifdef CONFIG_PM | ||
175 | ENTRY(cpu_sa1100_do_suspend) | ||
176 | stmfd sp!, {r4 - r7, lr} | ||
177 | mrc p15, 0, r4, c3, c0, 0 @ domain ID | ||
178 | mrc p15, 0, r5, c2, c0, 0 @ translation table base addr | ||
179 | mrc p15, 0, r6, c13, c0, 0 @ PID | ||
180 | mrc p15, 0, r7, c1, c0, 0 @ control reg | ||
181 | stmia r0, {r4 - r7} @ store cp regs | ||
182 | ldmfd sp!, {r4 - r7, pc} | ||
183 | ENDPROC(cpu_sa1100_do_suspend) | ||
184 | |||
185 | ENTRY(cpu_sa1100_do_resume) | ||
186 | ldmia r0, {r4 - r7} @ load cp regs | ||
187 | mov r1, #0 | ||
188 | mcr p15, 0, r1, c8, c7, 0 @ flush I+D TLBs | ||
189 | mcr p15, 0, r1, c7, c7, 0 @ flush I&D cache | ||
190 | mcr p15, 0, r1, c9, c0, 0 @ invalidate RB | ||
191 | mcr p15, 0, r1, c9, c0, 5 @ allow user space to use RB | ||
192 | |||
193 | mcr p15, 0, r4, c3, c0, 0 @ domain ID | ||
194 | mcr p15, 0, r5, c2, c0, 0 @ translation table base addr | ||
195 | mcr p15, 0, r6, c13, c0, 0 @ PID | ||
196 | mov r0, r7 @ control register | ||
197 | mov r2, r5, lsr #14 @ get TTB0 base | ||
198 | mov r2, r2, lsl #14 | ||
199 | ldr r3, =PMD_TYPE_SECT | PMD_SECT_BUFFERABLE | \ | ||
200 | PMD_SECT_CACHEABLE | PMD_SECT_AP_WRITE | ||
201 | b cpu_resume_mmu | ||
202 | ENDPROC(cpu_sa1100_do_resume) | ||
203 | #else | ||
204 | #define cpu_sa1100_do_suspend 0 | ||
205 | #define cpu_sa1100_do_resume 0 | ||
206 | #endif | ||
207 | |||
172 | __CPUINIT | 208 | __CPUINIT |
173 | 209 | ||
174 | .type __sa1100_setup, #function | 210 | .type __sa1100_setup, #function |
@@ -218,6 +254,9 @@ ENTRY(sa1100_processor_functions) | |||
218 | .word cpu_sa1100_dcache_clean_area | 254 | .word cpu_sa1100_dcache_clean_area |
219 | .word cpu_sa1100_switch_mm | 255 | .word cpu_sa1100_switch_mm |
220 | .word cpu_sa1100_set_pte_ext | 256 | .word cpu_sa1100_set_pte_ext |
257 | .word cpu_sa1100_suspend_size | ||
258 | .word cpu_sa1100_do_suspend | ||
259 | .word cpu_sa1100_do_resume | ||
221 | .size sa1100_processor_functions, . - sa1100_processor_functions | 260 | .size sa1100_processor_functions, . - sa1100_processor_functions |
222 | 261 | ||
223 | .section ".rodata" | 262 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 59a7e1ffe7bc..832b6bdc192c 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -121,6 +121,53 @@ ENTRY(cpu_v6_set_pte_ext) | |||
121 | #endif | 121 | #endif |
122 | mov pc, lr | 122 | mov pc, lr |
123 | 123 | ||
124 | /* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */ | ||
125 | .globl cpu_v6_suspend_size | ||
126 | .equ cpu_v6_suspend_size, 4 * 8 | ||
127 | #ifdef CONFIG_PM | ||
128 | ENTRY(cpu_v6_do_suspend) | ||
129 | stmfd sp!, {r4 - r11, lr} | ||
130 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
131 | mrc p15, 0, r5, c13, c0, 1 @ Context ID | ||
132 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID | ||
133 | mrc p15, 0, r7, c2, c0, 0 @ Translation table base 0 | ||
134 | mrc p15, 0, r8, c2, c0, 1 @ Translation table base 1 | ||
135 | mrc p15, 0, r9, c1, c0, 1 @ auxillary control register | ||
136 | mrc p15, 0, r10, c1, c0, 2 @ co-processor access control | ||
137 | mrc p15, 0, r11, c1, c0, 0 @ control register | ||
138 | stmia r0, {r4 - r11} | ||
139 | ldmfd sp!, {r4- r11, pc} | ||
140 | ENDPROC(cpu_v6_do_suspend) | ||
141 | |||
142 | ENTRY(cpu_v6_do_resume) | ||
143 | mov ip, #0 | ||
144 | mcr p15, 0, ip, c7, c14, 0 @ clean+invalidate D cache | ||
145 | mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache | ||
146 | mcr p15, 0, ip, c7, c15, 0 @ clean+invalidate cache | ||
147 | mcr p15, 0, ip, c7, c10, 4 @ drain write buffer | ||
148 | ldmia r0, {r4 - r11} | ||
149 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
150 | mcr p15, 0, r5, c13, c0, 1 @ Context ID | ||
151 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID | ||
152 | mcr p15, 0, r7, c2, c0, 0 @ Translation table base 0 | ||
153 | mcr p15, 0, r8, c2, c0, 1 @ Translation table base 1 | ||
154 | mcr p15, 0, r9, c1, c0, 1 @ auxillary control register | ||
155 | mcr p15, 0, r10, c1, c0, 2 @ co-processor access control | ||
156 | mcr p15, 0, ip, c2, c0, 2 @ TTB control register | ||
157 | mcr p15, 0, ip, c7, c5, 4 @ ISB | ||
158 | mov r0, r11 @ control register | ||
159 | mov r2, r7, lsr #14 @ get TTB0 base | ||
160 | mov r2, r2, lsl #14 | ||
161 | ldr r3, cpu_resume_l1_flags | ||
162 | b cpu_resume_mmu | ||
163 | ENDPROC(cpu_v6_do_resume) | ||
164 | cpu_resume_l1_flags: | ||
165 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_SMP) | ||
166 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_UP) | ||
167 | #else | ||
168 | #define cpu_v6_do_suspend 0 | ||
169 | #define cpu_v6_do_resume 0 | ||
170 | #endif | ||
124 | 171 | ||
125 | 172 | ||
126 | .type cpu_v6_name, #object | 173 | .type cpu_v6_name, #object |
@@ -206,6 +253,9 @@ ENTRY(v6_processor_functions) | |||
206 | .word cpu_v6_dcache_clean_area | 253 | .word cpu_v6_dcache_clean_area |
207 | .word cpu_v6_switch_mm | 254 | .word cpu_v6_switch_mm |
208 | .word cpu_v6_set_pte_ext | 255 | .word cpu_v6_set_pte_ext |
256 | .word cpu_v6_suspend_size | ||
257 | .word cpu_v6_do_suspend | ||
258 | .word cpu_v6_do_resume | ||
209 | .size v6_processor_functions, . - v6_processor_functions | 259 | .size v6_processor_functions, . - v6_processor_functions |
210 | 260 | ||
211 | .section ".rodata" | 261 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 8e3356239136..262fa88a7439 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -108,10 +108,16 @@ ENTRY(cpu_v7_switch_mm) | |||
108 | #ifdef CONFIG_ARM_ERRATA_430973 | 108 | #ifdef CONFIG_ARM_ERRATA_430973 |
109 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | 109 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB |
110 | #endif | 110 | #endif |
111 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
112 | dsb | ||
113 | #endif | ||
111 | mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID | 114 | mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID |
112 | isb | 115 | isb |
113 | 1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | 116 | 1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 |
114 | isb | 117 | isb |
118 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
119 | dsb | ||
120 | #endif | ||
115 | mcr p15, 0, r1, c13, c0, 1 @ set context ID | 121 | mcr p15, 0, r1, c13, c0, 1 @ set context ID |
116 | isb | 122 | isb |
117 | #endif | 123 | #endif |
@@ -171,6 +177,87 @@ cpu_v7_name: | |||
171 | .ascii "ARMv7 Processor" | 177 | .ascii "ARMv7 Processor" |
172 | .align | 178 | .align |
173 | 179 | ||
180 | /* | ||
181 | * Memory region attributes with SCTLR.TRE=1 | ||
182 | * | ||
183 | * n = TEX[0],C,B | ||
184 | * TR = PRRR[2n+1:2n] - memory type | ||
185 | * IR = NMRR[2n+1:2n] - inner cacheable property | ||
186 | * OR = NMRR[2n+17:2n+16] - outer cacheable property | ||
187 | * | ||
188 | * n TR IR OR | ||
189 | * UNCACHED 000 00 | ||
190 | * BUFFERABLE 001 10 00 00 | ||
191 | * WRITETHROUGH 010 10 10 10 | ||
192 | * WRITEBACK 011 10 11 11 | ||
193 | * reserved 110 | ||
194 | * WRITEALLOC 111 10 01 01 | ||
195 | * DEV_SHARED 100 01 | ||
196 | * DEV_NONSHARED 100 01 | ||
197 | * DEV_WC 001 10 | ||
198 | * DEV_CACHED 011 10 | ||
199 | * | ||
200 | * Other attributes: | ||
201 | * | ||
202 | * DS0 = PRRR[16] = 0 - device shareable property | ||
203 | * DS1 = PRRR[17] = 1 - device shareable property | ||
204 | * NS0 = PRRR[18] = 0 - normal shareable property | ||
205 | * NS1 = PRRR[19] = 1 - normal shareable property | ||
206 | * NOS = PRRR[24+n] = 1 - not outer shareable | ||
207 | */ | ||
208 | .equ PRRR, 0xff0a81a8 | ||
209 | .equ NMRR, 0x40e040e0 | ||
210 | |||
211 | /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */ | ||
212 | .globl cpu_v7_suspend_size | ||
213 | .equ cpu_v7_suspend_size, 4 * 8 | ||
214 | #ifdef CONFIG_PM | ||
215 | ENTRY(cpu_v7_do_suspend) | ||
216 | stmfd sp!, {r4 - r11, lr} | ||
217 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
218 | mrc p15, 0, r5, c13, c0, 1 @ Context ID | ||
219 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID | ||
220 | mrc p15, 0, r7, c2, c0, 0 @ TTB 0 | ||
221 | mrc p15, 0, r8, c2, c0, 1 @ TTB 1 | ||
222 | mrc p15, 0, r9, c1, c0, 0 @ Control register | ||
223 | mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register | ||
224 | mrc p15, 0, r11, c1, c0, 2 @ Co-processor access control | ||
225 | stmia r0, {r4 - r11} | ||
226 | ldmfd sp!, {r4 - r11, pc} | ||
227 | ENDPROC(cpu_v7_do_suspend) | ||
228 | |||
229 | ENTRY(cpu_v7_do_resume) | ||
230 | mov ip, #0 | ||
231 | mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs | ||
232 | mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache | ||
233 | ldmia r0, {r4 - r11} | ||
234 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
235 | mcr p15, 0, r5, c13, c0, 1 @ Context ID | ||
236 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID | ||
237 | mcr p15, 0, r7, c2, c0, 0 @ TTB 0 | ||
238 | mcr p15, 0, r8, c2, c0, 1 @ TTB 1 | ||
239 | mcr p15, 0, ip, c2, c0, 2 @ TTB control register | ||
240 | mcr p15, 0, r10, c1, c0, 1 @ Auxillary control register | ||
241 | mcr p15, 0, r11, c1, c0, 2 @ Co-processor access control | ||
242 | ldr r4, =PRRR @ PRRR | ||
243 | ldr r5, =NMRR @ NMRR | ||
244 | mcr p15, 0, r4, c10, c2, 0 @ write PRRR | ||
245 | mcr p15, 0, r5, c10, c2, 1 @ write NMRR | ||
246 | isb | ||
247 | mov r0, r9 @ control register | ||
248 | mov r2, r7, lsr #14 @ get TTB0 base | ||
249 | mov r2, r2, lsl #14 | ||
250 | ldr r3, cpu_resume_l1_flags | ||
251 | b cpu_resume_mmu | ||
252 | ENDPROC(cpu_v7_do_resume) | ||
253 | cpu_resume_l1_flags: | ||
254 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_SMP) | ||
255 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_UP) | ||
256 | #else | ||
257 | #define cpu_v7_do_suspend 0 | ||
258 | #define cpu_v7_do_resume 0 | ||
259 | #endif | ||
260 | |||
174 | __CPUINIT | 261 | __CPUINIT |
175 | 262 | ||
176 | /* | 263 | /* |
@@ -282,36 +369,8 @@ __v7_setup: | |||
282 | ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP) | 369 | ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP) |
283 | ALT_UP(orr r4, r4, #TTB_FLAGS_UP) | 370 | ALT_UP(orr r4, r4, #TTB_FLAGS_UP) |
284 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 | 371 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 |
285 | /* | 372 | ldr r5, =PRRR @ PRRR |
286 | * Memory region attributes with SCTLR.TRE=1 | 373 | ldr r6, =NMRR @ NMRR |
287 | * | ||
288 | * n = TEX[0],C,B | ||
289 | * TR = PRRR[2n+1:2n] - memory type | ||
290 | * IR = NMRR[2n+1:2n] - inner cacheable property | ||
291 | * OR = NMRR[2n+17:2n+16] - outer cacheable property | ||
292 | * | ||
293 | * n TR IR OR | ||
294 | * UNCACHED 000 00 | ||
295 | * BUFFERABLE 001 10 00 00 | ||
296 | * WRITETHROUGH 010 10 10 10 | ||
297 | * WRITEBACK 011 10 11 11 | ||
298 | * reserved 110 | ||
299 | * WRITEALLOC 111 10 01 01 | ||
300 | * DEV_SHARED 100 01 | ||
301 | * DEV_NONSHARED 100 01 | ||
302 | * DEV_WC 001 10 | ||
303 | * DEV_CACHED 011 10 | ||
304 | * | ||
305 | * Other attributes: | ||
306 | * | ||
307 | * DS0 = PRRR[16] = 0 - device shareable property | ||
308 | * DS1 = PRRR[17] = 1 - device shareable property | ||
309 | * NS0 = PRRR[18] = 0 - normal shareable property | ||
310 | * NS1 = PRRR[19] = 1 - normal shareable property | ||
311 | * NOS = PRRR[24+n] = 1 - not outer shareable | ||
312 | */ | ||
313 | ldr r5, =0xff0a81a8 @ PRRR | ||
314 | ldr r6, =0x40e040e0 @ NMRR | ||
315 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR | 374 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR |
316 | mcr p15, 0, r6, c10, c2, 1 @ write NMRR | 375 | mcr p15, 0, r6, c10, c2, 1 @ write NMRR |
317 | #endif | 376 | #endif |
@@ -357,6 +416,9 @@ ENTRY(v7_processor_functions) | |||
357 | .word cpu_v7_dcache_clean_area | 416 | .word cpu_v7_dcache_clean_area |
358 | .word cpu_v7_switch_mm | 417 | .word cpu_v7_switch_mm |
359 | .word cpu_v7_set_pte_ext | 418 | .word cpu_v7_set_pte_ext |
419 | .word 0 | ||
420 | .word 0 | ||
421 | .word 0 | ||
360 | .size v7_processor_functions, . - v7_processor_functions | 422 | .size v7_processor_functions, . - v7_processor_functions |
361 | 423 | ||
362 | .section ".rodata" | 424 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S index ec26355cb7c2..63d8b2044e84 100644 --- a/arch/arm/mm/proc-xsc3.S +++ b/arch/arm/mm/proc-xsc3.S | |||
@@ -413,9 +413,52 @@ ENTRY(cpu_xsc3_set_pte_ext) | |||
413 | mov pc, lr | 413 | mov pc, lr |
414 | 414 | ||
415 | .ltorg | 415 | .ltorg |
416 | |||
417 | .align | 416 | .align |
418 | 417 | ||
418 | .globl cpu_xsc3_suspend_size | ||
419 | .equ cpu_xsc3_suspend_size, 4 * 8 | ||
420 | #ifdef CONFIG_PM | ||
421 | ENTRY(cpu_xsc3_do_suspend) | ||
422 | stmfd sp!, {r4 - r10, lr} | ||
423 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode | ||
424 | mrc p15, 0, r5, c15, c1, 0 @ CP access reg | ||
425 | mrc p15, 0, r6, c13, c0, 0 @ PID | ||
426 | mrc p15, 0, r7, c3, c0, 0 @ domain ID | ||
427 | mrc p15, 0, r8, c2, c0, 0 @ translation table base addr | ||
428 | mrc p15, 0, r9, c1, c0, 1 @ auxiliary control reg | ||
429 | mrc p15, 0, r10, c1, c0, 0 @ control reg | ||
430 | bic r4, r4, #2 @ clear frequency change bit | ||
431 | stmia r0, {r1, r4 - r10} @ store v:p offset + cp regs | ||
432 | ldmia sp!, {r4 - r10, pc} | ||
433 | ENDPROC(cpu_xsc3_do_suspend) | ||
434 | |||
435 | ENTRY(cpu_xsc3_do_resume) | ||
436 | ldmia r0, {r1, r4 - r10} @ load v:p offset + cp regs | ||
437 | mov ip, #0 | ||
438 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I & D caches, BTB | ||
439 | mcr p15, 0, ip, c7, c10, 4 @ drain write (&fill) buffer | ||
440 | mcr p15, 0, ip, c7, c5, 4 @ flush prefetch buffer | ||
441 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | ||
442 | mcr p14, 0, r4, c6, c0, 0 @ clock configuration, turbo mode. | ||
443 | mcr p15, 0, r5, c15, c1, 0 @ CP access reg | ||
444 | mcr p15, 0, r6, c13, c0, 0 @ PID | ||
445 | mcr p15, 0, r7, c3, c0, 0 @ domain ID | ||
446 | mcr p15, 0, r8, c2, c0, 0 @ translation table base addr | ||
447 | mcr p15, 0, r9, c1, c0, 1 @ auxiliary control reg | ||
448 | |||
449 | @ temporarily map resume_turn_on_mmu into the page table, | ||
450 | @ otherwise prefetch abort occurs after MMU is turned on | ||
451 | mov r0, r10 @ control register | ||
452 | mov r2, r8, lsr #14 @ get TTB0 base | ||
453 | mov r2, r2, lsl #14 | ||
454 | ldr r3, =0x542e @ section flags | ||
455 | b cpu_resume_mmu | ||
456 | ENDPROC(cpu_xsc3_do_resume) | ||
457 | #else | ||
458 | #define cpu_xsc3_do_suspend 0 | ||
459 | #define cpu_xsc3_do_resume 0 | ||
460 | #endif | ||
461 | |||
419 | __CPUINIT | 462 | __CPUINIT |
420 | 463 | ||
421 | .type __xsc3_setup, #function | 464 | .type __xsc3_setup, #function |
@@ -476,6 +519,9 @@ ENTRY(xsc3_processor_functions) | |||
476 | .word cpu_xsc3_dcache_clean_area | 519 | .word cpu_xsc3_dcache_clean_area |
477 | .word cpu_xsc3_switch_mm | 520 | .word cpu_xsc3_switch_mm |
478 | .word cpu_xsc3_set_pte_ext | 521 | .word cpu_xsc3_set_pte_ext |
522 | .word cpu_xsc3_suspend_size | ||
523 | .word cpu_xsc3_do_suspend | ||
524 | .word cpu_xsc3_do_resume | ||
479 | .size xsc3_processor_functions, . - xsc3_processor_functions | 525 | .size xsc3_processor_functions, . - xsc3_processor_functions |
480 | 526 | ||
481 | .section ".rodata" | 527 | .section ".rodata" |
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 5a37c5e45c41..086038cd86ab 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S | |||
@@ -513,11 +513,49 @@ ENTRY(cpu_xscale_set_pte_ext) | |||
513 | xscale_set_pte_ext_epilogue | 513 | xscale_set_pte_ext_epilogue |
514 | mov pc, lr | 514 | mov pc, lr |
515 | 515 | ||
516 | |||
517 | .ltorg | 516 | .ltorg |
518 | |||
519 | .align | 517 | .align |
520 | 518 | ||
519 | .globl cpu_xscale_suspend_size | ||
520 | .equ cpu_xscale_suspend_size, 4 * 7 | ||
521 | #ifdef CONFIG_PM | ||
522 | ENTRY(cpu_xscale_do_suspend) | ||
523 | stmfd sp!, {r4 - r10, lr} | ||
524 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode | ||
525 | mrc p15, 0, r5, c15, c1, 0 @ CP access reg | ||
526 | mrc p15, 0, r6, c13, c0, 0 @ PID | ||
527 | mrc p15, 0, r7, c3, c0, 0 @ domain ID | ||
528 | mrc p15, 0, r8, c2, c0, 0 @ translation table base addr | ||
529 | mrc p15, 0, r9, c1, c1, 0 @ auxiliary control reg | ||
530 | mrc p15, 0, r10, c1, c0, 0 @ control reg | ||
531 | bic r4, r4, #2 @ clear frequency change bit | ||
532 | stmia r0, {r4 - r10} @ store cp regs | ||
533 | ldmfd sp!, {r4 - r10, pc} | ||
534 | ENDPROC(cpu_xscale_do_suspend) | ||
535 | |||
536 | ENTRY(cpu_xscale_do_resume) | ||
537 | ldmia r0, {r4 - r10} @ load cp regs | ||
538 | mov ip, #0 | ||
539 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | ||
540 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I & D caches, BTB | ||
541 | mcr p14, 0, r4, c6, c0, 0 @ clock configuration, turbo mode. | ||
542 | mcr p15, 0, r5, c15, c1, 0 @ CP access reg | ||
543 | mcr p15, 0, r6, c13, c0, 0 @ PID | ||
544 | mcr p15, 0, r7, c3, c0, 0 @ domain ID | ||
545 | mcr p15, 0, r8, c2, c0, 0 @ translation table base addr | ||
546 | mcr p15, 0, r9, c1, c1, 0 @ auxiliary control reg | ||
547 | mov r0, r10 @ control register | ||
548 | mov r2, r8, lsr #14 @ get TTB0 base | ||
549 | mov r2, r2, lsl #14 | ||
550 | ldr r3, =PMD_TYPE_SECT | PMD_SECT_BUFFERABLE | \ | ||
551 | PMD_SECT_CACHEABLE | PMD_SECT_AP_WRITE | ||
552 | b cpu_resume_mmu | ||
553 | ENDPROC(cpu_xscale_do_resume) | ||
554 | #else | ||
555 | #define cpu_xscale_do_suspend 0 | ||
556 | #define cpu_xscale_do_resume 0 | ||
557 | #endif | ||
558 | |||
521 | __CPUINIT | 559 | __CPUINIT |
522 | 560 | ||
523 | .type __xscale_setup, #function | 561 | .type __xscale_setup, #function |
@@ -565,6 +603,9 @@ ENTRY(xscale_processor_functions) | |||
565 | .word cpu_xscale_dcache_clean_area | 603 | .word cpu_xscale_dcache_clean_area |
566 | .word cpu_xscale_switch_mm | 604 | .word cpu_xscale_switch_mm |
567 | .word cpu_xscale_set_pte_ext | 605 | .word cpu_xscale_set_pte_ext |
606 | .word cpu_xscale_suspend_size | ||
607 | .word cpu_xscale_do_suspend | ||
608 | .word cpu_xscale_do_resume | ||
568 | .size xscale_processor_functions, . - xscale_processor_functions | 609 | .size xscale_processor_functions, . - xscale_processor_functions |
569 | 610 | ||
570 | .section ".rodata" | 611 | .section ".rodata" |
diff --git a/arch/arm/mm/vmregion.c b/arch/arm/mm/vmregion.c index 935993e1b1ef..036fdbfdd62f 100644 --- a/arch/arm/mm/vmregion.c +++ b/arch/arm/mm/vmregion.c | |||
@@ -38,7 +38,7 @@ struct arm_vmregion * | |||
38 | arm_vmregion_alloc(struct arm_vmregion_head *head, size_t align, | 38 | arm_vmregion_alloc(struct arm_vmregion_head *head, size_t align, |
39 | size_t size, gfp_t gfp) | 39 | size_t size, gfp_t gfp) |
40 | { | 40 | { |
41 | unsigned long addr = head->vm_start, end = head->vm_end - size; | 41 | unsigned long start = head->vm_start, addr = head->vm_end; |
42 | unsigned long flags; | 42 | unsigned long flags; |
43 | struct arm_vmregion *c, *new; | 43 | struct arm_vmregion *c, *new; |
44 | 44 | ||
@@ -54,21 +54,20 @@ arm_vmregion_alloc(struct arm_vmregion_head *head, size_t align, | |||
54 | 54 | ||
55 | spin_lock_irqsave(&head->vm_lock, flags); | 55 | spin_lock_irqsave(&head->vm_lock, flags); |
56 | 56 | ||
57 | list_for_each_entry(c, &head->vm_list, vm_list) { | 57 | addr = rounddown(addr - size, align); |
58 | if ((addr + size) < addr) | 58 | list_for_each_entry_reverse(c, &head->vm_list, vm_list) { |
59 | goto nospc; | 59 | if (addr >= c->vm_end) |
60 | if ((addr + size) <= c->vm_start) | ||
61 | goto found; | 60 | goto found; |
62 | addr = ALIGN(c->vm_end, align); | 61 | addr = rounddown(c->vm_start - size, align); |
63 | if (addr > end) | 62 | if (addr < start) |
64 | goto nospc; | 63 | goto nospc; |
65 | } | 64 | } |
66 | 65 | ||
67 | found: | 66 | found: |
68 | /* | 67 | /* |
69 | * Insert this entry _before_ the one we found. | 68 | * Insert this entry after the one we found. |
70 | */ | 69 | */ |
71 | list_add_tail(&new->vm_list, &c->vm_list); | 70 | list_add(&new->vm_list, &c->vm_list); |
72 | new->vm_start = addr; | 71 | new->vm_start = addr; |
73 | new->vm_end = addr + size; | 72 | new->vm_end = addr + size; |
74 | new->vm_active = 1; | 73 | new->vm_active = 1; |
diff --git a/arch/arm/plat-mxc/include/mach/memory.h b/arch/arm/plat-mxc/include/mach/memory.h index 83861408133f..5d51cbb98893 100644 --- a/arch/arm/plat-mxc/include/mach/memory.h +++ b/arch/arm/plat-mxc/include/mach/memory.h | |||
@@ -23,23 +23,23 @@ | |||
23 | 23 | ||
24 | #if !defined(CONFIG_RUNTIME_PHYS_OFFSET) | 24 | #if !defined(CONFIG_RUNTIME_PHYS_OFFSET) |
25 | # if defined CONFIG_ARCH_MX1 | 25 | # if defined CONFIG_ARCH_MX1 |
26 | # define PHYS_OFFSET MX1_PHYS_OFFSET | 26 | # define PLAT_PHYS_OFFSET MX1_PHYS_OFFSET |
27 | # elif defined CONFIG_MACH_MX21 | 27 | # elif defined CONFIG_MACH_MX21 |
28 | # define PHYS_OFFSET MX21_PHYS_OFFSET | 28 | # define PLAT_PHYS_OFFSET MX21_PHYS_OFFSET |
29 | # elif defined CONFIG_ARCH_MX25 | 29 | # elif defined CONFIG_ARCH_MX25 |
30 | # define PHYS_OFFSET MX25_PHYS_OFFSET | 30 | # define PLAT_PHYS_OFFSET MX25_PHYS_OFFSET |
31 | # elif defined CONFIG_MACH_MX27 | 31 | # elif defined CONFIG_MACH_MX27 |
32 | # define PHYS_OFFSET MX27_PHYS_OFFSET | 32 | # define PLAT_PHYS_OFFSET MX27_PHYS_OFFSET |
33 | # elif defined CONFIG_ARCH_MX3 | 33 | # elif defined CONFIG_ARCH_MX3 |
34 | # define PHYS_OFFSET MX3x_PHYS_OFFSET | 34 | # define PLAT_PHYS_OFFSET MX3x_PHYS_OFFSET |
35 | # elif defined CONFIG_ARCH_MXC91231 | 35 | # elif defined CONFIG_ARCH_MXC91231 |
36 | # define PHYS_OFFSET MXC91231_PHYS_OFFSET | 36 | # define PLAT_PHYS_OFFSET MXC91231_PHYS_OFFSET |
37 | # elif defined CONFIG_ARCH_MX50 | 37 | # elif defined CONFIG_ARCH_MX50 |
38 | # define PHYS_OFFSET MX50_PHYS_OFFSET | 38 | # define PLAT_PHYS_OFFSET MX50_PHYS_OFFSET |
39 | # elif defined CONFIG_ARCH_MX51 | 39 | # elif defined CONFIG_ARCH_MX51 |
40 | # define PHYS_OFFSET MX51_PHYS_OFFSET | 40 | # define PLAT_PHYS_OFFSET MX51_PHYS_OFFSET |
41 | # elif defined CONFIG_ARCH_MX53 | 41 | # elif defined CONFIG_ARCH_MX53 |
42 | # define PHYS_OFFSET MX53_PHYS_OFFSET | 42 | # define PLAT_PHYS_OFFSET MX53_PHYS_OFFSET |
43 | # endif | 43 | # endif |
44 | #endif | 44 | #endif |
45 | 45 | ||
diff --git a/arch/arm/plat-omap/include/plat/memory.h b/arch/arm/plat-omap/include/plat/memory.h index f8d922fb5584..e6720aa2d553 100644 --- a/arch/arm/plat-omap/include/plat/memory.h +++ b/arch/arm/plat-omap/include/plat/memory.h | |||
@@ -37,9 +37,9 @@ | |||
37 | * Physical DRAM offset. | 37 | * Physical DRAM offset. |
38 | */ | 38 | */ |
39 | #if defined(CONFIG_ARCH_OMAP1) | 39 | #if defined(CONFIG_ARCH_OMAP1) |
40 | #define PHYS_OFFSET UL(0x10000000) | 40 | #define PLAT_PHYS_OFFSET UL(0x10000000) |
41 | #else | 41 | #else |
42 | #define PHYS_OFFSET UL(0x80000000) | 42 | #define PLAT_PHYS_OFFSET UL(0x80000000) |
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | /* | 45 | /* |
diff --git a/arch/arm/plat-omap/include/plat/serial.h b/arch/arm/plat-omap/include/plat/serial.h index cec5d56db2eb..8ff605c83aca 100644 --- a/arch/arm/plat-omap/include/plat/serial.h +++ b/arch/arm/plat-omap/include/plat/serial.h | |||
@@ -27,7 +27,7 @@ | |||
27 | * 2. We assume printascii is called at least once before paging_init, | 27 | * 2. We assume printascii is called at least once before paging_init, |
28 | * and addruart has a chance to read OMAP_UART_INFO | 28 | * and addruart has a chance to read OMAP_UART_INFO |
29 | */ | 29 | */ |
30 | #define OMAP_UART_INFO (PHYS_OFFSET + 0x3ffc) | 30 | #define OMAP_UART_INFO (PLAT_PHYS_OFFSET + 0x3ffc) |
31 | 31 | ||
32 | /* OMAP1 serial ports */ | 32 | /* OMAP1 serial ports */ |
33 | #define OMAP1_UART1_BASE 0xfffb0000 | 33 | #define OMAP1_UART1_BASE 0xfffb0000 |
diff --git a/arch/arm/plat-omap/include/plat/sram.h b/arch/arm/plat-omap/include/plat/sram.h index 9967d5e855c7..f500fc34d065 100644 --- a/arch/arm/plat-omap/include/plat/sram.h +++ b/arch/arm/plat-omap/include/plat/sram.h | |||
@@ -12,7 +12,19 @@ | |||
12 | #define __ARCH_ARM_OMAP_SRAM_H | 12 | #define __ARCH_ARM_OMAP_SRAM_H |
13 | 13 | ||
14 | #ifndef __ASSEMBLY__ | 14 | #ifndef __ASSEMBLY__ |
15 | extern void * omap_sram_push(void * start, unsigned long size); | 15 | #include <asm/fncpy.h> |
16 | |||
17 | extern void *omap_sram_push_address(unsigned long size); | ||
18 | |||
19 | /* Macro to push a function to the internal SRAM, using the fncpy API */ | ||
20 | #define omap_sram_push(funcp, size) ({ \ | ||
21 | typeof(&(funcp)) _res = NULL; \ | ||
22 | void *_sram_address = omap_sram_push_address(size); \ | ||
23 | if (_sram_address) \ | ||
24 | _res = fncpy(_sram_address, &(funcp), size); \ | ||
25 | _res; \ | ||
26 | }) | ||
27 | |||
16 | extern void omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl); | 28 | extern void omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl); |
17 | 29 | ||
18 | extern void omap2_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, | 30 | extern void omap2_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, |
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index e26e50487d60..68fcc7dc56e7 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
@@ -242,7 +242,14 @@ static void __init omap_map_sram(void) | |||
242 | omap_sram_size - SRAM_BOOTLOADER_SZ); | 242 | omap_sram_size - SRAM_BOOTLOADER_SZ); |
243 | } | 243 | } |
244 | 244 | ||
245 | void * omap_sram_push(void * start, unsigned long size) | 245 | /* |
246 | * Memory allocator for SRAM: calculates the new ceiling address | ||
247 | * for pushing a function using the fncpy API. | ||
248 | * | ||
249 | * Note that fncpy requires the returned address to be aligned | ||
250 | * to an 8-byte boundary. | ||
251 | */ | ||
252 | void *omap_sram_push_address(unsigned long size) | ||
246 | { | 253 | { |
247 | if (size > (omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ))) { | 254 | if (size > (omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ))) { |
248 | printk(KERN_ERR "Not enough space in SRAM\n"); | 255 | printk(KERN_ERR "Not enough space in SRAM\n"); |
@@ -250,10 +257,7 @@ void * omap_sram_push(void * start, unsigned long size) | |||
250 | } | 257 | } |
251 | 258 | ||
252 | omap_sram_ceil -= size; | 259 | omap_sram_ceil -= size; |
253 | omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *)); | 260 | omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, FNCPY_ALIGN); |
254 | memcpy((void *)omap_sram_ceil, start, size); | ||
255 | flush_icache_range((unsigned long)omap_sram_ceil, | ||
256 | (unsigned long)(omap_sram_ceil + size)); | ||
257 | 261 | ||
258 | return (void *)omap_sram_ceil; | 262 | return (void *)omap_sram_ceil; |
259 | } | 263 | } |
diff --git a/arch/arm/plat-s3c24xx/sleep.S b/arch/arm/plat-s3c24xx/sleep.S index e73e3b6e88d2..fd7032f84ae7 100644 --- a/arch/arm/plat-s3c24xx/sleep.S +++ b/arch/arm/plat-s3c24xx/sleep.S | |||
@@ -44,23 +44,13 @@ | |||
44 | /* s3c_cpu_save | 44 | /* s3c_cpu_save |
45 | * | 45 | * |
46 | * entry: | 46 | * entry: |
47 | * r0 = save address (virtual addr of s3c_sleep_save_phys) | 47 | * r1 = v:p offset |
48 | */ | 48 | */ |
49 | 49 | ||
50 | ENTRY(s3c_cpu_save) | 50 | ENTRY(s3c_cpu_save) |
51 | stmfd sp!, { r4 - r12, lr } | 51 | stmfd sp!, { r4 - r12, lr } |
52 | 52 | ldr r3, =resume_with_mmu | |
53 | @@ store co-processor registers | 53 | bl cpu_suspend |
54 | |||
55 | mrc p15, 0, r4, c13, c0, 0 @ PID | ||
56 | mrc p15, 0, r5, c3, c0, 0 @ Domain ID | ||
57 | mrc p15, 0, r6, c2, c0, 0 @ translation table base address | ||
58 | mrc p15, 0, r7, c1, c0, 0 @ control register | ||
59 | |||
60 | stmia r0, { r4 - r13 } | ||
61 | |||
62 | @@ write our state back to RAM | ||
63 | bl s3c_pm_cb_flushcache | ||
64 | 54 | ||
65 | @@ jump to final code to send system to sleep | 55 | @@ jump to final code to send system to sleep |
66 | ldr r0, =pm_cpu_sleep | 56 | ldr r0, =pm_cpu_sleep |
@@ -76,20 +66,6 @@ resume_with_mmu: | |||
76 | 66 | ||
77 | .ltorg | 67 | .ltorg |
78 | 68 | ||
79 | @@ the next bits sit in the .data segment, even though they | ||
80 | @@ happen to be code... the s3c_sleep_save_phys needs to be | ||
81 | @@ accessed by the resume code before it can restore the MMU. | ||
82 | @@ This means that the variable has to be close enough for the | ||
83 | @@ code to read it... since the .text segment needs to be RO, | ||
84 | @@ the data segment can be the only place to put this code. | ||
85 | |||
86 | .data | ||
87 | |||
88 | .global s3c_sleep_save_phys | ||
89 | s3c_sleep_save_phys: | ||
90 | .word 0 | ||
91 | |||
92 | |||
93 | /* sleep magic, to allow the bootloader to check for an valid | 69 | /* sleep magic, to allow the bootloader to check for an valid |
94 | * image to resume to. Must be the first word before the | 70 | * image to resume to. Must be the first word before the |
95 | * s3c_cpu_resume entry. | 71 | * s3c_cpu_resume entry. |
@@ -100,10 +76,6 @@ s3c_sleep_save_phys: | |||
100 | /* s3c_cpu_resume | 76 | /* s3c_cpu_resume |
101 | * | 77 | * |
102 | * resume code entry for bootloader to call | 78 | * resume code entry for bootloader to call |
103 | * | ||
104 | * we must put this code here in the data segment as we have no | ||
105 | * other way of restoring the stack pointer after sleep, and we | ||
106 | * must not write to the code segment (code is read-only) | ||
107 | */ | 79 | */ |
108 | 80 | ||
109 | ENTRY(s3c_cpu_resume) | 81 | ENTRY(s3c_cpu_resume) |
@@ -134,25 +106,4 @@ ENTRY(s3c_cpu_resume) | |||
134 | beq 1001b | 106 | beq 1001b |
135 | #endif /* CONFIG_DEBUG_RESUME */ | 107 | #endif /* CONFIG_DEBUG_RESUME */ |
136 | 108 | ||
137 | mov r1, #0 | 109 | b cpu_resume |
138 | mcr p15, 0, r1, c8, c7, 0 @@ invalidate I & D TLBs | ||
139 | mcr p15, 0, r1, c7, c7, 0 @@ invalidate I & D caches | ||
140 | |||
141 | ldr r0, s3c_sleep_save_phys @ address of restore block | ||
142 | ldmia r0, { r4 - r13 } | ||
143 | |||
144 | mcr p15, 0, r4, c13, c0, 0 @ PID | ||
145 | mcr p15, 0, r5, c3, c0, 0 @ Domain ID | ||
146 | mcr p15, 0, r6, c2, c0, 0 @ translation table base | ||
147 | |||
148 | #ifdef CONFIG_DEBUG_RESUME | ||
149 | mov r3, #'R' | ||
150 | strb r3, [ r2, #S3C2410_UTXH ] | ||
151 | #endif | ||
152 | |||
153 | ldr r2, =resume_with_mmu | ||
154 | mcr p15, 0, r7, c1, c0, 0 @ turn on MMU, etc | ||
155 | nop @ second-to-last before mmu | ||
156 | mov pc, r2 @ go back to virtual address | ||
157 | |||
158 | .ltorg | ||
diff --git a/arch/arm/plat-samsung/include/plat/pm.h b/arch/arm/plat-samsung/include/plat/pm.h index 30518cc9a67c..937cc2ace517 100644 --- a/arch/arm/plat-samsung/include/plat/pm.h +++ b/arch/arm/plat-samsung/include/plat/pm.h | |||
@@ -52,13 +52,11 @@ extern unsigned char pm_uart_udivslot; /* true to save UART UDIVSLOT */ | |||
52 | 52 | ||
53 | /* from sleep.S */ | 53 | /* from sleep.S */ |
54 | 54 | ||
55 | extern int s3c_cpu_save(unsigned long *saveblk); | 55 | extern int s3c_cpu_save(unsigned long *saveblk, long); |
56 | extern void s3c_cpu_resume(void); | 56 | extern void s3c_cpu_resume(void); |
57 | 57 | ||
58 | extern void s3c2410_cpu_suspend(void); | 58 | extern void s3c2410_cpu_suspend(void); |
59 | 59 | ||
60 | extern unsigned long s3c_sleep_save_phys; | ||
61 | |||
62 | /* sleep save info */ | 60 | /* sleep save info */ |
63 | 61 | ||
64 | /** | 62 | /** |
@@ -181,13 +179,5 @@ extern void s3c_pm_restore_gpios(void); | |||
181 | */ | 179 | */ |
182 | extern void s3c_pm_save_gpios(void); | 180 | extern void s3c_pm_save_gpios(void); |
183 | 181 | ||
184 | /** | ||
185 | * s3c_pm_cb_flushcache - callback for assembly code | ||
186 | * | ||
187 | * Callback to issue flush_cache_all() as this call is | ||
188 | * not a directly callable object. | ||
189 | */ | ||
190 | extern void s3c_pm_cb_flushcache(void); | ||
191 | |||
192 | extern void s3c_pm_save_core(void); | 182 | extern void s3c_pm_save_core(void); |
193 | extern void s3c_pm_restore_core(void); | 183 | extern void s3c_pm_restore_core(void); |
diff --git a/arch/arm/plat-samsung/pm.c b/arch/arm/plat-samsung/pm.c index 02d531fb3f81..d5b58d31903c 100644 --- a/arch/arm/plat-samsung/pm.c +++ b/arch/arm/plat-samsung/pm.c | |||
@@ -241,8 +241,6 @@ void (*pm_cpu_sleep)(void); | |||
241 | 241 | ||
242 | static int s3c_pm_enter(suspend_state_t state) | 242 | static int s3c_pm_enter(suspend_state_t state) |
243 | { | 243 | { |
244 | static unsigned long regs_save[16]; | ||
245 | |||
246 | /* ensure the debug is initialised (if enabled) */ | 244 | /* ensure the debug is initialised (if enabled) */ |
247 | 245 | ||
248 | s3c_pm_debug_init(); | 246 | s3c_pm_debug_init(); |
@@ -266,12 +264,6 @@ static int s3c_pm_enter(suspend_state_t state) | |||
266 | return -EINVAL; | 264 | return -EINVAL; |
267 | } | 265 | } |
268 | 266 | ||
269 | /* store the physical address of the register recovery block */ | ||
270 | |||
271 | s3c_sleep_save_phys = virt_to_phys(regs_save); | ||
272 | |||
273 | S3C_PMDBG("s3c_sleep_save_phys=0x%08lx\n", s3c_sleep_save_phys); | ||
274 | |||
275 | /* save all necessary core registers not covered by the drivers */ | 267 | /* save all necessary core registers not covered by the drivers */ |
276 | 268 | ||
277 | s3c_pm_save_gpios(); | 269 | s3c_pm_save_gpios(); |
@@ -305,7 +297,7 @@ static int s3c_pm_enter(suspend_state_t state) | |||
305 | * we resume as it saves its own register state and restores it | 297 | * we resume as it saves its own register state and restores it |
306 | * during the resume. */ | 298 | * during the resume. */ |
307 | 299 | ||
308 | s3c_cpu_save(regs_save); | 300 | s3c_cpu_save(0, PLAT_PHYS_OFFSET - PAGE_OFFSET); |
309 | 301 | ||
310 | /* restore the cpu state using the kernel's cpu init code. */ | 302 | /* restore the cpu state using the kernel's cpu init code. */ |
311 | 303 | ||
@@ -336,12 +328,6 @@ static int s3c_pm_enter(suspend_state_t state) | |||
336 | return 0; | 328 | return 0; |
337 | } | 329 | } |
338 | 330 | ||
339 | /* callback from assembly code */ | ||
340 | void s3c_pm_cb_flushcache(void) | ||
341 | { | ||
342 | flush_cache_all(); | ||
343 | } | ||
344 | |||
345 | static int s3c_pm_prepare(void) | 331 | static int s3c_pm_prepare(void) |
346 | { | 332 | { |
347 | /* prepare check area if configured */ | 333 | /* prepare check area if configured */ |
diff --git a/arch/arm/plat-spear/Makefile b/arch/arm/plat-spear/Makefile index eb89540aeda9..b4f340b8f1f1 100644 --- a/arch/arm/plat-spear/Makefile +++ b/arch/arm/plat-spear/Makefile | |||
@@ -3,6 +3,6 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # Common support | 5 | # Common support |
6 | obj-y := clock.o padmux.o time.o | 6 | obj-y := clock.o time.o |
7 | 7 | ||
8 | obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o | 8 | obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o |
diff --git a/arch/arm/plat-spear/clock.c b/arch/arm/plat-spear/clock.c index ee4f90e534d8..bdbd7ec9cb6b 100644 --- a/arch/arm/plat-spear/clock.c +++ b/arch/arm/plat-spear/clock.c | |||
@@ -12,18 +12,25 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/bug.h> | 14 | #include <linux/bug.h> |
15 | #include <linux/clk.h> | ||
16 | #include <linux/debugfs.h> | ||
15 | #include <linux/err.h> | 17 | #include <linux/err.h> |
16 | #include <linux/io.h> | 18 | #include <linux/io.h> |
17 | #include <linux/list.h> | 19 | #include <linux/list.h> |
18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
19 | #include <linux/spinlock.h> | 21 | #include <linux/spinlock.h> |
20 | #include <mach/misc_regs.h> | ||
21 | #include <plat/clock.h> | 22 | #include <plat/clock.h> |
22 | 23 | ||
23 | static DEFINE_SPINLOCK(clocks_lock); | 24 | static DEFINE_SPINLOCK(clocks_lock); |
24 | static LIST_HEAD(root_clks); | 25 | static LIST_HEAD(root_clks); |
26 | #ifdef CONFIG_DEBUG_FS | ||
27 | static LIST_HEAD(clocks); | ||
28 | #endif | ||
25 | 29 | ||
26 | static void propagate_rate(struct list_head *); | 30 | static void propagate_rate(struct clk *, int on_init); |
31 | #ifdef CONFIG_DEBUG_FS | ||
32 | static int clk_debugfs_reparent(struct clk *); | ||
33 | #endif | ||
27 | 34 | ||
28 | static int generic_clk_enable(struct clk *clk) | 35 | static int generic_clk_enable(struct clk *clk) |
29 | { | 36 | { |
@@ -65,6 +72,104 @@ static struct clkops generic_clkops = { | |||
65 | .disable = generic_clk_disable, | 72 | .disable = generic_clk_disable, |
66 | }; | 73 | }; |
67 | 74 | ||
75 | /* returns current programmed clocks clock info structure */ | ||
76 | static struct pclk_info *pclk_info_get(struct clk *clk) | ||
77 | { | ||
78 | unsigned int val, i; | ||
79 | struct pclk_info *info = NULL; | ||
80 | |||
81 | val = (readl(clk->pclk_sel->pclk_sel_reg) >> clk->pclk_sel_shift) | ||
82 | & clk->pclk_sel->pclk_sel_mask; | ||
83 | |||
84 | for (i = 0; i < clk->pclk_sel->pclk_count; i++) { | ||
85 | if (clk->pclk_sel->pclk_info[i].pclk_val == val) | ||
86 | info = &clk->pclk_sel->pclk_info[i]; | ||
87 | } | ||
88 | |||
89 | return info; | ||
90 | } | ||
91 | |||
92 | /* | ||
93 | * Set Update pclk, and pclk_info of clk and add clock sibling node to current | ||
94 | * parents children list | ||
95 | */ | ||
96 | static void clk_reparent(struct clk *clk, struct pclk_info *pclk_info) | ||
97 | { | ||
98 | unsigned long flags; | ||
99 | |||
100 | spin_lock_irqsave(&clocks_lock, flags); | ||
101 | list_del(&clk->sibling); | ||
102 | list_add(&clk->sibling, &pclk_info->pclk->children); | ||
103 | |||
104 | clk->pclk = pclk_info->pclk; | ||
105 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
106 | |||
107 | #ifdef CONFIG_DEBUG_FS | ||
108 | clk_debugfs_reparent(clk); | ||
109 | #endif | ||
110 | } | ||
111 | |||
112 | static void do_clk_disable(struct clk *clk) | ||
113 | { | ||
114 | if (!clk) | ||
115 | return; | ||
116 | |||
117 | if (!clk->usage_count) { | ||
118 | WARN_ON(1); | ||
119 | return; | ||
120 | } | ||
121 | |||
122 | clk->usage_count--; | ||
123 | |||
124 | if (clk->usage_count == 0) { | ||
125 | /* | ||
126 | * Surely, there are no active childrens or direct users | ||
127 | * of this clock | ||
128 | */ | ||
129 | if (clk->pclk) | ||
130 | do_clk_disable(clk->pclk); | ||
131 | |||
132 | if (clk->ops && clk->ops->disable) | ||
133 | clk->ops->disable(clk); | ||
134 | } | ||
135 | } | ||
136 | |||
137 | static int do_clk_enable(struct clk *clk) | ||
138 | { | ||
139 | int ret = 0; | ||
140 | |||
141 | if (!clk) | ||
142 | return -EFAULT; | ||
143 | |||
144 | if (clk->usage_count == 0) { | ||
145 | if (clk->pclk) { | ||
146 | ret = do_clk_enable(clk->pclk); | ||
147 | if (ret) | ||
148 | goto err; | ||
149 | } | ||
150 | if (clk->ops && clk->ops->enable) { | ||
151 | ret = clk->ops->enable(clk); | ||
152 | if (ret) { | ||
153 | if (clk->pclk) | ||
154 | do_clk_disable(clk->pclk); | ||
155 | goto err; | ||
156 | } | ||
157 | } | ||
158 | /* | ||
159 | * Since the clock is going to be used for the first | ||
160 | * time please reclac | ||
161 | */ | ||
162 | if (clk->recalc) { | ||
163 | ret = clk->recalc(clk); | ||
164 | if (ret) | ||
165 | goto err; | ||
166 | } | ||
167 | } | ||
168 | clk->usage_count++; | ||
169 | err: | ||
170 | return ret; | ||
171 | } | ||
172 | |||
68 | /* | 173 | /* |
69 | * clk_enable - inform the system when the clock source should be running. | 174 | * clk_enable - inform the system when the clock source should be running. |
70 | * @clk: clock source | 175 | * @clk: clock source |
@@ -78,17 +183,9 @@ int clk_enable(struct clk *clk) | |||
78 | unsigned long flags; | 183 | unsigned long flags; |
79 | int ret = 0; | 184 | int ret = 0; |
80 | 185 | ||
81 | if (!clk || IS_ERR(clk)) | ||
82 | return -EFAULT; | ||
83 | |||
84 | spin_lock_irqsave(&clocks_lock, flags); | 186 | spin_lock_irqsave(&clocks_lock, flags); |
85 | if (clk->usage_count == 0) { | 187 | ret = do_clk_enable(clk); |
86 | if (clk->ops && clk->ops->enable) | ||
87 | ret = clk->ops->enable(clk); | ||
88 | } | ||
89 | clk->usage_count++; | ||
90 | spin_unlock_irqrestore(&clocks_lock, flags); | 188 | spin_unlock_irqrestore(&clocks_lock, flags); |
91 | |||
92 | return ret; | 189 | return ret; |
93 | } | 190 | } |
94 | EXPORT_SYMBOL(clk_enable); | 191 | EXPORT_SYMBOL(clk_enable); |
@@ -109,17 +206,8 @@ void clk_disable(struct clk *clk) | |||
109 | { | 206 | { |
110 | unsigned long flags; | 207 | unsigned long flags; |
111 | 208 | ||
112 | if (!clk || IS_ERR(clk)) | ||
113 | return; | ||
114 | |||
115 | WARN_ON(clk->usage_count == 0); | ||
116 | |||
117 | spin_lock_irqsave(&clocks_lock, flags); | 209 | spin_lock_irqsave(&clocks_lock, flags); |
118 | clk->usage_count--; | 210 | do_clk_disable(clk); |
119 | if (clk->usage_count == 0) { | ||
120 | if (clk->ops && clk->ops->disable) | ||
121 | clk->ops->disable(clk); | ||
122 | } | ||
123 | spin_unlock_irqrestore(&clocks_lock, flags); | 211 | spin_unlock_irqrestore(&clocks_lock, flags); |
124 | } | 212 | } |
125 | EXPORT_SYMBOL(clk_disable); | 213 | EXPORT_SYMBOL(clk_disable); |
@@ -153,15 +241,14 @@ int clk_set_parent(struct clk *clk, struct clk *parent) | |||
153 | int i, found = 0, val = 0; | 241 | int i, found = 0, val = 0; |
154 | unsigned long flags; | 242 | unsigned long flags; |
155 | 243 | ||
156 | if (!clk || IS_ERR(clk) || !parent || IS_ERR(parent)) | 244 | if (!clk || !parent) |
157 | return -EFAULT; | 245 | return -EFAULT; |
158 | if (clk->usage_count) | ||
159 | return -EBUSY; | ||
160 | if (!clk->pclk_sel) | ||
161 | return -EPERM; | ||
162 | if (clk->pclk == parent) | 246 | if (clk->pclk == parent) |
163 | return 0; | 247 | return 0; |
248 | if (!clk->pclk_sel) | ||
249 | return -EPERM; | ||
164 | 250 | ||
251 | /* check if requested parent is in clk parent list */ | ||
165 | for (i = 0; i < clk->pclk_sel->pclk_count; i++) { | 252 | for (i = 0; i < clk->pclk_sel->pclk_count; i++) { |
166 | if (clk->pclk_sel->pclk_info[i].pclk == parent) { | 253 | if (clk->pclk_sel->pclk_info[i].pclk == parent) { |
167 | found = 1; | 254 | found = 1; |
@@ -176,25 +263,58 @@ int clk_set_parent(struct clk *clk, struct clk *parent) | |||
176 | /* reflect parent change in hardware */ | 263 | /* reflect parent change in hardware */ |
177 | val = readl(clk->pclk_sel->pclk_sel_reg); | 264 | val = readl(clk->pclk_sel->pclk_sel_reg); |
178 | val &= ~(clk->pclk_sel->pclk_sel_mask << clk->pclk_sel_shift); | 265 | val &= ~(clk->pclk_sel->pclk_sel_mask << clk->pclk_sel_shift); |
179 | val |= clk->pclk_sel->pclk_info[i].pclk_mask << clk->pclk_sel_shift; | 266 | val |= clk->pclk_sel->pclk_info[i].pclk_val << clk->pclk_sel_shift; |
180 | writel(val, clk->pclk_sel->pclk_sel_reg); | 267 | writel(val, clk->pclk_sel->pclk_sel_reg); |
181 | spin_unlock_irqrestore(&clocks_lock, flags); | 268 | spin_unlock_irqrestore(&clocks_lock, flags); |
182 | 269 | ||
183 | /* reflect parent change in software */ | 270 | /* reflect parent change in software */ |
184 | clk->recalc(clk); | 271 | clk_reparent(clk, &clk->pclk_sel->pclk_info[i]); |
185 | propagate_rate(&clk->children); | 272 | |
273 | propagate_rate(clk, 0); | ||
186 | return 0; | 274 | return 0; |
187 | } | 275 | } |
188 | EXPORT_SYMBOL(clk_set_parent); | 276 | EXPORT_SYMBOL(clk_set_parent); |
189 | 277 | ||
278 | /** | ||
279 | * clk_set_rate - set the clock rate for a clock source | ||
280 | * @clk: clock source | ||
281 | * @rate: desired clock rate in Hz | ||
282 | * | ||
283 | * Returns success (0) or negative errno. | ||
284 | */ | ||
285 | int clk_set_rate(struct clk *clk, unsigned long rate) | ||
286 | { | ||
287 | unsigned long flags; | ||
288 | int ret = -EINVAL; | ||
289 | |||
290 | if (!clk || !rate) | ||
291 | return -EFAULT; | ||
292 | |||
293 | if (clk->set_rate) { | ||
294 | spin_lock_irqsave(&clocks_lock, flags); | ||
295 | ret = clk->set_rate(clk, rate); | ||
296 | if (!ret) | ||
297 | /* if successful -> propagate */ | ||
298 | propagate_rate(clk, 0); | ||
299 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
300 | } else if (clk->pclk) { | ||
301 | u32 mult = clk->div_factor ? clk->div_factor : 1; | ||
302 | ret = clk_set_rate(clk->pclk, mult * rate); | ||
303 | } | ||
304 | |||
305 | return ret; | ||
306 | } | ||
307 | EXPORT_SYMBOL(clk_set_rate); | ||
308 | |||
190 | /* registers clock in platform clock framework */ | 309 | /* registers clock in platform clock framework */ |
191 | void clk_register(struct clk_lookup *cl) | 310 | void clk_register(struct clk_lookup *cl) |
192 | { | 311 | { |
193 | struct clk *clk = cl->clk; | 312 | struct clk *clk; |
194 | unsigned long flags; | 313 | unsigned long flags; |
195 | 314 | ||
196 | if (!clk || IS_ERR(clk)) | 315 | if (!cl || !cl->clk) |
197 | return; | 316 | return; |
317 | clk = cl->clk; | ||
198 | 318 | ||
199 | spin_lock_irqsave(&clocks_lock, flags); | 319 | spin_lock_irqsave(&clocks_lock, flags); |
200 | 320 | ||
@@ -207,71 +327,173 @@ void clk_register(struct clk_lookup *cl) | |||
207 | /* root clock don't have any parents */ | 327 | /* root clock don't have any parents */ |
208 | if (!clk->pclk && !clk->pclk_sel) { | 328 | if (!clk->pclk && !clk->pclk_sel) { |
209 | list_add(&clk->sibling, &root_clks); | 329 | list_add(&clk->sibling, &root_clks); |
210 | /* add clocks with only one parent to parent's children list */ | ||
211 | } else if (clk->pclk && !clk->pclk_sel) { | 330 | } else if (clk->pclk && !clk->pclk_sel) { |
331 | /* add clocks with only one parent to parent's children list */ | ||
212 | list_add(&clk->sibling, &clk->pclk->children); | 332 | list_add(&clk->sibling, &clk->pclk->children); |
213 | } else { | 333 | } else { |
214 | /* add clocks with > 1 parent to 1st parent's children list */ | 334 | /* clocks with more than one parent */ |
215 | list_add(&clk->sibling, | 335 | struct pclk_info *pclk_info; |
216 | &clk->pclk_sel->pclk_info[0].pclk->children); | 336 | |
337 | pclk_info = pclk_info_get(clk); | ||
338 | if (!pclk_info) { | ||
339 | pr_err("CLKDEV: invalid pclk info of clk with" | ||
340 | " %s dev_id and %s con_id\n", | ||
341 | cl->dev_id, cl->con_id); | ||
342 | } else { | ||
343 | clk->pclk = pclk_info->pclk; | ||
344 | list_add(&clk->sibling, &pclk_info->pclk->children); | ||
345 | } | ||
217 | } | 346 | } |
347 | |||
218 | spin_unlock_irqrestore(&clocks_lock, flags); | 348 | spin_unlock_irqrestore(&clocks_lock, flags); |
219 | 349 | ||
350 | /* debugfs specific */ | ||
351 | #ifdef CONFIG_DEBUG_FS | ||
352 | list_add(&clk->node, &clocks); | ||
353 | clk->cl = cl; | ||
354 | #endif | ||
355 | |||
220 | /* add clock to arm clockdev framework */ | 356 | /* add clock to arm clockdev framework */ |
221 | clkdev_add(cl); | 357 | clkdev_add(cl); |
222 | } | 358 | } |
223 | 359 | ||
224 | /** | 360 | /** |
225 | * propagate_rate - recalculate and propagate all clocks in list head | 361 | * propagate_rate - recalculate and propagate all clocks to children |
362 | * @pclk: parent clock required to be propogated | ||
363 | * @on_init: flag for enabling clocks which are ENABLED_ON_INIT. | ||
226 | * | 364 | * |
227 | * Recalculates all root clocks in list head, which if the clock's .recalc is | 365 | * Recalculates all children clocks |
228 | * set correctly, should also propagate their rates. | ||
229 | */ | 366 | */ |
230 | static void propagate_rate(struct list_head *lhead) | 367 | void propagate_rate(struct clk *pclk, int on_init) |
231 | { | 368 | { |
232 | struct clk *clkp, *_temp; | 369 | struct clk *clk, *_temp; |
370 | int ret = 0; | ||
233 | 371 | ||
234 | list_for_each_entry_safe(clkp, _temp, lhead, sibling) { | 372 | list_for_each_entry_safe(clk, _temp, &pclk->children, sibling) { |
235 | if (clkp->recalc) | 373 | if (clk->recalc) { |
236 | clkp->recalc(clkp); | 374 | ret = clk->recalc(clk); |
237 | propagate_rate(&clkp->children); | 375 | /* |
376 | * recalc will return error if clk out is not programmed | ||
377 | * In this case configure default rate. | ||
378 | */ | ||
379 | if (ret && clk->set_rate) | ||
380 | clk->set_rate(clk, 0); | ||
381 | } | ||
382 | propagate_rate(clk, on_init); | ||
383 | |||
384 | if (!on_init) | ||
385 | continue; | ||
386 | |||
387 | /* Enable clks enabled on init, in software view */ | ||
388 | if (clk->flags & ENABLED_ON_INIT) | ||
389 | do_clk_enable(clk); | ||
238 | } | 390 | } |
239 | } | 391 | } |
240 | 392 | ||
241 | /* returns current programmed clocks clock info structure */ | 393 | /** |
242 | static struct pclk_info *pclk_info_get(struct clk *clk) | 394 | * round_rate_index - return closest programmable rate index in rate_config tbl |
395 | * @clk: ptr to clock structure | ||
396 | * @drate: desired rate | ||
397 | * @rate: final rate will be returned in this variable only. | ||
398 | * | ||
399 | * Finds index in rate_config for highest clk rate which is less than | ||
400 | * requested rate. If there is no clk rate lesser than requested rate then | ||
401 | * -EINVAL is returned. This routine assumes that rate_config is written | ||
402 | * in incrementing order of clk rates. | ||
403 | * If drate passed is zero then default rate is programmed. | ||
404 | */ | ||
405 | static int | ||
406 | round_rate_index(struct clk *clk, unsigned long drate, unsigned long *rate) | ||
243 | { | 407 | { |
244 | unsigned int mask, i; | 408 | unsigned long tmp = 0, prev_rate = 0; |
245 | unsigned long flags; | 409 | int index; |
246 | struct pclk_info *info = NULL; | ||
247 | 410 | ||
248 | spin_lock_irqsave(&clocks_lock, flags); | 411 | if (!clk->calc_rate) |
249 | mask = (readl(clk->pclk_sel->pclk_sel_reg) >> clk->pclk_sel_shift) | 412 | return -EFAULT; |
250 | & clk->pclk_sel->pclk_sel_mask; | ||
251 | 413 | ||
252 | for (i = 0; i < clk->pclk_sel->pclk_count; i++) { | 414 | if (!drate) |
253 | if (clk->pclk_sel->pclk_info[i].pclk_mask == mask) | 415 | return -EINVAL; |
254 | info = &clk->pclk_sel->pclk_info[i]; | 416 | |
417 | /* | ||
418 | * This loops ends on two conditions: | ||
419 | * - as soon as clk is found with rate greater than requested rate. | ||
420 | * - if all clks in rate_config are smaller than requested rate. | ||
421 | */ | ||
422 | for (index = 0; index < clk->rate_config.count; index++) { | ||
423 | prev_rate = tmp; | ||
424 | tmp = clk->calc_rate(clk, index); | ||
425 | if (drate < tmp) { | ||
426 | index--; | ||
427 | break; | ||
428 | } | ||
255 | } | 429 | } |
256 | spin_unlock_irqrestore(&clocks_lock, flags); | 430 | /* return if can't find suitable clock */ |
431 | if (index < 0) { | ||
432 | index = -EINVAL; | ||
433 | *rate = 0; | ||
434 | } else if (index == clk->rate_config.count) { | ||
435 | /* program with highest clk rate possible */ | ||
436 | index = clk->rate_config.count - 1; | ||
437 | *rate = tmp; | ||
438 | } else | ||
439 | *rate = prev_rate; | ||
257 | 440 | ||
258 | return info; | 441 | return index; |
259 | } | 442 | } |
260 | 443 | ||
261 | /* | 444 | /** |
262 | * Set pclk as cclk's parent and add clock sibling node to current parents | 445 | * clk_round_rate - adjust a rate to the exact rate a clock can provide |
263 | * children list | 446 | * @clk: clock source |
447 | * @rate: desired clock rate in Hz | ||
448 | * | ||
449 | * Returns rounded clock rate in Hz, or negative errno. | ||
264 | */ | 450 | */ |
265 | static void change_parent(struct clk *cclk, struct clk *pclk) | 451 | long clk_round_rate(struct clk *clk, unsigned long drate) |
266 | { | 452 | { |
267 | unsigned long flags; | 453 | long rate = 0; |
454 | int index; | ||
455 | |||
456 | /* | ||
457 | * propagate call to parent who supports calc_rate. Similar approach is | ||
458 | * used in clk_set_rate. | ||
459 | */ | ||
460 | if (!clk->calc_rate) { | ||
461 | u32 mult; | ||
462 | if (!clk->pclk) | ||
463 | return clk->rate; | ||
464 | |||
465 | mult = clk->div_factor ? clk->div_factor : 1; | ||
466 | return clk_round_rate(clk->pclk, mult * drate) / mult; | ||
467 | } | ||
268 | 468 | ||
269 | spin_lock_irqsave(&clocks_lock, flags); | 469 | index = round_rate_index(clk, drate, &rate); |
270 | list_del(&cclk->sibling); | 470 | if (index >= 0) |
271 | list_add(&cclk->sibling, &pclk->children); | 471 | return rate; |
472 | else | ||
473 | return index; | ||
474 | } | ||
475 | EXPORT_SYMBOL(clk_round_rate); | ||
272 | 476 | ||
273 | cclk->pclk = pclk; | 477 | /*All below functions are called with lock held */ |
274 | spin_unlock_irqrestore(&clocks_lock, flags); | 478 | |
479 | /* | ||
480 | * Calculates pll clk rate for specific value of mode, m, n and p | ||
481 | * | ||
482 | * In normal mode | ||
483 | * rate = (2 * M[15:8] * Fin)/(N * 2^P) | ||
484 | * | ||
485 | * In Dithered mode | ||
486 | * rate = (2 * M[15:0] * Fin)/(256 * N * 2^P) | ||
487 | */ | ||
488 | unsigned long pll_calc_rate(struct clk *clk, int index) | ||
489 | { | ||
490 | unsigned long rate = clk->pclk->rate; | ||
491 | struct pll_rate_tbl *tbls = clk->rate_config.tbls; | ||
492 | unsigned int mode; | ||
493 | |||
494 | mode = tbls[index].mode ? 256 : 1; | ||
495 | return (((2 * rate / 10000) * tbls[index].m) / | ||
496 | (mode * tbls[index].n * (1 << tbls[index].p))) * 10000; | ||
275 | } | 497 | } |
276 | 498 | ||
277 | /* | 499 | /* |
@@ -283,47 +505,146 @@ static void change_parent(struct clk *cclk, struct clk *pclk) | |||
283 | * In Dithered mode | 505 | * In Dithered mode |
284 | * rate = (2 * M[15:0] * Fin)/(256 * N * 2^P) | 506 | * rate = (2 * M[15:0] * Fin)/(256 * N * 2^P) |
285 | */ | 507 | */ |
286 | void pll1_clk_recalc(struct clk *clk) | 508 | int pll_clk_recalc(struct clk *clk) |
287 | { | 509 | { |
288 | struct pll_clk_config *config = clk->private_data; | 510 | struct pll_clk_config *config = clk->private_data; |
289 | unsigned int num = 2, den = 0, val, mode = 0; | 511 | unsigned int num = 2, den = 0, val, mode = 0; |
290 | unsigned long flags; | ||
291 | 512 | ||
292 | spin_lock_irqsave(&clocks_lock, flags); | 513 | mode = (readl(config->mode_reg) >> config->masks->mode_shift) & |
293 | mode = (readl(config->mode_reg) >> PLL_MODE_SHIFT) & | 514 | config->masks->mode_mask; |
294 | PLL_MODE_MASK; | ||
295 | 515 | ||
296 | val = readl(config->cfg_reg); | 516 | val = readl(config->cfg_reg); |
297 | /* calculate denominator */ | 517 | /* calculate denominator */ |
298 | den = (val >> PLL_DIV_P_SHIFT) & PLL_DIV_P_MASK; | 518 | den = (val >> config->masks->div_p_shift) & config->masks->div_p_mask; |
299 | den = 1 << den; | 519 | den = 1 << den; |
300 | den *= (val >> PLL_DIV_N_SHIFT) & PLL_DIV_N_MASK; | 520 | den *= (val >> config->masks->div_n_shift) & config->masks->div_n_mask; |
301 | 521 | ||
302 | /* calculate numerator & denominator */ | 522 | /* calculate numerator & denominator */ |
303 | if (!mode) { | 523 | if (!mode) { |
304 | /* Normal mode */ | 524 | /* Normal mode */ |
305 | num *= (val >> PLL_NORM_FDBK_M_SHIFT) & PLL_NORM_FDBK_M_MASK; | 525 | num *= (val >> config->masks->norm_fdbk_m_shift) & |
526 | config->masks->norm_fdbk_m_mask; | ||
306 | } else { | 527 | } else { |
307 | /* Dithered mode */ | 528 | /* Dithered mode */ |
308 | num *= (val >> PLL_DITH_FDBK_M_SHIFT) & PLL_DITH_FDBK_M_MASK; | 529 | num *= (val >> config->masks->dith_fdbk_m_shift) & |
530 | config->masks->dith_fdbk_m_mask; | ||
309 | den *= 256; | 531 | den *= 256; |
310 | } | 532 | } |
311 | 533 | ||
534 | if (!den) | ||
535 | return -EINVAL; | ||
536 | |||
312 | clk->rate = (((clk->pclk->rate/10000) * num) / den) * 10000; | 537 | clk->rate = (((clk->pclk->rate/10000) * num) / den) * 10000; |
313 | spin_unlock_irqrestore(&clocks_lock, flags); | 538 | return 0; |
539 | } | ||
540 | |||
541 | /* | ||
542 | * Configures new clock rate of pll | ||
543 | */ | ||
544 | int pll_clk_set_rate(struct clk *clk, unsigned long desired_rate) | ||
545 | { | ||
546 | struct pll_rate_tbl *tbls = clk->rate_config.tbls; | ||
547 | struct pll_clk_config *config = clk->private_data; | ||
548 | unsigned long val, rate; | ||
549 | int i; | ||
550 | |||
551 | i = round_rate_index(clk, desired_rate, &rate); | ||
552 | if (i < 0) | ||
553 | return i; | ||
554 | |||
555 | val = readl(config->mode_reg) & | ||
556 | ~(config->masks->mode_mask << config->masks->mode_shift); | ||
557 | val |= (tbls[i].mode & config->masks->mode_mask) << | ||
558 | config->masks->mode_shift; | ||
559 | writel(val, config->mode_reg); | ||
560 | |||
561 | val = readl(config->cfg_reg) & | ||
562 | ~(config->masks->div_p_mask << config->masks->div_p_shift); | ||
563 | val |= (tbls[i].p & config->masks->div_p_mask) << | ||
564 | config->masks->div_p_shift; | ||
565 | val &= ~(config->masks->div_n_mask << config->masks->div_n_shift); | ||
566 | val |= (tbls[i].n & config->masks->div_n_mask) << | ||
567 | config->masks->div_n_shift; | ||
568 | val &= ~(config->masks->dith_fdbk_m_mask << | ||
569 | config->masks->dith_fdbk_m_shift); | ||
570 | if (tbls[i].mode) | ||
571 | val |= (tbls[i].m & config->masks->dith_fdbk_m_mask) << | ||
572 | config->masks->dith_fdbk_m_shift; | ||
573 | else | ||
574 | val |= (tbls[i].m & config->masks->norm_fdbk_m_mask) << | ||
575 | config->masks->norm_fdbk_m_shift; | ||
576 | |||
577 | writel(val, config->cfg_reg); | ||
578 | |||
579 | clk->rate = rate; | ||
580 | |||
581 | return 0; | ||
582 | } | ||
583 | |||
584 | /* | ||
585 | * Calculates ahb, apb clk rate for specific value of div | ||
586 | */ | ||
587 | unsigned long bus_calc_rate(struct clk *clk, int index) | ||
588 | { | ||
589 | unsigned long rate = clk->pclk->rate; | ||
590 | struct bus_rate_tbl *tbls = clk->rate_config.tbls; | ||
591 | |||
592 | return rate / (tbls[index].div + 1); | ||
314 | } | 593 | } |
315 | 594 | ||
316 | /* calculates current programmed rate of ahb or apb bus */ | 595 | /* calculates current programmed rate of ahb or apb bus */ |
317 | void bus_clk_recalc(struct clk *clk) | 596 | int bus_clk_recalc(struct clk *clk) |
318 | { | 597 | { |
319 | struct bus_clk_config *config = clk->private_data; | 598 | struct bus_clk_config *config = clk->private_data; |
320 | unsigned int div; | 599 | unsigned int div; |
321 | unsigned long flags; | ||
322 | 600 | ||
323 | spin_lock_irqsave(&clocks_lock, flags); | 601 | div = ((readl(config->reg) >> config->masks->shift) & |
324 | div = ((readl(config->reg) >> config->shift) & config->mask) + 1; | 602 | config->masks->mask) + 1; |
603 | |||
604 | if (!div) | ||
605 | return -EINVAL; | ||
606 | |||
325 | clk->rate = (unsigned long)clk->pclk->rate / div; | 607 | clk->rate = (unsigned long)clk->pclk->rate / div; |
326 | spin_unlock_irqrestore(&clocks_lock, flags); | 608 | return 0; |
609 | } | ||
610 | |||
611 | /* Configures new clock rate of AHB OR APB bus */ | ||
612 | int bus_clk_set_rate(struct clk *clk, unsigned long desired_rate) | ||
613 | { | ||
614 | struct bus_rate_tbl *tbls = clk->rate_config.tbls; | ||
615 | struct bus_clk_config *config = clk->private_data; | ||
616 | unsigned long val, rate; | ||
617 | int i; | ||
618 | |||
619 | i = round_rate_index(clk, desired_rate, &rate); | ||
620 | if (i < 0) | ||
621 | return i; | ||
622 | |||
623 | val = readl(config->reg) & | ||
624 | ~(config->masks->mask << config->masks->shift); | ||
625 | val |= (tbls[i].div & config->masks->mask) << config->masks->shift; | ||
626 | writel(val, config->reg); | ||
627 | |||
628 | clk->rate = rate; | ||
629 | |||
630 | return 0; | ||
631 | } | ||
632 | |||
633 | /* | ||
634 | * gives rate for different values of eq, x and y | ||
635 | * | ||
636 | * Fout from synthesizer can be given from two equations: | ||
637 | * Fout1 = (Fin * X/Y)/2 EQ1 | ||
638 | * Fout2 = Fin * X/Y EQ2 | ||
639 | */ | ||
640 | unsigned long aux_calc_rate(struct clk *clk, int index) | ||
641 | { | ||
642 | unsigned long rate = clk->pclk->rate; | ||
643 | struct aux_rate_tbl *tbls = clk->rate_config.tbls; | ||
644 | u8 eq = tbls[index].eq ? 1 : 2; | ||
645 | |||
646 | return (((rate/10000) * tbls[index].xscale) / | ||
647 | (tbls[index].yscale * eq)) * 10000; | ||
327 | } | 648 | } |
328 | 649 | ||
329 | /* | 650 | /* |
@@ -336,44 +657,76 @@ void bus_clk_recalc(struct clk *clk) | |||
336 | * | 657 | * |
337 | * Selection of eqn 1 or 2 is programmed in register | 658 | * Selection of eqn 1 or 2 is programmed in register |
338 | */ | 659 | */ |
339 | void aux_clk_recalc(struct clk *clk) | 660 | int aux_clk_recalc(struct clk *clk) |
340 | { | 661 | { |
341 | struct aux_clk_config *config = clk->private_data; | 662 | struct aux_clk_config *config = clk->private_data; |
342 | struct pclk_info *pclk_info = NULL; | ||
343 | unsigned int num = 1, den = 1, val, eqn; | 663 | unsigned int num = 1, den = 1, val, eqn; |
344 | unsigned long flags; | ||
345 | 664 | ||
346 | /* get current programmed parent */ | 665 | val = readl(config->synth_reg); |
347 | pclk_info = pclk_info_get(clk); | ||
348 | if (!pclk_info) { | ||
349 | spin_lock_irqsave(&clocks_lock, flags); | ||
350 | clk->pclk = NULL; | ||
351 | clk->rate = 0; | ||
352 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
353 | return; | ||
354 | } | ||
355 | 666 | ||
356 | change_parent(clk, pclk_info->pclk); | 667 | eqn = (val >> config->masks->eq_sel_shift) & |
668 | config->masks->eq_sel_mask; | ||
669 | if (eqn == config->masks->eq1_mask) | ||
670 | den *= 2; | ||
357 | 671 | ||
358 | spin_lock_irqsave(&clocks_lock, flags); | 672 | /* calculate numerator */ |
359 | if (pclk_info->scalable) { | 673 | num = (val >> config->masks->xscale_sel_shift) & |
360 | val = readl(config->synth_reg); | 674 | config->masks->xscale_sel_mask; |
361 | 675 | ||
362 | eqn = (val >> AUX_EQ_SEL_SHIFT) & AUX_EQ_SEL_MASK; | 676 | /* calculate denominator */ |
363 | if (eqn == AUX_EQ1_SEL) | 677 | den *= (val >> config->masks->yscale_sel_shift) & |
364 | den *= 2; | 678 | config->masks->yscale_sel_mask; |
365 | 679 | ||
366 | /* calculate numerator */ | 680 | if (!den) |
367 | num = (val >> AUX_XSCALE_SHIFT) & AUX_XSCALE_MASK; | 681 | return -EINVAL; |
368 | 682 | ||
369 | /* calculate denominator */ | 683 | clk->rate = (((clk->pclk->rate/10000) * num) / den) * 10000; |
370 | den *= (val >> AUX_YSCALE_SHIFT) & AUX_YSCALE_MASK; | 684 | return 0; |
371 | val = (((clk->pclk->rate/10000) * num) / den) * 10000; | 685 | } |
372 | } else | ||
373 | val = clk->pclk->rate; | ||
374 | 686 | ||
375 | clk->rate = val; | 687 | /* Configures new clock rate of auxiliary synthesizers used by: UART, FIRDA*/ |
376 | spin_unlock_irqrestore(&clocks_lock, flags); | 688 | int aux_clk_set_rate(struct clk *clk, unsigned long desired_rate) |
689 | { | ||
690 | struct aux_rate_tbl *tbls = clk->rate_config.tbls; | ||
691 | struct aux_clk_config *config = clk->private_data; | ||
692 | unsigned long val, rate; | ||
693 | int i; | ||
694 | |||
695 | i = round_rate_index(clk, desired_rate, &rate); | ||
696 | if (i < 0) | ||
697 | return i; | ||
698 | |||
699 | val = readl(config->synth_reg) & | ||
700 | ~(config->masks->eq_sel_mask << config->masks->eq_sel_shift); | ||
701 | val |= (tbls[i].eq & config->masks->eq_sel_mask) << | ||
702 | config->masks->eq_sel_shift; | ||
703 | val &= ~(config->masks->xscale_sel_mask << | ||
704 | config->masks->xscale_sel_shift); | ||
705 | val |= (tbls[i].xscale & config->masks->xscale_sel_mask) << | ||
706 | config->masks->xscale_sel_shift; | ||
707 | val &= ~(config->masks->yscale_sel_mask << | ||
708 | config->masks->yscale_sel_shift); | ||
709 | val |= (tbls[i].yscale & config->masks->yscale_sel_mask) << | ||
710 | config->masks->yscale_sel_shift; | ||
711 | writel(val, config->synth_reg); | ||
712 | |||
713 | clk->rate = rate; | ||
714 | |||
715 | return 0; | ||
716 | } | ||
717 | |||
718 | /* | ||
719 | * Calculates gpt clk rate for different values of mscale and nscale | ||
720 | * | ||
721 | * Fout= Fin/((2 ^ (N+1)) * (M+1)) | ||
722 | */ | ||
723 | unsigned long gpt_calc_rate(struct clk *clk, int index) | ||
724 | { | ||
725 | unsigned long rate = clk->pclk->rate; | ||
726 | struct gpt_rate_tbl *tbls = clk->rate_config.tbls; | ||
727 | |||
728 | return rate / ((1 << (tbls[index].nscale + 1)) * | ||
729 | (tbls[index].mscale + 1)); | ||
377 | } | 730 | } |
378 | 731 | ||
379 | /* | 732 | /* |
@@ -381,46 +734,142 @@ void aux_clk_recalc(struct clk *clk) | |||
381 | * Fout from synthesizer can be given from below equations: | 734 | * Fout from synthesizer can be given from below equations: |
382 | * Fout= Fin/((2 ^ (N+1)) * (M+1)) | 735 | * Fout= Fin/((2 ^ (N+1)) * (M+1)) |
383 | */ | 736 | */ |
384 | void gpt_clk_recalc(struct clk *clk) | 737 | int gpt_clk_recalc(struct clk *clk) |
385 | { | 738 | { |
386 | struct aux_clk_config *config = clk->private_data; | 739 | struct gpt_clk_config *config = clk->private_data; |
387 | struct pclk_info *pclk_info = NULL; | ||
388 | unsigned int div = 1, val; | 740 | unsigned int div = 1, val; |
389 | unsigned long flags; | ||
390 | 741 | ||
391 | pclk_info = pclk_info_get(clk); | 742 | val = readl(config->synth_reg); |
392 | if (!pclk_info) { | 743 | div += (val >> config->masks->mscale_sel_shift) & |
393 | spin_lock_irqsave(&clocks_lock, flags); | 744 | config->masks->mscale_sel_mask; |
394 | clk->pclk = NULL; | 745 | div *= 1 << (((val >> config->masks->nscale_sel_shift) & |
395 | clk->rate = 0; | 746 | config->masks->nscale_sel_mask) + 1); |
396 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
397 | return; | ||
398 | } | ||
399 | |||
400 | change_parent(clk, pclk_info->pclk); | ||
401 | 747 | ||
402 | spin_lock_irqsave(&clocks_lock, flags); | 748 | if (!div) |
403 | if (pclk_info->scalable) { | 749 | return -EINVAL; |
404 | val = readl(config->synth_reg); | ||
405 | div += (val >> GPT_MSCALE_SHIFT) & GPT_MSCALE_MASK; | ||
406 | div *= 1 << (((val >> GPT_NSCALE_SHIFT) & GPT_NSCALE_MASK) + 1); | ||
407 | } | ||
408 | 750 | ||
409 | clk->rate = (unsigned long)clk->pclk->rate / div; | 751 | clk->rate = (unsigned long)clk->pclk->rate / div; |
410 | spin_unlock_irqrestore(&clocks_lock, flags); | 752 | return 0; |
753 | } | ||
754 | |||
755 | /* Configures new clock rate of gptiliary synthesizers used by: UART, FIRDA*/ | ||
756 | int gpt_clk_set_rate(struct clk *clk, unsigned long desired_rate) | ||
757 | { | ||
758 | struct gpt_rate_tbl *tbls = clk->rate_config.tbls; | ||
759 | struct gpt_clk_config *config = clk->private_data; | ||
760 | unsigned long val, rate; | ||
761 | int i; | ||
762 | |||
763 | i = round_rate_index(clk, desired_rate, &rate); | ||
764 | if (i < 0) | ||
765 | return i; | ||
766 | |||
767 | val = readl(config->synth_reg) & ~(config->masks->mscale_sel_mask << | ||
768 | config->masks->mscale_sel_shift); | ||
769 | val |= (tbls[i].mscale & config->masks->mscale_sel_mask) << | ||
770 | config->masks->mscale_sel_shift; | ||
771 | val &= ~(config->masks->nscale_sel_mask << | ||
772 | config->masks->nscale_sel_shift); | ||
773 | val |= (tbls[i].nscale & config->masks->nscale_sel_mask) << | ||
774 | config->masks->nscale_sel_shift; | ||
775 | writel(val, config->synth_reg); | ||
776 | |||
777 | clk->rate = rate; | ||
778 | |||
779 | return 0; | ||
411 | } | 780 | } |
412 | 781 | ||
413 | /* | 782 | /* |
414 | * Used for clocks that always have same value as the parent clock divided by a | 783 | * Calculates clcd clk rate for different values of div |
784 | * | ||
785 | * Fout from synthesizer can be given from below equation: | ||
786 | * Fout= Fin/2*div (division factor) | ||
787 | * div is 17 bits:- | ||
788 | * 0-13 (fractional part) | ||
789 | * 14-16 (integer part) | ||
790 | * To calculate Fout we left shift val by 14 bits and divide Fin by | ||
791 | * complete div (including fractional part) and then right shift the | ||
792 | * result by 14 places. | ||
793 | */ | ||
794 | unsigned long clcd_calc_rate(struct clk *clk, int index) | ||
795 | { | ||
796 | unsigned long rate = clk->pclk->rate; | ||
797 | struct clcd_rate_tbl *tbls = clk->rate_config.tbls; | ||
798 | |||
799 | rate /= 1000; | ||
800 | rate <<= 12; | ||
801 | rate /= (2 * tbls[index].div); | ||
802 | rate >>= 12; | ||
803 | rate *= 1000; | ||
804 | |||
805 | return rate; | ||
806 | } | ||
807 | |||
808 | /* | ||
809 | * calculates current programmed rate of clcd synthesizer | ||
810 | * Fout from synthesizer can be given from below equation: | ||
811 | * Fout= Fin/2*div (division factor) | ||
812 | * div is 17 bits:- | ||
813 | * 0-13 (fractional part) | ||
814 | * 14-16 (integer part) | ||
815 | * To calculate Fout we left shift val by 14 bits and divide Fin by | ||
816 | * complete div (including fractional part) and then right shift the | ||
817 | * result by 14 places. | ||
818 | */ | ||
819 | int clcd_clk_recalc(struct clk *clk) | ||
820 | { | ||
821 | struct clcd_clk_config *config = clk->private_data; | ||
822 | unsigned int div = 1; | ||
823 | unsigned long prate; | ||
824 | unsigned int val; | ||
825 | |||
826 | val = readl(config->synth_reg); | ||
827 | div = (val >> config->masks->div_factor_shift) & | ||
828 | config->masks->div_factor_mask; | ||
829 | |||
830 | if (!div) | ||
831 | return -EINVAL; | ||
832 | |||
833 | prate = clk->pclk->rate / 1000; /* first level division, make it KHz */ | ||
834 | |||
835 | clk->rate = (((unsigned long)prate << 12) / (2 * div)) >> 12; | ||
836 | clk->rate *= 1000; | ||
837 | return 0; | ||
838 | } | ||
839 | |||
840 | /* Configures new clock rate of auxiliary synthesizers used by: UART, FIRDA*/ | ||
841 | int clcd_clk_set_rate(struct clk *clk, unsigned long desired_rate) | ||
842 | { | ||
843 | struct clcd_rate_tbl *tbls = clk->rate_config.tbls; | ||
844 | struct clcd_clk_config *config = clk->private_data; | ||
845 | unsigned long val, rate; | ||
846 | int i; | ||
847 | |||
848 | i = round_rate_index(clk, desired_rate, &rate); | ||
849 | if (i < 0) | ||
850 | return i; | ||
851 | |||
852 | val = readl(config->synth_reg) & ~(config->masks->div_factor_mask << | ||
853 | config->masks->div_factor_shift); | ||
854 | val |= (tbls[i].div & config->masks->div_factor_mask) << | ||
855 | config->masks->div_factor_shift; | ||
856 | writel(val, config->synth_reg); | ||
857 | |||
858 | clk->rate = rate; | ||
859 | |||
860 | return 0; | ||
861 | } | ||
862 | |||
863 | /* | ||
864 | * Used for clocks that always have value as the parent clock divided by a | ||
415 | * fixed divisor | 865 | * fixed divisor |
416 | */ | 866 | */ |
417 | void follow_parent(struct clk *clk) | 867 | int follow_parent(struct clk *clk) |
418 | { | 868 | { |
419 | unsigned long flags; | 869 | unsigned int div_factor = (clk->div_factor < 1) ? 1 : clk->div_factor; |
420 | 870 | ||
421 | spin_lock_irqsave(&clocks_lock, flags); | 871 | clk->rate = clk->pclk->rate/div_factor; |
422 | clk->rate = clk->pclk->rate; | 872 | return 0; |
423 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
424 | } | 873 | } |
425 | 874 | ||
426 | /** | 875 | /** |
@@ -431,5 +880,124 @@ void follow_parent(struct clk *clk) | |||
431 | */ | 880 | */ |
432 | void recalc_root_clocks(void) | 881 | void recalc_root_clocks(void) |
433 | { | 882 | { |
434 | propagate_rate(&root_clks); | 883 | struct clk *pclk; |
884 | unsigned long flags; | ||
885 | int ret = 0; | ||
886 | |||
887 | spin_lock_irqsave(&clocks_lock, flags); | ||
888 | list_for_each_entry(pclk, &root_clks, sibling) { | ||
889 | if (pclk->recalc) { | ||
890 | ret = pclk->recalc(pclk); | ||
891 | /* | ||
892 | * recalc will return error if clk out is not programmed | ||
893 | * In this case configure default clock. | ||
894 | */ | ||
895 | if (ret && pclk->set_rate) | ||
896 | pclk->set_rate(pclk, 0); | ||
897 | } | ||
898 | propagate_rate(pclk, 1); | ||
899 | /* Enable clks enabled on init, in software view */ | ||
900 | if (pclk->flags & ENABLED_ON_INIT) | ||
901 | do_clk_enable(pclk); | ||
902 | } | ||
903 | spin_unlock_irqrestore(&clocks_lock, flags); | ||
904 | } | ||
905 | |||
906 | #ifdef CONFIG_DEBUG_FS | ||
907 | /* | ||
908 | * debugfs support to trace clock tree hierarchy and attributes | ||
909 | */ | ||
910 | static struct dentry *clk_debugfs_root; | ||
911 | static int clk_debugfs_register_one(struct clk *c) | ||
912 | { | ||
913 | int err; | ||
914 | struct dentry *d, *child; | ||
915 | struct clk *pa = c->pclk; | ||
916 | char s[255]; | ||
917 | char *p = s; | ||
918 | |||
919 | if (c) { | ||
920 | if (c->cl->con_id) | ||
921 | p += sprintf(p, "%s", c->cl->con_id); | ||
922 | if (c->cl->dev_id) | ||
923 | p += sprintf(p, "%s", c->cl->dev_id); | ||
924 | } | ||
925 | d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root); | ||
926 | if (!d) | ||
927 | return -ENOMEM; | ||
928 | c->dent = d; | ||
929 | |||
930 | d = debugfs_create_u32("usage_count", S_IRUGO, c->dent, | ||
931 | (u32 *)&c->usage_count); | ||
932 | if (!d) { | ||
933 | err = -ENOMEM; | ||
934 | goto err_out; | ||
935 | } | ||
936 | d = debugfs_create_u32("rate", S_IRUGO, c->dent, (u32 *)&c->rate); | ||
937 | if (!d) { | ||
938 | err = -ENOMEM; | ||
939 | goto err_out; | ||
940 | } | ||
941 | d = debugfs_create_x32("flags", S_IRUGO, c->dent, (u32 *)&c->flags); | ||
942 | if (!d) { | ||
943 | err = -ENOMEM; | ||
944 | goto err_out; | ||
945 | } | ||
946 | return 0; | ||
947 | |||
948 | err_out: | ||
949 | d = c->dent; | ||
950 | list_for_each_entry(child, &d->d_subdirs, d_u.d_child) | ||
951 | debugfs_remove(child); | ||
952 | debugfs_remove(c->dent); | ||
953 | return err; | ||
954 | } | ||
955 | |||
956 | static int clk_debugfs_register(struct clk *c) | ||
957 | { | ||
958 | int err; | ||
959 | struct clk *pa = c->pclk; | ||
960 | |||
961 | if (pa && !pa->dent) { | ||
962 | err = clk_debugfs_register(pa); | ||
963 | if (err) | ||
964 | return err; | ||
965 | } | ||
966 | |||
967 | if (!c->dent) { | ||
968 | err = clk_debugfs_register_one(c); | ||
969 | if (err) | ||
970 | return err; | ||
971 | } | ||
972 | return 0; | ||
973 | } | ||
974 | |||
975 | static int __init clk_debugfs_init(void) | ||
976 | { | ||
977 | struct clk *c; | ||
978 | struct dentry *d; | ||
979 | int err; | ||
980 | |||
981 | d = debugfs_create_dir("clock", NULL); | ||
982 | if (!d) | ||
983 | return -ENOMEM; | ||
984 | clk_debugfs_root = d; | ||
985 | |||
986 | list_for_each_entry(c, &clocks, node) { | ||
987 | err = clk_debugfs_register(c); | ||
988 | if (err) | ||
989 | goto err_out; | ||
990 | } | ||
991 | return 0; | ||
992 | err_out: | ||
993 | debugfs_remove_recursive(clk_debugfs_root); | ||
994 | return err; | ||
995 | } | ||
996 | late_initcall(clk_debugfs_init); | ||
997 | |||
998 | static int clk_debugfs_reparent(struct clk *c) | ||
999 | { | ||
1000 | debugfs_remove(c->dent); | ||
1001 | return clk_debugfs_register_one(c); | ||
435 | } | 1002 | } |
1003 | #endif /* CONFIG_DEBUG_FS */ | ||
diff --git a/arch/arm/plat-spear/include/plat/clock.h b/arch/arm/plat-spear/include/plat/clock.h index 2572260f990f..2ae6606930a6 100644 --- a/arch/arm/plat-spear/include/plat/clock.h +++ b/arch/arm/plat-spear/include/plat/clock.h | |||
@@ -21,6 +21,7 @@ | |||
21 | /* clk structure flags */ | 21 | /* clk structure flags */ |
22 | #define ALWAYS_ENABLED (1 << 0) /* clock always enabled */ | 22 | #define ALWAYS_ENABLED (1 << 0) /* clock always enabled */ |
23 | #define RESET_TO_ENABLE (1 << 1) /* reset register bit to enable clk */ | 23 | #define RESET_TO_ENABLE (1 << 1) /* reset register bit to enable clk */ |
24 | #define ENABLED_ON_INIT (1 << 2) /* clocks enabled at init */ | ||
24 | 25 | ||
25 | /** | 26 | /** |
26 | * struct clkops - clock operations | 27 | * struct clkops - clock operations |
@@ -35,13 +36,11 @@ struct clkops { | |||
35 | /** | 36 | /** |
36 | * struct pclk_info - parents info | 37 | * struct pclk_info - parents info |
37 | * @pclk: pointer to parent clk | 38 | * @pclk: pointer to parent clk |
38 | * @pclk_mask: value to be written for selecting this parent | 39 | * @pclk_val: value to be written for selecting this parent |
39 | * @scalable: Is parent scalable (1 - YES, 0 - NO) | ||
40 | */ | 40 | */ |
41 | struct pclk_info { | 41 | struct pclk_info { |
42 | struct clk *pclk; | 42 | struct clk *pclk; |
43 | u8 pclk_mask; | 43 | u8 pclk_val; |
44 | u8 scalable; | ||
45 | }; | 44 | }; |
46 | 45 | ||
47 | /** | 46 | /** |
@@ -54,11 +53,23 @@ struct pclk_info { | |||
54 | struct pclk_sel { | 53 | struct pclk_sel { |
55 | struct pclk_info *pclk_info; | 54 | struct pclk_info *pclk_info; |
56 | u8 pclk_count; | 55 | u8 pclk_count; |
57 | unsigned int *pclk_sel_reg; | 56 | void __iomem *pclk_sel_reg; |
58 | unsigned int pclk_sel_mask; | 57 | unsigned int pclk_sel_mask; |
59 | }; | 58 | }; |
60 | 59 | ||
61 | /** | 60 | /** |
61 | * struct rate_config - clk rate configurations | ||
62 | * @tbls: array of device specific clk rate tables, in ascending order of rates | ||
63 | * @count: size of tbls array | ||
64 | * @default_index: default setting when originally disabled | ||
65 | */ | ||
66 | struct rate_config { | ||
67 | void *tbls; | ||
68 | u8 count; | ||
69 | u8 default_index; | ||
70 | }; | ||
71 | |||
72 | /** | ||
62 | * struct clk - clock structure | 73 | * struct clk - clock structure |
63 | * @usage_count: num of users who enabled this clock | 74 | * @usage_count: num of users who enabled this clock |
64 | * @flags: flags for clock properties | 75 | * @flags: flags for clock properties |
@@ -67,21 +78,32 @@ struct pclk_sel { | |||
67 | * @en_reg_bit: clk enable/disable bit | 78 | * @en_reg_bit: clk enable/disable bit |
68 | * @ops: clk enable/disable ops - generic_clkops selected if NULL | 79 | * @ops: clk enable/disable ops - generic_clkops selected if NULL |
69 | * @recalc: pointer to clock rate recalculate function | 80 | * @recalc: pointer to clock rate recalculate function |
81 | * @set_rate: pointer to clock set rate function | ||
82 | * @calc_rate: pointer to clock get rate function for index | ||
83 | * @rate_config: rate configuration information, used by set_rate | ||
84 | * @div_factor: division factor to parent clock. | ||
70 | * @pclk: current parent clk | 85 | * @pclk: current parent clk |
71 | * @pclk_sel: pointer to parent selection structure | 86 | * @pclk_sel: pointer to parent selection structure |
72 | * @pclk_sel_shift: register shift for selecting parent of this clock | 87 | * @pclk_sel_shift: register shift for selecting parent of this clock |
73 | * @children: list for childrens or this clock | 88 | * @children: list for childrens or this clock |
74 | * @sibling: node for list of clocks having same parents | 89 | * @sibling: node for list of clocks having same parents |
75 | * @private_data: clock specific private data | 90 | * @private_data: clock specific private data |
91 | * @node: list to maintain clocks linearly | ||
92 | * @cl: clocklook up assoicated with this clock | ||
93 | * @dent: object for debugfs | ||
76 | */ | 94 | */ |
77 | struct clk { | 95 | struct clk { |
78 | unsigned int usage_count; | 96 | unsigned int usage_count; |
79 | unsigned int flags; | 97 | unsigned int flags; |
80 | unsigned long rate; | 98 | unsigned long rate; |
81 | unsigned int *en_reg; | 99 | void __iomem *en_reg; |
82 | u8 en_reg_bit; | 100 | u8 en_reg_bit; |
83 | const struct clkops *ops; | 101 | const struct clkops *ops; |
84 | void (*recalc) (struct clk *); | 102 | int (*recalc) (struct clk *); |
103 | int (*set_rate) (struct clk *, unsigned long rate); | ||
104 | unsigned long (*calc_rate)(struct clk *, int index); | ||
105 | struct rate_config rate_config; | ||
106 | unsigned int div_factor; | ||
85 | 107 | ||
86 | struct clk *pclk; | 108 | struct clk *pclk; |
87 | struct pclk_sel *pclk_sel; | 109 | struct pclk_sel *pclk_sel; |
@@ -90,37 +112,137 @@ struct clk { | |||
90 | struct list_head children; | 112 | struct list_head children; |
91 | struct list_head sibling; | 113 | struct list_head sibling; |
92 | void *private_data; | 114 | void *private_data; |
115 | #ifdef CONFIG_DEBUG_FS | ||
116 | struct list_head node; | ||
117 | struct clk_lookup *cl; | ||
118 | struct dentry *dent; | ||
119 | #endif | ||
93 | }; | 120 | }; |
94 | 121 | ||
95 | /* pll configuration structure */ | 122 | /* pll configuration structure */ |
123 | struct pll_clk_masks { | ||
124 | u32 mode_mask; | ||
125 | u32 mode_shift; | ||
126 | |||
127 | u32 norm_fdbk_m_mask; | ||
128 | u32 norm_fdbk_m_shift; | ||
129 | u32 dith_fdbk_m_mask; | ||
130 | u32 dith_fdbk_m_shift; | ||
131 | u32 div_p_mask; | ||
132 | u32 div_p_shift; | ||
133 | u32 div_n_mask; | ||
134 | u32 div_n_shift; | ||
135 | }; | ||
136 | |||
96 | struct pll_clk_config { | 137 | struct pll_clk_config { |
97 | unsigned int *mode_reg; | 138 | void __iomem *mode_reg; |
98 | unsigned int *cfg_reg; | 139 | void __iomem *cfg_reg; |
140 | struct pll_clk_masks *masks; | ||
141 | }; | ||
142 | |||
143 | /* pll clk rate config structure */ | ||
144 | struct pll_rate_tbl { | ||
145 | u8 mode; | ||
146 | u16 m; | ||
147 | u8 n; | ||
148 | u8 p; | ||
99 | }; | 149 | }; |
100 | 150 | ||
101 | /* ahb and apb bus configuration structure */ | 151 | /* ahb and apb bus configuration structure */ |
152 | struct bus_clk_masks { | ||
153 | u32 mask; | ||
154 | u32 shift; | ||
155 | }; | ||
156 | |||
102 | struct bus_clk_config { | 157 | struct bus_clk_config { |
103 | unsigned int *reg; | 158 | void __iomem *reg; |
104 | unsigned int mask; | 159 | struct bus_clk_masks *masks; |
105 | unsigned int shift; | 160 | }; |
161 | |||
162 | /* ahb and apb clk bus rate config structure */ | ||
163 | struct bus_rate_tbl { | ||
164 | u8 div; | ||
165 | }; | ||
166 | |||
167 | /* Aux clk configuration structure: applicable to UART and FIRDA */ | ||
168 | struct aux_clk_masks { | ||
169 | u32 eq_sel_mask; | ||
170 | u32 eq_sel_shift; | ||
171 | u32 eq1_mask; | ||
172 | u32 eq2_mask; | ||
173 | u32 xscale_sel_mask; | ||
174 | u32 xscale_sel_shift; | ||
175 | u32 yscale_sel_mask; | ||
176 | u32 yscale_sel_shift; | ||
106 | }; | 177 | }; |
107 | 178 | ||
108 | /* | ||
109 | * Aux clk configuration structure: applicable to GPT, UART and FIRDA | ||
110 | */ | ||
111 | struct aux_clk_config { | 179 | struct aux_clk_config { |
112 | unsigned int *synth_reg; | 180 | void __iomem *synth_reg; |
181 | struct aux_clk_masks *masks; | ||
182 | }; | ||
183 | |||
184 | /* aux clk rate config structure */ | ||
185 | struct aux_rate_tbl { | ||
186 | u16 xscale; | ||
187 | u16 yscale; | ||
188 | u8 eq; | ||
189 | }; | ||
190 | |||
191 | /* GPT clk configuration structure */ | ||
192 | struct gpt_clk_masks { | ||
193 | u32 mscale_sel_mask; | ||
194 | u32 mscale_sel_shift; | ||
195 | u32 nscale_sel_mask; | ||
196 | u32 nscale_sel_shift; | ||
197 | }; | ||
198 | |||
199 | struct gpt_clk_config { | ||
200 | void __iomem *synth_reg; | ||
201 | struct gpt_clk_masks *masks; | ||
202 | }; | ||
203 | |||
204 | /* gpt clk rate config structure */ | ||
205 | struct gpt_rate_tbl { | ||
206 | u16 mscale; | ||
207 | u16 nscale; | ||
208 | }; | ||
209 | |||
210 | /* clcd clk configuration structure */ | ||
211 | struct clcd_synth_masks { | ||
212 | u32 div_factor_mask; | ||
213 | u32 div_factor_shift; | ||
214 | }; | ||
215 | |||
216 | struct clcd_clk_config { | ||
217 | void __iomem *synth_reg; | ||
218 | struct clcd_synth_masks *masks; | ||
219 | }; | ||
220 | |||
221 | /* clcd clk rate config structure */ | ||
222 | struct clcd_rate_tbl { | ||
223 | u16 div; | ||
113 | }; | 224 | }; |
114 | 225 | ||
115 | /* platform specific clock functions */ | 226 | /* platform specific clock functions */ |
116 | void clk_register(struct clk_lookup *cl); | 227 | void clk_register(struct clk_lookup *cl); |
117 | void recalc_root_clocks(void); | 228 | void recalc_root_clocks(void); |
118 | 229 | ||
119 | /* clock recalc functions */ | 230 | /* clock recalc & set rate functions */ |
120 | void follow_parent(struct clk *clk); | 231 | int follow_parent(struct clk *clk); |
121 | void pll1_clk_recalc(struct clk *clk); | 232 | unsigned long pll_calc_rate(struct clk *clk, int index); |
122 | void bus_clk_recalc(struct clk *clk); | 233 | int pll_clk_recalc(struct clk *clk); |
123 | void gpt_clk_recalc(struct clk *clk); | 234 | int pll_clk_set_rate(struct clk *clk, unsigned long desired_rate); |
124 | void aux_clk_recalc(struct clk *clk); | 235 | unsigned long bus_calc_rate(struct clk *clk, int index); |
236 | int bus_clk_recalc(struct clk *clk); | ||
237 | int bus_clk_set_rate(struct clk *clk, unsigned long desired_rate); | ||
238 | unsigned long gpt_calc_rate(struct clk *clk, int index); | ||
239 | int gpt_clk_recalc(struct clk *clk); | ||
240 | int gpt_clk_set_rate(struct clk *clk, unsigned long desired_rate); | ||
241 | unsigned long aux_calc_rate(struct clk *clk, int index); | ||
242 | int aux_clk_recalc(struct clk *clk); | ||
243 | int aux_clk_set_rate(struct clk *clk, unsigned long desired_rate); | ||
244 | unsigned long clcd_calc_rate(struct clk *clk, int index); | ||
245 | int clcd_clk_recalc(struct clk *clk); | ||
246 | int clcd_clk_set_rate(struct clk *clk, unsigned long desired_rate); | ||
125 | 247 | ||
126 | #endif /* __PLAT_CLOCK_H */ | 248 | #endif /* __PLAT_CLOCK_H */ |
diff --git a/arch/arm/plat-spear/include/plat/debug-macro.S b/arch/arm/plat-spear/include/plat/debug-macro.S index e91270e4f640..8501bbf2c092 100644 --- a/arch/arm/plat-spear/include/plat/debug-macro.S +++ b/arch/arm/plat-spear/include/plat/debug-macro.S | |||
@@ -12,7 +12,7 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/amba/serial.h> | 14 | #include <linux/amba/serial.h> |
15 | #include <mach/spear.h> | 15 | #include <mach/hardware.h> |
16 | 16 | ||
17 | .macro addruart, rp, rv | 17 | .macro addruart, rp, rv |
18 | mov \rp, #SPEAR_DBG_UART_BASE @ Physical base | 18 | mov \rp, #SPEAR_DBG_UART_BASE @ Physical base |
diff --git a/arch/arm/plat-spear/include/plat/hardware.h b/arch/arm/plat-spear/include/plat/hardware.h new file mode 100644 index 000000000000..66d677225d15 --- /dev/null +++ b/arch/arm/plat-spear/include/plat/hardware.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-spear/include/plat/hardware.h | ||
3 | * | ||
4 | * Hardware definitions for SPEAr | ||
5 | * | ||
6 | * Copyright (C) 2010 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.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 | |||
14 | #ifndef __PLAT_HARDWARE_H | ||
15 | #define __PLAT_HARDWARE_H | ||
16 | |||
17 | #ifndef __ASSEMBLY__ | ||
18 | #define IOMEM(x) ((void __iomem __force *)(x)) | ||
19 | #else | ||
20 | #define IOMEM(x) (x) | ||
21 | #endif | ||
22 | |||
23 | #endif /* __PLAT_HARDWARE_H */ | ||
diff --git a/arch/arm/plat-spear/include/plat/memory.h b/arch/arm/plat-spear/include/plat/memory.h index 27a4aba77343..7e3599e1104e 100644 --- a/arch/arm/plat-spear/include/plat/memory.h +++ b/arch/arm/plat-spear/include/plat/memory.h | |||
@@ -15,6 +15,6 @@ | |||
15 | #define __PLAT_MEMORY_H | 15 | #define __PLAT_MEMORY_H |
16 | 16 | ||
17 | /* Physical DRAM offset */ | 17 | /* Physical DRAM offset */ |
18 | #define PHYS_OFFSET UL(0x00000000) | 18 | #define PLAT_PHYS_OFFSET UL(0x00000000) |
19 | 19 | ||
20 | #endif /* __PLAT_MEMORY_H */ | 20 | #endif /* __PLAT_MEMORY_H */ |
diff --git a/arch/arm/plat-spear/include/plat/system.h b/arch/arm/plat-spear/include/plat/system.h index 55a4e405d578..a235fa0ca777 100644 --- a/arch/arm/plat-spear/include/plat/system.h +++ b/arch/arm/plat-spear/include/plat/system.h | |||
@@ -14,9 +14,9 @@ | |||
14 | #ifndef __PLAT_SYSTEM_H | 14 | #ifndef __PLAT_SYSTEM_H |
15 | #define __PLAT_SYSTEM_H | 15 | #define __PLAT_SYSTEM_H |
16 | 16 | ||
17 | #include <asm/hardware/sp810.h> | ||
18 | #include <linux/io.h> | 17 | #include <linux/io.h> |
19 | #include <mach/spear.h> | 18 | #include <asm/hardware/sp810.h> |
19 | #include <mach/hardware.h> | ||
20 | 20 | ||
21 | static inline void arch_idle(void) | 21 | static inline void arch_idle(void) |
22 | { | 22 | { |
diff --git a/arch/arm/plat-spear/include/plat/uncompress.h b/arch/arm/plat-spear/include/plat/uncompress.h index 6dd455bafdfd..1bf84527aee4 100644 --- a/arch/arm/plat-spear/include/plat/uncompress.h +++ b/arch/arm/plat-spear/include/plat/uncompress.h | |||
@@ -13,7 +13,7 @@ | |||
13 | 13 | ||
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | #include <linux/amba/serial.h> | 15 | #include <linux/amba/serial.h> |
16 | #include <mach/spear.h> | 16 | #include <mach/hardware.h> |
17 | 17 | ||
18 | #ifndef __PLAT_UNCOMPRESS_H | 18 | #ifndef __PLAT_UNCOMPRESS_H |
19 | #define __PLAT_UNCOMPRESS_H | 19 | #define __PLAT_UNCOMPRESS_H |
diff --git a/arch/arm/plat-spear/time.c b/arch/arm/plat-spear/time.c index 839c88df9994..dbb6e4fff79d 100644 --- a/arch/arm/plat-spear/time.c +++ b/arch/arm/plat-spear/time.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/arm/plat-spear/time.c | 2 | * arch/arm/plat-spear/time.c |
3 | * | 3 | * |
4 | * Copyright (C) 2009 ST Microelectronics | 4 | * Copyright (C) 2010 ST Microelectronics |
5 | * Shiraz Hashim<shiraz.hashim@st.com> | 5 | * Shiraz Hashim<shiraz.hashim@st.com> |
6 | * | 6 | * |
7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
@@ -20,10 +20,9 @@ | |||
20 | #include <linux/time.h> | 20 | #include <linux/time.h> |
21 | #include <linux/irq.h> | 21 | #include <linux/irq.h> |
22 | #include <asm/mach/time.h> | 22 | #include <asm/mach/time.h> |
23 | #include <mach/irqs.h> | ||
24 | #include <mach/hardware.h> | ||
25 | #include <mach/spear.h> | ||
26 | #include <mach/generic.h> | 23 | #include <mach/generic.h> |
24 | #include <mach/hardware.h> | ||
25 | #include <mach/irqs.h> | ||
27 | 26 | ||
28 | /* | 27 | /* |
29 | * We would use TIMER0 and TIMER1 as clockevent and clocksource. | 28 | * We would use TIMER0 and TIMER1 as clockevent and clocksource. |
@@ -211,7 +210,7 @@ static void __init spear_clockevent_init(void) | |||
211 | 210 | ||
212 | void __init spear_setup_timer(void) | 211 | void __init spear_setup_timer(void) |
213 | { | 212 | { |
214 | struct clk *pll3_clk; | 213 | int ret; |
215 | 214 | ||
216 | if (!request_mem_region(SPEAR_GPT0_BASE, SZ_1K, "gpt0")) { | 215 | if (!request_mem_region(SPEAR_GPT0_BASE, SZ_1K, "gpt0")) { |
217 | pr_err("%s:cannot get IO addr\n", __func__); | 216 | pr_err("%s:cannot get IO addr\n", __func__); |
@@ -230,26 +229,21 @@ void __init spear_setup_timer(void) | |||
230 | goto err_iomap; | 229 | goto err_iomap; |
231 | } | 230 | } |
232 | 231 | ||
233 | pll3_clk = clk_get(NULL, "pll3_48m_clk"); | 232 | ret = clk_enable(gpt_clk); |
234 | if (!pll3_clk) { | 233 | if (ret < 0) { |
235 | pr_err("%s:couldn't get PLL3 as parent for gpt\n", __func__); | 234 | pr_err("%s:couldn't enable gpt clock\n", __func__); |
236 | goto err_iomap; | 235 | goto err_clk; |
237 | } | 236 | } |
238 | 237 | ||
239 | clk_set_parent(gpt_clk, pll3_clk); | ||
240 | |||
241 | spear_clockevent_init(); | 238 | spear_clockevent_init(); |
242 | spear_clocksource_init(); | 239 | spear_clocksource_init(); |
243 | 240 | ||
244 | return; | 241 | return; |
245 | 242 | ||
243 | err_clk: | ||
244 | clk_put(gpt_clk); | ||
246 | err_iomap: | 245 | err_iomap: |
247 | iounmap(gpt_base); | 246 | iounmap(gpt_base); |
248 | |||
249 | err_mem: | 247 | err_mem: |
250 | release_mem_region(SPEAR_GPT0_BASE, SZ_1K); | 248 | release_mem_region(SPEAR_GPT0_BASE, SZ_1K); |
251 | } | 249 | } |
252 | |||
253 | struct sys_timer spear_sys_timer = { | ||
254 | .init = spear_setup_timer, | ||
255 | }; | ||
diff --git a/arch/arm/plat-stmp3xxx/include/mach/memory.h b/arch/arm/plat-stmp3xxx/include/mach/memory.h index 7b875a07a1a7..61fa54882e12 100644 --- a/arch/arm/plat-stmp3xxx/include/mach/memory.h +++ b/arch/arm/plat-stmp3xxx/include/mach/memory.h | |||
@@ -17,6 +17,6 @@ | |||
17 | /* | 17 | /* |
18 | * Physical DRAM offset. | 18 | * Physical DRAM offset. |
19 | */ | 19 | */ |
20 | #define PHYS_OFFSET UL(0x40000000) | 20 | #define PLAT_PHYS_OFFSET UL(0x40000000) |
21 | 21 | ||
22 | #endif | 22 | #endif |
diff --git a/arch/arm/plat-tcc/include/mach/memory.h b/arch/arm/plat-tcc/include/mach/memory.h index cd91ba8a670b..28a6e0cd13b3 100644 --- a/arch/arm/plat-tcc/include/mach/memory.h +++ b/arch/arm/plat-tcc/include/mach/memory.h | |||
@@ -13,6 +13,6 @@ | |||
13 | /* | 13 | /* |
14 | * Physical DRAM offset. | 14 | * Physical DRAM offset. |
15 | */ | 15 | */ |
16 | #define PHYS_OFFSET UL(0x20000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x20000000) |
17 | 17 | ||
18 | #endif | 18 | #endif |
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index 0797cb528b46..bbf3da012afd 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c | |||
@@ -153,7 +153,7 @@ static struct notifier_block vfp_notifier_block = { | |||
153 | * Raise a SIGFPE for the current process. | 153 | * Raise a SIGFPE for the current process. |
154 | * sicode describes the signal being raised. | 154 | * sicode describes the signal being raised. |
155 | */ | 155 | */ |
156 | void vfp_raise_sigfpe(unsigned int sicode, struct pt_regs *regs) | 156 | static void vfp_raise_sigfpe(unsigned int sicode, struct pt_regs *regs) |
157 | { | 157 | { |
158 | siginfo_t info; | 158 | siginfo_t info; |
159 | 159 | ||
@@ -489,8 +489,11 @@ void vfp_flush_hwstate(struct thread_info *thread) | |||
489 | 489 | ||
490 | /* | 490 | /* |
491 | * VFP hardware can lose all context when a CPU goes offline. | 491 | * VFP hardware can lose all context when a CPU goes offline. |
492 | * Safely clear our held state when a CPU has been killed, and | 492 | * As we will be running in SMP mode with CPU hotplug, we will save the |
493 | * re-enable access to VFP when the CPU comes back online. | 493 | * hardware state at every thread switch. We clear our held state when |
494 | * a CPU has been killed, indicating that the VFP hardware doesn't contain | ||
495 | * a threads VFP state. When a CPU starts up, we re-enable access to the | ||
496 | * VFP hardware. | ||
494 | * | 497 | * |
495 | * Both CPU_DYING and CPU_STARTING are called on the CPU which | 498 | * Both CPU_DYING and CPU_STARTING are called on the CPU which |
496 | * is being offlined/onlined. | 499 | * is being offlined/onlined. |