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.

+52 -35
+10 -2
arch/sh/Kconfig
··· 15 15 select HAVE_IOREMAP_PROT if MMU 16 16 select HAVE_ARCH_TRACEHOOK 17 17 select HAVE_DMA_API_DEBUG 18 - select HAVE_PERF_COUNTER 18 + select HAVE_PERF_COUNTERS 19 19 select RTC_LIB 20 20 select GENERIC_ATOMIC64 21 21 help ··· 69 69 def_bool y 70 70 71 71 config GENERIC_IRQ_PROBE 72 + def_bool y 73 + 74 + config IRQ_PER_CPU 72 75 def_bool y 73 76 74 77 config GENERIC_GPIO ··· 152 149 def_bool y 153 150 154 151 config ARCH_HAS_DEFAULT_IDLE 152 + def_bool y 153 + 154 + config ARCH_HAS_CPU_IDLE_WAIT 155 155 def_bool y 156 156 157 157 config IO_TRAPPED ··· 417 411 select CPU_HAS_PTEAEX 418 412 select ARCH_SPARSEMEM_ENABLE 419 413 select SYS_SUPPORTS_NUMA 414 + select SYS_SUPPORTS_SMP 415 + select GENERIC_CLOCKEVENTS_BROADCAST if SMP 420 416 421 417 config CPU_SUBTYPE_SHX3 422 418 bool "Support SH-X3 processor" ··· 656 648 int "Maximum number of CPUs (2-32)" 657 649 range 2 32 658 650 depends on SMP 659 - default "4" if CPU_SHX3 651 + default "4" if CPU_SUBTYPE_SHX3 660 652 default "2" 661 653 help 662 654 This allows you to specify the maximum number of CPUs which this
+6 -6
arch/sh/include/asm/dma-mapping.h
··· 97 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 101 size_t size, enum dma_data_direction dir) 102 102 { 103 103 #if defined(CONFIG_PCI) && !defined(CONFIG_SH_PCIDMA_NONCOHERENT) ··· 119 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 123 int nelems, enum dma_data_direction dir) 124 124 { 125 125 int i; ··· 137 137 dma_addr_t dma_handle, size_t size, 138 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 141 debug_dma_sync_single_for_cpu(dev, dma_handle, size, dir); 142 142 } 143 143 ··· 146 146 size_t size, 147 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 150 debug_dma_sync_single_for_device(dev, dma_handle, size, dir); 151 151 } 152 152 ··· 177 177 struct scatterlist *sg, int nelems, 178 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 181 debug_dma_sync_sg_for_cpu(dev, sg, nelems, dir); 182 182 } 183 183 ··· 185 185 struct scatterlist *sg, int nelems, 186 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 189 debug_dma_sync_sg_for_device(dev, sg, nelems, dir); 190 190 } 191 191
+1
arch/sh/include/asm/system.h
··· 154 154 155 155 void per_cpu_trap_init(void); 156 156 void default_idle(void); 157 + void cpu_idle_wait(void); 157 158 158 159 asmlinkage void break_point_trap(void); 159 160
+3 -3
arch/sh/kernel/cpu/sh4a/Makefile
··· 16 16 obj-$(CONFIG_CPU_SUBTYPE_SHX3) += setup-shx3.o 17 17 18 18 # SMP setup 19 - smp-$(CONFIG_CPU_SUBTYPE_SHX3) := smp-shx3.o 19 + smp-$(CONFIG_CPU_SHX3) := smp-shx3.o 20 20 21 21 # Primary on-chip clocks (common) 22 22 clock-$(CONFIG_CPU_SUBTYPE_SH7763) := clock-sh7763.o ··· 38 38 pinmux-$(CONFIG_CPU_SUBTYPE_SH7785) := pinmux-sh7785.o 39 39 pinmux-$(CONFIG_CPU_SUBTYPE_SH7786) := pinmux-sh7786.o 40 40 41 - obj-y += $(clock-y) 42 - obj-$(CONFIG_SMP) += $(smp-y) 41 + obj-y += $(clock-y) 42 + obj-$(CONFIG_SMP) += $(smp-y) 43 43 obj-$(CONFIG_GENERIC_GPIO) += $(pinmux-y)
+9 -20
arch/sh/kernel/cpu/sh4a/setup-sh7786.c
··· 595 595 HSPI, 596 596 GPIO0, GPIO1, 597 597 Thermal, 598 - INTC0, INTC1, INTC2, INTC3, INTC4, INTC5, INTC6, INTC7, 599 - 600 - /* interrupt groups */ 598 + INTICI0, INTICI1, INTICI2, INTICI3, 599 + INTICI4, INTICI5, INTICI6, INTICI7, 601 600 }; 602 601 603 602 static struct intc_vect vectors[] __initdata = { ··· 637 638 INTC_VECT(HSPI, 0xe80), 638 639 INTC_VECT(GPIO0, 0xea0), INTC_VECT(GPIO1, 0xec0), 639 640 INTC_VECT(Thermal, 0xee0), 641 + INTC_VECT(INTICI0, 0xf00), INTC_VECT(INTICI1, 0xf20), 642 + INTC_VECT(INTICI2, 0xf40), INTC_VECT(INTICI3, 0xf60), 643 + INTC_VECT(INTICI4, 0xf80), INTC_VECT(INTICI5, 0xfa0), 644 + INTC_VECT(INTICI6, 0xfc0), INTC_VECT(INTICI7, 0xfe0), 640 645 }; 641 646 642 - /* FIXME: Main CPU support only now */ 643 - #if 1 /* Main CPU */ 644 647 #define CnINTMSK0 0xfe410030 645 648 #define CnINTMSK1 0xfe410040 646 649 #define CnINTMSKCLR0 0xfe410050 ··· 655 654 #define CnINT2MSKCR1 0xfe410a34 656 655 #define CnINT2MSKCR2 0xfe410a38 657 656 #define CnINT2MSKCR3 0xfe410a3c 658 - #else /* Sub CPU */ 659 - #define CnINTMSK0 0xfe410034 660 - #define CnINTMSK1 0xfe410044 661 - #define CnINTMSKCLR0 0xfe410054 662 - #define CnINTMSKCLR1 0xfe410064 663 - #define CnINT2MSKR0 0xfe410b20 664 - #define CnINT2MSKR1 0xfe410b24 665 - #define CnINT2MSKR2 0xfe410b28 666 - #define CnINT2MSKR3 0xfe410b2c 667 - #define CnINT2MSKCR0 0xfe410b30 668 - #define CnINT2MSKCR1 0xfe410b34 669 - #define CnINT2MSKCR2 0xfe410b38 670 - #define CnINT2MSKCR3 0xfe410b3c 671 - #endif 672 - 673 657 #define INTMSK2 0xfe410068 674 658 #define INTMSKCLR2 0xfe41006c 675 659 ··· 739 753 GPIO1, Thermal } }, 740 754 { 0xfe41085c, 0, 32, 8, /* INT2PRI23 */ { 0, 0, 0, 0 } }, 741 755 { 0xfe410860, 0, 32, 8, /* INT2PRI24 */ { 0, 0, 0, 0 } }, 756 + { 0xfe410090, 0xfe4100a0, 32, 4, /* CnICIPRI / CnICIPRICLR */ 757 + { INTICI7, INTICI6, INTICI5, INTICI4, 758 + INTICI3, INTICI2, INTICI1, INTICI0 }, INTC_SMP(4, 2) }, 742 759 }; 743 760 744 761 static DECLARE_INTC_DESC(intc_desc, "sh7786", vectors, NULL,
+22 -1
arch/sh/kernel/idle.c
··· 1 1 /* 2 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 6 * This file is subject to the terms and conditions of the GNU General Public 7 7 * License. See the file "COPYING" in the main directory of this archive ··· 15 15 #include <linux/preempt.h> 16 16 #include <linux/thread_info.h> 17 17 #include <linux/irqflags.h> 18 + #include <linux/smp.h> 18 19 #include <asm/pgalloc.h> 19 20 #include <asm/system.h> 20 21 #include <asm/atomic.h> ··· 80 79 check_pgt_cache(); 81 80 } 82 81 } 82 + 83 + static void do_nothing(void *unused) 84 + { 85 + } 86 + 87 + /* 88 + * cpu_idle_wait - Used to ensure that all the CPUs discard old value of 89 + * pm_idle and update to new pm_idle value. Required while changing pm_idle 90 + * handler on SMP systems. 91 + * 92 + * Caller must have changed pm_idle to the new value before the call. Old 93 + * pm_idle value will not be used by any CPU after the return of this function. 94 + */ 95 + void cpu_idle_wait(void) 96 + { 97 + smp_mb(); 98 + /* kick all the CPUs so that they exit out of pm_idle */ 99 + smp_call_function(do_nothing, NULL, 1); 100 + } 101 + EXPORT_SYMBOL_GPL(cpu_idle_wait);
+1 -3
arch/sh/mm/init.c
··· 70 70 } 71 71 72 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 177 178 178 free_area_init_nodes(max_zone_pfns); 179 179 180 - #ifdef CONFIG_SUPERH32 181 180 /* Set up the uncached fixmap */ 182 181 set_fixmap_nocache(FIX_UNCACHED, __pa(&__uncached_start)); 183 - #endif 184 182 } 185 183 186 184 static struct kcore_list kcore_mem, kcore_vmalloc;