Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge master.kernel.org:/home/rmk/linux-2.6-arm

+250 -57
+7
arch/arm/Kconfig
··· 349 349 depends on SMP 350 350 default "4" 351 351 352 + config HOTPLUG_CPU 353 + bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" 354 + depends on SMP && HOTPLUG && EXPERIMENTAL 355 + help 356 + Say Y here to experiment with turning CPUs off and on. CPUs 357 + can be controlled through /sys/devices/system/cpu. 358 + 352 359 config PREEMPT 353 360 bool "Preemptible Kernel (EXPERIMENTAL)" 354 361 depends on EXPERIMENTAL
+31
arch/arm/kernel/irq.c
··· 1050 1050 } 1051 1051 1052 1052 __setup("noirqdebug", noirqdebug_setup); 1053 + 1054 + #ifdef CONFIG_HOTPLUG_CPU 1055 + /* 1056 + * The CPU has been marked offline. Migrate IRQs off this CPU. If 1057 + * the affinity settings do not allow other CPUs, force them onto any 1058 + * available CPU. 1059 + */ 1060 + void migrate_irqs(void) 1061 + { 1062 + unsigned int i, cpu = smp_processor_id(); 1063 + 1064 + for (i = 0; i < NR_IRQS; i++) { 1065 + struct irqdesc *desc = irq_desc + i; 1066 + 1067 + if (desc->cpu == cpu) { 1068 + unsigned int newcpu = any_online_cpu(desc->affinity); 1069 + 1070 + if (newcpu == NR_CPUS) { 1071 + if (printk_ratelimit()) 1072 + printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n", 1073 + i, cpu); 1074 + 1075 + cpus_setall(desc->affinity); 1076 + newcpu = any_online_cpu(desc->affinity); 1077 + } 1078 + 1079 + route_irq(desc, i, newcpu); 1080 + } 1081 + } 1082 + } 1083 + #endif /* CONFIG_HOTPLUG_CPU */
+9
arch/arm/kernel/process.c
··· 26 26 #include <linux/interrupt.h> 27 27 #include <linux/kallsyms.h> 28 28 #include <linux/init.h> 29 + #include <linux/cpu.h> 29 30 30 31 #include <asm/system.h> 31 32 #include <asm/io.h> ··· 106 105 /* endless idle loop with no priority at all */ 107 106 while (1) { 108 107 void (*idle)(void) = pm_idle; 108 + 109 + #ifdef CONFIG_HOTPLUG_CPU 110 + if (cpu_is_offline(smp_processor_id())) { 111 + leds_event(led_idle_start); 112 + cpu_die(); 113 + } 114 + #endif 115 + 109 116 if (!idle) 110 117 idle = default_idle; 111 118 preempt_disable();
+100 -9
arch/arm/kernel/smp.c
··· 80 80 81 81 int __cpuinit __cpu_up(unsigned int cpu) 82 82 { 83 - struct task_struct *idle; 83 + struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu); 84 + struct task_struct *idle = ci->idle; 84 85 pgd_t *pgd; 85 86 pmd_t *pmd; 86 87 int ret; 87 88 88 89 /* 89 - * Spawn a new process manually. Grab a pointer to 90 - * its task struct so we can mess with it 90 + * Spawn a new process manually, if not already done. 91 + * Grab a pointer to its task struct so we can mess with it 91 92 */ 92 - idle = fork_idle(cpu); 93 - if (IS_ERR(idle)) { 94 - printk(KERN_ERR "CPU%u: fork() failed\n", cpu); 95 - return PTR_ERR(idle); 93 + if (!idle) { 94 + idle = fork_idle(cpu); 95 + if (IS_ERR(idle)) { 96 + printk(KERN_ERR "CPU%u: fork() failed\n", cpu); 97 + return PTR_ERR(idle); 98 + } 99 + ci->idle = idle; 96 100 } 97 101 98 102 /* ··· 158 154 159 155 return ret; 160 156 } 157 + 158 + #ifdef CONFIG_HOTPLUG_CPU 159 + /* 160 + * __cpu_disable runs on the processor to be shutdown. 161 + */ 162 + int __cpuexit __cpu_disable(void) 163 + { 164 + unsigned int cpu = smp_processor_id(); 165 + struct task_struct *p; 166 + int ret; 167 + 168 + ret = mach_cpu_disable(cpu); 169 + if (ret) 170 + return ret; 171 + 172 + /* 173 + * Take this CPU offline. Once we clear this, we can't return, 174 + * and we must not schedule until we're ready to give up the cpu. 175 + */ 176 + cpu_clear(cpu, cpu_online_map); 177 + 178 + /* 179 + * OK - migrate IRQs away from this CPU 180 + */ 181 + migrate_irqs(); 182 + 183 + /* 184 + * Flush user cache and TLB mappings, and then remove this CPU 185 + * from the vm mask set of all processes. 186 + */ 187 + flush_cache_all(); 188 + local_flush_tlb_all(); 189 + 190 + read_lock(&tasklist_lock); 191 + for_each_process(p) { 192 + if (p->mm) 193 + cpu_clear(cpu, p->mm->cpu_vm_mask); 194 + } 195 + read_unlock(&tasklist_lock); 196 + 197 + return 0; 198 + } 199 + 200 + /* 201 + * called on the thread which is asking for a CPU to be shutdown - 202 + * waits until shutdown has completed, or it is timed out. 203 + */ 204 + void __cpuexit __cpu_die(unsigned int cpu) 205 + { 206 + if (!platform_cpu_kill(cpu)) 207 + printk("CPU%u: unable to kill\n", cpu); 208 + } 209 + 210 + /* 211 + * Called from the idle thread for the CPU which has been shutdown. 212 + * 213 + * Note that we disable IRQs here, but do not re-enable them 214 + * before returning to the caller. This is also the behaviour 215 + * of the other hotplug-cpu capable cores, so presumably coming 216 + * out of idle fixes this. 217 + */ 218 + void __cpuexit cpu_die(void) 219 + { 220 + unsigned int cpu = smp_processor_id(); 221 + 222 + local_irq_disable(); 223 + idle_task_exit(); 224 + 225 + /* 226 + * actual CPU shutdown procedure is at least platform (if not 227 + * CPU) specific 228 + */ 229 + platform_cpu_die(cpu); 230 + 231 + /* 232 + * Do not return to the idle loop - jump back to the secondary 233 + * cpu initialisation. There's some initialisation which needs 234 + * to be repeated to undo the effects of taking the CPU offline. 235 + */ 236 + __asm__("mov sp, %0\n" 237 + " b secondary_start_kernel" 238 + : 239 + : "r" ((void *)current->thread_info + THREAD_SIZE - 8)); 240 + } 241 + #endif /* CONFIG_HOTPLUG_CPU */ 161 242 162 243 /* 163 244 * This is the secondary CPU boot entry. We're using this CPUs ··· 325 236 { 326 237 unsigned int cpu = smp_processor_id(); 327 238 239 + per_cpu(cpu_data, cpu).idle = current; 240 + 328 241 cpu_set(cpu, cpu_possible_map); 329 242 cpu_set(cpu, cpu_present_map); 330 243 cpu_set(cpu, cpu_online_map); ··· 400 309 printk(KERN_CRIT 401 310 "CPU%u: smp_call_function timeout for %p(%p)\n" 402 311 " callmap %lx pending %lx, %swait\n", 403 - smp_processor_id(), func, info, callmap, data.pending, 404 - wait ? "" : "no "); 312 + smp_processor_id(), func, info, *cpus_addr(callmap), 313 + *cpus_addr(data.pending), wait ? "" : "no "); 405 314 406 315 /* 407 316 * TRACE
+37 -7
arch/arm/mach-realview/realview_eb.c
··· 43 43 #include "clock.h" 44 44 45 45 static struct map_desc realview_eb_io_desc[] __initdata = { 46 - { IO_ADDRESS(REALVIEW_SYS_BASE), REALVIEW_SYS_BASE, SZ_4K, MT_DEVICE }, 47 - { IO_ADDRESS(REALVIEW_GIC_CPU_BASE), REALVIEW_GIC_CPU_BASE, SZ_4K, MT_DEVICE }, 48 - { IO_ADDRESS(REALVIEW_GIC_DIST_BASE), REALVIEW_GIC_DIST_BASE, SZ_4K, MT_DEVICE }, 49 - { IO_ADDRESS(REALVIEW_SCTL_BASE), REALVIEW_SCTL_BASE, SZ_4K, MT_DEVICE }, 50 - { IO_ADDRESS(REALVIEW_TIMER0_1_BASE), REALVIEW_TIMER0_1_BASE, SZ_4K, MT_DEVICE }, 51 - { IO_ADDRESS(REALVIEW_TIMER2_3_BASE), REALVIEW_TIMER2_3_BASE, SZ_4K, MT_DEVICE }, 46 + { 47 + .virtual = IO_ADDRESS(REALVIEW_SYS_BASE), 48 + .pfn = __phys_to_pfn(REALVIEW_SYS_BASE), 49 + .length = SZ_4K, 50 + .type = MT_DEVICE, 51 + }, { 52 + .virtual = IO_ADDRESS(REALVIEW_GIC_CPU_BASE), 53 + .pfn = __phys_to_pfn(REALVIEW_GIC_CPU_BASE), 54 + .length = SZ_4K, 55 + .type = MT_DEVICE, 56 + }, { 57 + .virtual = IO_ADDRESS(REALVIEW_GIC_DIST_BASE), 58 + .pfn = __phys_to_pfn(REALVIEW_GIC_DIST_BASE), 59 + .length = SZ_4K, 60 + .type = MT_DEVICE, 61 + }, { 62 + .virtual = IO_ADDRESS(REALVIEW_SCTL_BASE), 63 + .pfn = __phys_to_pfn(REALVIEW_SCTL_BASE), 64 + .length = SZ_4K, 65 + .type = MT_DEVICE, 66 + }, { 67 + .virtual = IO_ADDRESS(REALVIEW_TIMER0_1_BASE), 68 + .pfn = __phys_to_pfn(REALVIEW_TIMER0_1_BASE), 69 + .length = SZ_4K, 70 + .type = MT_DEVICE, 71 + }, { 72 + .virtual = IO_ADDRESS(REALVIEW_TIMER2_3_BASE), 73 + .pfn = __phys_to_pfn(REALVIEW_TIMER2_3_BASE), 74 + .length = SZ_4K, 75 + .type = MT_DEVICE, 76 + }, 52 77 #ifdef CONFIG_DEBUG_LL 53 - { IO_ADDRESS(REALVIEW_UART0_BASE), REALVIEW_UART0_BASE, SZ_4K, MT_DEVICE }, 78 + { 79 + .virtual = IO_ADDRESS(REALVIEW_UART0_BASE), 80 + .pfn = __phys_to_pfn(REALVIEW_UART0_BASE), 81 + .length = SZ_4K, 82 + .type = MT_DEVICE, 83 + } 54 84 #endif 55 85 }; 56 86
+8 -1
arch/arm/mm/init.c
··· 486 486 487 487 /* 488 488 * Ask the machine support to map in the statically mapped devices. 489 - * After this point, we can start to touch devices again. 490 489 */ 491 490 if (mdesc->map_io) 492 491 mdesc->map_io(); 492 + 493 + /* 494 + * Finally flush the tlb again - this ensures that we're in a 495 + * consistent state wrt the writebuffer if the writebuffer needs 496 + * draining. After this point, we can start to touch devices 497 + * again. 498 + */ 499 + local_flush_tlb_all(); 493 500 } 494 501 495 502 /*
+2 -2
drivers/video/amba-clcd.c
··· 505 505 static struct amba_id clcdfb_id_table[] = { 506 506 { 507 507 .id = 0x00041110, 508 - .mask = 0x000fffff, 508 + .mask = 0x000ffffe, 509 509 }, 510 510 { 0, 0 }, 511 511 }; 512 512 513 513 static struct amba_driver clcd_driver = { 514 514 .drv = { 515 - .name = "clcd-pl110", 515 + .name = "clcd-pl11x", 516 516 }, 517 517 .probe = clcdfb_probe, 518 518 .remove = clcdfb_remove,
+40 -34
include/asm-arm/arch-ixp4xx/io.h
··· 80 80 #define __arch_ioremap(a, s, f, x) __ixp4xx_ioremap(a, s, f, x) 81 81 #define __arch_iounmap(a) __ixp4xx_iounmap(a) 82 82 83 - #define writeb(p, v) __ixp4xx_writeb(p, v) 84 - #define writew(p, v) __ixp4xx_writew(p, v) 85 - #define writel(p, v) __ixp4xx_writel(p, v) 83 + #define writeb(v, p) __ixp4xx_writeb(v, p) 84 + #define writew(v, p) __ixp4xx_writew(v, p) 85 + #define writel(v, p) __ixp4xx_writel(v, p) 86 86 87 87 #define writesb(p, v, l) __ixp4xx_writesb(p, v, l) 88 88 #define writesw(p, v, l) __ixp4xx_writesw(p, v, l) ··· 97 97 #define readsl(p, v, l) __ixp4xx_readsl(p, v, l) 98 98 99 99 static inline void 100 - __ixp4xx_writeb(u8 value, u32 addr) 100 + __ixp4xx_writeb(u8 value, volatile void __iomem *p) 101 101 { 102 + u32 addr = (u32)p; 102 103 u32 n, byte_enables, data; 103 104 104 105 if (addr >= VMALLOC_START) { ··· 114 113 } 115 114 116 115 static inline void 117 - __ixp4xx_writesb(u32 bus_addr, const u8 *vaddr, int count) 116 + __ixp4xx_writesb(volatile void __iomem *bus_addr, const u8 *vaddr, int count) 118 117 { 119 118 while (count--) 120 119 writeb(*vaddr++, bus_addr); 121 120 } 122 121 123 122 static inline void 124 - __ixp4xx_writew(u16 value, u32 addr) 123 + __ixp4xx_writew(u16 value, volatile void __iomem *p) 125 124 { 125 + u32 addr = (u32)p; 126 126 u32 n, byte_enables, data; 127 127 128 128 if (addr >= VMALLOC_START) { ··· 138 136 } 139 137 140 138 static inline void 141 - __ixp4xx_writesw(u32 bus_addr, const u16 *vaddr, int count) 139 + __ixp4xx_writesw(volatile void __iomem *bus_addr, const u16 *vaddr, int count) 142 140 { 143 141 while (count--) 144 142 writew(*vaddr++, bus_addr); 145 143 } 146 144 147 145 static inline void 148 - __ixp4xx_writel(u32 value, u32 addr) 146 + __ixp4xx_writel(u32 value, volatile void __iomem *p) 149 147 { 148 + u32 addr = (u32)p; 150 149 if (addr >= VMALLOC_START) { 151 150 __raw_writel(value, addr); 152 151 return; ··· 157 154 } 158 155 159 156 static inline void 160 - __ixp4xx_writesl(u32 bus_addr, const u32 *vaddr, int count) 157 + __ixp4xx_writesl(volatile void __iomem *bus_addr, const u32 *vaddr, int count) 161 158 { 162 159 while (count--) 163 160 writel(*vaddr++, bus_addr); 164 161 } 165 162 166 163 static inline unsigned char 167 - __ixp4xx_readb(u32 addr) 164 + __ixp4xx_readb(const volatile void __iomem *p) 168 165 { 166 + u32 addr = (u32)p; 169 167 u32 n, byte_enables, data; 170 168 171 169 if (addr >= VMALLOC_START) ··· 181 177 } 182 178 183 179 static inline void 184 - __ixp4xx_readsb(u32 bus_addr, u8 *vaddr, u32 count) 180 + __ixp4xx_readsb(const volatile void __iomem *bus_addr, u8 *vaddr, u32 count) 185 181 { 186 182 while (count--) 187 183 *vaddr++ = readb(bus_addr); 188 184 } 189 185 190 186 static inline unsigned short 191 - __ixp4xx_readw(u32 addr) 187 + __ixp4xx_readw(const volatile void __iomem *p) 192 188 { 189 + u32 addr = (u32)p; 193 190 u32 n, byte_enables, data; 194 191 195 192 if (addr >= VMALLOC_START) ··· 205 200 } 206 201 207 202 static inline void 208 - __ixp4xx_readsw(u32 bus_addr, u16 *vaddr, u32 count) 203 + __ixp4xx_readsw(const volatile void __iomem *bus_addr, u16 *vaddr, u32 count) 209 204 { 210 205 while (count--) 211 206 *vaddr++ = readw(bus_addr); 212 207 } 213 208 214 209 static inline unsigned long 215 - __ixp4xx_readl(u32 addr) 210 + __ixp4xx_readl(const volatile void __iomem *p) 216 211 { 212 + u32 addr = (u32)p; 217 213 u32 data; 218 214 219 215 if (addr >= VMALLOC_START) ··· 227 221 } 228 222 229 223 static inline void 230 - __ixp4xx_readsl(u32 bus_addr, u32 *vaddr, u32 count) 224 + __ixp4xx_readsl(const volatile void __iomem *bus_addr, u32 *vaddr, u32 count) 231 225 { 232 226 while (count--) 233 227 *vaddr++ = readl(bus_addr); ··· 245 239 eth_copy_and_sum((s),__mem_pci(c),(l),(b)) 246 240 247 241 static inline int 248 - check_signature(unsigned long bus_addr, const unsigned char *signature, 242 + check_signature(const unsigned char __iomem *bus_addr, const unsigned char *signature, 249 243 int length) 250 244 { 251 245 int retval = 0; ··· 395 389 #define __is_io_address(p) (((unsigned long)p >= PIO_OFFSET) && \ 396 390 ((unsigned long)p <= (PIO_MASK + PIO_OFFSET))) 397 391 static inline unsigned int 398 - __ixp4xx_ioread8(void __iomem *addr) 392 + __ixp4xx_ioread8(const void __iomem *addr) 399 393 { 400 394 unsigned long port = (unsigned long __force)addr; 401 395 if (__is_io_address(port)) ··· 404 398 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 405 399 return (unsigned int)__raw_readb(port); 406 400 #else 407 - return (unsigned int)__ixp4xx_readb(port); 401 + return (unsigned int)__ixp4xx_readb(addr); 408 402 #endif 409 403 } 410 404 411 405 static inline void 412 - __ixp4xx_ioread8_rep(void __iomem *addr, void *vaddr, u32 count) 406 + __ixp4xx_ioread8_rep(const void __iomem *addr, void *vaddr, u32 count) 413 407 { 414 408 unsigned long port = (unsigned long __force)addr; 415 409 if (__is_io_address(port)) ··· 418 412 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 419 413 __raw_readsb(addr, vaddr, count); 420 414 #else 421 - __ixp4xx_readsb(port, vaddr, count); 415 + __ixp4xx_readsb(addr, vaddr, count); 422 416 #endif 423 417 } 424 418 425 419 static inline unsigned int 426 - __ixp4xx_ioread16(void __iomem *addr) 420 + __ixp4xx_ioread16(const void __iomem *addr) 427 421 { 428 422 unsigned long port = (unsigned long __force)addr; 429 423 if (__is_io_address(port)) ··· 432 426 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 433 427 return le16_to_cpu(__raw_readw((u32)port)); 434 428 #else 435 - return (unsigned int)__ixp4xx_readw((u32)port); 429 + return (unsigned int)__ixp4xx_readw(addr); 436 430 #endif 437 431 } 438 432 439 433 static inline void 440 - __ixp4xx_ioread16_rep(void __iomem *addr, void *vaddr, u32 count) 434 + __ixp4xx_ioread16_rep(const void __iomem *addr, void *vaddr, u32 count) 441 435 { 442 436 unsigned long port = (unsigned long __force)addr; 443 437 if (__is_io_address(port)) ··· 446 440 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 447 441 __raw_readsw(addr, vaddr, count); 448 442 #else 449 - __ixp4xx_readsw(port, vaddr, count); 443 + __ixp4xx_readsw(addr, vaddr, count); 450 444 #endif 451 445 } 452 446 453 447 static inline unsigned int 454 - __ixp4xx_ioread32(void __iomem *addr) 448 + __ixp4xx_ioread32(const void __iomem *addr) 455 449 { 456 450 unsigned long port = (unsigned long __force)addr; 457 451 if (__is_io_address(port)) ··· 460 454 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 461 455 return le32_to_cpu(__raw_readl((u32)port)); 462 456 #else 463 - return (unsigned int)__ixp4xx_readl((u32)port); 457 + return (unsigned int)__ixp4xx_readl(addr); 464 458 #endif 465 459 } 466 460 } 467 461 468 462 static inline void 469 - __ixp4xx_ioread32_rep(void __iomem *addr, void *vaddr, u32 count) 463 + __ixp4xx_ioread32_rep(const void __iomem *addr, void *vaddr, u32 count) 470 464 { 471 465 unsigned long port = (unsigned long __force)addr; 472 466 if (__is_io_address(port)) ··· 475 469 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 476 470 __raw_readsl(addr, vaddr, count); 477 471 #else 478 - __ixp4xx_readsl(port, vaddr, count); 472 + __ixp4xx_readsl(addr, vaddr, count); 479 473 #endif 480 474 } 481 475 ··· 489 483 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 490 484 __raw_writeb(value, port); 491 485 #else 492 - __ixp4xx_writeb(value, port); 486 + __ixp4xx_writeb(value, addr); 493 487 #endif 494 488 } 495 489 ··· 503 497 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 504 498 __raw_writesb(addr, vaddr, count); 505 499 #else 506 - __ixp4xx_writesb(port, vaddr, count); 500 + __ixp4xx_writesb(addr, vaddr, count); 507 501 #endif 508 502 } 509 503 ··· 517 511 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 518 512 __raw_writew(cpu_to_le16(value), addr); 519 513 #else 520 - __ixp4xx_writew(value, port); 514 + __ixp4xx_writew(value, addr); 521 515 #endif 522 516 } 523 517 ··· 531 525 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 532 526 __raw_writesw(addr, vaddr, count); 533 527 #else 534 - __ixp4xx_writesw(port, vaddr, count); 528 + __ixp4xx_writesw(addr, vaddr, count); 535 529 #endif 536 530 } 537 531 ··· 545 539 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 546 540 __raw_writel(cpu_to_le32(value), port); 547 541 #else 548 - __ixp4xx_writel(value, port); 542 + __ixp4xx_writel(value, addr); 549 543 #endif 550 544 } 551 545 ··· 559 553 #ifndef CONFIG_IXP4XX_INDIRECT_PCI 560 554 __raw_writesl(addr, vaddr, count); 561 555 #else 562 - __ixp4xx_writesl(port, vaddr, count); 556 + __ixp4xx_writesl(addr, vaddr, count); 563 557 #endif 564 558 } 565 559
+1 -1
include/asm-arm/arch-realview/memory.h
··· 23 23 /* 24 24 * Physical DRAM offset. 25 25 */ 26 - #define PHYS_OFFSET (0x00000000UL) 26 + #define PHYS_OFFSET UL(0x00000000) 27 27 28 28 /* 29 29 * Virtual view <-> DMA view memory address translations
+1
include/asm-arm/cpu.h
··· 16 16 struct cpuinfo_arm { 17 17 struct cpu cpu; 18 18 #ifdef CONFIG_SMP 19 + struct task_struct *idle; 19 20 unsigned int loops_per_jiffy; 20 21 #endif 21 22 };
+1
include/asm-arm/irq.h
··· 47 47 struct pt_regs; 48 48 int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); 49 49 50 + extern void migrate_irqs(void); 50 51 #endif 51 52
+10
include/asm-arm/smp.h
··· 66 66 }; 67 67 extern struct secondary_data secondary_data; 68 68 69 + extern int __cpu_disable(void); 70 + extern int mach_cpu_disable(unsigned int cpu); 71 + 72 + extern void __cpu_die(unsigned int cpu); 73 + extern void cpu_die(void); 74 + 75 + extern void platform_cpu_die(unsigned int cpu); 76 + extern int platform_cpu_kill(unsigned int cpu); 77 + extern void platform_cpu_enable(unsigned int cpu); 78 + 69 79 #endif /* ifndef __ASM_ARM_SMP_H */
+3 -3
include/asm-arm/spinlock.h
··· 80 80 */ 81 81 #define rwlock_is_locked(x) (*((volatile unsigned int *)(x)) != 0) 82 82 83 - static inline void __raw_write_lock(rwlock_t *rw) 83 + static inline void __raw_write_lock(raw_rwlock_t *rw) 84 84 { 85 85 unsigned long tmp; 86 86 ··· 97 97 smp_mb(); 98 98 } 99 99 100 - static inline int __raw_write_trylock(rwlock_t *rw) 100 + static inline int __raw_write_trylock(raw_rwlock_t *rw) 101 101 { 102 102 unsigned long tmp; 103 103 ··· 157 157 smp_mb(); 158 158 } 159 159 160 - static inline void __raw_read_unlock(rwlock_t *rw) 160 + static inline void __raw_read_unlock(raw_rwlock_t *rw) 161 161 { 162 162 unsigned long tmp, tmp2; 163 163