aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2012-05-21 10:15:24 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-05-21 10:15:24 -0400
commit4175160b065e74572819a320dcd34129224a4e1c (patch)
tree3298e2c9a7c7db33bf28617875e5429e17eec61c
parentddf90a2ff2c4a9da99acc898a4afeab3e4251fcd (diff)
parent0ec8e7aa8f63f0cacd545fcd7f40f93fde2c0e6e (diff)
Merge branch 'misc' into for-linus
Conflicts: arch/arm/kernel/ptrace.c
-rw-r--r--arch/arm/Kconfig15
-rw-r--r--arch/arm/boot/compressed/head.S29
-rw-r--r--arch/arm/common/vic.c56
-rw-r--r--arch/arm/include/asm/cacheflush.h6
-rw-r--r--arch/arm/include/asm/cmpxchg.h73
-rw-r--r--arch/arm/include/asm/mach/time.h5
-rw-r--r--arch/arm/include/asm/pgtable-3level.h2
-rw-r--r--arch/arm/include/asm/ptrace.h5
-rw-r--r--arch/arm/include/asm/syscall.h93
-rw-r--r--arch/arm/kernel/head.S9
-rw-r--r--arch/arm/kernel/ptrace.c21
-rw-r--r--arch/arm/kernel/signal.c2
-rw-r--r--arch/arm/kernel/smp_scu.c3
-rw-r--r--arch/arm/kernel/thumbee.c4
-rw-r--r--arch/arm/kernel/time.c36
-rw-r--r--arch/arm/kernel/traps.c11
-rw-r--r--arch/arm/mach-tegra/timer.c5
-rw-r--r--arch/arm/mm/cache-v3.S1
-rw-r--r--arch/arm/mm/cache-v4.S1
-rw-r--r--arch/arm/mm/cache-v4wb.S6
-rw-r--r--arch/arm/mm/cache-v4wt.S1
-rw-r--r--arch/arm/mm/cache-v6.S10
-rw-r--r--arch/arm/mm/cache-v7.S10
-rw-r--r--arch/arm/mm/proc-arm1020.S1
-rw-r--r--arch/arm/mm/proc-arm1020e.S1
-rw-r--r--arch/arm/mm/proc-arm1022.S1
-rw-r--r--arch/arm/mm/proc-arm1026.S1
-rw-r--r--arch/arm/mm/proc-arm920.S1
-rw-r--r--arch/arm/mm/proc-arm922.S1
-rw-r--r--arch/arm/mm/proc-arm925.S1
-rw-r--r--arch/arm/mm/proc-arm926.S1
-rw-r--r--arch/arm/mm/proc-arm940.S6
-rw-r--r--arch/arm/mm/proc-arm946.S1
-rw-r--r--arch/arm/mm/proc-feroceon.S1
-rw-r--r--arch/arm/mm/proc-mohawk.S1
-rw-r--r--arch/arm/plat-omap/counter_32k.c6
-rw-r--r--arch/arm/vfp/vfpmodule.c16
37 files changed, 269 insertions, 174 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index ed244933b256..ea2b43c52a50 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -11,6 +11,7 @@ config ARM
11 select HAVE_OPROFILE if (HAVE_PERF_EVENTS) 11 select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
12 select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL 12 select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL
13 select HAVE_ARCH_KGDB 13 select HAVE_ARCH_KGDB
14 select HAVE_ARCH_TRACEHOOK
14 select HAVE_KPROBES if !XIP_KERNEL 15 select HAVE_KPROBES if !XIP_KERNEL
15 select HAVE_KRETPROBES if (HAVE_KPROBES) 16 select HAVE_KRETPROBES if (HAVE_KPROBES)
16 select HAVE_FUNCTION_TRACER if (!XIP_KERNEL) 17 select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
@@ -30,6 +31,8 @@ config ARM
30 select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7)) 31 select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7))
31 select HAVE_C_RECORDMCOUNT 32 select HAVE_C_RECORDMCOUNT
32 select HAVE_GENERIC_HARDIRQS 33 select HAVE_GENERIC_HARDIRQS
34 select HARDIRQS_SW_RESEND
35 select GENERIC_IRQ_PROBE
33 select GENERIC_IRQ_SHOW 36 select GENERIC_IRQ_SHOW
34 select CPU_PM if (SUSPEND || CPU_IDLE) 37 select CPU_PM if (SUSPEND || CPU_IDLE)
35 select GENERIC_PCI_IOMAP 38 select GENERIC_PCI_IOMAP
@@ -126,14 +129,6 @@ config TRACE_IRQFLAGS_SUPPORT
126 bool 129 bool
127 default y 130 default y
128 131
129config HARDIRQS_SW_RESEND
130 bool
131 default y
132
133config GENERIC_IRQ_PROBE
134 bool
135 default y
136
137config GENERIC_LOCKBREAK 132config GENERIC_LOCKBREAK
138 bool 133 bool
139 default y 134 default y
@@ -633,7 +628,6 @@ config ARCH_MMP
633 select CLKDEV_LOOKUP 628 select CLKDEV_LOOKUP
634 select GENERIC_CLOCKEVENTS 629 select GENERIC_CLOCKEVENTS
635 select GPIO_PXA 630 select GPIO_PXA
636 select TICK_ONESHOT
637 select PLAT_PXA 631 select PLAT_PXA
638 select SPARSE_IRQ 632 select SPARSE_IRQ
639 select GENERIC_ALLOCATOR 633 select GENERIC_ALLOCATOR
@@ -717,7 +711,6 @@ config ARCH_PXA
717 select ARCH_REQUIRE_GPIOLIB 711 select ARCH_REQUIRE_GPIOLIB
718 select GENERIC_CLOCKEVENTS 712 select GENERIC_CLOCKEVENTS
719 select GPIO_PXA 713 select GPIO_PXA
720 select TICK_ONESHOT
721 select PLAT_PXA 714 select PLAT_PXA
722 select SPARSE_IRQ 715 select SPARSE_IRQ
723 select AUTO_ZRELADDR 716 select AUTO_ZRELADDR
@@ -784,7 +777,6 @@ config ARCH_SA1100
784 select CPU_FREQ 777 select CPU_FREQ
785 select GENERIC_CLOCKEVENTS 778 select GENERIC_CLOCKEVENTS
786 select CLKDEV_LOOKUP 779 select CLKDEV_LOOKUP
787 select TICK_ONESHOT
788 select ARCH_REQUIRE_GPIOLIB 780 select ARCH_REQUIRE_GPIOLIB
789 select HAVE_IDE 781 select HAVE_IDE
790 select NEED_MACH_MEMORY_H 782 select NEED_MACH_MEMORY_H
@@ -1562,7 +1554,6 @@ config ARM_ARCH_TIMER
1562config HAVE_ARM_TWD 1554config HAVE_ARM_TWD
1563 bool 1555 bool
1564 depends on SMP 1556 depends on SMP
1565 select TICK_ONESHOT
1566 help 1557 help
1567 This options enables support for the ARM timer and watchdog unit 1558 This options enables support for the ARM timer and watchdog unit
1568 1559
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index dc7e8ce8e6be..5ad33a4df675 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -567,6 +567,12 @@ __armv3_mpu_cache_on:
567 mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 567 mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3
568 mov pc, lr 568 mov pc, lr
569 569
570#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
571#define CB_BITS 0x08
572#else
573#define CB_BITS 0x0c
574#endif
575
570__setup_mmu: sub r3, r4, #16384 @ Page directory size 576__setup_mmu: sub r3, r4, #16384 @ Page directory size
571 bic r3, r3, #0xff @ Align the pointer 577 bic r3, r3, #0xff @ Align the pointer
572 bic r3, r3, #0x3f00 578 bic r3, r3, #0x3f00
@@ -578,17 +584,14 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size
578 mov r9, r0, lsr #18 584 mov r9, r0, lsr #18
579 mov r9, r9, lsl #18 @ start of RAM 585 mov r9, r9, lsl #18 @ start of RAM
580 add r10, r9, #0x10000000 @ a reasonable RAM size 586 add r10, r9, #0x10000000 @ a reasonable RAM size
581 mov r1, #0x12 587 mov r1, #0x12 @ XN|U + section mapping
582 orr r1, r1, #3 << 10 588 orr r1, r1, #3 << 10 @ AP=11
583 add r2, r3, #16384 589 add r2, r3, #16384
5841: cmp r1, r9 @ if virt > start of RAM 5901: cmp r1, r9 @ if virt > start of RAM
585#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH 591 cmphs r10, r1 @ && end of RAM > virt
586 orrhs r1, r1, #0x08 @ set cacheable 592 bic r1, r1, #0x1c @ clear XN|U + C + B
587#else 593 orrlo r1, r1, #0x10 @ Set XN|U for non-RAM
588 orrhs r1, r1, #0x0c @ set cacheable, bufferable 594 orrhs r1, r1, r6 @ set RAM section settings
589#endif
590 cmp r1, r10 @ if virt > end of RAM
591 bichs r1, r1, #0x0c @ clear cacheable, bufferable
592 str r1, [r0], #4 @ 1:1 mapping 595 str r1, [r0], #4 @ 1:1 mapping
593 add r1, r1, #1048576 596 add r1, r1, #1048576
594 teq r0, r2 597 teq r0, r2
@@ -599,7 +602,7 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size
599 * so there is no map overlap problem for up to 1 MB compressed kernel. 602 * so there is no map overlap problem for up to 1 MB compressed kernel.
600 * If the execution is in RAM then we would only be duplicating the above. 603 * If the execution is in RAM then we would only be duplicating the above.
601 */ 604 */
602 mov r1, #0x1e 605 orr r1, r6, #0x04 @ ensure B is set for this
603 orr r1, r1, #3 << 10 606 orr r1, r1, #3 << 10
604 mov r2, pc 607 mov r2, pc
605 mov r2, r2, lsr #20 608 mov r2, r2, lsr #20
@@ -620,6 +623,7 @@ __arm926ejs_mmu_cache_on:
620__armv4_mmu_cache_on: 623__armv4_mmu_cache_on:
621 mov r12, lr 624 mov r12, lr
622#ifdef CONFIG_MMU 625#ifdef CONFIG_MMU
626 mov r6, #CB_BITS | 0x12 @ U
623 bl __setup_mmu 627 bl __setup_mmu
624 mov r0, #0 628 mov r0, #0
625 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer 629 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
@@ -641,6 +645,7 @@ __armv7_mmu_cache_on:
641#ifdef CONFIG_MMU 645#ifdef CONFIG_MMU
642 mrc p15, 0, r11, c0, c1, 4 @ read ID_MMFR0 646 mrc p15, 0, r11, c0, c1, 4 @ read ID_MMFR0
643 tst r11, #0xf @ VMSA 647 tst r11, #0xf @ VMSA
648 movne r6, #CB_BITS | 0x02 @ !XN
644 blne __setup_mmu 649 blne __setup_mmu
645 mov r0, #0 650 mov r0, #0
646 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer 651 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
@@ -655,7 +660,7 @@ __armv7_mmu_cache_on:
655 orr r0, r0, #1 << 25 @ big-endian page tables 660 orr r0, r0, #1 << 25 @ big-endian page tables
656#endif 661#endif
657 orrne r0, r0, #1 @ MMU enabled 662 orrne r0, r0, #1 @ MMU enabled
658 movne r1, #-1 663 movne r1, #0xfffffffd @ domain 0 = client
659 mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer 664 mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer
660 mcrne p15, 0, r1, c3, c0, 0 @ load domain access control 665 mcrne p15, 0, r1, c3, c0, 0 @ load domain access control
661#endif 666#endif
@@ -668,6 +673,7 @@ __armv7_mmu_cache_on:
668 673
669__fa526_cache_on: 674__fa526_cache_on:
670 mov r12, lr 675 mov r12, lr
676 mov r6, #CB_BITS | 0x12 @ U
671 bl __setup_mmu 677 bl __setup_mmu
672 mov r0, #0 678 mov r0, #0
673 mcr p15, 0, r0, c7, c7, 0 @ Invalidate whole cache 679 mcr p15, 0, r0, c7, c7, 0 @ Invalidate whole cache
@@ -682,6 +688,7 @@ __fa526_cache_on:
682 688
683__arm6_mmu_cache_on: 689__arm6_mmu_cache_on:
684 mov r12, lr 690 mov r12, lr
691 mov r6, #CB_BITS | 0x12 @ U
685 bl __setup_mmu 692 bl __setup_mmu
686 mov r0, #0 693 mov r0, #0
687 mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3 694 mcr p15, 0, r0, c7, c0, 0 @ invalidate whole cache v3
diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c
index 7e288f96cedf..e0d538803cc3 100644
--- a/arch/arm/common/vic.c
+++ b/arch/arm/common/vic.c
@@ -39,6 +39,7 @@
39 * struct vic_device - VIC PM device 39 * struct vic_device - VIC PM device
40 * @irq: The IRQ number for the base of the VIC. 40 * @irq: The IRQ number for the base of the VIC.
41 * @base: The register base for the VIC. 41 * @base: The register base for the VIC.
42 * @valid_sources: A bitmask of valid interrupts
42 * @resume_sources: A bitmask of interrupts for resume. 43 * @resume_sources: A bitmask of interrupts for resume.
43 * @resume_irqs: The IRQs enabled for resume. 44 * @resume_irqs: The IRQs enabled for resume.
44 * @int_select: Save for VIC_INT_SELECT. 45 * @int_select: Save for VIC_INT_SELECT.
@@ -50,6 +51,7 @@
50struct vic_device { 51struct vic_device {
51 void __iomem *base; 52 void __iomem *base;
52 int irq; 53 int irq;
54 u32 valid_sources;
53 u32 resume_sources; 55 u32 resume_sources;
54 u32 resume_irqs; 56 u32 resume_irqs;
55 u32 int_select; 57 u32 int_select;
@@ -164,10 +166,32 @@ static int __init vic_pm_init(void)
164late_initcall(vic_pm_init); 166late_initcall(vic_pm_init);
165#endif /* CONFIG_PM */ 167#endif /* CONFIG_PM */
166 168
169static struct irq_chip vic_chip;
170
171static int vic_irqdomain_map(struct irq_domain *d, unsigned int irq,
172 irq_hw_number_t hwirq)
173{
174 struct vic_device *v = d->host_data;
175
176 /* Skip invalid IRQs, only register handlers for the real ones */
177 if (!(v->valid_sources & (1 << hwirq)))
178 return -ENOTSUPP;
179 irq_set_chip_and_handler(irq, &vic_chip, handle_level_irq);
180 irq_set_chip_data(irq, v->base);
181 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
182 return 0;
183}
184
185static struct irq_domain_ops vic_irqdomain_ops = {
186 .map = vic_irqdomain_map,
187 .xlate = irq_domain_xlate_onetwocell,
188};
189
167/** 190/**
168 * vic_register() - Register a VIC. 191 * vic_register() - Register a VIC.
169 * @base: The base address of the VIC. 192 * @base: The base address of the VIC.
170 * @irq: The base IRQ for the VIC. 193 * @irq: The base IRQ for the VIC.
194 * @valid_sources: bitmask of valid interrupts
171 * @resume_sources: bitmask of interrupts allowed for resume sources. 195 * @resume_sources: bitmask of interrupts allowed for resume sources.
172 * @node: The device tree node associated with the VIC. 196 * @node: The device tree node associated with the VIC.
173 * 197 *
@@ -178,7 +202,8 @@ late_initcall(vic_pm_init);
178 * This also configures the IRQ domain for the VIC. 202 * This also configures the IRQ domain for the VIC.
179 */ 203 */
180static void __init vic_register(void __iomem *base, unsigned int irq, 204static void __init vic_register(void __iomem *base, unsigned int irq,
181 u32 resume_sources, struct device_node *node) 205 u32 valid_sources, u32 resume_sources,
206 struct device_node *node)
182{ 207{
183 struct vic_device *v; 208 struct vic_device *v;
184 209
@@ -189,11 +214,12 @@ static void __init vic_register(void __iomem *base, unsigned int irq,
189 214
190 v = &vic_devices[vic_id]; 215 v = &vic_devices[vic_id];
191 v->base = base; 216 v->base = base;
217 v->valid_sources = valid_sources;
192 v->resume_sources = resume_sources; 218 v->resume_sources = resume_sources;
193 v->irq = irq; 219 v->irq = irq;
194 vic_id++; 220 vic_id++;
195 v->domain = irq_domain_add_legacy(node, 32, irq, 0, 221 v->domain = irq_domain_add_legacy(node, fls(valid_sources), irq, 0,
196 &irq_domain_simple_ops, v); 222 &vic_irqdomain_ops, v);
197} 223}
198 224
199static void vic_ack_irq(struct irq_data *d) 225static void vic_ack_irq(struct irq_data *d)
@@ -287,23 +313,6 @@ static void __init vic_clear_interrupts(void __iomem *base)
287 } 313 }
288} 314}
289 315
290static void __init vic_set_irq_sources(void __iomem *base,
291 unsigned int irq_start, u32 vic_sources)
292{
293 unsigned int i;
294
295 for (i = 0; i < 32; i++) {
296 if (vic_sources & (1 << i)) {
297 unsigned int irq = irq_start + i;
298
299 irq_set_chip_and_handler(irq, &vic_chip,
300 handle_level_irq);
301 irq_set_chip_data(irq, base);
302 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
303 }
304 }
305}
306
307/* 316/*
308 * The PL190 cell from ARM has been modified by ST to handle 64 interrupts. 317 * The PL190 cell from ARM has been modified by ST to handle 64 interrupts.
309 * The original cell has 32 interrupts, while the modified one has 64, 318 * The original cell has 32 interrupts, while the modified one has 64,
@@ -338,8 +347,7 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start,
338 writel(32, base + VIC_PL190_DEF_VECT_ADDR); 347 writel(32, base + VIC_PL190_DEF_VECT_ADDR);
339 } 348 }
340 349
341 vic_set_irq_sources(base, irq_start, vic_sources); 350 vic_register(base, irq_start, vic_sources, 0, node);
342 vic_register(base, irq_start, 0, node);
343} 351}
344 352
345void __init __vic_init(void __iomem *base, unsigned int irq_start, 353void __init __vic_init(void __iomem *base, unsigned int irq_start,
@@ -379,9 +387,7 @@ void __init __vic_init(void __iomem *base, unsigned int irq_start,
379 387
380 vic_init2(base); 388 vic_init2(base);
381 389
382 vic_set_irq_sources(base, irq_start, vic_sources); 390 vic_register(base, irq_start, vic_sources, resume_sources, node);
383
384 vic_register(base, irq_start, resume_sources, node);
385} 391}
386 392
387/** 393/**
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
index d5d8d5c72682..004c1bc95d2b 100644
--- a/arch/arm/include/asm/cacheflush.h
+++ b/arch/arm/include/asm/cacheflush.h
@@ -101,7 +101,7 @@ struct cpu_cache_fns {
101 void (*flush_user_range)(unsigned long, unsigned long, unsigned int); 101 void (*flush_user_range)(unsigned long, unsigned long, unsigned int);
102 102
103 void (*coherent_kern_range)(unsigned long, unsigned long); 103 void (*coherent_kern_range)(unsigned long, unsigned long);
104 void (*coherent_user_range)(unsigned long, unsigned long); 104 int (*coherent_user_range)(unsigned long, unsigned long);
105 void (*flush_kern_dcache_area)(void *, size_t); 105 void (*flush_kern_dcache_area)(void *, size_t);
106 106
107 void (*dma_map_area)(const void *, size_t, int); 107 void (*dma_map_area)(const void *, size_t, int);
@@ -142,7 +142,7 @@ extern void __cpuc_flush_kern_all(void);
142extern void __cpuc_flush_user_all(void); 142extern void __cpuc_flush_user_all(void);
143extern void __cpuc_flush_user_range(unsigned long, unsigned long, unsigned int); 143extern void __cpuc_flush_user_range(unsigned long, unsigned long, unsigned int);
144extern void __cpuc_coherent_kern_range(unsigned long, unsigned long); 144extern void __cpuc_coherent_kern_range(unsigned long, unsigned long);
145extern void __cpuc_coherent_user_range(unsigned long, unsigned long); 145extern int __cpuc_coherent_user_range(unsigned long, unsigned long);
146extern void __cpuc_flush_dcache_area(void *, size_t); 146extern void __cpuc_flush_dcache_area(void *, size_t);
147 147
148/* 148/*
@@ -249,7 +249,7 @@ extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr
249 * Harvard caches are synchronised for the user space address range. 249 * Harvard caches are synchronised for the user space address range.
250 * This is used for the ARM private sys_cacheflush system call. 250 * This is used for the ARM private sys_cacheflush system call.
251 */ 251 */
252#define flush_cache_user_range(vma,start,end) \ 252#define flush_cache_user_range(start,end) \
253 __cpuc_coherent_user_range((start) & PAGE_MASK, PAGE_ALIGN(end)) 253 __cpuc_coherent_user_range((start) & PAGE_MASK, PAGE_ALIGN(end))
254 254
255/* 255/*
diff --git a/arch/arm/include/asm/cmpxchg.h b/arch/arm/include/asm/cmpxchg.h
index d41d7cbf0ada..7eb18c1d8d6c 100644
--- a/arch/arm/include/asm/cmpxchg.h
+++ b/arch/arm/include/asm/cmpxchg.h
@@ -229,66 +229,19 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr,
229 (unsigned long)(n), \ 229 (unsigned long)(n), \
230 sizeof(*(ptr)))) 230 sizeof(*(ptr))))
231 231
232#ifndef CONFIG_CPU_V6 /* min ARCH >= ARMv6K */ 232#define cmpxchg64(ptr, o, n) \
233 233 ((__typeof__(*(ptr)))atomic64_cmpxchg(container_of((ptr), \
234/* 234 atomic64_t, \
235 * Note : ARMv7-M (currently unsupported by Linux) does not support 235 counter), \
236 * ldrexd/strexd. If ARMv7-M is ever supported by the Linux kernel, it should 236 (unsigned long)(o), \
237 * not be allowed to use __cmpxchg64. 237 (unsigned long)(n)))
238 */ 238
239static inline unsigned long long __cmpxchg64(volatile void *ptr, 239#define cmpxchg64_local(ptr, o, n) \
240 unsigned long long old, 240 ((__typeof__(*(ptr)))local64_cmpxchg(container_of((ptr), \
241 unsigned long long new) 241 local64_t, \
242{ 242 a), \
243 register unsigned long long oldval asm("r0"); 243 (unsigned long)(o), \
244 register unsigned long long __old asm("r2") = old; 244 (unsigned long)(n)))
245 register unsigned long long __new asm("r4") = new;
246 unsigned long res;
247
248 do {
249 asm volatile(
250 " @ __cmpxchg8\n"
251 " ldrexd %1, %H1, [%2]\n"
252 " mov %0, #0\n"
253 " teq %1, %3\n"
254 " teqeq %H1, %H3\n"
255 " strexdeq %0, %4, %H4, [%2]\n"
256 : "=&r" (res), "=&r" (oldval)
257 : "r" (ptr), "Ir" (__old), "r" (__new)
258 : "memory", "cc");
259 } while (res);
260
261 return oldval;
262}
263
264static inline unsigned long long __cmpxchg64_mb(volatile void *ptr,
265 unsigned long long old,
266 unsigned long long new)
267{
268 unsigned long long ret;
269
270 smp_mb();
271 ret = __cmpxchg64(ptr, old, new);
272 smp_mb();
273
274 return ret;
275}
276
277#define cmpxchg64(ptr,o,n) \
278 ((__typeof__(*(ptr)))__cmpxchg64_mb((ptr), \
279 (unsigned long long)(o), \
280 (unsigned long long)(n)))
281
282#define cmpxchg64_local(ptr,o,n) \
283 ((__typeof__(*(ptr)))__cmpxchg64((ptr), \
284 (unsigned long long)(o), \
285 (unsigned long long)(n)))
286
287#else /* min ARCH = ARMv6 */
288
289#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
290
291#endif
292 245
293#endif /* __LINUX_ARM_ARCH__ >= 6 */ 246#endif /* __LINUX_ARM_ARCH__ >= 6 */
294 247
diff --git a/arch/arm/include/asm/mach/time.h b/arch/arm/include/asm/mach/time.h
index f73c908b7fa0..6ca945f534ab 100644
--- a/arch/arm/include/asm/mach/time.h
+++ b/arch/arm/include/asm/mach/time.h
@@ -42,4 +42,9 @@ struct sys_timer {
42 42
43extern void timer_tick(void); 43extern void timer_tick(void);
44 44
45struct timespec;
46typedef void (*clock_access_fn)(struct timespec *);
47extern int register_persistent_clock(clock_access_fn read_boot,
48 clock_access_fn read_persistent);
49
45#endif 50#endif
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h
index 759af70f9a0a..b24903549d1c 100644
--- a/arch/arm/include/asm/pgtable-3level.h
+++ b/arch/arm/include/asm/pgtable-3level.h
@@ -69,8 +69,6 @@
69 */ 69 */
70#define L_PTE_PRESENT (_AT(pteval_t, 3) << 0) /* Valid */ 70#define L_PTE_PRESENT (_AT(pteval_t, 3) << 0) /* Valid */
71#define L_PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !PRESENT */ 71#define L_PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !PRESENT */
72#define L_PTE_BUFFERABLE (_AT(pteval_t, 1) << 2) /* AttrIndx[0] */
73#define L_PTE_CACHEABLE (_AT(pteval_t, 1) << 3) /* AttrIndx[1] */
74#define L_PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */ 72#define L_PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */
75#define L_PTE_RDONLY (_AT(pteval_t, 1) << 7) /* AP[2] */ 73#define L_PTE_RDONLY (_AT(pteval_t, 1) << 7) /* AP[2] */
76#define L_PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ 74#define L_PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */
diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h
index 451808ba1211..355ece523f41 100644
--- a/arch/arm/include/asm/ptrace.h
+++ b/arch/arm/include/asm/ptrace.h
@@ -249,6 +249,11 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
249 return regs->ARM_sp; 249 return regs->ARM_sp;
250} 250}
251 251
252static inline unsigned long user_stack_pointer(struct pt_regs *regs)
253{
254 return regs->ARM_sp;
255}
256
252#endif /* __KERNEL__ */ 257#endif /* __KERNEL__ */
253 258
254#endif /* __ASSEMBLY__ */ 259#endif /* __ASSEMBLY__ */
diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h
new file mode 100644
index 000000000000..c334a23ddf75
--- /dev/null
+++ b/arch/arm/include/asm/syscall.h
@@ -0,0 +1,93 @@
1/*
2 * Access to user system call parameters and results
3 *
4 * See asm-generic/syscall.h for descriptions of what we must do here.
5 */
6
7#ifndef _ASM_ARM_SYSCALL_H
8#define _ASM_ARM_SYSCALL_H
9
10#include <linux/err.h>
11
12extern const unsigned long sys_call_table[];
13
14static inline int syscall_get_nr(struct task_struct *task,
15 struct pt_regs *regs)
16{
17 return task_thread_info(task)->syscall;
18}
19
20static inline void syscall_rollback(struct task_struct *task,
21 struct pt_regs *regs)
22{
23 regs->ARM_r0 = regs->ARM_ORIG_r0;
24}
25
26static inline long syscall_get_error(struct task_struct *task,
27 struct pt_regs *regs)
28{
29 unsigned long error = regs->ARM_r0;
30 return IS_ERR_VALUE(error) ? error : 0;
31}
32
33static inline long syscall_get_return_value(struct task_struct *task,
34 struct pt_regs *regs)
35{
36 return regs->ARM_r0;
37}
38
39static inline void syscall_set_return_value(struct task_struct *task,
40 struct pt_regs *regs,
41 int error, long val)
42{
43 regs->ARM_r0 = (long) error ? error : val;
44}
45
46#define SYSCALL_MAX_ARGS 7
47
48static inline void syscall_get_arguments(struct task_struct *task,
49 struct pt_regs *regs,
50 unsigned int i, unsigned int n,
51 unsigned long *args)
52{
53 if (i + n > SYSCALL_MAX_ARGS) {
54 unsigned long *args_bad = args + SYSCALL_MAX_ARGS - i;
55 unsigned int n_bad = n + i - SYSCALL_MAX_ARGS;
56 pr_warning("%s called with max args %d, handling only %d\n",
57 __func__, i + n, SYSCALL_MAX_ARGS);
58 memset(args_bad, 0, n_bad * sizeof(args[0]));
59 n = SYSCALL_MAX_ARGS - i;
60 }
61
62 if (i == 0) {
63 args[0] = regs->ARM_ORIG_r0;
64 args++;
65 i++;
66 n--;
67 }
68
69 memcpy(args, &regs->ARM_r0 + i, n * sizeof(args[0]));
70}
71
72static inline void syscall_set_arguments(struct task_struct *task,
73 struct pt_regs *regs,
74 unsigned int i, unsigned int n,
75 const unsigned long *args)
76{
77 if (i + n > SYSCALL_MAX_ARGS) {
78 pr_warning("%s called with max args %d, handling only %d\n",
79 __func__, i + n, SYSCALL_MAX_ARGS);
80 n = SYSCALL_MAX_ARGS - i;
81 }
82
83 if (i == 0) {
84 regs->ARM_ORIG_r0 = args[0];
85 args++;
86 i++;
87 n--;
88 }
89
90 memcpy(&regs->ARM_r0 + i, args, n * sizeof(args[0]));
91}
92
93#endif /* _ASM_ARM_SYSCALL_H */
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index 3bf0c7f8b043..835898e7d704 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -277,10 +277,6 @@ __create_page_tables:
277 mov r3, r3, lsl #PMD_ORDER 277 mov r3, r3, lsl #PMD_ORDER
278 278
279 add r0, r4, r3 279 add r0, r4, r3
280 rsb r3, r3, #0x4000 @ PTRS_PER_PGD*sizeof(long)
281 cmp r3, #0x0800 @ limit to 512MB
282 movhi r3, #0x0800
283 add r6, r0, r3
284 mov r3, r7, lsr #SECTION_SHIFT 280 mov r3, r7, lsr #SECTION_SHIFT
285 ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags 281 ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags
286 orr r3, r7, r3, lsl #SECTION_SHIFT 282 orr r3, r7, r3, lsl #SECTION_SHIFT
@@ -289,13 +285,10 @@ __create_page_tables:
289#else 285#else
290 orr r3, r3, #PMD_SECT_XN 286 orr r3, r3, #PMD_SECT_XN
291#endif 287#endif
2921: str r3, [r0], #4 288 str r3, [r0], #4
293#ifdef CONFIG_ARM_LPAE 289#ifdef CONFIG_ARM_LPAE
294 str r7, [r0], #4 290 str r7, [r0], #4
295#endif 291#endif
296 add r3, r3, #1 << SECTION_SHIFT
297 cmp r0, r6
298 blo 1b
299 292
300#else /* CONFIG_DEBUG_ICEDCC || CONFIG_DEBUG_SEMIHOSTING */ 293#else /* CONFIG_DEBUG_ICEDCC || CONFIG_DEBUG_SEMIHOSTING */
301 /* we don't need any serial debugging mappings */ 294 /* we don't need any serial debugging mappings */
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c
index 9650c143afc1..14e38261cd31 100644
--- a/arch/arm/kernel/ptrace.c
+++ b/arch/arm/kernel/ptrace.c
@@ -24,6 +24,7 @@
24#include <linux/hw_breakpoint.h> 24#include <linux/hw_breakpoint.h>
25#include <linux/regset.h> 25#include <linux/regset.h>
26#include <linux/audit.h> 26#include <linux/audit.h>
27#include <linux/tracehook.h>
27 28
28#include <asm/pgtable.h> 29#include <asm/pgtable.h>
29#include <asm/traps.h> 30#include <asm/traps.h>
@@ -918,8 +919,6 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)
918 919
919 if (!test_thread_flag(TIF_SYSCALL_TRACE)) 920 if (!test_thread_flag(TIF_SYSCALL_TRACE))
920 return scno; 921 return scno;
921 if (!(current->ptrace & PT_PTRACED))
922 return scno;
923 922
924 current_thread_info()->syscall = scno; 923 current_thread_info()->syscall = scno;
925 924
@@ -930,19 +929,11 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)
930 ip = regs->ARM_ip; 929 ip = regs->ARM_ip;
931 regs->ARM_ip = why; 930 regs->ARM_ip = why;
932 931
933 /* the 0x80 provides a way for the tracing parent to distinguish 932 if (why)
934 between a syscall stop and SIGTRAP delivery */ 933 tracehook_report_syscall_exit(regs, 0);
935 ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) 934 else if (tracehook_report_syscall_entry(regs))
936 ? 0x80 : 0)); 935 current_thread_info()->syscall = -1;
937 /* 936
938 * this isn't the same as continuing with a signal, but it will do
939 * for normal use. strace only continues with a signal if the
940 * stopping signal is not SIGTRAP. -brl
941 */
942 if (current->exit_code) {
943 send_sig(current->exit_code, current, 1);
944 current->exit_code = 0;
945 }
946 regs->ARM_ip = ip; 937 regs->ARM_ip = ip;
947 938
948 return current_thread_info()->syscall; 939 return current_thread_info()->syscall;
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index d68d1b694680..73d9a420850d 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -589,6 +589,8 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
589 */ 589 */
590 block_sigmask(ka, sig); 590 block_sigmask(ka, sig);
591 591
592 tracehook_signal_handler(sig, info, ka, regs, 0);
593
592 return 0; 594 return 0;
593} 595}
594 596
diff --git a/arch/arm/kernel/smp_scu.c b/arch/arm/kernel/smp_scu.c
index 8f5dd7963356..b9f015e843d8 100644
--- a/arch/arm/kernel/smp_scu.c
+++ b/arch/arm/kernel/smp_scu.c
@@ -11,6 +11,7 @@
11#include <linux/init.h> 11#include <linux/init.h>
12#include <linux/io.h> 12#include <linux/io.h>
13 13
14#include <asm/smp_plat.h>
14#include <asm/smp_scu.h> 15#include <asm/smp_scu.h>
15#include <asm/cacheflush.h> 16#include <asm/cacheflush.h>
16#include <asm/cputype.h> 17#include <asm/cputype.h>
@@ -74,7 +75,7 @@ void scu_enable(void __iomem *scu_base)
74int scu_power_mode(void __iomem *scu_base, unsigned int mode) 75int scu_power_mode(void __iomem *scu_base, unsigned int mode)
75{ 76{
76 unsigned int val; 77 unsigned int val;
77 int cpu = smp_processor_id(); 78 int cpu = cpu_logical_map(smp_processor_id());
78 79
79 if (mode > 3 || mode == 1 || cpu > 3) 80 if (mode > 3 || mode == 1 || cpu > 3)
80 return -EINVAL; 81 return -EINVAL;
diff --git a/arch/arm/kernel/thumbee.c b/arch/arm/kernel/thumbee.c
index aab899764053..7b8403b76666 100644
--- a/arch/arm/kernel/thumbee.c
+++ b/arch/arm/kernel/thumbee.c
@@ -20,6 +20,7 @@
20#include <linux/kernel.h> 20#include <linux/kernel.h>
21#include <linux/init.h> 21#include <linux/init.h>
22 22
23#include <asm/cputype.h>
23#include <asm/system_info.h> 24#include <asm/system_info.h>
24#include <asm/thread_notify.h> 25#include <asm/thread_notify.h>
25 26
@@ -67,8 +68,7 @@ static int __init thumbee_init(void)
67 if (cpu_arch < CPU_ARCH_ARMv7) 68 if (cpu_arch < CPU_ARCH_ARMv7)
68 return 0; 69 return 0;
69 70
70 /* processor feature register 0 */ 71 pfr0 = read_cpuid_ext(CPUID_EXT_PFR0);
71 asm("mrc p15, 0, %0, c0, c1, 0\n" : "=r" (pfr0));
72 if ((pfr0 & 0x0000f000) != 0x00001000) 72 if ((pfr0 & 0x0000f000) != 0x00001000)
73 return 0; 73 return 0;
74 74
diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c
index fe31b22f18fd..af2afb019672 100644
--- a/arch/arm/kernel/time.c
+++ b/arch/arm/kernel/time.c
@@ -110,6 +110,42 @@ void timer_tick(void)
110} 110}
111#endif 111#endif
112 112
113static void dummy_clock_access(struct timespec *ts)
114{
115 ts->tv_sec = 0;
116 ts->tv_nsec = 0;
117}
118
119static clock_access_fn __read_persistent_clock = dummy_clock_access;
120static clock_access_fn __read_boot_clock = dummy_clock_access;;
121
122void read_persistent_clock(struct timespec *ts)
123{
124 __read_persistent_clock(ts);
125}
126
127void read_boot_clock(struct timespec *ts)
128{
129 __read_boot_clock(ts);
130}
131
132int __init register_persistent_clock(clock_access_fn read_boot,
133 clock_access_fn read_persistent)
134{
135 /* Only allow the clockaccess functions to be registered once */
136 if (__read_persistent_clock == dummy_clock_access &&
137 __read_boot_clock == dummy_clock_access) {
138 if (read_boot)
139 __read_boot_clock = read_boot;
140 if (read_persistent)
141 __read_persistent_clock = read_persistent;
142
143 return 0;
144 }
145
146 return -EINVAL;
147}
148
113#if defined(CONFIG_PM) && !defined(CONFIG_GENERIC_CLOCKEVENTS) 149#if defined(CONFIG_PM) && !defined(CONFIG_GENERIC_CLOCKEVENTS)
114static int timer_suspend(void) 150static int timer_suspend(void)
115{ 151{
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 778454750a6c..3647170e9a16 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -479,14 +479,14 @@ static int bad_syscall(int n, struct pt_regs *regs)
479 return regs->ARM_r0; 479 return regs->ARM_r0;
480} 480}
481 481
482static inline void 482static inline int
483do_cache_op(unsigned long start, unsigned long end, int flags) 483do_cache_op(unsigned long start, unsigned long end, int flags)
484{ 484{
485 struct mm_struct *mm = current->active_mm; 485 struct mm_struct *mm = current->active_mm;
486 struct vm_area_struct *vma; 486 struct vm_area_struct *vma;
487 487
488 if (end < start || flags) 488 if (end < start || flags)
489 return; 489 return -EINVAL;
490 490
491 down_read(&mm->mmap_sem); 491 down_read(&mm->mmap_sem);
492 vma = find_vma(mm, start); 492 vma = find_vma(mm, start);
@@ -496,9 +496,11 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
496 if (end > vma->vm_end) 496 if (end > vma->vm_end)
497 end = vma->vm_end; 497 end = vma->vm_end;
498 498
499 flush_cache_user_range(vma, start, end); 499 up_read(&mm->mmap_sem);
500 return flush_cache_user_range(start, end);
500 } 501 }
501 up_read(&mm->mmap_sem); 502 up_read(&mm->mmap_sem);
503 return -EINVAL;
502} 504}
503 505
504/* 506/*
@@ -544,8 +546,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
544 * the specified region). 546 * the specified region).
545 */ 547 */
546 case NR(cacheflush): 548 case NR(cacheflush):
547 do_cache_op(regs->ARM_r0, regs->ARM_r1, regs->ARM_r2); 549 return do_cache_op(regs->ARM_r0, regs->ARM_r1, regs->ARM_r2);
548 return 0;
549 550
550 case NR(usr26): 551 case NR(usr26):
551 if (!(elf_hwcap & HWCAP_26BIT)) 552 if (!(elf_hwcap & HWCAP_26BIT))
diff --git a/arch/arm/mach-tegra/timer.c b/arch/arm/mach-tegra/timer.c
index 1eed8d4a80ef..315672c7bd48 100644
--- a/arch/arm/mach-tegra/timer.c
+++ b/arch/arm/mach-tegra/timer.c
@@ -124,7 +124,7 @@ static u64 tegra_rtc_read_ms(void)
124} 124}
125 125
126/* 126/*
127 * read_persistent_clock - Return time from a persistent clock. 127 * tegra_read_persistent_clock - Return time from a persistent clock.
128 * 128 *
129 * Reads the time from a source which isn't disabled during PM, the 129 * Reads the time from a source which isn't disabled during PM, the
130 * 32k sync timer. Convert the cycles elapsed since last read into 130 * 32k sync timer. Convert the cycles elapsed since last read into
@@ -133,7 +133,7 @@ static u64 tegra_rtc_read_ms(void)
133 * tegra_rtc driver could be executing to avoid race conditions 133 * tegra_rtc driver could be executing to avoid race conditions
134 * on the RTC shadow register 134 * on the RTC shadow register
135 */ 135 */
136void read_persistent_clock(struct timespec *ts) 136static void tegra_read_persistent_clock(struct timespec *ts)
137{ 137{
138 u64 delta; 138 u64 delta;
139 struct timespec *tsp = &persistent_ts; 139 struct timespec *tsp = &persistent_ts;
@@ -243,6 +243,7 @@ static void __init tegra_init_timer(void)
243 tegra_clockevent.irq = tegra_timer_irq.irq; 243 tegra_clockevent.irq = tegra_timer_irq.irq;
244 clockevents_register_device(&tegra_clockevent); 244 clockevents_register_device(&tegra_clockevent);
245 tegra_twd_init(); 245 tegra_twd_init();
246 register_persistent_clock(NULL, tegra_read_persistent_clock);
246} 247}
247 248
248struct sys_timer tegra_timer = { 249struct sys_timer tegra_timer = {
diff --git a/arch/arm/mm/cache-v3.S b/arch/arm/mm/cache-v3.S
index c2301f226100..52e35f32eefb 100644
--- a/arch/arm/mm/cache-v3.S
+++ b/arch/arm/mm/cache-v3.S
@@ -78,6 +78,7 @@ ENTRY(v3_coherent_kern_range)
78 * - end - virtual end address 78 * - end - virtual end address
79 */ 79 */
80ENTRY(v3_coherent_user_range) 80ENTRY(v3_coherent_user_range)
81 mov r0, #0
81 mov pc, lr 82 mov pc, lr
82 83
83/* 84/*
diff --git a/arch/arm/mm/cache-v4.S b/arch/arm/mm/cache-v4.S
index fd9bb7addc8d..022135d2b7e4 100644
--- a/arch/arm/mm/cache-v4.S
+++ b/arch/arm/mm/cache-v4.S
@@ -88,6 +88,7 @@ ENTRY(v4_coherent_kern_range)
88 * - end - virtual end address 88 * - end - virtual end address
89 */ 89 */
90ENTRY(v4_coherent_user_range) 90ENTRY(v4_coherent_user_range)
91 mov r0, #0
91 mov pc, lr 92 mov pc, lr
92 93
93/* 94/*
diff --git a/arch/arm/mm/cache-v4wb.S b/arch/arm/mm/cache-v4wb.S
index 4f2c14151ccb..8f1eeae340c8 100644
--- a/arch/arm/mm/cache-v4wb.S
+++ b/arch/arm/mm/cache-v4wb.S
@@ -167,9 +167,9 @@ ENTRY(v4wb_coherent_user_range)
167 add r0, r0, #CACHE_DLINESIZE 167 add r0, r0, #CACHE_DLINESIZE
168 cmp r0, r1 168 cmp r0, r1
169 blo 1b 169 blo 1b
170 mov ip, #0 170 mov r0, #0
171 mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache 171 mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
172 mcr p15, 0, ip, c7, c10, 4 @ drain WB 172 mcr p15, 0, r0, c7, c10, 4 @ drain WB
173 mov pc, lr 173 mov pc, lr
174 174
175 175
diff --git a/arch/arm/mm/cache-v4wt.S b/arch/arm/mm/cache-v4wt.S
index 4d7b467631ce..b34a5f908a82 100644
--- a/arch/arm/mm/cache-v4wt.S
+++ b/arch/arm/mm/cache-v4wt.S
@@ -125,6 +125,7 @@ ENTRY(v4wt_coherent_user_range)
125 add r0, r0, #CACHE_DLINESIZE 125 add r0, r0, #CACHE_DLINESIZE
126 cmp r0, r1 126 cmp r0, r1
127 blo 1b 127 blo 1b
128 mov r0, #0
128 mov pc, lr 129 mov pc, lr
129 130
130/* 131/*
diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S
index 74c2e5a33a4d..4b10760c56d6 100644
--- a/arch/arm/mm/cache-v6.S
+++ b/arch/arm/mm/cache-v6.S
@@ -12,6 +12,7 @@
12#include <linux/linkage.h> 12#include <linux/linkage.h>
13#include <linux/init.h> 13#include <linux/init.h>
14#include <asm/assembler.h> 14#include <asm/assembler.h>
15#include <asm/errno.h>
15#include <asm/unwind.h> 16#include <asm/unwind.h>
16 17
17#include "proc-macros.S" 18#include "proc-macros.S"
@@ -135,7 +136,6 @@ ENTRY(v6_coherent_user_range)
1351: 1361:
136 USER( mcr p15, 0, r0, c7, c10, 1 ) @ clean D line 137 USER( mcr p15, 0, r0, c7, c10, 1 ) @ clean D line
137 add r0, r0, #CACHE_LINE_SIZE 138 add r0, r0, #CACHE_LINE_SIZE
1382:
139 cmp r0, r1 139 cmp r0, r1
140 blo 1b 140 blo 1b
141#endif 141#endif
@@ -154,13 +154,11 @@ ENTRY(v6_coherent_user_range)
154 154
155/* 155/*
156 * Fault handling for the cache operation above. If the virtual address in r0 156 * Fault handling for the cache operation above. If the virtual address in r0
157 * isn't mapped, just try the next page. 157 * isn't mapped, fail with -EFAULT.
158 */ 158 */
1599001: 1599001:
160 mov r0, r0, lsr #12 160 mov r0, #-EFAULT
161 mov r0, r0, lsl #12 161 mov pc, lr
162 add r0, r0, #4096
163 b 2b
164 UNWIND(.fnend ) 162 UNWIND(.fnend )
165ENDPROC(v6_coherent_user_range) 163ENDPROC(v6_coherent_user_range)
166ENDPROC(v6_coherent_kern_range) 164ENDPROC(v6_coherent_kern_range)
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S
index a655d3da386d..39e3fb3db801 100644
--- a/arch/arm/mm/cache-v7.S
+++ b/arch/arm/mm/cache-v7.S
@@ -13,6 +13,7 @@
13#include <linux/linkage.h> 13#include <linux/linkage.h>
14#include <linux/init.h> 14#include <linux/init.h>
15#include <asm/assembler.h> 15#include <asm/assembler.h>
16#include <asm/errno.h>
16#include <asm/unwind.h> 17#include <asm/unwind.h>
17 18
18#include "proc-macros.S" 19#include "proc-macros.S"
@@ -198,7 +199,6 @@ ENTRY(v7_coherent_user_range)
198 add r12, r12, r2 199 add r12, r12, r2
199 cmp r12, r1 200 cmp r12, r1
200 blo 2b 201 blo 2b
2013:
202 mov r0, #0 202 mov r0, #0
203 ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable 203 ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable
204 ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB 204 ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB
@@ -208,13 +208,11 @@ ENTRY(v7_coherent_user_range)
208 208
209/* 209/*
210 * Fault handling for the cache operation above. If the virtual address in r0 210 * Fault handling for the cache operation above. If the virtual address in r0
211 * isn't mapped, just try the next page. 211 * isn't mapped, fail with -EFAULT.
212 */ 212 */
2139001: 2139001:
214 mov r12, r12, lsr #12 214 mov r0, #-EFAULT
215 mov r12, r12, lsl #12 215 mov pc, lr
216 add r12, r12, #4096
217 b 3b
218 UNWIND(.fnend ) 216 UNWIND(.fnend )
219ENDPROC(v7_coherent_kern_range) 217ENDPROC(v7_coherent_kern_range)
220ENDPROC(v7_coherent_user_range) 218ENDPROC(v7_coherent_user_range)
diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S
index 234951345eb3..0650bb87c1e3 100644
--- a/arch/arm/mm/proc-arm1020.S
+++ b/arch/arm/mm/proc-arm1020.S
@@ -241,6 +241,7 @@ ENTRY(arm1020_coherent_user_range)
241 cmp r0, r1 241 cmp r0, r1
242 blo 1b 242 blo 1b
243 mcr p15, 0, ip, c7, c10, 4 @ drain WB 243 mcr p15, 0, ip, c7, c10, 4 @ drain WB
244 mov r0, #0
244 mov pc, lr 245 mov pc, lr
245 246
246/* 247/*
diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S
index c244b06caac9..4188478325a6 100644
--- a/arch/arm/mm/proc-arm1020e.S
+++ b/arch/arm/mm/proc-arm1020e.S
@@ -235,6 +235,7 @@ ENTRY(arm1020e_coherent_user_range)
235 cmp r0, r1 235 cmp r0, r1
236 blo 1b 236 blo 1b
237 mcr p15, 0, ip, c7, c10, 4 @ drain WB 237 mcr p15, 0, ip, c7, c10, 4 @ drain WB
238 mov r0, #0
238 mov pc, lr 239 mov pc, lr
239 240
240/* 241/*
diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S
index 38fe22efd18f..33c68824bff0 100644
--- a/arch/arm/mm/proc-arm1022.S
+++ b/arch/arm/mm/proc-arm1022.S
@@ -224,6 +224,7 @@ ENTRY(arm1022_coherent_user_range)
224 cmp r0, r1 224 cmp r0, r1
225 blo 1b 225 blo 1b
226 mcr p15, 0, ip, c7, c10, 4 @ drain WB 226 mcr p15, 0, ip, c7, c10, 4 @ drain WB
227 mov r0, #0
227 mov pc, lr 228 mov pc, lr
228 229
229/* 230/*
diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S
index 3eb9c3c26c75..fbc1d5fc24dc 100644
--- a/arch/arm/mm/proc-arm1026.S
+++ b/arch/arm/mm/proc-arm1026.S
@@ -218,6 +218,7 @@ ENTRY(arm1026_coherent_user_range)
218 cmp r0, r1 218 cmp r0, r1
219 blo 1b 219 blo 1b
220 mcr p15, 0, ip, c7, c10, 4 @ drain WB 220 mcr p15, 0, ip, c7, c10, 4 @ drain WB
221 mov r0, #0
221 mov pc, lr 222 mov pc, lr
222 223
223/* 224/*
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S
index cb941ae95f66..1a8c138eb897 100644
--- a/arch/arm/mm/proc-arm920.S
+++ b/arch/arm/mm/proc-arm920.S
@@ -210,6 +210,7 @@ ENTRY(arm920_coherent_user_range)
210 cmp r0, r1 210 cmp r0, r1
211 blo 1b 211 blo 1b
212 mcr p15, 0, r0, c7, c10, 4 @ drain WB 212 mcr p15, 0, r0, c7, c10, 4 @ drain WB
213 mov r0, #0
213 mov pc, lr 214 mov pc, lr
214 215
215/* 216/*
diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S
index 4ec0e074dd55..4c44d7e1c3ca 100644
--- a/arch/arm/mm/proc-arm922.S
+++ b/arch/arm/mm/proc-arm922.S
@@ -212,6 +212,7 @@ ENTRY(arm922_coherent_user_range)
212 cmp r0, r1 212 cmp r0, r1
213 blo 1b 213 blo 1b
214 mcr p15, 0, r0, c7, c10, 4 @ drain WB 214 mcr p15, 0, r0, c7, c10, 4 @ drain WB
215 mov r0, #0
215 mov pc, lr 216 mov pc, lr
216 217
217/* 218/*
diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S
index 9dccd9a365b3..ec5b1180994f 100644
--- a/arch/arm/mm/proc-arm925.S
+++ b/arch/arm/mm/proc-arm925.S
@@ -258,6 +258,7 @@ ENTRY(arm925_coherent_user_range)
258 cmp r0, r1 258 cmp r0, r1
259 blo 1b 259 blo 1b
260 mcr p15, 0, r0, c7, c10, 4 @ drain WB 260 mcr p15, 0, r0, c7, c10, 4 @ drain WB
261 mov r0, #0
261 mov pc, lr 262 mov pc, lr
262 263
263/* 264/*
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S
index 820259b81a1f..c31e62c606c0 100644
--- a/arch/arm/mm/proc-arm926.S
+++ b/arch/arm/mm/proc-arm926.S
@@ -221,6 +221,7 @@ ENTRY(arm926_coherent_user_range)
221 cmp r0, r1 221 cmp r0, r1
222 blo 1b 222 blo 1b
223 mcr p15, 0, r0, c7, c10, 4 @ drain WB 223 mcr p15, 0, r0, c7, c10, 4 @ drain WB
224 mov r0, #0
224 mov pc, lr 225 mov pc, lr
225 226
226/* 227/*
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S
index 9fdc0a170974..a613a7dd7146 100644
--- a/arch/arm/mm/proc-arm940.S
+++ b/arch/arm/mm/proc-arm940.S
@@ -160,7 +160,7 @@ ENTRY(arm940_coherent_user_range)
160 * - size - region size 160 * - size - region size
161 */ 161 */
162ENTRY(arm940_flush_kern_dcache_area) 162ENTRY(arm940_flush_kern_dcache_area)
163 mov ip, #0 163 mov r0, #0
164 mov r1, #(CACHE_DSEGMENTS - 1) << 4 @ 4 segments 164 mov r1, #(CACHE_DSEGMENTS - 1) << 4 @ 4 segments
1651: orr r3, r1, #(CACHE_DENTRIES - 1) << 26 @ 64 entries 1651: orr r3, r1, #(CACHE_DENTRIES - 1) << 26 @ 64 entries
1662: mcr p15, 0, r3, c7, c14, 2 @ clean/flush D index 1662: mcr p15, 0, r3, c7, c14, 2 @ clean/flush D index
@@ -168,8 +168,8 @@ ENTRY(arm940_flush_kern_dcache_area)
168 bcs 2b @ entries 63 to 0 168 bcs 2b @ entries 63 to 0
169 subs r1, r1, #1 << 4 169 subs r1, r1, #1 << 4
170 bcs 1b @ segments 7 to 0 170 bcs 1b @ segments 7 to 0
171 mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache 171 mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
172 mcr p15, 0, ip, c7, c10, 4 @ drain WB 172 mcr p15, 0, r0, c7, c10, 4 @ drain WB
173 mov pc, lr 173 mov pc, lr
174 174
175/* 175/*
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S
index f684cfedcca9..9f4f2999fdd0 100644
--- a/arch/arm/mm/proc-arm946.S
+++ b/arch/arm/mm/proc-arm946.S
@@ -190,6 +190,7 @@ ENTRY(arm946_coherent_user_range)
190 cmp r0, r1 190 cmp r0, r1
191 blo 1b 191 blo 1b
192 mcr p15, 0, r0, c7, c10, 4 @ drain WB 192 mcr p15, 0, r0, c7, c10, 4 @ drain WB
193 mov r0, #0
193 mov pc, lr 194 mov pc, lr
194 195
195/* 196/*
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S
index ba3c500584ac..23a8e4c7f2bd 100644
--- a/arch/arm/mm/proc-feroceon.S
+++ b/arch/arm/mm/proc-feroceon.S
@@ -232,6 +232,7 @@ ENTRY(feroceon_coherent_user_range)
232 cmp r0, r1 232 cmp r0, r1
233 blo 1b 233 blo 1b
234 mcr p15, 0, r0, c7, c10, 4 @ drain WB 234 mcr p15, 0, r0, c7, c10, 4 @ drain WB
235 mov r0, #0
235 mov pc, lr 236 mov pc, lr
236 237
237/* 238/*
diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S
index cdfedc5b8ad8..b0475468c711 100644
--- a/arch/arm/mm/proc-mohawk.S
+++ b/arch/arm/mm/proc-mohawk.S
@@ -193,6 +193,7 @@ ENTRY(mohawk_coherent_user_range)
193 cmp r0, r1 193 cmp r0, r1
194 blo 1b 194 blo 1b
195 mcr p15, 0, r0, c7, c10, 4 @ drain WB 195 mcr p15, 0, r0, c7, c10, 4 @ drain WB
196 mov r0, #0
196 mov pc, lr 197 mov pc, lr
197 198
198/* 199/*
diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c
index 5068fe5a6910..44ae077dbc28 100644
--- a/arch/arm/plat-omap/counter_32k.c
+++ b/arch/arm/plat-omap/counter_32k.c
@@ -19,6 +19,7 @@
19#include <linux/io.h> 19#include <linux/io.h>
20#include <linux/clocksource.h> 20#include <linux/clocksource.h>
21 21
22#include <asm/mach/time.h>
22#include <asm/sched_clock.h> 23#include <asm/sched_clock.h>
23 24
24#include <plat/hardware.h> 25#include <plat/hardware.h>
@@ -43,7 +44,7 @@ static u32 notrace omap_32k_read_sched_clock(void)
43} 44}
44 45
45/** 46/**
46 * read_persistent_clock - Return time from a persistent clock. 47 * omap_read_persistent_clock - Return time from a persistent clock.
47 * 48 *
48 * Reads the time from a source which isn't disabled during PM, the 49 * Reads the time from a source which isn't disabled during PM, the
49 * 32k sync timer. Convert the cycles elapsed since last read into 50 * 32k sync timer. Convert the cycles elapsed since last read into
@@ -52,7 +53,7 @@ static u32 notrace omap_32k_read_sched_clock(void)
52static struct timespec persistent_ts; 53static struct timespec persistent_ts;
53static cycles_t cycles, last_cycles; 54static cycles_t cycles, last_cycles;
54static unsigned int persistent_mult, persistent_shift; 55static unsigned int persistent_mult, persistent_shift;
55void read_persistent_clock(struct timespec *ts) 56static void omap_read_persistent_clock(struct timespec *ts)
56{ 57{
57 unsigned long long nsecs; 58 unsigned long long nsecs;
58 cycles_t delta; 59 cycles_t delta;
@@ -116,6 +117,7 @@ int __init omap_init_clocksource_32k(void)
116 printk(err, "32k_counter"); 117 printk(err, "32k_counter");
117 118
118 setup_sched_clock(omap_32k_read_sched_clock, 32, 32768); 119 setup_sched_clock(omap_32k_read_sched_clock, 32, 32768);
120 register_persistent_clock(NULL, omap_read_persistent_clock);
119 } 121 }
120 return 0; 122 return 0;
121} 123}
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
index b0197b2c857d..586961929e96 100644
--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -241,11 +241,11 @@ static void vfp_panic(char *reason, u32 inst)
241{ 241{
242 int i; 242 int i;
243 243
244 printk(KERN_ERR "VFP: Error: %s\n", reason); 244 pr_err("VFP: Error: %s\n", reason);
245 printk(KERN_ERR "VFP: EXC 0x%08x SCR 0x%08x INST 0x%08x\n", 245 pr_err("VFP: EXC 0x%08x SCR 0x%08x INST 0x%08x\n",
246 fmrx(FPEXC), fmrx(FPSCR), inst); 246 fmrx(FPEXC), fmrx(FPSCR), inst);
247 for (i = 0; i < 32; i += 2) 247 for (i = 0; i < 32; i += 2)
248 printk(KERN_ERR "VFP: s%2u: 0x%08x s%2u: 0x%08x\n", 248 pr_err("VFP: s%2u: 0x%08x s%2u: 0x%08x\n",
249 i, vfp_get_float(i), i+1, vfp_get_float(i+1)); 249 i, vfp_get_float(i), i+1, vfp_get_float(i+1));
250} 250}
251 251
@@ -452,7 +452,7 @@ static int vfp_pm_suspend(void)
452 452
453 /* if vfp is on, then save state for resumption */ 453 /* if vfp is on, then save state for resumption */
454 if (fpexc & FPEXC_EN) { 454 if (fpexc & FPEXC_EN) {
455 printk(KERN_DEBUG "%s: saving vfp state\n", __func__); 455 pr_debug("%s: saving vfp state\n", __func__);
456 vfp_save_state(&ti->vfpstate, fpexc); 456 vfp_save_state(&ti->vfpstate, fpexc);
457 457
458 /* disable, just in case */ 458 /* disable, just in case */
@@ -664,16 +664,16 @@ static int __init vfp_init(void)
664 barrier(); 664 barrier();
665 vfp_vector = vfp_null_entry; 665 vfp_vector = vfp_null_entry;
666 666
667 printk(KERN_INFO "VFP support v0.3: "); 667 pr_info("VFP support v0.3: ");
668 if (VFP_arch) 668 if (VFP_arch)
669 printk("not present\n"); 669 pr_cont("not present\n");
670 else if (vfpsid & FPSID_NODOUBLE) { 670 else if (vfpsid & FPSID_NODOUBLE) {
671 printk("no double precision support\n"); 671 pr_cont("no double precision support\n");
672 } else { 672 } else {
673 hotcpu_notifier(vfp_hotplug, 0); 673 hotcpu_notifier(vfp_hotplug, 0);
674 674
675 VFP_arch = (vfpsid & FPSID_ARCH_MASK) >> FPSID_ARCH_BIT; /* Extract the architecture version */ 675 VFP_arch = (vfpsid & FPSID_ARCH_MASK) >> FPSID_ARCH_BIT; /* Extract the architecture version */
676 printk("implementor %02x architecture %d part %02x variant %x rev %x\n", 676 pr_cont("implementor %02x architecture %d part %02x variant %x rev %x\n",
677 (vfpsid & FPSID_IMPLEMENTER_MASK) >> FPSID_IMPLEMENTER_BIT, 677 (vfpsid & FPSID_IMPLEMENTER_MASK) >> FPSID_IMPLEMENTER_BIT,
678 (vfpsid & FPSID_ARCH_MASK) >> FPSID_ARCH_BIT, 678 (vfpsid & FPSID_ARCH_MASK) >> FPSID_ARCH_BIT,
679 (vfpsid & FPSID_PART_MASK) >> FPSID_PART_BIT, 679 (vfpsid & FPSID_PART_MASK) >> FPSID_PART_BIT,