diff options
| -rw-r--r-- | Documentation/hwmon/ibmaem | 33 | ||||
| -rw-r--r-- | Documentation/vm/page_migration | 9 | ||||
| -rw-r--r-- | MAINTAINERS | 18 | ||||
| -rw-r--r-- | arch/alpha/include/asm/8253pit.h (renamed from include/asm-alpha/8253pit.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/Kbuild (renamed from include/asm-alpha/Kbuild) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/a.out-core.h (renamed from include/asm-alpha/a.out-core.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/a.out.h (renamed from include/asm-alpha/a.out.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/agp.h (renamed from include/asm-alpha/agp.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/agp_backend.h (renamed from include/asm-alpha/agp_backend.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/atomic.h (renamed from include/asm-alpha/atomic.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/auxvec.h (renamed from include/asm-alpha/auxvec.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/barrier.h (renamed from include/asm-alpha/barrier.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/bitops.h (renamed from include/asm-alpha/bitops.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/bug.h (renamed from include/asm-alpha/bug.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/bugs.h (renamed from include/asm-alpha/bugs.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/byteorder.h (renamed from include/asm-alpha/byteorder.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/cache.h (renamed from include/asm-alpha/cache.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/cacheflush.h (renamed from include/asm-alpha/cacheflush.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/checksum.h (renamed from include/asm-alpha/checksum.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/compiler.h (renamed from include/asm-alpha/compiler.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/console.h (renamed from include/asm-alpha/console.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_apecs.h (renamed from include/asm-alpha/core_apecs.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_cia.h (renamed from include/asm-alpha/core_cia.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_irongate.h (renamed from include/asm-alpha/core_irongate.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_lca.h (renamed from include/asm-alpha/core_lca.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_marvel.h (renamed from include/asm-alpha/core_marvel.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_mcpcia.h (renamed from include/asm-alpha/core_mcpcia.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_polaris.h (renamed from include/asm-alpha/core_polaris.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_t2.h (renamed from include/asm-alpha/core_t2.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_titan.h (renamed from include/asm-alpha/core_titan.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_tsunami.h (renamed from include/asm-alpha/core_tsunami.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/core_wildfire.h (renamed from include/asm-alpha/core_wildfire.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/cputime.h (renamed from include/asm-alpha/cputime.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/current.h (renamed from include/asm-alpha/current.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/delay.h (renamed from include/asm-alpha/delay.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/device.h (renamed from include/asm-alpha/device.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/div64.h (renamed from include/asm-alpha/div64.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/dma-mapping.h (renamed from include/asm-alpha/dma-mapping.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/dma.h (renamed from include/asm-alpha/dma.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/elf.h (renamed from include/asm-alpha/elf.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/emergency-restart.h (renamed from include/asm-alpha/emergency-restart.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/err_common.h (renamed from include/asm-alpha/err_common.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/err_ev6.h (renamed from include/asm-alpha/err_ev6.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/err_ev7.h (renamed from include/asm-alpha/err_ev7.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/errno.h (renamed from include/asm-alpha/errno.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/fb.h (renamed from include/asm-alpha/fb.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/fcntl.h (renamed from include/asm-alpha/fcntl.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/floppy.h (renamed from include/asm-alpha/floppy.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/fpu.h (renamed from include/asm-alpha/fpu.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/futex.h (renamed from include/asm-alpha/futex.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/gct.h (renamed from include/asm-alpha/gct.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/gentrap.h (renamed from include/asm-alpha/gentrap.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/hardirq.h (renamed from include/asm-alpha/hardirq.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/hw_irq.h (renamed from include/asm-alpha/hw_irq.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/hwrpb.h (renamed from include/asm-alpha/hwrpb.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/io.h (renamed from include/asm-alpha/io.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/io_trivial.h (renamed from include/asm-alpha/io_trivial.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/ioctl.h (renamed from include/asm-alpha/ioctl.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/ioctls.h (renamed from include/asm-alpha/ioctls.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/ipcbuf.h (renamed from include/asm-alpha/ipcbuf.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/irq.h (renamed from include/asm-alpha/irq.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/irq_regs.h (renamed from include/asm-alpha/irq_regs.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/jensen.h (renamed from include/asm-alpha/jensen.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/kdebug.h (renamed from include/asm-alpha/kdebug.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/kmap_types.h (renamed from include/asm-alpha/kmap_types.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/linkage.h (renamed from include/asm-alpha/linkage.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/local.h (renamed from include/asm-alpha/local.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/machvec.h (renamed from include/asm-alpha/machvec.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/mc146818rtc.h (renamed from include/asm-alpha/mc146818rtc.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/md.h (renamed from include/asm-alpha/md.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/mman.h (renamed from include/asm-alpha/mman.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/mmu.h (renamed from include/asm-alpha/mmu.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/mmu_context.h (renamed from include/asm-alpha/mmu_context.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/mmzone.h (renamed from include/asm-alpha/mmzone.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/module.h (renamed from include/asm-alpha/module.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/msgbuf.h (renamed from include/asm-alpha/msgbuf.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/mutex.h (renamed from include/asm-alpha/mutex.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/page.h (renamed from include/asm-alpha/page.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/pal.h (renamed from include/asm-alpha/pal.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/param.h (renamed from include/asm-alpha/param.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/parport.h (renamed from include/asm-alpha/parport.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/pci.h (renamed from include/asm-alpha/pci.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/percpu.h (renamed from include/asm-alpha/percpu.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/pgalloc.h (renamed from include/asm-alpha/pgalloc.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/pgtable.h (renamed from include/asm-alpha/pgtable.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/poll.h (renamed from include/asm-alpha/poll.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/posix_types.h (renamed from include/asm-alpha/posix_types.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/processor.h (renamed from include/asm-alpha/processor.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/ptrace.h (renamed from include/asm-alpha/ptrace.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/reg.h (renamed from include/asm-alpha/reg.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/regdef.h (renamed from include/asm-alpha/regdef.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/resource.h (renamed from include/asm-alpha/resource.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/rtc.h (renamed from include/asm-alpha/rtc.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/rwsem.h (renamed from include/asm-alpha/rwsem.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/scatterlist.h (renamed from include/asm-alpha/scatterlist.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/sections.h (renamed from include/asm-alpha/sections.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/segment.h (renamed from include/asm-alpha/segment.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/sembuf.h (renamed from include/asm-alpha/sembuf.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/serial.h (renamed from include/asm-alpha/serial.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/setup.h (renamed from include/asm-alpha/setup.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/sfp-machine.h (renamed from include/asm-alpha/sfp-machine.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/shmbuf.h (renamed from include/asm-alpha/shmbuf.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/shmparam.h (renamed from include/asm-alpha/shmparam.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/sigcontext.h (renamed from include/asm-alpha/sigcontext.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/siginfo.h (renamed from include/asm-alpha/siginfo.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/signal.h (renamed from include/asm-alpha/signal.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/smp.h (renamed from include/asm-alpha/smp.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/socket.h (renamed from include/asm-alpha/socket.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/sockios.h (renamed from include/asm-alpha/sockios.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/spinlock.h (renamed from include/asm-alpha/spinlock.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/spinlock_types.h (renamed from include/asm-alpha/spinlock_types.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/stat.h (renamed from include/asm-alpha/stat.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/statfs.h (renamed from include/asm-alpha/statfs.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/string.h (renamed from include/asm-alpha/string.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/suspend.h (renamed from include/asm-alpha/suspend.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/sysinfo.h (renamed from include/asm-alpha/sysinfo.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/system.h (renamed from include/asm-alpha/system.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/termbits.h (renamed from include/asm-alpha/termbits.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/termios.h (renamed from include/asm-alpha/termios.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/thread_info.h (renamed from include/asm-alpha/thread_info.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/timex.h (renamed from include/asm-alpha/timex.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/tlb.h (renamed from include/asm-alpha/tlb.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/tlbflush.h (renamed from include/asm-alpha/tlbflush.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/topology.h (renamed from include/asm-alpha/topology.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/types.h (renamed from include/asm-alpha/types.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/uaccess.h (renamed from include/asm-alpha/uaccess.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/ucontext.h (renamed from include/asm-alpha/ucontext.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/unaligned.h (renamed from include/asm-alpha/unaligned.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/unistd.h (renamed from include/asm-alpha/unistd.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/user.h (renamed from include/asm-alpha/user.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/vga.h (renamed from include/asm-alpha/vga.h) | 0 | ||||
| -rw-r--r-- | arch/alpha/include/asm/xor.h (renamed from include/asm-alpha/xor.h) | 0 | ||||
| -rw-r--r-- | arch/arm/include/asm/kexec.h | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/machine_kexec.c | 2 | ||||
| -rw-r--r-- | arch/ia64/include/asm/kexec.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/kexec.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/machine_kexec_32.c | 2 | ||||
| -rw-r--r-- | arch/s390/include/asm/kexec.h | 2 | ||||
| -rw-r--r-- | arch/sh/include/asm/kexec.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/machine_kexec_32.c | 20 | ||||
| -rw-r--r-- | arch/x86/kernel/relocate_kernel_32.S | 10 | ||||
| -rw-r--r-- | arch/x86/kernel/vmlinux_32.lds.S | 8 | ||||
| -rw-r--r-- | drivers/hwmon/Kconfig | 16 | ||||
| -rw-r--r-- | drivers/hwmon/Makefile | 1 | ||||
| -rw-r--r-- | drivers/hwmon/abituguru3.c | 134 | ||||
| -rw-r--r-- | drivers/hwmon/adcxx.c | 329 | ||||
| -rw-r--r-- | drivers/hwmon/applesmc.c | 20 | ||||
| -rw-r--r-- | drivers/hwmon/coretemp.c | 5 | ||||
| -rw-r--r-- | drivers/hwmon/i5k_amb.c | 28 | ||||
| -rw-r--r-- | drivers/hwmon/ibmaem.c | 27 | ||||
| -rw-r--r-- | drivers/hwmon/w83791d.c | 3 | ||||
| -rw-r--r-- | drivers/spi/spi.c | 40 | ||||
| -rw-r--r-- | drivers/video/fsl-diu-fb.c | 32 | ||||
| -rw-r--r-- | fs/inode.c | 1 | ||||
| -rw-r--r-- | fs/omfs/bitmap.c | 5 | ||||
| -rw-r--r-- | fs/omfs/file.c | 33 | ||||
| -rw-r--r-- | fs/omfs/inode.c | 3 | ||||
| -rw-r--r-- | include/asm-mips/kexec.h | 2 | ||||
| -rw-r--r-- | include/asm-x86/kexec.h | 8 | ||||
| -rw-r--r-- | include/linux/completion.h | 46 | ||||
| -rw-r--r-- | include/linux/ftrace.h | 21 | ||||
| -rw-r--r-- | include/linux/kexec.h | 4 | ||||
| -rw-r--r-- | include/linux/reboot.h | 1 | ||||
| -rw-r--r-- | include/linux/suspend.h | 4 | ||||
| -rw-r--r-- | kernel/kexec.c | 66 | ||||
| -rw-r--r-- | kernel/sched.c | 46 | ||||
| -rw-r--r-- | kernel/sys.c | 2 | ||||
| -rw-r--r-- | mm/bootmem.c | 2 |
168 files changed, 781 insertions, 210 deletions
diff --git a/Documentation/hwmon/ibmaem b/Documentation/hwmon/ibmaem index 2fefaf582a43..e98bdfea3467 100644 --- a/Documentation/hwmon/ibmaem +++ b/Documentation/hwmon/ibmaem | |||
| @@ -1,8 +1,11 @@ | |||
| 1 | Kernel driver ibmaem | 1 | Kernel driver ibmaem |
| 2 | ====================== | 2 | ====================== |
| 3 | 3 | ||
| 4 | This driver talks to the IBM Systems Director Active Energy Manager, known | ||
| 5 | henceforth as AEM. | ||
| 6 | |||
| 4 | Supported systems: | 7 | Supported systems: |
| 5 | * Any recent IBM System X server with Active Energy Manager support. | 8 | * Any recent IBM System X server with AEM support. |
| 6 | This includes the x3350, x3550, x3650, x3655, x3755, x3850 M2, | 9 | This includes the x3350, x3550, x3650, x3655, x3755, x3850 M2, |
| 7 | x3950 M2, and certain HS2x/LS2x/QS2x blades. The IPMI host interface | 10 | x3950 M2, and certain HS2x/LS2x/QS2x blades. The IPMI host interface |
| 8 | driver ("ipmi-si") needs to be loaded for this driver to do anything. | 11 | driver ("ipmi-si") needs to be loaded for this driver to do anything. |
| @@ -14,24 +17,22 @@ Author: Darrick J. Wong | |||
| 14 | Description | 17 | Description |
| 15 | ----------- | 18 | ----------- |
| 16 | 19 | ||
| 17 | This driver implements sensor reading support for the energy and power | 20 | This driver implements sensor reading support for the energy and power meters |
| 18 | meters available on various IBM System X hardware through the BMC. All | 21 | available on various IBM System X hardware through the BMC. All sensor banks |
| 19 | sensor banks will be exported as platform devices; this driver can talk | 22 | will be exported as platform devices; this driver can talk to both v1 and v2 |
| 20 | to both v1 and v2 interfaces. This driver is completely separate from the | 23 | interfaces. This driver is completely separate from the older ibmpex driver. |
| 21 | older ibmpex driver. | ||
| 22 | 24 | ||
| 23 | The v1 AEM interface has a simple set of features to monitor energy use. | 25 | The v1 AEM interface has a simple set of features to monitor energy use. There |
| 24 | There is a register that displays an estimate of raw energy consumption | 26 | is a register that displays an estimate of raw energy consumption since the |
| 25 | since the last BMC reset, and a power sensor that returns average power | 27 | last BMC reset, and a power sensor that returns average power use over a |
| 26 | use over a configurable interval. | 28 | configurable interval. |
| 27 | 29 | ||
| 28 | The v2 AEM interface is a bit more sophisticated, being able to present | 30 | The v2 AEM interface is a bit more sophisticated, being able to present a wider |
| 29 | a wider range of energy and power use registers, the power cap as | 31 | range of energy and power use registers, the power cap as set by the AEM |
| 30 | set by the AEM software, and temperature sensors. | 32 | software, and temperature sensors. |
| 31 | 33 | ||
| 32 | Special Features | 34 | Special Features |
| 33 | ---------------- | 35 | ---------------- |
| 34 | 36 | ||
| 35 | The "power_cap" value displays the current system power cap, as set by | 37 | The "power_cap" value displays the current system power cap, as set by the AEM |
| 36 | the Active Energy Manager software. Setting the power cap from the host | 38 | software. Setting the power cap from the host is not currently supported. |
| 37 | is not currently supported. | ||
diff --git a/Documentation/vm/page_migration b/Documentation/vm/page_migration index 99f89aa10169..d5fdfd34bbaf 100644 --- a/Documentation/vm/page_migration +++ b/Documentation/vm/page_migration | |||
| @@ -18,10 +18,11 @@ migrate_pages function call takes two sets of nodes and moves pages of a | |||
| 18 | process that are located on the from nodes to the destination nodes. | 18 | process that are located on the from nodes to the destination nodes. |
| 19 | Page migration functions are provided by the numactl package by Andi Kleen | 19 | Page migration functions are provided by the numactl package by Andi Kleen |
| 20 | (a version later than 0.9.3 is required. Get it from | 20 | (a version later than 0.9.3 is required. Get it from |
| 21 | ftp://ftp.suse.com/pub/people/ak). numactl provided libnuma which | 21 | ftp://oss.sgi.com/www/projects/libnuma/download/). numactl provides libnuma |
| 22 | provides an interface similar to other numa functionality for page migration. | 22 | which provides an interface similar to other numa functionality for page |
| 23 | cat /proc/<pid>/numa_maps allows an easy review of where the pages of | 23 | migration. cat /proc/<pid>/numa_maps allows an easy review of where the |
| 24 | a process are located. See also the numa_maps manpage in the numactl package. | 24 | pages of a process are located. See also the numa_maps documentation in the |
| 25 | proc(5) man page. | ||
| 25 | 26 | ||
| 26 | Manual migration is useful if for example the scheduler has relocated | 27 | Manual migration is useful if for example the scheduler has relocated |
| 27 | a process to a processor on a distant node. A batch scheduler or an | 28 | a process to a processor on a distant node. A batch scheduler or an |
diff --git a/MAINTAINERS b/MAINTAINERS index 4c5e9fe0f7db..663485b004fb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -175,12 +175,18 @@ M: bcrl@kvack.org | |||
| 175 | L: linux-aio@kvack.org | 175 | L: linux-aio@kvack.org |
| 176 | S: Supported | 176 | S: Supported |
| 177 | 177 | ||
| 178 | ABIT UGURU HARDWARE MONITOR DRIVER | 178 | ABIT UGURU 1,2 HARDWARE MONITOR DRIVER |
| 179 | P: Hans de Goede | 179 | P: Hans de Goede |
| 180 | M: j.w.r.degoede@hhs.nl | 180 | M: j.w.r.degoede@hhs.nl |
| 181 | L: lm-sensors@lm-sensors.org | 181 | L: lm-sensors@lm-sensors.org |
| 182 | S: Maintained | 182 | S: Maintained |
| 183 | 183 | ||
| 184 | ABIT UGURU 3 HARDWARE MONITOR DRIVER | ||
| 185 | P: Alistair John Strachan | ||
| 186 | M: alistair@devzero.co.uk | ||
| 187 | L: lm-sensors@lm-sensors.org | ||
| 188 | S: Maintained | ||
| 189 | |||
| 184 | ACENIC DRIVER | 190 | ACENIC DRIVER |
| 185 | P: Jes Sorensen | 191 | P: Jes Sorensen |
| 186 | M: jes@trained-monkey.org | 192 | M: jes@trained-monkey.org |
| @@ -3748,6 +3754,16 @@ L: linux-visws-devel@lists.sf.net | |||
| 3748 | W: http://linux-visws.sf.net | 3754 | W: http://linux-visws.sf.net |
| 3749 | S: Maintained for 2.6. | 3755 | S: Maintained for 2.6. |
| 3750 | 3756 | ||
| 3757 | SGI GRU DRIVER | ||
| 3758 | P: Jack Steiner | ||
| 3759 | M: steiner@sgi.com | ||
| 3760 | S: Maintained | ||
| 3761 | |||
| 3762 | SGI XP/XPC/XPNET DRIVER | ||
| 3763 | P: Dean Nelson | ||
| 3764 | M: dcn@sgi.com | ||
| 3765 | S: Maintained | ||
| 3766 | |||
| 3751 | SIMTEC EB110ATX (Chalice CATS) | 3767 | SIMTEC EB110ATX (Chalice CATS) |
| 3752 | P: Ben Dooks | 3768 | P: Ben Dooks |
| 3753 | P: Vincent Sanders | 3769 | P: Vincent Sanders |
diff --git a/include/asm-alpha/8253pit.h b/arch/alpha/include/asm/8253pit.h index fef5c1450e47..fef5c1450e47 100644 --- a/include/asm-alpha/8253pit.h +++ b/arch/alpha/include/asm/8253pit.h | |||
diff --git a/include/asm-alpha/Kbuild b/arch/alpha/include/asm/Kbuild index b7c8f188b313..b7c8f188b313 100644 --- a/include/asm-alpha/Kbuild +++ b/arch/alpha/include/asm/Kbuild | |||
diff --git a/include/asm-alpha/a.out-core.h b/arch/alpha/include/asm/a.out-core.h index 9e33e92e524c..9e33e92e524c 100644 --- a/include/asm-alpha/a.out-core.h +++ b/arch/alpha/include/asm/a.out-core.h | |||
diff --git a/include/asm-alpha/a.out.h b/arch/alpha/include/asm/a.out.h index 02ce8473870a..02ce8473870a 100644 --- a/include/asm-alpha/a.out.h +++ b/arch/alpha/include/asm/a.out.h | |||
diff --git a/include/asm-alpha/agp.h b/arch/alpha/include/asm/agp.h index 26c179135293..26c179135293 100644 --- a/include/asm-alpha/agp.h +++ b/arch/alpha/include/asm/agp.h | |||
diff --git a/include/asm-alpha/agp_backend.h b/arch/alpha/include/asm/agp_backend.h index 55dd44a2cea7..55dd44a2cea7 100644 --- a/include/asm-alpha/agp_backend.h +++ b/arch/alpha/include/asm/agp_backend.h | |||
diff --git a/include/asm-alpha/atomic.h b/arch/alpha/include/asm/atomic.h index ca88e54dec93..ca88e54dec93 100644 --- a/include/asm-alpha/atomic.h +++ b/arch/alpha/include/asm/atomic.h | |||
diff --git a/include/asm-alpha/auxvec.h b/arch/alpha/include/asm/auxvec.h index e96fe880e310..e96fe880e310 100644 --- a/include/asm-alpha/auxvec.h +++ b/arch/alpha/include/asm/auxvec.h | |||
diff --git a/include/asm-alpha/barrier.h b/arch/alpha/include/asm/barrier.h index ac78eba909bc..ac78eba909bc 100644 --- a/include/asm-alpha/barrier.h +++ b/arch/alpha/include/asm/barrier.h | |||
diff --git a/include/asm-alpha/bitops.h b/arch/alpha/include/asm/bitops.h index 15f3ae25c511..15f3ae25c511 100644 --- a/include/asm-alpha/bitops.h +++ b/arch/alpha/include/asm/bitops.h | |||
diff --git a/include/asm-alpha/bug.h b/arch/alpha/include/asm/bug.h index 695a5ee4b5d3..695a5ee4b5d3 100644 --- a/include/asm-alpha/bug.h +++ b/arch/alpha/include/asm/bug.h | |||
diff --git a/include/asm-alpha/bugs.h b/arch/alpha/include/asm/bugs.h index 78030d1c7e7e..78030d1c7e7e 100644 --- a/include/asm-alpha/bugs.h +++ b/arch/alpha/include/asm/bugs.h | |||
diff --git a/include/asm-alpha/byteorder.h b/arch/alpha/include/asm/byteorder.h index 58e958fc7f1b..58e958fc7f1b 100644 --- a/include/asm-alpha/byteorder.h +++ b/arch/alpha/include/asm/byteorder.h | |||
diff --git a/include/asm-alpha/cache.h b/arch/alpha/include/asm/cache.h index f199e69a5d0b..f199e69a5d0b 100644 --- a/include/asm-alpha/cache.h +++ b/arch/alpha/include/asm/cache.h | |||
diff --git a/include/asm-alpha/cacheflush.h b/arch/alpha/include/asm/cacheflush.h index b686cc7fc44e..b686cc7fc44e 100644 --- a/include/asm-alpha/cacheflush.h +++ b/arch/alpha/include/asm/cacheflush.h | |||
diff --git a/include/asm-alpha/checksum.h b/arch/alpha/include/asm/checksum.h index d3854bbf0a9e..d3854bbf0a9e 100644 --- a/include/asm-alpha/checksum.h +++ b/arch/alpha/include/asm/checksum.h | |||
diff --git a/include/asm-alpha/compiler.h b/arch/alpha/include/asm/compiler.h index da6bb199839c..da6bb199839c 100644 --- a/include/asm-alpha/compiler.h +++ b/arch/alpha/include/asm/compiler.h | |||
diff --git a/include/asm-alpha/console.h b/arch/alpha/include/asm/console.h index a3ce4e62249b..a3ce4e62249b 100644 --- a/include/asm-alpha/console.h +++ b/arch/alpha/include/asm/console.h | |||
diff --git a/include/asm-alpha/core_apecs.h b/arch/alpha/include/asm/core_apecs.h index 6785ff7e02bc..6785ff7e02bc 100644 --- a/include/asm-alpha/core_apecs.h +++ b/arch/alpha/include/asm/core_apecs.h | |||
diff --git a/include/asm-alpha/core_cia.h b/arch/alpha/include/asm/core_cia.h index 9e0516c0ca27..9e0516c0ca27 100644 --- a/include/asm-alpha/core_cia.h +++ b/arch/alpha/include/asm/core_cia.h | |||
diff --git a/include/asm-alpha/core_irongate.h b/arch/alpha/include/asm/core_irongate.h index 24b2db541501..24b2db541501 100644 --- a/include/asm-alpha/core_irongate.h +++ b/arch/alpha/include/asm/core_irongate.h | |||
diff --git a/include/asm-alpha/core_lca.h b/arch/alpha/include/asm/core_lca.h index f7cb4b460954..f7cb4b460954 100644 --- a/include/asm-alpha/core_lca.h +++ b/arch/alpha/include/asm/core_lca.h | |||
diff --git a/include/asm-alpha/core_marvel.h b/arch/alpha/include/asm/core_marvel.h index 30d55fe7aaf6..30d55fe7aaf6 100644 --- a/include/asm-alpha/core_marvel.h +++ b/arch/alpha/include/asm/core_marvel.h | |||
diff --git a/include/asm-alpha/core_mcpcia.h b/arch/alpha/include/asm/core_mcpcia.h index acf55b483472..acf55b483472 100644 --- a/include/asm-alpha/core_mcpcia.h +++ b/arch/alpha/include/asm/core_mcpcia.h | |||
diff --git a/include/asm-alpha/core_polaris.h b/arch/alpha/include/asm/core_polaris.h index 2f966b64659d..2f966b64659d 100644 --- a/include/asm-alpha/core_polaris.h +++ b/arch/alpha/include/asm/core_polaris.h | |||
diff --git a/include/asm-alpha/core_t2.h b/arch/alpha/include/asm/core_t2.h index 46bfff58f670..46bfff58f670 100644 --- a/include/asm-alpha/core_t2.h +++ b/arch/alpha/include/asm/core_t2.h | |||
diff --git a/include/asm-alpha/core_titan.h b/arch/alpha/include/asm/core_titan.h index a17f6f33b68e..a17f6f33b68e 100644 --- a/include/asm-alpha/core_titan.h +++ b/arch/alpha/include/asm/core_titan.h | |||
diff --git a/include/asm-alpha/core_tsunami.h b/arch/alpha/include/asm/core_tsunami.h index 58d4fe48742c..58d4fe48742c 100644 --- a/include/asm-alpha/core_tsunami.h +++ b/arch/alpha/include/asm/core_tsunami.h | |||
diff --git a/include/asm-alpha/core_wildfire.h b/arch/alpha/include/asm/core_wildfire.h index cd562f544ba2..cd562f544ba2 100644 --- a/include/asm-alpha/core_wildfire.h +++ b/arch/alpha/include/asm/core_wildfire.h | |||
diff --git a/include/asm-alpha/cputime.h b/arch/alpha/include/asm/cputime.h index 19577fd93230..19577fd93230 100644 --- a/include/asm-alpha/cputime.h +++ b/arch/alpha/include/asm/cputime.h | |||
diff --git a/include/asm-alpha/current.h b/arch/alpha/include/asm/current.h index 094d285a1b34..094d285a1b34 100644 --- a/include/asm-alpha/current.h +++ b/arch/alpha/include/asm/current.h | |||
diff --git a/include/asm-alpha/delay.h b/arch/alpha/include/asm/delay.h index 2aa3f410f7e6..2aa3f410f7e6 100644 --- a/include/asm-alpha/delay.h +++ b/arch/alpha/include/asm/delay.h | |||
diff --git a/include/asm-alpha/device.h b/arch/alpha/include/asm/device.h index d8f9872b0e2d..d8f9872b0e2d 100644 --- a/include/asm-alpha/device.h +++ b/arch/alpha/include/asm/device.h | |||
diff --git a/include/asm-alpha/div64.h b/arch/alpha/include/asm/div64.h index 6cd978cefb28..6cd978cefb28 100644 --- a/include/asm-alpha/div64.h +++ b/arch/alpha/include/asm/div64.h | |||
diff --git a/include/asm-alpha/dma-mapping.h b/arch/alpha/include/asm/dma-mapping.h index a5801ae02e4b..a5801ae02e4b 100644 --- a/include/asm-alpha/dma-mapping.h +++ b/arch/alpha/include/asm/dma-mapping.h | |||
diff --git a/include/asm-alpha/dma.h b/arch/alpha/include/asm/dma.h index 87cfdbdf08fc..87cfdbdf08fc 100644 --- a/include/asm-alpha/dma.h +++ b/arch/alpha/include/asm/dma.h | |||
diff --git a/include/asm-alpha/elf.h b/arch/alpha/include/asm/elf.h index fc1002ea1e0c..fc1002ea1e0c 100644 --- a/include/asm-alpha/elf.h +++ b/arch/alpha/include/asm/elf.h | |||
diff --git a/include/asm-alpha/emergency-restart.h b/arch/alpha/include/asm/emergency-restart.h index 108d8c48e42e..108d8c48e42e 100644 --- a/include/asm-alpha/emergency-restart.h +++ b/arch/alpha/include/asm/emergency-restart.h | |||
diff --git a/include/asm-alpha/err_common.h b/arch/alpha/include/asm/err_common.h index c25095942107..c25095942107 100644 --- a/include/asm-alpha/err_common.h +++ b/arch/alpha/include/asm/err_common.h | |||
diff --git a/include/asm-alpha/err_ev6.h b/arch/alpha/include/asm/err_ev6.h index ea637791e4a9..ea637791e4a9 100644 --- a/include/asm-alpha/err_ev6.h +++ b/arch/alpha/include/asm/err_ev6.h | |||
diff --git a/include/asm-alpha/err_ev7.h b/arch/alpha/include/asm/err_ev7.h index 87f99777c2e4..87f99777c2e4 100644 --- a/include/asm-alpha/err_ev7.h +++ b/arch/alpha/include/asm/err_ev7.h | |||
diff --git a/include/asm-alpha/errno.h b/arch/alpha/include/asm/errno.h index 69e2655249d2..69e2655249d2 100644 --- a/include/asm-alpha/errno.h +++ b/arch/alpha/include/asm/errno.h | |||
diff --git a/include/asm-alpha/fb.h b/arch/alpha/include/asm/fb.h index fa9bbb96b2b3..fa9bbb96b2b3 100644 --- a/include/asm-alpha/fb.h +++ b/arch/alpha/include/asm/fb.h | |||
diff --git a/include/asm-alpha/fcntl.h b/arch/alpha/include/asm/fcntl.h index 25da0017ec87..25da0017ec87 100644 --- a/include/asm-alpha/fcntl.h +++ b/arch/alpha/include/asm/fcntl.h | |||
diff --git a/include/asm-alpha/floppy.h b/arch/alpha/include/asm/floppy.h index 0be50413b2b5..0be50413b2b5 100644 --- a/include/asm-alpha/floppy.h +++ b/arch/alpha/include/asm/floppy.h | |||
diff --git a/include/asm-alpha/fpu.h b/arch/alpha/include/asm/fpu.h index ecb17a72acc3..ecb17a72acc3 100644 --- a/include/asm-alpha/fpu.h +++ b/arch/alpha/include/asm/fpu.h | |||
diff --git a/include/asm-alpha/futex.h b/arch/alpha/include/asm/futex.h index 6a332a9f099c..6a332a9f099c 100644 --- a/include/asm-alpha/futex.h +++ b/arch/alpha/include/asm/futex.h | |||
diff --git a/include/asm-alpha/gct.h b/arch/alpha/include/asm/gct.h index 3504c704927c..3504c704927c 100644 --- a/include/asm-alpha/gct.h +++ b/arch/alpha/include/asm/gct.h | |||
diff --git a/include/asm-alpha/gentrap.h b/arch/alpha/include/asm/gentrap.h index ae50cc3192c7..ae50cc3192c7 100644 --- a/include/asm-alpha/gentrap.h +++ b/arch/alpha/include/asm/gentrap.h | |||
diff --git a/include/asm-alpha/hardirq.h b/arch/alpha/include/asm/hardirq.h index d953e234daa8..d953e234daa8 100644 --- a/include/asm-alpha/hardirq.h +++ b/arch/alpha/include/asm/hardirq.h | |||
diff --git a/include/asm-alpha/hw_irq.h b/arch/alpha/include/asm/hw_irq.h index a37db0f95092..a37db0f95092 100644 --- a/include/asm-alpha/hw_irq.h +++ b/arch/alpha/include/asm/hw_irq.h | |||
diff --git a/include/asm-alpha/hwrpb.h b/arch/alpha/include/asm/hwrpb.h index 8e8f871af7cf..8e8f871af7cf 100644 --- a/include/asm-alpha/hwrpb.h +++ b/arch/alpha/include/asm/hwrpb.h | |||
diff --git a/include/asm-alpha/io.h b/arch/alpha/include/asm/io.h index e971ab000f95..e971ab000f95 100644 --- a/include/asm-alpha/io.h +++ b/arch/alpha/include/asm/io.h | |||
diff --git a/include/asm-alpha/io_trivial.h b/arch/alpha/include/asm/io_trivial.h index 1c77f10b4b36..1c77f10b4b36 100644 --- a/include/asm-alpha/io_trivial.h +++ b/arch/alpha/include/asm/io_trivial.h | |||
diff --git a/include/asm-alpha/ioctl.h b/arch/alpha/include/asm/ioctl.h index fc63727f4178..fc63727f4178 100644 --- a/include/asm-alpha/ioctl.h +++ b/arch/alpha/include/asm/ioctl.h | |||
diff --git a/include/asm-alpha/ioctls.h b/arch/alpha/include/asm/ioctls.h index 67bb9f6fdbe4..67bb9f6fdbe4 100644 --- a/include/asm-alpha/ioctls.h +++ b/arch/alpha/include/asm/ioctls.h | |||
diff --git a/include/asm-alpha/ipcbuf.h b/arch/alpha/include/asm/ipcbuf.h index d9c0e1a50702..d9c0e1a50702 100644 --- a/include/asm-alpha/ipcbuf.h +++ b/arch/alpha/include/asm/ipcbuf.h | |||
diff --git a/include/asm-alpha/irq.h b/arch/alpha/include/asm/irq.h index 06377400dc09..06377400dc09 100644 --- a/include/asm-alpha/irq.h +++ b/arch/alpha/include/asm/irq.h | |||
diff --git a/include/asm-alpha/irq_regs.h b/arch/alpha/include/asm/irq_regs.h index 3dd9c0b70270..3dd9c0b70270 100644 --- a/include/asm-alpha/irq_regs.h +++ b/arch/alpha/include/asm/irq_regs.h | |||
diff --git a/include/asm-alpha/jensen.h b/arch/alpha/include/asm/jensen.h index 964b06ead43b..964b06ead43b 100644 --- a/include/asm-alpha/jensen.h +++ b/arch/alpha/include/asm/jensen.h | |||
diff --git a/include/asm-alpha/kdebug.h b/arch/alpha/include/asm/kdebug.h index 6ece1b037665..6ece1b037665 100644 --- a/include/asm-alpha/kdebug.h +++ b/arch/alpha/include/asm/kdebug.h | |||
diff --git a/include/asm-alpha/kmap_types.h b/arch/alpha/include/asm/kmap_types.h index 3e6735a34c57..3e6735a34c57 100644 --- a/include/asm-alpha/kmap_types.h +++ b/arch/alpha/include/asm/kmap_types.h | |||
diff --git a/include/asm-alpha/linkage.h b/arch/alpha/include/asm/linkage.h index 291c2d01c44f..291c2d01c44f 100644 --- a/include/asm-alpha/linkage.h +++ b/arch/alpha/include/asm/linkage.h | |||
diff --git a/include/asm-alpha/local.h b/arch/alpha/include/asm/local.h index 6ad3ea696421..6ad3ea696421 100644 --- a/include/asm-alpha/local.h +++ b/arch/alpha/include/asm/local.h | |||
diff --git a/include/asm-alpha/machvec.h b/arch/alpha/include/asm/machvec.h index a86c083cdf7f..a86c083cdf7f 100644 --- a/include/asm-alpha/machvec.h +++ b/arch/alpha/include/asm/machvec.h | |||
diff --git a/include/asm-alpha/mc146818rtc.h b/arch/alpha/include/asm/mc146818rtc.h index 097703f1c8cb..097703f1c8cb 100644 --- a/include/asm-alpha/mc146818rtc.h +++ b/arch/alpha/include/asm/mc146818rtc.h | |||
diff --git a/include/asm-alpha/md.h b/arch/alpha/include/asm/md.h index 6c9b8222a4f2..6c9b8222a4f2 100644 --- a/include/asm-alpha/md.h +++ b/arch/alpha/include/asm/md.h | |||
diff --git a/include/asm-alpha/mman.h b/arch/alpha/include/asm/mman.h index 90d7c35d2867..90d7c35d2867 100644 --- a/include/asm-alpha/mman.h +++ b/arch/alpha/include/asm/mman.h | |||
diff --git a/include/asm-alpha/mmu.h b/arch/alpha/include/asm/mmu.h index 3dc127779329..3dc127779329 100644 --- a/include/asm-alpha/mmu.h +++ b/arch/alpha/include/asm/mmu.h | |||
diff --git a/include/asm-alpha/mmu_context.h b/arch/alpha/include/asm/mmu_context.h index 86c08a02d239..86c08a02d239 100644 --- a/include/asm-alpha/mmu_context.h +++ b/arch/alpha/include/asm/mmu_context.h | |||
diff --git a/include/asm-alpha/mmzone.h b/arch/alpha/include/asm/mmzone.h index 8af56ce346ad..8af56ce346ad 100644 --- a/include/asm-alpha/mmzone.h +++ b/arch/alpha/include/asm/mmzone.h | |||
diff --git a/include/asm-alpha/module.h b/arch/alpha/include/asm/module.h index 7b63743c534a..7b63743c534a 100644 --- a/include/asm-alpha/module.h +++ b/arch/alpha/include/asm/module.h | |||
diff --git a/include/asm-alpha/msgbuf.h b/arch/alpha/include/asm/msgbuf.h index 98496501a2bb..98496501a2bb 100644 --- a/include/asm-alpha/msgbuf.h +++ b/arch/alpha/include/asm/msgbuf.h | |||
diff --git a/include/asm-alpha/mutex.h b/arch/alpha/include/asm/mutex.h index 458c1f7fbc18..458c1f7fbc18 100644 --- a/include/asm-alpha/mutex.h +++ b/arch/alpha/include/asm/mutex.h | |||
diff --git a/include/asm-alpha/page.h b/arch/alpha/include/asm/page.h index 0995f9d13417..0995f9d13417 100644 --- a/include/asm-alpha/page.h +++ b/arch/alpha/include/asm/page.h | |||
diff --git a/include/asm-alpha/pal.h b/arch/alpha/include/asm/pal.h index 9b4ba0d6f00b..9b4ba0d6f00b 100644 --- a/include/asm-alpha/pal.h +++ b/arch/alpha/include/asm/pal.h | |||
diff --git a/include/asm-alpha/param.h b/arch/alpha/include/asm/param.h index e691ecfedb2c..e691ecfedb2c 100644 --- a/include/asm-alpha/param.h +++ b/arch/alpha/include/asm/param.h | |||
diff --git a/include/asm-alpha/parport.h b/arch/alpha/include/asm/parport.h index c5ee7cbb2fcd..c5ee7cbb2fcd 100644 --- a/include/asm-alpha/parport.h +++ b/arch/alpha/include/asm/parport.h | |||
diff --git a/include/asm-alpha/pci.h b/arch/alpha/include/asm/pci.h index 2a14302c17a3..2a14302c17a3 100644 --- a/include/asm-alpha/pci.h +++ b/arch/alpha/include/asm/pci.h | |||
diff --git a/include/asm-alpha/percpu.h b/arch/alpha/include/asm/percpu.h index 3495e8e00d70..3495e8e00d70 100644 --- a/include/asm-alpha/percpu.h +++ b/arch/alpha/include/asm/percpu.h | |||
diff --git a/include/asm-alpha/pgalloc.h b/arch/alpha/include/asm/pgalloc.h index fd090155dccd..fd090155dccd 100644 --- a/include/asm-alpha/pgalloc.h +++ b/arch/alpha/include/asm/pgalloc.h | |||
diff --git a/include/asm-alpha/pgtable.h b/arch/alpha/include/asm/pgtable.h index 3f0c59f6d8aa..3f0c59f6d8aa 100644 --- a/include/asm-alpha/pgtable.h +++ b/arch/alpha/include/asm/pgtable.h | |||
diff --git a/include/asm-alpha/poll.h b/arch/alpha/include/asm/poll.h index c98509d3149e..c98509d3149e 100644 --- a/include/asm-alpha/poll.h +++ b/arch/alpha/include/asm/poll.h | |||
diff --git a/include/asm-alpha/posix_types.h b/arch/alpha/include/asm/posix_types.h index db167413300b..db167413300b 100644 --- a/include/asm-alpha/posix_types.h +++ b/arch/alpha/include/asm/posix_types.h | |||
diff --git a/include/asm-alpha/processor.h b/arch/alpha/include/asm/processor.h index 94afe5859301..94afe5859301 100644 --- a/include/asm-alpha/processor.h +++ b/arch/alpha/include/asm/processor.h | |||
diff --git a/include/asm-alpha/ptrace.h b/arch/alpha/include/asm/ptrace.h index 32c7a5cddd59..32c7a5cddd59 100644 --- a/include/asm-alpha/ptrace.h +++ b/arch/alpha/include/asm/ptrace.h | |||
diff --git a/include/asm-alpha/reg.h b/arch/alpha/include/asm/reg.h index 86ff916fb069..86ff916fb069 100644 --- a/include/asm-alpha/reg.h +++ b/arch/alpha/include/asm/reg.h | |||
diff --git a/include/asm-alpha/regdef.h b/arch/alpha/include/asm/regdef.h index 142df9c4f8b8..142df9c4f8b8 100644 --- a/include/asm-alpha/regdef.h +++ b/arch/alpha/include/asm/regdef.h | |||
diff --git a/include/asm-alpha/resource.h b/arch/alpha/include/asm/resource.h index c10874ff5973..c10874ff5973 100644 --- a/include/asm-alpha/resource.h +++ b/arch/alpha/include/asm/resource.h | |||
diff --git a/include/asm-alpha/rtc.h b/arch/alpha/include/asm/rtc.h index 4e854b1333eb..4e854b1333eb 100644 --- a/include/asm-alpha/rtc.h +++ b/arch/alpha/include/asm/rtc.h | |||
diff --git a/include/asm-alpha/rwsem.h b/arch/alpha/include/asm/rwsem.h index 1570c0b54336..1570c0b54336 100644 --- a/include/asm-alpha/rwsem.h +++ b/arch/alpha/include/asm/rwsem.h | |||
diff --git a/include/asm-alpha/scatterlist.h b/arch/alpha/include/asm/scatterlist.h index 440747ca6349..440747ca6349 100644 --- a/include/asm-alpha/scatterlist.h +++ b/arch/alpha/include/asm/scatterlist.h | |||
diff --git a/include/asm-alpha/sections.h b/arch/alpha/include/asm/sections.h index 43b40edd6e44..43b40edd6e44 100644 --- a/include/asm-alpha/sections.h +++ b/arch/alpha/include/asm/sections.h | |||
diff --git a/include/asm-alpha/segment.h b/arch/alpha/include/asm/segment.h index 0453d97daae7..0453d97daae7 100644 --- a/include/asm-alpha/segment.h +++ b/arch/alpha/include/asm/segment.h | |||
diff --git a/include/asm-alpha/sembuf.h b/arch/alpha/include/asm/sembuf.h index 7b38b1534784..7b38b1534784 100644 --- a/include/asm-alpha/sembuf.h +++ b/arch/alpha/include/asm/sembuf.h | |||
diff --git a/include/asm-alpha/serial.h b/arch/alpha/include/asm/serial.h index 9d263e8d8ccc..9d263e8d8ccc 100644 --- a/include/asm-alpha/serial.h +++ b/arch/alpha/include/asm/serial.h | |||
diff --git a/include/asm-alpha/setup.h b/arch/alpha/include/asm/setup.h index 2e023a4aa317..2e023a4aa317 100644 --- a/include/asm-alpha/setup.h +++ b/arch/alpha/include/asm/setup.h | |||
diff --git a/include/asm-alpha/sfp-machine.h b/arch/alpha/include/asm/sfp-machine.h index 5fe63afbd474..5fe63afbd474 100644 --- a/include/asm-alpha/sfp-machine.h +++ b/arch/alpha/include/asm/sfp-machine.h | |||
diff --git a/include/asm-alpha/shmbuf.h b/arch/alpha/include/asm/shmbuf.h index 37ee84f05085..37ee84f05085 100644 --- a/include/asm-alpha/shmbuf.h +++ b/arch/alpha/include/asm/shmbuf.h | |||
diff --git a/include/asm-alpha/shmparam.h b/arch/alpha/include/asm/shmparam.h index cc901d58aebb..cc901d58aebb 100644 --- a/include/asm-alpha/shmparam.h +++ b/arch/alpha/include/asm/shmparam.h | |||
diff --git a/include/asm-alpha/sigcontext.h b/arch/alpha/include/asm/sigcontext.h index 323cdb026198..323cdb026198 100644 --- a/include/asm-alpha/sigcontext.h +++ b/arch/alpha/include/asm/sigcontext.h | |||
diff --git a/include/asm-alpha/siginfo.h b/arch/alpha/include/asm/siginfo.h index 9822362a8424..9822362a8424 100644 --- a/include/asm-alpha/siginfo.h +++ b/arch/alpha/include/asm/siginfo.h | |||
diff --git a/include/asm-alpha/signal.h b/arch/alpha/include/asm/signal.h index 13c2305d35ef..13c2305d35ef 100644 --- a/include/asm-alpha/signal.h +++ b/arch/alpha/include/asm/signal.h | |||
diff --git a/include/asm-alpha/smp.h b/arch/alpha/include/asm/smp.h index 544c69af8168..544c69af8168 100644 --- a/include/asm-alpha/smp.h +++ b/arch/alpha/include/asm/smp.h | |||
diff --git a/include/asm-alpha/socket.h b/arch/alpha/include/asm/socket.h index a1057c2d95e7..a1057c2d95e7 100644 --- a/include/asm-alpha/socket.h +++ b/arch/alpha/include/asm/socket.h | |||
diff --git a/include/asm-alpha/sockios.h b/arch/alpha/include/asm/sockios.h index 7932c7ab4a4d..7932c7ab4a4d 100644 --- a/include/asm-alpha/sockios.h +++ b/arch/alpha/include/asm/sockios.h | |||
diff --git a/include/asm-alpha/spinlock.h b/arch/alpha/include/asm/spinlock.h index aeeb125f6851..aeeb125f6851 100644 --- a/include/asm-alpha/spinlock.h +++ b/arch/alpha/include/asm/spinlock.h | |||
diff --git a/include/asm-alpha/spinlock_types.h b/arch/alpha/include/asm/spinlock_types.h index 8141eb5ebf0d..8141eb5ebf0d 100644 --- a/include/asm-alpha/spinlock_types.h +++ b/arch/alpha/include/asm/spinlock_types.h | |||
diff --git a/include/asm-alpha/stat.h b/arch/alpha/include/asm/stat.h index 07ad3e6b3f3e..07ad3e6b3f3e 100644 --- a/include/asm-alpha/stat.h +++ b/arch/alpha/include/asm/stat.h | |||
diff --git a/include/asm-alpha/statfs.h b/arch/alpha/include/asm/statfs.h index ad15830baefe..ad15830baefe 100644 --- a/include/asm-alpha/statfs.h +++ b/arch/alpha/include/asm/statfs.h | |||
diff --git a/include/asm-alpha/string.h b/arch/alpha/include/asm/string.h index b02b8a282940..b02b8a282940 100644 --- a/include/asm-alpha/string.h +++ b/arch/alpha/include/asm/string.h | |||
diff --git a/include/asm-alpha/suspend.h b/arch/alpha/include/asm/suspend.h index c7042d575851..c7042d575851 100644 --- a/include/asm-alpha/suspend.h +++ b/arch/alpha/include/asm/suspend.h | |||
diff --git a/include/asm-alpha/sysinfo.h b/arch/alpha/include/asm/sysinfo.h index 086aba284df2..086aba284df2 100644 --- a/include/asm-alpha/sysinfo.h +++ b/arch/alpha/include/asm/sysinfo.h | |||
diff --git a/include/asm-alpha/system.h b/arch/alpha/include/asm/system.h index afe20fa58c99..afe20fa58c99 100644 --- a/include/asm-alpha/system.h +++ b/arch/alpha/include/asm/system.h | |||
diff --git a/include/asm-alpha/termbits.h b/arch/alpha/include/asm/termbits.h index ad854a4a3af6..ad854a4a3af6 100644 --- a/include/asm-alpha/termbits.h +++ b/arch/alpha/include/asm/termbits.h | |||
diff --git a/include/asm-alpha/termios.h b/arch/alpha/include/asm/termios.h index fa13716a11c3..fa13716a11c3 100644 --- a/include/asm-alpha/termios.h +++ b/arch/alpha/include/asm/termios.h | |||
diff --git a/include/asm-alpha/thread_info.h b/arch/alpha/include/asm/thread_info.h index 15fda4344424..15fda4344424 100644 --- a/include/asm-alpha/thread_info.h +++ b/arch/alpha/include/asm/thread_info.h | |||
diff --git a/include/asm-alpha/timex.h b/arch/alpha/include/asm/timex.h index afa0c45e3e98..afa0c45e3e98 100644 --- a/include/asm-alpha/timex.h +++ b/arch/alpha/include/asm/timex.h | |||
diff --git a/include/asm-alpha/tlb.h b/arch/alpha/include/asm/tlb.h index c13636575fba..c13636575fba 100644 --- a/include/asm-alpha/tlb.h +++ b/arch/alpha/include/asm/tlb.h | |||
diff --git a/include/asm-alpha/tlbflush.h b/arch/alpha/include/asm/tlbflush.h index 9d87aaa08c0d..9d87aaa08c0d 100644 --- a/include/asm-alpha/tlbflush.h +++ b/arch/alpha/include/asm/tlbflush.h | |||
diff --git a/include/asm-alpha/topology.h b/arch/alpha/include/asm/topology.h index 149532e162c4..149532e162c4 100644 --- a/include/asm-alpha/topology.h +++ b/arch/alpha/include/asm/topology.h | |||
diff --git a/include/asm-alpha/types.h b/arch/alpha/include/asm/types.h index c1541353ccef..c1541353ccef 100644 --- a/include/asm-alpha/types.h +++ b/arch/alpha/include/asm/types.h | |||
diff --git a/include/asm-alpha/uaccess.h b/arch/alpha/include/asm/uaccess.h index 22de3b434a22..22de3b434a22 100644 --- a/include/asm-alpha/uaccess.h +++ b/arch/alpha/include/asm/uaccess.h | |||
diff --git a/include/asm-alpha/ucontext.h b/arch/alpha/include/asm/ucontext.h index 47578ab42152..47578ab42152 100644 --- a/include/asm-alpha/ucontext.h +++ b/arch/alpha/include/asm/ucontext.h | |||
diff --git a/include/asm-alpha/unaligned.h b/arch/alpha/include/asm/unaligned.h index 3787c60aed3f..3787c60aed3f 100644 --- a/include/asm-alpha/unaligned.h +++ b/arch/alpha/include/asm/unaligned.h | |||
diff --git a/include/asm-alpha/unistd.h b/arch/alpha/include/asm/unistd.h index 5b5c17485942..5b5c17485942 100644 --- a/include/asm-alpha/unistd.h +++ b/arch/alpha/include/asm/unistd.h | |||
diff --git a/include/asm-alpha/user.h b/arch/alpha/include/asm/user.h index a4eb6a4ca8d1..a4eb6a4ca8d1 100644 --- a/include/asm-alpha/user.h +++ b/arch/alpha/include/asm/user.h | |||
diff --git a/include/asm-alpha/vga.h b/arch/alpha/include/asm/vga.h index c00106bac521..c00106bac521 100644 --- a/include/asm-alpha/vga.h +++ b/arch/alpha/include/asm/vga.h | |||
diff --git a/include/asm-alpha/xor.h b/arch/alpha/include/asm/xor.h index 5ee1c2bc0499..5ee1c2bc0499 100644 --- a/include/asm-alpha/xor.h +++ b/arch/alpha/include/asm/xor.h | |||
diff --git a/arch/arm/include/asm/kexec.h b/arch/arm/include/asm/kexec.h index c8986bb99ed5..df15a0dc228e 100644 --- a/arch/arm/include/asm/kexec.h +++ b/arch/arm/include/asm/kexec.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | /* Maximum address we can use for the control code buffer */ | 10 | /* Maximum address we can use for the control code buffer */ |
| 11 | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) | 11 | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) |
| 12 | 12 | ||
| 13 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 13 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 14 | 14 | ||
| 15 | #define KEXEC_ARCH KEXEC_ARCH_ARM | 15 | #define KEXEC_ARCH KEXEC_ARCH_ARM |
| 16 | 16 | ||
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index db8f54a3451f..fae5beb3c3d6 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
| @@ -71,7 +71,7 @@ void machine_kexec(struct kimage *image) | |||
| 71 | 71 | ||
| 72 | 72 | ||
| 73 | flush_icache_range((unsigned long) reboot_code_buffer, | 73 | flush_icache_range((unsigned long) reboot_code_buffer, |
| 74 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE); | 74 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); |
| 75 | printk(KERN_INFO "Bye!\n"); | 75 | printk(KERN_INFO "Bye!\n"); |
| 76 | 76 | ||
| 77 | cpu_proc_fin(); | 77 | cpu_proc_fin(); |
diff --git a/arch/ia64/include/asm/kexec.h b/arch/ia64/include/asm/kexec.h index 541be835fc5a..e1d58f819d78 100644 --- a/arch/ia64/include/asm/kexec.h +++ b/arch/ia64/include/asm/kexec.h | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | /* Maximum address we can use for the control code buffer */ | 9 | /* Maximum address we can use for the control code buffer */ |
| 10 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 10 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
| 11 | 11 | ||
| 12 | #define KEXEC_CONTROL_CODE_SIZE (8192 + 8192 + 4096) | 12 | #define KEXEC_CONTROL_PAGE_SIZE (8192 + 8192 + 4096) |
| 13 | 13 | ||
| 14 | /* The native architecture */ | 14 | /* The native architecture */ |
| 15 | #define KEXEC_ARCH KEXEC_ARCH_IA_64 | 15 | #define KEXEC_ARCH KEXEC_ARCH_IA_64 |
diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h index acdcdc66f1b6..3736d9b33289 100644 --- a/arch/powerpc/include/asm/kexec.h +++ b/arch/powerpc/include/asm/kexec.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
| 23 | #endif | 23 | #endif |
| 24 | 24 | ||
| 25 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 25 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 26 | 26 | ||
| 27 | /* The native architecture */ | 27 | /* The native architecture */ |
| 28 | #ifdef __powerpc64__ | 28 | #ifdef __powerpc64__ |
diff --git a/arch/powerpc/kernel/machine_kexec_32.c b/arch/powerpc/kernel/machine_kexec_32.c index cbaa34196797..ae63a964b858 100644 --- a/arch/powerpc/kernel/machine_kexec_32.c +++ b/arch/powerpc/kernel/machine_kexec_32.c | |||
| @@ -51,7 +51,7 @@ void default_machine_kexec(struct kimage *image) | |||
| 51 | relocate_new_kernel_size); | 51 | relocate_new_kernel_size); |
| 52 | 52 | ||
| 53 | flush_icache_range(reboot_code_buffer, | 53 | flush_icache_range(reboot_code_buffer, |
| 54 | reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE); | 54 | reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); |
| 55 | printk(KERN_INFO "Bye!\n"); | 55 | printk(KERN_INFO "Bye!\n"); |
| 56 | 56 | ||
| 57 | /* now call it */ | 57 | /* now call it */ |
diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h index f219c6411e0b..bb729b84a21e 100644 --- a/arch/s390/include/asm/kexec.h +++ b/arch/s390/include/asm/kexec.h | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31) | 31 | #define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31) |
| 32 | 32 | ||
| 33 | /* Allocate one page for the pdp and the second for the code */ | 33 | /* Allocate one page for the pdp and the second for the code */ |
| 34 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 34 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 35 | 35 | ||
| 36 | /* The native architecture */ | 36 | /* The native architecture */ |
| 37 | #define KEXEC_ARCH KEXEC_ARCH_S390 | 37 | #define KEXEC_ARCH KEXEC_ARCH_S390 |
diff --git a/arch/sh/include/asm/kexec.h b/arch/sh/include/asm/kexec.h index 00f4260ef09b..765a5e1660fc 100644 --- a/arch/sh/include/asm/kexec.h +++ b/arch/sh/include/asm/kexec.h | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | /* Maximum address we can use for the control code buffer */ | 21 | /* Maximum address we can use for the control code buffer */ |
| 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
| 23 | 23 | ||
| 24 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 24 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 25 | 25 | ||
| 26 | /* The native architecture */ | 26 | /* The native architecture */ |
| 27 | #define KEXEC_ARCH KEXEC_ARCH_SH | 27 | #define KEXEC_ARCH KEXEC_ARCH_SH |
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c index 9fe478d98406..0732adba05ca 100644 --- a/arch/x86/kernel/machine_kexec_32.c +++ b/arch/x86/kernel/machine_kexec_32.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/numa.h> | 13 | #include <linux/numa.h> |
| 14 | #include <linux/ftrace.h> | 14 | #include <linux/ftrace.h> |
| 15 | #include <linux/suspend.h> | ||
| 15 | 16 | ||
| 16 | #include <asm/pgtable.h> | 17 | #include <asm/pgtable.h> |
| 17 | #include <asm/pgalloc.h> | 18 | #include <asm/pgalloc.h> |
| @@ -78,7 +79,7 @@ static void load_segments(void) | |||
| 78 | /* | 79 | /* |
| 79 | * A architecture hook called to validate the | 80 | * A architecture hook called to validate the |
| 80 | * proposed image and prepare the control pages | 81 | * proposed image and prepare the control pages |
| 81 | * as needed. The pages for KEXEC_CONTROL_CODE_SIZE | 82 | * as needed. The pages for KEXEC_CONTROL_PAGE_SIZE |
| 82 | * have been allocated, but the segments have yet | 83 | * have been allocated, but the segments have yet |
| 83 | * been copied into the kernel. | 84 | * been copied into the kernel. |
| 84 | * | 85 | * |
| @@ -113,6 +114,7 @@ void machine_kexec(struct kimage *image) | |||
| 113 | { | 114 | { |
| 114 | unsigned long page_list[PAGES_NR]; | 115 | unsigned long page_list[PAGES_NR]; |
| 115 | void *control_page; | 116 | void *control_page; |
| 117 | int save_ftrace_enabled; | ||
| 116 | asmlinkage unsigned long | 118 | asmlinkage unsigned long |
| 117 | (*relocate_kernel_ptr)(unsigned long indirection_page, | 119 | (*relocate_kernel_ptr)(unsigned long indirection_page, |
| 118 | unsigned long control_page, | 120 | unsigned long control_page, |
| @@ -120,7 +122,12 @@ void machine_kexec(struct kimage *image) | |||
| 120 | unsigned int has_pae, | 122 | unsigned int has_pae, |
| 121 | unsigned int preserve_context); | 123 | unsigned int preserve_context); |
| 122 | 124 | ||
| 123 | tracer_disable(); | 125 | #ifdef CONFIG_KEXEC_JUMP |
| 126 | if (kexec_image->preserve_context) | ||
| 127 | save_processor_state(); | ||
| 128 | #endif | ||
| 129 | |||
| 130 | save_ftrace_enabled = __ftrace_enabled_save(); | ||
| 124 | 131 | ||
| 125 | /* Interrupts aren't acceptable while we reboot */ | 132 | /* Interrupts aren't acceptable while we reboot */ |
| 126 | local_irq_disable(); | 133 | local_irq_disable(); |
| @@ -138,7 +145,7 @@ void machine_kexec(struct kimage *image) | |||
| 138 | } | 145 | } |
| 139 | 146 | ||
| 140 | control_page = page_address(image->control_code_page); | 147 | control_page = page_address(image->control_code_page); |
| 141 | memcpy(control_page, relocate_kernel, PAGE_SIZE/2); | 148 | memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE); |
| 142 | 149 | ||
| 143 | relocate_kernel_ptr = control_page; | 150 | relocate_kernel_ptr = control_page; |
| 144 | page_list[PA_CONTROL_PAGE] = __pa(control_page); | 151 | page_list[PA_CONTROL_PAGE] = __pa(control_page); |
| @@ -178,6 +185,13 @@ void machine_kexec(struct kimage *image) | |||
| 178 | (unsigned long)page_list, | 185 | (unsigned long)page_list, |
| 179 | image->start, cpu_has_pae, | 186 | image->start, cpu_has_pae, |
| 180 | image->preserve_context); | 187 | image->preserve_context); |
| 188 | |||
| 189 | #ifdef CONFIG_KEXEC_JUMP | ||
| 190 | if (kexec_image->preserve_context) | ||
| 191 | restore_processor_state(); | ||
| 192 | #endif | ||
| 193 | |||
| 194 | __ftrace_enabled_restore(save_ftrace_enabled); | ||
| 181 | } | 195 | } |
| 182 | 196 | ||
| 183 | void arch_crash_save_vmcoreinfo(void) | 197 | void arch_crash_save_vmcoreinfo(void) |
diff --git a/arch/x86/kernel/relocate_kernel_32.S b/arch/x86/kernel/relocate_kernel_32.S index 703310a99023..6f50664b2ba5 100644 --- a/arch/x86/kernel/relocate_kernel_32.S +++ b/arch/x86/kernel/relocate_kernel_32.S | |||
| @@ -20,10 +20,11 @@ | |||
| 20 | #define PAGE_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) | 20 | #define PAGE_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) |
| 21 | #define PAE_PGD_ATTR (_PAGE_PRESENT) | 21 | #define PAE_PGD_ATTR (_PAGE_PRESENT) |
| 22 | 22 | ||
| 23 | /* control_page + PAGE_SIZE/2 ~ control_page + PAGE_SIZE * 3/4 are | 23 | /* control_page + KEXEC_CONTROL_CODE_MAX_SIZE |
| 24 | * used to save some data for jumping back | 24 | * ~ control_page + PAGE_SIZE are used as data storage and stack for |
| 25 | * jumping back | ||
| 25 | */ | 26 | */ |
| 26 | #define DATA(offset) (PAGE_SIZE/2+(offset)) | 27 | #define DATA(offset) (KEXEC_CONTROL_CODE_MAX_SIZE+(offset)) |
| 27 | 28 | ||
| 28 | /* Minimal CPU state */ | 29 | /* Minimal CPU state */ |
| 29 | #define ESP DATA(0x0) | 30 | #define ESP DATA(0x0) |
| @@ -376,3 +377,6 @@ swap_pages: | |||
| 376 | popl %ebx | 377 | popl %ebx |
| 377 | popl %ebp | 378 | popl %ebp |
| 378 | ret | 379 | ret |
| 380 | |||
| 381 | .globl kexec_control_code_size | ||
| 382 | .set kexec_control_code_size, . - relocate_kernel | ||
diff --git a/arch/x86/kernel/vmlinux_32.lds.S b/arch/x86/kernel/vmlinux_32.lds.S index cdb2363697d2..af5bdad84604 100644 --- a/arch/x86/kernel/vmlinux_32.lds.S +++ b/arch/x86/kernel/vmlinux_32.lds.S | |||
| @@ -209,3 +209,11 @@ SECTIONS | |||
| 209 | 209 | ||
| 210 | DWARF_DEBUG | 210 | DWARF_DEBUG |
| 211 | } | 211 | } |
| 212 | |||
| 213 | #ifdef CONFIG_KEXEC | ||
| 214 | /* Link time checks */ | ||
| 215 | #include <asm/kexec.h> | ||
| 216 | |||
| 217 | ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE, | ||
| 218 | "kexec control code size is too big") | ||
| 219 | #endif | ||
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index bf4ebfb86fa5..d402e8d813ce 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
| @@ -77,6 +77,22 @@ config SENSORS_AD7418 | |||
| 77 | This driver can also be built as a module. If so, the module | 77 | This driver can also be built as a module. If so, the module |
| 78 | will be called ad7418. | 78 | will be called ad7418. |
| 79 | 79 | ||
| 80 | config SENSORS_ADCXX | ||
| 81 | tristate "National Semiconductor ADCxxxSxxx" | ||
| 82 | depends on SPI_MASTER && EXPERIMENTAL | ||
| 83 | help | ||
| 84 | If you say yes here you get support for the National Semiconductor | ||
| 85 | ADC<bb><c>S<sss> chip family, where | ||
| 86 | * bb is the resolution in number of bits (8, 10, 12) | ||
| 87 | * c is the number of channels (1, 2, 4, 8) | ||
| 88 | * sss is the maximum conversion speed (021 for 200 kSPS, 051 for 500 | ||
| 89 | kSPS and 101 for 1 MSPS) | ||
| 90 | |||
| 91 | Examples : ADC081S101, ADC124S501, ... | ||
| 92 | |||
| 93 | This driver can also be built as a module. If so, the module | ||
| 94 | will be called adcxx. | ||
| 95 | |||
| 80 | config SENSORS_ADM1021 | 96 | config SENSORS_ADM1021 |
| 81 | tristate "Analog Devices ADM1021 and compatibles" | 97 | tristate "Analog Devices ADM1021 and compatibles" |
| 82 | depends on I2C | 98 | depends on I2C |
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 7943e5cefb06..950134ab8426 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile | |||
| @@ -17,6 +17,7 @@ obj-$(CONFIG_SENSORS_ABITUGURU) += abituguru.o | |||
| 17 | obj-$(CONFIG_SENSORS_ABITUGURU3)+= abituguru3.o | 17 | obj-$(CONFIG_SENSORS_ABITUGURU3)+= abituguru3.o |
| 18 | obj-$(CONFIG_SENSORS_AD7414) += ad7414.o | 18 | obj-$(CONFIG_SENSORS_AD7414) += ad7414.o |
| 19 | obj-$(CONFIG_SENSORS_AD7418) += ad7418.o | 19 | obj-$(CONFIG_SENSORS_AD7418) += ad7418.o |
| 20 | obj-$(CONFIG_SENSORS_ADCXX) += adcxx.o | ||
| 20 | obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o | 21 | obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o |
| 21 | obj-$(CONFIG_SENSORS_ADM1025) += adm1025.o | 22 | obj-$(CONFIG_SENSORS_ADM1025) += adm1025.o |
| 22 | obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o | 23 | obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o |
diff --git a/drivers/hwmon/abituguru3.c b/drivers/hwmon/abituguru3.c index f00f497b9ca9..d568c65c1370 100644 --- a/drivers/hwmon/abituguru3.c +++ b/drivers/hwmon/abituguru3.c | |||
| @@ -1,5 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | abituguru3.c Copyright (c) 2006 Hans de Goede <j.w.r.degoede@hhs.nl> | 2 | abituguru3.c |
| 3 | |||
| 4 | Copyright (c) 2006-2008 Hans de Goede <j.w.r.degoede@hhs.nl> | ||
| 5 | Copyright (c) 2008 Alistair John Strachan <alistair@devzero.co.uk> | ||
| 3 | 6 | ||
| 4 | This program is free software; you can redistribute it and/or modify | 7 | This program is free software; you can redistribute it and/or modify |
| 5 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
| @@ -116,7 +119,7 @@ struct abituguru3_sensor_info { | |||
| 116 | 119 | ||
| 117 | struct abituguru3_motherboard_info { | 120 | struct abituguru3_motherboard_info { |
| 118 | u16 id; | 121 | u16 id; |
| 119 | const char *name; | 122 | const char *dmi_name; |
| 120 | /* + 1 -> end of sensors indicated by a sensor with name == NULL */ | 123 | /* + 1 -> end of sensors indicated by a sensor with name == NULL */ |
| 121 | struct abituguru3_sensor_info sensors[ABIT_UGURU3_MAX_NO_SENSORS + 1]; | 124 | struct abituguru3_sensor_info sensors[ABIT_UGURU3_MAX_NO_SENSORS + 1]; |
| 122 | }; | 125 | }; |
| @@ -161,7 +164,7 @@ struct abituguru3_data { | |||
| 161 | 164 | ||
| 162 | /* Constants */ | 165 | /* Constants */ |
| 163 | static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | 166 | static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { |
| 164 | { 0x000C, "unknown", { | 167 | { 0x000C, NULL /* Unknown, need DMI string */, { |
| 165 | { "CPU Core", 0, 0, 10, 1, 0 }, | 168 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 166 | { "DDR", 1, 0, 10, 1, 0 }, | 169 | { "DDR", 1, 0, 10, 1, 0 }, |
| 167 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 170 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -183,7 +186,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 183 | { "AUX1 Fan", 35, 2, 60, 1, 0 }, | 186 | { "AUX1 Fan", 35, 2, 60, 1, 0 }, |
| 184 | { NULL, 0, 0, 0, 0, 0 } } | 187 | { NULL, 0, 0, 0, 0, 0 } } |
| 185 | }, | 188 | }, |
| 186 | { 0x000D, "Abit AW8", { | 189 | { 0x000D, NULL /* Abit AW8, need DMI string */, { |
| 187 | { "CPU Core", 0, 0, 10, 1, 0 }, | 190 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 188 | { "DDR", 1, 0, 10, 1, 0 }, | 191 | { "DDR", 1, 0, 10, 1, 0 }, |
| 189 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 192 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -212,7 +215,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 212 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, | 215 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, |
| 213 | { NULL, 0, 0, 0, 0, 0 } } | 216 | { NULL, 0, 0, 0, 0, 0 } } |
| 214 | }, | 217 | }, |
| 215 | { 0x000E, "AL-8", { | 218 | { 0x000E, NULL /* AL-8, need DMI string */, { |
| 216 | { "CPU Core", 0, 0, 10, 1, 0 }, | 219 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 217 | { "DDR", 1, 0, 10, 1, 0 }, | 220 | { "DDR", 1, 0, 10, 1, 0 }, |
| 218 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 221 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -233,7 +236,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 233 | { "SYS Fan", 34, 2, 60, 1, 0 }, | 236 | { "SYS Fan", 34, 2, 60, 1, 0 }, |
| 234 | { NULL, 0, 0, 0, 0, 0 } } | 237 | { NULL, 0, 0, 0, 0, 0 } } |
| 235 | }, | 238 | }, |
| 236 | { 0x000F, "unknown", { | 239 | { 0x000F, NULL /* Unknown, need DMI string */, { |
| 237 | { "CPU Core", 0, 0, 10, 1, 0 }, | 240 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 238 | { "DDR", 1, 0, 10, 1, 0 }, | 241 | { "DDR", 1, 0, 10, 1, 0 }, |
| 239 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 242 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -254,7 +257,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 254 | { "SYS Fan", 34, 2, 60, 1, 0 }, | 257 | { "SYS Fan", 34, 2, 60, 1, 0 }, |
| 255 | { NULL, 0, 0, 0, 0, 0 } } | 258 | { NULL, 0, 0, 0, 0, 0 } } |
| 256 | }, | 259 | }, |
| 257 | { 0x0010, "Abit NI8 SLI GR", { | 260 | { 0x0010, NULL /* Abit NI8 SLI GR, need DMI string */, { |
| 258 | { "CPU Core", 0, 0, 10, 1, 0 }, | 261 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 259 | { "DDR", 1, 0, 10, 1, 0 }, | 262 | { "DDR", 1, 0, 10, 1, 0 }, |
| 260 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 263 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -276,7 +279,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 276 | { "OTES1 Fan", 36, 2, 60, 1, 0 }, | 279 | { "OTES1 Fan", 36, 2, 60, 1, 0 }, |
| 277 | { NULL, 0, 0, 0, 0, 0 } } | 280 | { NULL, 0, 0, 0, 0, 0 } } |
| 278 | }, | 281 | }, |
| 279 | { 0x0011, "Abit AT8 32X", { | 282 | { 0x0011, NULL /* Abit AT8 32X, need DMI string */, { |
| 280 | { "CPU Core", 0, 0, 10, 1, 0 }, | 283 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 281 | { "DDR", 1, 0, 20, 1, 0 }, | 284 | { "DDR", 1, 0, 20, 1, 0 }, |
| 282 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 285 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -302,7 +305,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 302 | { "AUX2 Fan", 36, 2, 60, 1, 0 }, | 305 | { "AUX2 Fan", 36, 2, 60, 1, 0 }, |
| 303 | { NULL, 0, 0, 0, 0, 0 } } | 306 | { NULL, 0, 0, 0, 0, 0 } } |
| 304 | }, | 307 | }, |
| 305 | { 0x0012, "Abit AN8 32X", { | 308 | { 0x0012, NULL /* Abit AN8 32X, need DMI string */, { |
| 306 | { "CPU Core", 0, 0, 10, 1, 0 }, | 309 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 307 | { "DDR", 1, 0, 20, 1, 0 }, | 310 | { "DDR", 1, 0, 20, 1, 0 }, |
| 308 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 311 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -324,7 +327,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 324 | { "AUX1 Fan", 36, 2, 60, 1, 0 }, | 327 | { "AUX1 Fan", 36, 2, 60, 1, 0 }, |
| 325 | { NULL, 0, 0, 0, 0, 0 } } | 328 | { NULL, 0, 0, 0, 0, 0 } } |
| 326 | }, | 329 | }, |
| 327 | { 0x0013, "Abit AW8D", { | 330 | { 0x0013, NULL /* Abit AW8D, need DMI string */, { |
| 328 | { "CPU Core", 0, 0, 10, 1, 0 }, | 331 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 329 | { "DDR", 1, 0, 10, 1, 0 }, | 332 | { "DDR", 1, 0, 10, 1, 0 }, |
| 330 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 333 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -353,7 +356,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 353 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, | 356 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, |
| 354 | { NULL, 0, 0, 0, 0, 0 } } | 357 | { NULL, 0, 0, 0, 0, 0 } } |
| 355 | }, | 358 | }, |
| 356 | { 0x0014, "Abit AB9 Pro", { | 359 | { 0x0014, NULL /* Abit AB9 Pro, need DMI string */, { |
| 357 | { "CPU Core", 0, 0, 10, 1, 0 }, | 360 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 358 | { "DDR", 1, 0, 10, 1, 0 }, | 361 | { "DDR", 1, 0, 10, 1, 0 }, |
| 359 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 362 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -374,7 +377,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 374 | { "SYS Fan", 34, 2, 60, 1, 0 }, | 377 | { "SYS Fan", 34, 2, 60, 1, 0 }, |
| 375 | { NULL, 0, 0, 0, 0, 0 } } | 378 | { NULL, 0, 0, 0, 0, 0 } } |
| 376 | }, | 379 | }, |
| 377 | { 0x0015, "unknown", { | 380 | { 0x0015, NULL /* Unknown, need DMI string */, { |
| 378 | { "CPU Core", 0, 0, 10, 1, 0 }, | 381 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 379 | { "DDR", 1, 0, 20, 1, 0 }, | 382 | { "DDR", 1, 0, 20, 1, 0 }, |
| 380 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 383 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
| @@ -398,7 +401,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 398 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, | 401 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, |
| 399 | { NULL, 0, 0, 0, 0, 0 } } | 402 | { NULL, 0, 0, 0, 0, 0 } } |
| 400 | }, | 403 | }, |
| 401 | { 0x0016, "AW9D-MAX", { | 404 | { 0x0016, NULL /* AW9D-MAX, need DMI string */, { |
| 402 | { "CPU Core", 0, 0, 10, 1, 0 }, | 405 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 403 | { "DDR2", 1, 0, 20, 1, 0 }, | 406 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 404 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 407 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -426,7 +429,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 426 | { "OTES1 Fan", 38, 2, 60, 1, 0 }, | 429 | { "OTES1 Fan", 38, 2, 60, 1, 0 }, |
| 427 | { NULL, 0, 0, 0, 0, 0 } } | 430 | { NULL, 0, 0, 0, 0, 0 } } |
| 428 | }, | 431 | }, |
| 429 | { 0x0017, "unknown", { | 432 | { 0x0017, NULL /* Unknown, need DMI string */, { |
| 430 | { "CPU Core", 0, 0, 10, 1, 0 }, | 433 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 431 | { "DDR2", 1, 0, 20, 1, 0 }, | 434 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 432 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 435 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -451,7 +454,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 451 | { "AUX3 FAN", 37, 2, 60, 1, 0 }, | 454 | { "AUX3 FAN", 37, 2, 60, 1, 0 }, |
| 452 | { NULL, 0, 0, 0, 0, 0 } } | 455 | { NULL, 0, 0, 0, 0, 0 } } |
| 453 | }, | 456 | }, |
| 454 | { 0x0018, "unknown", { | 457 | { 0x0018, NULL /* Unknown, need DMI string */, { |
| 455 | { "CPU Core", 0, 0, 10, 1, 0 }, | 458 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 456 | { "DDR2", 1, 0, 20, 1, 0 }, | 459 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 457 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 460 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -478,7 +481,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 478 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, | 481 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, |
| 479 | { NULL, 0, 0, 0, 0, 0 } } | 482 | { NULL, 0, 0, 0, 0, 0 } } |
| 480 | }, | 483 | }, |
| 481 | { 0x0019, "unknown", { | 484 | { 0x0019, NULL /* Unknown, need DMI string */, { |
| 482 | { "CPU Core", 7, 0, 10, 1, 0 }, | 485 | { "CPU Core", 7, 0, 10, 1, 0 }, |
| 483 | { "DDR2", 13, 0, 20, 1, 0 }, | 486 | { "DDR2", 13, 0, 20, 1, 0 }, |
| 484 | { "DDR2 VTT", 14, 0, 10, 1, 0 }, | 487 | { "DDR2 VTT", 14, 0, 10, 1, 0 }, |
| @@ -505,7 +508,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 505 | { "AUX3 FAN", 36, 2, 60, 1, 0 }, | 508 | { "AUX3 FAN", 36, 2, 60, 1, 0 }, |
| 506 | { NULL, 0, 0, 0, 0, 0 } } | 509 | { NULL, 0, 0, 0, 0, 0 } } |
| 507 | }, | 510 | }, |
| 508 | { 0x001A, "Abit IP35 Pro", { | 511 | { 0x001A, "IP35 Pro(Intel P35-ICH9R)", { |
| 509 | { "CPU Core", 0, 0, 10, 1, 0 }, | 512 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 510 | { "DDR2", 1, 0, 20, 1, 0 }, | 513 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 511 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 514 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -533,7 +536,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 533 | { "AUX4 Fan", 37, 2, 60, 1, 0 }, | 536 | { "AUX4 Fan", 37, 2, 60, 1, 0 }, |
| 534 | { NULL, 0, 0, 0, 0, 0 } } | 537 | { NULL, 0, 0, 0, 0, 0 } } |
| 535 | }, | 538 | }, |
| 536 | { 0x001B, "unknown", { | 539 | { 0x001B, NULL /* Unknown, need DMI string */, { |
| 537 | { "CPU Core", 0, 0, 10, 1, 0 }, | 540 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 538 | { "DDR3", 1, 0, 20, 1, 0 }, | 541 | { "DDR3", 1, 0, 20, 1, 0 }, |
| 539 | { "DDR3 VTT", 2, 0, 10, 1, 0 }, | 542 | { "DDR3 VTT", 2, 0, 10, 1, 0 }, |
| @@ -560,7 +563,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
| 560 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, | 563 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, |
| 561 | { NULL, 0, 0, 0, 0, 0 } } | 564 | { NULL, 0, 0, 0, 0, 0 } } |
| 562 | }, | 565 | }, |
| 563 | { 0x001C, "unknown", { | 566 | { 0x001C, NULL /* Unknown, need DMI string */, { |
| 564 | { "CPU Core", 0, 0, 10, 1, 0 }, | 567 | { "CPU Core", 0, 0, 10, 1, 0 }, |
| 565 | { "DDR2", 1, 0, 20, 1, 0 }, | 568 | { "DDR2", 1, 0, 20, 1, 0 }, |
| 566 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 569 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
| @@ -935,9 +938,18 @@ static int __devinit abituguru3_probe(struct platform_device *pdev) | |||
| 935 | goto abituguru3_probe_error; | 938 | goto abituguru3_probe_error; |
| 936 | } | 939 | } |
| 937 | data->sensors = abituguru3_motherboards[i].sensors; | 940 | data->sensors = abituguru3_motherboards[i].sensors; |
| 941 | |||
| 938 | printk(KERN_INFO ABIT_UGURU3_NAME ": found Abit uGuru3, motherboard " | 942 | printk(KERN_INFO ABIT_UGURU3_NAME ": found Abit uGuru3, motherboard " |
| 939 | "ID: %04X (%s)\n", (unsigned int)id, | 943 | "ID: %04X\n", (unsigned int)id); |
| 940 | abituguru3_motherboards[i].name); | 944 | |
| 945 | #ifdef CONFIG_DMI | ||
| 946 | if (!abituguru3_motherboards[i].dmi_name) { | ||
| 947 | printk(KERN_WARNING ABIT_UGURU3_NAME ": this motherboard was " | ||
| 948 | "not detected using DMI. Please send the output of " | ||
| 949 | "\"dmidecode\" to the abituguru3 maintainer" | ||
| 950 | "(see MAINTAINERS)\n"); | ||
| 951 | } | ||
| 952 | #endif | ||
| 941 | 953 | ||
| 942 | /* Fill the sysfs attr array */ | 954 | /* Fill the sysfs attr array */ |
| 943 | sysfs_attr_i = 0; | 955 | sysfs_attr_i = 0; |
| @@ -1109,6 +1121,46 @@ static struct platform_driver abituguru3_driver = { | |||
| 1109 | .resume = abituguru3_resume | 1121 | .resume = abituguru3_resume |
| 1110 | }; | 1122 | }; |
| 1111 | 1123 | ||
| 1124 | #ifdef CONFIG_DMI | ||
| 1125 | |||
| 1126 | static int __init abituguru3_dmi_detect(void) | ||
| 1127 | { | ||
| 1128 | const char *board_vendor, *board_name; | ||
| 1129 | int i, err = (force) ? 1 : -ENODEV; | ||
| 1130 | |||
| 1131 | board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); | ||
| 1132 | if (!board_vendor || strcmp(board_vendor, "http://www.abit.com.tw/")) | ||
| 1133 | return err; | ||
| 1134 | |||
| 1135 | board_name = dmi_get_system_info(DMI_BOARD_NAME); | ||
| 1136 | if (!board_name) | ||
| 1137 | return err; | ||
| 1138 | |||
| 1139 | for (i = 0; abituguru3_motherboards[i].id; i++) { | ||
| 1140 | const char *dmi_name = abituguru3_motherboards[i].dmi_name; | ||
| 1141 | if (dmi_name && !strcmp(dmi_name, board_name)) | ||
| 1142 | break; | ||
| 1143 | } | ||
| 1144 | |||
| 1145 | if (!abituguru3_motherboards[i].id) | ||
| 1146 | return 1; | ||
| 1147 | |||
| 1148 | return 0; | ||
| 1149 | } | ||
| 1150 | |||
| 1151 | #else /* !CONFIG_DMI */ | ||
| 1152 | |||
| 1153 | static inline int abituguru3_dmi_detect(void) | ||
| 1154 | { | ||
| 1155 | return -ENODEV; | ||
| 1156 | } | ||
| 1157 | |||
| 1158 | #endif /* CONFIG_DMI */ | ||
| 1159 | |||
| 1160 | /* FIXME: Manual detection should die eventually; we need to collect stable | ||
| 1161 | * DMI model names first before we can rely entirely on CONFIG_DMI. | ||
| 1162 | */ | ||
| 1163 | |||
| 1112 | static int __init abituguru3_detect(void) | 1164 | static int __init abituguru3_detect(void) |
| 1113 | { | 1165 | { |
| 1114 | /* See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or | 1166 | /* See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or |
| @@ -1119,7 +1171,7 @@ static int __init abituguru3_detect(void) | |||
| 1119 | if (((data_val == 0x00) || (data_val == 0x08)) && | 1171 | if (((data_val == 0x00) || (data_val == 0x08)) && |
| 1120 | ((cmd_val == 0xAC) || (cmd_val == 0x05) || | 1172 | ((cmd_val == 0xAC) || (cmd_val == 0x05) || |
| 1121 | (cmd_val == 0x55))) | 1173 | (cmd_val == 0x55))) |
| 1122 | return ABIT_UGURU3_BASE; | 1174 | return 0; |
| 1123 | 1175 | ||
| 1124 | ABIT_UGURU3_DEBUG("no Abit uGuru3 found, data = 0x%02X, cmd = " | 1176 | ABIT_UGURU3_DEBUG("no Abit uGuru3 found, data = 0x%02X, cmd = " |
| 1125 | "0x%02X\n", (unsigned int)data_val, (unsigned int)cmd_val); | 1177 | "0x%02X\n", (unsigned int)data_val, (unsigned int)cmd_val); |
| @@ -1127,7 +1179,7 @@ static int __init abituguru3_detect(void) | |||
| 1127 | if (force) { | 1179 | if (force) { |
| 1128 | printk(KERN_INFO ABIT_UGURU3_NAME ": Assuming Abit uGuru3 is " | 1180 | printk(KERN_INFO ABIT_UGURU3_NAME ": Assuming Abit uGuru3 is " |
| 1129 | "present because of \"force\" parameter\n"); | 1181 | "present because of \"force\" parameter\n"); |
| 1130 | return ABIT_UGURU3_BASE; | 1182 | return 0; |
| 1131 | } | 1183 | } |
| 1132 | 1184 | ||
| 1133 | /* No uGuru3 found */ | 1185 | /* No uGuru3 found */ |
| @@ -1138,27 +1190,29 @@ static struct platform_device *abituguru3_pdev; | |||
| 1138 | 1190 | ||
| 1139 | static int __init abituguru3_init(void) | 1191 | static int __init abituguru3_init(void) |
| 1140 | { | 1192 | { |
| 1141 | int address, err; | ||
| 1142 | struct resource res = { .flags = IORESOURCE_IO }; | 1193 | struct resource res = { .flags = IORESOURCE_IO }; |
| 1143 | 1194 | int err; | |
| 1144 | #ifdef CONFIG_DMI | 1195 | |
| 1145 | const char *board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); | 1196 | /* Attempt DMI detection first */ |
| 1146 | 1197 | err = abituguru3_dmi_detect(); | |
| 1147 | /* safety check, refuse to load on non Abit motherboards */ | 1198 | if (err < 0) |
| 1148 | if (!force && (!board_vendor || | 1199 | return err; |
| 1149 | strcmp(board_vendor, "http://www.abit.com.tw/"))) | 1200 | |
| 1150 | return -ENODEV; | 1201 | /* Fall back to manual detection if there was no exact |
| 1151 | #endif | 1202 | * board name match, or force was specified. |
| 1152 | 1203 | */ | |
| 1153 | address = abituguru3_detect(); | 1204 | if (err > 0) { |
| 1154 | if (address < 0) | 1205 | err = abituguru3_detect(); |
| 1155 | return address; | 1206 | if (err) |
| 1207 | return err; | ||
| 1208 | } | ||
| 1156 | 1209 | ||
| 1157 | err = platform_driver_register(&abituguru3_driver); | 1210 | err = platform_driver_register(&abituguru3_driver); |
| 1158 | if (err) | 1211 | if (err) |
| 1159 | goto exit; | 1212 | goto exit; |
| 1160 | 1213 | ||
| 1161 | abituguru3_pdev = platform_device_alloc(ABIT_UGURU3_NAME, address); | 1214 | abituguru3_pdev = platform_device_alloc(ABIT_UGURU3_NAME, |
| 1215 | ABIT_UGURU3_BASE); | ||
| 1162 | if (!abituguru3_pdev) { | 1216 | if (!abituguru3_pdev) { |
| 1163 | printk(KERN_ERR ABIT_UGURU3_NAME | 1217 | printk(KERN_ERR ABIT_UGURU3_NAME |
| 1164 | ": Device allocation failed\n"); | 1218 | ": Device allocation failed\n"); |
| @@ -1166,8 +1220,8 @@ static int __init abituguru3_init(void) | |||
| 1166 | goto exit_driver_unregister; | 1220 | goto exit_driver_unregister; |
| 1167 | } | 1221 | } |
| 1168 | 1222 | ||
| 1169 | res.start = address; | 1223 | res.start = ABIT_UGURU3_BASE; |
| 1170 | res.end = address + ABIT_UGURU3_REGION_LENGTH - 1; | 1224 | res.end = ABIT_UGURU3_BASE + ABIT_UGURU3_REGION_LENGTH - 1; |
| 1171 | res.name = ABIT_UGURU3_NAME; | 1225 | res.name = ABIT_UGURU3_NAME; |
| 1172 | 1226 | ||
| 1173 | err = platform_device_add_resources(abituguru3_pdev, &res, 1); | 1227 | err = platform_device_add_resources(abituguru3_pdev, &res, 1); |
diff --git a/drivers/hwmon/adcxx.c b/drivers/hwmon/adcxx.c new file mode 100644 index 000000000000..242294db3db6 --- /dev/null +++ b/drivers/hwmon/adcxx.c | |||
| @@ -0,0 +1,329 @@ | |||
| 1 | /* | ||
| 2 | * adcxx.c | ||
| 3 | * | ||
| 4 | * The adcxx4s is an AD converter family from National Semiconductor (NS). | ||
| 5 | * | ||
| 6 | * Copyright (c) 2008 Marc Pignat <marc.pignat@hevs.ch> | ||
| 7 | * | ||
| 8 | * The adcxx4s communicates with a host processor via an SPI/Microwire Bus | ||
| 9 | * interface. This driver supports the whole family of devices with name | ||
| 10 | * ADC<bb><c>S<sss>, where | ||
| 11 | * * bb is the resolution in number of bits (8, 10, 12) | ||
| 12 | * * c is the number of channels (1, 2, 4, 8) | ||
| 13 | * * sss is the maximum conversion speed (021 for 200 kSPS, 051 for 500 kSPS | ||
| 14 | * and 101 for 1 MSPS) | ||
| 15 | * | ||
| 16 | * Complete datasheets are available at National's website here: | ||
| 17 | * http://www.national.com/ds/DC/ADC<bb><c>S<sss>.pdf | ||
| 18 | * | ||
| 19 | * Handling of 8, 10 and 12 bits converters are the same, the | ||
| 20 | * unavailable bits are 0 :) | ||
| 21 | * | ||
| 22 | * This program is free software; you can redistribute it and/or modify | ||
| 23 | * it under the terms of the GNU General Public License as published by | ||
| 24 | * the Free Software Foundation; either version 2 of the License, or | ||
| 25 | * (at your option) any later version. | ||
| 26 | * | ||
| 27 | * This program is distributed in the hope that it will be useful, | ||
| 28 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 29 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 30 | * GNU General Public License for more details. | ||
| 31 | * | ||
| 32 | * You should have received a copy of the GNU General Public License | ||
| 33 | * along with this program; if not, write to the Free Software | ||
| 34 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 35 | */ | ||
| 36 | |||
| 37 | #include <linux/init.h> | ||
| 38 | #include <linux/module.h> | ||
| 39 | #include <linux/kernel.h> | ||
| 40 | #include <linux/device.h> | ||
| 41 | #include <linux/err.h> | ||
| 42 | #include <linux/sysfs.h> | ||
| 43 | #include <linux/hwmon.h> | ||
| 44 | #include <linux/hwmon-sysfs.h> | ||
| 45 | #include <linux/mutex.h> | ||
| 46 | #include <linux/spi/spi.h> | ||
| 47 | |||
| 48 | #define DRVNAME "adcxx" | ||
| 49 | |||
| 50 | struct adcxx { | ||
| 51 | struct device *hwmon_dev; | ||
| 52 | struct mutex lock; | ||
| 53 | u32 channels; | ||
| 54 | u32 reference; /* in millivolts */ | ||
| 55 | }; | ||
| 56 | |||
| 57 | /* sysfs hook function */ | ||
| 58 | static ssize_t adcxx_read(struct device *dev, | ||
| 59 | struct device_attribute *devattr, char *buf) | ||
| 60 | { | ||
| 61 | struct spi_device *spi = to_spi_device(dev); | ||
| 62 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
| 63 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 64 | u8 tx_buf[2] = { attr->index << 3 }; /* other bits are don't care */ | ||
| 65 | u8 rx_buf[2]; | ||
| 66 | int status; | ||
| 67 | int value; | ||
| 68 | |||
| 69 | if (mutex_lock_interruptible(&adc->lock)) | ||
| 70 | return -ERESTARTSYS; | ||
| 71 | |||
| 72 | status = spi_write_then_read(spi, tx_buf, sizeof(tx_buf), | ||
| 73 | rx_buf, sizeof(rx_buf)); | ||
| 74 | if (status < 0) { | ||
| 75 | dev_warn(dev, "spi_write_then_read failed with status %d\n", | ||
| 76 | status); | ||
| 77 | goto out; | ||
| 78 | } | ||
| 79 | |||
| 80 | value = (rx_buf[0] << 8) + rx_buf[1]; | ||
| 81 | dev_dbg(dev, "raw value = 0x%x\n", value); | ||
| 82 | |||
| 83 | value = value * adc->reference >> 12; | ||
| 84 | status = sprintf(buf, "%d\n", value); | ||
| 85 | out: | ||
| 86 | mutex_unlock(&adc->lock); | ||
| 87 | return status; | ||
| 88 | } | ||
| 89 | |||
| 90 | static ssize_t adcxx_show_min(struct device *dev, | ||
| 91 | struct device_attribute *devattr, char *buf) | ||
| 92 | { | ||
| 93 | /* The minimum reference is 0 for this chip family */ | ||
| 94 | return sprintf(buf, "0\n"); | ||
| 95 | } | ||
| 96 | |||
| 97 | static ssize_t adcxx_show_max(struct device *dev, | ||
| 98 | struct device_attribute *devattr, char *buf) | ||
| 99 | { | ||
| 100 | struct spi_device *spi = to_spi_device(dev); | ||
| 101 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 102 | u32 reference; | ||
| 103 | |||
| 104 | if (mutex_lock_interruptible(&adc->lock)) | ||
| 105 | return -ERESTARTSYS; | ||
| 106 | |||
| 107 | reference = adc->reference; | ||
| 108 | |||
| 109 | mutex_unlock(&adc->lock); | ||
| 110 | |||
| 111 | return sprintf(buf, "%d\n", reference); | ||
| 112 | } | ||
| 113 | |||
| 114 | static ssize_t adcxx_set_max(struct device *dev, | ||
| 115 | struct device_attribute *devattr, const char *buf, size_t count) | ||
| 116 | { | ||
| 117 | struct spi_device *spi = to_spi_device(dev); | ||
| 118 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 119 | unsigned long value; | ||
| 120 | |||
| 121 | if (strict_strtoul(buf, 10, &value)) | ||
| 122 | return -EINVAL; | ||
| 123 | |||
| 124 | if (mutex_lock_interruptible(&adc->lock)) | ||
| 125 | return -ERESTARTSYS; | ||
| 126 | |||
| 127 | adc->reference = value; | ||
| 128 | |||
| 129 | mutex_unlock(&adc->lock); | ||
| 130 | |||
| 131 | return count; | ||
| 132 | } | ||
| 133 | |||
| 134 | static ssize_t adcxx_show_name(struct device *dev, struct device_attribute | ||
| 135 | *devattr, char *buf) | ||
| 136 | { | ||
| 137 | struct spi_device *spi = to_spi_device(dev); | ||
| 138 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 139 | |||
| 140 | return sprintf(buf, "adcxx%ds\n", adc->channels); | ||
| 141 | } | ||
| 142 | |||
| 143 | static struct sensor_device_attribute ad_input[] = { | ||
| 144 | SENSOR_ATTR(name, S_IRUGO, adcxx_show_name, NULL, 0), | ||
| 145 | SENSOR_ATTR(in_min, S_IRUGO, adcxx_show_min, NULL, 0), | ||
| 146 | SENSOR_ATTR(in_max, S_IWUSR | S_IRUGO, adcxx_show_max, | ||
| 147 | adcxx_set_max, 0), | ||
| 148 | SENSOR_ATTR(in0_input, S_IRUGO, adcxx_read, NULL, 0), | ||
| 149 | SENSOR_ATTR(in1_input, S_IRUGO, adcxx_read, NULL, 1), | ||
| 150 | SENSOR_ATTR(in2_input, S_IRUGO, adcxx_read, NULL, 2), | ||
| 151 | SENSOR_ATTR(in3_input, S_IRUGO, adcxx_read, NULL, 3), | ||
| 152 | SENSOR_ATTR(in4_input, S_IRUGO, adcxx_read, NULL, 4), | ||
| 153 | SENSOR_ATTR(in5_input, S_IRUGO, adcxx_read, NULL, 5), | ||
| 154 | SENSOR_ATTR(in6_input, S_IRUGO, adcxx_read, NULL, 6), | ||
| 155 | SENSOR_ATTR(in7_input, S_IRUGO, adcxx_read, NULL, 7), | ||
| 156 | }; | ||
| 157 | |||
| 158 | /*----------------------------------------------------------------------*/ | ||
| 159 | |||
| 160 | static int __devinit adcxx_probe(struct spi_device *spi, int channels) | ||
| 161 | { | ||
| 162 | struct adcxx *adc; | ||
| 163 | int status; | ||
| 164 | int i; | ||
| 165 | |||
| 166 | adc = kzalloc(sizeof *adc, GFP_KERNEL); | ||
| 167 | if (!adc) | ||
| 168 | return -ENOMEM; | ||
| 169 | |||
| 170 | /* set a default value for the reference */ | ||
| 171 | adc->reference = 3300; | ||
| 172 | adc->channels = channels; | ||
| 173 | mutex_init(&adc->lock); | ||
| 174 | |||
| 175 | mutex_lock(&adc->lock); | ||
| 176 | |||
| 177 | dev_set_drvdata(&spi->dev, adc); | ||
| 178 | |||
| 179 | for (i = 0; i < 3 + adc->channels; i++) { | ||
| 180 | status = device_create_file(&spi->dev, &ad_input[i].dev_attr); | ||
| 181 | if (status) { | ||
| 182 | dev_err(&spi->dev, "device_create_file failed.\n"); | ||
| 183 | goto out_err; | ||
| 184 | } | ||
| 185 | } | ||
| 186 | |||
| 187 | adc->hwmon_dev = hwmon_device_register(&spi->dev); | ||
| 188 | if (IS_ERR(adc->hwmon_dev)) { | ||
| 189 | dev_err(&spi->dev, "hwmon_device_register failed.\n"); | ||
| 190 | status = PTR_ERR(adc->hwmon_dev); | ||
| 191 | goto out_err; | ||
| 192 | } | ||
| 193 | |||
| 194 | mutex_unlock(&adc->lock); | ||
| 195 | return 0; | ||
| 196 | |||
| 197 | out_err: | ||
| 198 | for (i--; i >= 0; i--) | ||
| 199 | device_remove_file(&spi->dev, &ad_input[i].dev_attr); | ||
| 200 | |||
| 201 | dev_set_drvdata(&spi->dev, NULL); | ||
| 202 | mutex_unlock(&adc->lock); | ||
| 203 | kfree(adc); | ||
| 204 | return status; | ||
| 205 | } | ||
| 206 | |||
| 207 | static int __devinit adcxx1s_probe(struct spi_device *spi) | ||
| 208 | { | ||
| 209 | return adcxx_probe(spi, 1); | ||
| 210 | } | ||
| 211 | |||
| 212 | static int __devinit adcxx2s_probe(struct spi_device *spi) | ||
| 213 | { | ||
| 214 | return adcxx_probe(spi, 2); | ||
| 215 | } | ||
| 216 | |||
| 217 | static int __devinit adcxx4s_probe(struct spi_device *spi) | ||
| 218 | { | ||
| 219 | return adcxx_probe(spi, 4); | ||
| 220 | } | ||
| 221 | |||
| 222 | static int __devinit adcxx8s_probe(struct spi_device *spi) | ||
| 223 | { | ||
| 224 | return adcxx_probe(spi, 8); | ||
| 225 | } | ||
| 226 | |||
| 227 | static int __devexit adcxx_remove(struct spi_device *spi) | ||
| 228 | { | ||
| 229 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
| 230 | int i; | ||
| 231 | |||
| 232 | mutex_lock(&adc->lock); | ||
| 233 | hwmon_device_unregister(adc->hwmon_dev); | ||
| 234 | for (i = 0; i < 3 + adc->channels; i++) | ||
| 235 | device_remove_file(&spi->dev, &ad_input[i].dev_attr); | ||
| 236 | |||
| 237 | dev_set_drvdata(&spi->dev, NULL); | ||
| 238 | mutex_unlock(&adc->lock); | ||
| 239 | kfree(adc); | ||
| 240 | |||
| 241 | return 0; | ||
| 242 | } | ||
| 243 | |||
| 244 | static struct spi_driver adcxx1s_driver = { | ||
| 245 | .driver = { | ||
| 246 | .name = "adcxx1s", | ||
| 247 | .owner = THIS_MODULE, | ||
| 248 | }, | ||
| 249 | .probe = adcxx1s_probe, | ||
| 250 | .remove = __devexit_p(adcxx_remove), | ||
| 251 | }; | ||
| 252 | |||
| 253 | static struct spi_driver adcxx2s_driver = { | ||
| 254 | .driver = { | ||
| 255 | .name = "adcxx2s", | ||
| 256 | .owner = THIS_MODULE, | ||
| 257 | }, | ||
| 258 | .probe = adcxx2s_probe, | ||
| 259 | .remove = __devexit_p(adcxx_remove), | ||
| 260 | }; | ||
| 261 | |||
| 262 | static struct spi_driver adcxx4s_driver = { | ||
| 263 | .driver = { | ||
| 264 | .name = "adcxx4s", | ||
| 265 | .owner = THIS_MODULE, | ||
| 266 | }, | ||
| 267 | .probe = adcxx4s_probe, | ||
| 268 | .remove = __devexit_p(adcxx_remove), | ||
| 269 | }; | ||
| 270 | |||
| 271 | static struct spi_driver adcxx8s_driver = { | ||
| 272 | .driver = { | ||
| 273 | .name = "adcxx8s", | ||
| 274 | .owner = THIS_MODULE, | ||
| 275 | }, | ||
| 276 | .probe = adcxx8s_probe, | ||
| 277 | .remove = __devexit_p(adcxx_remove), | ||
| 278 | }; | ||
| 279 | |||
| 280 | static int __init init_adcxx(void) | ||
| 281 | { | ||
| 282 | int status; | ||
| 283 | status = spi_register_driver(&adcxx1s_driver); | ||
| 284 | if (status) | ||
| 285 | goto reg_1_failed; | ||
| 286 | |||
| 287 | status = spi_register_driver(&adcxx2s_driver); | ||
| 288 | if (status) | ||
| 289 | goto reg_2_failed; | ||
| 290 | |||
| 291 | status = spi_register_driver(&adcxx4s_driver); | ||
| 292 | if (status) | ||
| 293 | goto reg_4_failed; | ||
| 294 | |||
| 295 | status = spi_register_driver(&adcxx8s_driver); | ||
| 296 | if (status) | ||
| 297 | goto reg_8_failed; | ||
| 298 | |||
| 299 | return status; | ||
| 300 | |||
| 301 | reg_8_failed: | ||
| 302 | spi_unregister_driver(&adcxx4s_driver); | ||
| 303 | reg_4_failed: | ||
| 304 | spi_unregister_driver(&adcxx2s_driver); | ||
| 305 | reg_2_failed: | ||
| 306 | spi_unregister_driver(&adcxx1s_driver); | ||
| 307 | reg_1_failed: | ||
| 308 | return status; | ||
| 309 | } | ||
| 310 | |||
| 311 | static void __exit exit_adcxx(void) | ||
| 312 | { | ||
| 313 | spi_unregister_driver(&adcxx1s_driver); | ||
| 314 | spi_unregister_driver(&adcxx2s_driver); | ||
| 315 | spi_unregister_driver(&adcxx4s_driver); | ||
| 316 | spi_unregister_driver(&adcxx8s_driver); | ||
| 317 | } | ||
| 318 | |||
| 319 | module_init(init_adcxx); | ||
| 320 | module_exit(exit_adcxx); | ||
| 321 | |||
| 322 | MODULE_AUTHOR("Marc Pignat"); | ||
| 323 | MODULE_DESCRIPTION("National Semiconductor adcxx8sxxx Linux driver"); | ||
| 324 | MODULE_LICENSE("GPL"); | ||
| 325 | |||
| 326 | MODULE_ALIAS("adcxx1s"); | ||
| 327 | MODULE_ALIAS("adcxx2s"); | ||
| 328 | MODULE_ALIAS("adcxx4s"); | ||
| 329 | MODULE_ALIAS("adcxx8s"); | ||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index aacc0c4b809c..b06b8e090a27 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
| @@ -98,6 +98,12 @@ static const char* temperature_sensors_sets[][36] = { | |||
| 98 | "TH1P", "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S", | 98 | "TH1P", "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S", |
| 99 | "TM1P", "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", | 99 | "TM1P", "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", |
| 100 | "TM9S", "TN0H", "TS0C", NULL }, | 100 | "TM9S", "TN0H", "TS0C", NULL }, |
| 101 | /* Set 5: iMac */ | ||
| 102 | { "TC0D", "TA0P", "TG0P", "TG0D", "TG0H", "TH0P", "Tm0P", "TO0P", | ||
| 103 | "Tp0C", NULL }, | ||
| 104 | /* Set 6: Macbook3 set */ | ||
| 105 | { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TTF0", "TW0P", "Th0H", | ||
| 106 | "Th0S", "Th1H", NULL }, | ||
| 101 | }; | 107 | }; |
| 102 | 108 | ||
| 103 | /* List of keys used to read/write fan speeds */ | 109 | /* List of keys used to read/write fan speeds */ |
| @@ -1223,6 +1229,10 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = { | |||
| 1223 | { .accelerometer = 0, .light = 0, .temperature_set = 3 }, | 1229 | { .accelerometer = 0, .light = 0, .temperature_set = 3 }, |
| 1224 | /* MacPro: temperature set 4 */ | 1230 | /* MacPro: temperature set 4 */ |
| 1225 | { .accelerometer = 0, .light = 0, .temperature_set = 4 }, | 1231 | { .accelerometer = 0, .light = 0, .temperature_set = 4 }, |
| 1232 | /* iMac: temperature set 5 */ | ||
| 1233 | { .accelerometer = 0, .light = 0, .temperature_set = 5 }, | ||
| 1234 | /* MacBook3: accelerometer and temperature set 6 */ | ||
| 1235 | { .accelerometer = 1, .light = 0, .temperature_set = 6 }, | ||
| 1226 | }; | 1236 | }; |
| 1227 | 1237 | ||
| 1228 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". | 1238 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". |
| @@ -1232,10 +1242,14 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
| 1232 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1242 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1233 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") }, | 1243 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") }, |
| 1234 | (void*)&applesmc_dmi_data[0]}, | 1244 | (void*)&applesmc_dmi_data[0]}, |
| 1235 | { applesmc_dmi_match, "Apple MacBook", { | 1245 | { applesmc_dmi_match, "Apple MacBook (v2)", { |
| 1236 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1246 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1237 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") }, | 1247 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") }, |
| 1238 | (void*)&applesmc_dmi_data[1]}, | 1248 | (void*)&applesmc_dmi_data[1]}, |
| 1249 | { applesmc_dmi_match, "Apple MacBook (v3)", { | ||
| 1250 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | ||
| 1251 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") }, | ||
| 1252 | (void*)&applesmc_dmi_data[6]}, | ||
| 1239 | { applesmc_dmi_match, "Apple MacBook", { | 1253 | { applesmc_dmi_match, "Apple MacBook", { |
| 1240 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1254 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1241 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") }, | 1255 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") }, |
| @@ -1248,6 +1262,10 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
| 1248 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1262 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1249 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, | 1263 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, |
| 1250 | (void*)&applesmc_dmi_data[4]}, | 1264 | (void*)&applesmc_dmi_data[4]}, |
| 1265 | { applesmc_dmi_match, "Apple iMac", { | ||
| 1266 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | ||
| 1267 | DMI_MATCH(DMI_PRODUCT_NAME,"iMac") }, | ||
| 1268 | (void*)&applesmc_dmi_data[5]}, | ||
| 1251 | { .ident = NULL } | 1269 | { .ident = NULL } |
| 1252 | }; | 1270 | }; |
| 1253 | 1271 | ||
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 70239acecc8e..93c17223b527 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
| @@ -413,10 +413,11 @@ static int __init coretemp_init(void) | |||
| 413 | for_each_online_cpu(i) { | 413 | for_each_online_cpu(i) { |
| 414 | struct cpuinfo_x86 *c = &cpu_data(i); | 414 | struct cpuinfo_x86 *c = &cpu_data(i); |
| 415 | 415 | ||
| 416 | /* check if family 6, models 0xe, 0xf, 0x16, 0x17 */ | 416 | /* check if family 6, models 0xe, 0xf, 0x16, 0x17, 0x1A */ |
| 417 | if ((c->cpuid_level < 0) || (c->x86 != 0x6) || | 417 | if ((c->cpuid_level < 0) || (c->x86 != 0x6) || |
| 418 | !((c->x86_model == 0xe) || (c->x86_model == 0xf) || | 418 | !((c->x86_model == 0xe) || (c->x86_model == 0xf) || |
| 419 | (c->x86_model == 0x16) || (c->x86_model == 0x17))) { | 419 | (c->x86_model == 0x16) || (c->x86_model == 0x17) || |
| 420 | (c->x86_model == 0x1A))) { | ||
| 420 | 421 | ||
| 421 | /* supported CPU not found, but report the unknown | 422 | /* supported CPU not found, but report the unknown |
| 422 | family 6 CPU */ | 423 | family 6 CPU */ |
diff --git a/drivers/hwmon/i5k_amb.c b/drivers/hwmon/i5k_amb.c index f9e2ed621f7b..2ede9388096b 100644 --- a/drivers/hwmon/i5k_amb.c +++ b/drivers/hwmon/i5k_amb.c | |||
| @@ -81,6 +81,8 @@ static unsigned long amb_reg_temp(unsigned int amb) | |||
| 81 | #define MAX_AMBS_PER_CHANNEL 16 | 81 | #define MAX_AMBS_PER_CHANNEL 16 |
| 82 | #define MAX_AMBS (MAX_MEM_CHANNELS * \ | 82 | #define MAX_AMBS (MAX_MEM_CHANNELS * \ |
| 83 | MAX_AMBS_PER_CHANNEL) | 83 | MAX_AMBS_PER_CHANNEL) |
| 84 | #define CHANNEL_SHIFT 4 | ||
| 85 | #define DIMM_MASK 0xF | ||
| 84 | /* | 86 | /* |
| 85 | * Ugly hack: For some reason the highest bit is set if there | 87 | * Ugly hack: For some reason the highest bit is set if there |
| 86 | * are _any_ DIMMs in the channel. Attempting to read from | 88 | * are _any_ DIMMs in the channel. Attempting to read from |
| @@ -89,7 +91,7 @@ static unsigned long amb_reg_temp(unsigned int amb) | |||
| 89 | * might prevent us from seeing the 16th DIMM in the channel. | 91 | * might prevent us from seeing the 16th DIMM in the channel. |
| 90 | */ | 92 | */ |
| 91 | #define REAL_MAX_AMBS_PER_CHANNEL 15 | 93 | #define REAL_MAX_AMBS_PER_CHANNEL 15 |
| 92 | #define KNOBS_PER_AMB 5 | 94 | #define KNOBS_PER_AMB 6 |
| 93 | 95 | ||
| 94 | static unsigned long amb_num_from_reg(unsigned int byte_num, unsigned int bit) | 96 | static unsigned long amb_num_from_reg(unsigned int byte_num, unsigned int bit) |
| 95 | { | 97 | { |
| @@ -238,6 +240,16 @@ static ssize_t show_amb_temp(struct device *dev, | |||
| 238 | 500 * amb_read_byte(data, amb_reg_temp(attr->index))); | 240 | 500 * amb_read_byte(data, amb_reg_temp(attr->index))); |
| 239 | } | 241 | } |
| 240 | 242 | ||
| 243 | static ssize_t show_label(struct device *dev, | ||
| 244 | struct device_attribute *devattr, | ||
| 245 | char *buf) | ||
| 246 | { | ||
| 247 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
| 248 | |||
| 249 | return sprintf(buf, "Ch. %d DIMM %d\n", attr->index >> CHANNEL_SHIFT, | ||
| 250 | attr->index & DIMM_MASK); | ||
| 251 | } | ||
| 252 | |||
| 241 | static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | 253 | static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) |
| 242 | { | 254 | { |
| 243 | int i, j, k, d = 0; | 255 | int i, j, k, d = 0; |
| @@ -268,6 +280,20 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
| 268 | continue; | 280 | continue; |
| 269 | d++; | 281 | d++; |
| 270 | 282 | ||
| 283 | /* sysfs label */ | ||
| 284 | iattr = data->attrs + data->num_attrs; | ||
| 285 | snprintf(iattr->name, AMB_SYSFS_NAME_LEN, | ||
| 286 | "temp%d_label", d); | ||
| 287 | iattr->s_attr.dev_attr.attr.name = iattr->name; | ||
| 288 | iattr->s_attr.dev_attr.attr.mode = S_IRUGO; | ||
| 289 | iattr->s_attr.dev_attr.show = show_label; | ||
| 290 | iattr->s_attr.index = k; | ||
| 291 | res = device_create_file(&pdev->dev, | ||
| 292 | &iattr->s_attr.dev_attr); | ||
| 293 | if (res) | ||
| 294 | goto exit_remove; | ||
| 295 | data->num_attrs++; | ||
| 296 | |||
| 271 | /* Temperature sysfs knob */ | 297 | /* Temperature sysfs knob */ |
| 272 | iattr = data->attrs + data->num_attrs; | 298 | iattr = data->attrs + data->num_attrs; |
| 273 | snprintf(iattr->name, AMB_SYSFS_NAME_LEN, | 299 | snprintf(iattr->name, AMB_SYSFS_NAME_LEN, |
diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c index c9416e657487..0f70dc204105 100644 --- a/drivers/hwmon/ibmaem.c +++ b/drivers/hwmon/ibmaem.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * A hwmon driver for the IBM Active Energy Manager temperature/power sensors | 2 | * A hwmon driver for the IBM System Director Active Energy Manager (AEM) |
| 3 | * and capping functionality. | 3 | * temperature/power/energy sensors and capping functionality. |
| 4 | * Copyright (C) 2008 IBM | 4 | * Copyright (C) 2008 IBM |
| 5 | * | 5 | * |
| 6 | * Author: Darrick J. Wong <djwong@us.ibm.com> | 6 | * Author: Darrick J. Wong <djwong@us.ibm.com> |
| @@ -463,12 +463,18 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, | |||
| 463 | } | 463 | } |
| 464 | 464 | ||
| 465 | /* Update AEM energy registers */ | 465 | /* Update AEM energy registers */ |
| 466 | static void update_aem_energy_one(struct aem_data *data, int which) | ||
| 467 | { | ||
| 468 | aem_read_sensor(data, AEM_ENERGY_ELEMENT, which, | ||
| 469 | &data->energy[which], 8); | ||
| 470 | } | ||
| 471 | |||
| 466 | static void update_aem_energy(struct aem_data *data) | 472 | static void update_aem_energy(struct aem_data *data) |
| 467 | { | 473 | { |
| 468 | aem_read_sensor(data, AEM_ENERGY_ELEMENT, 0, &data->energy[0], 8); | 474 | update_aem_energy_one(data, 0); |
| 469 | if (data->ver_major < 2) | 475 | if (data->ver_major < 2) |
| 470 | return; | 476 | return; |
| 471 | aem_read_sensor(data, AEM_ENERGY_ELEMENT, 1, &data->energy[1], 8); | 477 | update_aem_energy_one(data, 1); |
| 472 | } | 478 | } |
| 473 | 479 | ||
| 474 | /* Update all AEM1 sensors */ | 480 | /* Update all AEM1 sensors */ |
| @@ -676,7 +682,8 @@ static int aem_find_aem2(struct aem_ipmi_data *data, | |||
| 676 | return -ETIMEDOUT; | 682 | return -ETIMEDOUT; |
| 677 | 683 | ||
| 678 | if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) || | 684 | if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) || |
| 679 | memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id))) | 685 | memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id)) || |
| 686 | fi_resp->num_instances <= instance_num) | ||
| 680 | return -ENOENT; | 687 | return -ENOENT; |
| 681 | 688 | ||
| 682 | return 0; | 689 | return 0; |
| @@ -849,7 +856,7 @@ static ssize_t aem_show_power(struct device *dev, | |||
| 849 | struct timespec b, a; | 856 | struct timespec b, a; |
| 850 | 857 | ||
| 851 | mutex_lock(&data->lock); | 858 | mutex_lock(&data->lock); |
| 852 | update_aem_energy(data); | 859 | update_aem_energy_one(data, attr->index); |
| 853 | getnstimeofday(&b); | 860 | getnstimeofday(&b); |
| 854 | before = data->energy[attr->index]; | 861 | before = data->energy[attr->index]; |
| 855 | 862 | ||
| @@ -861,7 +868,7 @@ static ssize_t aem_show_power(struct device *dev, | |||
| 861 | return 0; | 868 | return 0; |
| 862 | } | 869 | } |
| 863 | 870 | ||
| 864 | update_aem_energy(data); | 871 | update_aem_energy_one(data, attr->index); |
| 865 | getnstimeofday(&a); | 872 | getnstimeofday(&a); |
| 866 | after = data->energy[attr->index]; | 873 | after = data->energy[attr->index]; |
| 867 | mutex_unlock(&data->lock); | 874 | mutex_unlock(&data->lock); |
| @@ -880,7 +887,9 @@ static ssize_t aem_show_energy(struct device *dev, | |||
| 880 | { | 887 | { |
| 881 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 888 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 882 | struct aem_data *a = dev_get_drvdata(dev); | 889 | struct aem_data *a = dev_get_drvdata(dev); |
| 883 | a->update(a); | 890 | mutex_lock(&a->lock); |
| 891 | update_aem_energy_one(a, attr->index); | ||
| 892 | mutex_unlock(&a->lock); | ||
| 884 | 893 | ||
| 885 | return sprintf(buf, "%llu\n", | 894 | return sprintf(buf, "%llu\n", |
| 886 | (unsigned long long)a->energy[attr->index] * 1000); | 895 | (unsigned long long)a->energy[attr->index] * 1000); |
| @@ -1104,7 +1113,7 @@ static void __exit aem_exit(void) | |||
| 1104 | } | 1113 | } |
| 1105 | 1114 | ||
| 1106 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | 1115 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); |
| 1107 | MODULE_DESCRIPTION("IBM Active Energy Manager power/temp sensor driver"); | 1116 | MODULE_DESCRIPTION("IBM AEM power/temp/energy sensor driver"); |
| 1108 | MODULE_LICENSE("GPL"); | 1117 | MODULE_LICENSE("GPL"); |
| 1109 | 1118 | ||
| 1110 | module_init(aem_init); | 1119 | module_init(aem_init); |
diff --git a/drivers/hwmon/w83791d.c b/drivers/hwmon/w83791d.c index daa7d121483b..de21142d106c 100644 --- a/drivers/hwmon/w83791d.c +++ b/drivers/hwmon/w83791d.c | |||
| @@ -1055,9 +1055,10 @@ static int w83791d_probe(struct i2c_client *client, | |||
| 1055 | { | 1055 | { |
| 1056 | struct w83791d_data *data; | 1056 | struct w83791d_data *data; |
| 1057 | struct device *dev = &client->dev; | 1057 | struct device *dev = &client->dev; |
| 1058 | int i, val1, err; | 1058 | int i, err; |
| 1059 | 1059 | ||
| 1060 | #ifdef DEBUG | 1060 | #ifdef DEBUG |
| 1061 | int val1; | ||
| 1061 | val1 = w83791d_read(client, W83791D_REG_DID_VID4); | 1062 | val1 = w83791d_read(client, W83791D_REG_DID_VID4); |
| 1062 | dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n", | 1063 | dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n", |
| 1063 | (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1); | 1064 | (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1); |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 964124b60db2..75e86865234c 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
| @@ -226,10 +226,11 @@ EXPORT_SYMBOL_GPL(spi_alloc_device); | |||
| 226 | * Companion function to spi_alloc_device. Devices allocated with | 226 | * Companion function to spi_alloc_device. Devices allocated with |
| 227 | * spi_alloc_device can be added onto the spi bus with this function. | 227 | * spi_alloc_device can be added onto the spi bus with this function. |
| 228 | * | 228 | * |
| 229 | * Returns 0 on success; non-zero on failure | 229 | * Returns 0 on success; negative errno on failure |
| 230 | */ | 230 | */ |
| 231 | int spi_add_device(struct spi_device *spi) | 231 | int spi_add_device(struct spi_device *spi) |
| 232 | { | 232 | { |
| 233 | static DEFINE_MUTEX(spi_add_lock); | ||
| 233 | struct device *dev = spi->master->dev.parent; | 234 | struct device *dev = spi->master->dev.parent; |
| 234 | int status; | 235 | int status; |
| 235 | 236 | ||
| @@ -246,26 +247,43 @@ int spi_add_device(struct spi_device *spi) | |||
| 246 | "%s.%u", spi->master->dev.bus_id, | 247 | "%s.%u", spi->master->dev.bus_id, |
| 247 | spi->chip_select); | 248 | spi->chip_select); |
| 248 | 249 | ||
| 249 | /* drivers may modify this initial i/o setup */ | 250 | |
| 251 | /* We need to make sure there's no other device with this | ||
| 252 | * chipselect **BEFORE** we call setup(), else we'll trash | ||
| 253 | * its configuration. Lock against concurrent add() calls. | ||
| 254 | */ | ||
| 255 | mutex_lock(&spi_add_lock); | ||
| 256 | |||
| 257 | if (bus_find_device_by_name(&spi_bus_type, NULL, spi->dev.bus_id) | ||
| 258 | != NULL) { | ||
| 259 | dev_err(dev, "chipselect %d already in use\n", | ||
| 260 | spi->chip_select); | ||
| 261 | status = -EBUSY; | ||
| 262 | goto done; | ||
| 263 | } | ||
| 264 | |||
| 265 | /* Drivers may modify this initial i/o setup, but will | ||
| 266 | * normally rely on the device being setup. Devices | ||
| 267 | * using SPI_CS_HIGH can't coexist well otherwise... | ||
| 268 | */ | ||
| 250 | status = spi->master->setup(spi); | 269 | status = spi->master->setup(spi); |
| 251 | if (status < 0) { | 270 | if (status < 0) { |
| 252 | dev_err(dev, "can't %s %s, status %d\n", | 271 | dev_err(dev, "can't %s %s, status %d\n", |
| 253 | "setup", spi->dev.bus_id, status); | 272 | "setup", spi->dev.bus_id, status); |
| 254 | return status; | 273 | goto done; |
| 255 | } | 274 | } |
| 256 | 275 | ||
| 257 | /* driver core catches callers that misbehave by defining | 276 | /* Device may be bound to an active driver when this returns */ |
| 258 | * devices that already exist. | ||
| 259 | */ | ||
| 260 | status = device_add(&spi->dev); | 277 | status = device_add(&spi->dev); |
| 261 | if (status < 0) { | 278 | if (status < 0) |
| 262 | dev_err(dev, "can't %s %s, status %d\n", | 279 | dev_err(dev, "can't %s %s, status %d\n", |
| 263 | "add", spi->dev.bus_id, status); | 280 | "add", spi->dev.bus_id, status); |
| 264 | return status; | 281 | else |
| 265 | } | 282 | dev_dbg(dev, "registered child %s\n", spi->dev.bus_id); |
| 266 | 283 | ||
| 267 | dev_dbg(dev, "registered child %s\n", spi->dev.bus_id); | 284 | done: |
| 268 | return 0; | 285 | mutex_unlock(&spi_add_lock); |
| 286 | return status; | ||
| 269 | } | 287 | } |
| 270 | EXPORT_SYMBOL_GPL(spi_add_device); | 288 | EXPORT_SYMBOL_GPL(spi_add_device); |
| 271 | 289 | ||
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index bd320a2bfb7c..fb51197d1c98 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c | |||
| @@ -479,6 +479,10 @@ static void adjust_aoi_size_position(struct fb_var_screeninfo *var, | |||
| 479 | base_plane_width = machine_data->fsl_diu_info[0]->var.xres; | 479 | base_plane_width = machine_data->fsl_diu_info[0]->var.xres; |
| 480 | base_plane_height = machine_data->fsl_diu_info[0]->var.yres; | 480 | base_plane_height = machine_data->fsl_diu_info[0]->var.yres; |
| 481 | 481 | ||
| 482 | if (mfbi->x_aoi_d < 0) | ||
| 483 | mfbi->x_aoi_d = 0; | ||
| 484 | if (mfbi->y_aoi_d < 0) | ||
| 485 | mfbi->y_aoi_d = 0; | ||
| 482 | switch (index) { | 486 | switch (index) { |
| 483 | case 0: | 487 | case 0: |
| 484 | if (mfbi->x_aoi_d != 0) | 488 | if (mfbi->x_aoi_d != 0) |
| @@ -778,6 +782,22 @@ static void unmap_video_memory(struct fb_info *info) | |||
| 778 | } | 782 | } |
| 779 | 783 | ||
| 780 | /* | 784 | /* |
| 785 | * Using the fb_var_screeninfo in fb_info we set the aoi of this | ||
| 786 | * particular framebuffer. It is a light version of fsl_diu_set_par. | ||
| 787 | */ | ||
| 788 | static int fsl_diu_set_aoi(struct fb_info *info) | ||
| 789 | { | ||
| 790 | struct fb_var_screeninfo *var = &info->var; | ||
| 791 | struct mfb_info *mfbi = info->par; | ||
| 792 | struct diu_ad *ad = mfbi->ad; | ||
| 793 | |||
| 794 | /* AOI should not be greater than display size */ | ||
| 795 | ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset); | ||
| 796 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); | ||
| 797 | return 0; | ||
| 798 | } | ||
| 799 | |||
| 800 | /* | ||
| 781 | * Using the fb_var_screeninfo in fb_info we set the resolution of this | 801 | * Using the fb_var_screeninfo in fb_info we set the resolution of this |
| 782 | * particular framebuffer. This function alters the fb_fix_screeninfo stored | 802 | * particular framebuffer. This function alters the fb_fix_screeninfo stored |
| 783 | * in fb_info. It does not alter var in fb_info since we are using that | 803 | * in fb_info. It does not alter var in fb_info since we are using that |
| @@ -817,11 +837,11 @@ static int fsl_diu_set_par(struct fb_info *info) | |||
| 817 | diu_ops.get_pixel_format(var->bits_per_pixel, | 837 | diu_ops.get_pixel_format(var->bits_per_pixel, |
| 818 | machine_data->monitor_port); | 838 | machine_data->monitor_port); |
| 819 | ad->addr = cpu_to_le32(info->fix.smem_start); | 839 | ad->addr = cpu_to_le32(info->fix.smem_start); |
| 820 | ad->src_size_g_alpha = cpu_to_le32((var->yres << 12) | | 840 | ad->src_size_g_alpha = cpu_to_le32((var->yres_virtual << 12) | |
| 821 | var->xres) | mfbi->g_alpha; | 841 | var->xres_virtual) | mfbi->g_alpha; |
| 822 | /* fix me. AOI should not be greater than display size */ | 842 | /* AOI should not be greater than display size */ |
| 823 | ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres); | 843 | ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres); |
| 824 | ad->offset_xyi = 0; | 844 | ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset); |
| 825 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); | 845 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); |
| 826 | 846 | ||
| 827 | /* Disable chroma keying function */ | 847 | /* Disable chroma keying function */ |
| @@ -921,6 +941,8 @@ static int fsl_diu_pan_display(struct fb_var_screeninfo *var, | |||
| 921 | else | 941 | else |
| 922 | info->var.vmode &= ~FB_VMODE_YWRAP; | 942 | info->var.vmode &= ~FB_VMODE_YWRAP; |
| 923 | 943 | ||
| 944 | fsl_diu_set_aoi(info); | ||
| 945 | |||
| 924 | return 0; | 946 | return 0; |
| 925 | } | 947 | } |
| 926 | 948 | ||
| @@ -989,7 +1011,7 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd, | |||
| 989 | pr_debug("set AOI display offset of index %d to (%d,%d)\n", | 1011 | pr_debug("set AOI display offset of index %d to (%d,%d)\n", |
| 990 | mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d); | 1012 | mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d); |
| 991 | fsl_diu_check_var(&info->var, info); | 1013 | fsl_diu_check_var(&info->var, info); |
| 992 | fsl_diu_set_par(info); | 1014 | fsl_diu_set_aoi(info); |
| 993 | break; | 1015 | break; |
| 994 | case MFB_GET_AOID: | 1016 | case MFB_GET_AOID: |
| 995 | aoi_d.x_aoi_d = mfbi->x_aoi_d; | 1017 | aoi_d.x_aoi_d = mfbi->x_aoi_d; |
diff --git a/fs/inode.c b/fs/inode.c index b6726f644530..0487ddba1397 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
| @@ -166,6 +166,7 @@ static struct inode *alloc_inode(struct super_block *sb) | |||
| 166 | mapping_set_gfp_mask(mapping, GFP_HIGHUSER_PAGECACHE); | 166 | mapping_set_gfp_mask(mapping, GFP_HIGHUSER_PAGECACHE); |
| 167 | mapping->assoc_mapping = NULL; | 167 | mapping->assoc_mapping = NULL; |
| 168 | mapping->backing_dev_info = &default_backing_dev_info; | 168 | mapping->backing_dev_info = &default_backing_dev_info; |
| 169 | mapping->writeback_index = 0; | ||
| 169 | 170 | ||
| 170 | /* | 171 | /* |
| 171 | * If the block_device provides a backing_dev_info for client | 172 | * If the block_device provides a backing_dev_info for client |
diff --git a/fs/omfs/bitmap.c b/fs/omfs/bitmap.c index 697663b01bae..e1c0ec0ae989 100644 --- a/fs/omfs/bitmap.c +++ b/fs/omfs/bitmap.c | |||
| @@ -92,7 +92,7 @@ int omfs_allocate_block(struct super_block *sb, u64 block) | |||
| 92 | struct buffer_head *bh; | 92 | struct buffer_head *bh; |
| 93 | struct omfs_sb_info *sbi = OMFS_SB(sb); | 93 | struct omfs_sb_info *sbi = OMFS_SB(sb); |
| 94 | int bits_per_entry = 8 * sb->s_blocksize; | 94 | int bits_per_entry = 8 * sb->s_blocksize; |
| 95 | int map, bit; | 95 | unsigned int map, bit; |
| 96 | int ret = 0; | 96 | int ret = 0; |
| 97 | u64 tmp; | 97 | u64 tmp; |
| 98 | 98 | ||
| @@ -176,7 +176,8 @@ int omfs_clear_range(struct super_block *sb, u64 block, int count) | |||
| 176 | struct omfs_sb_info *sbi = OMFS_SB(sb); | 176 | struct omfs_sb_info *sbi = OMFS_SB(sb); |
| 177 | int bits_per_entry = 8 * sb->s_blocksize; | 177 | int bits_per_entry = 8 * sb->s_blocksize; |
| 178 | u64 tmp; | 178 | u64 tmp; |
| 179 | int map, bit, ret; | 179 | unsigned int map, bit; |
| 180 | int ret; | ||
| 180 | 181 | ||
| 181 | tmp = block; | 182 | tmp = block; |
| 182 | bit = do_div(tmp, bits_per_entry); | 183 | bit = do_div(tmp, bits_per_entry); |
diff --git a/fs/omfs/file.c b/fs/omfs/file.c index 7e2499053e4d..834b2331f6b3 100644 --- a/fs/omfs/file.c +++ b/fs/omfs/file.c | |||
| @@ -26,6 +26,13 @@ static int omfs_sync_file(struct file *file, struct dentry *dentry, | |||
| 26 | return err ? -EIO : 0; | 26 | return err ? -EIO : 0; |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | static u32 omfs_max_extents(struct omfs_sb_info *sbi, int offset) | ||
| 30 | { | ||
| 31 | return (sbi->s_sys_blocksize - offset - | ||
| 32 | sizeof(struct omfs_extent)) / | ||
| 33 | sizeof(struct omfs_extent_entry) + 1; | ||
| 34 | } | ||
| 35 | |||
| 29 | void omfs_make_empty_table(struct buffer_head *bh, int offset) | 36 | void omfs_make_empty_table(struct buffer_head *bh, int offset) |
| 30 | { | 37 | { |
| 31 | struct omfs_extent *oe = (struct omfs_extent *) &bh->b_data[offset]; | 38 | struct omfs_extent *oe = (struct omfs_extent *) &bh->b_data[offset]; |
| @@ -45,6 +52,7 @@ int omfs_shrink_inode(struct inode *inode) | |||
| 45 | struct buffer_head *bh; | 52 | struct buffer_head *bh; |
| 46 | u64 next, last; | 53 | u64 next, last; |
| 47 | u32 extent_count; | 54 | u32 extent_count; |
| 55 | u32 max_extents; | ||
| 48 | int ret; | 56 | int ret; |
| 49 | 57 | ||
| 50 | /* traverse extent table, freeing each entry that is greater | 58 | /* traverse extent table, freeing each entry that is greater |
| @@ -62,15 +70,18 @@ int omfs_shrink_inode(struct inode *inode) | |||
| 62 | goto out; | 70 | goto out; |
| 63 | 71 | ||
| 64 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); | 72 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); |
| 73 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START); | ||
| 65 | 74 | ||
| 66 | for (;;) { | 75 | for (;;) { |
| 67 | 76 | ||
| 68 | if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next)) { | 77 | if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next)) |
| 69 | brelse(bh); | 78 | goto out_brelse; |
| 70 | goto out; | ||
| 71 | } | ||
| 72 | 79 | ||
| 73 | extent_count = be32_to_cpu(oe->e_extent_count); | 80 | extent_count = be32_to_cpu(oe->e_extent_count); |
| 81 | |||
| 82 | if (extent_count > max_extents) | ||
| 83 | goto out_brelse; | ||
| 84 | |||
| 74 | last = next; | 85 | last = next; |
| 75 | next = be64_to_cpu(oe->e_next); | 86 | next = be64_to_cpu(oe->e_next); |
| 76 | entry = &oe->e_entry; | 87 | entry = &oe->e_entry; |
| @@ -98,10 +109,14 @@ int omfs_shrink_inode(struct inode *inode) | |||
| 98 | if (!bh) | 109 | if (!bh) |
| 99 | goto out; | 110 | goto out; |
| 100 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); | 111 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); |
| 112 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT); | ||
| 101 | } | 113 | } |
| 102 | ret = 0; | 114 | ret = 0; |
| 103 | out: | 115 | out: |
| 104 | return ret; | 116 | return ret; |
| 117 | out_brelse: | ||
| 118 | brelse(bh); | ||
| 119 | return ret; | ||
| 105 | } | 120 | } |
| 106 | 121 | ||
| 107 | static void omfs_truncate(struct inode *inode) | 122 | static void omfs_truncate(struct inode *inode) |
| @@ -154,9 +169,7 @@ static int omfs_grow_extent(struct inode *inode, struct omfs_extent *oe, | |||
| 154 | goto out; | 169 | goto out; |
| 155 | } | 170 | } |
| 156 | } | 171 | } |
| 157 | max_count = (sbi->s_sys_blocksize - OMFS_EXTENT_START - | 172 | max_count = omfs_max_extents(sbi, OMFS_EXTENT_START); |
| 158 | sizeof(struct omfs_extent)) / | ||
| 159 | sizeof(struct omfs_extent_entry) + 1; | ||
| 160 | 173 | ||
| 161 | /* TODO: add a continuation block here */ | 174 | /* TODO: add a continuation block here */ |
| 162 | if (be32_to_cpu(oe->e_extent_count) > max_count-1) | 175 | if (be32_to_cpu(oe->e_extent_count) > max_count-1) |
| @@ -225,6 +238,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
| 225 | sector_t next, offset; | 238 | sector_t next, offset; |
| 226 | int ret; | 239 | int ret; |
| 227 | u64 new_block; | 240 | u64 new_block; |
| 241 | u32 max_extents; | ||
| 228 | int extent_count; | 242 | int extent_count; |
| 229 | struct omfs_extent *oe; | 243 | struct omfs_extent *oe; |
| 230 | struct omfs_extent_entry *entry; | 244 | struct omfs_extent_entry *entry; |
| @@ -238,6 +252,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
| 238 | goto out; | 252 | goto out; |
| 239 | 253 | ||
| 240 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); | 254 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); |
| 255 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START); | ||
| 241 | next = inode->i_ino; | 256 | next = inode->i_ino; |
| 242 | 257 | ||
| 243 | for (;;) { | 258 | for (;;) { |
| @@ -249,6 +264,9 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
| 249 | next = be64_to_cpu(oe->e_next); | 264 | next = be64_to_cpu(oe->e_next); |
| 250 | entry = &oe->e_entry; | 265 | entry = &oe->e_entry; |
| 251 | 266 | ||
| 267 | if (extent_count > max_extents) | ||
| 268 | goto out_brelse; | ||
| 269 | |||
| 252 | offset = find_block(inode, entry, block, extent_count, &remain); | 270 | offset = find_block(inode, entry, block, extent_count, &remain); |
| 253 | if (offset > 0) { | 271 | if (offset > 0) { |
| 254 | ret = 0; | 272 | ret = 0; |
| @@ -266,6 +284,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
| 266 | if (!bh) | 284 | if (!bh) |
| 267 | goto out; | 285 | goto out; |
| 268 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); | 286 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); |
| 287 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT); | ||
| 269 | } | 288 | } |
| 270 | if (create) { | 289 | if (create) { |
| 271 | ret = omfs_grow_extent(inode, oe, &new_block); | 290 | ret = omfs_grow_extent(inode, oe, &new_block); |
diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c index a95fe5984f4b..d29047b1b9b0 100644 --- a/fs/omfs/inode.c +++ b/fs/omfs/inode.c | |||
| @@ -232,8 +232,7 @@ struct inode *omfs_iget(struct super_block *sb, ino_t ino) | |||
| 232 | inode->i_mode = S_IFDIR | (S_IRWXUGO & ~sbi->s_dmask); | 232 | inode->i_mode = S_IFDIR | (S_IRWXUGO & ~sbi->s_dmask); |
| 233 | inode->i_op = &omfs_dir_inops; | 233 | inode->i_op = &omfs_dir_inops; |
| 234 | inode->i_fop = &omfs_dir_operations; | 234 | inode->i_fop = &omfs_dir_operations; |
| 235 | inode->i_size = be32_to_cpu(oi->i_head.h_body_size) + | 235 | inode->i_size = sbi->s_sys_blocksize; |
| 236 | sizeof(struct omfs_header); | ||
| 237 | inc_nlink(inode); | 236 | inc_nlink(inode); |
| 238 | break; | 237 | break; |
| 239 | case OMFS_FILE: | 238 | case OMFS_FILE: |
diff --git a/include/asm-mips/kexec.h b/include/asm-mips/kexec.h index cdbab43b7d3a..4314892aaebb 100644 --- a/include/asm-mips/kexec.h +++ b/include/asm-mips/kexec.h | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | /* Maximum address we can use for the control code buffer */ | 16 | /* Maximum address we can use for the control code buffer */ |
| 17 | #define KEXEC_CONTROL_MEMORY_LIMIT (0x20000000) | 17 | #define KEXEC_CONTROL_MEMORY_LIMIT (0x20000000) |
| 18 | 18 | ||
| 19 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 19 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 20 | 20 | ||
| 21 | /* The native architecture */ | 21 | /* The native architecture */ |
| 22 | #define KEXEC_ARCH KEXEC_ARCH_MIPS | 22 | #define KEXEC_ARCH KEXEC_ARCH_MIPS |
diff --git a/include/asm-x86/kexec.h b/include/asm-x86/kexec.h index c0e52a14fd4d..4246ab7dc988 100644 --- a/include/asm-x86/kexec.h +++ b/include/asm-x86/kexec.h | |||
| @@ -41,6 +41,10 @@ | |||
| 41 | # define PAGES_NR 17 | 41 | # define PAGES_NR 17 |
| 42 | #endif | 42 | #endif |
| 43 | 43 | ||
| 44 | #ifdef CONFIG_X86_32 | ||
| 45 | # define KEXEC_CONTROL_CODE_MAX_SIZE 2048 | ||
| 46 | #endif | ||
| 47 | |||
| 44 | #ifndef __ASSEMBLY__ | 48 | #ifndef __ASSEMBLY__ |
| 45 | 49 | ||
| 46 | #include <linux/string.h> | 50 | #include <linux/string.h> |
| @@ -63,7 +67,7 @@ | |||
| 63 | /* Maximum address we can use for the control code buffer */ | 67 | /* Maximum address we can use for the control code buffer */ |
| 64 | # define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 68 | # define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
| 65 | 69 | ||
| 66 | # define KEXEC_CONTROL_CODE_SIZE 4096 | 70 | # define KEXEC_CONTROL_PAGE_SIZE 4096 |
| 67 | 71 | ||
| 68 | /* The native architecture */ | 72 | /* The native architecture */ |
| 69 | # define KEXEC_ARCH KEXEC_ARCH_386 | 73 | # define KEXEC_ARCH KEXEC_ARCH_386 |
| @@ -79,7 +83,7 @@ | |||
| 79 | # define KEXEC_CONTROL_MEMORY_LIMIT (0xFFFFFFFFFFUL) | 83 | # define KEXEC_CONTROL_MEMORY_LIMIT (0xFFFFFFFFFFUL) |
| 80 | 84 | ||
| 81 | /* Allocate one page for the pdp and the second for the code */ | 85 | /* Allocate one page for the pdp and the second for the code */ |
| 82 | # define KEXEC_CONTROL_CODE_SIZE (4096UL + 4096UL) | 86 | # define KEXEC_CONTROL_PAGE_SIZE (4096UL + 4096UL) |
| 83 | 87 | ||
| 84 | /* The native architecture */ | 88 | /* The native architecture */ |
| 85 | # define KEXEC_ARCH KEXEC_ARCH_X86_64 | 89 | # define KEXEC_ARCH KEXEC_ARCH_X86_64 |
diff --git a/include/linux/completion.h b/include/linux/completion.h index 57faa60de9bd..02ef8835999c 100644 --- a/include/linux/completion.h +++ b/include/linux/completion.h | |||
| @@ -49,6 +49,8 @@ extern unsigned long wait_for_completion_timeout(struct completion *x, | |||
| 49 | unsigned long timeout); | 49 | unsigned long timeout); |
| 50 | extern unsigned long wait_for_completion_interruptible_timeout( | 50 | extern unsigned long wait_for_completion_interruptible_timeout( |
| 51 | struct completion *x, unsigned long timeout); | 51 | struct completion *x, unsigned long timeout); |
| 52 | extern bool try_wait_for_completion(struct completion *x); | ||
| 53 | extern bool completion_done(struct completion *x); | ||
| 52 | 54 | ||
| 53 | extern void complete(struct completion *); | 55 | extern void complete(struct completion *); |
| 54 | extern void complete_all(struct completion *); | 56 | extern void complete_all(struct completion *); |
| @@ -56,48 +58,4 @@ extern void complete_all(struct completion *); | |||
| 56 | #define INIT_COMPLETION(x) ((x).done = 0) | 58 | #define INIT_COMPLETION(x) ((x).done = 0) |
| 57 | 59 | ||
| 58 | 60 | ||
| 59 | /** | ||
| 60 | * try_wait_for_completion - try to decrement a completion without blocking | ||
| 61 | * @x: completion structure | ||
| 62 | * | ||
| 63 | * Returns: 0 if a decrement cannot be done without blocking | ||
| 64 | * 1 if a decrement succeeded. | ||
| 65 | * | ||
| 66 | * If a completion is being used as a counting completion, | ||
| 67 | * attempt to decrement the counter without blocking. This | ||
| 68 | * enables us to avoid waiting if the resource the completion | ||
| 69 | * is protecting is not available. | ||
| 70 | */ | ||
| 71 | static inline bool try_wait_for_completion(struct completion *x) | ||
| 72 | { | ||
| 73 | int ret = 1; | ||
| 74 | |||
| 75 | spin_lock_irq(&x->wait.lock); | ||
| 76 | if (!x->done) | ||
| 77 | ret = 0; | ||
| 78 | else | ||
| 79 | x->done--; | ||
| 80 | spin_unlock_irq(&x->wait.lock); | ||
| 81 | return ret; | ||
| 82 | } | ||
| 83 | |||
| 84 | /** | ||
| 85 | * completion_done - Test to see if a completion has any waiters | ||
| 86 | * @x: completion structure | ||
| 87 | * | ||
| 88 | * Returns: 0 if there are waiters (wait_for_completion() in progress) | ||
| 89 | * 1 if there are no waiters. | ||
| 90 | * | ||
| 91 | */ | ||
| 92 | static inline bool completion_done(struct completion *x) | ||
| 93 | { | ||
| 94 | int ret = 1; | ||
| 95 | |||
| 96 | spin_lock_irq(&x->wait.lock); | ||
| 97 | if (!x->done) | ||
| 98 | ret = 0; | ||
| 99 | spin_unlock_irq(&x->wait.lock); | ||
| 100 | return ret; | ||
| 101 | } | ||
| 102 | |||
| 103 | #endif | 61 | #endif |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index f368d041e02d..bb384068272e 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -98,6 +98,27 @@ static inline void tracer_disable(void) | |||
| 98 | #endif | 98 | #endif |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | /* Ftrace disable/restore without lock. Some synchronization mechanism | ||
| 102 | * must be used to prevent ftrace_enabled to be changed between | ||
| 103 | * disable/restore. */ | ||
| 104 | static inline int __ftrace_enabled_save(void) | ||
| 105 | { | ||
| 106 | #ifdef CONFIG_FTRACE | ||
| 107 | int saved_ftrace_enabled = ftrace_enabled; | ||
| 108 | ftrace_enabled = 0; | ||
| 109 | return saved_ftrace_enabled; | ||
| 110 | #else | ||
| 111 | return 0; | ||
| 112 | #endif | ||
| 113 | } | ||
| 114 | |||
| 115 | static inline void __ftrace_enabled_restore(int enabled) | ||
| 116 | { | ||
| 117 | #ifdef CONFIG_FTRACE | ||
| 118 | ftrace_enabled = enabled; | ||
| 119 | #endif | ||
| 120 | } | ||
| 121 | |||
| 101 | #ifdef CONFIG_FRAME_POINTER | 122 | #ifdef CONFIG_FRAME_POINTER |
| 102 | /* TODO: need to fix this for ARM */ | 123 | /* TODO: need to fix this for ARM */ |
| 103 | # define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) | 124 | # define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) |
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 32110cede64f..17f76fc05173 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h | |||
| @@ -25,8 +25,8 @@ | |||
| 25 | #error KEXEC_CONTROL_MEMORY_LIMIT not defined | 25 | #error KEXEC_CONTROL_MEMORY_LIMIT not defined |
| 26 | #endif | 26 | #endif |
| 27 | 27 | ||
| 28 | #ifndef KEXEC_CONTROL_CODE_SIZE | 28 | #ifndef KEXEC_CONTROL_PAGE_SIZE |
| 29 | #error KEXEC_CONTROL_CODE_SIZE not defined | 29 | #error KEXEC_CONTROL_PAGE_SIZE not defined |
| 30 | #endif | 30 | #endif |
| 31 | 31 | ||
| 32 | #ifndef KEXEC_ARCH | 32 | #ifndef KEXEC_ARCH |
diff --git a/include/linux/reboot.h b/include/linux/reboot.h index b93b541cf111..988e55fe649b 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h | |||
| @@ -59,6 +59,7 @@ extern void machine_crash_shutdown(struct pt_regs *); | |||
| 59 | * Architecture independent implemenations of sys_reboot commands. | 59 | * Architecture independent implemenations of sys_reboot commands. |
| 60 | */ | 60 | */ |
| 61 | 61 | ||
| 62 | extern void kernel_restart_prepare(char *cmd); | ||
| 62 | extern void kernel_restart(char *cmd); | 63 | extern void kernel_restart(char *cmd); |
| 63 | extern void kernel_halt(void); | 64 | extern void kernel_halt(void); |
| 64 | extern void kernel_power_off(void); | 65 | extern void kernel_power_off(void); |
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index c63435095970..2ce8207686e2 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
| @@ -217,11 +217,11 @@ struct platform_hibernation_ops { | |||
| 217 | #ifdef CONFIG_HIBERNATION | 217 | #ifdef CONFIG_HIBERNATION |
| 218 | /* kernel/power/snapshot.c */ | 218 | /* kernel/power/snapshot.c */ |
| 219 | extern void __register_nosave_region(unsigned long b, unsigned long e, int km); | 219 | extern void __register_nosave_region(unsigned long b, unsigned long e, int km); |
| 220 | static inline void register_nosave_region(unsigned long b, unsigned long e) | 220 | static inline void __init register_nosave_region(unsigned long b, unsigned long e) |
| 221 | { | 221 | { |
| 222 | __register_nosave_region(b, e, 0); | 222 | __register_nosave_region(b, e, 0); |
| 223 | } | 223 | } |
| 224 | static inline void register_nosave_region_late(unsigned long b, unsigned long e) | 224 | static inline void __init register_nosave_region_late(unsigned long b, unsigned long e) |
| 225 | { | 225 | { |
| 226 | __register_nosave_region(b, e, 1); | 226 | __register_nosave_region(b, e, 1); |
| 227 | } | 227 | } |
diff --git a/kernel/kexec.c b/kernel/kexec.c index c8a4370e2a34..59f3f0df35d4 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
| 13 | #include <linux/fs.h> | 13 | #include <linux/fs.h> |
| 14 | #include <linux/kexec.h> | 14 | #include <linux/kexec.h> |
| 15 | #include <linux/spinlock.h> | 15 | #include <linux/mutex.h> |
| 16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
| 17 | #include <linux/highmem.h> | 17 | #include <linux/highmem.h> |
| 18 | #include <linux/syscalls.h> | 18 | #include <linux/syscalls.h> |
| @@ -77,7 +77,7 @@ int kexec_should_crash(struct task_struct *p) | |||
| 77 | * | 77 | * |
| 78 | * The code for the transition from the current kernel to the | 78 | * The code for the transition from the current kernel to the |
| 79 | * the new kernel is placed in the control_code_buffer, whose size | 79 | * the new kernel is placed in the control_code_buffer, whose size |
| 80 | * is given by KEXEC_CONTROL_CODE_SIZE. In the best case only a single | 80 | * is given by KEXEC_CONTROL_PAGE_SIZE. In the best case only a single |
| 81 | * page of memory is necessary, but some architectures require more. | 81 | * page of memory is necessary, but some architectures require more. |
| 82 | * Because this memory must be identity mapped in the transition from | 82 | * Because this memory must be identity mapped in the transition from |
| 83 | * virtual to physical addresses it must live in the range | 83 | * virtual to physical addresses it must live in the range |
| @@ -242,7 +242,7 @@ static int kimage_normal_alloc(struct kimage **rimage, unsigned long entry, | |||
| 242 | */ | 242 | */ |
| 243 | result = -ENOMEM; | 243 | result = -ENOMEM; |
| 244 | image->control_code_page = kimage_alloc_control_pages(image, | 244 | image->control_code_page = kimage_alloc_control_pages(image, |
| 245 | get_order(KEXEC_CONTROL_CODE_SIZE)); | 245 | get_order(KEXEC_CONTROL_PAGE_SIZE)); |
| 246 | if (!image->control_code_page) { | 246 | if (!image->control_code_page) { |
| 247 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); | 247 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); |
| 248 | goto out; | 248 | goto out; |
| @@ -317,7 +317,7 @@ static int kimage_crash_alloc(struct kimage **rimage, unsigned long entry, | |||
| 317 | */ | 317 | */ |
| 318 | result = -ENOMEM; | 318 | result = -ENOMEM; |
| 319 | image->control_code_page = kimage_alloc_control_pages(image, | 319 | image->control_code_page = kimage_alloc_control_pages(image, |
| 320 | get_order(KEXEC_CONTROL_CODE_SIZE)); | 320 | get_order(KEXEC_CONTROL_PAGE_SIZE)); |
| 321 | if (!image->control_code_page) { | 321 | if (!image->control_code_page) { |
| 322 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); | 322 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); |
| 323 | goto out; | 323 | goto out; |
| @@ -924,19 +924,14 @@ static int kimage_load_segment(struct kimage *image, | |||
| 924 | */ | 924 | */ |
| 925 | struct kimage *kexec_image; | 925 | struct kimage *kexec_image; |
| 926 | struct kimage *kexec_crash_image; | 926 | struct kimage *kexec_crash_image; |
| 927 | /* | 927 | |
| 928 | * A home grown binary mutex. | 928 | static DEFINE_MUTEX(kexec_mutex); |
| 929 | * Nothing can wait so this mutex is safe to use | ||
| 930 | * in interrupt context :) | ||
| 931 | */ | ||
| 932 | static int kexec_lock; | ||
| 933 | 929 | ||
| 934 | asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | 930 | asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, |
| 935 | struct kexec_segment __user *segments, | 931 | struct kexec_segment __user *segments, |
| 936 | unsigned long flags) | 932 | unsigned long flags) |
| 937 | { | 933 | { |
| 938 | struct kimage **dest_image, *image; | 934 | struct kimage **dest_image, *image; |
| 939 | int locked; | ||
| 940 | int result; | 935 | int result; |
| 941 | 936 | ||
| 942 | /* We only trust the superuser with rebooting the system. */ | 937 | /* We only trust the superuser with rebooting the system. */ |
| @@ -972,8 +967,7 @@ asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | |||
| 972 | * | 967 | * |
| 973 | * KISS: always take the mutex. | 968 | * KISS: always take the mutex. |
| 974 | */ | 969 | */ |
| 975 | locked = xchg(&kexec_lock, 1); | 970 | if (!mutex_trylock(&kexec_mutex)) |
| 976 | if (locked) | ||
| 977 | return -EBUSY; | 971 | return -EBUSY; |
| 978 | 972 | ||
| 979 | dest_image = &kexec_image; | 973 | dest_image = &kexec_image; |
| @@ -1015,8 +1009,7 @@ asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | |||
| 1015 | image = xchg(dest_image, image); | 1009 | image = xchg(dest_image, image); |
| 1016 | 1010 | ||
| 1017 | out: | 1011 | out: |
| 1018 | locked = xchg(&kexec_lock, 0); /* Release the mutex */ | 1012 | mutex_unlock(&kexec_mutex); |
| 1019 | BUG_ON(!locked); | ||
| 1020 | kimage_free(image); | 1013 | kimage_free(image); |
| 1021 | 1014 | ||
| 1022 | return result; | 1015 | return result; |
| @@ -1063,10 +1056,7 @@ asmlinkage long compat_sys_kexec_load(unsigned long entry, | |||
| 1063 | 1056 | ||
| 1064 | void crash_kexec(struct pt_regs *regs) | 1057 | void crash_kexec(struct pt_regs *regs) |
| 1065 | { | 1058 | { |
| 1066 | int locked; | 1059 | /* Take the kexec_mutex here to prevent sys_kexec_load |
| 1067 | |||
| 1068 | |||
| 1069 | /* Take the kexec_lock here to prevent sys_kexec_load | ||
| 1070 | * running on one cpu from replacing the crash kernel | 1060 | * running on one cpu from replacing the crash kernel |
| 1071 | * we are using after a panic on a different cpu. | 1061 | * we are using after a panic on a different cpu. |
| 1072 | * | 1062 | * |
| @@ -1074,8 +1064,7 @@ void crash_kexec(struct pt_regs *regs) | |||
| 1074 | * of memory the xchg(&kexec_crash_image) would be | 1064 | * of memory the xchg(&kexec_crash_image) would be |
| 1075 | * sufficient. But since I reuse the memory... | 1065 | * sufficient. But since I reuse the memory... |
| 1076 | */ | 1066 | */ |
| 1077 | locked = xchg(&kexec_lock, 1); | 1067 | if (mutex_trylock(&kexec_mutex)) { |
| 1078 | if (!locked) { | ||
| 1079 | if (kexec_crash_image) { | 1068 | if (kexec_crash_image) { |
| 1080 | struct pt_regs fixed_regs; | 1069 | struct pt_regs fixed_regs; |
| 1081 | crash_setup_regs(&fixed_regs, regs); | 1070 | crash_setup_regs(&fixed_regs, regs); |
| @@ -1083,8 +1072,7 @@ void crash_kexec(struct pt_regs *regs) | |||
| 1083 | machine_crash_shutdown(&fixed_regs); | 1072 | machine_crash_shutdown(&fixed_regs); |
| 1084 | machine_kexec(kexec_crash_image); | 1073 | machine_kexec(kexec_crash_image); |
| 1085 | } | 1074 | } |
| 1086 | locked = xchg(&kexec_lock, 0); | 1075 | mutex_unlock(&kexec_mutex); |
| 1087 | BUG_ON(!locked); | ||
| 1088 | } | 1076 | } |
| 1089 | } | 1077 | } |
| 1090 | 1078 | ||
| @@ -1426,25 +1414,23 @@ static int __init crash_save_vmcoreinfo_init(void) | |||
| 1426 | 1414 | ||
| 1427 | module_init(crash_save_vmcoreinfo_init) | 1415 | module_init(crash_save_vmcoreinfo_init) |
| 1428 | 1416 | ||
| 1429 | /** | 1417 | /* |
| 1430 | * kernel_kexec - reboot the system | 1418 | * Move into place and start executing a preloaded standalone |
| 1431 | * | 1419 | * executable. If nothing was preloaded return an error. |
| 1432 | * Move into place and start executing a preloaded standalone | ||
| 1433 | * executable. If nothing was preloaded return an error. | ||
| 1434 | */ | 1420 | */ |
| 1435 | int kernel_kexec(void) | 1421 | int kernel_kexec(void) |
| 1436 | { | 1422 | { |
| 1437 | int error = 0; | 1423 | int error = 0; |
| 1438 | 1424 | ||
| 1439 | if (xchg(&kexec_lock, 1)) | 1425 | if (!mutex_trylock(&kexec_mutex)) |
| 1440 | return -EBUSY; | 1426 | return -EBUSY; |
| 1441 | if (!kexec_image) { | 1427 | if (!kexec_image) { |
| 1442 | error = -EINVAL; | 1428 | error = -EINVAL; |
| 1443 | goto Unlock; | 1429 | goto Unlock; |
| 1444 | } | 1430 | } |
| 1445 | 1431 | ||
| 1446 | if (kexec_image->preserve_context) { | ||
| 1447 | #ifdef CONFIG_KEXEC_JUMP | 1432 | #ifdef CONFIG_KEXEC_JUMP |
| 1433 | if (kexec_image->preserve_context) { | ||
| 1448 | mutex_lock(&pm_mutex); | 1434 | mutex_lock(&pm_mutex); |
| 1449 | pm_prepare_console(); | 1435 | pm_prepare_console(); |
| 1450 | error = freeze_processes(); | 1436 | error = freeze_processes(); |
| @@ -1459,6 +1445,7 @@ int kernel_kexec(void) | |||
| 1459 | error = disable_nonboot_cpus(); | 1445 | error = disable_nonboot_cpus(); |
| 1460 | if (error) | 1446 | if (error) |
| 1461 | goto Resume_devices; | 1447 | goto Resume_devices; |
| 1448 | device_pm_lock(); | ||
| 1462 | local_irq_disable(); | 1449 | local_irq_disable(); |
| 1463 | /* At this point, device_suspend() has been called, | 1450 | /* At this point, device_suspend() has been called, |
| 1464 | * but *not* device_power_down(). We *must* | 1451 | * but *not* device_power_down(). We *must* |
| @@ -1470,26 +1457,22 @@ int kernel_kexec(void) | |||
| 1470 | error = device_power_down(PMSG_FREEZE); | 1457 | error = device_power_down(PMSG_FREEZE); |
| 1471 | if (error) | 1458 | if (error) |
| 1472 | goto Enable_irqs; | 1459 | goto Enable_irqs; |
| 1473 | save_processor_state(); | 1460 | } else |
| 1474 | #endif | 1461 | #endif |
| 1475 | } else { | 1462 | { |
| 1476 | blocking_notifier_call_chain(&reboot_notifier_list, | 1463 | kernel_restart_prepare(NULL); |
| 1477 | SYS_RESTART, NULL); | ||
| 1478 | system_state = SYSTEM_RESTART; | ||
| 1479 | device_shutdown(); | ||
| 1480 | sysdev_shutdown(); | ||
| 1481 | printk(KERN_EMERG "Starting new kernel\n"); | 1464 | printk(KERN_EMERG "Starting new kernel\n"); |
| 1482 | machine_shutdown(); | 1465 | machine_shutdown(); |
| 1483 | } | 1466 | } |
| 1484 | 1467 | ||
| 1485 | machine_kexec(kexec_image); | 1468 | machine_kexec(kexec_image); |
| 1486 | 1469 | ||
| 1487 | if (kexec_image->preserve_context) { | ||
| 1488 | #ifdef CONFIG_KEXEC_JUMP | 1470 | #ifdef CONFIG_KEXEC_JUMP |
| 1489 | restore_processor_state(); | 1471 | if (kexec_image->preserve_context) { |
| 1490 | device_power_up(PMSG_RESTORE); | 1472 | device_power_up(PMSG_RESTORE); |
| 1491 | Enable_irqs: | 1473 | Enable_irqs: |
| 1492 | local_irq_enable(); | 1474 | local_irq_enable(); |
| 1475 | device_pm_unlock(); | ||
| 1493 | enable_nonboot_cpus(); | 1476 | enable_nonboot_cpus(); |
| 1494 | Resume_devices: | 1477 | Resume_devices: |
| 1495 | device_resume(PMSG_RESTORE); | 1478 | device_resume(PMSG_RESTORE); |
| @@ -1499,11 +1482,10 @@ int kernel_kexec(void) | |||
| 1499 | Restore_console: | 1482 | Restore_console: |
| 1500 | pm_restore_console(); | 1483 | pm_restore_console(); |
| 1501 | mutex_unlock(&pm_mutex); | 1484 | mutex_unlock(&pm_mutex); |
| 1502 | #endif | ||
| 1503 | } | 1485 | } |
| 1486 | #endif | ||
| 1504 | 1487 | ||
| 1505 | Unlock: | 1488 | Unlock: |
| 1506 | xchg(&kexec_lock, 0); | 1489 | mutex_unlock(&kexec_mutex); |
| 1507 | |||
| 1508 | return error; | 1490 | return error; |
| 1509 | } | 1491 | } |
diff --git a/kernel/sched.c b/kernel/sched.c index d601fb0406ca..95e6ad3c231d 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -4669,6 +4669,52 @@ int __sched wait_for_completion_killable(struct completion *x) | |||
| 4669 | } | 4669 | } |
| 4670 | EXPORT_SYMBOL(wait_for_completion_killable); | 4670 | EXPORT_SYMBOL(wait_for_completion_killable); |
| 4671 | 4671 | ||
| 4672 | /** | ||
| 4673 | * try_wait_for_completion - try to decrement a completion without blocking | ||
| 4674 | * @x: completion structure | ||
| 4675 | * | ||
| 4676 | * Returns: 0 if a decrement cannot be done without blocking | ||
| 4677 | * 1 if a decrement succeeded. | ||
| 4678 | * | ||
| 4679 | * If a completion is being used as a counting completion, | ||
| 4680 | * attempt to decrement the counter without blocking. This | ||
| 4681 | * enables us to avoid waiting if the resource the completion | ||
| 4682 | * is protecting is not available. | ||
| 4683 | */ | ||
| 4684 | bool try_wait_for_completion(struct completion *x) | ||
| 4685 | { | ||
| 4686 | int ret = 1; | ||
| 4687 | |||
| 4688 | spin_lock_irq(&x->wait.lock); | ||
| 4689 | if (!x->done) | ||
| 4690 | ret = 0; | ||
| 4691 | else | ||
| 4692 | x->done--; | ||
| 4693 | spin_unlock_irq(&x->wait.lock); | ||
| 4694 | return ret; | ||
| 4695 | } | ||
| 4696 | EXPORT_SYMBOL(try_wait_for_completion); | ||
| 4697 | |||
| 4698 | /** | ||
| 4699 | * completion_done - Test to see if a completion has any waiters | ||
| 4700 | * @x: completion structure | ||
| 4701 | * | ||
| 4702 | * Returns: 0 if there are waiters (wait_for_completion() in progress) | ||
| 4703 | * 1 if there are no waiters. | ||
| 4704 | * | ||
| 4705 | */ | ||
| 4706 | bool completion_done(struct completion *x) | ||
| 4707 | { | ||
| 4708 | int ret = 1; | ||
| 4709 | |||
| 4710 | spin_lock_irq(&x->wait.lock); | ||
| 4711 | if (!x->done) | ||
| 4712 | ret = 0; | ||
| 4713 | spin_unlock_irq(&x->wait.lock); | ||
| 4714 | return ret; | ||
| 4715 | } | ||
| 4716 | EXPORT_SYMBOL(completion_done); | ||
| 4717 | |||
| 4672 | static long __sched | 4718 | static long __sched |
| 4673 | sleep_on_common(wait_queue_head_t *q, int state, long timeout) | 4719 | sleep_on_common(wait_queue_head_t *q, int state, long timeout) |
| 4674 | { | 4720 | { |
diff --git a/kernel/sys.c b/kernel/sys.c index c01858090a98..3dacb00a7f76 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
| @@ -274,7 +274,7 @@ void emergency_restart(void) | |||
| 274 | } | 274 | } |
| 275 | EXPORT_SYMBOL_GPL(emergency_restart); | 275 | EXPORT_SYMBOL_GPL(emergency_restart); |
| 276 | 276 | ||
| 277 | static void kernel_restart_prepare(char *cmd) | 277 | void kernel_restart_prepare(char *cmd) |
| 278 | { | 278 | { |
| 279 | blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); | 279 | blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); |
| 280 | system_state = SYSTEM_RESTART; | 280 | system_state = SYSTEM_RESTART; |
diff --git a/mm/bootmem.c b/mm/bootmem.c index 4af15d0340ad..e023c68b0255 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
| @@ -473,7 +473,7 @@ find_block: | |||
| 473 | goto find_block; | 473 | goto find_block; |
| 474 | } | 474 | } |
| 475 | 475 | ||
| 476 | if (bdata->last_end_off && | 476 | if (bdata->last_end_off & (PAGE_SIZE - 1) && |
| 477 | PFN_DOWN(bdata->last_end_off) + 1 == sidx) | 477 | PFN_DOWN(bdata->last_end_off) + 1 == sidx) |
| 478 | start_off = ALIGN(bdata->last_end_off, align); | 478 | start_off = ALIGN(bdata->last_end_off, align); |
| 479 | else | 479 | else |
