diff options
author | Linus Torvalds <torvalds@woody.osdl.org> | 2007-01-02 21:50:57 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2007-01-02 21:50:57 -0500 |
commit | b06b5a53adcc3ace1a82b324edf2b0c37e7be00e (patch) | |
tree | 627599b14a3652778f4ca1f8a42d6627a6c6c84f /arch/arm | |
parent | c6b33cc4e9882b44f1b0c36396f420076e04a4e2 (diff) | |
parent | d02b161eda65528ad3e89d642e416c265c17ceb8 (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:
[ARM] 4081/1: Add definition for TI Sync Serial Protocol
[ARM] 4080/1: Fix for the SSCR0_SlotsPerFrm macro
[ARM] Fix VFP initialisation issue for SMP systems
[ARM] 4078/1: Fix ARM copypage cache coherency problems
[ARM] 4077/1: iop13xx: fix __io() macro
[ARM] 4074/1: Flat loader stack alignment
[ARM] 4073/1: Prevent s3c24xx drivers from including asm/arch/hardware.h and asm/arch/irqs.h
[ARM] 4071/1: S3C24XX: Documentation update
[ARM] 4066/1: correct a comment about PXA's sched_clock range
[ARM] 4065/1: S3C24XX: dma printk fixes
[ARM] 4064/1: make pxa_get_cycles() static
[ARM] 4063/1: ep93xx: fix IRQ_EP93XX_GPIO?MUX numbering
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-iop13xx/io.c | 19 | ||||
-rw-r--r-- | arch/arm/mach-pxa/generic.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-pxa/time.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-s3c2410/dma.c | 4 | ||||
-rw-r--r-- | arch/arm/mm/copypage-v4mc.c | 6 | ||||
-rw-r--r-- | arch/arm/mm/copypage-v6.c | 4 | ||||
-rw-r--r-- | arch/arm/mm/copypage-xscale.c | 6 | ||||
-rw-r--r-- | arch/arm/vfp/vfpmodule.c | 15 |
8 files changed, 59 insertions, 7 deletions
diff --git a/arch/arm/mach-iop13xx/io.c b/arch/arm/mach-iop13xx/io.c index fbf9f88e46ea..e79a1b62600f 100644 --- a/arch/arm/mach-iop13xx/io.c +++ b/arch/arm/mach-iop13xx/io.c | |||
@@ -21,6 +21,25 @@ | |||
21 | #include <asm/hardware.h> | 21 | #include <asm/hardware.h> |
22 | #include <asm/io.h> | 22 | #include <asm/io.h> |
23 | 23 | ||
24 | void * __iomem __iop13xx_io(unsigned long io_addr) | ||
25 | { | ||
26 | void __iomem * io_virt; | ||
27 | |||
28 | switch (io_addr) { | ||
29 | case IOP13XX_PCIE_LOWER_IO_PA ... IOP13XX_PCIE_UPPER_IO_PA: | ||
30 | io_virt = (void *) IOP13XX_PCIE_IO_PHYS_TO_VIRT(io_addr); | ||
31 | break; | ||
32 | case IOP13XX_PCIX_LOWER_IO_PA ... IOP13XX_PCIX_UPPER_IO_PA: | ||
33 | io_virt = (void *) IOP13XX_PCIX_IO_PHYS_TO_VIRT(io_addr); | ||
34 | break; | ||
35 | default: | ||
36 | BUG(); | ||
37 | } | ||
38 | |||
39 | return io_virt; | ||
40 | } | ||
41 | EXPORT_SYMBOL(__iop13xx_io); | ||
42 | |||
24 | void * __iomem __iop13xx_ioremap(unsigned long cookie, size_t size, | 43 | void * __iomem __iop13xx_ioremap(unsigned long cookie, size_t size, |
25 | unsigned long flags) | 44 | unsigned long flags) |
26 | { | 45 | { |
diff --git a/arch/arm/mach-pxa/generic.c b/arch/arm/mach-pxa/generic.c index 6ae605857ca9..9de1278d234f 100644 --- a/arch/arm/mach-pxa/generic.c +++ b/arch/arm/mach-pxa/generic.c | |||
@@ -76,7 +76,9 @@ unsigned long long sched_clock(void) | |||
76 | /* | 76 | /* |
77 | * 96-bit math to perform tick * NSEC_PER_SEC / CLOCK_TICK_RATE for | 77 | * 96-bit math to perform tick * NSEC_PER_SEC / CLOCK_TICK_RATE for |
78 | * any value of CLOCK_TICK_RATE. Max value is in the 80 thousand | 78 | * any value of CLOCK_TICK_RATE. Max value is in the 80 thousand |
79 | * years range which is nice, but with higher computation cost. | 79 | * years range and truncation to unsigned long long limits it to |
80 | * sched_clock's max range of ~584 years. This is nice but with | ||
81 | * higher computation cost. | ||
80 | */ | 82 | */ |
81 | { | 83 | { |
82 | union { | 84 | union { |
diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c index 3775b8f38429..ee2beb400414 100644 --- a/arch/arm/mach-pxa/time.c +++ b/arch/arm/mach-pxa/time.c | |||
@@ -101,7 +101,7 @@ static struct irqaction pxa_timer_irq = { | |||
101 | .handler = pxa_timer_interrupt, | 101 | .handler = pxa_timer_interrupt, |
102 | }; | 102 | }; |
103 | 103 | ||
104 | cycle_t pxa_get_cycles(void) | 104 | static cycle_t pxa_get_cycles(void) |
105 | { | 105 | { |
106 | return OSCR; | 106 | return OSCR; |
107 | } | 107 | } |
@@ -134,13 +134,13 @@ static void __init pxa_timer_init(void) | |||
134 | OSMR0 = OSCR + LATCH; /* set initial match */ | 134 | OSMR0 = OSCR + LATCH; /* set initial match */ |
135 | local_irq_restore(flags); | 135 | local_irq_restore(flags); |
136 | 136 | ||
137 | /* on PXA OSCR runs continiously and is not written to, so we can use it | 137 | /* |
138 | * as clock source directly. | 138 | * OSCR runs continuously on PXA and is not written to, |
139 | * so we can use it as clock source directly. | ||
139 | */ | 140 | */ |
140 | clocksource_pxa.mult = | 141 | clocksource_pxa.mult = |
141 | clocksource_hz2mult(CLOCK_TICK_RATE, clocksource_pxa.shift); | 142 | clocksource_hz2mult(CLOCK_TICK_RATE, clocksource_pxa.shift); |
142 | clocksource_register(&clocksource_pxa); | 143 | clocksource_register(&clocksource_pxa); |
143 | |||
144 | } | 144 | } |
145 | 145 | ||
146 | #ifdef CONFIG_NO_IDLE_HZ | 146 | #ifdef CONFIG_NO_IDLE_HZ |
diff --git a/arch/arm/mach-s3c2410/dma.c b/arch/arm/mach-s3c2410/dma.c index 717322a0916b..fa860e716b4f 100644 --- a/arch/arm/mach-s3c2410/dma.c +++ b/arch/arm/mach-s3c2410/dma.c | |||
@@ -1053,11 +1053,11 @@ int s3c2410_dma_config(dmach_t channel, | |||
1053 | if (chan == NULL) | 1053 | if (chan == NULL) |
1054 | return -EINVAL; | 1054 | return -EINVAL; |
1055 | 1055 | ||
1056 | printk("Initial dcon is %08x\n", dcon); | 1056 | pr_debug("%s: Initial dcon is %08x\n", __FUNCTION__, dcon); |
1057 | 1057 | ||
1058 | dcon |= chan->dcon & dma_sel.dcon_mask; | 1058 | dcon |= chan->dcon & dma_sel.dcon_mask; |
1059 | 1059 | ||
1060 | printk("New dcon is %08x\n", dcon); | 1060 | pr_debug("%s: New dcon is %08x\n", __FUNCTION__, dcon); |
1061 | 1061 | ||
1062 | switch (xferunit) { | 1062 | switch (xferunit) { |
1063 | case 1: | 1063 | case 1: |
diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c index 408b05ae6b9b..ded0e96d069d 100644 --- a/arch/arm/mm/copypage-v4mc.c +++ b/arch/arm/mm/copypage-v4mc.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/page.h> | 19 | #include <asm/page.h> |
20 | #include <asm/pgtable.h> | 20 | #include <asm/pgtable.h> |
21 | #include <asm/tlbflush.h> | 21 | #include <asm/tlbflush.h> |
22 | #include <asm/cacheflush.h> | ||
22 | 23 | ||
23 | #include "mm.h" | 24 | #include "mm.h" |
24 | 25 | ||
@@ -69,6 +70,11 @@ mc_copy_user_page(void *from, void *to) | |||
69 | 70 | ||
70 | void v4_mc_copy_user_page(void *kto, const void *kfrom, unsigned long vaddr) | 71 | void v4_mc_copy_user_page(void *kto, const void *kfrom, unsigned long vaddr) |
71 | { | 72 | { |
73 | struct page *page = virt_to_page(kfrom); | ||
74 | |||
75 | if (test_and_clear_bit(PG_dcache_dirty, &page->flags)) | ||
76 | __flush_dcache_page(page_mapping(page), page); | ||
77 | |||
72 | spin_lock(&minicache_lock); | 78 | spin_lock(&minicache_lock); |
73 | 79 | ||
74 | set_pte_ext(TOP_PTE(0xffff8000), pfn_pte(__pa(kfrom) >> PAGE_SHIFT, minicache_pgprot), 0); | 80 | set_pte_ext(TOP_PTE(0xffff8000), pfn_pte(__pa(kfrom) >> PAGE_SHIFT, minicache_pgprot), 0); |
diff --git a/arch/arm/mm/copypage-v6.c b/arch/arm/mm/copypage-v6.c index 865777dec161..3adb79257f43 100644 --- a/arch/arm/mm/copypage-v6.c +++ b/arch/arm/mm/copypage-v6.c | |||
@@ -53,6 +53,10 @@ static void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned lo | |||
53 | { | 53 | { |
54 | unsigned int offset = CACHE_COLOUR(vaddr); | 54 | unsigned int offset = CACHE_COLOUR(vaddr); |
55 | unsigned long from, to; | 55 | unsigned long from, to; |
56 | struct page *page = virt_to_page(kfrom); | ||
57 | |||
58 | if (test_and_clear_bit(PG_dcache_dirty, &page->flags)) | ||
59 | __flush_dcache_page(page_mapping(page), page); | ||
56 | 60 | ||
57 | /* | 61 | /* |
58 | * Discard data in the kernel mapping for the new page. | 62 | * Discard data in the kernel mapping for the new page. |
diff --git a/arch/arm/mm/copypage-xscale.c b/arch/arm/mm/copypage-xscale.c index aea5da723596..2e455f82a4d5 100644 --- a/arch/arm/mm/copypage-xscale.c +++ b/arch/arm/mm/copypage-xscale.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/page.h> | 19 | #include <asm/page.h> |
20 | #include <asm/pgtable.h> | 20 | #include <asm/pgtable.h> |
21 | #include <asm/tlbflush.h> | 21 | #include <asm/tlbflush.h> |
22 | #include <asm/cacheflush.h> | ||
22 | 23 | ||
23 | #include "mm.h" | 24 | #include "mm.h" |
24 | 25 | ||
@@ -91,6 +92,11 @@ mc_copy_user_page(void *from, void *to) | |||
91 | 92 | ||
92 | void xscale_mc_copy_user_page(void *kto, const void *kfrom, unsigned long vaddr) | 93 | void xscale_mc_copy_user_page(void *kto, const void *kfrom, unsigned long vaddr) |
93 | { | 94 | { |
95 | struct page *page = virt_to_page(kfrom); | ||
96 | |||
97 | if (test_and_clear_bit(PG_dcache_dirty, &page->flags)) | ||
98 | __flush_dcache_page(page_mapping(page), page); | ||
99 | |||
94 | spin_lock(&minicache_lock); | 100 | spin_lock(&minicache_lock); |
95 | 101 | ||
96 | set_pte_ext(TOP_PTE(COPYPAGE_MINICACHE), pfn_pte(__pa(kfrom) >> PAGE_SHIFT, minicache_pgprot), 0); | 102 | set_pte_ext(TOP_PTE(COPYPAGE_MINICACHE), pfn_pte(__pa(kfrom) >> PAGE_SHIFT, minicache_pgprot), 0); |
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index e26cc1f59948..490d9d18a7d1 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c | |||
@@ -264,6 +264,18 @@ void VFP9_bounce(u32 trigger, u32 fpexc, struct pt_regs *regs) | |||
264 | vfp_raise_exceptions(exceptions, trigger, orig_fpscr, regs); | 264 | vfp_raise_exceptions(exceptions, trigger, orig_fpscr, regs); |
265 | } | 265 | } |
266 | 266 | ||
267 | static void vfp_enable(void *unused) | ||
268 | { | ||
269 | u32 access = get_copro_access(); | ||
270 | |||
271 | /* | ||
272 | * Enable full access to VFP (cp10 and cp11) | ||
273 | */ | ||
274 | set_copro_access(access | CPACC_FULL(10) | CPACC_FULL(11)); | ||
275 | } | ||
276 | |||
277 | #include <linux/smp.h> | ||
278 | |||
267 | /* | 279 | /* |
268 | * VFP support code initialisation. | 280 | * VFP support code initialisation. |
269 | */ | 281 | */ |
@@ -288,6 +300,7 @@ static int __init vfp_init(void) | |||
288 | * we just need to read the VFPSID register. | 300 | * we just need to read the VFPSID register. |
289 | */ | 301 | */ |
290 | vfpsid = fmrx(FPSID); | 302 | vfpsid = fmrx(FPSID); |
303 | barrier(); | ||
291 | 304 | ||
292 | printk(KERN_INFO "VFP support v0.3: "); | 305 | printk(KERN_INFO "VFP support v0.3: "); |
293 | if (VFP_arch) { | 306 | if (VFP_arch) { |
@@ -301,6 +314,8 @@ static int __init vfp_init(void) | |||
301 | } else if (vfpsid & FPSID_NODOUBLE) { | 314 | } else if (vfpsid & FPSID_NODOUBLE) { |
302 | printk("no double precision support\n"); | 315 | printk("no double precision support\n"); |
303 | } else { | 316 | } else { |
317 | smp_call_function(vfp_enable, NULL, 1, 1); | ||
318 | |||
304 | VFP_arch = (vfpsid & FPSID_ARCH_MASK) >> FPSID_ARCH_BIT; /* Extract the architecture version */ | 319 | VFP_arch = (vfpsid & FPSID_ARCH_MASK) >> FPSID_ARCH_BIT; /* Extract the architecture version */ |
305 | printk("implementor %02x architecture %d part %02x variant %x rev %x\n", | 320 | printk("implementor %02x architecture %d part %02x variant %x rev %x\n", |
306 | (vfpsid & FPSID_IMPLEMENTER_MASK) >> FPSID_IMPLEMENTER_BIT, | 321 | (vfpsid & FPSID_IMPLEMENTER_MASK) >> FPSID_IMPLEMENTER_BIT, |