diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-23 14:52:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-23 14:52:16 -0400 |
commit | 626f380d0b264a1e40237f5a2a3dffc5d14f256e (patch) | |
tree | 456889d94d219628c225ccef3ad4f2af0475cbf4 | |
parent | 32708e8e95265505d9627b3bc9ed16566e0dca1c (diff) | |
parent | bb38c222e07cbe252cfbd99cd6a9c834b0a2639a (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6:
sh: Fix up HAVE_PERF_COUNTERS typo.
sh: Fix up more dma-mapping fallout.
sh: SH7786 SMP support.
sh: Wire up the uncached fixmap on sh64 as well.
sh: Use local TLB flush in set_pte_phys().
sh: Provide cpu_idle_wait() to fix up cpuidle/SMP build.
-rw-r--r-- | arch/sh/Kconfig | 12 | ||||
-rw-r--r-- | arch/sh/include/asm/dma-mapping.h | 12 | ||||
-rw-r--r-- | arch/sh/include/asm/system.h | 1 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/Makefile | 6 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7786.c | 29 | ||||
-rw-r--r-- | arch/sh/kernel/idle.c | 23 | ||||
-rw-r--r-- | arch/sh/mm/init.c | 4 |
7 files changed, 52 insertions, 35 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index ac1c620d1c7d..e2bdd7b94fd9 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -15,7 +15,7 @@ config SUPERH | |||
15 | select HAVE_IOREMAP_PROT if MMU | 15 | select HAVE_IOREMAP_PROT if MMU |
16 | select HAVE_ARCH_TRACEHOOK | 16 | select HAVE_ARCH_TRACEHOOK |
17 | select HAVE_DMA_API_DEBUG | 17 | select HAVE_DMA_API_DEBUG |
18 | select HAVE_PERF_COUNTER | 18 | select HAVE_PERF_COUNTERS |
19 | select RTC_LIB | 19 | select RTC_LIB |
20 | select GENERIC_ATOMIC64 | 20 | select GENERIC_ATOMIC64 |
21 | help | 21 | help |
@@ -71,6 +71,9 @@ config GENERIC_HARDIRQS_NO__DO_IRQ | |||
71 | config GENERIC_IRQ_PROBE | 71 | config GENERIC_IRQ_PROBE |
72 | def_bool y | 72 | def_bool y |
73 | 73 | ||
74 | config IRQ_PER_CPU | ||
75 | def_bool y | ||
76 | |||
74 | config GENERIC_GPIO | 77 | config GENERIC_GPIO |
75 | def_bool n | 78 | def_bool n |
76 | 79 | ||
@@ -151,6 +154,9 @@ config ARCH_NO_VIRT_TO_BUS | |||
151 | config ARCH_HAS_DEFAULT_IDLE | 154 | config ARCH_HAS_DEFAULT_IDLE |
152 | def_bool y | 155 | def_bool y |
153 | 156 | ||
157 | config ARCH_HAS_CPU_IDLE_WAIT | ||
158 | def_bool y | ||
159 | |||
154 | config IO_TRAPPED | 160 | config IO_TRAPPED |
155 | bool | 161 | bool |
156 | 162 | ||
@@ -411,6 +417,8 @@ config CPU_SUBTYPE_SH7786 | |||
411 | select CPU_HAS_PTEAEX | 417 | select CPU_HAS_PTEAEX |
412 | select ARCH_SPARSEMEM_ENABLE | 418 | select ARCH_SPARSEMEM_ENABLE |
413 | select SYS_SUPPORTS_NUMA | 419 | select SYS_SUPPORTS_NUMA |
420 | select SYS_SUPPORTS_SMP | ||
421 | select GENERIC_CLOCKEVENTS_BROADCAST if SMP | ||
414 | 422 | ||
415 | config CPU_SUBTYPE_SHX3 | 423 | config CPU_SUBTYPE_SHX3 |
416 | bool "Support SH-X3 processor" | 424 | bool "Support SH-X3 processor" |
@@ -648,7 +656,7 @@ config NR_CPUS | |||
648 | int "Maximum number of CPUs (2-32)" | 656 | int "Maximum number of CPUs (2-32)" |
649 | range 2 32 | 657 | range 2 32 |
650 | depends on SMP | 658 | depends on SMP |
651 | default "4" if CPU_SHX3 | 659 | default "4" if CPU_SUBTYPE_SHX3 |
652 | default "2" | 660 | default "2" |
653 | help | 661 | help |
654 | This allows you to specify the maximum number of CPUs which this | 662 | This allows you to specify the maximum number of CPUs which this |
diff --git a/arch/sh/include/asm/dma-mapping.h b/arch/sh/include/asm/dma-mapping.h index ea9d4f41c9d2..69d56dd4c968 100644 --- a/arch/sh/include/asm/dma-mapping.h +++ b/arch/sh/include/asm/dma-mapping.h | |||
@@ -97,7 +97,7 @@ static inline void dma_unmap_page(struct device *dev, dma_addr_t dma_address, | |||
97 | dma_unmap_single(dev, dma_address, size, dir); | 97 | dma_unmap_single(dev, dma_address, size, dir); |
98 | } | 98 | } |
99 | 99 | ||
100 | static inline void dma_sync_single(struct device *dev, dma_addr_t dma_handle, | 100 | static inline void __dma_sync_single(struct device *dev, dma_addr_t dma_handle, |
101 | size_t size, enum dma_data_direction dir) | 101 | size_t size, enum dma_data_direction dir) |
102 | { | 102 | { |
103 | #if defined(CONFIG_PCI) && !defined(CONFIG_SH_PCIDMA_NONCOHERENT) | 103 | #if defined(CONFIG_PCI) && !defined(CONFIG_SH_PCIDMA_NONCOHERENT) |
@@ -119,7 +119,7 @@ static inline void dma_sync_single_range(struct device *dev, | |||
119 | dma_cache_sync(dev, phys_to_virt(dma_handle) + offset, size, dir); | 119 | dma_cache_sync(dev, phys_to_virt(dma_handle) + offset, size, dir); |
120 | } | 120 | } |
121 | 121 | ||
122 | static inline void dma_sync_sg(struct device *dev, struct scatterlist *sg, | 122 | static inline void __dma_sync_sg(struct device *dev, struct scatterlist *sg, |
123 | int nelems, enum dma_data_direction dir) | 123 | int nelems, enum dma_data_direction dir) |
124 | { | 124 | { |
125 | int i; | 125 | int i; |
@@ -137,7 +137,7 @@ static inline void dma_sync_single_for_cpu(struct device *dev, | |||
137 | dma_addr_t dma_handle, size_t size, | 137 | dma_addr_t dma_handle, size_t size, |
138 | enum dma_data_direction dir) | 138 | enum dma_data_direction dir) |
139 | { | 139 | { |
140 | dma_sync_single(dev, dma_handle, size, dir); | 140 | __dma_sync_single(dev, dma_handle, size, dir); |
141 | debug_dma_sync_single_for_cpu(dev, dma_handle, size, dir); | 141 | debug_dma_sync_single_for_cpu(dev, dma_handle, size, dir); |
142 | } | 142 | } |
143 | 143 | ||
@@ -146,7 +146,7 @@ static inline void dma_sync_single_for_device(struct device *dev, | |||
146 | size_t size, | 146 | size_t size, |
147 | enum dma_data_direction dir) | 147 | enum dma_data_direction dir) |
148 | { | 148 | { |
149 | dma_sync_single(dev, dma_handle, size, dir); | 149 | __dma_sync_single(dev, dma_handle, size, dir); |
150 | debug_dma_sync_single_for_device(dev, dma_handle, size, dir); | 150 | debug_dma_sync_single_for_device(dev, dma_handle, size, dir); |
151 | } | 151 | } |
152 | 152 | ||
@@ -177,7 +177,7 @@ static inline void dma_sync_sg_for_cpu(struct device *dev, | |||
177 | struct scatterlist *sg, int nelems, | 177 | struct scatterlist *sg, int nelems, |
178 | enum dma_data_direction dir) | 178 | enum dma_data_direction dir) |
179 | { | 179 | { |
180 | dma_sync_sg(dev, sg, nelems, dir); | 180 | __dma_sync_sg(dev, sg, nelems, dir); |
181 | debug_dma_sync_sg_for_cpu(dev, sg, nelems, dir); | 181 | debug_dma_sync_sg_for_cpu(dev, sg, nelems, dir); |
182 | } | 182 | } |
183 | 183 | ||
@@ -185,7 +185,7 @@ static inline void dma_sync_sg_for_device(struct device *dev, | |||
185 | struct scatterlist *sg, int nelems, | 185 | struct scatterlist *sg, int nelems, |
186 | enum dma_data_direction dir) | 186 | enum dma_data_direction dir) |
187 | { | 187 | { |
188 | dma_sync_sg(dev, sg, nelems, dir); | 188 | __dma_sync_sg(dev, sg, nelems, dir); |
189 | debug_dma_sync_sg_for_device(dev, sg, nelems, dir); | 189 | debug_dma_sync_sg_for_device(dev, sg, nelems, dir); |
190 | } | 190 | } |
191 | 191 | ||
diff --git a/arch/sh/include/asm/system.h b/arch/sh/include/asm/system.h index a88895e6dcb0..ab79e1f4fbe0 100644 --- a/arch/sh/include/asm/system.h +++ b/arch/sh/include/asm/system.h | |||
@@ -154,6 +154,7 @@ extern struct dentry *sh_debugfs_root; | |||
154 | 154 | ||
155 | void per_cpu_trap_init(void); | 155 | void per_cpu_trap_init(void); |
156 | void default_idle(void); | 156 | void default_idle(void); |
157 | void cpu_idle_wait(void); | ||
157 | 158 | ||
158 | asmlinkage void break_point_trap(void); | 159 | asmlinkage void break_point_trap(void); |
159 | 160 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/Makefile b/arch/sh/kernel/cpu/sh4a/Makefile index 96ea09ca8cc1..ebdd391d5f42 100644 --- a/arch/sh/kernel/cpu/sh4a/Makefile +++ b/arch/sh/kernel/cpu/sh4a/Makefile | |||
@@ -16,7 +16,7 @@ obj-$(CONFIG_CPU_SUBTYPE_SH7366) += setup-sh7366.o | |||
16 | obj-$(CONFIG_CPU_SUBTYPE_SHX3) += setup-shx3.o | 16 | obj-$(CONFIG_CPU_SUBTYPE_SHX3) += setup-shx3.o |
17 | 17 | ||
18 | # SMP setup | 18 | # SMP setup |
19 | smp-$(CONFIG_CPU_SUBTYPE_SHX3) := smp-shx3.o | 19 | smp-$(CONFIG_CPU_SHX3) := smp-shx3.o |
20 | 20 | ||
21 | # Primary on-chip clocks (common) | 21 | # Primary on-chip clocks (common) |
22 | clock-$(CONFIG_CPU_SUBTYPE_SH7763) := clock-sh7763.o | 22 | clock-$(CONFIG_CPU_SUBTYPE_SH7763) := clock-sh7763.o |
@@ -38,6 +38,6 @@ pinmux-$(CONFIG_CPU_SUBTYPE_SH7724) := pinmux-sh7724.o | |||
38 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7785) := pinmux-sh7785.o | 38 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7785) := pinmux-sh7785.o |
39 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7786) := pinmux-sh7786.o | 39 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7786) := pinmux-sh7786.o |
40 | 40 | ||
41 | obj-y += $(clock-y) | 41 | obj-y += $(clock-y) |
42 | obj-$(CONFIG_SMP) += $(smp-y) | 42 | obj-$(CONFIG_SMP) += $(smp-y) |
43 | obj-$(CONFIG_GENERIC_GPIO) += $(pinmux-y) | 43 | obj-$(CONFIG_GENERIC_GPIO) += $(pinmux-y) |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c index 93e0d2c017e8..b70049470a0b 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c | |||
@@ -595,9 +595,8 @@ enum { | |||
595 | HSPI, | 595 | HSPI, |
596 | GPIO0, GPIO1, | 596 | GPIO0, GPIO1, |
597 | Thermal, | 597 | Thermal, |
598 | INTC0, INTC1, INTC2, INTC3, INTC4, INTC5, INTC6, INTC7, | 598 | INTICI0, INTICI1, INTICI2, INTICI3, |
599 | 599 | INTICI4, INTICI5, INTICI6, INTICI7, | |
600 | /* interrupt groups */ | ||
601 | }; | 600 | }; |
602 | 601 | ||
603 | static struct intc_vect vectors[] __initdata = { | 602 | static struct intc_vect vectors[] __initdata = { |
@@ -638,10 +637,12 @@ static struct intc_vect vectors[] __initdata = { | |||
638 | INTC_VECT(HSPI, 0xe80), | 637 | INTC_VECT(HSPI, 0xe80), |
639 | INTC_VECT(GPIO0, 0xea0), INTC_VECT(GPIO1, 0xec0), | 638 | INTC_VECT(GPIO0, 0xea0), INTC_VECT(GPIO1, 0xec0), |
640 | INTC_VECT(Thermal, 0xee0), | 639 | INTC_VECT(Thermal, 0xee0), |
640 | INTC_VECT(INTICI0, 0xf00), INTC_VECT(INTICI1, 0xf20), | ||
641 | INTC_VECT(INTICI2, 0xf40), INTC_VECT(INTICI3, 0xf60), | ||
642 | INTC_VECT(INTICI4, 0xf80), INTC_VECT(INTICI5, 0xfa0), | ||
643 | INTC_VECT(INTICI6, 0xfc0), INTC_VECT(INTICI7, 0xfe0), | ||
641 | }; | 644 | }; |
642 | 645 | ||
643 | /* FIXME: Main CPU support only now */ | ||
644 | #if 1 /* Main CPU */ | ||
645 | #define CnINTMSK0 0xfe410030 | 646 | #define CnINTMSK0 0xfe410030 |
646 | #define CnINTMSK1 0xfe410040 | 647 | #define CnINTMSK1 0xfe410040 |
647 | #define CnINTMSKCLR0 0xfe410050 | 648 | #define CnINTMSKCLR0 0xfe410050 |
@@ -654,21 +655,6 @@ static struct intc_vect vectors[] __initdata = { | |||
654 | #define CnINT2MSKCR1 0xfe410a34 | 655 | #define CnINT2MSKCR1 0xfe410a34 |
655 | #define CnINT2MSKCR2 0xfe410a38 | 656 | #define CnINT2MSKCR2 0xfe410a38 |
656 | #define CnINT2MSKCR3 0xfe410a3c | 657 | #define CnINT2MSKCR3 0xfe410a3c |
657 | #else /* Sub CPU */ | ||
658 | #define CnINTMSK0 0xfe410034 | ||
659 | #define CnINTMSK1 0xfe410044 | ||
660 | #define CnINTMSKCLR0 0xfe410054 | ||
661 | #define CnINTMSKCLR1 0xfe410064 | ||
662 | #define CnINT2MSKR0 0xfe410b20 | ||
663 | #define CnINT2MSKR1 0xfe410b24 | ||
664 | #define CnINT2MSKR2 0xfe410b28 | ||
665 | #define CnINT2MSKR3 0xfe410b2c | ||
666 | #define CnINT2MSKCR0 0xfe410b30 | ||
667 | #define CnINT2MSKCR1 0xfe410b34 | ||
668 | #define CnINT2MSKCR2 0xfe410b38 | ||
669 | #define CnINT2MSKCR3 0xfe410b3c | ||
670 | #endif | ||
671 | |||
672 | #define INTMSK2 0xfe410068 | 658 | #define INTMSK2 0xfe410068 |
673 | #define INTMSKCLR2 0xfe41006c | 659 | #define INTMSKCLR2 0xfe41006c |
674 | 660 | ||
@@ -753,6 +739,9 @@ static struct intc_prio_reg prio_registers[] __initdata = { | |||
753 | GPIO1, Thermal } }, | 739 | GPIO1, Thermal } }, |
754 | { 0xfe41085c, 0, 32, 8, /* INT2PRI23 */ { 0, 0, 0, 0 } }, | 740 | { 0xfe41085c, 0, 32, 8, /* INT2PRI23 */ { 0, 0, 0, 0 } }, |
755 | { 0xfe410860, 0, 32, 8, /* INT2PRI24 */ { 0, 0, 0, 0 } }, | 741 | { 0xfe410860, 0, 32, 8, /* INT2PRI24 */ { 0, 0, 0, 0 } }, |
742 | { 0xfe410090, 0xfe4100a0, 32, 4, /* CnICIPRI / CnICIPRICLR */ | ||
743 | { INTICI7, INTICI6, INTICI5, INTICI4, | ||
744 | INTICI3, INTICI2, INTICI1, INTICI0 }, INTC_SMP(4, 2) }, | ||
756 | }; | 745 | }; |
757 | 746 | ||
758 | static DECLARE_INTC_DESC(intc_desc, "sh7786", vectors, NULL, | 747 | static DECLARE_INTC_DESC(intc_desc, "sh7786", vectors, NULL, |
diff --git a/arch/sh/kernel/idle.c b/arch/sh/kernel/idle.c index f35ed0348850..27ff2dc093c7 100644 --- a/arch/sh/kernel/idle.c +++ b/arch/sh/kernel/idle.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * The idle loop for all SuperH platforms. | 2 | * The idle loop for all SuperH platforms. |
3 | * | 3 | * |
4 | * Copyright (C) 2002 - 2008 Paul Mundt | 4 | * Copyright (C) 2002 - 2009 Paul Mundt |
5 | * | 5 | * |
6 | * This file is subject to the terms and conditions of the GNU General Public | 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 | 7 | * License. See the file "COPYING" in the main directory of this archive |
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/preempt.h> | 15 | #include <linux/preempt.h> |
16 | #include <linux/thread_info.h> | 16 | #include <linux/thread_info.h> |
17 | #include <linux/irqflags.h> | 17 | #include <linux/irqflags.h> |
18 | #include <linux/smp.h> | ||
18 | #include <asm/pgalloc.h> | 19 | #include <asm/pgalloc.h> |
19 | #include <asm/system.h> | 20 | #include <asm/system.h> |
20 | #include <asm/atomic.h> | 21 | #include <asm/atomic.h> |
@@ -79,3 +80,23 @@ void cpu_idle(void) | |||
79 | check_pgt_cache(); | 80 | check_pgt_cache(); |
80 | } | 81 | } |
81 | } | 82 | } |
83 | |||
84 | static void do_nothing(void *unused) | ||
85 | { | ||
86 | } | ||
87 | |||
88 | /* | ||
89 | * cpu_idle_wait - Used to ensure that all the CPUs discard old value of | ||
90 | * pm_idle and update to new pm_idle value. Required while changing pm_idle | ||
91 | * handler on SMP systems. | ||
92 | * | ||
93 | * Caller must have changed pm_idle to the new value before the call. Old | ||
94 | * pm_idle value will not be used by any CPU after the return of this function. | ||
95 | */ | ||
96 | void cpu_idle_wait(void) | ||
97 | { | ||
98 | smp_mb(); | ||
99 | /* kick all the CPUs so that they exit out of pm_idle */ | ||
100 | smp_call_function(do_nothing, NULL, 1); | ||
101 | } | ||
102 | EXPORT_SYMBOL_GPL(cpu_idle_wait); | ||
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index ee8e6bbe882c..fe532aeaa16d 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -70,7 +70,7 @@ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | |||
70 | } | 70 | } |
71 | 71 | ||
72 | set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, prot)); | 72 | set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, prot)); |
73 | flush_tlb_one(get_asid(), addr); | 73 | local_flush_tlb_one(get_asid(), addr); |
74 | } | 74 | } |
75 | 75 | ||
76 | /* | 76 | /* |
@@ -177,10 +177,8 @@ void __init paging_init(void) | |||
177 | 177 | ||
178 | free_area_init_nodes(max_zone_pfns); | 178 | free_area_init_nodes(max_zone_pfns); |
179 | 179 | ||
180 | #ifdef CONFIG_SUPERH32 | ||
181 | /* Set up the uncached fixmap */ | 180 | /* Set up the uncached fixmap */ |
182 | set_fixmap_nocache(FIX_UNCACHED, __pa(&__uncached_start)); | 181 | set_fixmap_nocache(FIX_UNCACHED, __pa(&__uncached_start)); |
183 | #endif | ||
184 | } | 182 | } |
185 | 183 | ||
186 | static struct kcore_list kcore_mem, kcore_vmalloc; | 184 | static struct kcore_list kcore_mem, kcore_vmalloc; |