]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 6 Aug 2008 02:37:42 +0000 (19:37 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 6 Aug 2008 02:37:42 +0000 (19:37 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (78 commits)
  AX.25: Fix sysctl registration if !CONFIG_AX25_DAMA_SLAVE
  pktgen: mac count
  pktgen: random flow
  bridge: Eliminate unnecessary forward delay
  bridge: fix compile warning in net/bridge/br_netfilter.c
  ipv4: remove unused field in struct flowi (include/net/flow.h).
  tg3: Fix 'scheduling while atomic' errors
  net: Kill plain NET_XMIT_BYPASS.
  net_sched: Add qdisc __NET_XMIT_BYPASS flag
  net_sched: Add qdisc __NET_XMIT_STOLEN flag
  iwl3945: fix merge mistake for packet injection
  iwlwifi: grap nic access before accessing periphery registers
  iwlwifi: decrement rx skb counter in scan abort handler
  iwlwifi: fix unhandled interrupt when HW rfkill is on
  iwlwifi: implement iwl5000_calc_rssi
  iwlwifi: memory allocation optimization
  iwlwifi: HW bug fixes
  p54: Fix potential concurrent access to private data
  rt2x00: Disable link tuning in rt2500usb
  iwlwifi: Don't use buffer allocated on the stack for led names
  ...

843 files changed:
Documentation/00-INDEX
Documentation/DocBook/Makefile
Documentation/DocBook/s390-drivers.tmpl
Documentation/DocBook/sh.tmpl [new file with mode: 0644]
Documentation/cli-sti-removal.txt [deleted file]
Documentation/power/pm_qos_interface.txt
Documentation/powerpc/booting-without-of.txt
Documentation/powerpc/eeh-pci-error-recovery.txt
MAINTAINERS
arch/arm/boot/compressed/Makefile
arch/arm/include/asm/Kbuild [moved from include/asm-arm/Kbuild with 100% similarity]
arch/arm/include/asm/a.out-core.h [moved from include/asm-arm/a.out-core.h with 100% similarity]
arch/arm/include/asm/a.out.h [moved from include/asm-arm/a.out.h with 100% similarity]
arch/arm/include/asm/assembler.h [moved from include/asm-arm/assembler.h with 98% similarity]
arch/arm/include/asm/atomic.h [moved from include/asm-arm/atomic.h with 99% similarity]
arch/arm/include/asm/auxvec.h [moved from include/asm-arm/auxvec.h with 100% similarity]
arch/arm/include/asm/bitops.h [moved from include/asm-arm/bitops.h with 100% similarity]
arch/arm/include/asm/bug.h [moved from include/asm-arm/bug.h with 100% similarity]
arch/arm/include/asm/bugs.h [moved from include/asm-arm/bugs.h with 93% similarity]
arch/arm/include/asm/byteorder.h [moved from include/asm-arm/byteorder.h with 97% similarity]
arch/arm/include/asm/cache.h [moved from include/asm-arm/cache.h with 80% similarity]
arch/arm/include/asm/cacheflush.h [moved from include/asm-arm/cacheflush.h with 99% similarity]
arch/arm/include/asm/checksum.h [moved from include/asm-arm/checksum.h with 98% similarity]
arch/arm/include/asm/cnt32_to_63.h [moved from include/asm-arm/cnt32_to_63.h with 100% similarity]
arch/arm/include/asm/cpu-multi32.h [moved from include/asm-arm/cpu-multi32.h with 97% similarity]
arch/arm/include/asm/cpu-single.h [moved from include/asm-arm/cpu-single.h with 97% similarity]
arch/arm/include/asm/cpu.h [moved from include/asm-arm/cpu.h with 93% similarity]
arch/arm/include/asm/cputime.h [moved from include/asm-arm/cputime.h with 100% similarity]
arch/arm/include/asm/current.h [moved from include/asm-arm/current.h with 100% similarity]
arch/arm/include/asm/delay.h [moved from include/asm-arm/delay.h with 100% similarity]
arch/arm/include/asm/device.h [moved from include/asm-arm/device.h with 100% similarity]
arch/arm/include/asm/div64.h [moved from include/asm-arm/div64.h with 100% similarity]
arch/arm/include/asm/dma-mapping.h [moved from include/asm-arm/dma-mapping.h with 100% similarity]
arch/arm/include/asm/dma.h [moved from include/asm-arm/dma.h with 100% similarity]
arch/arm/include/asm/domain.h [moved from include/asm-arm/domain.h with 98% similarity]
arch/arm/include/asm/ecard.h [moved from include/asm-arm/ecard.h with 99% similarity]
arch/arm/include/asm/elf.h [moved from include/asm-arm/elf.h with 100% similarity]
arch/arm/include/asm/emergency-restart.h [moved from include/asm-arm/emergency-restart.h with 100% similarity]
arch/arm/include/asm/errno.h [moved from include/asm-arm/errno.h with 100% similarity]
arch/arm/include/asm/fb.h [moved from include/asm-arm/fb.h with 100% similarity]
arch/arm/include/asm/fcntl.h [moved from include/asm-arm/fcntl.h with 100% similarity]
arch/arm/include/asm/fiq.h [moved from include/asm-arm/fiq.h with 96% similarity]
arch/arm/include/asm/flat.h [moved from include/asm-arm/flat.h with 90% similarity]
arch/arm/include/asm/floppy.h [moved from include/asm-arm/floppy.h with 99% similarity]
arch/arm/include/asm/fpstate.h [moved from include/asm-arm/fpstate.h with 97% similarity]
arch/arm/include/asm/ftrace.h [moved from include/asm-arm/ftrace.h with 100% similarity]
arch/arm/include/asm/futex.h [moved from include/asm-arm/futex.h with 100% similarity]
arch/arm/include/asm/glue.h [moved from include/asm-arm/glue.h with 99% similarity]
arch/arm/include/asm/gpio.h [moved from include/asm-arm/gpio.h with 100% similarity]
arch/arm/include/asm/hardirq.h [moved from include/asm-arm/hardirq.h with 100% similarity]
arch/arm/include/asm/hardware.h [moved from include/asm-arm/hardware.h with 90% similarity]
arch/arm/include/asm/hardware/arm_timer.h [moved from include/asm-arm/hardware/arm_timer.h with 100% similarity]
arch/arm/include/asm/hardware/arm_twd.h [moved from include/asm-arm/hardware/arm_twd.h with 100% similarity]
arch/arm/include/asm/hardware/cache-l2x0.h [moved from include/asm-arm/hardware/cache-l2x0.h with 97% similarity]
arch/arm/include/asm/hardware/clps7111.h [moved from include/asm-arm/hardware/clps7111.h with 99% similarity]
arch/arm/include/asm/hardware/cs89712.h [moved from include/asm-arm/hardware/cs89712.h with 97% similarity]
arch/arm/include/asm/hardware/debug-8250.S [moved from include/asm-arm/hardware/debug-8250.S with 93% similarity]
arch/arm/include/asm/hardware/debug-pl01x.S [moved from include/asm-arm/hardware/debug-pl01x.S with 93% similarity]
arch/arm/include/asm/hardware/dec21285.h [moved from include/asm-arm/hardware/dec21285.h with 99% similarity]
arch/arm/include/asm/hardware/entry-macro-iomd.S [moved from include/asm-arm/hardware/entry-macro-iomd.S with 99% similarity]
arch/arm/include/asm/hardware/ep7211.h [moved from include/asm-arm/hardware/ep7211.h with 96% similarity]
arch/arm/include/asm/hardware/ep7212.h [moved from include/asm-arm/hardware/ep7212.h with 98% similarity]
arch/arm/include/asm/hardware/gic.h [moved from include/asm-arm/hardware/gic.h with 96% similarity]
arch/arm/include/asm/hardware/icst307.h [moved from include/asm-arm/hardware/icst307.h with 96% similarity]
arch/arm/include/asm/hardware/icst525.h [moved from include/asm-arm/hardware/icst525.h with 96% similarity]
arch/arm/include/asm/hardware/ioc.h [moved from include/asm-arm/hardware/ioc.h with 97% similarity]
arch/arm/include/asm/hardware/iomd.h [moved from include/asm-arm/hardware/iomd.h with 99% similarity]
arch/arm/include/asm/hardware/iop3xx-adma.h [moved from include/asm-arm/hardware/iop3xx-adma.h with 100% similarity]
arch/arm/include/asm/hardware/iop3xx-gpio.h [moved from include/asm-arm/hardware/iop3xx-gpio.h with 97% similarity]
arch/arm/include/asm/hardware/iop3xx.h [moved from include/asm-arm/hardware/iop3xx.h with 99% similarity]
arch/arm/include/asm/hardware/iop_adma.h [moved from include/asm-arm/hardware/iop_adma.h with 100% similarity]
arch/arm/include/asm/hardware/it8152.h [moved from include/asm-arm/hardware/it8152.h with 100% similarity]
arch/arm/include/asm/hardware/linkup-l1110.h [moved from include/asm-arm/hardware/linkup-l1110.h with 100% similarity]
arch/arm/include/asm/hardware/locomo.h [moved from include/asm-arm/hardware/locomo.h with 99% similarity]
arch/arm/include/asm/hardware/memc.h [moved from include/asm-arm/hardware/memc.h with 93% similarity]
arch/arm/include/asm/hardware/pci_v3.h [moved from include/asm-arm/hardware/pci_v3.h with 99% similarity]
arch/arm/include/asm/hardware/sa1111.h [moved from include/asm-arm/hardware/sa1111.h with 99% similarity]
arch/arm/include/asm/hardware/scoop.h [moved from include/asm-arm/hardware/scoop.h with 100% similarity]
arch/arm/include/asm/hardware/sharpsl_pm.h [moved from include/asm-arm/hardware/sharpsl_pm.h with 100% similarity]
arch/arm/include/asm/hardware/ssp.h [moved from include/asm-arm/hardware/ssp.h with 100% similarity]
arch/arm/include/asm/hardware/uengine.h [moved from include/asm-arm/hardware/uengine.h with 100% similarity]
arch/arm/include/asm/hardware/vic.h [moved from include/asm-arm/hardware/vic.h with 97% similarity]
arch/arm/include/asm/hw_irq.h [moved from include/asm-arm/hw_irq.h with 100% similarity]
arch/arm/include/asm/hwcap.h [moved from include/asm-arm/hwcap.h with 100% similarity]
arch/arm/include/asm/ide.h [moved from include/asm-arm/ide.h with 93% similarity]
arch/arm/include/asm/io.h [moved from include/asm-arm/io.h with 99% similarity]
arch/arm/include/asm/ioctl.h [moved from include/asm-arm/ioctl.h with 100% similarity]
arch/arm/include/asm/ioctls.h [moved from include/asm-arm/ioctls.h with 100% similarity]
arch/arm/include/asm/ipcbuf.h [moved from include/asm-arm/ipcbuf.h with 100% similarity]
arch/arm/include/asm/irq.h [moved from include/asm-arm/irq.h with 100% similarity]
arch/arm/include/asm/irq_regs.h [moved from include/asm-arm/irq_regs.h with 100% similarity]
arch/arm/include/asm/irqflags.h [moved from include/asm-arm/irqflags.h with 100% similarity]
arch/arm/include/asm/kdebug.h [moved from include/asm-arm/kdebug.h with 100% similarity]
arch/arm/include/asm/kexec.h [moved from include/asm-arm/kexec.h with 100% similarity]
arch/arm/include/asm/kgdb.h [moved from include/asm-arm/kgdb.h with 100% similarity]
arch/arm/include/asm/kmap_types.h [moved from include/asm-arm/kmap_types.h with 100% similarity]
arch/arm/include/asm/kprobes.h [moved from include/asm-arm/kprobes.h with 98% similarity]
arch/arm/include/asm/leds.h [moved from include/asm-arm/leds.h with 96% similarity]
arch/arm/include/asm/limits.h [moved from include/asm-arm/limits.h with 100% similarity]
arch/arm/include/asm/linkage.h [moved from include/asm-arm/linkage.h with 100% similarity]
arch/arm/include/asm/local.h [moved from include/asm-arm/local.h with 100% similarity]
arch/arm/include/asm/locks.h [moved from include/asm-arm/locks.h with 99% similarity]
arch/arm/include/asm/mach/arch.h [moved from include/asm-arm/mach/arch.h with 97% similarity]
arch/arm/include/asm/mach/dma.h [moved from include/asm-arm/mach/dma.h with 97% similarity]
arch/arm/include/asm/mach/flash.h [moved from include/asm-arm/mach/flash.h with 96% similarity]
arch/arm/include/asm/mach/irda.h [moved from include/asm-arm/mach/irda.h with 93% similarity]
arch/arm/include/asm/mach/irq.h [moved from include/asm-arm/mach/irq.h with 96% similarity]
arch/arm/include/asm/mach/map.h [moved from include/asm-arm/mach/map.h with 96% similarity]
arch/arm/include/asm/mach/mmc.h [moved from include/asm-arm/mach/mmc.h with 88% similarity]
arch/arm/include/asm/mach/pci.h [moved from include/asm-arm/mach/pci.h with 98% similarity]
arch/arm/include/asm/mach/serial_at91.h [moved from include/asm-arm/mach/serial_at91.h with 94% similarity]
arch/arm/include/asm/mach/serial_sa1100.h [moved from include/asm-arm/mach/serial_sa1100.h with 86% similarity]
arch/arm/include/asm/mach/sharpsl_param.h [moved from include/asm-arm/mach/sharpsl_param.h with 100% similarity]
arch/arm/include/asm/mach/time.h [moved from include/asm-arm/mach/time.h with 97% similarity]
arch/arm/include/asm/mach/udc_pxa2xx.h [moved from include/asm-arm/mach/udc_pxa2xx.h with 95% similarity]
arch/arm/include/asm/mc146818rtc.h [moved from include/asm-arm/mc146818rtc.h with 100% similarity]
arch/arm/include/asm/memory.h [moved from include/asm-arm/memory.h with 99% similarity]
arch/arm/include/asm/mman.h [moved from include/asm-arm/mman.h with 100% similarity]
arch/arm/include/asm/mmu.h [moved from include/asm-arm/mmu.h with 100% similarity]
arch/arm/include/asm/mmu_context.h [moved from include/asm-arm/mmu_context.h with 98% similarity]
arch/arm/include/asm/mmzone.h [moved from include/asm-arm/mmzone.h with 94% similarity]
arch/arm/include/asm/module.h [moved from include/asm-arm/module.h with 100% similarity]
arch/arm/include/asm/msgbuf.h [moved from include/asm-arm/msgbuf.h with 100% similarity]
arch/arm/include/asm/mtd-xip.h [moved from include/asm-arm/mtd-xip.h with 100% similarity]
arch/arm/include/asm/mutex.h [moved from include/asm-arm/mutex.h with 98% similarity]
arch/arm/include/asm/nwflash.h [moved from include/asm-arm/nwflash.h with 100% similarity]
arch/arm/include/asm/page-nommu.h [moved from include/asm-arm/page-nommu.h with 96% similarity]
arch/arm/include/asm/page.h [moved from include/asm-arm/page.h with 99% similarity]
arch/arm/include/asm/param.h [moved from include/asm-arm/param.h with 95% similarity]
arch/arm/include/asm/parport.h [moved from include/asm-arm/parport.h with 86% similarity]
arch/arm/include/asm/pci.h [moved from include/asm-arm/pci.h with 100% similarity]
arch/arm/include/asm/percpu.h [moved from include/asm-arm/percpu.h with 100% similarity]
arch/arm/include/asm/pgalloc.h [moved from include/asm-arm/pgalloc.h with 98% similarity]
arch/arm/include/asm/pgtable-hwdef.h [moved from include/asm-arm/pgtable-hwdef.h with 98% similarity]
arch/arm/include/asm/pgtable-nommu.h [moved from include/asm-arm/pgtable-nommu.h with 98% similarity]
arch/arm/include/asm/pgtable.h [moved from include/asm-arm/pgtable.h with 99% similarity]
arch/arm/include/asm/poll.h [moved from include/asm-arm/poll.h with 100% similarity]
arch/arm/include/asm/posix_types.h [moved from include/asm-arm/posix_types.h with 98% similarity]
arch/arm/include/asm/proc-fns.h [moved from include/asm-arm/proc-fns.h with 99% similarity]
arch/arm/include/asm/processor.h [moved from include/asm-arm/processor.h with 98% similarity]
arch/arm/include/asm/procinfo.h [moved from include/asm-arm/procinfo.h with 97% similarity]
arch/arm/include/asm/ptrace.h [moved from include/asm-arm/ptrace.h with 99% similarity]
arch/arm/include/asm/resource.h [moved from include/asm-arm/resource.h with 100% similarity]
arch/arm/include/asm/scatterlist.h [moved from include/asm-arm/scatterlist.h with 100% similarity]
arch/arm/include/asm/sections.h [moved from include/asm-arm/sections.h with 100% similarity]
arch/arm/include/asm/segment.h [moved from include/asm-arm/segment.h with 100% similarity]
arch/arm/include/asm/sembuf.h [moved from include/asm-arm/sembuf.h with 100% similarity]
arch/arm/include/asm/serial.h [moved from include/asm-arm/serial.h with 91% similarity]
arch/arm/include/asm/setup.h [moved from include/asm-arm/setup.h with 100% similarity]
arch/arm/include/asm/shmbuf.h [moved from include/asm-arm/shmbuf.h with 100% similarity]
arch/arm/include/asm/shmparam.h [moved from include/asm-arm/shmparam.h with 100% similarity]
arch/arm/include/asm/sigcontext.h [moved from include/asm-arm/sigcontext.h with 100% similarity]
arch/arm/include/asm/siginfo.h [moved from include/asm-arm/siginfo.h with 100% similarity]
arch/arm/include/asm/signal.h [moved from include/asm-arm/signal.h with 100% similarity]
arch/arm/include/asm/sizes.h [moved from include/asm-arm/sizes.h with 100% similarity]
arch/arm/include/asm/smp.h [moved from include/asm-arm/smp.h with 97% similarity]
arch/arm/include/asm/socket.h [moved from include/asm-arm/socket.h with 100% similarity]
arch/arm/include/asm/sockios.h [moved from include/asm-arm/sockios.h with 100% similarity]
arch/arm/include/asm/sparsemem.h [moved from include/asm-arm/sparsemem.h with 100% similarity]
arch/arm/include/asm/spinlock.h [moved from include/asm-arm/spinlock.h with 100% similarity]
arch/arm/include/asm/spinlock_types.h [moved from include/asm-arm/spinlock_types.h with 100% similarity]
arch/arm/include/asm/stat.h [moved from include/asm-arm/stat.h with 100% similarity]
arch/arm/include/asm/statfs.h [moved from include/asm-arm/statfs.h with 100% similarity]
arch/arm/include/asm/string.h [moved from include/asm-arm/string.h with 100% similarity]
arch/arm/include/asm/suspend.h [moved from include/asm-arm/suspend.h with 100% similarity]
arch/arm/include/asm/system.h [moved from include/asm-arm/system.h with 100% similarity]
arch/arm/include/asm/termbits.h [moved from include/asm-arm/termbits.h with 100% similarity]
arch/arm/include/asm/termios.h [moved from include/asm-arm/termios.h with 100% similarity]
arch/arm/include/asm/therm.h [moved from include/asm-arm/therm.h with 88% similarity]
arch/arm/include/asm/thread_info.h [moved from include/asm-arm/thread_info.h with 97% similarity]
arch/arm/include/asm/thread_notify.h [moved from include/asm-arm/thread_notify.h with 96% similarity]
arch/arm/include/asm/timex.h [moved from include/asm-arm/timex.h with 93% similarity]
arch/arm/include/asm/tlb.h [moved from include/asm-arm/tlb.h with 98% similarity]
arch/arm/include/asm/tlbflush.h [moved from include/asm-arm/tlbflush.h with 99% similarity]
arch/arm/include/asm/topology.h [moved from include/asm-arm/topology.h with 100% similarity]
arch/arm/include/asm/traps.h [moved from include/asm-arm/traps.h with 100% similarity]
arch/arm/include/asm/types.h [moved from include/asm-arm/types.h with 100% similarity]
arch/arm/include/asm/uaccess.h [moved from include/asm-arm/uaccess.h with 99% similarity]
arch/arm/include/asm/ucontext.h [moved from include/asm-arm/ucontext.h with 100% similarity]
arch/arm/include/asm/unaligned.h [moved from include/asm-arm/unaligned.h with 100% similarity]
arch/arm/include/asm/unistd.h [moved from include/asm-arm/unistd.h with 99% similarity]
arch/arm/include/asm/user.h [moved from include/asm-arm/user.h with 100% similarity]
arch/arm/include/asm/vfp.h [moved from include/asm-arm/vfp.h with 98% similarity]
arch/arm/include/asm/vfpmacros.h [moved from include/asm-arm/vfpmacros.h with 97% similarity]
arch/arm/include/asm/vga.h [moved from include/asm-arm/vga.h with 100% similarity]
arch/arm/include/asm/xor.h [moved from include/asm-arm/xor.h with 99% similarity]
arch/arm/kernel/head-common.S
arch/arm/lib/getuser.S
arch/arm/lib/putuser.S
arch/arm/mach-imx/clock.c
arch/arm/mach-imx/generic.c
arch/arm/mach-imx/mx1ads.c
arch/arm/mach-ns9xxx/board-a9m9750dev.c
arch/arm/mach-ns9xxx/gpio-ns9360.c
arch/arm/mach-ns9xxx/gpio.c
arch/arm/mach-ns9xxx/irq.c
arch/arm/mach-ns9xxx/mach-cc9p9360dev.c
arch/arm/mach-ns9xxx/mach-cc9p9360js.c
arch/arm/mach-ns9xxx/plat-serial8250.c
arch/arm/mach-ns9xxx/processor-ns9360.c
arch/arm/mach-ns9xxx/time-ns9360.c
arch/arm/mach-pxa/pcm990-baseboard.c
arch/arm/mm/Kconfig
arch/arm/mm/cache-xsc3l2.c [new file with mode: 0644]
arch/arm/mm/init.c
arch/arm/mm/ioremap.c
arch/arm/mm/proc-arm720.S
arch/arm/mm/proc-xsc3.S
arch/arm/nwfpe/fpa11.h
arch/m68k/mac/baboon.c
arch/m68k/mac/via.c
arch/mips/emma2rh/markeins/setup.c
arch/mips/jazz/setup.c
arch/mn10300/kernel/module.c
arch/powerpc/Kconfig.debug
arch/powerpc/boot/dts/mpc8610_hpcd.dts
arch/powerpc/boot/io.h
arch/powerpc/include/asm/8253pit.h [moved from include/asm-powerpc/8253pit.h with 100% similarity]
arch/powerpc/include/asm/8xx_immap.h [moved from include/asm-powerpc/8xx_immap.h with 100% similarity]
arch/powerpc/include/asm/Kbuild [moved from include/asm-powerpc/Kbuild with 100% similarity]
arch/powerpc/include/asm/a.out.h [moved from include/asm-powerpc/a.out.h with 100% similarity]
arch/powerpc/include/asm/abs_addr.h [moved from include/asm-powerpc/abs_addr.h with 100% similarity]
arch/powerpc/include/asm/agp.h [moved from include/asm-powerpc/agp.h with 100% similarity]
arch/powerpc/include/asm/asm-compat.h [moved from include/asm-powerpc/asm-compat.h with 100% similarity]
arch/powerpc/include/asm/atomic.h [moved from include/asm-powerpc/atomic.h with 100% similarity]
arch/powerpc/include/asm/auxvec.h [moved from include/asm-powerpc/auxvec.h with 100% similarity]
arch/powerpc/include/asm/backlight.h [moved from include/asm-powerpc/backlight.h with 100% similarity]
arch/powerpc/include/asm/bitops.h [moved from include/asm-powerpc/bitops.h with 100% similarity]
arch/powerpc/include/asm/bootx.h [moved from include/asm-powerpc/bootx.h with 100% similarity]
arch/powerpc/include/asm/btext.h [moved from include/asm-powerpc/btext.h with 100% similarity]
arch/powerpc/include/asm/bug.h [moved from include/asm-powerpc/bug.h with 100% similarity]
arch/powerpc/include/asm/bugs.h [moved from include/asm-powerpc/bugs.h with 100% similarity]
arch/powerpc/include/asm/byteorder.h [moved from include/asm-powerpc/byteorder.h with 100% similarity]
arch/powerpc/include/asm/cache.h [moved from include/asm-powerpc/cache.h with 100% similarity]
arch/powerpc/include/asm/cacheflush.h [moved from include/asm-powerpc/cacheflush.h with 100% similarity]
arch/powerpc/include/asm/cell-pmu.h [moved from include/asm-powerpc/cell-pmu.h with 100% similarity]
arch/powerpc/include/asm/cell-regs.h [moved from include/asm-powerpc/cell-regs.h with 100% similarity]
arch/powerpc/include/asm/checksum.h [moved from include/asm-powerpc/checksum.h with 100% similarity]
arch/powerpc/include/asm/clk_interface.h [moved from include/asm-powerpc/clk_interface.h with 100% similarity]
arch/powerpc/include/asm/code-patching.h [moved from include/asm-powerpc/code-patching.h with 100% similarity]
arch/powerpc/include/asm/compat.h [moved from include/asm-powerpc/compat.h with 100% similarity]
arch/powerpc/include/asm/cpm.h [moved from include/asm-powerpc/cpm.h with 100% similarity]
arch/powerpc/include/asm/cpm1.h [moved from include/asm-powerpc/cpm1.h with 100% similarity]
arch/powerpc/include/asm/cpm2.h [moved from include/asm-powerpc/cpm2.h with 100% similarity]
arch/powerpc/include/asm/cputable.h [moved from include/asm-powerpc/cputable.h with 100% similarity]
arch/powerpc/include/asm/cputhreads.h [moved from include/asm-powerpc/cputhreads.h with 100% similarity]
arch/powerpc/include/asm/cputime.h [moved from include/asm-powerpc/cputime.h with 100% similarity]
arch/powerpc/include/asm/current.h [moved from include/asm-powerpc/current.h with 100% similarity]
arch/powerpc/include/asm/dbdma.h [moved from include/asm-powerpc/dbdma.h with 100% similarity]
arch/powerpc/include/asm/dcr-generic.h [moved from include/asm-powerpc/dcr-generic.h with 100% similarity]
arch/powerpc/include/asm/dcr-mmio.h [moved from include/asm-powerpc/dcr-mmio.h with 100% similarity]
arch/powerpc/include/asm/dcr-native.h [moved from include/asm-powerpc/dcr-native.h with 100% similarity]
arch/powerpc/include/asm/dcr-regs.h [moved from include/asm-powerpc/dcr-regs.h with 100% similarity]
arch/powerpc/include/asm/dcr.h [moved from include/asm-powerpc/dcr.h with 94% similarity]
arch/powerpc/include/asm/delay.h [moved from include/asm-powerpc/delay.h with 100% similarity]
arch/powerpc/include/asm/device.h [moved from include/asm-powerpc/device.h with 100% similarity]
arch/powerpc/include/asm/div64.h [moved from include/asm-powerpc/div64.h with 100% similarity]
arch/powerpc/include/asm/dma-mapping.h [moved from include/asm-powerpc/dma-mapping.h with 100% similarity]
arch/powerpc/include/asm/dma.h [moved from include/asm-powerpc/dma.h with 100% similarity]
arch/powerpc/include/asm/edac.h [moved from include/asm-powerpc/edac.h with 100% similarity]
arch/powerpc/include/asm/eeh.h [moved from include/asm-powerpc/eeh.h with 100% similarity]
arch/powerpc/include/asm/eeh_event.h [moved from include/asm-powerpc/eeh_event.h with 100% similarity]
arch/powerpc/include/asm/elf.h [moved from include/asm-powerpc/elf.h with 100% similarity]
arch/powerpc/include/asm/emergency-restart.h [moved from include/asm-powerpc/emergency-restart.h with 100% similarity]
arch/powerpc/include/asm/errno.h [moved from include/asm-powerpc/errno.h with 100% similarity]
arch/powerpc/include/asm/exception.h [moved from include/asm-powerpc/exception.h with 100% similarity]
arch/powerpc/include/asm/fb.h [moved from include/asm-powerpc/fb.h with 100% similarity]
arch/powerpc/include/asm/fcntl.h [moved from include/asm-powerpc/fcntl.h with 100% similarity]
arch/powerpc/include/asm/feature-fixups.h [moved from include/asm-powerpc/feature-fixups.h with 100% similarity]
arch/powerpc/include/asm/firmware.h [moved from include/asm-powerpc/firmware.h with 100% similarity]
arch/powerpc/include/asm/fixmap.h [moved from include/asm-powerpc/fixmap.h with 100% similarity]
arch/powerpc/include/asm/floppy.h [moved from include/asm-powerpc/floppy.h with 100% similarity]
arch/powerpc/include/asm/fs_pd.h [moved from include/asm-powerpc/fs_pd.h with 100% similarity]
arch/powerpc/include/asm/fsl_gtm.h [moved from include/asm-powerpc/fsl_gtm.h with 100% similarity]
arch/powerpc/include/asm/fsl_lbc.h [moved from include/asm-powerpc/fsl_lbc.h with 100% similarity]
arch/powerpc/include/asm/ftrace.h [moved from include/asm-powerpc/ftrace.h with 100% similarity]
arch/powerpc/include/asm/futex.h [moved from include/asm-powerpc/futex.h with 100% similarity]
arch/powerpc/include/asm/gpio.h [moved from include/asm-powerpc/gpio.h with 100% similarity]
arch/powerpc/include/asm/grackle.h [moved from include/asm-powerpc/grackle.h with 100% similarity]
arch/powerpc/include/asm/hardirq.h [moved from include/asm-powerpc/hardirq.h with 100% similarity]
arch/powerpc/include/asm/heathrow.h [moved from include/asm-powerpc/heathrow.h with 100% similarity]
arch/powerpc/include/asm/highmem.h [moved from include/asm-powerpc/highmem.h with 100% similarity]
arch/powerpc/include/asm/hugetlb.h [moved from include/asm-powerpc/hugetlb.h with 100% similarity]
arch/powerpc/include/asm/hvcall.h [moved from include/asm-powerpc/hvcall.h with 100% similarity]
arch/powerpc/include/asm/hvconsole.h [moved from include/asm-powerpc/hvconsole.h with 100% similarity]
arch/powerpc/include/asm/hvcserver.h [moved from include/asm-powerpc/hvcserver.h with 100% similarity]
arch/powerpc/include/asm/hw_irq.h [moved from include/asm-powerpc/hw_irq.h with 100% similarity]
arch/powerpc/include/asm/hydra.h [moved from include/asm-powerpc/hydra.h with 100% similarity]
arch/powerpc/include/asm/i8259.h [moved from include/asm-powerpc/i8259.h with 71% similarity]
arch/powerpc/include/asm/ibmebus.h [moved from include/asm-powerpc/ibmebus.h with 100% similarity]
arch/powerpc/include/asm/ide.h [moved from include/asm-powerpc/ide.h with 98% similarity]
arch/powerpc/include/asm/immap_86xx.h [moved from include/asm-powerpc/immap_86xx.h with 100% similarity]
arch/powerpc/include/asm/immap_cpm2.h [moved from include/asm-powerpc/immap_cpm2.h with 100% similarity]
arch/powerpc/include/asm/immap_qe.h [moved from include/asm-powerpc/immap_qe.h with 99% similarity]
arch/powerpc/include/asm/io-defs.h [moved from include/asm-powerpc/io-defs.h with 100% similarity]
arch/powerpc/include/asm/io.h [moved from include/asm-powerpc/io.h with 100% similarity]
arch/powerpc/include/asm/ioctl.h [moved from include/asm-powerpc/ioctl.h with 100% similarity]
arch/powerpc/include/asm/ioctls.h [moved from include/asm-powerpc/ioctls.h with 100% similarity]
arch/powerpc/include/asm/iommu.h [moved from include/asm-powerpc/iommu.h with 100% similarity]
arch/powerpc/include/asm/ipcbuf.h [moved from include/asm-powerpc/ipcbuf.h with 100% similarity]
arch/powerpc/include/asm/ipic.h [moved from include/asm-powerpc/ipic.h with 93% similarity]
arch/powerpc/include/asm/irq.h [moved from include/asm-powerpc/irq.h with 58% similarity]
arch/powerpc/include/asm/irq_regs.h [moved from include/asm-powerpc/irq_regs.h with 100% similarity]
arch/powerpc/include/asm/irqflags.h [moved from include/asm-powerpc/irqflags.h with 93% similarity]
arch/powerpc/include/asm/iseries/alpaca.h [moved from include/asm-powerpc/iseries/alpaca.h with 100% similarity]
arch/powerpc/include/asm/iseries/hv_call.h [moved from include/asm-powerpc/iseries/hv_call.h with 100% similarity]
arch/powerpc/include/asm/iseries/hv_call_event.h [moved from include/asm-powerpc/iseries/hv_call_event.h with 100% similarity]
arch/powerpc/include/asm/iseries/hv_call_sc.h [moved from include/asm-powerpc/iseries/hv_call_sc.h with 100% similarity]
arch/powerpc/include/asm/iseries/hv_call_xm.h [moved from include/asm-powerpc/iseries/hv_call_xm.h with 100% similarity]
arch/powerpc/include/asm/iseries/hv_lp_config.h [moved from include/asm-powerpc/iseries/hv_lp_config.h with 100% similarity]
arch/powerpc/include/asm/iseries/hv_lp_event.h [moved from include/asm-powerpc/iseries/hv_lp_event.h with 100% similarity]
arch/powerpc/include/asm/iseries/hv_types.h [moved from include/asm-powerpc/iseries/hv_types.h with 100% similarity]
arch/powerpc/include/asm/iseries/iommu.h [moved from include/asm-powerpc/iseries/iommu.h with 100% similarity]
arch/powerpc/include/asm/iseries/it_lp_queue.h [moved from include/asm-powerpc/iseries/it_lp_queue.h with 100% similarity]
arch/powerpc/include/asm/iseries/lpar_map.h [moved from include/asm-powerpc/iseries/lpar_map.h with 100% similarity]
arch/powerpc/include/asm/iseries/mf.h [moved from include/asm-powerpc/iseries/mf.h with 100% similarity]
arch/powerpc/include/asm/iseries/vio.h [moved from include/asm-powerpc/iseries/vio.h with 100% similarity]
arch/powerpc/include/asm/kdebug.h [moved from include/asm-powerpc/kdebug.h with 100% similarity]
arch/powerpc/include/asm/kdump.h [moved from include/asm-powerpc/kdump.h with 100% similarity]
arch/powerpc/include/asm/kexec.h [moved from include/asm-powerpc/kexec.h with 100% similarity]
arch/powerpc/include/asm/keylargo.h [moved from include/asm-powerpc/keylargo.h with 100% similarity]
arch/powerpc/include/asm/kgdb.h [moved from include/asm-powerpc/kgdb.h with 98% similarity]
arch/powerpc/include/asm/kmap_types.h [moved from include/asm-powerpc/kmap_types.h with 100% similarity]
arch/powerpc/include/asm/kprobes.h [moved from include/asm-powerpc/kprobes.h with 100% similarity]
arch/powerpc/include/asm/kvm.h [moved from include/asm-powerpc/kvm.h with 100% similarity]
arch/powerpc/include/asm/kvm_asm.h [moved from include/asm-powerpc/kvm_asm.h with 100% similarity]
arch/powerpc/include/asm/kvm_host.h [moved from include/asm-powerpc/kvm_host.h with 100% similarity]
arch/powerpc/include/asm/kvm_para.h [moved from include/asm-powerpc/kvm_para.h with 100% similarity]
arch/powerpc/include/asm/kvm_ppc.h [moved from include/asm-powerpc/kvm_ppc.h with 100% similarity]
arch/powerpc/include/asm/libata-portmap.h [moved from include/asm-powerpc/libata-portmap.h with 100% similarity]
arch/powerpc/include/asm/linkage.h [moved from include/asm-powerpc/linkage.h with 100% similarity]
arch/powerpc/include/asm/lmb.h [moved from include/asm-powerpc/lmb.h with 100% similarity]
arch/powerpc/include/asm/local.h [moved from include/asm-powerpc/local.h with 100% similarity]
arch/powerpc/include/asm/lppaca.h [moved from include/asm-powerpc/lppaca.h with 100% similarity]
arch/powerpc/include/asm/lv1call.h [moved from include/asm-powerpc/lv1call.h with 100% similarity]
arch/powerpc/include/asm/machdep.h [moved from include/asm-powerpc/machdep.h with 100% similarity]
arch/powerpc/include/asm/macio.h [moved from include/asm-powerpc/macio.h with 100% similarity]
arch/powerpc/include/asm/mc146818rtc.h [moved from include/asm-powerpc/mc146818rtc.h with 100% similarity]
arch/powerpc/include/asm/mediabay.h [moved from include/asm-powerpc/mediabay.h with 100% similarity]
arch/powerpc/include/asm/mman.h [moved from include/asm-powerpc/mman.h with 100% similarity]
arch/powerpc/include/asm/mmu-40x.h [moved from include/asm-powerpc/mmu-40x.h with 100% similarity]
arch/powerpc/include/asm/mmu-44x.h [moved from include/asm-powerpc/mmu-44x.h with 100% similarity]
arch/powerpc/include/asm/mmu-8xx.h [moved from include/asm-powerpc/mmu-8xx.h with 100% similarity]
arch/powerpc/include/asm/mmu-fsl-booke.h [moved from include/asm-powerpc/mmu-fsl-booke.h with 100% similarity]
arch/powerpc/include/asm/mmu-hash32.h [moved from include/asm-powerpc/mmu-hash32.h with 100% similarity]
arch/powerpc/include/asm/mmu-hash64.h [moved from include/asm-powerpc/mmu-hash64.h with 100% similarity]
arch/powerpc/include/asm/mmu.h [moved from include/asm-powerpc/mmu.h with 100% similarity]
arch/powerpc/include/asm/mmu_context.h [moved from include/asm-powerpc/mmu_context.h with 100% similarity]
arch/powerpc/include/asm/mmzone.h [moved from include/asm-powerpc/mmzone.h with 100% similarity]
arch/powerpc/include/asm/module.h [moved from include/asm-powerpc/module.h with 100% similarity]
arch/powerpc/include/asm/mpc512x.h [moved from include/asm-powerpc/mpc512x.h with 100% similarity]
arch/powerpc/include/asm/mpc52xx.h [moved from include/asm-powerpc/mpc52xx.h with 100% similarity]
arch/powerpc/include/asm/mpc52xx_psc.h [moved from include/asm-powerpc/mpc52xx_psc.h with 100% similarity]
arch/powerpc/include/asm/mpc6xx.h [moved from include/asm-powerpc/mpc6xx.h with 100% similarity]
arch/powerpc/include/asm/mpc8260.h [moved from include/asm-powerpc/mpc8260.h with 100% similarity]
arch/powerpc/include/asm/mpc86xx.h [moved from include/asm-powerpc/mpc86xx.h with 100% similarity]
arch/powerpc/include/asm/mpc8xx.h [moved from include/asm-powerpc/mpc8xx.h with 100% similarity]
arch/powerpc/include/asm/mpic.h [moved from include/asm-powerpc/mpic.h with 100% similarity]
arch/powerpc/include/asm/msgbuf.h [moved from include/asm-powerpc/msgbuf.h with 100% similarity]
arch/powerpc/include/asm/mutex.h [moved from include/asm-powerpc/mutex.h with 100% similarity]
arch/powerpc/include/asm/nvram.h [moved from include/asm-powerpc/nvram.h with 100% similarity]
arch/powerpc/include/asm/of_device.h [moved from include/asm-powerpc/of_device.h with 100% similarity]
arch/powerpc/include/asm/of_platform.h [moved from include/asm-powerpc/of_platform.h with 100% similarity]
arch/powerpc/include/asm/ohare.h [moved from include/asm-powerpc/ohare.h with 100% similarity]
arch/powerpc/include/asm/oprofile_impl.h [moved from include/asm-powerpc/oprofile_impl.h with 100% similarity]
arch/powerpc/include/asm/pSeries_reconfig.h [moved from include/asm-powerpc/pSeries_reconfig.h with 100% similarity]
arch/powerpc/include/asm/paca.h [moved from include/asm-powerpc/paca.h with 99% similarity]
arch/powerpc/include/asm/page.h [moved from include/asm-powerpc/page.h with 100% similarity]
arch/powerpc/include/asm/page_32.h [moved from include/asm-powerpc/page_32.h with 100% similarity]
arch/powerpc/include/asm/page_64.h [moved from include/asm-powerpc/page_64.h with 100% similarity]
arch/powerpc/include/asm/param.h [moved from include/asm-powerpc/param.h with 100% similarity]
arch/powerpc/include/asm/parport.h [moved from include/asm-powerpc/parport.h with 100% similarity]
arch/powerpc/include/asm/pasemi_dma.h [moved from include/asm-powerpc/pasemi_dma.h with 100% similarity]
arch/powerpc/include/asm/pci-bridge.h [moved from include/asm-powerpc/pci-bridge.h with 100% similarity]
arch/powerpc/include/asm/pci.h [moved from include/asm-powerpc/pci.h with 100% similarity]
arch/powerpc/include/asm/percpu.h [moved from include/asm-powerpc/percpu.h with 100% similarity]
arch/powerpc/include/asm/pgalloc-32.h [moved from include/asm-powerpc/pgalloc-32.h with 100% similarity]
arch/powerpc/include/asm/pgalloc-64.h [moved from include/asm-powerpc/pgalloc-64.h with 100% similarity]
arch/powerpc/include/asm/pgalloc.h [moved from include/asm-powerpc/pgalloc.h with 100% similarity]
arch/powerpc/include/asm/pgtable-4k.h [moved from include/asm-powerpc/pgtable-4k.h with 100% similarity]
arch/powerpc/include/asm/pgtable-64k.h [moved from include/asm-powerpc/pgtable-64k.h with 100% similarity]
arch/powerpc/include/asm/pgtable-ppc32.h [moved from include/asm-powerpc/pgtable-ppc32.h with 100% similarity]
arch/powerpc/include/asm/pgtable-ppc64.h [moved from include/asm-powerpc/pgtable-ppc64.h with 99% similarity]
arch/powerpc/include/asm/pgtable.h [moved from include/asm-powerpc/pgtable.h with 100% similarity]
arch/powerpc/include/asm/phyp_dump.h [moved from include/asm-powerpc/phyp_dump.h with 100% similarity]
arch/powerpc/include/asm/pmac_feature.h [moved from include/asm-powerpc/pmac_feature.h with 100% similarity]
arch/powerpc/include/asm/pmac_low_i2c.h [moved from include/asm-powerpc/pmac_low_i2c.h with 100% similarity]
arch/powerpc/include/asm/pmac_pfunc.h [moved from include/asm-powerpc/pmac_pfunc.h with 100% similarity]
arch/powerpc/include/asm/pmc.h [moved from include/asm-powerpc/pmc.h with 100% similarity]
arch/powerpc/include/asm/pmi.h [moved from include/asm-powerpc/pmi.h with 100% similarity]
arch/powerpc/include/asm/poll.h [moved from include/asm-powerpc/poll.h with 100% similarity]
arch/powerpc/include/asm/posix_types.h [moved from include/asm-powerpc/posix_types.h with 100% similarity]
arch/powerpc/include/asm/ppc-pci.h [moved from include/asm-powerpc/ppc-pci.h with 100% similarity]
arch/powerpc/include/asm/ppc4xx.h [moved from include/asm-powerpc/ppc4xx.h with 100% similarity]
arch/powerpc/include/asm/ppc_asm.h [moved from include/asm-powerpc/ppc_asm.h with 100% similarity]
arch/powerpc/include/asm/processor.h [moved from include/asm-powerpc/processor.h with 100% similarity]
arch/powerpc/include/asm/prom.h [moved from include/asm-powerpc/prom.h with 100% similarity]
arch/powerpc/include/asm/ps3.h [moved from include/asm-powerpc/ps3.h with 100% similarity]
arch/powerpc/include/asm/ps3av.h [moved from include/asm-powerpc/ps3av.h with 100% similarity]
arch/powerpc/include/asm/ps3fb.h [moved from include/asm-powerpc/ps3fb.h with 100% similarity]
arch/powerpc/include/asm/ps3stor.h [moved from include/asm-powerpc/ps3stor.h with 100% similarity]
arch/powerpc/include/asm/ptrace.h [moved from include/asm-powerpc/ptrace.h with 100% similarity]
arch/powerpc/include/asm/qe.h [moved from include/asm-powerpc/qe.h with 100% similarity]
arch/powerpc/include/asm/qe_ic.h [moved from include/asm-powerpc/qe_ic.h with 99% similarity]
arch/powerpc/include/asm/reg.h [moved from include/asm-powerpc/reg.h with 100% similarity]
arch/powerpc/include/asm/reg_8xx.h [moved from include/asm-powerpc/reg_8xx.h with 100% similarity]
arch/powerpc/include/asm/reg_booke.h [moved from include/asm-powerpc/reg_booke.h with 100% similarity]
arch/powerpc/include/asm/reg_fsl_emb.h [moved from include/asm-powerpc/reg_fsl_emb.h with 100% similarity]
arch/powerpc/include/asm/resource.h [moved from include/asm-powerpc/resource.h with 100% similarity]
arch/powerpc/include/asm/rheap.h [moved from include/asm-powerpc/rheap.h with 100% similarity]
arch/powerpc/include/asm/rio.h [moved from include/asm-powerpc/rio.h with 100% similarity]
arch/powerpc/include/asm/rtas.h [moved from include/asm-powerpc/rtas.h with 100% similarity]
arch/powerpc/include/asm/rtc.h [moved from include/asm-powerpc/rtc.h with 100% similarity]
arch/powerpc/include/asm/rwsem.h [moved from include/asm-powerpc/rwsem.h with 96% similarity]
arch/powerpc/include/asm/scatterlist.h [moved from include/asm-powerpc/scatterlist.h with 100% similarity]
arch/powerpc/include/asm/seccomp.h [moved from include/asm-powerpc/seccomp.h with 100% similarity]
arch/powerpc/include/asm/sections.h [moved from include/asm-powerpc/sections.h with 100% similarity]
arch/powerpc/include/asm/sembuf.h [moved from include/asm-powerpc/sembuf.h with 100% similarity]
arch/powerpc/include/asm/serial.h [moved from include/asm-powerpc/serial.h with 100% similarity]
arch/powerpc/include/asm/setjmp.h [moved from include/asm-powerpc/setjmp.h with 100% similarity]
arch/powerpc/include/asm/setup.h [moved from include/asm-powerpc/setup.h with 100% similarity]
arch/powerpc/include/asm/shmbuf.h [moved from include/asm-powerpc/shmbuf.h with 100% similarity]
arch/powerpc/include/asm/shmparam.h [moved from include/asm-powerpc/shmparam.h with 100% similarity]
arch/powerpc/include/asm/sigcontext.h [moved from include/asm-powerpc/sigcontext.h with 100% similarity]
arch/powerpc/include/asm/siginfo.h [moved from include/asm-powerpc/siginfo.h with 100% similarity]
arch/powerpc/include/asm/signal.h [moved from include/asm-powerpc/signal.h with 100% similarity]
arch/powerpc/include/asm/smp.h [moved from include/asm-powerpc/smp.h with 100% similarity]
arch/powerpc/include/asm/smu.h [moved from include/asm-powerpc/smu.h with 100% similarity]
arch/powerpc/include/asm/socket.h [moved from include/asm-powerpc/socket.h with 100% similarity]
arch/powerpc/include/asm/sockios.h [moved from include/asm-powerpc/sockios.h with 100% similarity]
arch/powerpc/include/asm/sparsemem.h [moved from include/asm-powerpc/sparsemem.h with 100% similarity]
arch/powerpc/include/asm/spinlock.h [moved from include/asm-powerpc/spinlock.h with 100% similarity]
arch/powerpc/include/asm/spinlock_types.h [moved from include/asm-powerpc/spinlock_types.h with 100% similarity]
arch/powerpc/include/asm/spu.h [moved from include/asm-powerpc/spu.h with 100% similarity]
arch/powerpc/include/asm/spu_csa.h [moved from include/asm-powerpc/spu_csa.h with 100% similarity]
arch/powerpc/include/asm/spu_info.h [moved from include/asm-powerpc/spu_info.h with 100% similarity]
arch/powerpc/include/asm/spu_priv1.h [moved from include/asm-powerpc/spu_priv1.h with 100% similarity]
arch/powerpc/include/asm/sstep.h [moved from include/asm-powerpc/sstep.h with 100% similarity]
arch/powerpc/include/asm/stat.h [moved from include/asm-powerpc/stat.h with 100% similarity]
arch/powerpc/include/asm/statfs.h [moved from include/asm-powerpc/statfs.h with 100% similarity]
arch/powerpc/include/asm/string.h [moved from include/asm-powerpc/string.h with 100% similarity]
arch/powerpc/include/asm/suspend.h [moved from include/asm-powerpc/suspend.h with 100% similarity]
arch/powerpc/include/asm/synch.h [moved from include/asm-powerpc/synch.h with 100% similarity]
arch/powerpc/include/asm/syscall.h [moved from include/asm-powerpc/syscall.h with 100% similarity]
arch/powerpc/include/asm/syscalls.h [moved from include/asm-powerpc/syscalls.h with 100% similarity]
arch/powerpc/include/asm/systbl.h [moved from include/asm-powerpc/systbl.h with 100% similarity]
arch/powerpc/include/asm/system.h [moved from include/asm-powerpc/system.h with 100% similarity]
arch/powerpc/include/asm/tce.h [moved from include/asm-powerpc/tce.h with 100% similarity]
arch/powerpc/include/asm/termbits.h [moved from include/asm-powerpc/termbits.h with 100% similarity]
arch/powerpc/include/asm/termios.h [moved from include/asm-powerpc/termios.h with 100% similarity]
arch/powerpc/include/asm/thread_info.h [moved from include/asm-powerpc/thread_info.h with 100% similarity]
arch/powerpc/include/asm/time.h [moved from include/asm-powerpc/time.h with 100% similarity]
arch/powerpc/include/asm/timex.h [moved from include/asm-powerpc/timex.h with 100% similarity]
arch/powerpc/include/asm/tlb.h [moved from include/asm-powerpc/tlb.h with 100% similarity]
arch/powerpc/include/asm/tlbflush.h [moved from include/asm-powerpc/tlbflush.h with 100% similarity]
arch/powerpc/include/asm/topology.h [moved from include/asm-powerpc/topology.h with 100% similarity]
arch/powerpc/include/asm/tsi108.h [moved from include/asm-powerpc/tsi108.h with 100% similarity]
arch/powerpc/include/asm/tsi108_irq.h [moved from include/asm-powerpc/tsi108_irq.h with 100% similarity]
arch/powerpc/include/asm/tsi108_pci.h [moved from include/asm-powerpc/tsi108_pci.h with 100% similarity]
arch/powerpc/include/asm/types.h [moved from include/asm-powerpc/types.h with 100% similarity]
arch/powerpc/include/asm/uaccess.h [moved from include/asm-powerpc/uaccess.h with 100% similarity]
arch/powerpc/include/asm/ucc.h [moved from include/asm-powerpc/ucc.h with 100% similarity]
arch/powerpc/include/asm/ucc_fast.h [moved from include/asm-powerpc/ucc_fast.h with 99% similarity]
arch/powerpc/include/asm/ucc_slow.h [moved from include/asm-powerpc/ucc_slow.h with 100% similarity]
arch/powerpc/include/asm/ucontext.h [moved from include/asm-powerpc/ucontext.h with 100% similarity]
arch/powerpc/include/asm/udbg.h [moved from include/asm-powerpc/udbg.h with 100% similarity]
arch/powerpc/include/asm/uic.h [moved from include/asm-powerpc/uic.h with 95% similarity]
arch/powerpc/include/asm/unaligned.h [moved from include/asm-powerpc/unaligned.h with 100% similarity]
arch/powerpc/include/asm/uninorth.h [moved from include/asm-powerpc/uninorth.h with 100% similarity]
arch/powerpc/include/asm/unistd.h [moved from include/asm-powerpc/unistd.h with 100% similarity]
arch/powerpc/include/asm/user.h [moved from include/asm-powerpc/user.h with 100% similarity]
arch/powerpc/include/asm/vdso.h [moved from include/asm-powerpc/vdso.h with 100% similarity]
arch/powerpc/include/asm/vdso_datapage.h [moved from include/asm-powerpc/vdso_datapage.h with 100% similarity]
arch/powerpc/include/asm/vga.h [moved from include/asm-powerpc/vga.h with 100% similarity]
arch/powerpc/include/asm/vio.h [moved from include/asm-powerpc/vio.h with 100% similarity]
arch/powerpc/include/asm/xilinx_intc.h [moved from include/asm-powerpc/xilinx_intc.h with 100% similarity]
arch/powerpc/include/asm/xmon.h [moved from include/asm-powerpc/xmon.h with 100% similarity]
arch/powerpc/include/asm/xor.h [moved from include/asm-powerpc/xor.h with 100% similarity]
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/cpu_setup_44x.S
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/process.c
arch/powerpc/kernel/vdso.c
arch/powerpc/lib/Makefile
arch/powerpc/mm/mem.c
arch/powerpc/mm/ppc_mmu_32.c
arch/powerpc/mm/tlb_64.c
arch/powerpc/platforms/52xx/Makefile
arch/powerpc/platforms/86xx/mpc86xx_smp.c
arch/powerpc/platforms/Makefile
arch/powerpc/platforms/powermac/Makefile
arch/powerpc/sysdev/Makefile
arch/s390/include/asm/Kbuild [moved from include/asm-s390/Kbuild with 100% similarity]
arch/s390/include/asm/airq.h [moved from include/asm-s390/airq.h with 100% similarity]
arch/s390/include/asm/appldata.h [moved from include/asm-s390/appldata.h with 100% similarity]
arch/s390/include/asm/atomic.h [moved from include/asm-s390/atomic.h with 100% similarity]
arch/s390/include/asm/auxvec.h [moved from include/asm-s390/auxvec.h with 100% similarity]
arch/s390/include/asm/bitops.h [moved from include/asm-s390/bitops.h with 100% similarity]
arch/s390/include/asm/bug.h [moved from include/asm-s390/bug.h with 100% similarity]
arch/s390/include/asm/bugs.h [moved from include/asm-s390/bugs.h with 100% similarity]
arch/s390/include/asm/byteorder.h [moved from include/asm-s390/byteorder.h with 100% similarity]
arch/s390/include/asm/cache.h [moved from include/asm-s390/cache.h with 100% similarity]
arch/s390/include/asm/cacheflush.h [moved from include/asm-s390/cacheflush.h with 100% similarity]
arch/s390/include/asm/ccwdev.h [moved from include/asm-s390/ccwdev.h with 100% similarity]
arch/s390/include/asm/ccwgroup.h [moved from include/asm-s390/ccwgroup.h with 100% similarity]
arch/s390/include/asm/checksum.h [moved from include/asm-s390/checksum.h with 100% similarity]
arch/s390/include/asm/chpid.h [moved from include/asm-s390/chpid.h with 100% similarity]
arch/s390/include/asm/chsc.h [moved from include/asm-s390/chsc.h with 100% similarity]
arch/s390/include/asm/cio.h [moved from include/asm-s390/cio.h with 100% similarity]
arch/s390/include/asm/cmb.h [moved from include/asm-s390/cmb.h with 100% similarity]
arch/s390/include/asm/compat.h [moved from include/asm-s390/compat.h with 100% similarity]
arch/s390/include/asm/cpcmd.h [moved from include/asm-s390/cpcmd.h with 100% similarity]
arch/s390/include/asm/cpu.h [moved from include/asm-s390/cpu.h with 100% similarity]
arch/s390/include/asm/cputime.h [moved from include/asm-s390/cputime.h with 100% similarity]
arch/s390/include/asm/current.h [moved from include/asm-s390/current.h with 100% similarity]
arch/s390/include/asm/dasd.h [moved from include/asm-s390/dasd.h with 100% similarity]
arch/s390/include/asm/debug.h [moved from include/asm-s390/debug.h with 100% similarity]
arch/s390/include/asm/delay.h [moved from include/asm-s390/delay.h with 100% similarity]
arch/s390/include/asm/device.h [moved from include/asm-s390/device.h with 100% similarity]
arch/s390/include/asm/diag.h [moved from include/asm-s390/diag.h with 100% similarity]
arch/s390/include/asm/div64.h [moved from include/asm-s390/div64.h with 100% similarity]
arch/s390/include/asm/dma.h [moved from include/asm-s390/dma.h with 100% similarity]
arch/s390/include/asm/ebcdic.h [moved from include/asm-s390/ebcdic.h with 100% similarity]
arch/s390/include/asm/elf.h [moved from include/asm-s390/elf.h with 100% similarity]
arch/s390/include/asm/emergency-restart.h [moved from include/asm-s390/emergency-restart.h with 100% similarity]
arch/s390/include/asm/errno.h [moved from include/asm-s390/errno.h with 100% similarity]
arch/s390/include/asm/etr.h [moved from include/asm-s390/etr.h with 100% similarity]
arch/s390/include/asm/extmem.h [moved from include/asm-s390/extmem.h with 100% similarity]
arch/s390/include/asm/fb.h [moved from include/asm-s390/fb.h with 100% similarity]
arch/s390/include/asm/fcntl.h [moved from include/asm-s390/fcntl.h with 100% similarity]
arch/s390/include/asm/fcx.h [moved from include/asm-s390/fcx.h with 100% similarity]
arch/s390/include/asm/futex.h [moved from include/asm-s390/futex.h with 100% similarity]
arch/s390/include/asm/hardirq.h [moved from include/asm-s390/hardirq.h with 100% similarity]
arch/s390/include/asm/hugetlb.h [moved from include/asm-s390/hugetlb.h with 100% similarity]
arch/s390/include/asm/idals.h [moved from include/asm-s390/idals.h with 100% similarity]
arch/s390/include/asm/io.h [moved from include/asm-s390/io.h with 100% similarity]
arch/s390/include/asm/ioctl.h [moved from include/asm-s390/ioctl.h with 100% similarity]
arch/s390/include/asm/ioctls.h [moved from include/asm-s390/ioctls.h with 100% similarity]
arch/s390/include/asm/ipcbuf.h [moved from include/asm-s390/ipcbuf.h with 100% similarity]
arch/s390/include/asm/ipl.h [moved from include/asm-s390/ipl.h with 100% similarity]
arch/s390/include/asm/irq.h [moved from include/asm-s390/irq.h with 100% similarity]
arch/s390/include/asm/irq_regs.h [moved from include/asm-s390/irq_regs.h with 100% similarity]
arch/s390/include/asm/irqflags.h [moved from include/asm-s390/irqflags.h with 100% similarity]
arch/s390/include/asm/isc.h [moved from include/asm-s390/isc.h with 100% similarity]
arch/s390/include/asm/itcw.h [moved from include/asm-s390/itcw.h with 100% similarity]
arch/s390/include/asm/kdebug.h [moved from include/asm-s390/kdebug.h with 100% similarity]
arch/s390/include/asm/kexec.h [moved from include/asm-s390/kexec.h with 100% similarity]
arch/s390/include/asm/kmap_types.h [moved from include/asm-s390/kmap_types.h with 100% similarity]
arch/s390/include/asm/kprobes.h [moved from include/asm-s390/kprobes.h with 100% similarity]
arch/s390/include/asm/kvm.h [moved from include/asm-s390/kvm.h with 100% similarity]
arch/s390/include/asm/kvm_host.h [moved from include/asm-s390/kvm_host.h with 100% similarity]
arch/s390/include/asm/kvm_para.h [moved from include/asm-s390/kvm_para.h with 100% similarity]
arch/s390/include/asm/kvm_virtio.h [moved from include/asm-s390/kvm_virtio.h with 100% similarity]
arch/s390/include/asm/linkage.h [moved from include/asm-s390/linkage.h with 100% similarity]
arch/s390/include/asm/local.h [moved from include/asm-s390/local.h with 100% similarity]
arch/s390/include/asm/lowcore.h [moved from include/asm-s390/lowcore.h with 100% similarity]
arch/s390/include/asm/mathemu.h [moved from include/asm-s390/mathemu.h with 100% similarity]
arch/s390/include/asm/mman.h [moved from include/asm-s390/mman.h with 100% similarity]
arch/s390/include/asm/mmu.h [moved from include/asm-s390/mmu.h with 100% similarity]
arch/s390/include/asm/mmu_context.h [moved from include/asm-s390/mmu_context.h with 100% similarity]
arch/s390/include/asm/module.h [moved from include/asm-s390/module.h with 100% similarity]
arch/s390/include/asm/monwriter.h [moved from include/asm-s390/monwriter.h with 100% similarity]
arch/s390/include/asm/msgbuf.h [moved from include/asm-s390/msgbuf.h with 100% similarity]
arch/s390/include/asm/mutex.h [moved from include/asm-s390/mutex.h with 100% similarity]
arch/s390/include/asm/page.h [moved from include/asm-s390/page.h with 100% similarity]
arch/s390/include/asm/param.h [moved from include/asm-s390/param.h with 100% similarity]
arch/s390/include/asm/pci.h [moved from include/asm-s390/pci.h with 100% similarity]
arch/s390/include/asm/percpu.h [moved from include/asm-s390/percpu.h with 100% similarity]
arch/s390/include/asm/pgalloc.h [moved from include/asm-s390/pgalloc.h with 100% similarity]
arch/s390/include/asm/pgtable.h [moved from include/asm-s390/pgtable.h with 100% similarity]
arch/s390/include/asm/poll.h [moved from include/asm-s390/poll.h with 100% similarity]
arch/s390/include/asm/posix_types.h [moved from include/asm-s390/posix_types.h with 100% similarity]
arch/s390/include/asm/processor.h [moved from include/asm-s390/processor.h with 100% similarity]
arch/s390/include/asm/ptrace.h [moved from include/asm-s390/ptrace.h with 100% similarity]
arch/s390/include/asm/qdio.h [moved from include/asm-s390/qdio.h with 100% similarity]
arch/s390/include/asm/qeth.h [moved from include/asm-s390/qeth.h with 100% similarity]
arch/s390/include/asm/reset.h [moved from include/asm-s390/reset.h with 100% similarity]
arch/s390/include/asm/resource.h [moved from include/asm-s390/resource.h with 100% similarity]
arch/s390/include/asm/rwsem.h [moved from include/asm-s390/rwsem.h with 100% similarity]
arch/s390/include/asm/s390_ext.h [moved from include/asm-s390/s390_ext.h with 100% similarity]
arch/s390/include/asm/s390_rdev.h [moved from include/asm-s390/s390_rdev.h with 100% similarity]
arch/s390/include/asm/scatterlist.h [moved from include/asm-s390/scatterlist.h with 100% similarity]
arch/s390/include/asm/schid.h [moved from include/asm-s390/schid.h with 100% similarity]
arch/s390/include/asm/sclp.h [moved from include/asm-s390/sclp.h with 100% similarity]
arch/s390/include/asm/sections.h [moved from include/asm-s390/sections.h with 100% similarity]
arch/s390/include/asm/segment.h [moved from include/asm-s390/segment.h with 100% similarity]
arch/s390/include/asm/sembuf.h [moved from include/asm-s390/sembuf.h with 100% similarity]
arch/s390/include/asm/setup.h [moved from include/asm-s390/setup.h with 100% similarity]
arch/s390/include/asm/sfp-machine.h [moved from include/asm-s390/sfp-machine.h with 100% similarity]
arch/s390/include/asm/sfp-util.h [moved from include/asm-s390/sfp-util.h with 100% similarity]
arch/s390/include/asm/shmbuf.h [moved from include/asm-s390/shmbuf.h with 100% similarity]
arch/s390/include/asm/shmparam.h [moved from include/asm-s390/shmparam.h with 100% similarity]
arch/s390/include/asm/sigcontext.h [moved from include/asm-s390/sigcontext.h with 100% similarity]
arch/s390/include/asm/siginfo.h [moved from include/asm-s390/siginfo.h with 100% similarity]
arch/s390/include/asm/signal.h [moved from include/asm-s390/signal.h with 100% similarity]
arch/s390/include/asm/sigp.h [moved from include/asm-s390/sigp.h with 100% similarity]
arch/s390/include/asm/smp.h [moved from include/asm-s390/smp.h with 100% similarity]
arch/s390/include/asm/socket.h [moved from include/asm-s390/socket.h with 100% similarity]
arch/s390/include/asm/sockios.h [moved from include/asm-s390/sockios.h with 100% similarity]
arch/s390/include/asm/sparsemem.h [moved from include/asm-s390/sparsemem.h with 100% similarity]
arch/s390/include/asm/spinlock.h [moved from include/asm-s390/spinlock.h with 100% similarity]
arch/s390/include/asm/spinlock_types.h [moved from include/asm-s390/spinlock_types.h with 100% similarity]
arch/s390/include/asm/stat.h [moved from include/asm-s390/stat.h with 100% similarity]
arch/s390/include/asm/statfs.h [moved from include/asm-s390/statfs.h with 100% similarity]
arch/s390/include/asm/string.h [moved from include/asm-s390/string.h with 100% similarity]
arch/s390/include/asm/suspend.h [moved from include/asm-s390/suspend.h with 100% similarity]
arch/s390/include/asm/sysinfo.h [moved from include/asm-s390/sysinfo.h with 100% similarity]
arch/s390/include/asm/system.h [moved from include/asm-s390/system.h with 100% similarity]
arch/s390/include/asm/tape390.h [moved from include/asm-s390/tape390.h with 100% similarity]
arch/s390/include/asm/termbits.h [moved from include/asm-s390/termbits.h with 100% similarity]
arch/s390/include/asm/termios.h [moved from include/asm-s390/termios.h with 100% similarity]
arch/s390/include/asm/thread_info.h [moved from include/asm-s390/thread_info.h with 100% similarity]
arch/s390/include/asm/timer.h [moved from include/asm-s390/timer.h with 100% similarity]
arch/s390/include/asm/timex.h [moved from include/asm-s390/timex.h with 100% similarity]
arch/s390/include/asm/tlb.h [moved from include/asm-s390/tlb.h with 100% similarity]
arch/s390/include/asm/tlbflush.h [moved from include/asm-s390/tlbflush.h with 100% similarity]
arch/s390/include/asm/todclk.h [moved from include/asm-s390/todclk.h with 100% similarity]
arch/s390/include/asm/topology.h [moved from include/asm-s390/topology.h with 100% similarity]
arch/s390/include/asm/types.h [moved from include/asm-s390/types.h with 100% similarity]
arch/s390/include/asm/uaccess.h [moved from include/asm-s390/uaccess.h with 100% similarity]
arch/s390/include/asm/ucontext.h [moved from include/asm-s390/ucontext.h with 100% similarity]
arch/s390/include/asm/unaligned.h [moved from include/asm-s390/unaligned.h with 100% similarity]
arch/s390/include/asm/unistd.h [moved from include/asm-s390/unistd.h with 100% similarity]
arch/s390/include/asm/user.h [moved from include/asm-s390/user.h with 100% similarity]
arch/s390/include/asm/vtoc.h [moved from include/asm-s390/vtoc.h with 100% similarity]
arch/s390/include/asm/xor.h [moved from include/asm-s390/xor.h with 100% similarity]
arch/s390/include/asm/zcrypt.h [moved from include/asm-s390/zcrypt.h with 100% similarity]
arch/sh/Kconfig
arch/sh/Kconfig.debug
arch/sh/Makefile
arch/sh/boards/Makefile
arch/sh/boards/board-ap325rxa.c
arch/sh/boards/mach-se/7343/irq.c
arch/sh/boards/mach-systemh/irq.c
arch/sh/configs/dreamcast_defconfig
arch/sh/include/asm/a.out.h [deleted file]
arch/sh/include/asm/ptrace.h
arch/sh/include/asm/seccomp.h [new file with mode: 0644]
arch/sh/include/asm/thread_info.h
arch/sh/include/asm/tlb_64.h
arch/sh/include/cpu-sh2/cpu/cache.h
arch/sh/include/cpu-sh2a/cpu/addrspace.h [new file with mode: 0644]
arch/sh/include/cpu-sh2a/cpu/cache.h
arch/sh/include/cpu-sh2a/cpu/cacheflush.h [new file with mode: 0644]
arch/sh/kernel/cpu/sh4/sq.c
arch/sh/kernel/cpu/sh5/entry.S
arch/sh/kernel/entry-common.S
arch/sh/kernel/machine_kexec.c
arch/sh/kernel/module.c
arch/sh/kernel/ptrace_32.c
arch/sh/kernel/ptrace_64.c
arch/sh/kernel/setup.c
arch/sh/kernel/signal_32.c
arch/sh/kernel/signal_64.c
arch/sh/mm/Kconfig
arch/sh/mm/Makefile_32
arch/sh/mm/cache-sh2.c
arch/sh/mm/cache-sh2a.c [new file with mode: 0644]
arch/sh/mm/tlb-sh5.c
arch/sh/tools/Makefile
arch/sparc/include/asm/futex_64.h
arch/sparc/include/asm/irq_64.h
arch/sparc/include/asm/of_platform.h
arch/sparc/include/asm/of_platform_32.h [deleted file]
arch/sparc/include/asm/of_platform_64.h [deleted file]
arch/sparc/include/asm/ptrace_32.h
arch/sparc/include/asm/ptrace_64.h
arch/sparc64/kernel/irq.c
arch/sparc64/kernel/of_device.c
arch/sparc64/kernel/process.c
arch/sparc64/kernel/signal.c
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/kernel/traps.c
arch/sparc64/mm/tsb.c
arch/sparc64/mm/ultra.S
arch/xtensa/kernel/xtensa_ksyms.c
block/scsi_ioctl.c
drivers/block/cciss.c
drivers/cdrom/cdrom.c
drivers/char/efirtc.c
drivers/char/hvc_console.h
drivers/char/hvcs.c
drivers/char/vt.c
drivers/ide/Kconfig
drivers/ide/arm/palm_bk3710.c
drivers/ide/ide-cd.c
drivers/ide/ide-disk.c
drivers/ide/ide-dma.c
drivers/ide/ide-floppy.c
drivers/ide/ide-iops.c
drivers/ide/ide-tape.c
drivers/ide/pci/aec62xx.c
drivers/ide/pci/alim15x3.c
drivers/ide/pci/amd74xx.c
drivers/ide/pci/atiixp.c
drivers/ide/pci/cmd64x.c
drivers/ide/pci/cs5520.c
drivers/ide/pci/cs5535.c
drivers/ide/pci/hpt366.c
drivers/ide/pci/it8213.c
drivers/ide/pci/it821x.c
drivers/ide/pci/jmicron.c
drivers/ide/pci/pdc202xx_new.c
drivers/ide/pci/pdc202xx_old.c
drivers/ide/pci/piix.c
drivers/ide/pci/scc_pata.c
drivers/ide/pci/serverworks.c
drivers/ide/pci/siimage.c
drivers/ide/pci/sis5513.c
drivers/ide/pci/slc90e66.c
drivers/ide/pci/tc86c001.c
drivers/ide/pci/via82cxxx.c
drivers/infiniband/hw/ehca/ehca_reqs.c
drivers/input/keyboard/maple_keyb.c
drivers/isdn/Makefile
drivers/isdn/hardware/mISDN/hfcmulti.c
drivers/isdn/hardware/mISDN/hfcpci.c
drivers/isdn/mISDN/l1oip_core.c
drivers/isdn/mISDN/socket.c
drivers/macintosh/mediabay.c
drivers/media/video/vino.c
drivers/misc/sgi-gru/grutlbpurge.c
drivers/mtd/maps/ipaq-flash.c
drivers/mtd/mtdsuper.c
drivers/net/stnic.c
drivers/pcmcia/rsrc_nonstatic.c
drivers/rtc/rtc-bfin.c
drivers/scsi/hptiop.c
drivers/scsi/ide-scsi.c
drivers/scsi/scsi_transport_spi.c
drivers/scsi/sd.c
drivers/scsi/sd.h
drivers/scsi/ses.c
drivers/scsi/sg.c
drivers/serial/bfin_5xx.c
drivers/serial/crisv10.c
drivers/serial/crisv10.h
drivers/sh/maple/maple.c
drivers/spi/Kconfig
drivers/spi/Makefile
drivers/spi/atmel_spi.c
drivers/spi/orion_spi.c [new file with mode: 0644]
drivers/spi/spi_s3c24xx.c
drivers/usb/core/message.c
drivers/usb/storage/freecom.c
drivers/video/arkfb.c
drivers/video/aty/atyfb_base.c
drivers/video/aty/radeon_accel.c
drivers/video/aty/radeon_i2c.c
drivers/video/backlight/pwm_bl.c
drivers/video/console/.gitignore [new file with mode: 0644]
drivers/video/console/fbcon.c
drivers/video/fsl-diu-fb.c
drivers/video/s3fb.c
drivers/video/vt8623fb.c
drivers/watchdog/ar7_wdt.c
drivers/watchdog/it8712f_wdt.c
drivers/watchdog/s3c2410_wdt.c
drivers/watchdog/sc1200wdt.c
drivers/watchdog/wdt.c
drivers/watchdog/wdt_pci.c
firmware/ihex2fw.c
fs/afs/write.c
fs/buffer.c
fs/cifs/file.c
fs/ext4/acl.c
fs/ext4/balloc.c
fs/ext4/ext4.h
fs/ext4/extents.c
fs/ext4/ialloc.c
fs/ext4/inode.c
fs/ext4/mballoc.c
fs/ext4/mballoc.h
fs/ext4/resize.c
fs/ext4/super.c
fs/ext4/xattr.c
fs/fat/file.c
fs/jbd/commit.c
fs/jbd2/commit.c
fs/jbd2/journal.c
fs/nfs/nfsroot.c
fs/ntfs/aops.c
fs/ntfs/compress.c
fs/ntfs/mft.c
fs/omfs/inode.c
fs/proc/base.c
fs/reiserfs/inode.c
fs/reiserfs/journal.c
fs/splice.c
fs/ufs/super.c
fs/xfs/linux-2.6/xfs_aops.c
include/asm-arm/arch-ns9xxx/debug-macro.S
include/asm-arm/arch-ns9xxx/entry-macro.S
include/asm-arm/arch-ns9xxx/processor.h
include/asm-arm/arch-ns9xxx/system.h
include/asm-arm/arch-omap/board.h
include/asm-m68k/contregs.h
include/asm-m68k/fbio.h
include/asm-m68k/idprom.h
include/linux/buffer_head.h
include/linux/ide.h
include/linux/ihex.h
include/linux/interrupt.h
include/linux/kexec.h
include/linux/mISDNif.h
include/linux/maple.h
include/linux/page-flags.h
include/linux/pagemap.h
include/linux/parser.h
include/linux/pm_qos_params.h
include/linux/spi/orion_spi.h [new file with mode: 0644]
include/linux/tracehook.h
include/linux/vt_kern.h
include/scsi/scsi_device.h
include/video/radeon.h
init/main.c
kernel/auditsc.c
kernel/dma-coherent.c
kernel/irq/manage.c
kernel/pm_qos_params.c
kernel/relay.c
kernel/sched.c
kernel/semaphore.c
mm/filemap.c
mm/memory.c
mm/migrate.c
mm/mlock.c
mm/mm_init.c
mm/mmap.c
mm/nommu.c
mm/rmap.c
mm/shmem.c
mm/swap.c
mm/swap_state.c
mm/swapfile.c
mm/truncate.c
mm/vmscan.c
scripts/Makefile.fwinst
scripts/kconfig/conf.c
scripts/kconfig/confdata.c
scripts/kernel-doc
sound/core/seq/oss/seq_oss_synth.c

index 6de71308a9060b1a81c27aedb5b91042ff0b668b..5b5aba404aacb69160f0d88301be0a76aea78682 100644 (file)
@@ -89,8 +89,6 @@ cciss.txt
        - info, major/minor #'s for Compaq's SMART Array Controllers.
 cdrom/
        - directory with information on the CD-ROM drivers that Linux has.
-cli-sti-removal.txt
-       - cli()/sti() removal guide.
 computone.txt
        - info on Computone Intelliport II/Plus Multiport Serial Driver.
 connector/
index 0eb0d027eb32e139f442eb30e3b92a7560112bed..1d1b34500b69278e5f217c6b521d729a1c78b4f9 100644 (file)
@@ -12,7 +12,7 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
            kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
            gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
            genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
-           mac80211.xml debugobjects.xml
+           mac80211.xml debugobjects.xml sh.xml
 
 ###
 # The build process is as follows (targets):
index 4acc73240a6d536ef044bf1dfc5a2abd6ae4296f..95bfc12e5439d572f02e924f887802fd273bcf96 100644 (file)
       the hardware structures represented here, please consult the Principles
       of Operation.
     </para>
-!Iinclude/asm-s390/cio.h
+!Iarch/s390/include/asm/cio.h
     </sect1>
     <sect1 id="ccwdev">
      <title>ccw devices</title>
       ccw device structure. Device drivers must not bypass those functions
       or strange side effects may happen.
     </para>
-!Iinclude/asm-s390/ccwdev.h
+!Iarch/s390/include/asm/ccwdev.h
 !Edrivers/s390/cio/device.c
 !Edrivers/s390/cio/device_ops.c
     </sect1>
        measurement data which is made available by the channel subsystem
        for each channel attached device.
   </para>
-!Iinclude/asm-s390/cmb.h
+!Iarch/s390/include/asm/cmb.h
 !Edrivers/s390/cio/cmf.c
     </sect1>
   </chapter>
   </para>
    <sect1 id="ccwgroupdevices">
     <title>ccw group devices</title>
-!Iinclude/asm-s390/ccwgroup.h
+!Iarch/s390/include/asm/ccwgroup.h
 !Edrivers/s390/cio/ccwgroup.c
    </sect1>
   </chapter>
diff --git a/Documentation/DocBook/sh.tmpl b/Documentation/DocBook/sh.tmpl
new file mode 100644 (file)
index 0000000..0c3dc4c
--- /dev/null
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+       "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
+
+<book id="sh-drivers">
+ <bookinfo>
+  <title>SuperH Interfaces Guide</title>
+  
+  <authorgroup>
+   <author>
+    <firstname>Paul</firstname>
+    <surname>Mundt</surname>
+    <affiliation>
+     <address>
+      <email>lethal@linux-sh.org</email>
+     </address>
+    </affiliation>
+   </author>
+  </authorgroup>
+
+  <copyright>
+   <year>2008</year>
+   <holder>Paul Mundt</holder>
+  </copyright>
+  <copyright>
+   <year>2008</year>
+   <holder>Renesas Technology Corp.</holder>
+  </copyright>
+
+  <legalnotice>
+   <para>
+     This documentation is free software; you can redistribute
+     it and/or modify it under the terms of the GNU General Public
+     License version 2 as published by the Free Software Foundation.
+   </para>
+      
+   <para>
+     This program is distributed in the hope that it will be
+     useful, but WITHOUT ANY WARRANTY; without even the implied
+     warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+     See the GNU General Public License for more details.
+   </para>
+      
+   <para>
+     You should have received a copy of the GNU General Public
+     License along with this program; if not, write to the Free
+     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+     MA 02111-1307 USA
+   </para>
+      
+   <para>
+     For more details see the file COPYING in the source
+     distribution of Linux.
+   </para>
+  </legalnotice>
+ </bookinfo>
+
+<toc></toc>
+
+  <chapter id="mm">
+    <title>Memory Management</title>
+    <sect1 id="sh4">
+    <title>SH-4</title>
+      <sect2 id="sq">
+        <title>Store Queue API</title>
+!Earch/sh/kernel/cpu/sh4/sq.c
+      </sect2>
+    </sect1>
+    <sect1 id="sh5">
+      <title>SH-5</title>
+      <sect2 id="tlb">
+       <title>TLB Interfaces</title>
+!Iarch/sh/mm/tlb-sh5.c
+!Iarch/sh/include/asm/tlb_64.h
+      </sect2>
+    </sect1>
+  </chapter>
+  <chapter id="clk">
+    <title>Clock Framework Extensions</title>
+!Iarch/sh/include/asm/clock.h
+  </chapter>
+  <chapter id="mach">
+    <title>Machine Specific Interfaces</title>
+    <sect1 id="dreamcast">
+      <title>mach-dreamcast</title>
+!Iarch/sh/boards/mach-dreamcast/rtc.c
+    </sect1>
+    <sect1 id="x3proto">
+      <title>mach-x3proto</title>
+!Earch/sh/boards/mach-x3proto/ilsel.c
+    </sect1>
+  </chapter>
+  <chapter id="busses">
+    <title>Busses</title>
+    <sect1 id="superhyway">
+      <title>SuperHyway</title>
+!Edrivers/sh/superhyway/superhyway.c
+    </sect1>
+
+    <sect1 id="maple">
+      <title>Maple</title>
+!Edrivers/sh/maple/maple.c
+    </sect1>
+  </chapter>
+</book>
diff --git a/Documentation/cli-sti-removal.txt b/Documentation/cli-sti-removal.txt
deleted file mode 100644 (file)
index 60932b0..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-
-#### cli()/sti() removal guide, started by Ingo Molnar <mingo@redhat.com>
-
-
-as of 2.5.28, five popular macros have been removed on SMP, and
-are being phased out on UP:
-
- cli(), sti(), save_flags(flags), save_flags_cli(flags), restore_flags(flags)
-
-until now it was possible to protect driver code against interrupt
-handlers via a cli(), but from now on other, more lightweight methods
-have to be used for synchronization, such as spinlocks or semaphores.
-
-for example, driver code that used to do something like:
-
-       struct driver_data;
-
-       irq_handler (...)
-       {
-               ....
-               driver_data.finish = 1;
-               driver_data.new_work = 0;
-               ....
-       }
-
-       ...
-
-       ioctl_func (...)
-       {
-               ...
-               cli();
-               ...
-               driver_data.finish = 0;
-               driver_data.new_work = 2;
-               ...
-               sti();
-               ...
-       }
-
-was SMP-correct because the cli() function ensured that no
-interrupt handler (amongst them the above irq_handler()) function
-would execute while the cli()-ed section is executing.
-
-but from now on a more direct method of locking has to be used:
-
-       DEFINE_SPINLOCK(driver_lock);
-       struct driver_data;
-
-       irq_handler (...)
-       {
-               unsigned long flags;
-               ....
-               spin_lock_irqsave(&driver_lock, flags);
-               ....
-               driver_data.finish = 1;
-               driver_data.new_work = 0;
-               ....
-               spin_unlock_irqrestore(&driver_lock, flags);
-               ....
-       }
-
-       ...
-
-       ioctl_func (...)
-       {
-               ...
-               spin_lock_irq(&driver_lock);
-               ...
-               driver_data.finish = 0;
-               driver_data.new_work = 2;
-               ...
-               spin_unlock_irq(&driver_lock);
-               ...
-       }
-
-the above code has a number of advantages:
-
-- the locking relation is easier to understand - actual lock usage
-  pinpoints the critical sections. cli() usage is too opaque.
-  Easier to understand means it's easier to debug.
-
-- it's faster, because spinlocks are faster to acquire than the
-  potentially heavily-used IRQ lock. Furthermore, your driver does
-  not have to wait eg. for a big heavy SCSI interrupt to finish,
-  because the driver_lock spinlock is only used by your driver.
-  cli() on the other hand was used by many drivers, and extended
-  the critical section to the whole IRQ handler function - creating
-  serious lock contention.
-
-to make the transition easier, we've still kept the cli(), sti(),
-save_flags(), save_flags_cli() and restore_flags() macros defined
-on UP systems - but their usage will be phased out until 2.6 is
-released.
-
-drivers that want to disable local interrupts (interrupts on the
-current CPU), can use the following five macros:
-
-  local_irq_disable(), local_irq_enable(), local_save_flags(flags),
-  local_irq_save(flags), local_irq_restore(flags)
-
-but beware, their meaning and semantics are much simpler, far from
-that of the old cli(), sti(), save_flags(flags) and restore_flags(flags)
-SMP meaning:
-
-    local_irq_disable()       => turn local IRQs off
-
-    local_irq_enable()        => turn local IRQs on
-
-    local_save_flags(flags)   => save the current IRQ state into flags. The
-                                 state can be on or off. (on some
-                                 architectures there's even more bits in it.)
-
-    local_irq_save(flags)     => save the current IRQ state into flags and
-                                 disable interrupts.
-
-    local_irq_restore(flags)  => restore the IRQ state from flags.
-
-(local_irq_save can save both irqs on and irqs off state, and
-local_irq_restore can restore into both irqs on and irqs off state.)
-
-another related change is that synchronize_irq() now takes a parameter:
-synchronize_irq(irq). This change too has the purpose of making SMP
-synchronization more lightweight - this way you can wait for your own
-interrupt handler to finish, no need to wait for other IRQ sources.
-
-
-why were these changes done? The main reason was the architectural burden
-of maintaining the cli()/sti() interface - it became a real problem. The
-new interrupt system is much more streamlined, easier to understand, debug,
-and it's also a bit faster - the same happened to it that will happen to
-cli()/sti() using drivers once they convert to spinlocks :-)
-
index 49adb1a3351487d992aeb922a34604b46691a7c5..c40866e8b9576c296853383ecaaf95c49930843a 100644 (file)
@@ -1,4 +1,4 @@
-PM quality of Service interface.
+PM Quality Of Service Interface.
 
 This interface provides a kernel and user mode interface for registering
 performance expectations by drivers, subsystems and user space applications on
@@ -7,6 +7,11 @@ one of the parameters.
 Currently we have {cpu_dma_latency, network_latency, network_throughput} as the
 initial set of pm_qos parameters.
 
+Each parameters have defined units:
+ * latency: usec
+ * timeout: usec
+ * throughput: kbs (kilo bit / sec)
+
 The infrastructure exposes multiple misc device nodes one per implemented
 parameter.  The set of parameters implement is defined by pm_qos_power_init()
 and pm_qos_params.h.  This is done because having the available parameters
index 928a79ceb7aaeb9515fbee4141cd18f06c6f37c5..de4063cb4fdc0ad6abea29d766cae78616837311 100644 (file)
@@ -278,7 +278,7 @@ it with special cases.
         a 64-bit platform.
 
         d) request and get assigned a platform number (see PLATFORM_*
-        constants in include/asm-powerpc/processor.h
+        constants in arch/powerpc/include/asm/processor.h
 
 32-bit embedded kernels:
 
@@ -340,7 +340,7 @@ the block to RAM before passing it to the kernel.
 ---------
 
    The kernel is entered with r3 pointing to an area of memory that is
-   roughly described in include/asm-powerpc/prom.h by the structure
+   roughly described in arch/powerpc/include/asm/prom.h by the structure
    boot_param_header:
 
 struct boot_param_header {
index df7afe43d46286a1c0cb50bb95269e7d7c99e7d6..9d4e33df624c2390e03cc75cdbf245e50bca1294 100644 (file)
@@ -133,7 +133,7 @@ error.  Given an arbitrary address, the routine
 pci_get_device_by_addr() will find the pci device associated
 with that address (if any).
 
-The default include/asm-powerpc/io.h macros readb(), inb(), insb(),
+The default arch/powerpc/include/asm/io.h macros readb(), inb(), insb(),
 etc. include a check to see if the i/o read returned all-0xff's.
 If so, these make a call to eeh_dn_check_failure(), which in turn
 asks the firmware if the all-ff's value is the sign of a true EEH
index 5e6d6ab824339b7fcc4f681d87b117c0808760aa..8223a521d7c3f2198c19d7065469b7f1484f714f 100644 (file)
@@ -502,6 +502,12 @@ L: openezx-devel@lists.openezx.org (subscribers-only)
 W:     http://www.openezx.org/
 S:     Maintained
 
+ARM/FREESCALE IMX / MXC ARM ARCHITECTURE
+P:     Sascha Hauer
+M:     kernel@pengutronix.de
+L:     linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
+S:     Maintained
+
 ARM/GLOMATION GESBC9312SX MACHINE SUPPORT
 P:     Lennert Buytenhek
 M:     kernel@wantstofly.org
index 95baac4939e09a3809e427ed82207c5f3c1270c7..94462a097f86697ce51558bd9389a4886b904318 100644 (file)
@@ -112,6 +112,3 @@ $(obj)/font.c: $(FONTC)
 
 $(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile .config
        @sed "$(SEDFLAGS)" < $< > $@
-
-$(obj)/misc.o: $(obj)/misc.c include/asm/arch/uncompress.h lib/inflate.c
-
similarity index 98%
rename from include/asm-arm/assembler.h
rename to arch/arm/include/asm/assembler.h
index 911393b2c6f000cc39bf84d73a7385883c105e5f..6116e4893c0ade4bc478996a82c316ce5c99a64e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/assembler.h
+ *  arch/arm/include/asm/assembler.h
  *
  *  Copyright (C) 1996-2000 Russell King
  *
similarity index 99%
rename from include/asm-arm/atomic.h
rename to arch/arm/include/asm/atomic.h
index 3b59f94b5a3d3f345bf5bfeff53440063ae3f426..325f881ccb50204041ed15b824ae0b73e2dcae3f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/atomic.h
+ *  arch/arm/include/asm/atomic.h
  *
  *  Copyright (C) 1996 Russell King.
  *  Copyright (C) 2002 Deep Blue Solutions Ltd.
similarity index 93%
rename from include/asm-arm/bugs.h
rename to arch/arm/include/asm/bugs.h
index ca54eb0f12d75cc15ea35281d5cb72f3050171cb..a97f1ea708d19f339649a2ece287a69a5fe32a40 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/bugs.h
+ *  arch/arm/include/asm/bugs.h
  *
  *  Copyright (C) 1995-2003 Russell King
  *
similarity index 97%
rename from include/asm-arm/byteorder.h
rename to arch/arm/include/asm/byteorder.h
index e6f7fcdc73b0299524b1e3b6a6b83eb9f360424f..4fbfb22f65a0f4444818e455422b60d3e61545d0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/byteorder.h
+ *  arch/arm/include/asm/byteorder.h
  *
  * ARM Endian-ness.  In little endian mode, the data bus is connected such
  * that byte accesses appear as:
similarity index 80%
rename from include/asm-arm/cache.h
rename to arch/arm/include/asm/cache.h
index 31332c8ac04ea0a21d184ff61db9044a094506a7..cb7a9e97fd7ef7807161f509e0260a6fa94233cc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/cache.h
+ *  arch/arm/include/asm/cache.h
  */
 #ifndef __ASMARM_CACHE_H
 #define __ASMARM_CACHE_H
similarity index 99%
rename from include/asm-arm/cacheflush.h
rename to arch/arm/include/asm/cacheflush.h
index e68a1cbcc85209d99fa3a927bb40cb6727690e02..9073d9c6567e7c8b8065534563bee01ce83c9e37 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/cacheflush.h
+ *  arch/arm/include/asm/cacheflush.h
  *
  *  Copyright (C) 1999-2002 Russell King
  *
similarity index 98%
rename from include/asm-arm/checksum.h
rename to arch/arm/include/asm/checksum.h
index eaa0efd8d0d47e39ce6b5087a9eb60d1bc61811b..6dcc164308688c8efdf7f688f239169537470da4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/checksum.h
+ *  arch/arm/include/asm/checksum.h
  *
  * IP checksum routines
  *
similarity index 97%
rename from include/asm-arm/cpu-multi32.h
rename to arch/arm/include/asm/cpu-multi32.h
index 3479de9266e5584ec6c404ea08786347d121e03c..e2b5b0b2116a705819995256e51b70bc27abb764 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/cpu-multi32.h
+ *  arch/arm/include/asm/cpu-multi32.h
  *
  *  Copyright (C) 2000 Russell King
  *
similarity index 97%
rename from include/asm-arm/cpu-single.h
rename to arch/arm/include/asm/cpu-single.h
index 0b120ee36091c962c9ce5b52da1efe58cdda4cbb..f073a6d2a406bc5125c80b6e74fd8f042826daad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/cpu-single.h
+ *  arch/arm/include/asm/cpu-single.h
  *
  *  Copyright (C) 2000 Russell King
  *
similarity index 93%
rename from include/asm-arm/cpu.h
rename to arch/arm/include/asm/cpu.h
index 715426b9b08ef355728a7ce9ebde64b5d522ce14..634b2d7c612a706d8f9b5662e50d5848864cac5d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/cpu.h
+ *  arch/arm/include/asm/cpu.h
  *
  *  Copyright (C) 2004-2005 ARM Ltd.
  *
similarity index 98%
rename from include/asm-arm/domain.h
rename to arch/arm/include/asm/domain.h
index 3c12a7625304d24d19bcb9e469c5b5bbcca8faef..cc7ef4080711ff5b2b506449dc54602d8fe65b8d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/domain.h
+ *  arch/arm/include/asm/domain.h
  *
  *  Copyright (C) 1999 Russell King.
  *
similarity index 99%
rename from include/asm-arm/ecard.h
rename to arch/arm/include/asm/ecard.h
index 5e22881a630da8a12a9a737cc86696cc204383fd..29f2610efc70775a7059f4b5f63e1cc175c78749 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/ecard.h
+ * arch/arm/include/asm/ecard.h
  *
  * definitions for expansion cards
  *
similarity index 96%
rename from include/asm-arm/fiq.h
rename to arch/arm/include/asm/fiq.h
index a3bad09e825caff503c8be058c76d878299bfe8f..2242ce22ec6c866285391f94696149e3977dece3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/fiq.h
+ *  arch/arm/include/asm/fiq.h
  *
  * Support for FIQ on ARM architectures.
  * Written by Philip Blundell <philb@gnu.org>, 1998
similarity index 90%
rename from include/asm-arm/flat.h
rename to arch/arm/include/asm/flat.h
index 9918aa46d9e53c03983604b6b70237516d11d183..1d77e51907f6ddb70f5aa8123583827bffaa676c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * include/asm-arm/flat.h -- uClinux flat-format executables
+ * arch/arm/include/asm/flat.h -- uClinux flat-format executables
  */
 
 #ifndef __ARM_FLAT_H__
similarity index 99%
rename from include/asm-arm/floppy.h
rename to arch/arm/include/asm/floppy.h
index 41a5e9d6bb694999ad426a2a6526a0556e00f1d7..dce20c25ab10f87eb1c01426a79e4d08d078acb9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/floppy.h
+ *  arch/arm/include/asm/floppy.h
  *
  *  Copyright (C) 1996-2000 Russell King
  *
similarity index 97%
rename from include/asm-arm/fpstate.h
rename to arch/arm/include/asm/fpstate.h
index 392eb53323238d16a6b9e80a8363960b06c1103e..ee5e03efc1bbe3dff88c2acc8313ab08136cd98b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/fpstate.h
+ *  arch/arm/include/asm/fpstate.h
  *
  *  Copyright (C) 1995 Russell King
  *
similarity index 99%
rename from include/asm-arm/glue.h
rename to arch/arm/include/asm/glue.h
index a97a182ba28732a4d9d22ae353efcf695696bd46..a0e39d5d00c936a68ac4f99ca9a9b6559b61854f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/glue.h
+ *  arch/arm/include/asm/glue.h
  *
  *  Copyright (C) 1997-1999 Russell King
  *  Copyright (C) 2000-2002 Deep Blue Solutions Ltd.
similarity index 90%
rename from include/asm-arm/hardware.h
rename to arch/arm/include/asm/hardware.h
index 1fd1a5b6504ba961468825435fb64a129b84c1d8..eb3b3abb7db7a0b649a915f049e753aca6f15ee0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware.h
+ *  arch/arm/include/asm/hardware.h
  *
  *  Copyright (C) 1996 Russell King
  *
similarity index 97%
rename from include/asm-arm/hardware/cache-l2x0.h
rename to arch/arm/include/asm/hardware/cache-l2x0.h
index 54029a740396de55f36cae0f826401bf6513e06d..64f2252a25cdc4fd5048ba28f9b9872267aebcdd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * include/asm-arm/hardware/cache-l2x0.h
+ * arch/arm/include/asm/hardware/cache-l2x0.h
  *
  * Copyright (C) 2007 ARM Limited
  *
similarity index 99%
rename from include/asm-arm/hardware/clps7111.h
rename to arch/arm/include/asm/hardware/clps7111.h
index 8d3228dc17784b7cd2c44a2158616c5b80c8e511..44477225aed60fdbc9f1ac56eba5853a3663ba7e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/clps7111.h
+ *  arch/arm/include/asm/hardware/clps7111.h
  *
  *  This file contains the hardware definitions of the CLPS7111 internal
  *  registers.
similarity index 97%
rename from include/asm-arm/hardware/cs89712.h
rename to arch/arm/include/asm/hardware/cs89712.h
index ad99a3e1b80296a2c85a904ed082b26a7f0eb58b..f75626933e94d5801eaf8f2407ec6d8a17224158 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/cs89712.h
+ *  arch/arm/include/asm/hardware/cs89712.h
  *
  *  This file contains the hardware definitions of the CS89712
  *  additional internal registers.
similarity index 93%
rename from include/asm-arm/hardware/debug-8250.S
rename to arch/arm/include/asm/hardware/debug-8250.S
index 07c97fb233fcd50d4963fe9e3b4f8201251dde16..22c689255e6e8767499c90b03732ce94d16efcbc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/hardware/debug-8250.S
+ * arch/arm/include/asm/hardware/debug-8250.S
  *
  *  Copyright (C) 1994-1999 Russell King
  *
similarity index 93%
rename from include/asm-arm/hardware/debug-pl01x.S
rename to arch/arm/include/asm/hardware/debug-pl01x.S
index 23c541a9e89abc896098de362fee893d0eeb4297..f9fd083eff630dd29b0710d603c11447919b9d54 100644 (file)
@@ -1,4 +1,4 @@
-/* linux/include/asm-arm/hardware/debug-pl01x.S
+/* arch/arm/include/asm/hardware/debug-pl01x.S
  *
  * Debugging macro include header
  *
similarity index 99%
rename from include/asm-arm/hardware/dec21285.h
rename to arch/arm/include/asm/hardware/dec21285.h
index 546f7077be9c42313dbae0798c59a8c8f50933a1..7068a1c1e4e4d3a6d8dd776ecc12cdc301617332 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/dec21285.h
+ *  arch/arm/include/asm/hardware/dec21285.h
  *
  *  Copyright (C) 1998 Russell King
  *
similarity index 99%
rename from include/asm-arm/hardware/entry-macro-iomd.S
rename to arch/arm/include/asm/hardware/entry-macro-iomd.S
index 9bb580a5b15edddb745a69192e1be76c17c431a6..e0af4983723fbf99b2a4d8e93abe985c46b83b21 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * include/asm-arm/hardware/entry-macro-iomd.S
+ * arch/arm/include/asm/hardware/entry-macro-iomd.S
  *
  * Low-level IRQ helper macros for IOC/IOMD based platforms
  *
similarity index 96%
rename from include/asm-arm/hardware/ep7211.h
rename to arch/arm/include/asm/hardware/ep7211.h
index 017aa68f612db33f5b4b18a126455560473739ff..654d5f625c49c4b938a6eede027869836c3e73ea 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/ep7211.h
+ *  arch/arm/include/asm/hardware/ep7211.h
  *
  *  This file contains the hardware definitions of the EP7211 internal
  *  registers.
similarity index 98%
rename from include/asm-arm/hardware/ep7212.h
rename to arch/arm/include/asm/hardware/ep7212.h
index 0e952e7470730eecf3370893b33182d751081aee..3b43bbeaf1db453523254aaa241c3250c5ad1dbe 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/ep7212.h
+ *  arch/arm/include/asm/hardware/ep7212.h
  *
  *  This file contains the hardware definitions of the EP7212 internal
  *  registers.
similarity index 96%
rename from include/asm-arm/hardware/gic.h
rename to arch/arm/include/asm/hardware/gic.h
index 966e428ad32c858aec9870a9cb72491effa7b3f3..4924914af1882afd80a31222cf858c1812d050fc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/gic.h
+ *  arch/arm/include/asm/hardware/gic.h
  *
  *  Copyright (C) 2002 ARM Limited, All Rights Reserved.
  *
similarity index 96%
rename from include/asm-arm/hardware/icst307.h
rename to arch/arm/include/asm/hardware/icst307.h
index ff8618a441c0c717f2467118fc05a2dd8246f586..554f128a104641aed7b4c2b747276c0f339173bf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/icst307.h
+ *  arch/arm/include/asm/hardware/icst307.h
  *
  *  Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
  *
similarity index 96%
rename from include/asm-arm/hardware/icst525.h
rename to arch/arm/include/asm/hardware/icst525.h
index edd5a5704406cc16bd11c8c0087d9dc8a04a6951..58f0dc43e2edb82bbed9a193bfe370db8f2a544a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/icst525.h
+ *  arch/arm/include/asm/hardware/icst525.h
  *
  *  Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
  *
similarity index 97%
rename from include/asm-arm/hardware/ioc.h
rename to arch/arm/include/asm/hardware/ioc.h
index b3b46ef659432e3b11e46c567398146ed5bf9bc6..1f6b8013becb4c58618790983d9a93f721112c9c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/ioc.h
+ *  arch/arm/include/asm/hardware/ioc.h
  *
  *  Copyright (C) Russell King
  *
similarity index 99%
rename from include/asm-arm/hardware/iomd.h
rename to arch/arm/include/asm/hardware/iomd.h
index 396e55ad06c6afe41fb754b548d257ca04c0c1a7..9c5afbd71a69a4bbdaf6e8d8c806e07f3f199db1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/iomd.h
+ *  arch/arm/include/asm/hardware/iomd.h
  *
  *  Copyright (C) 1999 Russell King
  *
similarity index 97%
rename from include/asm-arm/hardware/iop3xx-gpio.h
rename to arch/arm/include/asm/hardware/iop3xx-gpio.h
index 0c9331f9ac2464b5560cb024efa3e09a8198b0c8..222e74b7c4639f10a0dfaefe9be199e7b02ab0f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/hardware/iop3xx-gpio.h
+ * arch/arm/include/asm/hardware/iop3xx-gpio.h
  *
  * IOP3xx GPIO wrappers
  *
similarity index 99%
rename from include/asm-arm/hardware/iop3xx.h
rename to arch/arm/include/asm/hardware/iop3xx.h
index 18f6937f50103d1ec60d04412c67613b2b739eae..4b8e7f559929970b739af0f080b67a6c16247602 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * include/asm-arm/hardware/iop3xx.h
+ * arch/arm/include/asm/hardware/iop3xx.h
  *
  * Intel IOP32X and IOP33X register definitions
  *
similarity index 99%
rename from include/asm-arm/hardware/locomo.h
rename to arch/arm/include/asm/hardware/locomo.h
index fb0645de6f3158b72c6685514ac181240de8230e..954b1be991b4a19a9e7001c2996b4821cf50752b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/hardware/locomo.h
+ * arch/arm/include/asm/hardware/locomo.h
  *
  * This file contains the definitions for the LoCoMo G/A Chip
  *
similarity index 93%
rename from include/asm-arm/hardware/memc.h
rename to arch/arm/include/asm/hardware/memc.h
index 8aef5aa0e01bddb81f715ab92d584d9494f92b28..42ba7c167d1fb62bfcb7f778e406d97f12b536cc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/memc.h
+ *  arch/arm/include/asm/hardware/memc.h
  *
  *  Copyright (C) Russell King.
  *
similarity index 99%
rename from include/asm-arm/hardware/pci_v3.h
rename to arch/arm/include/asm/hardware/pci_v3.h
index 4d497bdb9a9796b6efb6a7fa50bca889374fcff0..2811c7e2cfdf1c67ea172031ecb8b21d148203ad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/pci_v3.h
+ *  arch/arm/include/asm/hardware/pci_v3.h
  *
  *  Internal header file PCI V3 chip
  *
similarity index 99%
rename from include/asm-arm/hardware/sa1111.h
rename to arch/arm/include/asm/hardware/sa1111.h
index 61b1d05c7df74772f95cd581cd06c05ee81cbdf8..6cf98d4f7dc3ee6bd913419c8f06f083891191b0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/hardware/sa1111.h
+ * arch/arm/include/asm/hardware/sa1111.h
  *
  * Copyright (C) 2000 John G Dorsey <john+@cs.cmu.edu>
  *
similarity index 97%
rename from include/asm-arm/hardware/vic.h
rename to arch/arm/include/asm/hardware/vic.h
index ed9ca3736a0be3c02630a29f5f00490731402907..263f2c362a306166e92812963b42c10992d79fb1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/hardware/vic.h
+ *  arch/arm/include/asm/hardware/vic.h
  *
  *  Copyright (c) ARM Limited 2003.  All rights reserved.
  *
similarity index 93%
rename from include/asm-arm/ide.h
rename to arch/arm/include/asm/ide.h
index a48019f99d08acd160a2dd098c960dc4c5cdac2a..b507ce8e5019af2b879f0a38005d71f235898b9f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/ide.h
+ *  arch/arm/include/asm/ide.h
  *
  *  Copyright (C) 1994-1996  Linus Torvalds & authors
  */
similarity index 99%
rename from include/asm-arm/io.h
rename to arch/arm/include/asm/io.h
index eebe56e74d6d9f4ca922ebf7c1ad667a2c66d879..ffe07c0f46d8d4019d5f48054d99e94827a7fdee 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/io.h
+ *  arch/arm/include/asm/io.h
  *
  *  Copyright (C) 1996-2000 Russell King
  *
similarity index 98%
rename from include/asm-arm/kprobes.h
rename to arch/arm/include/asm/kprobes.h
index b1a37876942deb793252e35f7b826f77fec0d9a1..a5d0d99ad38705b42e24735e5835de9c33663746 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * include/asm-arm/kprobes.h
+ * arch/arm/include/asm/kprobes.h
  *
  * Copyright (C) 2006, 2007 Motorola Inc.
  *
similarity index 96%
rename from include/asm-arm/leds.h
rename to arch/arm/include/asm/leds.h
index 12290ea55801c101341e0707c233bf9fb4e082ab..c545739f39b7e5761b7611431fd9db55183a5841 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/leds.h
+ *  arch/arm/include/asm/leds.h
  *
  *  Copyright (C) 1998 Russell King
  *
similarity index 99%
rename from include/asm-arm/locks.h
rename to arch/arm/include/asm/locks.h
index 852220eecdbc5d3147528bd6853f2a039ae91543..ef4c897772d1459f589ac2a1967a742e822cad2a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/locks.h
+ *  arch/arm/include/asm/locks.h
  *
  *  Copyright (C) 2000 Russell King
  *
similarity index 97%
rename from include/asm-arm/mach/arch.h
rename to arch/arm/include/asm/mach/arch.h
index bcc8aed7c9a9a994baff55d06d3c639105b31978..c59842dc7cb8d8f2b3a3e140d3a17d8da575efe0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mach/arch.h
+ *  arch/arm/include/asm/mach/arch.h
  *
  *  Copyright (C) 2000 Russell King
  *
similarity index 97%
rename from include/asm-arm/mach/dma.h
rename to arch/arm/include/asm/mach/dma.h
index e7c4a20aad531c72de46e36c296aa9fd24d8edb9..fc7278ea7146798d50c0dfb219bae5db025fefab 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mach/dma.h
+ *  arch/arm/include/asm/mach/dma.h
  *
  *  Copyright (C) 1998-2000 Russell King
  *
similarity index 96%
rename from include/asm-arm/mach/flash.h
rename to arch/arm/include/asm/mach/flash.h
index 05b029ef6371c6203b1471897490bebce8920815..4ca69fe2c850c0a995574ffe250444d8062d8d95 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mach/flash.h
+ *  arch/arm/include/asm/mach/flash.h
  *
  *  Copyright (C) 2003 Russell King, All Rights Reserved.
  *
similarity index 93%
rename from include/asm-arm/mach/irda.h
rename to arch/arm/include/asm/mach/irda.h
index 58984d9c0b0b34a121246ae22793186696078cbe..38f77b5e56cfc6dae2d4dbb92f87f66805cfb0c2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mach/irda.h
+ *  arch/arm/include/asm/mach/irda.h
  *
  *  Copyright (C) 2004 Russell King.
  *
similarity index 96%
rename from include/asm-arm/mach/irq.h
rename to arch/arm/include/asm/mach/irq.h
index eb0bfba6570d6ae294fa50adf0a349527ba2ad86..c57b52ce574aadff6728eefebfcb5d2499dba3cc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mach/irq.h
+ *  arch/arm/include/asm/mach/irq.h
  *
  *  Copyright (C) 1995-2000 Russell King.
  *
similarity index 96%
rename from include/asm-arm/mach/map.h
rename to arch/arm/include/asm/mach/map.h
index 7ef3c83901806b4abadd0b748568028fcf1470a5..06f583b13999c220ba835658c657460ccb1a5783 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/map.h
+ *  arch/arm/include/asm/map.h
  *
  *  Copyright (C) 1999-2000 Russell King
  *
similarity index 88%
rename from include/asm-arm/mach/mmc.h
rename to arch/arm/include/asm/mach/mmc.h
index eb91145c00c4c7d5d0b2c99aab10640a8080e89d..4da332b03144c4d27bf07876506f2c94f72adb0b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mach/mmc.h
+ *  arch/arm/include/asm/mach/mmc.h
  */
 #ifndef ASMARM_MACH_MMC_H
 #define ASMARM_MACH_MMC_H
similarity index 98%
rename from include/asm-arm/mach/pci.h
rename to arch/arm/include/asm/mach/pci.h
index 9d4f6b5ea4190645129497cdc0af908917fafbe0..32da1ae17e066f94bc65c6368ddcdb9dc83b6ef7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mach/pci.h
+ *  arch/arm/include/asm/mach/pci.h
  *
  *  Copyright (C) 2000 Russell King
  *
similarity index 94%
rename from include/asm-arm/mach/serial_at91.h
rename to arch/arm/include/asm/mach/serial_at91.h
index 55b317a89061b58ca673b0fe080ed3a361aecf69..ea6d063923b8f0b3d1b16a8c79b5aeb094d92cc7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mach/serial_at91.h
+ *  arch/arm/include/asm/mach/serial_at91.h
  *
  *  Based on serial_sa1100.h  by Nicolas Pitre
  *
similarity index 86%
rename from include/asm-arm/mach/serial_sa1100.h
rename to arch/arm/include/asm/mach/serial_sa1100.h
index 20c22bb218d92493240fae963cd0816d67d514a4..d09064bf95a0d465a578c821c55fb9a57f24e01b 100644 (file)
@@ -1,9 +1,9 @@
 /*
- *  linux/include/asm-arm/mach/serial_sa1100.h
+ *  arch/arm/include/asm/mach/serial_sa1100.h
  *
  *  Author: Nicolas Pitre
  *
- * Moved to include/asm-arm/mach and changed lots, Russell King
+ * Moved and changed lots, Russell King
  *
  * Low level machine dependent UART functions.
  */
similarity index 97%
rename from include/asm-arm/mach/time.h
rename to arch/arm/include/asm/mach/time.h
index 2fd36ea0130df8f687f4437c25086cb6f1b15209..b2cc1fcd040059f2381c8491dfe0d94568615372 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/mach/time.h
+ * arch/arm/include/asm/mach/time.h
  *
  * Copyright (C) 2004 MontaVista Software, Inc.
  *
similarity index 95%
rename from include/asm-arm/mach/udc_pxa2xx.h
rename to arch/arm/include/asm/mach/udc_pxa2xx.h
index 9e5ed7c0f27fb50150f84a303b61a205eb881bc2..270902c353fde579c62f9fd53e83d8cc28ddbefa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/mach/udc_pxa2xx.h
+ * arch/arm/include/asm/mach/udc_pxa2xx.h
  *
  * This supports machine-specific differences in how the PXA2xx
  * USB Device Controller (UDC) is wired.
similarity index 99%
rename from include/asm-arm/memory.h
rename to arch/arm/include/asm/memory.h
index 9ba4d7136e6b2dfeaf714df43f35be6c616da9ba..92069221dca9ba5f59b34b1ad2c06a72c77e6286 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/memory.h
+ *  arch/arm/include/asm/memory.h
  *
  *  Copyright (C) 2000-2002 Russell King
  *  modification for nommu, Hyok S. Choi, 2004
similarity index 98%
rename from include/asm-arm/mmu_context.h
rename to arch/arm/include/asm/mmu_context.h
index 91b9dfdfed526235131bc4b026039064be28f9d7..a301e446007f541826a33d6f45d330f365222bec 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mmu_context.h
+ *  arch/arm/include/asm/mmu_context.h
  *
  *  Copyright (C) 1996 Russell King.
  *
similarity index 94%
rename from include/asm-arm/mmzone.h
rename to arch/arm/include/asm/mmzone.h
index b87de151f0a480ab81189b3ff470eaf19a263219..f2fbb508490160a212be0a1252e5deffeb64aceb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/mmzone.h
+ *  arch/arm/include/asm/mmzone.h
  *
  *  1999-12-29 Nicolas Pitre           Created
  *
similarity index 98%
rename from include/asm-arm/mutex.h
rename to arch/arm/include/asm/mutex.h
index 020bd98710a13ce2e82ff5e0741fa89308172985..93226cf23ae0a838e192be1d675ee886be9dd52e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * include/asm-arm/mutex.h
+ * arch/arm/include/asm/mutex.h
  *
  * ARM optimized mutex locking primitives
  *
similarity index 96%
rename from include/asm-arm/page-nommu.h
rename to arch/arm/include/asm/page-nommu.h
index ea1cde84f500d96e5dd552b63fc8e0736f593ef2..3574c0deb37fc34de5d4dd752e9cf30b2ef6305e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/page-nommu.h
+ *  arch/arm/include/asm/page-nommu.h
  *
  *  Copyright (C) 2004 Hyok S. Choi
  *
similarity index 99%
rename from include/asm-arm/page.h
rename to arch/arm/include/asm/page.h
index 7c5fc5582e5dde1cdadbc9d3758a205f7aa5cd61..cf2e2680daaa1c03ede70035d4497414f917d88a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/page.h
+ *  arch/arm/include/asm/page.h
  *
  *  Copyright (C) 1995-2003 Russell King
  *
similarity index 95%
rename from include/asm-arm/param.h
rename to arch/arm/include/asm/param.h
index 15806468ba72801a38320c3a131f7842b10045fa..8b24bf94c06baac0e054c88c402e1ac01eed4bb1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/param.h
+ *  arch/arm/include/asm/param.h
  *
  *  Copyright (C) 1995-1999 Russell King
  *
similarity index 86%
rename from include/asm-arm/parport.h
rename to arch/arm/include/asm/parport.h
index f2f90c76ddd1e63aac096f76b4c7cd2be2baace7..26e94b09035a77bcdaf49405b9e83607b7af8704 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/parport.h: ARM-specific parport initialisation
+ *  arch/arm/include/asm/parport.h: ARM-specific parport initialisation
  *
  *  Copyright (C) 1999, 2000  Tim Waugh <tim@cyberelk.demon.co.uk>
  *
similarity index 98%
rename from include/asm-arm/pgalloc.h
rename to arch/arm/include/asm/pgalloc.h
index 163b0305dd76b3e83176f294eb204d3a389bd3ad..3dcd64bf18241498e91951b82d56c3c6445b76c8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/pgalloc.h
+ *  arch/arm/include/asm/pgalloc.h
  *
  *  Copyright (C) 2000-2001 Russell King
  *
similarity index 98%
rename from include/asm-arm/pgtable-hwdef.h
rename to arch/arm/include/asm/pgtable-hwdef.h
index f3b5120c99fef34b598dd110790cc008eb815f7e..fd1521d5cb9dd97e07e8f5a54b7994295294a7d3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/pgtable-hwdef.h
+ *  arch/arm/include/asm/pgtable-hwdef.h
  *
  *  Copyright (C) 1995-2002 Russell King
  *
similarity index 98%
rename from include/asm-arm/pgtable-nommu.h
rename to arch/arm/include/asm/pgtable-nommu.h
index 386fcc10a9730da5fbd2372322a27b040625705e..b011f2e939aa703da1366306bfa75a980d217c37 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/pgtable-nommu.h
+ *  arch/arm/include/asm/pgtable-nommu.h
  *
  *  Copyright (C) 1995-2002 Russell King
  *  Copyright (C) 2004  Hyok S. Choi
similarity index 99%
rename from include/asm-arm/pgtable.h
rename to arch/arm/include/asm/pgtable.h
index 5571c13c3f3bb0af57ba3ea85d7f22bf78fa68d6..8ab060a53ab0a9cb4913de95048e4a1b6fd79028 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/pgtable.h
+ *  arch/arm/include/asm/pgtable.h
  *
  *  Copyright (C) 1995-2002 Russell King
  *
similarity index 98%
rename from include/asm-arm/posix_types.h
rename to arch/arm/include/asm/posix_types.h
index c37379dadcb294f92a88d1c145029f935eed7c78..2446d23bfdbffcfea8dd7e3374ab6a2955ff9ce6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/posix_types.h
+ *  arch/arm/include/asm/posix_types.h
  *
  *  Copyright (C) 1996-1998 Russell King.
  *
similarity index 99%
rename from include/asm-arm/proc-fns.h
rename to arch/arm/include/asm/proc-fns.h
index 75ec760f4c748a0bb9ab5722e552c45b866599b8..db80203b68e0a380ee84dfbab9cc60c279adbfad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/proc-fns.h
+ *  arch/arm/include/asm/proc-fns.h
  *
  *  Copyright (C) 1997-1999 Russell King
  *  Copyright (C) 2000 Deep Blue Solutions Ltd
similarity index 98%
rename from include/asm-arm/processor.h
rename to arch/arm/include/asm/processor.h
index bd8029e8dc67fd19cc6ed02f5f62f0debb074dd1..b01d5e7e3d5abb4a5632c1b677764310c81db243 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/processor.h
+ *  arch/arm/include/asm/processor.h
  *
  *  Copyright (C) 1995-1999 Russell King
  *
similarity index 97%
rename from include/asm-arm/procinfo.h
rename to arch/arm/include/asm/procinfo.h
index 4d3c685075e08d9c1db94897cf4ab9ba1933681f..ca52e584ef74fd432614a5d9a2e9dc6188caa9f2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/procinfo.h
+ *  arch/arm/include/asm/procinfo.h
  *
  *  Copyright (C) 1996-1999 Russell King
  *
similarity index 99%
rename from include/asm-arm/ptrace.h
rename to arch/arm/include/asm/ptrace.h
index 8382b7510f942de6b7d4db7a6e459e9576d64b36..b415c0e85458952899b2ba910aeccfd053952584 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/ptrace.h
+ *  arch/arm/include/asm/ptrace.h
  *
  *  Copyright (C) 1996-2003 Russell King
  *
similarity index 91%
rename from include/asm-arm/serial.h
rename to arch/arm/include/asm/serial.h
index 015b262dc14572cfd743d37a514a45e2152de5d0..ebb049091e26033502dec932ab9015486c713894 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/serial.h
+ *  arch/arm/include/asm/serial.h
  *
  *  Copyright (C) 1996 Russell King.
  *
similarity index 97%
rename from include/asm-arm/smp.h
rename to arch/arm/include/asm/smp.h
index 7fffa2404b8e8c8b24d360148d3c164af7169111..cc12a525a06a337e61d1448d23968111230e11d5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/smp.h
+ *  arch/arm/include/asm/smp.h
  *
  *  Copyright (C) 2004-2005 ARM Ltd.
  *
@@ -17,7 +17,7 @@
 #include <asm/arch/smp.h>
 
 #ifndef CONFIG_SMP
-# error "<asm-arm/smp.h> included in non-SMP build"
+# error "<asm/smp.h> included in non-SMP build"
 #endif
 
 #define raw_smp_processor_id() (current_thread_info()->cpu)
similarity index 88%
rename from include/asm-arm/therm.h
rename to arch/arm/include/asm/therm.h
index e51c923ecdf3119d5a4677fa13570f744b77be0a..f002f0197d78a7d6eecf2a9272c743334aefd3bd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/therm.h: Definitions for Dallas Semiconductor
+ * arch/arm/include/asm/therm.h: Definitions for Dallas Semiconductor
  *  DS1620 thermometer driver (as used in the Rebel.com NetWinder)
  */
 #ifndef __ASM_THERM_H
similarity index 97%
rename from include/asm-arm/thread_info.h
rename to arch/arm/include/asm/thread_info.h
index d4be2d64616087a4ebf3bf2427d399314c6584b3..e56fa48e4ae7843436021e19fb067233c67e6a02 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/thread_info.h
+ *  arch/arm/include/asm/thread_info.h
  *
  *  Copyright (C) 2002 Russell King.
  *
@@ -117,7 +117,7 @@ extern void iwmmxt_task_switch(struct thread_info *);
 
 /*
  * We use bit 30 of the preempt_count to indicate that kernel
- * preemption is occurring.  See include/asm-arm/hardirq.h.
+ * preemption is occurring.  See <asm/hardirq.h>.
  */
 #define PREEMPT_ACTIVE 0x40000000
 
similarity index 96%
rename from include/asm-arm/thread_notify.h
rename to arch/arm/include/asm/thread_notify.h
index 8866e52168400847d669cea1529d4a174e1e7959..f27379d7f72a670b01e2e70b2b09b97cc9c98862 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/thread_notify.h
+ *  arch/arm/include/asm/thread_notify.h
  *
  *  Copyright (C) 2006 Russell King.
  *
similarity index 93%
rename from include/asm-arm/timex.h
rename to arch/arm/include/asm/timex.h
index 7b8d4cb24be0bc6353615b6d407d7a242b3da860..e50e2926cd6ecce6ad0b038aa8ff2f56d25f937f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/timex.h
+ *  arch/arm/include/asm/timex.h
  *
  *  Copyright (C) 1997,1998 Russell King
  *
similarity index 98%
rename from include/asm-arm/tlb.h
rename to arch/arm/include/asm/tlb.h
index 36bd402a21cb12ad52ffd610e740fc83b265efde..857f1dfac794c5bc5ef63a01b840f3444d0c2888 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/tlb.h
+ *  arch/arm/include/asm/tlb.h
  *
  *  Copyright (C) 2002 Russell King
  *
similarity index 99%
rename from include/asm-arm/tlbflush.h
rename to arch/arm/include/asm/tlbflush.h
index 909656c747ef380beddbaeba34724a862cd7f97b..0d0d40f1b599eccff4c709f1bbd2a412f08812bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/tlbflush.h
+ *  arch/arm/include/asm/tlbflush.h
  *
  *  Copyright (C) 1999-2003 Russell King
  *
similarity index 99%
rename from include/asm-arm/uaccess.h
rename to arch/arm/include/asm/uaccess.h
index 4c1a3fa9f2596cac7243e7d932252deb56817c0f..d0f51ff900b5d029e278b9b9480c6b90cd6226b7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/uaccess.h
+ *  arch/arm/include/asm/uaccess.h
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
similarity index 99%
rename from include/asm-arm/unistd.h
rename to arch/arm/include/asm/unistd.h
index 7c570082b1e0c6850471a3cfaf182f1dad28f88b..f95fbb2fcb5ffc2a59e1b032b89f50534be8971a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/unistd.h
+ *  arch/arm/include/asm/unistd.h
  *
  *  Copyright (C) 2001-2005 Russell King
  *
similarity index 98%
rename from include/asm-arm/vfp.h
rename to arch/arm/include/asm/vfp.h
index 5f9a2cb3d452fb4d1e42a1d43dc95439286f5e8c..f4ab34fd4f72cc70ce0ece49eef7187f97e33763 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/vfp.h
+ * arch/arm/include/asm/vfp.h
  *
  * VFP register definitions.
  * First, the standard VFP set.
similarity index 97%
rename from include/asm-arm/vfpmacros.h
rename to arch/arm/include/asm/vfpmacros.h
index cccb3892e73c0c24a097f264f0dfd24dc7186771..422f3cc204a27310f99d9b25adebb9f49d16e3d0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/include/asm-arm/vfpmacros.h
+ * arch/arm/include/asm/vfpmacros.h
  *
  * Assembler-only file containing VFP macros and register definitions.
  */
similarity index 99%
rename from include/asm-arm/xor.h
rename to arch/arm/include/asm/xor.h
index e7c4cf58bed1a88b55541b3e266c70f5c236fff0..7604673dc4278609b4f7ba68985d8b996b49ec47 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/include/asm-arm/xor.h
+ *  arch/arm/include/asm/xor.h
  *
  *  Copyright (C) 2001 Russell King
  *
index 7e9c00a8a4127ee35dad9507b109f13f319f23a3..1c3c6ea5f9e7e3bb7b7ce5a880a039489200d200 100644 (file)
@@ -181,7 +181,7 @@ ENTRY(lookup_processor_type)
        ldmfd   sp!, {r4 - r7, r9, pc}
 
 /*
- * Look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.[ch] for
+ * Look in <asm/procinfo.h> and arch/arm/kernel/arch.[ch] for
  * more information about the __proc_info and __arch_info structures.
  */
        .long   __proc_info_begin
index 1dd8ea4f9a9c5f7b13e91e2a4c87948803d539f1..2034d4dbe6ad3a3cddf20c8e9f75516021e93c92 100644 (file)
@@ -20,7 +20,7 @@
  *             r2, r3 contains the zero-extended value
  *             lr corrupted
  *
- * No other registers must be altered.  (see include/asm-arm/uaccess.h
+ * No other registers must be altered.  (see <asm/uaccess.h>
  * for specific ASM register usage).
  *
  * Note that ADDR_LIMIT is either 0 or 0xc0000000.
index 8620afe54f720da93ad062ff02df7a9e96743068..08ec7dffa52e44cf5d15b720891b0717547ad7f7 100644 (file)
@@ -20,7 +20,7 @@
  * Outputs:    r0 is the error code
  *             lr corrupted
  *
- * No other registers must be altered.  (see include/asm-arm/uaccess.h
+ * No other registers must be altered.  (see <asm/uaccess.h>
  * for specific ASM register usage).
  *
  * Note that ADDR_LIMIT is either 0 or 0xc0000000
index 6a90fe5578df90cb0992d56c2b334e638278aa49..8915a5fc63cdcc81e8c8b2213d2d2497c1be2001 100644 (file)
@@ -172,24 +172,29 @@ found:
 
        return clk;
 }
+EXPORT_SYMBOL(clk_get);
 
 void clk_put(struct clk *clk)
 {
 }
+EXPORT_SYMBOL(clk_put);
 
 int clk_enable(struct clk *clk)
 {
        return 0;
 }
+EXPORT_SYMBOL(clk_enable);
 
 void clk_disable(struct clk *clk)
 {
 }
+EXPORT_SYMBOL(clk_disable);
 
 unsigned long clk_get_rate(struct clk *clk)
 {
        return clk->get_rate();
 }
+EXPORT_SYMBOL(clk_get_rate);
 
 int imx_clocks_init(void)
 {
index 98ddd8a6d05fb1a6b6da716abff67b11036f39d4..c40650dcddf5b30a71a55d0ba1f72b9d8c6f0d0a 100644 (file)
@@ -251,7 +251,6 @@ void __init set_imx_fb_info(struct imxfb_mach_info *hard_imx_fb_info)
 {
        memcpy(&imx_fb_info,hard_imx_fb_info,sizeof(struct imxfb_mach_info));
 }
-EXPORT_SYMBOL(set_imx_fb_info);
 
 static struct resource imxfb_resources[] = {
        [0] = {
index 9635d5812bcdffcaeae078e4288b6672570e4444..baeff24ff02da1abbd5d4be8a88c4751906fd547 100644 (file)
@@ -125,7 +125,7 @@ static struct platform_device *devices[] __initdata = {
        &imx_uart2_device,
 };
 
-#ifdef CONFIG_MMC_IMX
+#if defined(CONFIG_MMC_IMX) || defined(CONFIG_MMC_IMX_MODULE)
 static int mx1ads_mmc_card_present(struct device *dev)
 {
        /* MMC/SD Card Detect is PB 20 on MX1ADS V1.0.7 */
@@ -143,7 +143,7 @@ mx1ads_init(void)
 #ifdef CONFIG_LEDS
        imx_gpio_mode(GPIO_PORTA | GPIO_OUT | 2);
 #endif
-#ifdef CONFIG_MMC_IMX
+#if defined(CONFIG_MMC_IMX) || defined(CONFIG_MMC_IMX_MODULE)
        /* SD/MMC card detect */
        imx_gpio_mode(GPIO_PORTB | GPIO_GIUS | GPIO_IN | 20);
        imx_set_mmc_info(&mx1ads_mmc_info);
index a494b71c0195b32198e5f3497e6dac9c6cc6b2ee..46b4f5a2e7f45b7c60424cba289b0f5469a875f5 100644 (file)
 #include <asm/mach/map.h>
 #include <asm/gpio.h>
 
-#include <asm/arch-ns9xxx/board.h>
-#include <asm/arch-ns9xxx/processor-ns9360.h>
-#include <asm/arch-ns9xxx/regs-sys-ns9360.h>
-#include <asm/arch-ns9xxx/regs-mem.h>
-#include <asm/arch-ns9xxx/regs-bbu.h>
-#include <asm/arch-ns9xxx/regs-board-a9m9750dev.h>
+#include <asm/arch/board.h>
+#include <asm/arch/processor-ns9360.h>
+#include <asm/arch/regs-sys-ns9360.h>
+#include <asm/arch/regs-mem.h>
+#include <asm/arch/regs-bbu.h>
+#include <asm/arch/regs-board-a9m9750dev.h>
 
 #include "board-a9m9750dev.h"
 
index cabfb879dda973678239b6731da30a56d9b9b4cb..7bc05a4b45b89f0aa1b6e461d0b3ba16ad0c63cb 100644 (file)
@@ -14,8 +14,8 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 
-#include <asm/arch-ns9xxx/regs-bbu.h>
-#include <asm/arch-ns9xxx/processor-ns9360.h>
+#include <asm/arch/regs-bbu.h>
+#include <asm/arch/processor-ns9360.h>
 
 #include "gpio-ns9360.h"
 
index b3c963b0c8f5414bb9713d6897a8040da3736703..ed4c83389d4afd3e0e9e8853e4d6541326fcb2b7 100644 (file)
@@ -13,9 +13,9 @@
 #include <linux/spinlock.h>
 #include <linux/module.h>
 
-#include <asm/arch-ns9xxx/gpio.h>
-#include <asm/arch-ns9xxx/processor.h>
-#include <asm/arch-ns9xxx/processor-ns9360.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/processor.h>
+#include <asm/arch/processor-ns9360.h>
 #include <asm/bug.h>
 #include <asm/types.h>
 #include <asm/bitops.h>
index ca85d24cf39f1f11553c2ac856d08b71bb9a9ff9..d2964257797e7e8aa65e7b18df82210ed8aefbe2 100644 (file)
@@ -13,9 +13,9 @@
 #include <asm/io.h>
 #include <asm/mach/irq.h>
 #include <asm/mach-types.h>
-#include <asm/arch-ns9xxx/regs-sys-common.h>
-#include <asm/arch-ns9xxx/irqs.h>
-#include <asm/arch-ns9xxx/board.h>
+#include <asm/arch/regs-sys-common.h>
+#include <asm/arch/irqs.h>
+#include <asm/arch/board.h>
 
 #include "generic.h"
 
index 9623fff6b3bcc48f93375572402a9b16339af8d0..7714233fb0048f7beec9a9ead2af0ead613fba9c 100644 (file)
@@ -11,7 +11,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach-types.h>
 
-#include <asm/arch-ns9xxx/processor-ns9360.h>
+#include <asm/arch/processor-ns9360.h>
 
 #include "board-a9m9750dev.h"
 #include "generic.h"
index fcc815bdd291d8666e770925c074ae0d63491660..bdbd0bb1a0b33ebd369a1fde2a9375bb56940963 100644 (file)
@@ -11,7 +11,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach-types.h>
 
-#include <asm/arch-ns9xxx/processor-ns9360.h>
+#include <asm/arch/processor-ns9360.h>
 
 #include "board-jscc9p9360.h"
 #include "generic.h"
index 5aa5d9baf8c815774c9c9d3603480499e8ae6619..c9cce9b4e6c96810783faf02f7f9980d4befa35e 100644 (file)
@@ -11,8 +11,8 @@
 #include <linux/platform_device.h>
 #include <linux/serial_8250.h>
 
-#include <asm/arch-ns9xxx/regs-board-a9m9750dev.h>
-#include <asm/arch-ns9xxx/board.h>
+#include <asm/arch/regs-board-a9m9750dev.h>
+#include <asm/arch/board.h>
 
 #define DRIVER_NAME "serial8250"
 
index 2bee0b7fccbbd8cd9ed7a8d37ed59fde8398ea81..8ee81b59b35d3a2464ec95e1306200a9328ba90d 100644 (file)
@@ -14,8 +14,8 @@
 
 #include <asm/page.h>
 #include <asm/mach/map.h>
-#include <asm/arch-ns9xxx/processor-ns9360.h>
-#include <asm/arch-ns9xxx/regs-sys-ns9360.h>
+#include <asm/arch/processor-ns9360.h>
+#include <asm/arch/regs-sys-ns9360.h>
 
 void ns9360_reset(char mode)
 {
index 4d573c9793edcb940f17de5f3d3c519bad996434..66bd58262974f5f376341546d7bfbe27d66e50d6 100644 (file)
@@ -15,9 +15,9 @@
 #include <linux/clocksource.h>
 #include <linux/clockchips.h>
 
-#include <asm/arch-ns9xxx/processor-ns9360.h>
-#include <asm/arch-ns9xxx/regs-sys-ns9360.h>
-#include <asm/arch-ns9xxx/irqs.h>
+#include <asm/arch/processor-ns9360.h>
+#include <asm/arch/regs-sys-ns9360.h>
+#include <asm/arch/irqs.h>
 #include <asm/arch/system.h>
 #include "generic.h"
 
index 30023b00e476161a691aa8a5603c1a0b08fa534d..90056d56b2104dfc0b7f76f1776948a564e1b179 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <linux/irq.h>
 #include <linux/platform_device.h>
-#include <linux/ide.h>
 #include <linux/i2c.h>
 #include <linux/pwm_backlight.h>
 
index 3a6c8ec34cd96b29f3b585331ecf4a8cdf8dd3eb..ed15f876c7254cd02ea86d53b5346cfa4efc67d0 100644 (file)
@@ -187,7 +187,7 @@ config CPU_ARM926T
                ARCH_AT91SAM9260 || ARCH_AT91SAM9261 || \
                ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || \
                ARCH_AT91SAM9G20 || ARCH_AT91CAP9 || \
-               ARCH_NS9XXX || ARCH_DAVINCI
+               ARCH_NS9XXX || ARCH_DAVINCI || ARCH_MX2
        default y if ARCH_VERSATILE_PB || MACH_VERSATILE_AB || \
                ARCH_OMAP730 || ARCH_OMAP16XX || \
                ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || \
@@ -742,3 +742,11 @@ config CACHE_L2X0
        select OUTER_CACHE
        help
          This option enables the L2x0 PrimeCell.
+
+config CACHE_XSC3L2
+       bool "Enable the L2 cache on XScale3"
+       depends on CPU_XSC3
+       default y
+       select OUTER_CACHE
+       help
+         This option enables the L2 cache on XScale3.
diff --git a/arch/arm/mm/cache-xsc3l2.c b/arch/arm/mm/cache-xsc3l2.c
new file mode 100644 (file)
index 0000000..158bd96
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * arch/arm/mm/cache-xsc3l2.c - XScale3 L2 cache controller support
+ *
+ * Copyright (C) 2007 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <linux/init.h>
+#include <linux/spinlock.h>
+
+#include <asm/system.h>
+#include <asm/cacheflush.h>
+#include <asm/io.h>
+
+#define CR_L2  (1 << 26)
+
+#define CACHE_LINE_SIZE                32
+#define CACHE_LINE_SHIFT       5
+#define CACHE_WAY_PER_SET      8
+
+#define CACHE_WAY_SIZE(l2ctype)        (8192 << (((l2ctype) >> 8) & 0xf))
+#define CACHE_SET_SIZE(l2ctype)        (CACHE_WAY_SIZE(l2ctype) >> CACHE_LINE_SHIFT)
+
+static inline int xsc3_l2_present(void)
+{
+       unsigned long l2ctype;
+
+       __asm__("mrc p15, 1, %0, c0, c0, 1" : "=r" (l2ctype));
+
+       return !!(l2ctype & 0xf8);
+}
+
+static inline void xsc3_l2_clean_mva(unsigned long addr)
+{
+       __asm__("mcr p15, 1, %0, c7, c11, 1" : : "r" (addr));
+}
+
+static inline void xsc3_l2_clean_pa(unsigned long addr)
+{
+       xsc3_l2_clean_mva(__phys_to_virt(addr));
+}
+
+static inline void xsc3_l2_inv_mva(unsigned long addr)
+{
+       __asm__("mcr p15, 1, %0, c7, c7, 1" : : "r" (addr));
+}
+
+static inline void xsc3_l2_inv_pa(unsigned long addr)
+{
+       xsc3_l2_inv_mva(__phys_to_virt(addr));
+}
+
+static inline void xsc3_l2_inv_all(void)
+{
+       unsigned long l2ctype, set_way;
+       int set, way;
+
+       __asm__("mrc p15, 1, %0, c0, c0, 1" : "=r" (l2ctype));
+
+       for (set = 0; set < CACHE_SET_SIZE(l2ctype); set++) {
+               for (way = 0; way < CACHE_WAY_PER_SET; way++) {
+                       set_way = (way << 29) | (set << 5);
+                       __asm__("mcr p15, 1, %0, c7, c11, 2" : : "r"(set_way));
+               }
+       }
+
+       dsb();
+}
+
+static void xsc3_l2_inv_range(unsigned long start, unsigned long end)
+{
+       if (start == 0 && end == -1ul) {
+               xsc3_l2_inv_all();
+               return;
+       }
+
+       /*
+        * Clean and invalidate partial first cache line.
+        */
+       if (start & (CACHE_LINE_SIZE - 1)) {
+               xsc3_l2_clean_pa(start & ~(CACHE_LINE_SIZE - 1));
+               xsc3_l2_inv_pa(start & ~(CACHE_LINE_SIZE - 1));
+               start = (start | (CACHE_LINE_SIZE - 1)) + 1;
+       }
+
+       /*
+        * Clean and invalidate partial last cache line.
+        */
+       if (end & (CACHE_LINE_SIZE - 1)) {
+               xsc3_l2_clean_pa(end & ~(CACHE_LINE_SIZE - 1));
+               xsc3_l2_inv_pa(end & ~(CACHE_LINE_SIZE - 1));
+               end &= ~(CACHE_LINE_SIZE - 1);
+       }
+
+       /*
+        * Invalidate all full cache lines between 'start' and 'end'.
+        */
+       while (start != end) {
+               xsc3_l2_inv_pa(start);
+               start += CACHE_LINE_SIZE;
+       }
+
+       dsb();
+}
+
+static void xsc3_l2_clean_range(unsigned long start, unsigned long end)
+{
+       start &= ~(CACHE_LINE_SIZE - 1);
+       while (start < end) {
+               xsc3_l2_clean_pa(start);
+               start += CACHE_LINE_SIZE;
+       }
+
+       dsb();
+}
+
+/*
+ * optimize L2 flush all operation by set/way format
+ */
+static inline void xsc3_l2_flush_all(void)
+{
+       unsigned long l2ctype, set_way;
+       int set, way;
+
+       __asm__("mrc p15, 1, %0, c0, c0, 1" : "=r" (l2ctype));
+
+       for (set = 0; set < CACHE_SET_SIZE(l2ctype); set++) {
+               for (way = 0; way < CACHE_WAY_PER_SET; way++) {
+                       set_way = (way << 29) | (set << 5);
+                       __asm__("mcr p15, 1, %0, c7, c15, 2" : : "r"(set_way));
+               }
+       }
+
+       dsb();
+}
+
+static void xsc3_l2_flush_range(unsigned long start, unsigned long end)
+{
+       if (start == 0 && end == -1ul) {
+               xsc3_l2_flush_all();
+               return;
+       }
+
+       start &= ~(CACHE_LINE_SIZE - 1);
+       while (start < end) {
+               xsc3_l2_clean_pa(start);
+               xsc3_l2_inv_pa(start);
+               start += CACHE_LINE_SIZE;
+       }
+
+       dsb();
+}
+
+static int __init xsc3_l2_init(void)
+{
+       if (!cpu_is_xsc3() || !xsc3_l2_present())
+               return 0;
+
+       if (!(get_cr() & CR_L2)) {
+               pr_info("XScale3 L2 cache enabled.\n");
+               adjust_cr(CR_L2, CR_L2);
+               xsc3_l2_inv_all();
+       }
+
+       outer_cache.inv_range = xsc3_l2_inv_range;
+       outer_cache.clean_range = xsc3_l2_clean_range;
+       outer_cache.flush_range = xsc3_l2_flush_range;
+
+       return 0;
+}
+core_initcall(xsc3_l2_init);
index e6352946dde020e04c3461b2f074972592b74710..30a69d67d673ed80f122900223249e94ec6a4890 100644 (file)
@@ -156,9 +156,9 @@ static int __init check_initrd(struct meminfo *mi)
        }
 
        if (initrd_node == -1) {
-               printk(KERN_ERR "initrd (0x%08lx - 0x%08lx) extends beyond "
+               printk(KERN_ERR "INITRD: 0x%08lx+0x%08lx extends beyond "
                       "physical memory - disabling initrd\n",
-                      phys_initrd_start, end);
+                      phys_initrd_start, phys_initrd_size);
                phys_initrd_start = phys_initrd_size = 0;
        }
 #endif
@@ -239,24 +239,32 @@ bootmem_init_node(int node, int initrd_node, struct meminfo *mi)
        reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT,
                             boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT);
 
+       /*
+        * Reserve any special node zero regions.
+        */
+       if (node == 0)
+               reserve_node_zero(pgdat);
+
 #ifdef CONFIG_BLK_DEV_INITRD
        /*
         * If the initrd is in this node, reserve its memory.
         */
        if (node == initrd_node) {
-               reserve_bootmem_node(pgdat, phys_initrd_start,
-                                    phys_initrd_size, BOOTMEM_DEFAULT);
-               initrd_start = __phys_to_virt(phys_initrd_start);
-               initrd_end = initrd_start + phys_initrd_size;
+               int res = reserve_bootmem_node(pgdat, phys_initrd_start,
+                                    phys_initrd_size, BOOTMEM_EXCLUSIVE);
+
+               if (res == 0) {
+                       initrd_start = __phys_to_virt(phys_initrd_start);
+                       initrd_end = initrd_start + phys_initrd_size;
+               } else {
+                       printk(KERN_ERR
+                               "INITRD: 0x%08lx+0x%08lx overlaps in-use "
+                               "memory region - disabling initrd\n",
+                               phys_initrd_start, phys_initrd_size);
+               }
        }
 #endif
 
-       /*
-        * Finally, reserve any node zero regions.
-        */
-       if (node == 0)
-               reserve_node_zero(pgdat);
-
        /*
         * initialise the zones within this node.
         */
index 303a7ff6bfd2eeb3120164d9cc185e0973d600de..b81dbf9ffb77b3f28a9b0ad872341fdad3656ca6 100644 (file)
@@ -259,7 +259,7 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
  * caller shouldn't need to know that small detail.
  *
  * 'flags' are the extra L_PTE_ flags that you want to specify for this
- * mapping.  See include/asm-arm/proc-armv/pgtable.h for more information.
+ * mapping.  See <asm/pgtable.h> for more information.
  */
 void __iomem *
 __arm_ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
index d64f8e6f75ab19f889c4cf93586f66bb64008e37..eda733d30455d18bd97bb565d2df8540cd1eb4a4 100644 (file)
@@ -231,7 +231,7 @@ cpu_arm720_name:
                .align
 
 /*
- * See linux/include/asm-arm/procinfo.h for a definition of this structure.
+ * See <asm/procinfo.h> for a definition of this structure.
  */
        
                .section ".proc.info.init", #alloc, #execinstr
index 3533741a76f6713b8f0229570dd49123d040331b..6ff53c24510f728f1f5ae25374205de4e1223221 100644 (file)
  */
 #define CACHESIZE      32768
 
-/*
- * Run with L2 enabled.
- */
-#define L2_CACHE_ENABLE        1
-
 /*
  * This macro is used to wait for a CP15 write and is needed when we
  * have to ensure that the last operation to the coprocessor was
@@ -265,12 +260,9 @@ ENTRY(xsc3_dma_inv_range)
        tst     r0, #CACHELINESIZE - 1
        bic     r0, r0, #CACHELINESIZE - 1
        mcrne   p15, 0, r0, c7, c10, 1          @ clean L1 D line
-       mcrne   p15, 1, r0, c7, c11, 1          @ clean L2 line
        tst     r1, #CACHELINESIZE - 1
        mcrne   p15, 0, r1, c7, c10, 1          @ clean L1 D line
-       mcrne   p15, 1, r1, c7, c11, 1          @ clean L2 line
 1:     mcr     p15, 0, r0, c7, c6, 1           @ invalidate L1 D line
-       mcr     p15, 1, r0, c7, c7, 1           @ invalidate L2 line
        add     r0, r0, #CACHELINESIZE
        cmp     r0, r1
        blo     1b
@@ -288,7 +280,6 @@ ENTRY(xsc3_dma_inv_range)
 ENTRY(xsc3_dma_clean_range)
        bic     r0, r0, #CACHELINESIZE - 1
 1:     mcr     p15, 0, r0, c7, c10, 1          @ clean L1 D line
-       mcr     p15, 1, r0, c7, c11, 1          @ clean L2 line
        add     r0, r0, #CACHELINESIZE
        cmp     r0, r1
        blo     1b
@@ -306,8 +297,6 @@ ENTRY(xsc3_dma_clean_range)
 ENTRY(xsc3_dma_flush_range)
        bic     r0, r0, #CACHELINESIZE - 1
 1:     mcr     p15, 0, r0, c7, c14, 1          @ clean/invalidate L1 D line
-       mcr     p15, 1, r0, c7, c11, 1          @ clean L2 line
-       mcr     p15, 1, r0, c7, c7, 1           @ invalidate L2 line
        add     r0, r0, #CACHELINESIZE
        cmp     r0, r1
        blo     1b
@@ -347,9 +336,7 @@ ENTRY(cpu_xsc3_switch_mm)
        mcr     p15, 0, ip, c7, c5, 0           @ invalidate L1 I cache and BTB
        mcr     p15, 0, ip, c7, c10, 4          @ data write barrier
        mcr     p15, 0, ip, c7, c5, 4           @ prefetch flush
-#ifdef L2_CACHE_ENABLE
        orr     r0, r0, #0x18                   @ cache the page table in L2
-#endif
        mcr     p15, 0, r0, c2, c0, 0           @ load page table pointer
        mcr     p15, 0, ip, c8, c7, 0           @ invalidate I and D TLBs
        cpwait_ret lr, ip
@@ -378,12 +365,10 @@ ENTRY(cpu_xsc3_set_pte_ext)
        orreq   r2, r2, #PTE_EXT_AP_UNO_SRW     @ yes -> user n/a, system r/w
                                                @ combined with user -> user r/w
 
-#if L2_CACHE_ENABLE
        @ If it's cacheable, it needs to be in L2 also.
        eor     ip, r1, #L_PTE_CACHEABLE
        tst     ip, #L_PTE_CACHEABLE
        orreq   r2, r2, #PTE_EXT_TEX(0x5)
-#endif
 
        tst     r3, #L_PTE_PRESENT | L_PTE_YOUNG        @ present and young?
        movne   r2, #0                          @ no -> fault
@@ -408,9 +393,7 @@ __xsc3_setup:
        mcr     p15, 0, ip, c7, c10, 4          @ data write barrier
        mcr     p15, 0, ip, c7, c5, 4           @ prefetch flush
        mcr     p15, 0, ip, c8, c7, 0           @ invalidate I and D TLBs
-#if L2_CACHE_ENABLE
        orr     r4, r4, #0x18                   @ cache the page table in L2
-#endif
        mcr     p15, 0, r4, c2, c0, 0           @ load page table pointer
 
        mov     r0, #0                          @ don't allow CP access
@@ -418,9 +401,7 @@ __xsc3_setup:
 
        mrc     p15, 0, r0, c1, c0, 1           @ get auxiliary control reg
        and     r0, r0, #2                      @ preserve bit P bit setting
-#if L2_CACHE_ENABLE
        orr     r0, r0, #(1 << 10)              @ enable L2 for LLR cache
-#endif
        mcr     p15, 0, r0, c1, c0, 1           @ set auxiliary control reg
 
        adr     r5, xsc3_crval
@@ -429,9 +410,6 @@ __xsc3_setup:
        bic     r0, r0, r5                      @ ..V. ..R. .... ..A.
        orr     r0, r0, r6                      @ ..VI Z..S .... .C.M (mmu)
                                                @ ...I Z..S .... .... (uc)
-#if L2_CACHE_ENABLE
-       orr     r0, r0, #0x04000000             @ L2 enable
-#endif
        mov     pc, lr
 
        .size   __xsc3_setup, . - __xsc3_setup
index 4a4d02c09112f06861ba95aef761c31b9e429444..386cbd13eaf422213f929e9aca9a81e0610348a7 100644 (file)
@@ -69,7 +69,7 @@ typedef union tagFPREG {
  * This structure is exported to user space.  Do not re-order.
  * Only add new stuff to the end, and do not change the size of
  * any element.  Elements of this structure are used by user
- * space, and must match struct user_fp in include/asm-arm/user.h.
+ * space, and must match struct user_fp in <asm/user.h>.
  * We include the byte offsets below for documentation purposes.
  *
  * The size of this structure and FPREG are checked by fpmodule.c
index dae9c982aa89907d8d36d96fc491c5921e4f9963..c7b25b0aacffab1a7f6212cf9e83103d2dd8198c 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/mm.h>
 #include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/ide.h>
 
 #include <asm/traps.h>
 #include <asm/bootinfo.h>
index f3b27d04a31fe2d5a2c52e292b49e5031fe125cf..1bdb03c73c0f4d2c70d9e4251eb6b3280ed8ae9f 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/mm.h>
 #include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/ide.h>
 #include <linux/module.h>
 
 #include <asm/bootinfo.h>
index a56c4b804b07c10821a2dfb9aaf5f8b8518e29e7..822a20e21fa4c0ef1659ad0689e430e6bf77fcac 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/types.h>
 #include <linux/initrd.h>
 #include <linux/irq.h>
-#include <linux/ide.h>
 #include <linux/ioport.h>
 #include <linux/param.h>       /* for HZ */
 #include <linux/root_dev.h>
index f60524e8bc44a7d1e74e1a9455749b811ecf3326..b59ba6b93cdd26e24cb9376e2c4a7a4c8ebbe8ff 100644 (file)
@@ -10,7 +10,6 @@
  * Copyright (C) 2007 by Thomas Bogendoerfer
  */
 #include <linux/eisa.h>
-#include <linux/hdreg.h>
 #include <linux/init.h>
 #include <linux/ioport.h>
 #include <linux/sched.h>
@@ -18,7 +17,6 @@
 #include <linux/mm.h>
 #include <linux/console.h>
 #include <linux/fb.h>
-#include <linux/ide.h>
 #include <linux/pm.h>
 #include <linux/screen_info.h>
 #include <linux/platform_device.h>
index 0e4d2f6fa6e8c9f3dcf54d5394e99326eb4bc69a..8fa36893df7af1f5f20bcfc379d88d40a1f61a49 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/fs.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
+#include <linux/bug.h>
 
 #if 0
 #define DEBUGP printk
@@ -195,7 +196,7 @@ int module_finalize(const Elf_Ehdr *hdr,
                    const Elf_Shdr *sechdrs,
                    struct module *me)
 {
-       return 0;
+       return module_bug_finalize(hdr, sechdrs, me);
 }
 
 /*
@@ -203,4 +204,5 @@ int module_finalize(const Elf_Ehdr *hdr,
  */
 void module_arch_cleanup(struct module *mod)
 {
+       module_bug_cleanup(mod);
 }
index 8c8aadbe9563ef14d3671929f2b6c17210e7c354..4ebc52a19f0ab4e9883a3621882744d5f69e0dcc 100644 (file)
@@ -97,7 +97,7 @@ config IRQSTACKS
 
 config VIRQ_DEBUG
        bool "Expose hardware/virtual IRQ mapping via debugfs"
-       depends on DEBUG_FS && PPC_MERGE
+       depends on DEBUG_FS
        help
          This option will show the mapping relationship between hardware irq
          numbers and virtual irq numbers. The mapping is exposed via debugfs
index 666185f594591fbd8e43f853fca1bc83f287e6b8..3b3a1062cb250886e7d056169ab5e343afe14d5d 100644 (file)
                        fsl,has-rstcr;
                };
 
+               wdt@e4000 {
+                       compatible = "fsl,mpc8610-wdt";
+                       reg = <0xe4000 0x100>;
+               };
+
                i2s@16000 {
                        compatible = "fsl,mpc8610-ssi";
                        cell-index = <0>;
index ccaedaec50d59cc6e530c3973939e3e5eb4771fa..7c09f4861fe18b32eba553dc3a72679726142f7b 100644 (file)
@@ -6,7 +6,7 @@
 /*
  * Low-level I/O routines.
  *
- * Copied from <file:include/asm-powerpc/io.h> (which has no copyright)
+ * Copied from <file:arch/powerpc/include/asm/io.h> (which has no copyright)
  */
 static inline int in_8(const volatile unsigned char *addr)
 {
similarity index 94%
rename from include/asm-powerpc/dcr.h
rename to arch/powerpc/include/asm/dcr.h
index 53b283050ab3456fa676efb4c42fa0407cadb155..d13fb68bb5c0e3daf5a965635b548f18bc00a648 100644 (file)
@@ -65,17 +65,13 @@ typedef dcr_host_mmio_t dcr_host_t;
 #endif /* defined(CONFIG_PPC_DCR_NATIVE) && defined(CONFIG_PPC_DCR_MMIO) */
 
 /*
- * On CONFIG_PPC_MERGE, we have additional helpers to read the DCR
- * base from the device-tree
+ * additional helpers to read the DCR * base from the device-tree
  */
-#ifdef CONFIG_PPC_MERGE
 struct device_node;
 extern unsigned int dcr_resource_start(struct device_node *np,
                                       unsigned int index);
 extern unsigned int dcr_resource_len(struct device_node *np,
                                     unsigned int index);
-#endif /* CONFIG_PPC_MERGE */
-
 #endif /* CONFIG_PPC_DCR */
 #endif /* __ASSEMBLY__ */
 #endif /* __KERNEL__ */
similarity index 71%
rename from include/asm-powerpc/i8259.h
rename to arch/powerpc/include/asm/i8259.h
index db1362f8c603c2576dffefbe6e23a8c410057984..105ade297aad4466f7f62b52dbd97cf131712ad4 100644 (file)
@@ -4,14 +4,9 @@
 
 #include <linux/irq.h>
 
-#ifdef CONFIG_PPC_MERGE
 extern void i8259_init(struct device_node *node, unsigned long intack_addr);
 extern unsigned int i8259_irq(void);
 extern struct irq_host *i8259_get_host(void);
-#else
-extern void i8259_init(unsigned long intack_addr, int offset);
-extern int i8259_irq(void);
-#endif
 
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_I8259_H */
similarity index 98%
rename from include/asm-powerpc/ide.h
rename to arch/powerpc/include/asm/ide.h
index 1aaf27be8741a3ab9f52a3e538376a38978be779..048480e340f20c937c2d1d8c9b8ef1eee7388b49 100644 (file)
@@ -20,7 +20,6 @@
 #define __ide_mm_outsl(p, a, c)        writesl((void __iomem *)(p), (a), (c))
 
 #ifndef  __powerpc64__
-#include <linux/hdreg.h>
 #include <linux/ioport.h>
 
 /* FIXME: use ide_platform host driver */
similarity index 99%
rename from include/asm-powerpc/immap_qe.h
rename to arch/powerpc/include/asm/immap_qe.h
index 7b6f411db3e680c17cf6c819268ba73988f7399e..3c2fced3ac222bbfeaac990e8871abbf91b73135 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * include/asm-powerpc/immap_qe.h
- *
  * QUICC Engine (QE) Internal Memory Map.
  * The Internal Memory Map for devices with QE on them. This
  * is the superset of all QE devices (8360, etc.).
similarity index 93%
rename from include/asm-powerpc/ipic.h
rename to arch/powerpc/include/asm/ipic.h
index 8ff08be001461cad3e966c5daacf9feed5acc9fe..fb59829983b8bf8caba28bbb4d47fca9dc22eb73 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * include/asm-powerpc/ipic.h
- *
  * IPIC external definitions and structure.
  *
  * Maintainer: Kumar Gala <galak@kernel.crashing.org>
@@ -79,15 +77,8 @@ extern void ipic_disable_mcp(enum ipic_mcp_irq mcp_irq);
 extern u32 ipic_get_mcp_status(void);
 extern void ipic_clear_mcp_status(u32 mask);
 
-#ifdef CONFIG_PPC_MERGE
 extern struct ipic * ipic_init(struct device_node *node, unsigned int flags);
 extern unsigned int ipic_get_irq(void);
-#else
-extern void ipic_init(phys_addr_t phys_addr, unsigned int flags,
-               unsigned int irq_offset,
-               unsigned char *senses, unsigned int senses_count);
-extern int ipic_get_irq(void);
-#endif
 
 #endif /* __ASM_IPIC_H__ */
 #endif /* __KERNEL__ */
similarity index 58%
rename from include/asm-powerpc/irq.h
rename to arch/powerpc/include/asm/irq.h
index 1ef8e304e0eac06cbc4561fdab63800a291cb7cd..a372f76836c23145586144933e4f03f4b63bd692 100644 (file)
@@ -25,8 +25,6 @@
 
 extern atomic_t ppc_n_lost_interrupts;
 
-#ifdef CONFIG_PPC_MERGE
-
 /* This number is used when no interrupt has been assigned */
 #define NO_IRQ                 (0)
 
@@ -326,292 +324,6 @@ static __inline__ int irq_canonicalize(int irq)
        return irq;
 }
 
-
-#else /* CONFIG_PPC_MERGE */
-
-/* This number is used when no interrupt has been assigned */
-#define NO_IRQ                 (-1)
-#define NO_IRQ_IGNORE          (-2)
-
-
-/*
- * These constants are used for passing information about interrupt
- * signal polarity and level/edge sensing to the low-level PIC chip
- * drivers.
- */
-#define IRQ_SENSE_MASK         0x1
-#define IRQ_SENSE_LEVEL                0x1     /* interrupt on active level */
-#define IRQ_SENSE_EDGE         0x0     /* interrupt triggered by edge */
-
-#define IRQ_POLARITY_MASK      0x2
-#define IRQ_POLARITY_POSITIVE  0x2     /* high level or low->high edge */
-#define IRQ_POLARITY_NEGATIVE  0x0     /* low level or high->low edge */
-
-
-#if defined(CONFIG_40x)
-#include <asm/ibm4xx.h>
-
-#ifndef NR_BOARD_IRQS
-#define NR_BOARD_IRQS 0
-#endif
-
-#ifndef UIC_WIDTH /* Number of interrupts per device */
-#define UIC_WIDTH 32
-#endif
-
-#ifndef NR_UICS /* number  of UIC devices */
-#define NR_UICS 1
-#endif
-
-#if defined (CONFIG_403)
-/*
- * The PowerPC 403 cores' Asynchronous Interrupt Controller (AIC) has
- * 32 possible interrupts, a majority of which are not implemented on
- * all cores. There are six configurable, external interrupt pins and
- * there are eight internal interrupts for the on-chip serial port
- * (SPU), DMA controller, and JTAG controller.
- *
- */
-
-#define        NR_AIC_IRQS 32
-#define        NR_IRQS  (NR_AIC_IRQS + NR_BOARD_IRQS)
-
-#elif !defined (CONFIG_403)
-
-/*
- *  The PowerPC 405 cores' Universal Interrupt Controller (UIC) has 32
- * possible interrupts as well. There are seven, configurable external
- * interrupt pins and there are 17 internal interrupts for the on-chip
- * serial port, DMA controller, on-chip Ethernet controller, PCI, etc.
- *
- */
-
-
-#define NR_UIC_IRQS UIC_WIDTH
-#define NR_IRQS                ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS)
-#endif
-
-#elif defined(CONFIG_44x)
-#include <asm/ibm44x.h>
-
-#define        NR_UIC_IRQS     32
-#define        NR_IRQS         ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS)
-
-#elif defined(CONFIG_8xx)
-
-/* Now include the board configuration specific associations.
-*/
-#include <asm/mpc8xx.h>
-
-/* The MPC8xx cores have 16 possible interrupts.  There are eight
- * possible level sensitive interrupts assigned and generated internally
- * from such devices as CPM, PCMCIA, RTC, PIT, TimeBase and Decrementer.
- * There are eight external interrupts (IRQs) that can be configured
- * as either level or edge sensitive.
- *
- * On some implementations, there is also the possibility of an 8259
- * through the PCI and PCI-ISA bridges.
- *
- * We are "flattening" the interrupt vectors of the cascaded CPM
- * and 8259 interrupt controllers so that we can uniquely identify
- * any interrupt source with a single integer.
- */
-#define NR_SIU_INTS    16
-#define NR_CPM_INTS    32
-#ifndef NR_8259_INTS
-#define NR_8259_INTS 0
-#endif
-
-#define SIU_IRQ_OFFSET         0
-#define CPM_IRQ_OFFSET         (SIU_IRQ_OFFSET + NR_SIU_INTS)
-#define I8259_IRQ_OFFSET       (CPM_IRQ_OFFSET + NR_CPM_INTS)
-
-#define NR_IRQS        (NR_SIU_INTS + NR_CPM_INTS + NR_8259_INTS)
-
-/* These values must be zero-based and map 1:1 with the SIU configuration.
- * They are used throughout the 8xx I/O subsystem to generate
- * interrupt masks, flags, and other control patterns.  This is why the
- * current kernel assumption of the 8259 as the base controller is such
- * a pain in the butt.
- */
-#define        SIU_IRQ0        (0)     /* Highest priority */
-#define        SIU_LEVEL0      (1)
-#define        SIU_IRQ1        (2)
-#define        SIU_LEVEL1      (3)
-#define        SIU_IRQ2        (4)
-#define        SIU_LEVEL2      (5)
-#define        SIU_IRQ3        (6)
-#define        SIU_LEVEL3      (7)
-#define        SIU_IRQ4        (8)
-#define        SIU_LEVEL4      (9)
-#define        SIU_IRQ5        (10)
-#define        SIU_LEVEL5      (11)
-#define        SIU_IRQ6        (12)
-#define        SIU_LEVEL6      (13)
-#define        SIU_IRQ7        (14)
-#define        SIU_LEVEL7      (15)
-
-#define MPC8xx_INT_FEC1                SIU_LEVEL1
-#define MPC8xx_INT_FEC2                SIU_LEVEL3
-
-#define MPC8xx_INT_SCC1                (CPM_IRQ_OFFSET + CPMVEC_SCC1)
-#define MPC8xx_INT_SCC2                (CPM_IRQ_OFFSET + CPMVEC_SCC2)
-#define MPC8xx_INT_SCC3                (CPM_IRQ_OFFSET + CPMVEC_SCC3)
-#define MPC8xx_INT_SCC4                (CPM_IRQ_OFFSET + CPMVEC_SCC4)
-#define MPC8xx_INT_SMC1                (CPM_IRQ_OFFSET + CPMVEC_SMC1)
-#define MPC8xx_INT_SMC2                (CPM_IRQ_OFFSET + CPMVEC_SMC2)
-
-/* The internal interrupts we can configure as we see fit.
- * My personal preference is CPM at level 2, which puts it above the
- * MBX PCI/ISA/IDE interrupts.
- */
-#ifndef PIT_INTERRUPT
-#define PIT_INTERRUPT          SIU_LEVEL0
-#endif
-#ifndef        CPM_INTERRUPT
-#define CPM_INTERRUPT          SIU_LEVEL2
-#endif
-#ifndef        PCMCIA_INTERRUPT
-#define PCMCIA_INTERRUPT       SIU_LEVEL6
-#endif
-#ifndef        DEC_INTERRUPT
-#define DEC_INTERRUPT          SIU_LEVEL7
-#endif
-
-/* Some internal interrupt registers use an 8-bit mask for the interrupt
- * level instead of a number.
- */
-#define        mk_int_int_mask(IL) (1 << (7 - (IL/2)))
-
-#else /* CONFIG_40x + CONFIG_8xx */
-/*
- * this is the # irq's for all ppc arch's (pmac/chrp/prep)
- * so it is the max of them all
- */
-#define NR_IRQS                        256
-#define __DO_IRQ_CANON 1
-
-#ifndef CONFIG_8260
-
-#define NUM_8259_INTERRUPTS    16
-
-#else /* CONFIG_8260 */
-
-/* The 8260 has an internal interrupt controller with a maximum of
- * 64 IRQs.  We will use NR_IRQs from above since it is large enough.
- * Don't be confused by the 8260 documentation where they list an
- * "interrupt number" and "interrupt vector".  We are only interested
- * in the interrupt vector.  There are "reserved" holes where the
- * vector number increases, but the interrupt number in the table does not.
- * (Document errata updates have fixed this...make sure you have up to
- * date processor documentation -- Dan).
- */
-
-#ifndef CPM_IRQ_OFFSET
-#define CPM_IRQ_OFFSET 0
-#endif
-
-#define NR_CPM_INTS    64
-
-#define        SIU_INT_ERROR           ((uint)0x00 + CPM_IRQ_OFFSET)
-#define        SIU_INT_I2C             ((uint)0x01 + CPM_IRQ_OFFSET)
-#define        SIU_INT_SPI             ((uint)0x02 + CPM_IRQ_OFFSET)
-#define        SIU_INT_RISC            ((uint)0x03 + CPM_IRQ_OFFSET)
-#define        SIU_INT_SMC1            ((uint)0x04 + CPM_IRQ_OFFSET)
-#define        SIU_INT_SMC2            ((uint)0x05 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IDMA1           ((uint)0x06 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IDMA2           ((uint)0x07 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IDMA3           ((uint)0x08 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IDMA4           ((uint)0x09 + CPM_IRQ_OFFSET)
-#define        SIU_INT_SDMA            ((uint)0x0a + CPM_IRQ_OFFSET)
-#define        SIU_INT_USB             ((uint)0x0b + CPM_IRQ_OFFSET)
-#define        SIU_INT_TIMER1          ((uint)0x0c + CPM_IRQ_OFFSET)
-#define        SIU_INT_TIMER2          ((uint)0x0d + CPM_IRQ_OFFSET)
-#define        SIU_INT_TIMER3          ((uint)0x0e + CPM_IRQ_OFFSET)
-#define        SIU_INT_TIMER4          ((uint)0x0f + CPM_IRQ_OFFSET)
-#define        SIU_INT_TMCNT           ((uint)0x10 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PIT             ((uint)0x11 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PCI             ((uint)0x12 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IRQ1            ((uint)0x13 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IRQ2            ((uint)0x14 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IRQ3            ((uint)0x15 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IRQ4            ((uint)0x16 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IRQ5            ((uint)0x17 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IRQ6            ((uint)0x18 + CPM_IRQ_OFFSET)
-#define        SIU_INT_IRQ7            ((uint)0x19 + CPM_IRQ_OFFSET)
-#define        SIU_INT_FCC1            ((uint)0x20 + CPM_IRQ_OFFSET)
-#define        SIU_INT_FCC2            ((uint)0x21 + CPM_IRQ_OFFSET)
-#define        SIU_INT_FCC3            ((uint)0x22 + CPM_IRQ_OFFSET)
-#define        SIU_INT_MCC1            ((uint)0x24 + CPM_IRQ_OFFSET)
-#define        SIU_INT_MCC2            ((uint)0x25 + CPM_IRQ_OFFSET)
-#define        SIU_INT_SCC1            ((uint)0x28 + CPM_IRQ_OFFSET)
-#define        SIU_INT_SCC2            ((uint)0x29 + CPM_IRQ_OFFSET)
-#define        SIU_INT_SCC3            ((uint)0x2a + CPM_IRQ_OFFSET)
-#define        SIU_INT_SCC4            ((uint)0x2b + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC15            ((uint)0x30 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC14            ((uint)0x31 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC13            ((uint)0x32 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC12            ((uint)0x33 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC11            ((uint)0x34 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC10            ((uint)0x35 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC9             ((uint)0x36 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC8             ((uint)0x37 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC7             ((uint)0x38 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC6             ((uint)0x39 + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC5             ((uint)0x3a + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC4             ((uint)0x3b + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC3             ((uint)0x3c + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC2             ((uint)0x3d + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC1             ((uint)0x3e + CPM_IRQ_OFFSET)
-#define        SIU_INT_PC0             ((uint)0x3f + CPM_IRQ_OFFSET)
-
-#endif /* CONFIG_8260 */
-
-#endif /* Whatever way too big #ifdef */
-
-#define NR_MASK_WORDS  ((NR_IRQS + 31) / 32)
-/* pedantic: these are long because they are used with set_bit --RR */
-extern unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
-
-/*
- * Because many systems have two overlapping names spaces for
- * interrupts (ISA and XICS for example), and the ISA interrupts
- * have historically not been easy to renumber, we allow ISA
- * interrupts to take values 0 - 15, and shift up the remaining
- * interrupts by 0x10.
- */
-#define NUM_ISA_INTERRUPTS     0x10
-extern int __irq_offset_value;
-
-static inline int irq_offset_up(int irq)
-{
-       return(irq + __irq_offset_value);
-}
-
-static inline int irq_offset_down(int irq)
-{
-       return(irq - __irq_offset_value);
-}
-
-static inline int irq_offset_value(void)
-{
-       return __irq_offset_value;
-}
-
-#ifdef __DO_IRQ_CANON
-extern int ppc_do_canonicalize_irqs;
-#else
-#define ppc_do_canonicalize_irqs       0
-#endif
-
-static __inline__ int irq_canonicalize(int irq)
-{
-       if (ppc_do_canonicalize_irqs && irq == 2)
-               irq = 9;
-       return irq;
-}
-#endif /* CONFIG_PPC_MERGE */
-
 extern int distribute_irqs;
 
 struct irqaction;
similarity index 93%
rename from include/asm-powerpc/irqflags.h
rename to arch/powerpc/include/asm/irqflags.h
index cc6fdba33660c015a466d202ab0aff55405df96b..17ba3a881bfdff71d813d2030087b6ab04207ba0 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * include/asm-powerpc/irqflags.h
- *
  * IRQ flags handling
  */
 #ifndef _ASM_IRQFLAGS_H
@@ -10,7 +8,7 @@
 /*
  * Get definitions for raw_local_save_flags(x), etc.
  */
-#include <asm-powerpc/hw_irq.h>
+#include <asm/hw_irq.h>
 
 #else
 #ifdef CONFIG_TRACE_IRQFLAGS
similarity index 98%
rename from include/asm-powerpc/kgdb.h
rename to arch/powerpc/include/asm/kgdb.h
index 1399caf719aefcfffc2871976b184d967173396e..edd217006d270dc8ec112467d1d6fa048c8e0299 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * include/asm-powerpc/kgdb.h
- *
  * The PowerPC (32/64) specific defines / externs for KGDB.  Based on
  * the previous 32bit and 64bit specific files, which had the following
  * copyrights:
similarity index 99%
rename from include/asm-powerpc/paca.h
rename to arch/powerpc/include/asm/paca.h
index 7b564444ff619ad1a280c962602392681712bb83..6493a395508b800678e0df51b4d0d17fb587a2a0 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * include/asm-powerpc/paca.h
- *
  * This control block defines the PACA which defines the processor
  * specific data for each logical processor on the system.
  * There are some pointers defined that are utilized by PLIC.
similarity index 99%
rename from include/asm-powerpc/pgtable-ppc64.h
rename to arch/powerpc/include/asm/pgtable-ppc64.h
index 74c6f380b8055e5f7803201e51755866d01ed904..db0b8f3b88071a57ea80b9758f486c01824f794c 100644 (file)
 
 #define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY)
 
-/* __pgprot defined in asm-powerpc/page.h */
+/* __pgprot defined in arch/powerpc/incliude/asm/page.h */
 #define PAGE_NONE      __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED)
 
 #define PAGE_SHARED    __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER)
similarity index 99%
rename from include/asm-powerpc/qe_ic.h
rename to arch/powerpc/include/asm/qe_ic.h
index a779b2c9eaf163eb73c0f80faaedd24a1ea7e30f..56a7745ca343d438c1b4430186f1c1592fa0b5ad 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * include/asm-powerpc/qe_ic.h
- *
  * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved.
  *
  * Authors:    Shlomi Gridish <gridish@freescale.com>
similarity index 96%
rename from include/asm-powerpc/rwsem.h
rename to arch/powerpc/include/asm/rwsem.h
index a6cc93b78b981eaff6fb3f4944afcb686563e572..24cd9281ec3726a55c95a7a9f8d076c76b97e2b8 100644 (file)
@@ -8,8 +8,8 @@
 #ifdef __KERNEL__
 
 /*
- * include/asm-powerpc/rwsem.h: R/W semaphores for PPC using the stuff
- * in lib/rwsem.c.  Adapted largely from include/asm-i386/rwsem.h
+ * R/W semaphores for PPC using the stuff in lib/rwsem.c.
+ * Adapted largely from include/asm-i386/rwsem.h
  * by Paul Mackerras <paulus@samba.org>.
  */
 
similarity index 99%
rename from include/asm-powerpc/ucc_fast.h
rename to arch/powerpc/include/asm/ucc_fast.h
index fce16abe7ee1ea77d88bdc968859b33465a91ac8..839aab8bf37d516c2396d2123a20130ebaf21484 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * include/asm-powerpc/ucc_fast.h
- *
  * Internal header file for UCC FAST unit routines.
  *
  * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved.
similarity index 95%
rename from include/asm-powerpc/uic.h
rename to arch/powerpc/include/asm/uic.h
index 970eb7e2186a3d4ee781d20a8ff2892975694250..597edfcae3d616dc39e709e002d13bae67e6b14d 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * include/asm-powerpc/uic.h
- *
  * IBM PPC4xx UIC external definitions and structure.
  *
  * Maintainer: David Gibson <dwg@au1.ibm.com>
index 1a4094704b1fc630386041239241008c5d457487..64f5948ebc9df94c7a0ae0978989ee65818dc2c2 100644 (file)
@@ -59,8 +59,6 @@ obj64-$(CONFIG_HIBERNATION)   += swsusp_asm64.o
 obj-$(CONFIG_MODULES)          += module.o module_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_44x)              += cpu_setup_44x.o
 
-ifeq ($(CONFIG_PPC_MERGE),y)
-
 extra-$(CONFIG_PPC_STD_MMU)    := head_32.o
 extra-$(CONFIG_PPC64)          := head_64.o
 extra-$(CONFIG_40x)            := head_40x.o
@@ -100,12 +98,6 @@ ifneq ($(CONFIG_PPC_INDIRECT_IO),y)
 obj-y                          += iomap.o
 endif
 
-else
-# stuff used from here for ARCH=ppc
-smpobj-$(CONFIG_SMP)           += smp.o
-
-endif
-
 obj-$(CONFIG_PPC64)            += $(obj64-y)
 
 extra-$(CONFIG_PPC_FPU)                += fpu.o
@@ -121,9 +113,6 @@ PHONY += systbl_chk
 systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i
        $(call cmd,systbl_chk)
 
-
-ifeq ($(CONFIG_PPC_MERGE),y)
-
 $(obj)/built-in.o:             prom_init_check
 
 quiet_cmd_prom_init_check = CALL    $<
@@ -133,7 +122,4 @@ PHONY += prom_init_check
 prom_init_check: $(src)/prom_init_check.sh $(obj)/prom_init.o
        $(call cmd,prom_init_check)
 
-endif
-
-
 clean-files := vmlinux.lds
index 5465e8de0e61a547fed18f14222199b311b0dfee..80cac984d85d06271a80d1d67cb02e08a057515c 100644 (file)
@@ -39,12 +39,6 @@ _GLOBAL(__setup_cpu_440gx)
 _GLOBAL(__setup_cpu_440spe)
        b       __fixup_440A_mcheck
 
- /* Temporary fixup for arch/ppc until we kill the whole thing */
-#ifndef CONFIG_PPC_MERGE
-_GLOBAL(__fixup_440A_mcheck)
-       blr
-#endif
-
 /* enable APU between CPU and FPU */
 _GLOBAL(__init_fpu_44x)
        mfspr   r3,SPRN_CCR0
index 6ac8612da3c32a61f0fae070fd158be9f6d706f6..d972decf0324d4b92e748f4a271e4ad3b4ed4475 100644 (file)
@@ -77,22 +77,12 @@ static int ppc_spurious_interrupts;
 EXPORT_SYMBOL(__irq_offset_value);
 atomic_t ppc_n_lost_interrupts;
 
-#ifndef CONFIG_PPC_MERGE
-#define NR_MASK_WORDS  ((NR_IRQS + 31) / 32)
-unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
-#endif
-
 #ifdef CONFIG_TAU_INT
 extern int tau_initialized;
 extern int tau_interrupts(int);
 #endif
 #endif /* CONFIG_PPC32 */
 
-#if defined(CONFIG_SMP) && !defined(CONFIG_PPC_MERGE)
-extern atomic_t ipi_recv;
-extern atomic_t ipi_sent;
-#endif
-
 #ifdef CONFIG_PPC64
 EXPORT_SYMBOL(irq_desc);
 
@@ -216,21 +206,14 @@ int show_interrupts(struct seq_file *p, void *v)
 skip:
                spin_unlock_irqrestore(&desc->lock, flags);
        } else if (i == NR_IRQS) {
-#ifdef CONFIG_PPC32
-#ifdef CONFIG_TAU_INT
+#if defined(CONFIG_PPC32) && defined(CONFIG_TAU_INT)
                if (tau_initialized){
                        seq_puts(p, "TAU: ");
                        for_each_online_cpu(j)
                                seq_printf(p, "%10u ", tau_interrupts(j));
                        seq_puts(p, "  PowerPC             Thermal Assist (cpu temp)\n");
                }
-#endif
-#if defined(CONFIG_SMP) && !defined(CONFIG_PPC_MERGE)
-               /* should this be per processor send/receive? */
-               seq_printf(p, "IPI (recv/sent): %10u/%u\n",
-                               atomic_read(&ipi_recv), atomic_read(&ipi_sent));
-#endif
-#endif /* CONFIG_PPC32 */
+#endif /* CONFIG_PPC32 && CONFIG_TAU_INT*/
                seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
        }
        return 0;
@@ -454,8 +437,6 @@ void do_softirq(void)
  * IRQ controller and virtual interrupts
  */
 
-#ifdef CONFIG_PPC_MERGE
-
 static LIST_HEAD(irq_hosts);
 static DEFINE_SPINLOCK(irq_big_lock);
 static DEFINE_PER_CPU(unsigned int, irq_radix_reader);
@@ -1114,8 +1095,6 @@ static int __init irq_debugfs_init(void)
 __initcall(irq_debugfs_init);
 #endif /* CONFIG_VIRQ_DEBUG */
 
-#endif /* CONFIG_PPC_MERGE */
-
 #ifdef CONFIG_PPC64
 static int __init setup_noirqdistrib(char *str)
 {
index e030f3bd50248c2a85aae15e704f27bc1bd2dbe5..957bded0020d5d8921e11f6db8fc4517565207a8 100644 (file)
@@ -276,10 +276,8 @@ int set_dabr(unsigned long dabr)
 {
        __get_cpu_var(current_dabr) = dabr;
 
-#ifdef CONFIG_PPC_MERGE                /* XXX for now */
        if (ppc_md.set_dabr)
                return ppc_md.set_dabr(dabr);
-#endif
 
        /* XXX should we have a CPU_FTR_HAS_DABR ? */
 #if defined(CONFIG_PPC64) || defined(CONFIG_6xx)
index f177c60ea766a746893ca6de4707cd95b01181f8..65639a43e644888577d4bf92328f54c95aef99fb 100644 (file)
@@ -788,9 +788,7 @@ static int __init vdso_init(void)
 
        return 0;
 }
-#ifdef CONFIG_PPC_MERGE
 arch_initcall(vdso_init);
-#endif
 
 int in_gate_area_no_task(unsigned long addr)
 {
index 2a88e8b9a3c6b4d31bef5514996bfbae43a7b9c0..d69912c07ce732c937412dac1286ba0223ded96c 100644 (file)
@@ -6,12 +6,10 @@ ifeq ($(CONFIG_PPC64),y)
 EXTRA_CFLAGS           += -mno-minimal-toc
 endif
 
-ifeq ($(CONFIG_PPC_MERGE),y)
 obj-y                  := string.o alloc.o \
                           checksum_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_PPC32)    += div64.o copy_32.o crtsavres.o
 obj-$(CONFIG_HAS_IOMEM)        += devres.o
-endif
 
 obj-$(CONFIG_PPC64)    += copypage_64.o copyuser_64.o \
                           memcpy_64.o usercopy_64.o mem_64.o string.o
index 702691cb9e82361bd5de91cc8c0445411aea6c37..1c93c255873b5a4fb9640dd2de7d58332dfabded 100644 (file)
@@ -311,7 +311,7 @@ void __init paging_init(void)
 #endif /* CONFIG_HIGHMEM */
 
        printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%lx\n",
-              (u64)top_of_ram, total_ram);
+              (unsigned long long)top_of_ram, total_ram);
        printk(KERN_DEBUG "Memory hole size: %ldMB\n",
               (long int)((top_of_ram - total_ram) >> 20));
        memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
index c53145f619427e6bf3ba20605de27f8a32a027c9..6aa12081377531594bea592b94915da93904be78 100644 (file)
@@ -236,8 +236,8 @@ void __init MMU_init_hw(void)
 
        Hash_end = (struct hash_pte *) ((unsigned long)Hash + Hash_size);
 
-       printk("Total memory = %ldMB; using %ldkB for hash table (at %p)\n",
-              total_memory >> 20, Hash_size >> 10, Hash);
+       printk("Total memory = %lldMB; using %ldkB for hash table (at %p)\n",
+              (unsigned long long)(total_memory >> 20), Hash_size >> 10, Hash);
 
 
        /*
index 409fcc7b63ce410872a2e6a58ca1f95f41bdf9e2..be7dd422c0fa703dcc027a0645c98cc180af8448 100644 (file)
@@ -34,7 +34,7 @@
 DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
 
 /* This is declared as we are using the more or less generic
- * include/asm-powerpc/tlb.h file -- tgall
+ * arch/powerpc/include/asm/tlb.h file -- tgall
  */
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 static DEFINE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur);
index daf0e1568d6d8e16aa9bc7cc3bbecf5c1b650eb5..b8a52062738ac0f28345d0c3cd1ba4f350e38b33 100644 (file)
@@ -1,10 +1,8 @@
 #
 # Makefile for 52xx based boards
 #
-ifeq ($(CONFIG_PPC_MERGE),y)
 obj-y                          += mpc52xx_pic.o mpc52xx_common.o
 obj-$(CONFIG_PCI)              += mpc52xx_pci.o
-endif
 
 obj-$(CONFIG_PPC_MPC5200_SIMPLE) += mpc5200_simple.o
 obj-$(CONFIG_PPC_EFIKA)                += efika.o
@@ -15,4 +13,4 @@ ifeq ($(CONFIG_PPC_LITE5200),y)
        obj-$(CONFIG_PM)        += lite5200_sleep.o lite5200_pm.o
 endif
 
-obj-$(CONFIG_PPC_MPC5200_GPIO) += mpc52xx_gpio.o
\ No newline at end of file
+obj-$(CONFIG_PPC_MPC5200_GPIO) += mpc52xx_gpio.o
index 835f2dc24dc9a7b5c9d277bf5350cc1fec159b74..014e26cda08d1b08d012b174ed1b1908132f1b96 100644 (file)
@@ -19,7 +19,7 @@
 #include <asm/page.h>
 #include <asm/pgtable.h>
 #include <asm/pci-bridge.h>
-#include <asm-powerpc/mpic.h>
+#include <asm/mpic.h>
 #include <asm/mpc86xx.h>
 #include <asm/cacheflush.h>
 
index 423a0234dc31289d8b76cd69fb0828eb944349ce..8079e0b4fd69a14a0bde12cd2dfed65732b3bdbd 100644 (file)
@@ -1,13 +1,7 @@
 
 obj-$(CONFIG_FSL_ULI1575)      += fsl_uli1575.o
 
-ifeq ($(CONFIG_PPC_MERGE),y)
 obj-$(CONFIG_PPC_PMAC)         += powermac/
-else
-ifeq ($(CONFIG_PPC64),y)
-obj-$(CONFIG_PPC_PMAC)         += powermac/
-endif
-endif
 obj-$(CONFIG_PPC_CHRP)         += chrp/
 obj-$(CONFIG_40x)              += 40x/
 obj-$(CONFIG_44x)              += 44x/
index 89774177b209e25465ae9d5648166a1c2ff72840..58ecdd72630fb1e3eb772df368b500cd672d0e8b 100644 (file)
@@ -7,7 +7,7 @@ endif
 
 obj-y                          += pic.o setup.o time.o feature.o pci.o \
                                   sleep.o low_i2c.o cache.o pfunc_core.o \
-                                  pfunc_base.o
+                                  pfunc_base.o udbg_scc.o udbg_adb.o
 obj-$(CONFIG_PMAC_BACKLIGHT)   += backlight.o
 obj-$(CONFIG_CPU_FREQ_PMAC)    += cpufreq_32.o
 obj-$(CONFIG_CPU_FREQ_PMAC64)  += cpufreq_64.o
@@ -19,4 +19,3 @@ obj-$(CONFIG_NVRAM:m=y)               += nvram.o
 obj-$(CONFIG_PPC64)            += nvram.o
 obj-$(CONFIG_PPC32)            += bootx_init.o
 obj-$(CONFIG_SMP)              += smp.o
-obj-$(CONFIG_PPC_MERGE)                += udbg_scc.o udbg_adb.o
index 16a0ed28eb003d8e3bc7d50309c119871fff5cec..a90054b56d5c5a8cba8589885566b1eb88c1545b 100644 (file)
@@ -25,7 +25,6 @@ obj-$(CONFIG_MV64X60)         += $(mv64x60-y) mv64x60_pic.o mv64x60_dev.o \
 obj-$(CONFIG_RTC_DRV_CMOS)     += rtc_cmos_setup.o
 obj-$(CONFIG_AXON_RAM)         += axonram.o
 
-ifeq ($(CONFIG_PPC_MERGE),y)
 obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o
 obj-$(CONFIG_PPC_I8259)                += i8259.o
 obj-$(CONFIG_IPIC)             += ipic.o
@@ -36,7 +35,6 @@ obj-$(CONFIG_OF_RTC)          += of_rtc.o
 ifeq ($(CONFIG_PCI),y)
 obj-$(CONFIG_4xx)              += ppc4xx_pci.o
 endif
-endif
 
 # Temporary hack until we have migrated to asm-powerpc
 ifeq ($(ARCH),powerpc)
index cb992c3d6b711d75284a39d006c9cc258d5b61d0..5131d50f851ac44f0a81709708023e2c6f00a5af 100644 (file)
@@ -48,6 +48,9 @@ config GENERIC_HWEIGHT
 config GENERIC_HARDIRQS
        def_bool y
 
+config GENERIC_HARDIRQS_NO__DO_IRQ
+       def_bool y
+
 config GENERIC_IRQ_PROBE
        def_bool y
 
@@ -63,6 +66,10 @@ config GENERIC_TIME
 config GENERIC_CLOCKEVENTS
        def_bool n
 
+config GENERIC_LOCKBREAK
+       def_bool y
+       depends on SMP && PREEMPT
+
 config SYS_SUPPORTS_PM
        bool
 
@@ -94,9 +101,6 @@ config ARCH_HAS_ILOG2_U64
 config ARCH_NO_VIRT_TO_BUS
        def_bool y
 
-config ARCH_SUPPORTS_AOUT
-       def_bool y
-
 config IO_TRAPPED
        bool
 
@@ -483,6 +487,23 @@ config CRASH_DUMP
 
          For more details see Documentation/kdump/kdump.txt
 
+config SECCOMP
+       bool "Enable seccomp to safely compute untrusted bytecode"
+       depends on PROC_FS
+       default y
+       help
+         This kernel feature is useful for number crunching applications
+         that may need to compute untrusted bytecode during their
+         execution. By using pipes or other transports made available to
+         the process as file descriptors supporting the read/write
+         syscalls, it's possible to isolate those applications in
+         their own address space using seccomp. Once seccomp is
+         enabled via prctl, it cannot be disabled and the task is only
+         allowed to execute a few safe syscalls defined by each seccomp
+         mode.
+
+         If unsure, say N.
+
 config SMP
        bool "Symmetric multi-processing support"
        depends on SYS_SUPPORTS_SMP
index 36f4b1f7066d193f9290e11a88a89bd5dc4cdb5d..4d2d102e00d5657cef9a8a9b3b53d5f04cf7bdb5 100644 (file)
@@ -182,7 +182,7 @@ if SUPERH64
 
 config SH64_PROC_ASIDS
        bool "Debug: report ASIDs through /proc/asids"
-       depends on PROC_FS
+       depends on PROC_FS && MMU
 
 config SH64_SR_WATCH
        bool "Debug: set SR.WATCH to enable hardware watchpoints and trace"
index 25659ce74baaef76355436e23e80d68f30ed81c5..01d85c74481d9a42a066ecc9e8ecd0216621961a 100644 (file)
@@ -95,8 +95,6 @@ head-y                        := arch/sh/kernel/init_task.o
 head-$(CONFIG_SUPERH32)        += arch/sh/kernel/head_32.o
 head-$(CONFIG_SUPERH64)        += arch/sh/kernel/head_64.o
 
-LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
-
 core-y                         += arch/sh/kernel/ arch/sh/mm/ arch/sh/boards/
 core-$(CONFIG_SH_FPU_EMU)      += arch/sh/math-emu/
 
@@ -145,10 +143,6 @@ cpuincdir-$(CONFIG_CPU_SH4)        += cpu-sh4
 cpuincdir-$(CONFIG_CPU_SH5)    += cpu-sh5
 cpuincdir-y                    += cpu-common   # Must be last
 
-libs-$(CONFIG_SUPERH32)                := arch/sh/lib/ $(libs-y)
-libs-$(CONFIG_SUPERH64)                := arch/sh/lib64/ $(libs-y)
-libs-y                         += $(LIBGCC)
-
 drivers-y                      += arch/sh/drivers/
 drivers-$(CONFIG_OPROFILE)     += arch/sh/oprofile/
 
@@ -161,10 +155,16 @@ KBUILD_CFLAGS             += -pipe $(cflags-y)
 KBUILD_CPPFLAGS                += $(cflags-y)
 KBUILD_AFLAGS          += $(cflags-y)
 
+LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
+
+libs-$(CONFIG_SUPERH32)                := arch/sh/lib/ $(libs-y)
+libs-$(CONFIG_SUPERH64)                := arch/sh/lib64/ $(libs-y)
+libs-y                         += $(LIBGCC)
+
 PHONY += maketools FORCE
 
 maketools:  include/linux/version.h FORCE
-       $(Q)$(MAKE) $(build)=arch/sh/tools arch/sh/include/asm/machtypes.h
+       $(Q)$(MAKE) $(build)=arch/sh/tools include/asm-sh/machtypes.h
 
 all: $(KBUILD_IMAGE)
 
@@ -215,4 +215,4 @@ arch/sh/lib64/syscalltab.h: arch/sh/kernel/syscalls_64.S
        $(call filechk,gen-syscalltab)
 
 CLEAN_FILES += arch/sh/lib64/syscalltab.h \
-              arch/sh/include/asm/machtypes.h
+              include/asm-sh/machtypes.h
index ff9b93c5a91bb76e087d9415987eabe0fd0b142a..463022c7df3ceeb3dc0bf46a734debfa2af19081 100644 (file)
@@ -5,4 +5,4 @@ obj-$(CONFIG_SH_AP325RXA)       += board-ap325rxa.o
 obj-$(CONFIG_SH_MAGIC_PANEL_R2)        += board-magicpanelr2.o
 obj-$(CONFIG_SH_RSK7203)       += board-rsk7203.o
 obj-$(CONFIG_SH_SH7785LCR)     += board-sh7785lcr.o
-obj-$(CONFIG_SH_SHMIN)         += board-shmin..o
+obj-$(CONFIG_SH_SHMIN)         += board-shmin.o
index 9c71603d29a20545fe7f82a10e9fda58d29a251f..025d4fe55a581e4ba57e2c50095647c573598905 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/mtd/physmap.h>
 #include <linux/delay.h>
 #include <linux/i2c.h>
-#include <linux/delay.h>
 #include <linux/smc911x.h>
 #include <media/soc_camera_platform.h>
 #include <media/sh_mobile_ceu.h>
index 5d96e2eef82a972d5be0af7679eb019be080c423..051c29d4eae0ed472c687218c3ab4b5b928f04aa 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
-#include <linux/irq.h>
 #include <linux/io.h>
 #include <mach-se/mach/se7343.h>
 
index 0ba2fe674c477057166c2d0e89428e662410b0c9..601c9c8cdbec0af1c0757349f466701a685c71e3 100644 (file)
@@ -11,9 +11,8 @@
 
 #include <linux/init.h>
 #include <linux/irq.h>
+#include <linux/interrupt.h>
 
-#include <linux/hdreg.h>
-#include <linux/ide.h>
 #include <asm/io.h>
 #include <asm/systemh7751.h>
 #include <asm/smc37c93x.h>
index d4075283956d37a19e67d4bbf56613d449f6522b..3dc1cbd8a98151bfcad1a57f328b967ce9a2fff9 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.26
-# Wed Jul 30 01:34:24 2008
+# Linux kernel version: 2.6.27-rc1
+# Mon Aug  4 16:49:13 2008
 #
 CONFIG_SUPERH=y
 CONFIG_SUPERH32=y
@@ -11,6 +11,7 @@ CONFIG_GENERIC_BUG=y
 CONFIG_GENERIC_FIND_NEXT_BIT=y
 CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_GENERIC_TIME=y
@@ -21,7 +22,6 @@ CONFIG_LOCKDEP_SUPPORT=y
 # CONFIG_ARCH_HAS_ILOG2_U32 is not set
 # CONFIG_ARCH_HAS_ILOG2_U64 is not set
 CONFIG_ARCH_NO_VIRT_TO_BUS=y
-CONFIG_ARCH_SUPPORTS_AOUT=y
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
@@ -87,6 +87,7 @@ CONFIG_HAVE_OPROFILE=y
 # CONFIG_USE_GENERIC_SMP_HELPERS is not set
 CONFIG_HAVE_CLK=y
 CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
 CONFIG_SLABINFO=y
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
@@ -284,6 +285,7 @@ CONFIG_HZ=250
 # CONFIG_SCHED_HRTICK is not set
 # CONFIG_KEXEC is not set
 # CONFIG_CRASH_DUMP is not set
+CONFIG_SECCOMP=y
 # CONFIG_PREEMPT_NONE is not set
 # CONFIG_PREEMPT_VOLUNTARY is not set
 CONFIG_PREEMPT=y
@@ -317,10 +319,6 @@ CONFIG_PCI_LEGACY=y
 #
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
-
-#
-# Networking
-#
 CONFIG_NET=y
 
 #
@@ -555,7 +553,7 @@ CONFIG_INPUT_KEYBOARD=y
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
 # CONFIG_KEYBOARD_STOWAWAY is not set
-# CONFIG_KEYBOARD_MAPLE is not set
+CONFIG_KEYBOARD_MAPLE=y
 # CONFIG_KEYBOARD_SH_KEYSC is not set
 CONFIG_INPUT_MOUSE=y
 # CONFIG_MOUSE_PS2 is not set
diff --git a/arch/sh/include/asm/a.out.h b/arch/sh/include/asm/a.out.h
deleted file mode 100644 (file)
index 1f93130..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __ASM_SH_A_OUT_H
-#define __ASM_SH_A_OUT_H
-
-struct exec
-{
-  unsigned long a_info;                /* Use macros N_MAGIC, etc for access */
-  unsigned a_text;             /* length of text, in bytes */
-  unsigned a_data;             /* length of data, in bytes */
-  unsigned a_bss;              /* length of uninitialized data area for file, in bytes */
-  unsigned a_syms;             /* length of symbol table data in file, in bytes */
-  unsigned a_entry;            /* start address */
-  unsigned a_trsize;           /* length of relocation info for text, in bytes */
-  unsigned a_drsize;           /* length of relocation info for data, in bytes */
-};
-
-#define N_TRSIZE(a)    ((a).a_trsize)
-#define N_DRSIZE(a)    ((a).a_drsize)
-#define N_SYMSIZE(a)   ((a).a_syms)
-
-#endif /* __ASM_SH_A_OUT_H */
index 643ab5a7cf3b87d466b43e15f4d59cb9b9b077b9..b86aeabba61ae4dd68a5cdf95054365b019eba73 100644 (file)
@@ -104,6 +104,15 @@ struct pt_dspregs {
 
 extern void show_regs(struct pt_regs *);
 
+/*
+ * These are defined as per linux/ptrace.h.
+ */
+struct task_struct;
+
+#define arch_has_single_step() (1)
+extern void user_enable_single_step(struct task_struct *);
+extern void user_disable_single_step(struct task_struct *);
+
 #ifdef CONFIG_SH_DSP
 #define task_pt_regs(task) \
        ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \
diff --git a/arch/sh/include/asm/seccomp.h b/arch/sh/include/asm/seccomp.h
new file mode 100644 (file)
index 0000000..3280ed3
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __ASM_SECCOMP_H
+
+#include <linux/unistd.h>
+
+#define __NR_seccomp_read __NR_read
+#define __NR_seccomp_write __NR_write
+#define __NR_seccomp_exit __NR_exit
+#define __NR_seccomp_sigreturn __NR_rt_sigreturn
+
+#endif /* __ASM_SECCOMP_H */
index eeb4c747119eb2fab268ba854a63b22b9eeb8948..0a894cafb1ddcbc43b40303b62db4678d272ea72 100644 (file)
@@ -117,24 +117,45 @@ static inline struct thread_info *current_thread_info(void)
 #define TIF_NEED_RESCHED       2       /* rescheduling necessary */
 #define TIF_RESTORE_SIGMASK    3       /* restore signal mask in do_signal() */
 #define TIF_SINGLESTEP         4       /* singlestepping active */
-#define TIF_SYSCALL_AUDIT      5
+#define TIF_SYSCALL_AUDIT      5       /* syscall auditing active */
+#define TIF_SECCOMP            6       /* secure computing */
+#define TIF_NOTIFY_RESUME      7       /* callback before returning to user */
 #define TIF_USEDFPU            16      /* FPU was used by this task this quantum (SMP) */
 #define TIF_POLLING_NRFLAG     17      /* true if poll_idle() is polling TIF_NEED_RESCHED */
 #define TIF_MEMDIE             18
-#define TIF_FREEZE             19
-
-#define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
-#define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
-#define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
-#define _TIF_RESTORE_SIGMASK   (1<<TIF_RESTORE_SIGMASK)
-#define _TIF_SINGLESTEP                (1<<TIF_SINGLESTEP)
-#define _TIF_SYSCALL_AUDIT             (1<<TIF_SYSCALL_AUDIT)
-#define _TIF_USEDFPU           (1<<TIF_USEDFPU)
-#define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
-#define _TIF_FREEZE            (1<<TIF_FREEZE)
-
-#define _TIF_WORK_MASK         0x000000FE      /* work to do on interrupt/exception return */
-#define _TIF_ALLWORK_MASK      0x000000FF      /* work to do on any return to u-space */
+#define TIF_FREEZE             19      /* Freezing for suspend */
+
+#define _TIF_SYSCALL_TRACE     (1 << TIF_SYSCALL_TRACE)
+#define _TIF_SIGPENDING                (1 << TIF_SIGPENDING)
+#define _TIF_NEED_RESCHED      (1 << TIF_NEED_RESCHED)
+#define _TIF_RESTORE_SIGMASK   (1 << TIF_RESTORE_SIGMASK)
+#define _TIF_SINGLESTEP                (1 << TIF_SINGLESTEP)
+#define _TIF_SYSCALL_AUDIT     (1 << TIF_SYSCALL_AUDIT)
+#define _TIF_SECCOMP           (1 << TIF_SECCOMP)
+#define _TIF_NOTIFY_RESUME     (1 << TIF_NOTIFY_RESUME)
+#define _TIF_USEDFPU           (1 << TIF_USEDFPU)
+#define _TIF_POLLING_NRFLAG    (1 << TIF_POLLING_NRFLAG)
+#define _TIF_FREEZE            (1 << TIF_FREEZE)
+
+/*
+ * _TIF_ALLWORK_MASK and _TIF_WORK_MASK need to fit within a byte, or we
+ * blow the tst immediate size constraints and need to fix up
+ * arch/sh/kernel/entry-common.S.
+ */
+
+/* work to do in syscall trace */
+#define _TIF_WORK_SYSCALL_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \
+                                _TIF_SYSCALL_AUDIT | _TIF_SECCOMP)
+
+/* work to do on any return to u-space */
+#define _TIF_ALLWORK_MASK      (_TIF_SYSCALL_TRACE | _TIF_SIGPENDING      | \
+                                _TIF_NEED_RESCHED  | _TIF_SYSCALL_AUDIT   | \
+                                _TIF_SINGLESTEP    | _TIF_RESTORE_SIGMASK | \
+                                _TIF_NOTIFY_RESUME)
+
+/* work to do on interrupt/exception return */
+#define _TIF_WORK_MASK         (_TIF_ALLWORK_MASK & ~(_TIF_SYSCALL_TRACE | \
+                                _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP))
 
 #endif /* __KERNEL__ */
 
index 0a96f3af69e3122ff6ea8b8646349ed12d4f000d..ef0ae2a28f232638565519656f4f00bf3eb8cdd4 100644 (file)
 #ifndef __ASSEMBLY__
 
 /**
- * for_each_dtlb_entry
+ * for_each_dtlb_entry - Iterate over free (non-wired) DTLB entries
  *
  * @tlb:       TLB entry
- *
- * Iterate over free (non-wired) DTLB entries
  */
 #define for_each_dtlb_entry(tlb)               \
        for (tlb  = cpu_data->dtlb.first;       \
             tlb += cpu_data->dtlb.step)
 
 /**
- * for_each_itlb_entry
+ * for_each_itlb_entry - Iterate over free (non-wired) ITLB entries
  *
  * @tlb:       TLB entry
- *
- * Iterate over free (non-wired) ITLB entries
  */
 #define for_each_itlb_entry(tlb)               \
        for (tlb  = cpu_data->itlb.first;       \
             tlb += cpu_data->itlb.step)
 
 /**
- * __flush_tlb_slot
+ * __flush_tlb_slot - Flushes TLB slot @slot.
  *
  * @slot:      Address of TLB slot.
- *
- * Flushes TLB slot @slot.
  */
 static inline void __flush_tlb_slot(unsigned long long slot)
 {
index 4e0b16500686222163fae9b50ce044ad3c486c51..673515bc413559a24600f988baeb91e8a6b9b1d4 100644 (file)
 #define CCR            0xffffffec
 
 #define CCR_CACHE_CE   0x01    /* Cache enable */
-#define CCR_CACHE_WT   0x06    /* CCR[bit1=1,bit2=1] */
+#define CCR_CACHE_WT   0x02    /* CCR[bit1=1,bit2=1] */
                                /* 0x00000000-0x7fffffff: Write-through  */
                                /* 0x80000000-0x9fffffff: Write-back     */
                                 /* 0xc0000000-0xdfffffff: Write-through  */
-#define CCR_CACHE_CB   0x00    /* CCR[bit1=0,bit2=0] */
+#define CCR_CACHE_CB   0x04    /* CCR[bit1=0,bit2=0] */
                                /* 0x00000000-0x7fffffff: Write-back     */
                                /* 0x80000000-0x9fffffff: Write-through  */
                                 /* 0xc0000000-0xdfffffff: Write-back     */
@@ -36,6 +36,8 @@
 
 #define CCR_CACHE_ENABLE       CCR_CACHE_CE
 #define CCR_CACHE_INVALIDATE   CCR_CACHE_CF
+#define CACHE_PHYSADDR_MASK    0x1ffffc00
+
 #endif
 
 #endif /* __ASM_CPU_SH2_CACHE_H */
diff --git a/arch/sh/include/cpu-sh2a/cpu/addrspace.h b/arch/sh/include/cpu-sh2a/cpu/addrspace.h
new file mode 100644 (file)
index 0000000..31eb4b5
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __ASM_SH_CPU_SH2A_ADDRSPACE_H
+#define __ASM_SH_CPU_SH2A_ADDRSPACE_H
+
+#define P0SEG          0x00000000
+#define P1SEG          0x00000000
+#define P2SEG          0x20000000
+#define P3SEG          0x40000000
+#define P4SEG          0x60000000
+
+#endif /* __ASM_SH_CPU_SH2A_ADDRSPACE_H */
index afe228b3f493cdb5a5042390a9ecfd75c3b7842a..defb0baa5a0682b95222bccc60440ee760bd6680 100644 (file)
@@ -36,5 +36,8 @@
 
 #define CCR_CACHE_ENABLE       (CCR_CACHE_OCE | CCR_CACHE_ICE)
 #define CCR_CACHE_INVALIDATE   (CCR_CACHE_OCI | CCR_CACHE_ICI)
+#define CCR_ICACHE_INVALIDATE  CCR_CACHE_ICI
+#define CCR_OCACHE_INVALIDATE  CCR_CACHE_OCI
+#define CACHE_PHYSADDR_MASK    0x1ffffc00
 
 #endif /* __ASM_CPU_SH2A_CACHE_H */
diff --git a/arch/sh/include/cpu-sh2a/cpu/cacheflush.h b/arch/sh/include/cpu-sh2a/cpu/cacheflush.h
new file mode 100644 (file)
index 0000000..3d3b920
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef __ASM_CPU_SH2A_CACHEFLUSH_H
+#define __ASM_CPU_SH2A_CACHEFLUSH_H
+
+/* 
+ * Cache flushing:
+ *
+ *  - flush_cache_all() flushes entire cache
+ *  - flush_cache_mm(mm) flushes the specified mm context's cache lines
+ *  - flush_cache_dup mm(mm) handles cache flushing when forking
+ *  - flush_cache_page(mm, vmaddr, pfn) flushes a single page
+ *  - flush_cache_range(vma, start, end) flushes a range of pages
+ *
+ *  - flush_dcache_page(pg) flushes(wback&invalidates) a page for dcache
+ *  - flush_icache_range(start, end) flushes(invalidates) a range for icache
+ *  - flush_icache_page(vma, pg) flushes(invalidates) a page for icache
+ *
+ *  Caches are indexed (effectively) by physical address on SH-2, so
+ *  we don't need them.
+ */
+#define flush_cache_all()                      do { } while (0)
+#define flush_cache_mm(mm)                     do { } while (0)
+#define flush_cache_dup_mm(mm)                 do { } while (0)
+#define flush_cache_range(vma, start, end)     do { } while (0)
+#define flush_cache_page(vma, vmaddr, pfn)     do { } while (0)
+#define flush_dcache_page(page)                        do { } while (0)
+#define flush_dcache_mmap_lock(mapping)                do { } while (0)
+#define flush_dcache_mmap_unlock(mapping)      do { } while (0)
+void flush_icache_range(unsigned long start, unsigned long end);
+#define flush_icache_page(vma,pg)              do { } while (0)
+#define flush_icache_user_range(vma,pg,adr,len)        do { } while (0)
+#define flush_cache_sigtramp(vaddr)            do { } while (0)
+
+#define p3_cache_init()                                do { } while (0)
+#endif /* __ASM_CPU_SH2A_CACHEFLUSH_H */
index dcdf959a3d44199e25d80cc740bbd30feb804251..8a8a993f55ea1b6504ffab4408ef2f220b1dc92e 100644 (file)
@@ -199,7 +199,7 @@ EXPORT_SYMBOL(sq_remap);
 
 /**
  * sq_unmap - Unmap a Store Queue allocation
- * @map: Pre-allocated Store Queue mapping.
+ * @vaddr: Pre-allocated Store Queue mapping.
  *
  * Unmaps the store queue allocation @map that was previously created by
  * sq_remap(). Also frees up the pte that was previously inserted into
index ca08e7f26a3ab9b474e2253dfa2bfb93100d41fd..04c7da968146636084c58bef6639907093d60368 100644 (file)
@@ -987,11 +987,11 @@ work_resched:
 work_notifysig:
        gettr   tr1, LINK
 
-       movi    do_signal, r6
+       movi    do_notify_resume, r6
        ptabs   r6, tr0
        or      SP, ZERO, r2
-       or      ZERO, ZERO, r3
-       blink   tr0, LINK           /* Call do_signal(regs, 0), return here */
+       or      r7, ZERO, r3
+       blink   tr0, LINK           /* Call do_notify_resume(regs, current_thread_info->flags), return here */
 
 restore_all:
        /* Do prefetches */
@@ -1300,18 +1300,20 @@ syscall_allowed:
 
        getcon  KCR0, r2
        ld.l    r2, TI_FLAGS, r4
-       movi    (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | _TIF_SYSCALL_AUDIT), r6
+       movi    _TIF_WORK_SYSCALL_MASK, r6
        and     r6, r4, r6
        beq/l   r6, ZERO, tr0
 
        /* Trace it by calling syscall_trace before and after */
-       movi    syscall_trace, r4
+       movi    do_syscall_trace_enter, r4
        or      SP, ZERO, r2
-       or      ZERO, ZERO, r3
        ptabs   r4, tr0
        blink   tr0, LINK
 
-       /* Reload syscall number as r5 is trashed by syscall_trace */
+       /* Save the retval */
+       st.q    SP, FRAME_R(2), r2
+
+       /* Reload syscall number as r5 is trashed by do_syscall_trace_enter */
        ld.q    SP, FRAME_S(FSYSCALL_ID), r5
        andi    r5, 0x1ff, r5
 
@@ -1343,9 +1345,8 @@ syscall_ret_trace:
        /* We get back here only if under trace */
        st.q    SP, FRAME_R(9), r2      /* Save return value */
 
-       movi    syscall_trace, LINK
+       movi    do_syscall_trace_leave, LINK
        or      SP, ZERO, r2
-       movi    1, r3
        ptabs   LINK, tr0
        blink   tr0, LINK
 
index 5e0dd1933847b5cbd772e4681f6a7b149fafa5b3..0bc17def55a70ae6bc0d7398d92ffd826f005a14 100644 (file)
@@ -202,7 +202,7 @@ work_resched:
 syscall_exit_work:
        ! r0: current_thread_info->flags
        ! r8: current_thread_info
-       tst     #_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | _TIF_SYSCALL_AUDIT, r0
+       tst     #_TIF_WORK_SYSCALL_MASK, r0
        bt/s    work_pending
         tst    #_TIF_NEED_RESCHED, r0
 #ifdef CONFIG_TRACE_IRQFLAGS
@@ -211,10 +211,8 @@ syscall_exit_work:
         nop
 #endif
        sti
-       ! XXX setup arguments...
        mov     r15, r4
-       mov     #1, r5
-       mov.l   4f, r0                  ! do_syscall_trace
+       mov.l   8f, r0                  ! do_syscall_trace_leave
        jsr     @r0
         nop
        bra     resume_userspace
@@ -223,12 +221,11 @@ syscall_exit_work:
        .align  2
 syscall_trace_entry:
        !                       Yes it is traced.
-       ! XXX setup arguments...
        mov     r15, r4
-       mov     #0, r5
-       mov.l   4f, r11         ! Call do_syscall_trace which notifies
+       mov.l   7f, r11         ! Call do_syscall_trace_enter which notifies
        jsr     @r11            ! superior (will chomp R[0-7])
         nop
+       mov.l   r0, @(OFF_R0,r15)       ! Save return value
        !                       Reload R0-R4 from kernel stack, where the
        !                       parent may have modified them using
        !                       ptrace(POKEUSR).  (Note that R0-R2 are
@@ -351,7 +348,7 @@ ENTRY(system_call)
        !
        get_current_thread_info r8, r10
        mov.l   @(TI_FLAGS,r8), r8
-       mov     #(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT), r10
+       mov     #_TIF_WORK_SYSCALL_MASK, r10
        tst     r10, r8
        bf      syscall_trace_entry
        !
@@ -389,8 +386,9 @@ syscall_exit:
 #endif
 2:     .long   NR_syscalls
 3:     .long   sys_call_table
-4:     .long   do_syscall_trace
 #ifdef CONFIG_TRACE_IRQFLAGS
 5:     .long   trace_hardirqs_on
 6:     .long   trace_hardirqs_off
 #endif
+7:     .long   do_syscall_trace_enter
+8:     .long   do_syscall_trace_leave
index ec1eadce4aaaebdf8d7ed8da1b44f42653b1aa9c..4703dff174d59bb7084c832f92a1c364d6ff77df 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/kexec.h>
 #include <linux/delay.h>
 #include <linux/reboot.h>
+#include <linux/numa.h>
 #include <asm/pgtable.h>
 #include <asm/pgalloc.h>
 #include <asm/mmu_context.h>
@@ -104,3 +105,10 @@ void machine_kexec(struct kimage *image)
        (*rnk)(page_list, reboot_code_buffer, image->start, vbr_reg);
 }
 
+void arch_crash_save_vmcoreinfo(void)
+{
+#ifdef CONFIG_NUMA
+       VMCOREINFO_SYMBOL(node_data);
+       VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
+#endif
+}
index 5482e65375a989d1373ffeccbf462d9afc057b83..c43081039dd571ab3992628830d5cd171a3d23fd 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/moduleloader.h>
 #include <linux/elf.h>
 #include <linux/vmalloc.h>
+#include <linux/bug.h>
 #include <linux/fs.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
@@ -36,7 +37,8 @@ void *module_alloc(unsigned long size)
 {
        if (size == 0)
                return NULL;
-       return vmalloc(size);
+
+       return vmalloc_exec(size);
 }
 
 
@@ -145,9 +147,10 @@ int module_finalize(const Elf_Ehdr *hdr,
                    const Elf_Shdr *sechdrs,
                    struct module *me)
 {
-       return 0;
+       return module_bug_finalize(hdr, sechdrs, me);
 }
 
 void module_arch_cleanup(struct module *mod)
 {
+       module_bug_cleanup(mod);
 }
index 2bc72def5cf87d00e66b6d068019b1ade4cf33a5..035cb300d3dcf245b894e86ac39931cbdeee696f 100644 (file)
@@ -20,6 +20,8 @@
 #include <linux/signal.h>
 #include <linux/io.h>
 #include <linux/audit.h>
+#include <linux/seccomp.h>
+#include <linux/tracehook.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 #include <asm/system.h>
@@ -57,7 +59,23 @@ static inline int put_stack_long(struct task_struct *task, int offset,
        return 0;
 }
 
-static void ptrace_disable_singlestep(struct task_struct *child)
+void user_enable_single_step(struct task_struct *child)
+{
+       struct pt_regs *regs = task_pt_regs(child);
+       long pc;
+
+       pc = get_stack_long(child, (long)&regs->pc);
+
+       /* Next scheduling will set up UBC */
+       if (child->thread.ubc_pc == 0)
+               ubc_usercnt += 1;
+
+       child->thread.ubc_pc = pc;
+
+       set_tsk_thread_flag(child, TIF_SINGLESTEP);
+}
+
+void user_disable_single_step(struct task_struct *child)
 {
        clear_tsk_thread_flag(child, TIF_SINGLESTEP);
 
@@ -81,7 +99,7 @@ static void ptrace_disable_singlestep(struct task_struct *child)
  */
 void ptrace_disable(struct task_struct *child)
 {
-       ptrace_disable_singlestep(child);
+       user_disable_single_step(child);
 }
 
 long arch_ptrace(struct task_struct *child, long request, long addr, long data)
@@ -90,12 +108,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
        int ret;
 
        switch (request) {
-       /* when I and D space are separate, these will need to be fixed. */
-       case PTRACE_PEEKTEXT: /* read word at location addr. */
-       case PTRACE_PEEKDATA:
-               ret = generic_ptrace_peekdata(child, addr, data);
-               break;
-
        /* read the word at location addr in the USER area. */
        case PTRACE_PEEKUSR: {
                unsigned long tmp;
@@ -125,12 +137,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                break;
        }
 
-       /* when I and D space are separate, this will have to be fixed. */
-       case PTRACE_POKETEXT: /* write the word at location addr. */
-       case PTRACE_POKEDATA:
-               ret = generic_ptrace_pokedata(child, addr, data);
-               break;
-
        case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
                ret = -EIO;
                if ((addr & 3) || addr < 0 ||
@@ -151,67 +157,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                }
                break;
 
-       case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
-       case PTRACE_CONT: { /* restart after signal. */
-               ret = -EIO;
-               if (!valid_signal(data))
-                       break;
-               if (request == PTRACE_SYSCALL)
-                       set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               else
-                       clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-
-               ptrace_disable_singlestep(child);
-
-               child->exit_code = data;
-               wake_up_process(child);
-               ret = 0;
-               break;
-       }
-
-/*
- * make the child exit.  Best I can do is send it a sigkill.
- * perhaps it should be put in the status that it wants to
- * exit.
- */
-       case PTRACE_KILL: {
-               ret = 0;
-               if (child->exit_state == EXIT_ZOMBIE)   /* already dead */
-                       break;
-               ptrace_disable_singlestep(child);
-               child->exit_code = SIGKILL;
-               wake_up_process(child);
-               break;
-       }
-
-       case PTRACE_SINGLESTEP: {  /* set the trap flag. */
-               long pc;
-               struct pt_regs *regs = NULL;
-
-               ret = -EIO;
-               if (!valid_signal(data))
-                       break;
-               clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               if ((child->ptrace & PT_DTRACE) == 0) {
-                       /* Spurious delayed TF traps may occur */
-                       child->ptrace |= PT_DTRACE;
-               }
-
-               pc = get_stack_long(child, (long)&regs->pc);
-
-               /* Next scheduling will set up UBC */
-               if (child->thread.ubc_pc == 0)
-                       ubc_usercnt += 1;
-               child->thread.ubc_pc = pc;
-
-               set_tsk_thread_flag(child, TIF_SINGLESTEP);
-               child->exit_code = data;
-               /* give it a chance to run. */
-               wake_up_process(child);
-               ret = 0;
-               break;
-       }
-
 #ifdef CONFIG_SH_DSP
        case PTRACE_GETDSPREGS: {
                unsigned long dp;
@@ -272,39 +217,49 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
        return ret;
 }
 
-asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
+static inline int audit_arch(void)
 {
-       struct task_struct *tsk = current;
+       int arch = EM_SH;
 
-       if (unlikely(current->audit_context) && entryexit)
-               audit_syscall_exit(AUDITSC_RESULT(regs->regs[0]),
-                                  regs->regs[0]);
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
+       arch |= __AUDIT_ARCH_LE;
+#endif
 
-       if (!test_thread_flag(TIF_SYSCALL_TRACE) &&
-           !test_thread_flag(TIF_SINGLESTEP))
-               goto out;
-       if (!(tsk->ptrace & PT_PTRACED))
-               goto out;
+       return arch;
+}
 
-       /* the 0x80 provides a way for the tracing parent to distinguish
-          between a syscall stop and SIGTRAP delivery */
-       ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) &&
-                                !test_thread_flag(TIF_SINGLESTEP) ? 0x80 : 0));
+asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)
+{
+       long ret = 0;
 
-       /*
-        * this isn't the same as continuing with a signal, but it will do
-        * for normal use.  strace only continues with a signal if the
-        * stopping signal is not SIGTRAP.  -brl
-        */
-       if (tsk->exit_code) {
-               send_sig(tsk->exit_code, tsk, 1);
-               tsk->exit_code = 0;
-       }
+       secure_computing(regs->regs[0]);
+
+       if (test_thread_flag(TIF_SYSCALL_TRACE) &&
+           tracehook_report_syscall_entry(regs))
+               /*
+                * Tracing decided this syscall should not happen.
+                * We'll return a bogus call number to get an ENOSYS
+                * error, but leave the original number in regs->regs[0].
+                */
+               ret = -1L;
 
-out:
-       if (unlikely(current->audit_context) && !entryexit)
-               audit_syscall_entry(AUDIT_ARCH_SH, regs->regs[3],
+       if (unlikely(current->audit_context))
+               audit_syscall_entry(audit_arch(), regs->regs[3],
                                    regs->regs[4], regs->regs[5],
                                    regs->regs[6], regs->regs[7]);
 
+       return ret ?: regs->regs[0];
+}
+
+asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)
+{
+       int step;
+
+       if (unlikely(current->audit_context))
+               audit_syscall_exit(AUDITSC_RESULT(regs->regs[0]),
+                                  regs->regs[0]);
+
+       step = test_thread_flag(TIF_SINGLESTEP);
+       if (step || test_thread_flag(TIF_SYSCALL_TRACE))
+               tracehook_report_syscall_exit(regs, step);
 }
index d453c47dc522176a75821903084b566ae7105dfc..5922edd416dbc2b049063d58248fc75132a25fb8 100644 (file)
@@ -27,6 +27,8 @@
 #include <linux/signal.h>
 #include <linux/syscalls.h>
 #include <linux/audit.h>
+#include <linux/seccomp.h>
+#include <linux/tracehook.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -120,18 +122,23 @@ put_fpu_long(struct task_struct *task, unsigned long addr, unsigned long data)
        return 0;
 }
 
+void user_enable_single_step(struct task_struct *child)
+{
+       struct pt_regs *regs = child->thread.uregs;
+
+       regs->sr |= SR_SSTEP;   /* auto-resetting upon exception */
+}
+
+void user_disable_single_step(struct task_struct *child)
+{
+       regs->sr &= ~SR_SSTEP;
+}
 
 long arch_ptrace(struct task_struct *child, long request, long addr, long data)
 {
        int ret;
 
        switch (request) {
-       /* when I and D space are separate, these will need to be fixed. */
-       case PTRACE_PEEKTEXT: /* read word at location addr. */
-       case PTRACE_PEEKDATA:
-               ret = generic_ptrace_peekdata(child, addr, data);
-               break;
-
        /* read the word at location addr in the USER area. */
        case PTRACE_PEEKUSR: {
                unsigned long tmp;
@@ -154,12 +161,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                break;
        }
 
-       /* when I and D space are separate, this will have to be fixed. */
-       case PTRACE_POKETEXT: /* write the word at location addr. */
-       case PTRACE_POKEDATA:
-               ret = generic_ptrace_pokedata(child, addr, data);
-               break;
-
        case PTRACE_POKEUSR:
                 /* write the word at location addr in the USER area. We must
                    disallow any changes to certain SR bits or u_fpvalid, since
@@ -191,58 +192,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                }
                break;
 
-       case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
-       case PTRACE_CONT: { /* restart after signal. */
-               ret = -EIO;
-               if (!valid_signal(data))
-                       break;
-               if (request == PTRACE_SYSCALL)
-                       set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               else
-                       clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               child->exit_code = data;
-               wake_up_process(child);
-               ret = 0;
-               break;
-       }
-
-/*
- * make the child exit.  Best I can do is send it a sigkill.
- * perhaps it should be put in the status that it wants to
- * exit.
- */
-       case PTRACE_KILL: {
-               ret = 0;
-               if (child->exit_state == EXIT_ZOMBIE)   /* already dead */
-                       break;
-               child->exit_code = SIGKILL;
-               wake_up_process(child);
-               break;
-       }
-
-       case PTRACE_SINGLESTEP: {  /* set the trap flag. */
-               struct pt_regs *regs;
-
-               ret = -EIO;
-               if (!valid_signal(data))
-                       break;
-               clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               if ((child->ptrace & PT_DTRACE) == 0) {
-                       /* Spurious delayed TF traps may occur */
-                       child->ptrace |= PT_DTRACE;
-               }
-
-               regs = child->thread.uregs;
-
-               regs->sr |= SR_SSTEP;   /* auto-resetting upon exception */
-
-               child->exit_code = data;
-               /* give it a chance to run. */
-               wake_up_process(child);
-               ret = 0;
-               break;
-       }
-
        default:
                ret = ptrace_request(child, request, addr, data);
                break;
@@ -273,38 +222,51 @@ asmlinkage int sh64_ptrace(long request, long pid, long addr, long data)
        return sys_ptrace(request, pid, addr, data);
 }
 
-asmlinkage void syscall_trace(struct pt_regs *regs, int entryexit)
+static inline int audit_arch(void)
 {
-       struct task_struct *tsk = current;
+       int arch = EM_SH;
 
-       if (unlikely(current->audit_context) && entryexit)
-               audit_syscall_exit(AUDITSC_RESULT(regs->regs[9]),
-                                  regs->regs[9]);
+#ifdef CONFIG_64BIT
+       arch |= __AUDIT_ARCH_64BIT;
+#endif
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
+       arch |= __AUDIT_ARCH_LE;
+#endif
 
-       if (!test_thread_flag(TIF_SYSCALL_TRACE) &&
-           !test_thread_flag(TIF_SINGLESTEP))
-               goto out;
-       if (!(tsk->ptrace & PT_PTRACED))
-               goto out;
-
-       ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) &&
-                               !test_thread_flag(TIF_SINGLESTEP) ? 0x80 : 0));
-
-       /*
-        * this isn't the same as continuing with a signal, but it will do
-        * for normal use.  strace only continues with a signal if the
-        * stopping signal is not SIGTRAP.  -brl
-        */
-       if (tsk->exit_code) {
-               send_sig(tsk->exit_code, tsk, 1);
-               tsk->exit_code = 0;
-       }
+       return arch;
+}
 
-out:
-       if (unlikely(current->audit_context) && !entryexit)
-               audit_syscall_entry(AUDIT_ARCH_SH, regs->regs[1],
+asmlinkage long long do_syscall_trace_enter(struct pt_regs *regs)
+{
+       long long ret = 0;
+
+       secure_computing(regs->regs[9]);
+
+       if (test_thread_flag(TIF_SYSCALL_TRACE) &&
+           tracehook_report_syscall_entry(regs))
+               /*
+                * Tracing decided this syscall should not happen.
+                * We'll return a bogus call number to get an ENOSYS
+                * error, but leave the original number in regs->regs[0].
+                */
+               ret = -1LL;
+
+       if (unlikely(current->audit_context))
+               audit_syscall_entry(audit_arch(), regs->regs[1],
                                    regs->regs[2], regs->regs[3],
                                    regs->regs[4], regs->regs[5]);
+
+       return ret ?: regs->regs[9];
+}
+
+asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)
+{
+       if (unlikely(current->audit_context))
+               audit_syscall_exit(AUDITSC_RESULT(regs->regs[9]),
+                                  regs->regs[9]);
+
+       if (test_thread_flag(TIF_SYSCALL_TRACE))
+               tracehook_report_syscall_exit(regs, 0);
 }
 
 /* Called with interrupts disabled */
@@ -338,5 +300,5 @@ asmlinkage void do_software_break_point(unsigned long long vec,
  */
 void ptrace_disable(struct task_struct *child)
 {
-        /* nothing to do.. */
+       user_disable_single_step(child);
 }
index 6339d0c9571557c481613bc7d06f7adee9fa6140..a35207655e7b64fba60f4dee70a2fc682b716932 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/smp.h>
 #include <linux/err.h>
 #include <linux/debugfs.h>
+#include <linux/crash_dump.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <asm/page.h>
@@ -286,6 +287,25 @@ static void __init setup_memory(void)
 extern void __init setup_memory(void);
 #endif
 
+/*
+ * Note: elfcorehdr_addr is not just limited to vmcore. It is also used by
+ * is_kdump_kernel() to determine if we are booting after a panic. Hence
+ * ifdef it under CONFIG_CRASH_DUMP and not CONFIG_PROC_VMCORE.
+ */
+#ifdef CONFIG_CRASH_DUMP
+/* elfcorehdr= specifies the location of elf core header
+ * stored by the crashed kernel.
+ */
+static int __init parse_elfcorehdr(char *arg)
+{
+       if (!arg)
+               return -EINVAL;
+       elfcorehdr_addr = memparse(arg, &arg);
+       return 0;
+}
+early_param("elfcorehdr", parse_elfcorehdr);
+#endif
+
 void __init setup_arch(char **cmdline_p)
 {
        enable_mmu();
index 4bbbde895a5353c41e7ecacd6cf019545c8e8202..51689d29ad45d331aa7c42b9ca4c301afafabdb6 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/binfmts.h>
 #include <linux/freezer.h>
 #include <linux/io.h>
+#include <linux/tracehook.h>
 #include <asm/system.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
@@ -507,14 +508,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
                switch (regs->regs[0]) {
                        case -ERESTART_RESTARTBLOCK:
                        case -ERESTARTNOHAND:
+                       no_system_call_restart:
                                regs->regs[0] = -EINTR;
                                break;
 
                        case -ERESTARTSYS:
-                               if (!(ka->sa.sa_flags & SA_RESTART)) {
-                                       regs->regs[0] = -EINTR;
-                                       break;
-                               }
+                               if (!(ka->sa.sa_flags & SA_RESTART))
+                                       goto no_system_call_restart;
                        /* fallthrough */
                        case -ERESTARTNOINTR:
                                regs->regs[0] = save_r0;
@@ -589,12 +589,15 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0)
                         * clear the TIF_RESTORE_SIGMASK flag */
                        if (test_thread_flag(TIF_RESTORE_SIGMASK))
                                clear_thread_flag(TIF_RESTORE_SIGMASK);
+
+                       tracehook_signal_handler(signr, &info, &ka, regs,
+                                       test_thread_flag(TIF_SINGLESTEP));
                }
 
                return;
        }
 
- no_signal:
+no_signal:
        /* Did we come from a system call? */
        if (regs->tra >= 0) {
                /* Restart the system call - no handlers present */
@@ -618,9 +621,14 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0)
 }
 
 asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned int save_r0,
-                                __u32 thread_info_flags)
+                                unsigned long thread_info_flags)
 {
        /* deal with pending signal delivery */
-       if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
+       if (thread_info_flags & _TIF_SIGPENDING)
                do_signal(regs, save_r0);
+
+       if (thread_info_flags & _TIF_NOTIFY_RESUME) {
+               clear_thread_flag(TIF_NOTIFY_RESUME);
+               tracehook_notify_resume(regs);
+       }
 }
index 552eb810cd85e6c9199b5558d567f292eacbad20..1d62dfef77f1df57d4c2b555e0a7d64a16052f8d 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/ptrace.h>
 #include <linux/unistd.h>
 #include <linux/stddef.h>
+#include <linux/tracehook.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
-asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset);
+/*
+ * Note that 'init' is a special process: it doesn't get signals it doesn't
+ * want to handle. Thus you cannot kill init even with a SIGKILL even by
+ * mistake.
+ *
+ * Note that we go through the signals twice: once to check the signals that
+ * the kernel can handle, and then we build all the user-level signal handling
+ * stack-frames in one go after that.
+ */
+static int do_signal(struct pt_regs *regs, sigset_t *oldset)
+{
+       siginfo_t info;
+       int signr;
+       struct k_sigaction ka;
+
+       /*
+        * We want the common case to go fast, which
+        * is why we may in certain cases get here from
+        * kernel mode. Just return without doing anything
+        * if so.
+        */
+       if (!user_mode(regs))
+               return 1;
+
+       if (try_to_freeze())
+               goto no_signal;
+
+       if (test_thread_flag(TIF_RESTORE_SIGMASK))
+               oldset = &current->saved_sigmask;
+       else if (!oldset)
+               oldset = &current->blocked;
+
+       signr = get_signal_to_deliver(&info, &ka, regs, 0);
+
+       if (signr > 0) {
+               /* Whee!  Actually deliver the signal.  */
+               handle_signal(signr, &info, &ka, oldset, regs);
+
+               /*
+                * If a signal was successfully delivered, the saved sigmask
+                * is in its frame, and we can clear the TIF_RESTORE_SIGMASK
+                * flag.
+                */
+               if (test_thread_flag(TIF_RESTORE_SIGMASK))
+                       clear_thread_flag(TIF_RESTORE_SIGMASK);
+
+               tracehook_signal_handler(signr, &info, &ka, regs, 0);
+               return 1;
+       }
+
+no_signal:
+       /* Did we come from a system call? */
+       if (regs->syscall_nr >= 0) {
+               /* Restart the system call - no handlers present */
+               switch (regs->regs[REG_RET]) {
+               case -ERESTARTNOHAND:
+               case -ERESTARTSYS:
+               case -ERESTARTNOINTR:
+                       /* Decode Syscall # */
+                       regs->regs[REG_RET] = regs->syscall_nr;
+                       regs->pc -= 4;
+                       break;
+
+               case -ERESTART_RESTARTBLOCK:
+                       regs->regs[REG_RET] = __NR_restart_syscall;
+                       regs->pc -= 4;
+                       break;
+               }
+       }
+
+       /* No signal to deliver -- put the saved sigmask back */
+       if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
+               clear_thread_flag(TIF_RESTORE_SIGMASK);
+               sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
+       }
+
+       return 0;
+}
 
 /*
  * Atomically swap in the new signal mask, and wait for a signal.
@@ -643,14 +721,13 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
                switch (regs->regs[REG_RET]) {
                        case -ERESTART_RESTARTBLOCK:
                        case -ERESTARTNOHAND:
+                       no_system_call_restart:
                                regs->regs[REG_RET] = -EINTR;
                                break;
 
                        case -ERESTARTSYS:
-                               if (!(ka->sa.sa_flags & SA_RESTART)) {
-                                       regs->regs[REG_RET] = -EINTR;
-                                       break;
-                               }
+                               if (!(ka->sa.sa_flags & SA_RESTART))
+                                       goto no_system_call_restart;
                        /* fallthrough */
                        case -ERESTARTNOINTR:
                                /* Decode syscall # */
@@ -673,80 +750,13 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
        spin_unlock_irq(&current->sighand->siglock);
 }
 
-/*
- * Note that 'init' is a special process: it doesn't get signals it doesn't
- * want to handle. Thus you cannot kill init even with a SIGKILL even by
- * mistake.
- *
- * Note that we go through the signals twice: once to check the signals that
- * the kernel can handle, and then we build all the user-level signal handling
- * stack-frames in one go after that.
- */
-int do_signal(struct pt_regs *regs, sigset_t *oldset)
+asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
 {
-       siginfo_t info;
-       int signr;
-       struct k_sigaction ka;
-
-       /*
-        * We want the common case to go fast, which
-        * is why we may in certain cases get here from
-        * kernel mode. Just return without doing anything
-        * if so.
-        */
-       if (!user_mode(regs))
-               return 1;
-
-       if (try_to_freeze())
-               goto no_signal;
-
-       if (test_thread_flag(TIF_RESTORE_SIGMASK))
-               oldset = &current->saved_sigmask;
-       else if (!oldset)
-               oldset = &current->blocked;
-
-       signr = get_signal_to_deliver(&info, &ka, regs, 0);
-
-       if (signr > 0) {
-               /* Whee!  Actually deliver the signal.  */
-               handle_signal(signr, &info, &ka, oldset, regs);
+       if (thread_info_flags & _TIF_SIGPENDING)
+               do_signal(regs, 0);
 
-               /*
-                * If a signal was successfully delivered, the saved sigmask
-                * is in its frame, and we can clear the TIF_RESTORE_SIGMASK
-                * flag.
-                */
-               if (test_thread_flag(TIF_RESTORE_SIGMASK))
-                       clear_thread_flag(TIF_RESTORE_SIGMASK);
-
-               return 1;
+       if (thread_info_flags & _TIF_NOTIFY_RESUME) {
+               clear_thread_flag(TIF_NOTIFY_RESUME);
+               tracehook_notify_resume(regs);
        }
-
-no_signal:
-       /* Did we come from a system call? */
-       if (regs->syscall_nr >= 0) {
-               /* Restart the system call - no handlers present */
-               switch (regs->regs[REG_RET]) {
-               case -ERESTARTNOHAND:
-               case -ERESTARTSYS:
-               case -ERESTARTNOINTR:
-                       /* Decode Syscall # */
-                       regs->regs[REG_RET] = regs->syscall_nr;
-                       regs->pc -= 4;
-                       break;
-
-               case -ERESTART_RESTARTBLOCK:
-                       regs->regs[REG_RET] = __NR_restart_syscall;
-                       regs->pc -= 4;
-                       break;
-               }
-       }
-
-       /* No signal to deliver -- put the saved sigmask back */
-       if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
-               clear_thread_flag(TIF_RESTORE_SIGMASK);
-               sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
-       }
-
-       return 0;
 }
index 56d0a7daa34ba61e45fdcff6e4b9fddf51f902ef..9c131cac91a4e45a54a7233d430c72a5490f1c7e 100644 (file)
@@ -237,7 +237,6 @@ choice
 
 config CACHE_WRITEBACK
        bool "Write-back"
-       depends on CPU_SH2A || CPU_SH3 || CPU_SH4 || CPU_SH5
 
 config CACHE_WRITETHROUGH
        bool "Write-through"
index e295db60b91bd2597b28b260e4a8263e42fcb3c7..70e0906023ccc80282d11f2264176c0fa34e907f 100644 (file)
@@ -5,12 +5,15 @@
 obj-y                  := init.o extable_32.o consistent.o
 
 ifndef CONFIG_CACHE_OFF
-obj-$(CONFIG_CPU_SH2)          += cache-sh2.o
-obj-$(CONFIG_CPU_SH3)          += cache-sh3.o
-obj-$(CONFIG_CPU_SH4)          += cache-sh4.o
-obj-$(CONFIG_SH7705_CACHE_32KB)        += cache-sh7705.o
+cache-$(CONFIG_CPU_SH2)                := cache-sh2.o
+cache-$(CONFIG_CPU_SH2A)       := cache-sh2a.o
+cache-$(CONFIG_CPU_SH3)                := cache-sh3.o
+cache-$(CONFIG_CPU_SH4)                := cache-sh4.o
+cache-$(CONFIG_SH7705_CACHE_32KB)      += cache-sh7705.o
 endif
 
+obj-y                  += $(cache-y)
+
 mmu-y                  := tlb-nommu.o pg-nommu.o
 mmu-$(CONFIG_MMU)      := fault_32.o tlbflush_32.o ioremap_32.o
 
index 6614033f6be93133a419f262d9091536cc05492e..c4e80d2b764bee59086679e9f6af7111c3842e98 100644 (file)
@@ -2,6 +2,7 @@
  * arch/sh/mm/cache-sh2.c
  *
  * Copyright (C) 2002 Paul Mundt
+ * Copyright (C) 2008 Yoshinori Sato
  *
  * Released under the terms of the GNU GPL v2.0.
  */
@@ -24,8 +25,15 @@ void __flush_wback_region(void *start, int size)
        end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
                & ~(L1_CACHE_BYTES-1);
        for (v = begin; v < end; v+=L1_CACHE_BYTES) {
-               /* FIXME cache purge */
-               ctrl_outl((v & 0x1ffffc00), (v & 0x00000ff0) | 0x00000008);
+               unsigned long addr = CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0);
+               int way;
+               for (way = 0; way < 4; way++) {
+                       unsigned long data =  ctrl_inl(addr | (way << 12));
+                       if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) {
+                               data &= ~SH_CACHE_UPDATED;
+                               ctrl_outl(data, addr | (way << 12));
+                       }
+               }
        }
 }
 
@@ -37,21 +45,40 @@ void __flush_purge_region(void *start, int size)
        begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
        end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
                & ~(L1_CACHE_BYTES-1);
-       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
-               ctrl_outl((v & 0x1ffffc00), (v & 0x00000ff0) | 0x00000008);
-       }
+
+       for (v = begin; v < end; v+=L1_CACHE_BYTES)
+               ctrl_outl((v & CACHE_PHYSADDR_MASK),
+                         CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0) | 0x00000008);
 }
 
 void __flush_invalidate_region(void *start, int size)
 {
+#ifdef CONFIG_CACHE_WRITEBACK
+       /*
+        * SH-2 does not support individual line invalidation, only a
+        * global invalidate.
+        */
+       unsigned long ccr;
+       unsigned long flags;
+       local_irq_save(flags);
+       jump_to_uncached();
+
+       ccr = ctrl_inl(CCR);
+       ccr |= CCR_CACHE_INVALIDATE;
+       ctrl_outl(ccr, CCR);
+
+       back_to_cached();
+       local_irq_restore(flags);
+#else
        unsigned long v;
        unsigned long begin, end;
 
        begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
        end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
                & ~(L1_CACHE_BYTES-1);
-       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
-               ctrl_outl((v & 0x1ffffc00), (v & 0x00000ff0) | 0x00000008);
-       }
-}
 
+       for (v = begin; v < end; v+=L1_CACHE_BYTES)
+               ctrl_outl((v & CACHE_PHYSADDR_MASK),
+                         CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0) | 0x00000008);
+#endif
+}
diff --git a/arch/sh/mm/cache-sh2a.c b/arch/sh/mm/cache-sh2a.c
new file mode 100644 (file)
index 0000000..62c0c5f
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * arch/sh/mm/cache-sh2a.c
+ *
+ * Copyright (C) 2008 Yoshinori Sato
+ *
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <linux/init.h>
+#include <linux/mm.h>
+
+#include <asm/cache.h>
+#include <asm/addrspace.h>
+#include <asm/processor.h>
+#include <asm/cacheflush.h>
+#include <asm/io.h>
+
+void __flush_wback_region(void *start, int size)
+{
+       unsigned long v;
+       unsigned long begin, end;
+       unsigned long flags;
+
+       begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
+       end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
+               & ~(L1_CACHE_BYTES-1);
+
+       local_irq_save(flags);
+       jump_to_uncached();
+
+       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
+               unsigned long addr = CACHE_OC_ADDRESS_ARRAY | (v & 0x000007f0);
+               int way;
+               for (way = 0; way < 4; way++) {
+                       unsigned long data =  ctrl_inl(addr | (way << 11));
+                       if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) {
+                               data &= ~SH_CACHE_UPDATED;
+                               ctrl_outl(data, addr | (way << 11));
+                       }
+               }
+       }
+
+       back_to_cached();
+       local_irq_restore(flags);
+}
+
+void __flush_purge_region(void *start, int size)
+{
+       unsigned long v;
+       unsigned long begin, end;
+       unsigned long flags;
+
+       begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
+       end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
+               & ~(L1_CACHE_BYTES-1);
+
+       local_irq_save(flags);
+       jump_to_uncached();
+
+       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
+               ctrl_outl((v & CACHE_PHYSADDR_MASK),
+                         CACHE_OC_ADDRESS_ARRAY | (v & 0x000003f0) | 0x00000008);
+       }
+       back_to_cached();
+       local_irq_restore(flags);
+}
+
+void __flush_invalidate_region(void *start, int size)
+{
+       unsigned long v;
+       unsigned long begin, end;
+       unsigned long flags;
+
+       begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
+       end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
+               & ~(L1_CACHE_BYTES-1);
+       local_irq_save(flags);
+       jump_to_uncached();
+
+#ifdef CONFIG_CACHE_WRITEBACK
+       ctrl_outl(ctrl_inl(CCR) | CCR_OCACHE_INVALIDATE, CCR);
+       /* I-cache invalidate */
+       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
+               ctrl_outl((v & CACHE_PHYSADDR_MASK),
+                         CACHE_IC_ADDRESS_ARRAY | (v & 0x000003f0) | 0x00000008);
+       }
+#else
+       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
+               ctrl_outl((v & CACHE_PHYSADDR_MASK),
+                         CACHE_IC_ADDRESS_ARRAY | (v & 0x000003f0) | 0x00000008);
+               ctrl_outl((v & CACHE_PHYSADDR_MASK),
+                         CACHE_OC_ADDRESS_ARRAY | (v & 0x000003f0) | 0x00000008);
+       }
+#endif
+       back_to_cached();
+       local_irq_restore(flags);
+}
+
+/* WBack O-Cache and flush I-Cache */
+void flush_icache_range(unsigned long start, unsigned long end)
+{
+       unsigned long v;
+       unsigned long flags;
+
+       start = start & ~(L1_CACHE_BYTES-1);
+       end = (end + L1_CACHE_BYTES-1) & ~(L1_CACHE_BYTES-1);
+
+       local_irq_save(flags);
+       jump_to_uncached();
+
+       for (v = start; v < end; v+=L1_CACHE_BYTES) {
+               unsigned long addr = (v & 0x000007f0);
+               int way;
+               /* O-Cache writeback */
+               for (way = 0; way < 4; way++) {
+                       unsigned long data =  ctrl_inl(CACHE_OC_ADDRESS_ARRAY | addr | (way << 11));
+                       if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) {
+                               data &= ~SH_CACHE_UPDATED;
+                               ctrl_outl(data, CACHE_OC_ADDRESS_ARRAY | addr | (way << 11));
+                       }
+               }
+               /* I-Cache invalidate */
+               ctrl_outl(addr,
+                         CACHE_IC_ADDRESS_ARRAY | addr | 0x00000008);
+       }
+
+       back_to_cached();
+       local_irq_restore(flags);
+}
index f34274a1ded3930b4a89b09db834220278d063c6..dae131243bcc07f478b3bcb0cc8e6fbc2c65d65a 100644 (file)
@@ -15,9 +15,7 @@
 #include <asm/mmu_context.h>
 
 /**
- * sh64_tlb_init
- *
- * Perform initial setup for the DTLB and ITLB.
+ * sh64_tlb_init - Perform initial setup for the DTLB and ITLB.
  */
 int __init sh64_tlb_init(void)
 {
@@ -46,9 +44,7 @@ int __init sh64_tlb_init(void)
 }
 
 /**
- * sh64_next_free_dtlb_entry
- *
- * Find the next available DTLB entry
+ * sh64_next_free_dtlb_entry - Find the next available DTLB entry
  */
 unsigned long long sh64_next_free_dtlb_entry(void)
 {
@@ -56,9 +52,7 @@ unsigned long long sh64_next_free_dtlb_entry(void)
 }
 
 /**
- * sh64_get_wired_dtlb_entry
- *
- * Allocate a wired (locked-in) entry in the DTLB
+ * sh64_get_wired_dtlb_entry - Allocate a wired (locked-in) entry in the DTLB
  */
 unsigned long long sh64_get_wired_dtlb_entry(void)
 {
@@ -71,12 +65,10 @@ unsigned long long sh64_get_wired_dtlb_entry(void)
 }
 
 /**
- * sh64_put_wired_dtlb_entry
+ * sh64_put_wired_dtlb_entry - Free a wired (locked-in) entry in the DTLB.
  *
  * @entry:     Address of TLB slot.
  *
- * Free a wired (locked-in) entry in the DTLB.
- *
  * Works like a stack, last one to allocate must be first one to free.
  */
 int sh64_put_wired_dtlb_entry(unsigned long long entry)
@@ -115,7 +107,7 @@ int sh64_put_wired_dtlb_entry(unsigned long long entry)
 }
 
 /**
- * sh64_setup_tlb_slot
+ * sh64_setup_tlb_slot - Load up a translation in a wired slot.
  *
  * @config_addr:       Address of TLB slot.
  * @eaddr:             Virtual address.
@@ -154,7 +146,7 @@ inline void sh64_setup_tlb_slot(unsigned long long config_addr,
 }
 
 /**
- * sh64_teardown_tlb_slot
+ * sh64_teardown_tlb_slot - Teardown a translation.
  *
  * @config_addr:       Address of TLB slot.
  *
index b5d202be82063efa6b0c25f667721001d4619358..567516b58acca40ff99ada5fd9bd1bd100b91496 100644 (file)
@@ -10,7 +10,7 @@
 # Shamelessly cloned from ARM.
 #
 
-arch/sh/include/asm/machtypes.h: $(src)/gen-mach-types $(src)/mach-types
+include/asm-sh/machtypes.h: $(src)/gen-mach-types $(src)/mach-types
        @echo '  Generating $@'
-       $(Q)if [ ! -d arch/sh/include/asm ]; then mkdir -p arch/sh/include/asm; fi
+       $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi
        $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
index d8378935ae90918149a3099b46b38e11f5aa7d42..47f95839dc6956e190cd1175cb50b74491dcab00 100644 (file)
@@ -59,7 +59,7 @@ static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
                __futex_cas_op("or\t%2, %4, %1", ret, oldval, uaddr, oparg);
                break;
        case FUTEX_OP_ANDN:
-               __futex_cas_op("and\t%2, %4, %1", ret, oldval, uaddr, oparg);
+               __futex_cas_op("andn\t%2, %4, %1", ret, oldval, uaddr, oparg);
                break;
        case FUTEX_OP_XOR:
                __futex_cas_op("xor\t%2, %4, %1", ret, oldval, uaddr, oparg);
index 0bb9bf531745e8caf587135f3cf3063f31d24a4c..3473e25231d96e3fe63a0227cf3103d409074cf4 100644 (file)
@@ -90,4 +90,7 @@ static inline unsigned long get_softint(void)
        return retval;
 }
 
+void __trigger_all_cpu_backtrace(void);
+#define trigger_all_cpu_backtrace() __trigger_all_cpu_backtrace()
+
 #endif
index aa699775ffba8c9dd40b56465d725f6aba224fb1..93a262c44022d25f90561e946dcaba714584d2d0 100644 (file)
@@ -1,8 +1,24 @@
 #ifndef ___ASM_SPARC_OF_PLATFORM_H
 #define ___ASM_SPARC_OF_PLATFORM_H
-#if defined(__sparc__) && defined(__arch64__)
-#include <asm/of_platform_64.h>
-#else
-#include <asm/of_platform_32.h>
-#endif
+/*
+ *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
+ *                      <benh@kernel.crashing.org>
+ *    Modified for Sparc by merging parts of asm/of_device.h
+ *             by Stephen Rothwell
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version
+ *  2 of the License, or (at your option) any later version.
+ *
+ */
+
+/* This is just here during the transition */
+#include <linux/of_platform.h>
+
+extern struct bus_type ebus_bus_type;
+extern struct bus_type sbus_bus_type;
+
+#define of_bus_type    of_platform_bus_type    /* for compatibility */
+
 #endif
diff --git a/arch/sparc/include/asm/of_platform_32.h b/arch/sparc/include/asm/of_platform_32.h
deleted file mode 100644 (file)
index 723f7c9..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef _ASM_SPARC_OF_PLATFORM_H
-#define _ASM_SPARC_OF_PLATFORM_H
-/*
- *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
- *                      <benh@kernel.crashing.org>
- *    Modified for Sparc by merging parts of asm/of_device.h
- *             by Stephen Rothwell
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version
- *  2 of the License, or (at your option) any later version.
- *
- */
-
-/* This is just here during the transition */
-#include <linux/of_platform.h>
-
-extern struct bus_type ebus_bus_type;
-extern struct bus_type sbus_bus_type;
-
-#define of_bus_type    of_platform_bus_type    /* for compatibility */
-
-#endif /* _ASM_SPARC_OF_PLATFORM_H */
diff --git a/arch/sparc/include/asm/of_platform_64.h b/arch/sparc/include/asm/of_platform_64.h
deleted file mode 100644 (file)
index 4f66a5f..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef _ASM_SPARC64_OF_PLATFORM_H
-#define _ASM_SPARC64_OF_PLATFORM_H
-/*
- *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
- *                      <benh@kernel.crashing.org>
- *    Modified for Sparc by merging parts of asm/of_device.h
- *             by Stephen Rothwell
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version
- *  2 of the License, or (at your option) any later version.
- *
- */
-
-/* This is just here during the transition */
-#include <linux/of_platform.h>
-
-extern struct bus_type isa_bus_type;
-extern struct bus_type ebus_bus_type;
-extern struct bus_type sbus_bus_type;
-
-#define of_bus_type    of_platform_bus_type    /* for compatibility */
-
-#endif /* _ASM_SPARC64_OF_PLATFORM_H */
index d43c88b86834d2fc08986b32e1191b4962bf0f9d..d409c4f21a5cdea420e75fef24a2ceec1cb0e834 100644 (file)
@@ -40,16 +40,6 @@ struct pt_regs {
 #define UREG_FP        UREG_I6
 #define UREG_RETPC     UREG_I7
 
-static inline bool pt_regs_is_syscall(struct pt_regs *regs)
-{
-       return (regs->psr & PSR_SYSCALL);
-}
-
-static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
-{
-       return (regs->psr &= ~PSR_SYSCALL);
-}
-
 /* A register window */
 struct reg_window {
        unsigned long locals[8];
@@ -72,6 +62,16 @@ struct sparc_stackf {
 
 #ifdef __KERNEL__
 
+static inline bool pt_regs_is_syscall(struct pt_regs *regs)
+{
+       return (regs->psr & PSR_SYSCALL);
+}
+
+static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
+{
+       return (regs->psr &= ~PSR_SYSCALL);
+}
+
 #define user_mode(regs) (!((regs)->psr & PSR_PS))
 #define instruction_pointer(regs) ((regs)->pc)
 #define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
index ec6d45c84cd0e4a0a0aa12cbc6e229b975d6f38e..06e4914c13f4100182ccd5aa5720d3247e4469fa 100644 (file)
@@ -37,21 +37,6 @@ struct pt_regs {
        unsigned int magic;
 };
 
-static inline int pt_regs_trap_type(struct pt_regs *regs)
-{
-       return regs->magic & 0x1ff;
-}
-
-static inline bool pt_regs_is_syscall(struct pt_regs *regs)
-{
-       return (regs->tstate & TSTATE_SYSCALL);
-}
-
-static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
-{
-       return (regs->tstate &= ~TSTATE_SYSCALL);
-}
-
 struct pt_regs32 {
        unsigned int psr;
        unsigned int pc;
@@ -128,15 +113,30 @@ struct sparc_trapf {
 
 #ifdef __KERNEL__
 
+static inline int pt_regs_trap_type(struct pt_regs *regs)
+{
+       return regs->magic & 0x1ff;
+}
+
+static inline bool pt_regs_is_syscall(struct pt_regs *regs)
+{
+       return (regs->tstate & TSTATE_SYSCALL);
+}
+
+static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
+{
+       return (regs->tstate &= ~TSTATE_SYSCALL);
+}
+
 struct global_reg_snapshot {
        unsigned long           tstate;
        unsigned long           tpc;
        unsigned long           tnpc;
        unsigned long           o7;
        unsigned long           i7;
+       unsigned long           rpc;
        struct thread_info      *thread;
        unsigned long           pad1;
-       unsigned long           pad2;
 };
 
 #define __ARCH_WANT_COMPAT_SYS_PTRACE
@@ -154,7 +154,6 @@ extern unsigned long profile_pc(struct pt_regs *);
 #define profile_pc(regs) instruction_pointer(regs)
 #endif
 extern void show_regs(struct pt_regs *);
-extern void __show_regs(struct pt_regs *);
 #endif
 
 #else /* __ASSEMBLY__ */
@@ -315,9 +314,9 @@ extern void __show_regs(struct pt_regs *);
 #define GR_SNAP_TNPC   0x10
 #define GR_SNAP_O7     0x18
 #define GR_SNAP_I7     0x20
-#define GR_SNAP_THREAD 0x28
-#define GR_SNAP_PAD1   0x30
-#define GR_SNAP_PAD2   0x38
+#define GR_SNAP_RPC    0x28
+#define GR_SNAP_THREAD 0x30
+#define GR_SNAP_PAD1   0x38
 
 #endif  /*  __KERNEL__  */
 
index c481673d249cb485dc1ceca3c02a073ebfc2aacc..ba43d85e8dded537cfeb4a23c510456e4f2c956f 100644 (file)
@@ -915,12 +915,18 @@ static void __init sun4v_init_mondo_queues(void)
                alloc_one_mondo(&tb->nonresum_mondo_pa, tb->nonresum_qmask);
                alloc_one_kbuf(&tb->nonresum_kernel_buf_pa,
                               tb->nonresum_qmask);
+       }
+}
+
+static void __init init_send_mondo_info(void)
+{
+       int cpu;
+
+       for_each_possible_cpu(cpu) {
+               struct trap_per_cpu *tb = &trap_block[cpu];
 
                init_cpu_send_mondo_info(tb);
        }
-
-       /* Load up the boot cpu's entries.  */
-       sun4v_register_mondo_queues(hard_smp_processor_id());
 }
 
 static struct irqaction timer_irq_action = {
@@ -949,6 +955,13 @@ void __init init_IRQ(void)
        if (tlb_type == hypervisor)
                sun4v_init_mondo_queues();
 
+       init_send_mondo_info();
+
+       if (tlb_type == hypervisor) {
+               /* Load up the boot cpu's entries.  */
+               sun4v_register_mondo_queues(hard_smp_processor_id());
+       }
+
        /* We need to clear any IRQ's pending in the soft interrupt
         * registers, a spurious one could be left around from the
         * PROM timer which we just disabled.
index 4fd48ab7dda40bef2a290e08cb07558122b3be35..f8b50cbf4bf711658ef3ad742270da424cbf4294 100644 (file)
@@ -56,9 +56,6 @@ struct of_device *of_find_device_by_node(struct device_node *dp)
 EXPORT_SYMBOL(of_find_device_by_node);
 
 #ifdef CONFIG_PCI
-struct bus_type isa_bus_type;
-EXPORT_SYMBOL(isa_bus_type);
-
 struct bus_type ebus_bus_type;
 EXPORT_SYMBOL(ebus_bus_type);
 #endif
@@ -841,8 +838,6 @@ static int __init of_bus_driver_init(void)
 
        err = of_bus_type_init(&of_platform_bus_type, "of");
 #ifdef CONFIG_PCI
-       if (!err)
-               err = of_bus_type_init(&isa_bus_type, "isa");
        if (!err)
                err = of_bus_type_init(&ebus_bus_type, "ebus");
 #endif
index 8a9cd3e165b9af46818a107b62470554ce8c80a7..7f5debdc5fed6ad2a4ae86b1ff78836efe8dce03 100644 (file)
@@ -52,8 +52,6 @@
 #include <asm/irq_regs.h>
 #include <asm/smp.h>
 
-/* #define VERBOSE_SHOWREGS */
-
 static void sparc64_yield(int cpu)
 {
        if (tlb_type != hypervisor)
@@ -213,22 +211,8 @@ static void show_regwindow(struct pt_regs *regs)
                printk("I7: <%pS>\n", (void *) rwk->ins[7]);
 }
 
-#ifdef CONFIG_SMP
-static DEFINE_SPINLOCK(regdump_lock);
-#endif
-
-void __show_regs(struct pt_regs * regs)
+void show_regs(struct pt_regs *regs)
 {
-#ifdef CONFIG_SMP
-       unsigned long flags;
-
-       /* Protect against xcall ipis which might lead to livelock on the lock */
-       __asm__ __volatile__("rdpr      %%pstate, %0\n\t"
-                            "wrpr      %0, %1, %%pstate"
-                            : "=r" (flags)
-                            : "i" (PSTATE_IE));
-       spin_lock(&regdump_lock);
-#endif
        printk("TSTATE: %016lx TPC: %016lx TNPC: %016lx Y: %08x    %s\n", regs->tstate,
               regs->tpc, regs->tnpc, regs->y, print_tainted());
        printk("TPC: <%pS>\n", (void *) regs->tpc);
@@ -246,64 +230,24 @@ void __show_regs(struct pt_regs * regs)
               regs->u_regs[15]);
        printk("RPC: <%pS>\n", (void *) regs->u_regs[15]);
        show_regwindow(regs);
-#ifdef CONFIG_SMP
-       spin_unlock(&regdump_lock);
-       __asm__ __volatile__("wrpr      %0, 0, %%pstate"
-                            : : "r" (flags));
-#endif
 }
 
-#ifdef VERBOSE_SHOWREGS
-static void idump_from_user (unsigned int *pc)
-{
-       int i;
-       int code;
-       
-       if((((unsigned long) pc) & 3))
-               return;
-       
-       pc -= 3;
-       for(i = -3; i < 6; i++) {
-               get_user(code, pc);
-               printk("%c%08x%c",i?' ':'<',code,i?' ':'>');
-               pc++;
-       }
-       printk("\n");
-}
-#endif
+struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
+static DEFINE_SPINLOCK(global_reg_snapshot_lock);
 
-void show_regs(struct pt_regs *regs)
+static bool kstack_valid(struct thread_info *tp, struct reg_window *rw)
 {
-#ifdef VERBOSE_SHOWREGS
-       extern long etrap, etraptl1;
-#endif
-       __show_regs(regs);
-#if 0
-#ifdef CONFIG_SMP
-       {
-               extern void smp_report_regs(void);
+       unsigned long thread_base, fp;
 
-               smp_report_regs();
-       }
-#endif
-#endif
+       thread_base = (unsigned long) tp;
+       fp = (unsigned long) rw;
 
-#ifdef VERBOSE_SHOWREGS        
-       if (regs->tpc >= &etrap && regs->tpc < &etraptl1 &&
-           regs->u_regs[14] >= (long)current - PAGE_SIZE &&
-           regs->u_regs[14] < (long)current + 6 * PAGE_SIZE) {
-               printk ("*********parent**********\n");
-               __show_regs((struct pt_regs *)(regs->u_regs[14] + PTREGS_OFF));
-               idump_from_user(((struct pt_regs *)(regs->u_regs[14] + PTREGS_OFF))->tpc);
-               printk ("*********endpar**********\n");
-       }
-#endif
+       if (fp < (thread_base + sizeof(struct thread_info)) ||
+           fp >= (thread_base + THREAD_SIZE))
+               return false;
+       return true;
 }
 
-#ifdef CONFIG_MAGIC_SYSRQ
-struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
-static DEFINE_SPINLOCK(global_reg_snapshot_lock);
-
 static void __global_reg_self(struct thread_info *tp, struct pt_regs *regs,
                              int this_cpu)
 {
@@ -315,14 +259,22 @@ static void __global_reg_self(struct thread_info *tp, struct pt_regs *regs,
        global_reg_snapshot[this_cpu].o7 = regs->u_regs[UREG_I7];
 
        if (regs->tstate & TSTATE_PRIV) {
+               struct thread_info *tp = current_thread_info();
                struct reg_window *rw;
 
                rw = (struct reg_window *)
                        (regs->u_regs[UREG_FP] + STACK_BIAS);
-               global_reg_snapshot[this_cpu].i7 = rw->ins[6];
-       } else
+               if (kstack_valid(tp, rw)) {
+                       global_reg_snapshot[this_cpu].i7 = rw->ins[7];
+                       rw = (struct reg_window *)
+                               (rw->ins[6] + STACK_BIAS);
+                       if (kstack_valid(tp, rw))
+                               global_reg_snapshot[this_cpu].rpc = rw->ins[7];
+               }
+       } else {
                global_reg_snapshot[this_cpu].i7 = 0;
-
+               global_reg_snapshot[this_cpu].rpc = 0;
+       }
        global_reg_snapshot[this_cpu].thread = tp;
 }
 
@@ -341,7 +293,7 @@ static void __global_reg_poll(struct global_reg_snapshot *gp)
        }
 }
 
-static void sysrq_handle_globreg(int key, struct tty_struct *tty)
+void __trigger_all_cpu_backtrace(void)
 {
        struct thread_info *tp = current_thread_info();
        struct pt_regs *regs = get_irq_regs();
@@ -375,13 +327,14 @@ static void sysrq_handle_globreg(int key, struct tty_struct *tty)
                       ((tp && tp->task) ? tp->task->pid : -1));
 
                if (gp->tstate & TSTATE_PRIV) {
-                       printk("             TPC[%pS] O7[%pS] I7[%pS]\n",
+                       printk("             TPC[%pS] O7[%pS] I7[%pS] RPC[%pS]\n",
                               (void *) gp->tpc,
                               (void *) gp->o7,
-                              (void *) gp->i7);
+                              (void *) gp->i7,
+                              (void *) gp->rpc);
                } else {
-                       printk("             TPC[%lx] O7[%lx] I7[%lx]\n",
-                              gp->tpc, gp->o7, gp->i7);
+                       printk("             TPC[%lx] O7[%lx] I7[%lx] RPC[%lx]\n",
+                              gp->tpc, gp->o7, gp->i7, gp->rpc);
                }
        }
 
@@ -390,6 +343,13 @@ static void sysrq_handle_globreg(int key, struct tty_struct *tty)
        spin_unlock_irqrestore(&global_reg_snapshot_lock, flags);
 }
 
+#ifdef CONFIG_MAGIC_SYSRQ
+
+static void sysrq_handle_globreg(int key, struct tty_struct *tty)
+{
+       __trigger_all_cpu_backtrace();
+}
+
 static struct sysrq_key_op sparc_globalreg_op = {
        .handler        = sysrq_handle_globreg,
        .help_msg       = "Globalregs",
index d1b84456a9eef969d6be3013432ccf1583631971..ec82d76dc6f2cc245ca54203dd38c35fee192ed2 100644 (file)
@@ -2,7 +2,7 @@
  *  arch/sparc64/kernel/signal.c
  *
  *  Copyright (C) 1991, 1992  Linus Torvalds
- *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ *  Copyright (C) 1995, 2008 David S. Miller (davem@davemloft.net)
  *  Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
  *  Copyright (C) 1997 Eddie C. Dost   (ecd@skynet.be)
  *  Copyright (C) 1997,1998 Jakub Jelinek   (jj@sunsite.mff.cuni.cz)
@@ -23,7 +23,6 @@
 #include <linux/tty.h>
 #include <linux/binfmts.h>
 #include <linux/bitops.h>
-#include <linux/tracehook.h>
 
 #include <asm/uaccess.h>
 #include <asm/ptrace.h>
@@ -91,7 +90,9 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs)
        err |= __get_user(regs->u_regs[UREG_G4], (&(*grp)[MC_G4]));
        err |= __get_user(regs->u_regs[UREG_G5], (&(*grp)[MC_G5]));
        err |= __get_user(regs->u_regs[UREG_G6], (&(*grp)[MC_G6]));
-       err |= __get_user(regs->u_regs[UREG_G7], (&(*grp)[MC_G7]));
+
+       /* Skip %g7 as that's the thread register in userspace.  */
+
        err |= __get_user(regs->u_regs[UREG_I0], (&(*grp)[MC_O0]));
        err |= __get_user(regs->u_regs[UREG_I1], (&(*grp)[MC_O1]));
        err |= __get_user(regs->u_regs[UREG_I2], (&(*grp)[MC_O2]));
index 7cf72b4bb1089498348be341ee02a840161a1af3..27b81775a4decd16c43f32df32c8347407d82bb4 100644 (file)
@@ -459,27 +459,35 @@ again:
        }
 }
 
-static inline void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
+static void spitfire_xcall_deliver(struct trap_per_cpu *tb, int cnt)
 {
+       u64 *mondo, data0, data1, data2;
+       u16 *cpu_list;
        u64 pstate;
        int i;
 
        __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
-       for_each_cpu_mask(i, mask)
-               spitfire_xcall_helper(data0, data1, data2, pstate, i);
+       cpu_list = __va(tb->cpu_list_pa);
+       mondo = __va(tb->cpu_mondo_block_pa);
+       data0 = mondo[0];
+       data1 = mondo[1];
+       data2 = mondo[2];
+       for (i = 0; i < cnt; i++)
+               spitfire_xcall_helper(data0, data1, data2, pstate, cpu_list[i]);
 }
 
 /* Cheetah now allows to send the whole 64-bytes of data in the interrupt
  * packet, but we have no use for that.  However we do take advantage of
  * the new pipelining feature (ie. dispatch to multiple cpus simultaneously).
  */
-static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
+static void cheetah_xcall_deliver(struct trap_per_cpu *tb, int cnt)
 {
-       u64 pstate, ver, busy_mask;
        int nack_busy_id, is_jbus, need_more;
+       u64 *mondo, pstate, ver, busy_mask;
+       u16 *cpu_list;
 
-       if (cpus_empty(mask))
-               return;
+       cpu_list = __va(tb->cpu_list_pa);
+       mondo = __va(tb->cpu_mondo_block_pa);
 
        /* Unfortunately, someone at Sun had the brilliant idea to make the
         * busy/nack fields hard-coded by ITID number for this Ultra-III
@@ -502,7 +510,7 @@ retry:
                             "stxa      %2, [%5] %6\n\t"
                             "membar    #Sync\n\t"
                             : /* no outputs */
-                            : "r" (data0), "r" (data1), "r" (data2),
+                            : "r" (mondo[0]), "r" (mondo[1]), "r" (mondo[2]),
                               "r" (0x40), "r" (0x50), "r" (0x60),
                               "i" (ASI_INTR_W));
 
@@ -511,11 +519,16 @@ retry:
        {
                int i;
 
-               for_each_cpu_mask(i, mask) {
-                       u64 target = (i << 14) | 0x70;
+               for (i = 0; i < cnt; i++) {
+                       u64 target, nr;
 
+                       nr = cpu_list[i];
+                       if (nr == 0xffff)
+                               continue;
+
+                       target = (nr << 14) | 0x70;
                        if (is_jbus) {
-                               busy_mask |= (0x1UL << (i * 2));
+                               busy_mask |= (0x1UL << (nr * 2));
                        } else {
                                target |= (nack_busy_id << 24);
                                busy_mask |= (0x1UL <<
@@ -549,11 +562,13 @@ retry:
                                __asm__ __volatile__("wrpr %0, 0x0, %%pstate"
                                                     : : "r" (pstate));
                                if (unlikely(need_more)) {
-                                       int i, cnt = 0;
-                                       for_each_cpu_mask(i, mask) {
-                                               cpu_clear(i, mask);
-                                               cnt++;
-                                               if (cnt == 32)
+                                       int i, this_cnt = 0;
+                                       for (i = 0; i < cnt; i++) {
+                                               if (cpu_list[i] == 0xffff)
+                                                       continue;
+                                               cpu_list[i] = 0xffff;
+                                               this_cnt++;
+                                               if (this_cnt == 32)
                                                        break;
                                        }
                                        goto retry;
@@ -584,16 +599,20 @@ retry:
                        /* Clear out the mask bits for cpus which did not
                         * NACK us.
                         */
-                       for_each_cpu_mask(i, mask) {
-                               u64 check_mask;
+                       for (i = 0; i < cnt; i++) {
+                               u64 check_mask, nr;
+
+                               nr = cpu_list[i];
+                               if (nr == 0xffff)
+                                       continue;
 
                                if (is_jbus)
-                                       check_mask = (0x2UL << (2*i));
+                                       check_mask = (0x2UL << (2*nr));
                                else
                                        check_mask = (0x2UL <<
                                                      this_busy_nack);
                                if ((dispatch_stat & check_mask) == 0)
-                                       cpu_clear(i, mask);
+                                       cpu_list[i] = 0xffff;
                                this_busy_nack += 2;
                                if (this_busy_nack == 64)
                                        break;
@@ -605,47 +624,17 @@ retry:
 }
 
 /* Multi-cpu list version.  */
-static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
+static void hypervisor_xcall_deliver(struct trap_per_cpu *tb, int cnt)
 {
-       struct trap_per_cpu *tb;
+       int retries, this_cpu, prev_sent, i, saw_cpu_error;
+       unsigned long status;
        u16 *cpu_list;
-       u64 *mondo;
-       cpumask_t error_mask;
-       unsigned long flags, status;
-       int cnt, retries, this_cpu, prev_sent, i;
-
-       if (cpus_empty(mask))
-               return;
-
-       /* We have to do this whole thing with interrupts fully disabled.
-        * Otherwise if we send an xcall from interrupt context it will
-        * corrupt both our mondo block and cpu list state.
-        *
-        * One consequence of this is that we cannot use timeout mechanisms
-        * that depend upon interrupts being delivered locally.  So, for
-        * example, we cannot sample jiffies and expect it to advance.
-        *
-        * Fortunately, udelay() uses %stick/%tick so we can use that.
-        */
-       local_irq_save(flags);
 
        this_cpu = smp_processor_id();
-       tb = &trap_block[this_cpu];
-
-       mondo = __va(tb->cpu_mondo_block_pa);
-       mondo[0] = data0;
-       mondo[1] = data1;
-       mondo[2] = data2;
-       wmb();
 
        cpu_list = __va(tb->cpu_list_pa);
 
-       /* Setup the initial cpu list.  */
-       cnt = 0;
-       for_each_cpu_mask(i, mask)
-               cpu_list[cnt++] = i;
-
-       cpus_clear(error_mask);
+       saw_cpu_error = 0;
        retries = 0;
        prev_sent = 0;
        do {
@@ -690,10 +679,9 @@ static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t
                                        continue;
 
                                err = sun4v_cpu_state(cpu);
-                               if (err >= 0 &&
-                                   err == HV_CPU_STATE_ERROR) {
+                               if (err == HV_CPU_STATE_ERROR) {
+                                       saw_cpu_error = (cpu + 1);
                                        cpu_list[i] = 0xffff;
-                                       cpu_set(cpu, error_mask);
                                }
                        }
                } else if (unlikely(status != HV_EWOULDBLOCK))
@@ -717,32 +705,24 @@ static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t
                }
        } while (1);
 
-       local_irq_restore(flags);
-
-       if (unlikely(!cpus_empty(error_mask)))
+       if (unlikely(saw_cpu_error))
                goto fatal_mondo_cpu_error;
 
        return;
 
 fatal_mondo_cpu_error:
        printk(KERN_CRIT "CPU[%d]: SUN4V mondo cpu error, some target cpus "
-              "were in error state\n",
-              this_cpu);
-       printk(KERN_CRIT "CPU[%d]: Error mask [ ", this_cpu);
-       for_each_cpu_mask(i, error_mask)
-               printk("%d ", i);
-       printk("]\n");
+              "(including %d) were in error state\n",
+              this_cpu, saw_cpu_error - 1);
        return;
 
 fatal_mondo_timeout:
-       local_irq_restore(flags);
        printk(KERN_CRIT "CPU[%d]: SUN4V mondo timeout, no forward "
               " progress after %d retries.\n",
               this_cpu, retries);
        goto dump_cpu_list_and_out;
 
 fatal_mondo_error:
-       local_irq_restore(flags);
        printk(KERN_CRIT "CPU[%d]: Unexpected SUN4V mondo error %lu\n",
               this_cpu, status);
        printk(KERN_CRIT "CPU[%d]: Args were cnt(%d) cpulist_pa(%lx) "
@@ -756,58 +736,93 @@ dump_cpu_list_and_out:
        printk("]\n");
 }
 
-/* Send cross call to all processors mentioned in MASK
- * except self.
+static void (*xcall_deliver_impl)(struct trap_per_cpu *, int);
+
+static void xcall_deliver(u64 data0, u64 data1, u64 data2, const cpumask_t *mask)
+{
+       struct trap_per_cpu *tb;
+       int this_cpu, i, cnt;
+       unsigned long flags;
+       u16 *cpu_list;
+       u64 *mondo;
+
+       /* We have to do this whole thing with interrupts fully disabled.
+        * Otherwise if we send an xcall from interrupt context it will
+        * corrupt both our mondo block and cpu list state.
+        *
+        * One consequence of this is that we cannot use timeout mechanisms
+        * that depend upon interrupts being delivered locally.  So, for
+        * example, we cannot sample jiffies and expect it to advance.
+        *
+        * Fortunately, udelay() uses %stick/%tick so we can use that.
+        */
+       local_irq_save(flags);
+
+       this_cpu = smp_processor_id();
+       tb = &trap_block[this_cpu];
+
+       mondo = __va(tb->cpu_mondo_block_pa);
+       mondo[0] = data0;
+       mondo[1] = data1;
+       mondo[2] = data2;
+       wmb();
+
+       cpu_list = __va(tb->cpu_list_pa);
+
+       /* Setup the initial cpu list.  */
+       cnt = 0;
+       for_each_cpu_mask_nr(i, *mask) {
+               if (i == this_cpu || !cpu_online(i))
+                       continue;
+               cpu_list[cnt++] = i;
+       }
+
+       if (cnt)
+               xcall_deliver_impl(tb, cnt);
+
+       local_irq_restore(flags);
+}
+
+/* Send cross call to all processors mentioned in MASK_P
+ * except self.  Really, there are only two cases currently,
+ * "&cpu_online_map" and "&mm->cpu_vm_mask".
  */
-static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, cpumask_t mask)
+static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, const cpumask_t *mask)
 {
        u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff));
-       int this_cpu = get_cpu();
-
-       cpus_and(mask, mask, cpu_online_map);
-       cpu_clear(this_cpu, mask);
 
-       if (tlb_type == spitfire)
-               spitfire_xcall_deliver(data0, data1, data2, mask);
-       else if (tlb_type == cheetah || tlb_type == cheetah_plus)
-               cheetah_xcall_deliver(data0, data1, data2, mask);
-       else
-               hypervisor_xcall_deliver(data0, data1, data2, mask);
-       /* NOTE: Caller runs local copy on master. */
+       xcall_deliver(data0, data1, data2, mask);
+}
 
-       put_cpu();
+/* Send cross call to all processors except self. */
+static void smp_cross_call(unsigned long *func, u32 ctx, u64 data1, u64 data2)
+{
+       smp_cross_call_masked(func, ctx, data1, data2, &cpu_online_map);
 }
 
 extern unsigned long xcall_sync_tick;
 
 static void smp_start_sync_tick_client(int cpu)
 {
-       cpumask_t mask = cpumask_of_cpu(cpu);
-
-       smp_cross_call_masked(&xcall_sync_tick,
-                             0, 0, 0, mask);
+       xcall_deliver((u64) &xcall_sync_tick, 0, 0,
+                     &cpumask_of_cpu(cpu));
 }
 
 extern unsigned long xcall_call_function;
 
 void arch_send_call_function_ipi(cpumask_t mask)
 {
-       smp_cross_call_masked(&xcall_call_function, 0, 0, 0, mask);
+       xcall_deliver((u64) &xcall_call_function, 0, 0, &mask);
 }
 
 extern unsigned long xcall_call_function_single;
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-       cpumask_t mask = cpumask_of_cpu(cpu);
-
-       smp_cross_call_masked(&xcall_call_function_single, 0, 0, 0, mask);
+       xcall_deliver((u64) &xcall_call_function_single, 0, 0,
+                     &cpumask_of_cpu(cpu));
 }
 
-/* Send cross call to all processors except self. */
-#define smp_cross_call(func, ctx, data1, data2) \
-       smp_cross_call_masked(func, ctx, data1, data2, cpu_online_map)
-
 void smp_call_function_client(int irq, struct pt_regs *regs)
 {
        clear_softint(1 << irq);
@@ -843,7 +858,6 @@ void smp_tsb_sync(struct mm_struct *mm)
 extern unsigned long xcall_flush_tlb_mm;
 extern unsigned long xcall_flush_tlb_pending;
 extern unsigned long xcall_flush_tlb_kernel_range;
-extern unsigned long xcall_report_regs;
 #ifdef CONFIG_MAGIC_SYSRQ
 extern unsigned long xcall_fetch_glob_regs;
 #endif
@@ -878,7 +892,6 @@ static inline void __local_flush_dcache_page(struct page *page)
 
 void smp_flush_dcache_page_impl(struct page *page, int cpu)
 {
-       cpumask_t mask = cpumask_of_cpu(cpu);
        int this_cpu;
 
        if (tlb_type == hypervisor)
@@ -894,29 +907,24 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
                __local_flush_dcache_page(page);
        } else if (cpu_online(cpu)) {
                void *pg_addr = page_address(page);
-               u64 data0;
+               u64 data0 = 0;
 
                if (tlb_type == spitfire) {
-                       data0 =
-                               ((u64)&xcall_flush_dcache_page_spitfire);
+                       data0 = ((u64)&xcall_flush_dcache_page_spitfire);
                        if (page_mapping(page) != NULL)
                                data0 |= ((u64)1 << 32);
-                       spitfire_xcall_deliver(data0,
-                                              __pa(pg_addr),
-                                              (u64) pg_addr,
-                                              mask);
                } else if (tlb_type == cheetah || tlb_type == cheetah_plus) {
 #ifdef DCACHE_ALIASING_POSSIBLE
-                       data0 =
-                               ((u64)&xcall_flush_dcache_page_cheetah);
-                       cheetah_xcall_deliver(data0,
-                                             __pa(pg_addr),
-                                             0, mask);
+                       data0 = ((u64)&xcall_flush_dcache_page_cheetah);
 #endif
                }
+               if (data0) {
+                       xcall_deliver(data0, __pa(pg_addr),
+                                     (u64) pg_addr, &cpumask_of_cpu(cpu));
 #ifdef CONFIG_DEBUG_DCFLUSH
-               atomic_inc(&dcpage_flushes_xcall);
+                       atomic_inc(&dcpage_flushes_xcall);
 #endif
+               }
        }
 
        put_cpu();
@@ -924,66 +932,41 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
 
 void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
 {
-       void *pg_addr = page_address(page);
-       cpumask_t mask = cpu_online_map;
-       u64 data0;
+       void *pg_addr;
        int this_cpu;
+       u64 data0;
 
        if (tlb_type == hypervisor)
                return;
 
        this_cpu = get_cpu();
 
-       cpu_clear(this_cpu, mask);
-
 #ifdef CONFIG_DEBUG_DCFLUSH
        atomic_inc(&dcpage_flushes);
 #endif
-       if (cpus_empty(mask))
-               goto flush_self;
+       data0 = 0;
+       pg_addr = page_address(page);
        if (tlb_type == spitfire) {
                data0 = ((u64)&xcall_flush_dcache_page_spitfire);
                if (page_mapping(page) != NULL)
                        data0 |= ((u64)1 << 32);
-               spitfire_xcall_deliver(data0,
-                                      __pa(pg_addr),
-                                      (u64) pg_addr,
-                                      mask);
        } else if (tlb_type == cheetah || tlb_type == cheetah_plus) {
 #ifdef DCACHE_ALIASING_POSSIBLE
                data0 = ((u64)&xcall_flush_dcache_page_cheetah);
-               cheetah_xcall_deliver(data0,
-                                     __pa(pg_addr),
-                                     0, mask);
 #endif
        }
+       if (data0) {
+               xcall_deliver(data0, __pa(pg_addr),
+                             (u64) pg_addr, &cpu_online_map);
 #ifdef CONFIG_DEBUG_DCFLUSH
-       atomic_inc(&dcpage_flushes_xcall);
+               atomic_inc(&dcpage_flushes_xcall);
 #endif
- flush_self:
+       }
        __local_flush_dcache_page(page);
 
        put_cpu();
 }
 
-static void __smp_receive_signal_mask(cpumask_t mask)
-{
-       smp_cross_call_masked(&xcall_receive_signal, 0, 0, 0, mask);
-}
-
-void smp_receive_signal(int cpu)
-{
-       cpumask_t mask = cpumask_of_cpu(cpu);
-
-       if (cpu_online(cpu))
-               __smp_receive_signal_mask(mask);
-}
-
-void smp_receive_signal_client(int irq, struct pt_regs *regs)
-{
-       clear_softint(1 << irq);
-}
-
 void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs)
 {
        struct mm_struct *mm;
@@ -1022,11 +1005,6 @@ void kgdb_roundup_cpus(unsigned long flags)
 }
 #endif
 
-void smp_report_regs(void)
-{
-       smp_cross_call(&xcall_report_regs, 0, 0, 0);
-}
-
 #ifdef CONFIG_MAGIC_SYSRQ
 void smp_fetch_global_regs(void)
 {
@@ -1089,7 +1067,7 @@ void smp_flush_tlb_mm(struct mm_struct *mm)
 
        smp_cross_call_masked(&xcall_flush_tlb_mm,
                              ctx, 0, 0,
-                             mm->cpu_vm_mask);
+                             &mm->cpu_vm_mask);
 
 local_flush_and_out:
        __flush_tlb_mm(ctx, SECONDARY_CONTEXT);
@@ -1107,7 +1085,7 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long
        else
                smp_cross_call_masked(&xcall_flush_tlb_pending,
                                      ctx, nr, (unsigned long) vaddrs,
-                                     mm->cpu_vm_mask);
+                                     &mm->cpu_vm_mask);
 
        __flush_tlb_pending(ctx, nr, vaddrs);
 
@@ -1208,6 +1186,16 @@ void __devinit smp_prepare_boot_cpu(void)
 {
 }
 
+void __init smp_setup_processor_id(void)
+{
+       if (tlb_type == spitfire)
+               xcall_deliver_impl = spitfire_xcall_deliver;
+       else if (tlb_type == cheetah || tlb_type == cheetah_plus)
+               xcall_deliver_impl = cheetah_xcall_deliver;
+       else
+               xcall_deliver_impl = hypervisor_xcall_deliver;
+}
+
 void __devinit smp_fill_in_sib_core_maps(void)
 {
        unsigned int i;
@@ -1376,7 +1364,13 @@ void __init smp_cpus_done(unsigned int max_cpus)
 
 void smp_send_reschedule(int cpu)
 {
-       smp_receive_signal(cpu);
+       xcall_deliver((u64) &xcall_receive_signal, 0, 0,
+                     &cpumask_of_cpu(cpu));
+}
+
+void smp_receive_signal_client(int irq, struct pt_regs *regs)
+{
+       clear_softint(1 << irq);
 }
 
 /* This is a nop because we capture all other cpus
index 504e678ee128e3998af12688e0678aa4568204a1..0804f71df6cb8422fd09fda447be1a397fbd3c03 100644 (file)
@@ -68,7 +68,6 @@ extern void *__memscan_zero(void *, size_t);
 extern void *__memscan_generic(void *, int, size_t);
 extern int __memcmp(const void *, const void *, __kernel_size_t);
 extern __kernel_size_t strlen(const char *);
-extern void show_regs(struct pt_regs *);
 extern void syscall_trace(struct pt_regs *, int);
 extern void sys_sigsuspend(void);
 extern int compat_sys_ioctl(unsigned int fd, unsigned int cmd, u32 arg);
index bd30ecba563010bfced1ad54950875e59f160418..404e8561e2d0cec8b6d52a38be95d360624b0be7 100644 (file)
@@ -1777,7 +1777,7 @@ static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent,
               pfx,
               ent->err_raddr, ent->err_size, ent->err_cpu);
 
-       __show_regs(regs);
+       show_regs(regs);
 
        if ((cnt = atomic_read(ocnt)) != 0) {
                atomic_set(ocnt, 0);
@@ -2177,7 +2177,6 @@ static inline struct reg_window *kernel_stack_up(struct reg_window *rw)
 void die_if_kernel(char *str, struct pt_regs *regs)
 {
        static int die_counter;
-       extern void smp_report_regs(void);
        int count = 0;
        
        /* Amuse the user. */
@@ -2190,7 +2189,7 @@ void die_if_kernel(char *str, struct pt_regs *regs)
        printk("%s(%d): %s [#%d]\n", current->comm, task_pid_nr(current), str, ++die_counter);
        notify_die(DIE_OOPS, str, regs, 0, 255, SIGSEGV);
        __asm__ __volatile__("flushw");
-       __show_regs(regs);
+       show_regs(regs);
        add_taint(TAINT_DIE);
        if (regs->tstate & TSTATE_PRIV) {
                struct reg_window *rw = (struct reg_window *)
@@ -2215,11 +2214,6 @@ void die_if_kernel(char *str, struct pt_regs *regs)
                }
                user_instruction_dump ((unsigned int __user *) regs->tpc);
        }
-#if 0
-#ifdef CONFIG_SMP
-       smp_report_regs();
-#endif
-#endif                                                 
        if (regs->tstate & TSTATE_PRIV)
                do_exit(SIGKILL);
        do_exit(SIGSEGV);
index 3547937b17a2f2d43c5d9f667dcfca7e8ce0c1eb..587f8efb2e05efb0681fec3a0c0ed0d59b87357b 100644 (file)
@@ -1,9 +1,10 @@
 /* arch/sparc64/mm/tsb.c
  *
- * Copyright (C) 2006 David S. Miller <davem@davemloft.net>
+ * Copyright (C) 2006, 2008 David S. Miller <davem@davemloft.net>
  */
 
 #include <linux/kernel.h>
+#include <linux/preempt.h>
 #include <asm/system.h>
 #include <asm/page.h>
 #include <asm/tlbflush.h>
@@ -415,7 +416,9 @@ retry_tsb_alloc:
                tsb_context_switch(mm);
 
                /* Now force other processors to do the same.  */
+               preempt_disable();
                smp_tsb_sync(mm);
+               preempt_enable();
 
                /* Now it is safe to free the old tsb.  */
                kmem_cache_free(tsb_caches[old_cache_index], old_tsb);
index 4c8ca131ffaf467ec329fc70753f32b076bff392..ff1dc44d363e1cd1349d1b5ad7e26dda18dd394c 100644 (file)
@@ -480,41 +480,6 @@ xcall_sync_tick:
        b               rtrap_xcall
         ldx            [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
 
-       /* NOTE: This is SPECIAL!!  We do etrap/rtrap however
-        *       we choose to deal with the "BH's run with
-        *       %pil==15" problem (described in asm/pil.h)
-        *       by just invoking rtrap directly past where
-        *       BH's are checked for.
-        *
-        *       We do it like this because we do not want %pil==15
-        *       lockups to prevent regs being reported.
-        */
-       .globl          xcall_report_regs
-xcall_report_regs:
-
-661:   rdpr            %pstate, %g2
-       wrpr            %g2, PSTATE_IG | PSTATE_AG, %pstate
-       .section        .sun4v_2insn_patch, "ax"
-       .word           661b
-       nop
-       nop
-       .previous
-
-       rdpr            %pil, %g2
-       wrpr            %g0, 15, %pil
-       sethi           %hi(109f), %g7
-       b,pt            %xcc, etrap_irq
-109:    or             %g7, %lo(109b), %g7
-#ifdef CONFIG_TRACE_IRQFLAGS
-       call            trace_hardirqs_off
-        nop
-#endif
-       call            __show_regs
-        add            %sp, PTREGS_OFF, %o0
-       /* Has to be a non-v9 branch due to the large distance. */
-       b               rtrap_xcall
-        ldx            [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
-
 #ifdef CONFIG_MAGIC_SYSRQ
        .globl          xcall_fetch_glob_regs
 xcall_fetch_glob_regs:
@@ -531,6 +496,13 @@ xcall_fetch_glob_regs:
        stx             %g7, [%g1 + GR_SNAP_TNPC]
        stx             %o7, [%g1 + GR_SNAP_O7]
        stx             %i7, [%g1 + GR_SNAP_I7]
+       /* Don't try this at home kids... */
+       rdpr            %cwp, %g2
+       sub             %g2, 1, %g7
+       wrpr            %g7, %cwp
+       mov             %i7, %g7
+       wrpr            %g2, %cwp
+       stx             %g7, [%g1 + GR_SNAP_RPC]
        sethi           %hi(trap_block), %g7
        or              %g7, %lo(trap_block), %g7
        sllx            %g2, TRAP_BLOCK_SZ_SHIFT, %g2
index 6e52cdd6166fcb4476d5248f7648f9a3969caaee..c9a7c5b74a0d1d71ee5358826344c5d17e7a1ad6 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/interrupt.h>
 #include <asm/irq.h>
 #include <linux/in6.h>
-#include <linux/ide.h>
 
 #include <asm/uaccess.h>
 #include <asm/checksum.h>
index c5b9bcfc0a6d9c3629fa1aa1492fbcba1cb42e32..12a5182173f679f1dc507ba4c2c28b678b8c1dbf 100644 (file)
@@ -518,7 +518,7 @@ int scsi_cmd_ioctl(struct file *file, struct request_queue *q,
                        hdr.sbp = cgc.sense;
                        if (hdr.sbp)
                                hdr.mx_sb_len = sizeof(struct request_sense);
-                       hdr.timeout = cgc.timeout;
+                       hdr.timeout = jiffies_to_msecs(cgc.timeout);
                        hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd;
                        hdr.cmd_len = sizeof(cgc.cmd);
 
index d81632cd7d062fd01bb2e2987dd8095b567c1e87..0ce0c279aabf4bce78463537be4fe37325b91810 100644 (file)
@@ -1292,8 +1292,6 @@ static void cciss_check_queues(ctlr_info_t *h)
                                h->next_to_run = curr_queue;
                                break;
                        }
-               } else {
-                       curr_queue = (curr_queue + 1) % (h->highest_lun + 1);
                }
        }
 }
index a5da356326515c637f7a66ff04c1cd018c828f31..d9d1b65d206c7e13fbcc41133474fec2be27951a 100644 (file)
@@ -1436,10 +1436,6 @@ static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype* tracks)
        tracks->xa=0;
        tracks->error=0;
        cdinfo(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n"); 
-        if (!CDROM_CAN(CDC_PLAY_AUDIO)) { 
-                tracks->error=CDS_NO_INFO;
-                return;
-        }        
        /* Grab the TOC header so we can see how many tracks there are */
        if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header))) {
                if (ret == -ENOMEDIUM)
index 67fbd7aab5dbfa9b73396808cd6feaa1a7369791..34d15d548236235544d2a31a41ba13cf35fe847f 100644 (file)
@@ -37,7 +37,6 @@
 #include <linux/rtc.h>
 #include <linux/proc_fs.h>
 #include <linux/efi.h>
-#include <linux/smp_lock.h>
 #include <linux/uaccess.h>
 
 #include <asm/system.h>
index d9ce10915625db733c5f7aecb3ffd4679c94de08..9790201718ae6ce6892c65d3b10de8d7c102d4d0 100644 (file)
@@ -6,7 +6,7 @@
  *     Ryan S. Arnold <rsa@us.ibm.com>
  *
  * hvc_console header information:
- *      moved here from include/asm-powerpc/hvconsole.h
+ *      moved here from arch/powerpc/include/asm/hvconsole.h
  *      and drivers/char/hvc_console.c
  *
  * This program is free software; you can redistribute it and/or modify
index 786d518e947752a56079227111cb322a2de7700e..473d9b14439a9cfdf4f8d071ef8da5553f2e3e90 100644 (file)
  * the hvcs_final_close() function in order to get it out of the spinlock.
  * Rearranged hvcs_close().  Cleaned up some printks and did some housekeeping
  * on the changelog.  Removed local CLC_LENGTH and used HVCS_CLC_LENGTH from
- * include/asm-powerpc/hvcserver.h 
+ * arch/powerepc/include/asm/hvcserver.h
  *
  * 1.3.2 -> 1.3.3 Replaced yield() in hvcs_close() with tty_wait_until_sent() to
  * prevent possible lockup with realtime scheduling as similarily pointed out by
index 82a51f38a5469cd1a56637c6635b9c16f69f5f89..1bc00c9d860d70f917f2d945162aad3755b31749 100644 (file)
@@ -916,7 +916,6 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
                ws.ws_col = vc->vc_cols;
                ws.ws_ypixel = vc->vc_scan_lines;
 
-               mutex_lock(&vc->vc_tty->termios_mutex);
                spin_lock_irq(&vc->vc_tty->ctrl_lock);
                if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col))
                        pgrp = get_pid(vc->vc_tty->pgrp);
@@ -926,7 +925,6 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
                        put_pid(pgrp);
                }
                *cws = ws;
-               mutex_unlock(&vc->vc_tty->termios_mutex);
        }
 
        if (CON_IS_VISIBLE(vc))
index 130ef64b44f75b847469bcc0a22f684243e974e1..a34758d29516c3aff28958582a915b5b664ec72e 100644 (file)
@@ -54,16 +54,6 @@ menuconfig IDE
 
 if IDE
 
-config IDE_MAX_HWIFS
-       int "Max IDE interfaces"
-       depends on ALPHA || SUPERH || IA64 || EMBEDDED
-       range 1 10
-       default 4
-       help
-         This is the maximum number of IDE hardware interfaces that will
-         be supported by the driver. Make sure it is at least as high as
-         the number of IDE interfaces in your system.
-
 config BLK_DEV_IDE
        tristate "Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support"
        ---help---
index 3e842d60eae94804c3cc53328a39b007171245e8..f788fa5a977b54f4606ff09d306475fd5c435cd9 100644 (file)
@@ -309,7 +309,7 @@ static void __devinit palm_bk3710_chipinit(void __iomem *base)
        palm_bk3710_setpiomode(base, NULL, 1, 600, 0);
 }
 
-static u8 __devinit palm_bk3710_cable_detect(ide_hwif_t *hwif)
+static u8 palm_bk3710_cable_detect(ide_hwif_t *hwif)
 {
        return ATA_CBL_PATA80;
 }
index e617cf08aef67b882370f3f596694df2f465e3f4..89a112d513adc9fb9e1ccf2cf2d4c8a818eea675 100644 (file)
@@ -66,11 +66,11 @@ static struct cdrom_info *ide_cd_get(struct gendisk *disk)
        mutex_lock(&idecd_ref_mutex);
        cd = ide_cd_g(disk);
        if (cd) {
-               kref_get(&cd->kref);
-               if (ide_device_get(cd->drive)) {
-                       kref_put(&cd->kref, ide_cd_release);
+               if (ide_device_get(cd->drive))
                        cd = NULL;
-               }
+               else
+                       kref_get(&cd->kref);
+
        }
        mutex_unlock(&idecd_ref_mutex);
        return cd;
@@ -78,9 +78,11 @@ static struct cdrom_info *ide_cd_get(struct gendisk *disk)
 
 static void ide_cd_put(struct cdrom_info *cd)
 {
+       ide_drive_t *drive = cd->drive;
+
        mutex_lock(&idecd_ref_mutex);
-       ide_device_put(cd->drive);
        kref_put(&cd->kref, ide_cd_release);
+       ide_device_put(drive);
        mutex_unlock(&idecd_ref_mutex);
 }
 
@@ -1305,6 +1307,7 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
        int stat;
        unsigned char cmd[BLK_MAX_CDB];
        unsigned len = sizeof(capbuf);
+       u32 blocklen;
 
        memset(cmd, 0, BLK_MAX_CDB);
        cmd[0] = GPCMD_READ_CDVD_CAPACITY;
@@ -1317,23 +1320,24 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
        /*
         * Sanity check the given block size
         */
-       switch (capbuf.blocklen) {
-       case __constant_cpu_to_be32(512):
-       case __constant_cpu_to_be32(1024):
-       case __constant_cpu_to_be32(2048):
-       case __constant_cpu_to_be32(4096):
+       blocklen = be32_to_cpu(capbuf.blocklen);
+       switch (blocklen) {
+       case 512:
+       case 1024:
+       case 2048:
+       case 4096:
                break;
        default:
                printk(KERN_ERR "%s: weird block size %u\n",
-                       drive->name, capbuf.blocklen);
+                       drive->name, blocklen);
                printk(KERN_ERR "%s: default to 2kb block size\n",
                        drive->name);
-               capbuf.blocklen = __constant_cpu_to_be32(2048);
+               blocklen = 2048;
                break;
        }
 
        *capacity = 1 + be32_to_cpu(capbuf.lba);
-       *sectors_per_frame = be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS;
+       *sectors_per_frame = blocklen >> SECTOR_BITS;
        return 0;
 }
 
index 28d85b410f7ce03361ddec4c957c930a9aa08518..68b9cf0138b05f017427b24c958750bd77356ee8 100644 (file)
@@ -65,11 +65,10 @@ static struct ide_disk_obj *ide_disk_get(struct gendisk *disk)
        mutex_lock(&idedisk_ref_mutex);
        idkp = ide_disk_g(disk);
        if (idkp) {
-               kref_get(&idkp->kref);
-               if (ide_device_get(idkp->drive)) {
-                       kref_put(&idkp->kref, ide_disk_release);
+               if (ide_device_get(idkp->drive))
                        idkp = NULL;
-               }
+               else
+                       kref_get(&idkp->kref);
        }
        mutex_unlock(&idedisk_ref_mutex);
        return idkp;
@@ -77,9 +76,11 @@ static struct ide_disk_obj *ide_disk_get(struct gendisk *disk)
 
 static void ide_disk_put(struct ide_disk_obj *idkp)
 {
+       ide_drive_t *drive = idkp->drive;
+
        mutex_lock(&idedisk_ref_mutex);
-       ide_device_put(idkp->drive);
        kref_put(&idkp->kref, ide_disk_release);
+       ide_device_put(drive);
        mutex_unlock(&idedisk_ref_mutex);
 }
 
index 71c377a7bcf2dd4f5f69af951fe5b10602d6bf82..adc6827558577b32e3d3b144aac17197e6cf03fe 100644 (file)
@@ -649,11 +649,7 @@ static unsigned int ide_get_mode_mask(ide_drive_t *drive, u8 base, u8 req_mode)
                if (id->field_valid & 2) {
                        mask = id->dma_1word & hwif->swdma_mask;
                } else if (id->tDMA) {
-                       /*
-                        * ide_fix_driveid() doesn't convert ->tDMA to the
-                        * CPU endianness so we need to do it here
-                        */
-                       u8 mode = le16_to_cpu(id->tDMA);
+                       u8 mode = id->tDMA;
 
                        /*
                         * if the mode is valid convert it to the mask
index ca11a26746f16a95fa83d6d99288d42c01281a1c..e9034c0125f3e32440d2d0d2a9de9fd067eada09 100644 (file)
@@ -167,11 +167,10 @@ static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk)
        mutex_lock(&idefloppy_ref_mutex);
        floppy = ide_floppy_g(disk);
        if (floppy) {
-               kref_get(&floppy->kref);
-               if (ide_device_get(floppy->drive)) {
-                       kref_put(&floppy->kref, idefloppy_cleanup_obj);
+               if (ide_device_get(floppy->drive))
                        floppy = NULL;
-               }
+               else
+                       kref_get(&floppy->kref);
        }
        mutex_unlock(&idefloppy_ref_mutex);
        return floppy;
@@ -179,9 +178,11 @@ static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk)
 
 static void ide_floppy_put(struct ide_floppy_obj *floppy)
 {
+       ide_drive_t *drive = floppy->drive;
+
        mutex_lock(&idefloppy_ref_mutex);
-       ide_device_put(floppy->drive);
        kref_put(&floppy->kref, idefloppy_cleanup_obj);
+       ide_device_put(drive);
        mutex_unlock(&idefloppy_ref_mutex);
 }
 
index 8aae91764513afeaf71021bc5d32974683e8163d..2cbadffe922ef1204363ae5e50df712a693e79fd 100644 (file)
@@ -484,11 +484,11 @@ void ide_fix_driveid (struct hd_driveid *id)
        for (i = 0; i < 3; i++)
                id->words157_159[i] = __le16_to_cpu(id->words157_159[i]);
        id->cfa_power      = __le16_to_cpu(id->cfa_power);
-       for (i = 0; i < 14; i++)
+       for (i = 0; i < 15; i++)
                id->words161_175[i] = __le16_to_cpu(id->words161_175[i]);
-       for (i = 0; i < 31; i++)
+       for (i = 0; i < 30; i++)
                id->words176_205[i] = __le16_to_cpu(id->words176_205[i]);
-       for (i = 0; i < 48; i++)
+       for (i = 0; i < 49; i++)
                id->words206_254[i] = __le16_to_cpu(id->words206_254[i]);
        id->integrity_word  = __le16_to_cpu(id->integrity_word);
 # else
index 82c2afe4d28a3a081a30fd5755de01fb17fc2e44..1bce84b566304115c2834a1742f03284e2c25ce9 100644 (file)
@@ -331,11 +331,10 @@ static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
        mutex_lock(&idetape_ref_mutex);
        tape = ide_tape_g(disk);
        if (tape) {
-               kref_get(&tape->kref);
-               if (ide_device_get(tape->drive)) {
-                       kref_put(&tape->kref, ide_tape_release);
+               if (ide_device_get(tape->drive))
                        tape = NULL;
-               }
+               else
+                       kref_get(&tape->kref);
        }
        mutex_unlock(&idetape_ref_mutex);
        return tape;
@@ -343,9 +342,11 @@ static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
 
 static void ide_tape_put(struct ide_tape_obj *tape)
 {
+       ide_drive_t *drive = tape->drive;
+
        mutex_lock(&idetape_ref_mutex);
-       ide_device_put(tape->drive);
        kref_put(&tape->kref, ide_tape_release);
+       ide_device_put(drive);
        mutex_unlock(&idetape_ref_mutex);
 }
 
index e0c8fe7d9fea9facda5be76db1821100d4a4c201..40644b6f1c002876c6286e80a29923996e58eee9 100644 (file)
@@ -160,7 +160,7 @@ static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev)
        return dev->irq;
 }
 
-static u8 __devinit atp86x_cable_detect(ide_hwif_t *hwif)
+static u8 atp86x_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01;
index b582687e0cd472a2b33a9ce825bc5b251ab4917b..d647526af557f93c2b75b2dea34860bc801f073e 100644 (file)
@@ -371,7 +371,7 @@ static int ali_cable_override(struct pci_dev *pdev)
  *     FIXME: frobs bits that are not defined on newer ALi devicea
  */
 
-static u8 __devinit ali_cable_detect(ide_hwif_t *hwif)
+static u8 ali_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        unsigned long flags;
index 2cea7bf51a0fe94412a581028ef4f63dea76af14..1e66a960a96ac597281909327b2c3cc4b80b2604 100644 (file)
@@ -175,7 +175,7 @@ static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev)
        return dev->irq;
 }
 
-static u8 __devinit amd_cable_detect(ide_hwif_t *hwif)
+static u8 amd_cable_detect(ide_hwif_t *hwif)
 {
        if ((amd_80w >> hwif->channel) & 1)
                return ATA_CBL_PATA80;
index 332f08f43b56f4933bab37b8bf44fb787ac705e6..41f6cb6c163af3af9650b6fed2e44ca959590da7 100644 (file)
@@ -119,7 +119,7 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed)
        spin_unlock_irqrestore(&atiixp_lock, flags);
 }
 
-static u8 __devinit atiixp_cable_detect(ide_hwif_t *hwif)
+static u8 atiixp_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *pdev = to_pci_dev(hwif->dev);
        u8 udma_mode = 0, ch = hwif->channel;
index 1360b4fa9fd36048d4c2da94318e3f9655dcad5a..e064398e03b4ed0e6b5c96bbf0f3cfe3078905ba 100644 (file)
@@ -354,7 +354,7 @@ static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev)
        return 0;
 }
 
-static u8 __devinit cmd64x_cable_detect(ide_hwif_t *hwif)
+static u8 cmd64x_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev  *dev    = to_pci_dev(hwif->dev);
        u8 bmidecsr = 0, mask   = hwif->channel ? 0x02 : 0x01;
index c0364b287f1765124eb7b8b2ce5cfc191ec69e74..151844fcbb079555979669f0c72cf6169815426b 100644 (file)
@@ -96,6 +96,7 @@ static const struct ide_port_ops cs5520_port_ops = {
 
 static const struct ide_port_info cyrix_chipset __devinitdata = {
        .name           = DRV_NAME,
+       .enablebits     = { { 0x60, 0x01, 0x01 }, { 0x60, 0x02, 0x02 } },
        .port_ops       = &cs5520_port_ops,
        .host_flags     = IDE_HFLAG_ISA_PORTS | IDE_HFLAG_CS5520,
        .pio_mask       = ATA_PIO4,
index f7b50cdeefa68861b261bf2bd6c9222ba13cac5b..dd3dc23af9951c0c705c9e324a9fc33c2380fb09 100644 (file)
@@ -153,7 +153,7 @@ static void cs5535_set_pio_mode(ide_drive_t *drive, const u8 pio)
        cs5535_set_speed(drive, XFER_PIO_0 + pio);
 }
 
-static u8 __devinit cs5535_cable_detect(ide_hwif_t *hwif)
+static u8 cs5535_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        u8 bit;
index 5271b246b88c92d99ad13f83724f0d9b07657fdc..748793a413ab8900c1ad0cdb0b82d9e6ba1d3d82 100644 (file)
@@ -1214,7 +1214,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev)
        return dev->irq;
 }
 
-static u8 __devinit hpt3xx_cable_detect(ide_hwif_t *hwif)
+static u8 hpt3xx_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev  *dev    = to_pci_dev(hwif->dev);
        struct ide_host *host   = pci_get_drvdata(dev);
index 6eba8f188264be200593779bb7128490a2d3d686..652e47dd7e8916f0869088d146e053876882526e 100644 (file)
@@ -141,7 +141,7 @@ static void it8213_set_dma_mode(ide_drive_t *drive, const u8 speed)
        }
 }
 
-static u8 __devinit it8213_cable_detect(ide_hwif_t *hwif)
+static u8 it8213_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        u8 reg42h = 0;
index e16a1d113a2a62e49ca6ade760c899ae1a2bfe06..b6dc723de702677dbc799b9cc6b9a4e07014f37a 100644 (file)
@@ -428,7 +428,7 @@ static void it821x_set_dma_mode(ide_drive_t *drive, const u8 speed)
  *     the needed logic onboard.
  */
 
-static u8 __devinit it821x_cable_detect(ide_hwif_t *hwif)
+static u8 it821x_cable_detect(ide_hwif_t *hwif)
 {
        /* The reference driver also only does disk side */
        return ATA_CBL_PATA80;
@@ -443,7 +443,7 @@ static u8 __devinit it821x_cable_detect(ide_hwif_t *hwif)
  *     final tuning that is needed, or fixups to work around bugs.
  */
 
-static void __devinit it821x_quirkproc(ide_drive_t *drive)
+static void it821x_quirkproc(ide_drive_t *drive)
 {
        struct it821x_dev *itdev = ide_get_hwifdata(drive->hwif);
        struct hd_driveid *id = drive->id;
index 545b6e172d9bcc74b712789edc375d6fd31f6195..bb9d09d8f1960a564941bed0f5b87238f60a50d1 100644 (file)
@@ -27,7 +27,7 @@ typedef enum {
  *     Returns the cable type.
  */
 
-static u8 __devinit jmicron_cable_detect(ide_hwif_t *hwif)
+static u8 jmicron_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *pdev = to_pci_dev(hwif->dev);
 
index 998615fa285fc0f294dc91c5719aebd18830b97f..0f609b72f47003e710e68ea04c0c093e5fe83eb8 100644 (file)
@@ -193,7 +193,7 @@ static void pdcnew_set_pio_mode(ide_drive_t *drive, const u8 pio)
        }
 }
 
-static u8 __devinit pdcnew_cable_detect(ide_hwif_t *hwif)
+static u8 pdcnew_cable_detect(ide_hwif_t *hwif)
 {
        if (get_indexed_reg(hwif, 0x0b) & 0x04)
                return ATA_CBL_PATA40;
index 6ff2def58da09841090081079a73f3761cd16681..de9a27400462a008a4ddceca29c13148d4f268b9 100644 (file)
@@ -117,7 +117,7 @@ static void pdc202xx_set_pio_mode(ide_drive_t *drive, const u8 pio)
        pdc202xx_set_mode(drive, XFER_PIO_0 + pio);
 }
 
-static u8 __devinit pdc2026x_cable_detect(ide_hwif_t *hwif)
+static u8 pdc2026x_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10);
index 7fc3022dcf684edb037c9e0649f655bbc7ae96b0..30cfc815fe3112799975ae7f4616b0793cd00ce9 100644 (file)
@@ -256,7 +256,7 @@ static const struct ich_laptop ich_laptop[] = {
        { 0, }
 };
 
-static u8 __devinit piix_cable_detect(ide_hwif_t *hwif)
+static u8 piix_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *pdev = to_pci_dev(hwif->dev);
        const struct ich_laptop *lap = &ich_laptop[0];
index 94a7ab86423616e7889c4bc4a2fa63f1f1d5b7b5..6cde48bba6f8825c998218de12d88fb9ca4ec773 100644 (file)
@@ -827,7 +827,7 @@ static void __devinit init_iops_scc(ide_hwif_t *hwif)
        init_mmio_iops_scc(hwif);
 }
 
-static u8 __devinit scc_cable_detect(ide_hwif_t *hwif)
+static u8 scc_cable_detect(ide_hwif_t *hwif)
 {
        return ATA_CBL_PATA80;
 }
index d173f2937722074e99bfbda0cdce5e437b4ab698..c3bdc6e51a4896045f1561a5883a3fd39738e0ea 100644 (file)
@@ -272,7 +272,7 @@ static unsigned int __devinit init_chipset_svwks(struct pci_dev *dev)
        return dev->irq;
 }
 
-static u8 __devinit ata66_svwks_svwks(ide_hwif_t *hwif)
+static u8 ata66_svwks_svwks(ide_hwif_t *hwif)
 {
        return ATA_CBL_PATA80;
 }
@@ -284,7 +284,7 @@ static u8 __devinit ata66_svwks_svwks(ide_hwif_t *hwif)
  * Bit 14 clear = primary IDE channel does not have 80-pin cable.
  * Bit 14 set   = primary IDE channel has 80-pin cable.
  */
-static u8 __devinit ata66_svwks_dell(ide_hwif_t *hwif)
+static u8 ata66_svwks_dell(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
 
@@ -303,7 +303,7 @@ static u8 __devinit ata66_svwks_dell(ide_hwif_t *hwif)
  *
  * WARNING: this only works on Alpine hardware!
  */
-static u8 __devinit ata66_svwks_cobalt(ide_hwif_t *hwif)
+static u8 ata66_svwks_cobalt(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
 
@@ -315,7 +315,7 @@ static u8 __devinit ata66_svwks_cobalt(ide_hwif_t *hwif)
        return ATA_CBL_PATA40;
 }
 
-static u8 __devinit svwks_cable_detect(ide_hwif_t *hwif)
+static u8 svwks_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
 
index b8ad9ad6cf0dd69db049b99edfda2f2b5be1f2e8..445ce6fbea335a6291c3ad47b4b92ac4adcf40d8 100644 (file)
@@ -639,7 +639,7 @@ static int is_dev_seagate_sata(ide_drive_t *drive)
  *     that can occur before we know what drives are present.
  */
 
-static void __devinit sil_quirkproc(ide_drive_t *drive)
+static void sil_quirkproc(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = drive->hwif;
 
@@ -679,7 +679,7 @@ static void __devinit init_iops_siimage(ide_hwif_t *hwif)
  *     Check for the presence of an ATA66 capable cable on the interface.
  */
 
-static u8 __devinit sil_cable_detect(ide_hwif_t *hwif)
+static u8 sil_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev     = to_pci_dev(hwif->dev);
        unsigned long addr      = siimage_selreg(hwif, 0);
index cc95f90b53b706c70f48584c69fcff2f5efc27b6..e5a4b42b4e33c0aea391b671d847d4a099692ddc 100644 (file)
@@ -518,7 +518,7 @@ static const struct sis_laptop sis_laptop[] = {
        { 0, }
 };
 
-static u8 __devinit sis_cable_detect(ide_hwif_t *hwif)
+static u8 sis_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *pdev = to_pci_dev(hwif->dev);
        const struct sis_laptop *lap = &sis_laptop[0];
index 13d1fa491f26148a9650d960e441a3a6345a8261..866d6c65e3a0bf02e63d1c9f131b06dde7af3542 100644 (file)
@@ -116,7 +116,7 @@ static void slc90e66_set_dma_mode(ide_drive_t *drive, const u8 speed)
        }
 }
 
-static u8 __devinit slc90e66_cable_detect(ide_hwif_t *hwif)
+static u8 slc90e66_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        u8 reg47 = 0, mask = hwif->channel ? 0x01 : 0x02;
index b1cb8a9ce5a92fc9f6a5711b4cb143b24ea2a285..7fc88c375e5db4561ccc477a5f690c2437e14df3 100644 (file)
@@ -131,7 +131,7 @@ static void tc86c001_dma_start(ide_drive_t *drive)
        ide_dma_start(drive);
 }
 
-static u8 __devinit tc86c001_cable_detect(ide_hwif_t *hwif)
+static u8 tc86c001_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        unsigned long sc_base = pci_resource_start(dev, 5);
index 454d2bf62dce90c498caf03b6fe22477dcf7a51d..a6b2cc83f293cbcf34a97eec5d0b071a2905955e 100644 (file)
@@ -352,7 +352,7 @@ static int via_cable_override(struct pci_dev *pdev)
        return 0;
 }
 
-static u8 __devinit via82cxxx_cable_detect(ide_hwif_t *hwif)
+static u8 via82cxxx_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *pdev = to_pci_dev(hwif->dev);
        struct ide_host *host = pci_get_drvdata(pdev);
index dd9bc68f1c7bdd4a99cb41520ef685dd5f452951..898c8b5c38dd9a604194ed2903364add33fbb93d 100644 (file)
@@ -42,7 +42,7 @@
  */
 
 
-#include <asm-powerpc/system.h>
+#include <asm/system.h>
 #include "ehca_classes.h"
 #include "ehca_tools.h"
 #include "ehca_qes.h"
index 7797ef6e5e64be5a0c19a2dc255445591aedb131..22f17a593be78ca2f6bb6fda1a35323e8e06e006 100644 (file)
@@ -2,7 +2,7 @@
  * SEGA Dreamcast keyboard driver
  * Based on drivers/usb/usbkbd.c
  * Copyright YAEGASHI Takeshi, 2001
- * Porting to 2.6 Copyright Adrian McMenamin, 2007
+ * Porting to 2.6 Copyright Adrian McMenamin, 2007, 2008
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -45,39 +45,51 @@ struct dc_kbd {
 };
 
 static const unsigned short dc_kbd_keycode[NR_SCANCODES] = {
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_A, KEY_B, KEY_C, KEY_D,
-       KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L,
-       KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T,
-       KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_2,
-       KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0,
-       KEY_ENTER, KEY_ESC, KEY_BACKSPACE, KEY_TAB, KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_LEFTBRACE,
-       KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_BACKSLASH, KEY_SEMICOLON, KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA,
-       KEY_DOT, KEY_SLASH, KEY_CAPSLOCK, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_A, KEY_B,
+       KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L,
+       KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V,
+       KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6,
+       KEY_7, KEY_8, KEY_9, KEY_0, KEY_ENTER, KEY_ESC, KEY_BACKSPACE,
+       KEY_TAB, KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_LEFTBRACE,
+       KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_BACKSLASH, KEY_SEMICOLON,
+       KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, KEY_DOT, KEY_SLASH,
+       KEY_CAPSLOCK, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6,
        KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_SYSRQ,
-       KEY_SCROLLLOCK, KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP, KEY_DELETE,
-       KEY_END, KEY_PAGEDOWN, KEY_RIGHT, KEY_LEFT, KEY_DOWN, KEY_UP,
-       KEY_NUMLOCK, KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS, KEY_KPPLUS, KEY_KPENTER, KEY_KP1, KEY_KP2,
-       KEY_KP3, KEY_KP4, KEY_KP5, KEY_KP6, KEY_KP7, KEY_KP8, KEY_KP9, KEY_KP0, KEY_KPDOT,
-       KEY_102ND, KEY_COMPOSE, KEY_POWER, KEY_KPEQUAL, KEY_F13, KEY_F14, KEY_F15,
-       KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20,
-       KEY_F21, KEY_F22, KEY_F23, KEY_F24, KEY_OPEN, KEY_HELP, KEY_PROPS, KEY_FRONT,
-       KEY_STOP, KEY_AGAIN, KEY_UNDO, KEY_CUT, KEY_COPY, KEY_PASTE, KEY_FIND, KEY_MUTE,
-       KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_KPCOMMA, KEY_RESERVED, KEY_RO, KEY_KATAKANAHIRAGANA , KEY_YEN,
-       KEY_HENKAN, KEY_MUHENKAN, KEY_KPJPCOMMA, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_HANGEUL, KEY_HANJA, KEY_KATAKANA, KEY_HIRAGANA, KEY_ZENKAKUHANKAKU, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-       KEY_LEFTCTRL, KEY_LEFTSHIFT, KEY_LEFTALT, KEY_LEFTMETA, KEY_RIGHTCTRL, KEY_RIGHTSHIFT, KEY_RIGHTALT, KEY_RIGHTMETA,
-       KEY_PLAYPAUSE, KEY_STOPCD, KEY_PREVIOUSSONG, KEY_NEXTSONG, KEY_EJECTCD, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE,
-       KEY_WWW, KEY_BACK, KEY_FORWARD, KEY_STOP, KEY_FIND, KEY_SCROLLUP, KEY_SCROLLDOWN, KEY_EDIT, KEY_SLEEP,
-       KEY_SCREENLOCK, KEY_REFRESH, KEY_CALC, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED
+       KEY_SCROLLLOCK, KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP,
+       KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_RIGHT, KEY_LEFT, KEY_DOWN,
+       KEY_UP, KEY_NUMLOCK, KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS,
+       KEY_KPPLUS, KEY_KPENTER, KEY_KP1, KEY_KP2, KEY_KP3, KEY_KP4, KEY_KP5,
+       KEY_KP6, KEY_KP7, KEY_KP8, KEY_KP9, KEY_KP0, KEY_KPDOT, KEY_102ND,
+       KEY_COMPOSE, KEY_POWER, KEY_KPEQUAL, KEY_F13, KEY_F14, KEY_F15,
+       KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20, KEY_F21, KEY_F22,
+       KEY_F23, KEY_F24, KEY_OPEN, KEY_HELP, KEY_PROPS, KEY_FRONT, KEY_STOP,
+       KEY_AGAIN, KEY_UNDO, KEY_CUT, KEY_COPY, KEY_PASTE, KEY_FIND, KEY_MUTE,
+       KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_KPCOMMA, KEY_RESERVED, KEY_RO, KEY_KATAKANAHIRAGANA , KEY_YEN,
+       KEY_HENKAN, KEY_MUHENKAN, KEY_KPJPCOMMA, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_HANGEUL, KEY_HANJA, KEY_KATAKANA, KEY_HIRAGANA,
+       KEY_ZENKAKUHANKAKU, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+       KEY_RESERVED, KEY_RESERVED, KEY_LEFTCTRL, KEY_LEFTSHIFT, KEY_LEFTALT,
+       KEY_LEFTMETA, KEY_RIGHTCTRL, KEY_RIGHTSHIFT, KEY_RIGHTALT,
+       KEY_RIGHTMETA, KEY_PLAYPAUSE, KEY_STOPCD, KEY_PREVIOUSSONG,
+       KEY_NEXTSONG, KEY_EJECTCD, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE,
+       KEY_WWW, KEY_BACK, KEY_FORWARD, KEY_STOP, KEY_FIND, KEY_SCROLLUP,
+       KEY_SCROLLDOWN, KEY_EDIT, KEY_SLEEP, KEY_SCREENLOCK, KEY_REFRESH,
+       KEY_CALC, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED
 };
 
 static void dc_scan_kbd(struct dc_kbd *kbd)
@@ -127,12 +139,12 @@ static void dc_scan_kbd(struct dc_kbd *kbd)
 static void dc_kbd_callback(struct mapleq *mq)
 {
        struct maple_device *mapledev = mq->dev;
-       struct dc_kbd *kbd = mapledev->private_data;
+       struct dc_kbd *kbd = maple_get_drvdata(mapledev);
        unsigned long *buf = mq->recvbuf;
 
        /*
-        * We should always be getting the lock because the only
-        * time it may be locked if driver is in cleanup phase.
+        * We should always get the lock because the only
+        * time it may be locked is if the driver is in the cleanup phase.
         */
        if (likely(mutex_trylock(&maple_keyb_mutex))) {
 
@@ -145,106 +157,96 @@ static void dc_kbd_callback(struct mapleq *mq)
        }
 }
 
-static int dc_kbd_connect(struct maple_device *mdev)
+static int probe_maple_kbd(struct device *dev)
 {
+       struct maple_device *mdev = to_maple_dev(dev);
+       struct maple_driver *mdrv = to_maple_driver(dev->driver);
        int i, error;
        struct dc_kbd *kbd;
-       struct input_dev *dev;
+       struct input_dev *idev;
 
        if (!(mdev->function & MAPLE_FUNC_KEYBOARD))
                return -EINVAL;
 
        kbd = kzalloc(sizeof(struct dc_kbd), GFP_KERNEL);
-       dev = input_allocate_device();
-       if (!kbd || !dev) {
+       idev = input_allocate_device();
+       if (!kbd || !idev) {
                error = -ENOMEM;
                goto fail;
        }
 
-       mdev->private_data = kbd;
-
-       kbd->dev = dev;
+       kbd->dev = idev;
        memcpy(kbd->keycode, dc_kbd_keycode, sizeof(kbd->keycode));
 
-       dev->name = mdev->product_name;
-       dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
-       dev->keycode = kbd->keycode;
-       dev->keycodesize = sizeof (unsigned short);
-       dev->keycodemax = ARRAY_SIZE(kbd->keycode);
-       dev->id.bustype = BUS_HOST;
-       dev->dev.parent = &mdev->dev;
+       idev->name = mdev->product_name;
+       idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
+       idev->keycode = kbd->keycode;
+       idev->keycodesize = sizeof(unsigned short);
+       idev->keycodemax = ARRAY_SIZE(kbd->keycode);
+       idev->id.bustype = BUS_HOST;
+       idev->dev.parent = &mdev->dev;
 
        for (i = 0; i < NR_SCANCODES; i++)
-               __set_bit(dc_kbd_keycode[i], dev->keybit);
-       __clear_bit(KEY_RESERVED, dev->keybit);
+               __set_bit(dc_kbd_keycode[i], idev->keybit);
+       __clear_bit(KEY_RESERVED, idev->keybit);
 
-       input_set_capability(dev, EV_MSC, MSC_SCAN);
-       input_set_drvdata(dev, kbd);
+       input_set_capability(idev, EV_MSC, MSC_SCAN);
+       input_set_drvdata(idev, kbd);
 
-       error = input_register_device(dev);
+       error = input_register_device(idev);
        if (error)
                goto fail;
 
        /* Maple polling is locked to VBLANK - which may be just 50/s */
-       maple_getcond_callback(mdev, dc_kbd_callback, HZ/50, MAPLE_FUNC_KEYBOARD);
-       return 0;
+       maple_getcond_callback(mdev, dc_kbd_callback, HZ/50,
+               MAPLE_FUNC_KEYBOARD);
 
- fail:
-       input_free_device(dev);
+       mdev->driver = mdrv;
+
+       maple_set_drvdata(mdev, kbd);
+
+       return error;
+
+fail:
+       input_free_device(idev);
        kfree(kbd);
-       mdev->private_data = NULL;
+       maple_set_drvdata(mdev, NULL);
        return error;
 }
 
-static void dc_kbd_disconnect(struct maple_device *mdev)
+static int remove_maple_kbd(struct device *dev)
 {
-       struct dc_kbd *kbd;
+       struct maple_device *mdev = to_maple_dev(dev);
+       struct dc_kbd *kbd = maple_get_drvdata(mdev);
 
        mutex_lock(&maple_keyb_mutex);
 
-       kbd = mdev->private_data;
-       mdev->private_data = NULL;
        input_unregister_device(kbd->dev);
        kfree(kbd);
 
-       mutex_unlock(&maple_keyb_mutex);
-}
-
-/* allow the keyboard to be used */
-static int probe_maple_kbd(struct device *dev)
-{
-       struct maple_device *mdev = to_maple_dev(dev);
-       struct maple_driver *mdrv = to_maple_driver(dev->driver);
-       int error;
-
-       error = dc_kbd_connect(mdev);
-       if (error)
-               return error;
-
-       mdev->driver = mdrv;
-       mdev->registered = 1;
+       maple_set_drvdata(mdev, NULL);
 
+       mutex_unlock(&maple_keyb_mutex);
        return 0;
 }
 
 static struct maple_driver dc_kbd_driver = {
        .function = MAPLE_FUNC_KEYBOARD,
-       .connect = dc_kbd_connect,
-       .disconnect = dc_kbd_disconnect,
        .drv = {
                .name = "Dreamcast_keyboard",
                .probe = probe_maple_kbd,
-       },
+               .remove = remove_maple_kbd,
+       },
 };
 
 static int __init dc_kbd_init(void)
 {
-       return maple_driver_register(&dc_kbd_driver.drv);
+       return maple_driver_register(&dc_kbd_driver);
 }
 
 static void __exit dc_kbd_exit(void)
 {
-       driver_unregister(&dc_kbd_driver.drv);
+       maple_driver_unregister(&dc_kbd_driver);
 }
 
 module_init(dc_kbd_init);
index 8380a4568d11dda17aa5c0b92839a8ab334e5dbf..f1f777570e8e662417aa99a59f3004422ade771c 100644 (file)
@@ -5,7 +5,7 @@
 obj-$(CONFIG_ISDN_I4L)                 += i4l/
 obj-$(CONFIG_ISDN_CAPI)                        += capi/
 obj-$(CONFIG_MISDN)                    += mISDN/
-obj-$(CONFIG_ISDN_CAPI)                        += hardware/
+obj-$(CONFIG_ISDN)                     += hardware/
 obj-$(CONFIG_ISDN_DIVERSION)           += divert/
 obj-$(CONFIG_ISDN_DRV_HISAX)           += hisax/
 obj-$(CONFIG_ISDN_DRV_ICN)             += icn/
index 2649ea55a9e8d8df07ab35ec849a0f8055673901..1eac03f39d0005e0e75b75f3925e1924193e794b 100644 (file)
  * #define HFC_REGISTER_DEBUG
  */
 
-static const char *hfcmulti_revision = "2.00";
+static const char *hfcmulti_revision = "2.02";
 
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -427,12 +427,12 @@ write_fifo_regio(struct hfc_multi *hc, u_char *data, int len)
 {
        outb(A_FIFO_DATA0, (hc->pci_iobase)+4);
        while (len>>2) {
-               outl(*(u32 *)data, hc->pci_iobase);
+               outl(cpu_to_le32(*(u32 *)data), hc->pci_iobase);
                data += 4;
                len -= 4;
        }
        while (len>>1) {
-               outw(*(u16 *)data, hc->pci_iobase);
+               outw(cpu_to_le16(*(u16 *)data), hc->pci_iobase);
                data += 2;
                len -= 2;
        }
@@ -447,17 +447,19 @@ void
 write_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len)
 {
        while (len>>2) {
-               writel(*(u32 *)data, (hc->pci_membase)+A_FIFO_DATA0);
+               writel(cpu_to_le32(*(u32 *)data),
+                       hc->pci_membase + A_FIFO_DATA0);
                data += 4;
                len -= 4;
        }
        while (len>>1) {
-               writew(*(u16 *)data, (hc->pci_membase)+A_FIFO_DATA0);
+               writew(cpu_to_le16(*(u16 *)data),
+                       hc->pci_membase + A_FIFO_DATA0);
                data += 2;
                len -= 2;
        }
        while (len) {
-               writeb(*data, (hc->pci_membase)+A_FIFO_DATA0);
+               writeb(*data, hc->pci_membase + A_FIFO_DATA0);
                data++;
                len--;
        }
@@ -468,12 +470,12 @@ read_fifo_regio(struct hfc_multi *hc, u_char *data, int len)
 {
        outb(A_FIFO_DATA0, (hc->pci_iobase)+4);
        while (len>>2) {
-               *(u32 *)data = inl(hc->pci_iobase);
+               *(u32 *)data = le32_to_cpu(inl(hc->pci_iobase));
                data += 4;
                len -= 4;
        }
        while (len>>1) {
-               *(u16 *)data = inw(hc->pci_iobase);
+               *(u16 *)data = le16_to_cpu(inw(hc->pci_iobase));
                data += 2;
                len -= 2;
        }
@@ -490,18 +492,18 @@ read_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len)
 {
        while (len>>2) {
                *(u32 *)data =
-                       readl((hc->pci_membase)+A_FIFO_DATA0);
+                       le32_to_cpu(readl(hc->pci_membase + A_FIFO_DATA0));
                data += 4;
                len -= 4;
        }
        while (len>>1) {
                *(u16 *)data =
-                       readw((hc->pci_membase)+A_FIFO_DATA0);
+                       le16_to_cpu(readw(hc->pci_membase + A_FIFO_DATA0));
                data += 2;
                len -= 2;
        }
        while (len) {
-               *data = readb((hc->pci_membase)+A_FIFO_DATA0);
+               *data = readb(hc->pci_membase + A_FIFO_DATA0);
                data++;
                len--;
        }
@@ -3971,7 +3973,7 @@ open_bchannel(struct hfc_multi *hc, struct dchannel *dch,
        struct bchannel *bch;
        int             ch;
 
-       if (!test_bit(rq->adr.channel, &dch->dev.channelmap[0]))
+       if (!test_channelmap(rq->adr.channel, dch->dev.channelmap))
                return -EINVAL;
        if (rq->protocol == ISDN_P_NONE)
                return -EINVAL;
@@ -4587,7 +4589,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
                list_add(&bch->ch.list, &dch->dev.bchannels);
                hc->chan[ch].bch = bch;
                hc->chan[ch].port = 0;
-               test_and_set_bit(bch->nr, &dch->dev.channelmap[0]);
+               set_channelmap(bch->nr, dch->dev.channelmap);
        }
        /* set optical line type */
        if (port[Port_cnt] & 0x001) {
@@ -4755,7 +4757,7 @@ init_multi_port(struct hfc_multi *hc, int pt)
                list_add(&bch->ch.list, &dch->dev.bchannels);
                hc->chan[i + ch].bch = bch;
                hc->chan[i + ch].port = pt;
-               test_and_set_bit(bch->nr, &dch->dev.channelmap[0]);
+               set_channelmap(bch->nr, dch->dev.channelmap);
        }
        /* set master clock */
        if (port[Port_cnt] & 0x001) {
@@ -5050,12 +5052,12 @@ static void __devexit hfc_remove_pci(struct pci_dev *pdev)
 
 static const struct hm_map hfcm_map[] = {
 /*0*/  {VENDOR_BN, "HFC-1S Card (mini PCI)", 4, 1, 1, 3, 0, DIP_4S, 0},
-/*1*/  {VENDOR_BN, "HFC-2S Card", 4, 2, 1, 3, 0, DIP_4S},
+/*1*/  {VENDOR_BN, "HFC-2S Card", 4, 2, 1, 3, 0, DIP_4S, 0},
 /*2*/  {VENDOR_BN, "HFC-2S Card (mini PCI)", 4, 2, 1, 3, 0, DIP_4S, 0},
 /*3*/  {VENDOR_BN, "HFC-4S Card", 4, 4, 1, 2, 0, DIP_4S, 0},
 /*4*/  {VENDOR_BN, "HFC-4S Card (mini PCI)", 4, 4, 1, 2, 0, 0, 0},
 /*5*/  {VENDOR_CCD, "HFC-4S Eval (old)", 4, 4, 0, 0, 0, 0, 0},
-/*6*/  {VENDOR_CCD, "HFC-4S IOB4ST", 4, 4, 1, 2, 0, 0, 0},
+/*6*/  {VENDOR_CCD, "HFC-4S IOB4ST", 4, 4, 1, 2, 0, DIP_4S, 0},
 /*7*/  {VENDOR_CCD, "HFC-4S", 4, 4, 1, 2, 0, 0, 0},
 /*8*/  {VENDOR_DIG, "HFC-4S Card", 4, 4, 0, 2, 0, 0, HFC_IO_MODE_REGIO},
 /*9*/  {VENDOR_CCD, "HFC-4S Swyx 4xS0 SX2 QuadBri", 4, 4, 1, 2, 0, 0, 0},
@@ -5251,9 +5253,6 @@ HFCmulti_init(void)
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: init entered\n", __func__);
 
-#ifdef __BIG_ENDIAN
-#error "not running on big endian machines now"
-#endif
        hfc_interrupt = symbol_get(ztdummy_extern_interrupt);
        register_interrupt = symbol_get(ztdummy_register_interrupt);
        unregister_interrupt = symbol_get(ztdummy_unregister_interrupt);
index 3231814e7efa0ef5fd335fc51420e9e756acc48e..9cf5edbb1a9b119db51d1b60494b3767886184d8 100644 (file)
@@ -2056,7 +2056,7 @@ setup_card(struct hfc_pci *card)
        card->dch.dev.nrbchan = 2;
        for (i = 0; i < 2; i++) {
                card->bch[i].nr = i + 1;
-               test_and_set_bit(i + 1, &card->dch.dev.channelmap[0]);
+               set_channelmap(i + 1, card->dch.dev.channelmap);
                card->bch[i].debug = debug;
                mISDN_initbchannel(&card->bch[i], MAX_DATA_MEM);
                card->bch[i].hw = card;
index 155b99780c4fe93e934dd9f7e0bb3cfbc2fb7117..e42150a577805a7ad5f8d38971d34e4b5b04020d 100644 (file)
@@ -1006,8 +1006,7 @@ open_bchannel(struct l1oip *hc, struct dchannel *dch, struct channel_req *rq)
        struct bchannel *bch;
        int             ch;
 
-       if (!test_bit(rq->adr.channel & 0x1f,
-               &dch->dev.channelmap[rq->adr.channel >> 5]))
+       if (!test_channelmap(rq->adr.channel, dch->dev.channelmap))
                return -EINVAL;
        if (rq->protocol == ISDN_P_NONE)
                return -EINVAL;
@@ -1412,8 +1411,7 @@ init_card(struct l1oip *hc, int pri, int bundle)
                bch->ch.nr = i + ch;
                list_add(&bch->ch.list, &dch->dev.bchannels);
                hc->chan[i + ch].bch = bch;
-               test_and_set_bit(bch->nr & 0x1f,
-                       &dch->dev.channelmap[bch->nr >> 5]);
+               set_channelmap(bch->nr, dch->dev.channelmap);
        }
        ret = mISDN_register_device(&dch->dev, hc->name);
        if (ret)
index 4ba4cc364c9e96ffb08c9786a55a4d00431cb7ac..e5a20f9542d1bb4456c602f73b4343879d268bac 100644 (file)
@@ -379,7 +379,7 @@ data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        di.Bprotocols = dev->Bprotocols | get_all_Bprotocols();
                        di.protocol = dev->D.protocol;
                        memcpy(di.channelmap, dev->channelmap,
-                               MISDN_CHMAP_SIZE * 4);
+                               sizeof(di.channelmap));
                        di.nrbchan = dev->nrbchan;
                        strcpy(di.name, dev->name);
                        if (copy_to_user((void __user *)arg, &di, sizeof(di)))
@@ -637,7 +637,7 @@ base_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        di.Bprotocols = dev->Bprotocols | get_all_Bprotocols();
                        di.protocol = dev->D.protocol;
                        memcpy(di.channelmap, dev->channelmap,
-                               MISDN_CHMAP_SIZE * 4);
+                               sizeof(di.channelmap));
                        di.nrbchan = dev->nrbchan;
                        strcpy(di.name, dev->name);
                        if (copy_to_user((void __user *)arg, &di, sizeof(di)))
index b1e5b4705250472a2819da9537fff2422e3ef967..d7e46d345d9e59410aa0da024c8c8839857fb326 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/delay.h>
 #include <linux/sched.h>
 #include <linux/timer.h>
-#include <linux/hdreg.h>
 #include <linux/stddef.h>
 #include <linux/init.h>
 #include <linux/ide.h>
index 3989b0eded28c7d8152ec013e3ea270982b45785..ef7572cbc4ab878f22a4c45cf87fc51679116dd8 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/i2c-algo-sgi.h>
 
 #include <linux/videodev2.h>
+#include <media/v4l2-ioctl.h>
 #include <media/v4l2-common.h>
 #include <linux/video_decoder.h>
 #include <linux/mutex.h>
index bcfd5425e2e6416ec1b72397c61ea890a7b3eed6..c84496a7769176843d03b2ea680a620cf888c5be 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/hugetlb.h>
 #include <linux/delay.h>
 #include <linux/timex.h>
-#include <linux/delay.h>
 #include <linux/srcu.h>
 #include <asm/processor.h>
 #include "gru.h"
index a806119797e0feeb3fd2969199a334daa6aa9c21..113b1062020d65156312e20239d7f8649bfffd4b 100644 (file)
@@ -25,7 +25,7 @@
 #endif
 
 #include <asm/hardware.h>
-#include <asm/arch-sa1100/h3600.h>
+#include <asm/arch/h3600.h>
 #include <asm/io.h>
 
 
index 9b6af7e74a6541d9234a75eedd67d11412023b2c..00d46e137b2ab306ca3775c4f216d6016a44df37 100644 (file)
@@ -125,8 +125,11 @@ int get_sb_mtd(struct file_system_type *fs_type, int flags,
               int (*fill_super)(struct super_block *, void *, int),
               struct vfsmount *mnt)
 {
+#ifdef CONFIG_BLOCK
        struct block_device *bdev;
-       int mtdnr, ret;
+       int ret, major;
+#endif
+       int mtdnr;
 
        if (!dev_name)
                return -EINVAL;
@@ -178,6 +181,7 @@ int get_sb_mtd(struct file_system_type *fs_type, int flags,
                }
        }
 
+#ifdef CONFIG_BLOCK
        /* try the old way - the hack where we allowed users to mount
         * /dev/mtdblock$(n) but didn't actually _use_ the blockdev
         */
@@ -190,22 +194,25 @@ int get_sb_mtd(struct file_system_type *fs_type, int flags,
        DEBUG(1, "MTDSB: lookup_bdev() returned 0\n");
 
        ret = -EINVAL;
-       if (MAJOR(bdev->bd_dev) != MTD_BLOCK_MAJOR)
-               goto not_an_MTD_device;
 
+       major = MAJOR(bdev->bd_dev);
        mtdnr = MINOR(bdev->bd_dev);
        bdput(bdev);
 
+       if (major != MTD_BLOCK_MAJOR)
+               goto not_an_MTD_device;
+
        return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super,
                             mnt);
 
 not_an_MTD_device:
+#endif /* CONFIG_BLOCK */
+
        if (!(flags & MS_SILENT))
                printk(KERN_NOTICE
                       "MTD: Attempt to mount non-MTD device \"%s\"\n",
                       dev_name);
-       bdput(bdev);
-       return ret;
+       return -EINVAL;
 }
 
 EXPORT_SYMBOL_GPL(get_sb_mtd);
index b65be5d70fecfee4d21f8d9d66505e411ed08164..2ed0bd5968157620a2179757875fe25cafaa3d6a 100644 (file)
@@ -19,7 +19,7 @@
 
 #include <asm/system.h>
 #include <asm/io.h>
-#include <asm/se.h>
+#include <mach-se/mach/se.h>
 #include <asm/machvec.h>
 #ifdef CONFIG_SH_STANDARD_BIOS
 #include <asm/sh_bios.h>
index d0c1d63d1891bbe7a87587d79e120cfce4aef813..203e579ebbd22e77e5413f86995bce689cc87508 100644 (file)
@@ -275,7 +275,7 @@ static int readable(struct pcmcia_socket *s, struct resource *res,
                destroy_cis_cache(s);
        }
        s->cis_mem.res = NULL;
-       if ((ret != 0) || (count == 0))
+       if ((ret != 0) || (*count == 0))
                return 0;
        return 1;
 }
index 8624f55d05608cabe99e6f91a9e18220be699a13..a1af4c27939b446b0de1f43d8d61c7a51b610d21 100644 (file)
@@ -2,7 +2,7 @@
  * Blackfin On-Chip Real Time Clock Driver
  *  Supports BF52[257]/BF53[123]/BF53[467]/BF54[24789]
  *
- * Copyright 2004-2007 Analog Devices Inc.
+ * Copyright 2004-2008 Analog Devices Inc.
  *
  * Enter bugs at http://blackfin.uclinux.org/
  *
  * writes to clear status registers complete immediately.
  */
 
+/* It may seem odd that there is no SWCNT code in here (which would be exposed
+ * via the periodic interrupt event, or PIE).  Since the Blackfin RTC peripheral
+ * runs in units of seconds (N/HZ) but the Linux framework runs in units of HZ
+ * (2^N HZ), there is no point in keeping code that only provides 1 HZ PIEs.
+ * The same exact behavior can be accomplished by using the update interrupt
+ * event (UIE).  Maybe down the line the RTC peripheral will suck less in which
+ * case we can re-introduce PIE support.
+ */
+
 #include <linux/bcd.h>
 #include <linux/completion.h>
 #include <linux/delay.h>
@@ -144,14 +153,13 @@ static void bfin_rtc_sync_pending(struct device *dev)
  * Initialize the RTC.  Enable pre-scaler to scale RTC clock
  * to 1Hz and clear interrupt/status registers.
  */
-static void bfin_rtc_reset(struct device *dev)
+static void bfin_rtc_reset(struct device *dev, u16 rtc_ictl)
 {
        struct bfin_rtc *rtc = dev_get_drvdata(dev);
        dev_dbg_stamp(dev);
        bfin_rtc_sync_pending(dev);
        bfin_write_RTC_PREN(0x1);
-       bfin_write_RTC_ICTL(RTC_ISTAT_WRITE_COMPLETE);
-       bfin_write_RTC_SWCNT(0);
+       bfin_write_RTC_ICTL(rtc_ictl);
        bfin_write_RTC_ALARM(0);
        bfin_write_RTC_ISTAT(0xFFFF);
        rtc->rtc_wrote_regs = 0;
@@ -194,14 +202,6 @@ static irqreturn_t bfin_rtc_interrupt(int irq, void *dev_id)
                }
        }
 
-       if (rtc_ictl & RTC_ISTAT_STOPWATCH) {
-               if (rtc_istat & RTC_ISTAT_STOPWATCH) {
-                       bfin_write_RTC_ISTAT(RTC_ISTAT_STOPWATCH);
-                       events |= RTC_PF | RTC_IRQF;
-                       bfin_write_RTC_SWCNT(rtc->rtc_dev->irq_freq);
-               }
-       }
-
        if (rtc_ictl & RTC_ISTAT_SEC) {
                if (rtc_istat & RTC_ISTAT_SEC) {
                        bfin_write_RTC_ISTAT(RTC_ISTAT_SEC);
@@ -226,7 +226,7 @@ static int bfin_rtc_open(struct device *dev)
 
        ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, IRQF_SHARED, to_platform_device(dev)->name, dev);
        if (!ret)
-               bfin_rtc_reset(dev);
+               bfin_rtc_reset(dev, RTC_ISTAT_WRITE_COMPLETE);
 
        return ret;
 }
@@ -234,16 +234,16 @@ static int bfin_rtc_open(struct device *dev)
 static void bfin_rtc_release(struct device *dev)
 {
        dev_dbg_stamp(dev);
-       bfin_rtc_reset(dev);
+       bfin_rtc_reset(dev, 0);
        free_irq(IRQ_RTC, dev);
 }
 
-static void bfin_rtc_int_set(struct bfin_rtc *rtc, u16 rtc_int)
+static void bfin_rtc_int_set(u16 rtc_int)
 {
        bfin_write_RTC_ISTAT(rtc_int);
        bfin_write_RTC_ICTL(bfin_read_RTC_ICTL() | rtc_int);
 }
-static void bfin_rtc_int_clear(struct bfin_rtc *rtc, u16 rtc_int)
+static void bfin_rtc_int_clear(u16 rtc_int)
 {
        bfin_write_RTC_ICTL(bfin_read_RTC_ICTL() & rtc_int);
 }
@@ -252,7 +252,7 @@ static void bfin_rtc_int_set_alarm(struct bfin_rtc *rtc)
        /* Blackfin has different bits for whether the alarm is
         * more than 24 hours away.
         */
-       bfin_rtc_int_set(rtc, (rtc->rtc_alarm.tm_yday == -1 ? RTC_ISTAT_ALARM : RTC_ISTAT_ALARM_DAY));
+       bfin_rtc_int_set(rtc->rtc_alarm.tm_yday == -1 ? RTC_ISTAT_ALARM : RTC_ISTAT_ALARM_DAY);
 }
 static int bfin_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
 {
@@ -264,23 +264,13 @@ static int bfin_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long ar
        bfin_rtc_sync_pending(dev);
 
        switch (cmd) {
-       case RTC_PIE_ON:
-               dev_dbg_stamp(dev);
-               bfin_rtc_int_set(rtc, RTC_ISTAT_STOPWATCH);
-               bfin_write_RTC_SWCNT(rtc->rtc_dev->irq_freq);
-               break;
-       case RTC_PIE_OFF:
-               dev_dbg_stamp(dev);
-               bfin_rtc_int_clear(rtc, ~RTC_ISTAT_STOPWATCH);
-               break;
-
        case RTC_UIE_ON:
                dev_dbg_stamp(dev);
-               bfin_rtc_int_set(rtc, RTC_ISTAT_SEC);
+               bfin_rtc_int_set(RTC_ISTAT_SEC);
                break;
        case RTC_UIE_OFF:
                dev_dbg_stamp(dev);
-               bfin_rtc_int_clear(rtc, ~RTC_ISTAT_SEC);
+               bfin_rtc_int_clear(~RTC_ISTAT_SEC);
                break;
 
        case RTC_AIE_ON:
@@ -289,7 +279,7 @@ static int bfin_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long ar
                break;
        case RTC_AIE_OFF:
                dev_dbg_stamp(dev);
-               bfin_rtc_int_clear(rtc, ~(RTC_ISTAT_ALARM | RTC_ISTAT_ALARM_DAY));
+               bfin_rtc_int_clear(~(RTC_ISTAT_ALARM | RTC_ISTAT_ALARM_DAY));
                break;
 
        default:
@@ -371,30 +361,14 @@ static int bfin_rtc_proc(struct device *dev, struct seq_file *seq)
        seq_printf(seq,
                "alarm_IRQ\t: %s\n"
                "wkalarm_IRQ\t: %s\n"
-               "seconds_IRQ\t: %s\n"
-               "periodic_IRQ\t: %s\n",
+               "seconds_IRQ\t: %s\n",
                yesno(ictl & RTC_ISTAT_ALARM),
                yesno(ictl & RTC_ISTAT_ALARM_DAY),
-               yesno(ictl & RTC_ISTAT_SEC),
-               yesno(ictl & RTC_ISTAT_STOPWATCH));
+               yesno(ictl & RTC_ISTAT_SEC));
        return 0;
 #undef yesno
 }
 
-/**
- *     bfin_irq_set_freq - make sure hardware supports requested freq
- *     @dev: pointer to RTC device structure
- *     @freq: requested frequency rate
- *
- *     The Blackfin RTC can only generate periodic events at 1 per
- *     second (1 Hz), so reject any attempt at changing it.
- */
-static int bfin_irq_set_freq(struct device *dev, int freq)
-{
-       dev_dbg_stamp(dev);
-       return -ENOTTY;
-}
-
 static struct rtc_class_ops bfin_rtc_ops = {
        .open          = bfin_rtc_open,
        .release       = bfin_rtc_release,
@@ -404,7 +378,6 @@ static struct rtc_class_ops bfin_rtc_ops = {
        .read_alarm    = bfin_rtc_read_alarm,
        .set_alarm     = bfin_rtc_set_alarm,
        .proc          = bfin_rtc_proc,
-       .irq_set_freq  = bfin_irq_set_freq,
 };
 
 static int __devinit bfin_rtc_probe(struct platform_device *pdev)
@@ -423,10 +396,14 @@ static int __devinit bfin_rtc_probe(struct platform_device *pdev)
                ret = PTR_ERR(rtc->rtc_dev);
                goto err;
        }
-       rtc->rtc_dev->irq_freq = 1;
+
+       /* see comment at top of file about stopwatch/PIE */
+       bfin_write_RTC_SWCNT(0);
 
        platform_set_drvdata(pdev, rtc);
 
+       device_init_wakeup(&pdev->dev, 1);
+
        return 0;
 
  err:
@@ -445,6 +422,32 @@ static int __devexit bfin_rtc_remove(struct platform_device *pdev)
        return 0;
 }
 
+#ifdef CONFIG_PM
+static int bfin_rtc_suspend(struct platform_device *pdev, pm_message_t state)
+{
+       if (device_may_wakeup(&pdev->dev)) {
+               enable_irq_wake(IRQ_RTC);
+               bfin_rtc_sync_pending(&pdev->dev);
+       } else
+               bfin_rtc_int_clear(-1);
+
+       return 0;
+}
+
+static int bfin_rtc_resume(struct platform_device *pdev)
+{
+       if (device_may_wakeup(&pdev->dev))
+               disable_irq_wake(IRQ_RTC);
+       else
+               bfin_write_RTC_ISTAT(-1);
+
+       return 0;
+}
+#else
+# define bfin_rtc_suspend NULL
+# define bfin_rtc_resume  NULL
+#endif
+
 static struct platform_driver bfin_rtc_driver = {
        .driver         = {
                .name   = "rtc-bfin",
@@ -452,6 +455,8 @@ static struct platform_driver bfin_rtc_driver = {
        },
        .probe          = bfin_rtc_probe,
        .remove         = __devexit_p(bfin_rtc_remove),
+       .suspend        = bfin_rtc_suspend,
+       .resume         = bfin_rtc_resume,
 };
 
 static int __init bfin_rtc_init(void)
index da876d3924be2ecaf3d59da6289a280d11e06c43..a48e4990fe12fc79f06d649faa5dac4887f0a65e 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/delay.h>
 #include <linux/timer.h>
 #include <linux/spinlock.h>
-#include <linux/hdreg.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <asm/div64.h>
@@ -1249,6 +1248,13 @@ static struct pci_device_id hptiop_id_table[] = {
        { PCI_VDEVICE(TTI, 0x3522), (kernel_ulong_t)&hptiop_itl_ops },
        { PCI_VDEVICE(TTI, 0x3410), (kernel_ulong_t)&hptiop_itl_ops },
        { PCI_VDEVICE(TTI, 0x3540), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x3530), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x3560), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x4322), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x4210), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x4211), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x4310), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x4311), (kernel_ulong_t)&hptiop_itl_ops },
        { PCI_VDEVICE(TTI, 0x3120), (kernel_ulong_t)&hptiop_mv_ops },
        { PCI_VDEVICE(TTI, 0x3122), (kernel_ulong_t)&hptiop_mv_ops },
        { PCI_VDEVICE(TTI, 0x3020), (kernel_ulong_t)&hptiop_mv_ops },
index b40a673985aa66fd2fe5310945b2993a0aa2feb2..461331d3dc45f041fd23bb8c02cc0f87b6737fe8 100644 (file)
@@ -102,11 +102,10 @@ static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk)
        mutex_lock(&idescsi_ref_mutex);
        scsi = ide_scsi_g(disk);
        if (scsi) {
-               scsi_host_get(scsi->host);
-               if (ide_device_get(scsi->drive)) {
-                       scsi_host_put(scsi->host);
+               if (ide_device_get(scsi->drive))
                        scsi = NULL;
-               }
+               else
+                       scsi_host_get(scsi->host);
        }
        mutex_unlock(&idescsi_ref_mutex);
        return scsi;
@@ -114,9 +113,11 @@ static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk)
 
 static void ide_scsi_put(struct ide_scsi_obj *scsi)
 {
+       ide_drive_t *drive = scsi->drive;
+
        mutex_lock(&idescsi_ref_mutex);
-       ide_device_put(scsi->drive);
        scsi_host_put(scsi->host);
+       ide_device_put(drive);
        mutex_unlock(&idescsi_ref_mutex);
 }
 
index 75a64a6cae8ca873d70b259e61384b4763eed6ef..b29360ed0bdc9f0c2dd6a80c06cd4ef09a5cee66 100644 (file)
@@ -366,12 +366,14 @@ spi_transport_rd_attr(rti, "%d\n");
 spi_transport_rd_attr(pcomp_en, "%d\n");
 spi_transport_rd_attr(hold_mcs, "%d\n");
 
-/* we only care about the first child device so we return 1 */
+/* we only care about the first child device that's a real SCSI device
+ * so we return 1 to terminate the iteration when we find it */
 static int child_iter(struct device *dev, void *data)
 {
-       struct scsi_device *sdev = to_scsi_device(dev);
+       if (!scsi_is_sdev_device(dev))
+               return 0;
 
-       spi_dv_device(sdev);
+       spi_dv_device(to_scsi_device(dev));
        return 1;
 }
 
index e5e7d78564545543925fc6136c6e7c7fc994c028..8e08d51a0f0531d8bf661dc0d3bf8f822d35c357 100644 (file)
@@ -375,7 +375,6 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
        struct gendisk *disk = rq->rq_disk;
        struct scsi_disk *sdkp;
        sector_t block = rq->sector;
-       sector_t threshold;
        unsigned int this_count = rq->nr_sectors;
        unsigned int timeout = sdp->timeout;
        int ret;
@@ -423,21 +422,13 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
        }
 
        /*
-        * Some SD card readers can't handle multi-sector accesses which touch
-        * the last one or two hardware sectors.  Split accesses as needed.
+        * Some devices (some sdcards for one) don't like it if the
+        * last sector gets read in a larger then 1 sector read.
         */
-       threshold = get_capacity(disk) - SD_LAST_BUGGY_SECTORS *
-               (sdp->sector_size / 512);
-
-       if (unlikely(sdp->last_sector_bug && block + this_count > threshold)) {
-               if (block < threshold) {
-                       /* Access up to the threshold but not beyond */
-                       this_count = threshold - block;
-               } else {
-                       /* Access only a single hardware sector */
-                       this_count = sdp->sector_size / 512;
-               }
-       }
+       if (unlikely(sdp->last_sector_bug &&
+           rq->nr_sectors > sdp->sector_size / 512 &&
+           block + this_count == get_capacity(disk)))
+               this_count -= sdp->sector_size / 512;
 
        SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, "block=%llu\n",
                                        (unsigned long long)block));
index 95b9f06534d579bf72797c20ecd5546970f4b190..550b2f70a1f8330f93fea284c19f13554297ef86 100644 (file)
  */
 #define SD_BUF_SIZE            512
 
-/*
- * Number of sectors at the end of the device to avoid multi-sector
- * accesses to in the case of last_sector_bug
- */
-#define SD_LAST_BUGGY_SECTORS  8
-
 struct scsi_disk {
        struct scsi_driver *driver;     /* always &sd_template */
        struct scsi_device *device;
index 0fe031f003e7e8e5082dc91469204e53b35067b5..1bcf3c33d7ff017fbc3043197569d3042705f837 100644 (file)
@@ -345,14 +345,14 @@ static int ses_enclosure_find_by_addr(struct enclosure_device *edev,
        return 0;
 }
 
-#define VPD_INQUIRY_SIZE 512
+#define VPD_INQUIRY_SIZE 36
 
 static void ses_match_to_enclosure(struct enclosure_device *edev,
                                   struct scsi_device *sdev)
 {
        unsigned char *buf = kmalloc(VPD_INQUIRY_SIZE, GFP_KERNEL);
        unsigned char *desc;
-       int len;
+       u16 vpd_len;
        struct efd efd = {
                .addr = 0,
        };
@@ -372,9 +372,19 @@ static void ses_match_to_enclosure(struct enclosure_device *edev,
                             VPD_INQUIRY_SIZE, NULL, SES_TIMEOUT, SES_RETRIES))
                goto free;
 
-       len = (buf[2] << 8) + buf[3];
+       vpd_len = (buf[2] << 8) + buf[3];
+       kfree(buf);
+       buf = kmalloc(vpd_len, GFP_KERNEL);
+       if (!buf)
+               return;
+       cmd[3] = vpd_len >> 8;
+       cmd[4] = vpd_len & 0xff;
+       if (scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf,
+                            vpd_len, NULL, SES_TIMEOUT, SES_RETRIES))
+               goto free;
+
        desc = buf + 4;
-       while (desc < buf + len) {
+       while (desc < buf + vpd_len) {
                enum scsi_protocol proto = desc[0] >> 4;
                u8 code_set = desc[0] & 0x0f;
                u8 piv = desc[1] & 0x80;
index d3b8ebb8377639c92e8e44503aa828554734c055..3d36270a8b4d0a720a31f49b62dd3e3531ef6d97 100644 (file)
@@ -1747,7 +1747,7 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages,
                  */
                flush_dcache_page(pages[i]);
                /* ?? Is locking needed? I don't think so */
-               /* if (TestSetPageLocked(pages[i]))
+               /* if (!trylock_page(pages[i]))
                   goto out_unlock; */
         }
 
index 9d8543762a30fa858ee282d404dee0dd5934718e..efcd44344fb1e011e9b6b926a67dfd5d0d2d6443 100644 (file)
@@ -817,7 +817,7 @@ static void bfin_serial_set_ldisc(struct uart_port *port)
        if (line >= port->info->port.tty->driver->num)
                return;
 
-       switch (port->info->port.tty->ldisc.num) {
+       switch (port->info->port.tty->termios->c_line) {
        case N_IRDA:
                val = UART_GET_GCTL(&bfin_serial_ports[line]);
                val |= (IREN | RPOLC);
index 8249ac490559162fdb05f8e58743c8d05035d2bd..bf94a770bb445d4b2d13ed71865f18fb982bfb0e 100644 (file)
@@ -234,7 +234,7 @@ unsigned long r_alt_ser_baudrate_shadow = 0;
 
 static struct e100_serial rs_table[] = {
        { .baud        = DEF_BAUD,
-         .port        = (unsigned char *)R_SERIAL0_CTRL,
+         .ioport        = (unsigned char *)R_SERIAL0_CTRL,
          .irq         = 1U << 12, /* uses DMA 6 and 7 */
          .oclrintradr = R_DMA_CH6_CLR_INTR,
          .ofirstadr   = R_DMA_CH6_FIRST,
@@ -288,7 +288,7 @@ static struct e100_serial rs_table[] = {
 },  /* ttyS0 */
 #ifndef CONFIG_SVINTO_SIM
        { .baud        = DEF_BAUD,
-         .port        = (unsigned char *)R_SERIAL1_CTRL,
+         .ioport        = (unsigned char *)R_SERIAL1_CTRL,
          .irq         = 1U << 16, /* uses DMA 8 and 9 */
          .oclrintradr = R_DMA_CH8_CLR_INTR,
          .ofirstadr   = R_DMA_CH8_FIRST,
@@ -344,7 +344,7 @@ static struct e100_serial rs_table[] = {
 },  /* ttyS1 */
 
        { .baud        = DEF_BAUD,
-         .port        = (unsigned char *)R_SERIAL2_CTRL,
+         .ioport        = (unsigned char *)R_SERIAL2_CTRL,
          .irq         = 1U << 4,  /* uses DMA 2 and 3 */
          .oclrintradr = R_DMA_CH2_CLR_INTR,
          .ofirstadr   = R_DMA_CH2_FIRST,
@@ -398,7 +398,7 @@ static struct e100_serial rs_table[] = {
  },  /* ttyS2 */
 
        { .baud        = DEF_BAUD,
-         .port        = (unsigned char *)R_SERIAL3_CTRL,
+         .ioport        = (unsigned char *)R_SERIAL3_CTRL,
          .irq         = 1U << 8,  /* uses DMA 4 and 5 */
          .oclrintradr = R_DMA_CH4_CLR_INTR,
          .ofirstadr   = R_DMA_CH4_FIRST,
@@ -939,7 +939,7 @@ static const struct control_pins e100_modem_pins[NR_PORTS] =
 /* Output */
 #define E100_RTS_GET(info) ((info)->rx_ctrl & E100_RTS_MASK)
 /* Input */
-#define E100_CTS_GET(info) ((info)->port[REG_STATUS] & E100_CTS_MASK)
+#define E100_CTS_GET(info) ((info)->ioport[REG_STATUS] & E100_CTS_MASK)
 
 /* These are typically PA or PB and 0 means 0V, 1 means 3.3V */
 /* Is an output */
@@ -1092,7 +1092,7 @@ e100_rts(struct e100_serial *info, int set)
        local_irq_save(flags);
        info->rx_ctrl &= ~E100_RTS_MASK;
        info->rx_ctrl |= (set ? 0 : E100_RTS_MASK);  /* RTS is active low */
-       info->port[REG_REC_CTRL] = info->rx_ctrl;
+       info->ioport[REG_REC_CTRL] = info->rx_ctrl;
        local_irq_restore(flags);
 #ifdef SERIAL_DEBUG_IO
        printk("ser%i rts %i\n", info->line, set);
@@ -1142,7 +1142,7 @@ e100_disable_rx(struct e100_serial *info)
 {
 #ifndef CONFIG_SVINTO_SIM
        /* disable the receiver */
-       info->port[REG_REC_CTRL] =
+       info->ioport[REG_REC_CTRL] =
                (info->rx_ctrl &= ~IO_MASK(R_SERIAL0_REC_CTRL, rec_enable));
 #endif
 }
@@ -1152,7 +1152,7 @@ e100_enable_rx(struct e100_serial *info)
 {
 #ifndef CONFIG_SVINTO_SIM
        /* enable the receiver */
-       info->port[REG_REC_CTRL] =
+       info->ioport[REG_REC_CTRL] =
                (info->rx_ctrl |= IO_MASK(R_SERIAL0_REC_CTRL, rec_enable));
 #endif
 }
@@ -1490,7 +1490,7 @@ rs_stop(struct tty_struct *tty)
                        xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
                }
 
-               *((unsigned long *)&info->port[REG_XOFF]) = xoff;
+               *((unsigned long *)&info->ioport[REG_XOFF]) = xoff;
                local_irq_restore(flags);
        }
 }
@@ -1513,7 +1513,7 @@ rs_start(struct tty_struct *tty)
                        xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
                }
 
-               *((unsigned long *)&info->port[REG_XOFF]) = xoff;
+               *((unsigned long *)&info->ioport[REG_XOFF]) = xoff;
                if (!info->uses_dma_out &&
                    info->xmit.head != info->xmit.tail && info->xmit.buf)
                        e100_enable_serial_tx_ready_irq(info);
@@ -1888,7 +1888,7 @@ static void receive_chars_dma(struct e100_serial *info)
        handle_all_descr_data(info);
 
        /* Read the status register to detect errors */
-       rstat = info->port[REG_STATUS];
+       rstat = info->ioport[REG_STATUS];
        if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) {
                DFLOW(DEBUG_LOG(info->line, "XOFF detect stat %x\n", rstat));
        }
@@ -1897,7 +1897,7 @@ static void receive_chars_dma(struct e100_serial *info)
                /* If we got an error, we must reset it by reading the
                 * data_in field
                 */
-               unsigned char data = info->port[REG_DATA];
+               unsigned char data = info->ioport[REG_DATA];
 
                PROCSTAT(ser_stat[info->line].errors_cnt++);
                DEBUG_LOG(info->line, "#dERR: s d 0x%04X\n",
@@ -2077,7 +2077,7 @@ static int force_eop_if_needed(struct e100_serial *info)
        /* We check data_avail bit to determine if data has
         * arrived since last time
         */
-       unsigned char rstat = info->port[REG_STATUS];
+       unsigned char rstat = info->ioport[REG_STATUS];
 
        /* error or datavail? */
        if (rstat & SER_ERROR_MASK) {
@@ -2096,7 +2096,7 @@ static int force_eop_if_needed(struct e100_serial *info)
                TIMERD(DEBUG_LOG(info->line, "timeout: rstat 0x%03X\n",
                          rstat | (info->line << 8)));
                /* Read data to clear status flags */
-               (void)info->port[REG_DATA];
+               (void)info->ioport[REG_DATA];
 
                info->forced_eop = 0;
                START_FLUSH_FAST_TIMER(info, "magic");
@@ -2296,7 +2296,7 @@ struct e100_serial * handle_ser_rx_interrupt_no_dma(struct e100_serial *info)
        }
 
        /* Read data and status at the same time */
-       data_read = *((unsigned long *)&info->port[REG_DATA_STATUS32]);
+       data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]);
 more_data:
        if (data_read & IO_MASK(R_SERIAL0_READ, xoff_detect) ) {
                DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0));
@@ -2391,7 +2391,7 @@ more_data:
 
 
        info->icount.rx++;
-       data_read = *((unsigned long *)&info->port[REG_DATA_STATUS32]);
+       data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]);
        if (data_read & IO_MASK(R_SERIAL0_READ, data_avail)) {
                DEBUG_LOG(info->line, "ser_rx   %c in loop\n", IO_EXTRACT(R_SERIAL0_READ, data_in, data_read));
                goto more_data;
@@ -2413,7 +2413,7 @@ static struct e100_serial* handle_ser_rx_interrupt(struct e100_serial *info)
                return handle_ser_rx_interrupt_no_dma(info);
        }
        /* DMA is used */
-       rstat = info->port[REG_STATUS];
+       rstat = info->ioport[REG_STATUS];
        if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) {
                DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0));
        }
@@ -2426,7 +2426,7 @@ static struct e100_serial* handle_ser_rx_interrupt(struct e100_serial *info)
                /* If we got an error, we must reset it by reading the
                 * data_in field
                 */
-               data = info->port[REG_DATA];
+               data = info->ioport[REG_DATA];
                DINTR1(DEBUG_LOG(info->line, "ser_rx!  %c\n", data));
                DINTR1(DEBUG_LOG(info->line, "ser_rx err stat %02X\n", rstat));
                if (!data && (rstat & SER_FRAMING_ERR_MASK)) {
@@ -2528,10 +2528,10 @@ static void handle_ser_tx_interrupt(struct e100_serial *info)
                unsigned char rstat;
                DFLOW(DEBUG_LOG(info->line, "tx_int: xchar 0x%02X\n", info->x_char));
                local_irq_save(flags);
-               rstat = info->port[REG_STATUS];
+               rstat = info->ioport[REG_STATUS];
                DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat));
 
-               info->port[REG_TR_DATA] = info->x_char;
+               info->ioport[REG_TR_DATA] = info->x_char;
                info->icount.tx++;
                info->x_char = 0;
                /* We must enable since it is disabled in ser_interrupt */
@@ -2545,7 +2545,7 @@ static void handle_ser_tx_interrupt(struct e100_serial *info)
                /* We only use normal tx interrupt when sending x_char */
                DFLOW(DEBUG_LOG(info->line, "tx_int: xchar sent\n", 0));
                local_irq_save(flags);
-               rstat = info->port[REG_STATUS];
+               rstat = info->ioport[REG_STATUS];
                DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat));
                e100_disable_serial_tx_ready_irq(info);
                if (info->port.tty->stopped)
@@ -2573,7 +2573,7 @@ static void handle_ser_tx_interrupt(struct e100_serial *info)
        DINTR2(DEBUG_LOG(info->line, "tx_int %c\n", info->xmit.buf[info->xmit.tail]));
        /* Send a byte, rs485 timing is critical so turn of ints */
        local_irq_save(flags);
-       info->port[REG_TR_DATA] = info->xmit.buf[info->xmit.tail];
+       info->ioport[REG_TR_DATA] = info->xmit.buf[info->xmit.tail];
        info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1);
        info->icount.tx++;
        if (info->xmit.head == info->xmit.tail) {
@@ -2848,7 +2848,7 @@ startup(struct e100_serial * info)
 
        /* dummy read to reset any serial errors */
 
-       (void)info->port[REG_DATA];
+       (void)info->ioport[REG_DATA];
 
        /* enable the interrupts */
        if (info->uses_dma_out)
@@ -2897,7 +2897,7 @@ shutdown(struct e100_serial * info)
        /* shut down the transmitter and receiver */
        DFLOW(DEBUG_LOG(info->line, "shutdown %i\n", info->line));
        e100_disable_rx(info);
-       info->port[REG_TR_CTRL] = (info->tx_ctrl &= ~0x40);
+       info->ioport[REG_TR_CTRL] = (info->tx_ctrl &= ~0x40);
 
        /* disable interrupts, reset dma channels */
        if (info->uses_dma_in) {
@@ -2968,7 +2968,7 @@ change_speed(struct e100_serial *info)
 
        if (!info->port.tty || !info->port.tty->termios)
                return;
-       if (!info->port)
+       if (!info->ioport)
                return;
 
        cflag = info->port.tty->termios->c_cflag;
@@ -3037,7 +3037,7 @@ change_speed(struct e100_serial *info)
 
                info->baud = cflag_to_baud(cflag);
 #ifndef CONFIG_SVINTO_SIM
-               info->port[REG_BAUD] = cflag_to_etrax_baud(cflag);
+               info->ioport[REG_BAUD] = cflag_to_etrax_baud(cflag);
 #endif /* CONFIG_SVINTO_SIM */
        }
 
@@ -3097,8 +3097,8 @@ change_speed(struct e100_serial *info)
 
        /* actually write the control regs to the hardware */
 
-       info->port[REG_TR_CTRL] = info->tx_ctrl;
-       info->port[REG_REC_CTRL] = info->rx_ctrl;
+       info->ioport[REG_TR_CTRL] = info->tx_ctrl;
+       info->ioport[REG_REC_CTRL] = info->rx_ctrl;
        xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty));
        xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
        if (info->port.tty->termios->c_iflag & IXON ) {
@@ -3107,7 +3107,7 @@ change_speed(struct e100_serial *info)
                xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
        }
 
-       *((unsigned long *)&info->port[REG_XOFF]) = xoff;
+       *((unsigned long *)&info->ioport[REG_XOFF]) = xoff;
        local_irq_restore(flags);
 #endif /* !CONFIG_SVINTO_SIM */
 
@@ -3156,7 +3156,7 @@ static int rs_raw_write(struct tty_struct *tty,
 #ifdef SERIAL_DEBUG_DATA
        if (info->line == SERIAL_DEBUG_LINE)
                printk("rs_raw_write (%d), status %d\n",
-                      count, info->port[REG_STATUS]);
+                      count, info->ioport[REG_STATUS]);
 #endif
 
 #ifdef CONFIG_SVINTO_SIM
@@ -3427,7 +3427,7 @@ get_serial_info(struct e100_serial * info,
        memset(&tmp, 0, sizeof(tmp));
        tmp.type = info->type;
        tmp.line = info->line;
-       tmp.port = (int)info->port;
+       tmp.port = (int)info->ioport;
        tmp.irq = info->irq;
        tmp.flags = info->flags;
        tmp.baud_base = info->baud_base;
@@ -3557,14 +3557,14 @@ char *get_control_state_str(int MLines, char *s)
 }
 #endif
 
-static void
+static int
 rs_break(struct tty_struct *tty, int break_state)
 {
        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
        unsigned long flags;
 
-       if (!info->port)
-               return;
+       if (!info->ioport)
+               return -EIO;
 
        local_irq_save(flags);
        if (break_state == -1) {
@@ -3575,8 +3575,9 @@ rs_break(struct tty_struct *tty, int break_state)
                /* Set bit 7 (txd) and 6 (tr_enable) */
                info->tx_ctrl |= (0x80 | 0x40);
        }
-       info->port[REG_TR_CTRL] = info->tx_ctrl;
+       info->ioport[REG_TR_CTRL] = info->tx_ctrl;
        local_irq_restore(flags);
+       return 0;
 }
 
 static int
@@ -4231,9 +4232,9 @@ static int line_info(char *buf, struct e100_serial *info)
        unsigned long tmp;
 
        ret = sprintf(buf, "%d: uart:E100 port:%lX irq:%d",
-                     info->line, (unsigned long)info->port, info->irq);
+                     info->line, (unsigned long)info->ioport, info->irq);
 
-       if (!info->port || (info->type == PORT_UNKNOWN)) {
+       if (!info->ioport || (info->type == PORT_UNKNOWN)) {
                ret += sprintf(buf+ret, "\n");
                return ret;
        }
@@ -4281,7 +4282,7 @@ static int line_info(char *buf, struct e100_serial *info)
        }
 
        {
-               unsigned char rstat = info->port[REG_STATUS];
+               unsigned char rstat = info->ioport[REG_STATUS];
                if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) )
                        ret += sprintf(buf+ret, " xoff_detect:1");
        }
@@ -4502,7 +4503,7 @@ rs_init(void)
 
                if (info->enabled) {
                        printk(KERN_INFO "%s%d at 0x%x is a builtin UART with DMA\n",
-                              serial_driver->name, info->line, (unsigned int)info->port);
+                              serial_driver->name, info->line, (unsigned int)info->ioport);
                }
        }
 #ifdef CONFIG_ETRAX_FAST_TIMER
index ccd0f32b73726cabe67f436d25f678ec98578e92..e3c5c8c3c09b5b42057da735e48faaad5beb00e9 100644 (file)
@@ -36,8 +36,9 @@ struct etrax_recv_buffer {
 };
 
 struct e100_serial {
+       struct tty_port port;
        int baud;
-       volatile u8     *port;  /* R_SERIALx_CTRL */
+       volatile u8     *ioport;        /* R_SERIALx_CTRL */
        u32             irq;    /* bitnr in R_IRQ_MASK2 for dmaX_descr */
 
        /* Output registers */
index be97789fa5fdb267eb5931d5b2dfb39f135314af..d1812d32f47d40c4c5e3c028aae8727c755f451f 100644 (file)
@@ -2,6 +2,7 @@
  * Core maple bus functionality
  *
  *  Copyright (C) 2007, 2008 Adrian McMenamin
+ *  Copyright (C) 2001 - 2008 Paul Mundt
  *
  * Based on 2.4 code by:
  *
@@ -31,7 +32,7 @@
 #include <mach/dma.h>
 #include <mach/sysasic.h>
 
-MODULE_AUTHOR("Yaegshi Takeshi, Paul Mundt, M.R. Brown, Adrian McMenamin");
+MODULE_AUTHOR("Yaegashi Takeshi, Paul Mundt, M. R. Brown, Adrian McMenamin");
 MODULE_DESCRIPTION("Maple bus driver for Dreamcast");
 MODULE_LICENSE("GPL v2");
 MODULE_SUPPORTED_DEVICE("{{SEGA, Dreamcast/Maple}}");
@@ -65,19 +66,36 @@ static bool checked[4];
 static struct maple_device *baseunits[4];
 
 /**
- *  maple_driver_register - register a device driver
- *  automatically makes the driver bus a maple bus
- *  @drv: the driver to be registered
+ * maple_driver_register - register a maple driver
+ * @drv: maple driver to be registered.
+ *
+ * Registers the passed in @drv, while updating the bus type.
+ * Devices with matching function IDs will be automatically probed.
  */
-int maple_driver_register(struct device_driver *drv)
+int maple_driver_register(struct maple_driver *drv)
 {
        if (!drv)
                return -EINVAL;
-       drv->bus = &maple_bus_type;
-       return driver_register(drv);
+
+       drv->drv.bus = &maple_bus_type;
+
+       return driver_register(&drv->drv);
 }
 EXPORT_SYMBOL_GPL(maple_driver_register);
 
+/**
+ * maple_driver_unregister - unregister a maple driver.
+ * @drv: maple driver to unregister.
+ *
+ * Cleans up after maple_driver_register(). To be invoked in the exit
+ * path of any module drivers.
+ */
+void maple_driver_unregister(struct maple_driver *drv)
+{
+       driver_unregister(&drv->drv);
+}
+EXPORT_SYMBOL_GPL(maple_driver_unregister);
+
 /* set hardware registers to enable next round of dma */
 static void maplebus_dma_reset(void)
 {
@@ -129,13 +147,13 @@ static void maple_release_device(struct device *dev)
        kfree(mdev);
 }
 
-/*
+/**
  * maple_add_packet - add a single instruction to the queue
- * @mdev - maple device
- * @function - function on device being queried
- * @command - maple command to add
- * @length - length of command string (in 32 bit words)
- * @data - remainder of command string
+ * @mdev: maple device
+ * @function: function on device being queried
+ * @command: maple command to add
+ * @length: length of command string (in 32 bit words)
+ * @data: remainder of command string
  */
 int maple_add_packet(struct maple_device *mdev, u32 function, u32 command,
        size_t length, void *data)
@@ -176,14 +194,15 @@ out:
 }
 EXPORT_SYMBOL_GPL(maple_add_packet);
 
-/*
+/**
  * maple_add_packet_sleeps - add a single instruction to the queue
- *  - waits for lock to be free
- * @mdev - maple device
- * @function - function on device being queried
- * @command - maple command to add
- * @length - length of command string (in 32 bit words)
- * @data - remainder of command string
+ * @mdev: maple device
+ * @function: function on device being queried
+ * @command: maple command to add
+ * @length: length of command string (in 32 bit words)
+ * @data: remainder of command string
+ *
+ * Same as maple_add_packet(), but waits for the lock to become free.
  */
 int maple_add_packet_sleeps(struct maple_device *mdev, u32 function,
        u32 command, size_t length, void *data)
@@ -724,11 +743,9 @@ static int maple_get_dma_buffer(void)
 static int match_maple_bus_driver(struct device *devptr,
                                  struct device_driver *drvptr)
 {
-       struct maple_driver *maple_drv;
-       struct maple_device *maple_dev;
+       struct maple_driver *maple_drv = to_maple_driver(drvptr);
+       struct maple_device *maple_dev = to_maple_dev(devptr);
 
-       maple_drv = container_of(drvptr, struct maple_driver, drv);
-       maple_dev = container_of(devptr, struct maple_device, dev);
        /* Trap empty port case */
        if (maple_dev->devinfo.function == 0xFFFFFFFF)
                return 0;
index 2303521b4f0984efa7fcc7c1719de1d33a71e74e..b9d0efb6803f2919695c21ed6ba186303c51353c 100644 (file)
@@ -149,6 +149,12 @@ config SPI_OMAP24XX
          SPI master controller for OMAP24xx/OMAP34xx Multichannel SPI
          (McSPI) modules.
 
+config SPI_ORION
+       tristate "Orion SPI master (EXPERIMENTAL)"
+       depends on PLAT_ORION && EXPERIMENTAL
+       help
+         This enables using the SPI master controller on the Orion chips.
+
 config SPI_PXA2XX
        tristate "PXA2xx SSP SPI master"
        depends on ARCH_PXA && EXPERIMENTAL
index 7fca043ce723a77698d1946e1f88947c9a1d5008..ccf18de34e1e0df26a697b2939d58c7e62cf231d 100644 (file)
@@ -21,6 +21,7 @@ obj-$(CONFIG_SPI_LM70_LLP)            += spi_lm70llp.o
 obj-$(CONFIG_SPI_PXA2XX)               += pxa2xx_spi.o
 obj-$(CONFIG_SPI_OMAP_UWIRE)           += omap_uwire.o
 obj-$(CONFIG_SPI_OMAP24XX)             += omap2_mcspi.o
+obj-$(CONFIG_SPI_ORION)                        += orion_spi.o
 obj-$(CONFIG_SPI_MPC52xx_PSC)          += mpc52xx_psc_spi.o
 obj-$(CONFIG_SPI_MPC83xx)              += spi_mpc83xx.o
 obj-$(CONFIG_SPI_S3C24XX_GPIO)         += spi_s3c24xx_gpio.o
index 0c7165660853a7194b16f8b2ed3cbf4849d78eb2..95190c619c101240eb9dc43125e05a162b1db379 100644 (file)
@@ -184,7 +184,8 @@ static void atmel_spi_next_xfer(struct spi_master *master,
 {
        struct atmel_spi        *as = spi_master_get_devdata(master);
        struct spi_transfer     *xfer;
-       u32                     len, remaining, total;
+       u32                     len, remaining;
+       u32                     ieval;
        dma_addr_t              tx_dma, rx_dma;
 
        if (!as->current_transfer)
@@ -197,6 +198,8 @@ static void atmel_spi_next_xfer(struct spi_master *master,
                xfer = NULL;
 
        if (xfer) {
+               spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS));
+
                len = xfer->len;
                atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len);
                remaining = xfer->len - len;
@@ -234,6 +237,8 @@ static void atmel_spi_next_xfer(struct spi_master *master,
        as->next_transfer = xfer;
 
        if (xfer) {
+               u32     total;
+
                total = len;
                atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len);
                as->next_remaining_bytes = total - len;
@@ -250,9 +255,11 @@ static void atmel_spi_next_xfer(struct spi_master *master,
                        "  next xfer %p: len %u tx %p/%08x rx %p/%08x\n",
                        xfer, xfer->len, xfer->tx_buf, xfer->tx_dma,
                        xfer->rx_buf, xfer->rx_dma);
+               ieval = SPI_BIT(ENDRX) | SPI_BIT(OVRES);
        } else {
                spi_writel(as, RNCR, 0);
                spi_writel(as, TNCR, 0);
+               ieval = SPI_BIT(RXBUFF) | SPI_BIT(ENDRX) | SPI_BIT(OVRES);
        }
 
        /* REVISIT: We're waiting for ENDRX before we start the next
@@ -265,7 +272,7 @@ static void atmel_spi_next_xfer(struct spi_master *master,
         *
         * It should be doable, though. Just not now...
         */
-       spi_writel(as, IER, SPI_BIT(ENDRX) | SPI_BIT(OVRES));
+       spi_writel(as, IER, ieval);
        spi_writel(as, PTCR, SPI_BIT(TXTEN) | SPI_BIT(RXTEN));
 }
 
@@ -396,7 +403,7 @@ atmel_spi_interrupt(int irq, void *dev_id)
 
                ret = IRQ_HANDLED;
 
-               spi_writel(as, IDR, (SPI_BIT(ENDTX) | SPI_BIT(ENDRX)
+               spi_writel(as, IDR, (SPI_BIT(RXBUFF) | SPI_BIT(ENDRX)
                                     | SPI_BIT(OVRES)));
 
                /*
@@ -418,7 +425,7 @@ atmel_spi_interrupt(int irq, void *dev_id)
                if (xfer->delay_usecs)
                        udelay(xfer->delay_usecs);
 
-               dev_warn(master->dev.parent, "fifo overrun (%u/%u remaining)\n",
+               dev_warn(master->dev.parent, "overrun (%u/%u remaining)\n",
                         spi_readl(as, TCR), spi_readl(as, RCR));
 
                /*
@@ -442,7 +449,7 @@ atmel_spi_interrupt(int irq, void *dev_id)
                spi_readl(as, SR);
 
                atmel_spi_msg_done(master, as, msg, -EIO, 0);
-       } else if (pending & SPI_BIT(ENDRX)) {
+       } else if (pending & (SPI_BIT(RXBUFF) | SPI_BIT(ENDRX))) {
                ret = IRQ_HANDLED;
 
                spi_writel(as, IDR, pending);
diff --git a/drivers/spi/orion_spi.c b/drivers/spi/orion_spi.c
new file mode 100644 (file)
index 0000000..c4eaacd
--- /dev/null
@@ -0,0 +1,574 @@
+/*
+ * orion_spi.c -- Marvell Orion SPI controller driver
+ *
+ * Author: Shadi Ammouri <shadi@marvell.com>
+ * Copyright (C) 2007-2008 Marvell Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/orion_spi.h>
+#include <asm/unaligned.h>
+
+#define DRIVER_NAME                    "orion_spi"
+
+#define ORION_NUM_CHIPSELECTS          1 /* only one slave is supported*/
+#define ORION_SPI_WAIT_RDY_MAX_LOOP    2000 /* in usec */
+
+#define ORION_SPI_IF_CTRL_REG          0x00
+#define ORION_SPI_IF_CONFIG_REG                0x04
+#define ORION_SPI_DATA_OUT_REG         0x08
+#define ORION_SPI_DATA_IN_REG          0x0c
+#define ORION_SPI_INT_CAUSE_REG                0x10
+
+#define ORION_SPI_IF_8_16_BIT_MODE     (1 << 5)
+#define ORION_SPI_CLK_PRESCALE_MASK    0x1F
+
+struct orion_spi {
+       struct work_struct      work;
+
+       /* Lock access to transfer list.        */
+       spinlock_t              lock;
+
+       struct list_head        msg_queue;
+       struct spi_master       *master;
+       void __iomem            *base;
+       unsigned int            max_speed;
+       unsigned int            min_speed;
+       struct orion_spi_info   *spi_info;
+};
+
+static struct workqueue_struct *orion_spi_wq;
+
+static inline void __iomem *spi_reg(struct orion_spi *orion_spi, u32 reg)
+{
+       return orion_spi->base + reg;
+}
+
+static inline void
+orion_spi_setbits(struct orion_spi *orion_spi, u32 reg, u32 mask)
+{
+       void __iomem *reg_addr = spi_reg(orion_spi, reg);
+       u32 val;
+
+       val = readl(reg_addr);
+       val |= mask;
+       writel(val, reg_addr);
+}
+
+static inline void
+orion_spi_clrbits(struct orion_spi *orion_spi, u32 reg, u32 mask)
+{
+       void __iomem *reg_addr = spi_reg(orion_spi, reg);
+       u32 val;
+
+       val = readl(reg_addr);
+       val &= ~mask;
+       writel(val, reg_addr);
+}
+
+static int orion_spi_set_transfer_size(struct orion_spi *orion_spi, int size)
+{
+       if (size == 16) {
+               orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG,
+                                 ORION_SPI_IF_8_16_BIT_MODE);
+       } else if (size == 8) {
+               orion_spi_clrbits(orion_spi, ORION_SPI_IF_CONFIG_REG,
+                                 ORION_SPI_IF_8_16_BIT_MODE);
+       } else {
+               pr_debug("Bad bits per word value %d (only 8 or 16 are "
+                        "allowed).\n", size);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed)
+{
+       u32 tclk_hz;
+       u32 rate;
+       u32 prescale;
+       u32 reg;
+       struct orion_spi *orion_spi;
+
+       orion_spi = spi_master_get_devdata(spi->master);
+
+       tclk_hz = orion_spi->spi_info->tclk;
+
+       /*
+        * the supported rates are: 4,6,8...30
+        * round up as we look for equal or less speed
+        */
+       rate = DIV_ROUND_UP(tclk_hz, speed);
+       rate = roundup(rate, 2);
+
+       /* check if requested speed is too small */
+       if (rate > 30)
+               return -EINVAL;
+
+       if (rate < 4)
+               rate = 4;
+
+       /* Convert the rate to SPI clock divisor value. */
+       prescale = 0x10 + rate/2;
+
+       reg = readl(spi_reg(orion_spi, ORION_SPI_IF_CONFIG_REG));
+       reg = ((reg & ~ORION_SPI_CLK_PRESCALE_MASK) | prescale);
+       writel(reg, spi_reg(orion_spi, ORION_SPI_IF_CONFIG_REG));
+
+       return 0;
+}
+
+/*
+ * called only when no transfer is active on the bus
+ */
+static int
+orion_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
+{
+       struct orion_spi *orion_spi;
+       unsigned int speed = spi->max_speed_hz;
+       unsigned int bits_per_word = spi->bits_per_word;
+       int     rc;
+
+       orion_spi = spi_master_get_devdata(spi->master);
+
+       if ((t != NULL) && t->speed_hz)
+               speed = t->speed_hz;
+
+       if ((t != NULL) && t->bits_per_word)
+               bits_per_word = t->bits_per_word;
+
+       rc = orion_spi_baudrate_set(spi, speed);
+       if (rc)
+               return rc;
+
+       return orion_spi_set_transfer_size(orion_spi, bits_per_word);
+}
+
+static void orion_spi_set_cs(struct orion_spi *orion_spi, int enable)
+{
+       if (enable)
+               orion_spi_setbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1);
+       else
+               orion_spi_clrbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1);
+}
+
+static inline int orion_spi_wait_till_ready(struct orion_spi *orion_spi)
+{
+       int i;
+
+       for (i = 0; i < ORION_SPI_WAIT_RDY_MAX_LOOP; i++) {
+               if (readl(spi_reg(orion_spi, ORION_SPI_INT_CAUSE_REG)))
+                       return 1;
+               else
+                       udelay(1);
+       }
+
+       return -1;
+}
+
+static inline int
+orion_spi_write_read_8bit(struct spi_device *spi,
+                         const u8 **tx_buf, u8 **rx_buf)
+{
+       void __iomem *tx_reg, *rx_reg, *int_reg;
+       struct orion_spi *orion_spi;
+
+       orion_spi = spi_master_get_devdata(spi->master);
+       tx_reg = spi_reg(orion_spi, ORION_SPI_DATA_OUT_REG);
+       rx_reg = spi_reg(orion_spi, ORION_SPI_DATA_IN_REG);
+       int_reg = spi_reg(orion_spi, ORION_SPI_INT_CAUSE_REG);
+
+       /* clear the interrupt cause register */
+       writel(0x0, int_reg);
+
+       if (tx_buf && *tx_buf)
+               writel(*(*tx_buf)++, tx_reg);
+       else
+               writel(0, tx_reg);
+
+       if (orion_spi_wait_till_ready(orion_spi) < 0) {
+               dev_err(&spi->dev, "TXS timed out\n");
+               return -1;
+       }
+
+       if (rx_buf && *rx_buf)
+               *(*rx_buf)++ = readl(rx_reg);
+
+       return 1;
+}
+
+static inline int
+orion_spi_write_read_16bit(struct spi_device *spi,
+                          const u16 **tx_buf, u16 **rx_buf)
+{
+       void __iomem *tx_reg, *rx_reg, *int_reg;
+       struct orion_spi *orion_spi;
+
+       orion_spi = spi_master_get_devdata(spi->master);
+       tx_reg = spi_reg(orion_spi, ORION_SPI_DATA_OUT_REG);
+       rx_reg = spi_reg(orion_spi, ORION_SPI_DATA_IN_REG);
+       int_reg = spi_reg(orion_spi, ORION_SPI_INT_CAUSE_REG);
+
+       /* clear the interrupt cause register */
+       writel(0x0, int_reg);
+
+       if (tx_buf && *tx_buf)
+               writel(__cpu_to_le16(get_unaligned((*tx_buf)++)), tx_reg);
+       else
+               writel(0, tx_reg);
+
+       if (orion_spi_wait_till_ready(orion_spi) < 0) {
+               dev_err(&spi->dev, "TXS timed out\n");
+               return -1;
+       }
+
+       if (rx_buf && *rx_buf)
+               put_unaligned(__le16_to_cpu(readl(rx_reg)), (*rx_buf)++);
+
+       return 1;
+}
+
+static unsigned int
+orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
+{
+       struct orion_spi *orion_spi;
+       unsigned int count;
+       int word_len;
+
+       orion_spi = spi_master_get_devdata(spi->master);
+       word_len = spi->bits_per_word;
+       count = xfer->len;
+
+       if (word_len == 8) {
+               const u8 *tx = xfer->tx_buf;
+               u8 *rx = xfer->rx_buf;
+
+               do {
+                       if (orion_spi_write_read_8bit(spi, &tx, &rx) < 0)
+                               goto out;
+                       count--;
+               } while (count);
+       } else if (word_len == 16) {
+               const u16 *tx = xfer->tx_buf;
+               u16 *rx = xfer->rx_buf;
+
+               do {
+                       if (orion_spi_write_read_16bit(spi, &tx, &rx) < 0)
+                               goto out;
+                       count -= 2;
+               } while (count);
+       }
+
+out:
+       return xfer->len - count;
+}
+
+
+static void orion_spi_work(struct work_struct *work)
+{
+       struct orion_spi *orion_spi =
+               container_of(work, struct orion_spi, work);
+
+       spin_lock_irq(&orion_spi->lock);
+       while (!list_empty(&orion_spi->msg_queue)) {
+               struct spi_message *m;
+               struct spi_device *spi;
+               struct spi_transfer *t = NULL;
+               int par_override = 0;
+               int status = 0;
+               int cs_active = 0;
+
+               m = container_of(orion_spi->msg_queue.next, struct spi_message,
+                                queue);
+
+               list_del_init(&m->queue);
+               spin_unlock_irq(&orion_spi->lock);
+
+               spi = m->spi;
+
+               /* Load defaults */
+               status = orion_spi_setup_transfer(spi, NULL);
+
+               if (status < 0)
+                       goto msg_done;
+
+               list_for_each_entry(t, &m->transfers, transfer_list) {
+                       if (par_override || t->speed_hz || t->bits_per_word) {
+                               par_override = 1;
+                               status = orion_spi_setup_transfer(spi, t);
+                               if (status < 0)
+                                       break;
+                               if (!t->speed_hz && !t->bits_per_word)
+                                       par_override = 0;
+                       }
+
+                       if (!cs_active) {
+                               orion_spi_set_cs(orion_spi, 1);
+                               cs_active = 1;
+                       }
+
+                       if (t->len)
+                               m->actual_length +=
+                                       orion_spi_write_read(spi, t);
+
+                       if (t->delay_usecs)
+                               udelay(t->delay_usecs);
+
+                       if (t->cs_change) {
+                               orion_spi_set_cs(orion_spi, 0);
+                               cs_active = 0;
+                       }
+               }
+
+msg_done:
+               if (cs_active)
+                       orion_spi_set_cs(orion_spi, 0);
+
+               m->status = status;
+               m->complete(m->context);
+
+               spin_lock_irq(&orion_spi->lock);
+       }
+
+       spin_unlock_irq(&orion_spi->lock);
+}
+
+static int __init orion_spi_reset(struct orion_spi *orion_spi)
+{
+       /* Verify that the CS is deasserted */
+       orion_spi_set_cs(orion_spi, 0);
+
+       return 0;
+}
+
+static int orion_spi_setup(struct spi_device *spi)
+{
+       struct orion_spi *orion_spi;
+
+       orion_spi = spi_master_get_devdata(spi->master);
+
+       if (spi->mode) {
+               dev_err(&spi->dev, "setup: unsupported mode bits %x\n",
+                       spi->mode);
+               return -EINVAL;
+       }
+
+       if (spi->bits_per_word == 0)
+               spi->bits_per_word = 8;
+
+       if ((spi->max_speed_hz == 0)
+                       || (spi->max_speed_hz > orion_spi->max_speed))
+               spi->max_speed_hz = orion_spi->max_speed;
+
+       if (spi->max_speed_hz < orion_spi->min_speed) {
+               dev_err(&spi->dev, "setup: requested speed too low %d Hz\n",
+                       spi->max_speed_hz);
+               return -EINVAL;
+       }
+
+       /*
+        * baudrate & width will be set orion_spi_setup_transfer
+        */
+       return 0;
+}
+
+static int orion_spi_transfer(struct spi_device *spi, struct spi_message *m)
+{
+       struct orion_spi *orion_spi;
+       struct spi_transfer *t = NULL;
+       unsigned long flags;
+
+       m->actual_length = 0;
+       m->status = 0;
+
+       /* reject invalid messages and transfers */
+       if (list_empty(&m->transfers) || !m->complete)
+               return -EINVAL;
+
+       orion_spi = spi_master_get_devdata(spi->master);
+
+       list_for_each_entry(t, &m->transfers, transfer_list) {
+               unsigned int bits_per_word = spi->bits_per_word;
+
+               if (t->tx_buf == NULL && t->rx_buf == NULL && t->len) {
+                       dev_err(&spi->dev,
+                               "message rejected : "
+                               "invalid transfer data buffers\n");
+                       goto msg_rejected;
+               }
+
+               if ((t != NULL) && t->bits_per_word)
+                       bits_per_word = t->bits_per_word;
+
+               if ((bits_per_word != 8) && (bits_per_word != 16)) {
+                       dev_err(&spi->dev,
+                               "message rejected : "
+                               "invalid transfer bits_per_word (%d bits)\n",
+                               bits_per_word);
+                       goto msg_rejected;
+               }
+               /*make sure buffer length is even when working in 16 bit mode*/
+               if ((t != NULL) && (t->bits_per_word == 16) && (t->len & 1)) {
+                       dev_err(&spi->dev,
+                               "message rejected : "
+                               "odd data length (%d) while in 16 bit mode\n",
+                               t->len);
+                       goto msg_rejected;
+               }
+
+               if (t->speed_hz < orion_spi->min_speed) {
+                       dev_err(&spi->dev,
+                               "message rejected : "
+                               "device min speed (%d Hz) exceeds "
+                               "required transfer speed (%d Hz)\n",
+                               orion_spi->min_speed, t->speed_hz);
+                       goto msg_rejected;
+               }
+       }
+
+
+       spin_lock_irqsave(&orion_spi->lock, flags);
+       list_add_tail(&m->queue, &orion_spi->msg_queue);
+       queue_work(orion_spi_wq, &orion_spi->work);
+       spin_unlock_irqrestore(&orion_spi->lock, flags);
+
+       return 0;
+msg_rejected:
+       /* Message rejected and not queued */
+       m->status = -EINVAL;
+       if (m->complete)
+               m->complete(m->context);
+       return -EINVAL;
+}
+
+static int __init orion_spi_probe(struct platform_device *pdev)
+{
+       struct spi_master *master;
+       struct orion_spi *spi;
+       struct resource *r;
+       struct orion_spi_info *spi_info;
+       int status = 0;
+
+       spi_info = pdev->dev.platform_data;
+
+       master = spi_alloc_master(&pdev->dev, sizeof *spi);
+       if (master == NULL) {
+               dev_dbg(&pdev->dev, "master allocation failed\n");
+               return -ENOMEM;
+       }
+
+       if (pdev->id != -1)
+               master->bus_num = pdev->id;
+
+       master->setup = orion_spi_setup;
+       master->transfer = orion_spi_transfer;
+       master->num_chipselect = ORION_NUM_CHIPSELECTS;
+
+       dev_set_drvdata(&pdev->dev, master);
+
+       spi = spi_master_get_devdata(master);
+       spi->master = master;
+       spi->spi_info = spi_info;
+
+       spi->max_speed = DIV_ROUND_UP(spi_info->tclk, 4);
+       spi->min_speed = DIV_ROUND_UP(spi_info->tclk, 30);
+
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (r == NULL) {
+               status = -ENODEV;
+               goto out;
+       }
+
+       if (!request_mem_region(r->start, (r->end - r->start) + 1,
+                               pdev->dev.bus_id)) {
+               status = -EBUSY;
+               goto out;
+       }
+       spi->base = ioremap(r->start, SZ_1K);
+
+       INIT_WORK(&spi->work, orion_spi_work);
+
+       spin_lock_init(&spi->lock);
+       INIT_LIST_HEAD(&spi->msg_queue);
+
+       if (orion_spi_reset(spi) < 0)
+               goto out_rel_mem;
+
+       status = spi_register_master(master);
+       if (status < 0)
+               goto out_rel_mem;
+
+       return status;
+
+out_rel_mem:
+       release_mem_region(r->start, (r->end - r->start) + 1);
+
+out:
+       spi_master_put(master);
+       return status;
+}
+
+
+static int __exit orion_spi_remove(struct platform_device *pdev)
+{
+       struct spi_master *master;
+       struct orion_spi *spi;
+       struct resource *r;
+
+       master = dev_get_drvdata(&pdev->dev);
+       spi = spi_master_get_devdata(master);
+
+       cancel_work_sync(&spi->work);
+
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       release_mem_region(r->start, (r->end - r->start) + 1);
+
+       spi_unregister_master(master);
+
+       return 0;
+}
+
+MODULE_ALIAS("platform:" DRIVER_NAME);
+
+static struct platform_driver orion_spi_driver = {
+       .driver = {
+               .name   = DRIVER_NAME,
+               .owner  = THIS_MODULE,
+       },
+       .remove         = __exit_p(orion_spi_remove),
+};
+
+static int __init orion_spi_init(void)
+{
+       orion_spi_wq = create_singlethread_workqueue(
+                               orion_spi_driver.driver.name);
+       if (orion_spi_wq == NULL)
+               return -ENOMEM;
+
+       return platform_driver_probe(&orion_spi_driver, orion_spi_probe);
+}
+module_init(orion_spi_init);
+
+static void __exit orion_spi_exit(void)
+{
+       flush_workqueue(orion_spi_wq);
+       platform_driver_unregister(&orion_spi_driver);
+
+       destroy_workqueue(orion_spi_wq);
+}
+module_exit(orion_spi_exit);
+
+MODULE_DESCRIPTION("Orion SPI driver");
+MODULE_AUTHOR("Shadi Ammouri <shadi@marvell.com>");
+MODULE_LICENSE("GPL");
index 1c643c9e1f15ff793e5d7c140e9f93ee96320544..21661c7959c87cab171323d8dc1821046ee77604 100644 (file)
@@ -236,6 +236,19 @@ static irqreturn_t s3c24xx_spi_irq(int irq, void *dev)
        return IRQ_HANDLED;
 }
 
+static void s3c24xx_spi_initialsetup(struct s3c24xx_spi *hw)
+{
+       /* for the moment, permanently enable the clock */
+
+       clk_enable(hw->clk);
+
+       /* program defaults into the registers */
+
+       writeb(0xff, hw->regs + S3C2410_SPPRE);
+       writeb(SPPIN_DEFAULT, hw->regs + S3C2410_SPPIN);
+       writeb(SPCON_DEFAULT, hw->regs + S3C2410_SPCON);
+}
+
 static int __init s3c24xx_spi_probe(struct platform_device *pdev)
 {
        struct s3c2410_spi_info *pdata;
@@ -327,15 +340,7 @@ static int __init s3c24xx_spi_probe(struct platform_device *pdev)
                goto err_no_clk;
        }
 
-       /* for the moment, permanently enable the clock */
-
-       clk_enable(hw->clk);
-
-       /* program defaults into the registers */
-
-       writeb(0xff, hw->regs + S3C2410_SPPRE);
-       writeb(SPPIN_DEFAULT, hw->regs + S3C2410_SPPIN);
-       writeb(SPCON_DEFAULT, hw->regs + S3C2410_SPCON);
+       s3c24xx_spi_initialsetup(hw);
 
        /* setup any gpio we can */
 
@@ -415,7 +420,7 @@ static int s3c24xx_spi_resume(struct platform_device *pdev)
 {
        struct s3c24xx_spi *hw = platform_get_drvdata(pdev);
 
-       clk_enable(hw->clk);
+       s3c24xx_spi_initialsetup(hw);
        return 0;
 }
 
index 2fcc06eb5e60a8f9fc982c844113ebf193f62aed..586d6f1376cf7700a677825b41523dc056b8c900 100644 (file)
@@ -389,7 +389,6 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
        if (io->entries <= 0)
                return io->entries;
 
-       io->count = io->entries;
        io->urbs = kmalloc(io->entries * sizeof *io->urbs, mem_flags);
        if (!io->urbs)
                goto nomem;
@@ -458,6 +457,7 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
        io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT;
 
        /* transaction state */
+       io->count = io->entries;
        io->status = 0;
        io->bytes = 0;
        init_completion(&io->complete);
index 7a4d456772278c6ebfd146d57f830ad0518319a9..73ac7262239e510ad9af1ec62883b4d588ca0332 100644 (file)
@@ -26,8 +26,6 @@
  * (http://www.freecom.de/)
  */
 
-#include <linux/hdreg.h>
-
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
 
index 38a1e8308c837d28d666e86a29b3097658020524..4bd569e479a723c70d3f3532271a65e4d111dab7 100644 (file)
@@ -958,20 +958,20 @@ static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_
        /* Prepare PCI device */
        rc = pci_enable_device(dev);
        if (rc < 0) {
-               dev_err(info->dev, "cannot enable PCI device\n");
+               dev_err(info->device, "cannot enable PCI device\n");
                goto err_enable_device;
        }
 
        rc = pci_request_regions(dev, "arkfb");
        if (rc < 0) {
-               dev_err(info->dev, "cannot reserve framebuffer region\n");
+               dev_err(info->device, "cannot reserve framebuffer region\n");
                goto err_request_regions;
        }
 
        par->dac = ics5342_init(ark_dac_read_regs, ark_dac_write_regs, info);
        if (! par->dac) {
                rc = -ENOMEM;
-               dev_err(info->dev, "RAMDAC initialization failed\n");
+               dev_err(info->device, "RAMDAC initialization failed\n");
                goto err_dac;
        }
 
@@ -982,7 +982,7 @@ static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_
        info->screen_base = pci_iomap(dev, 0, 0);
        if (! info->screen_base) {
                rc = -ENOMEM;
-               dev_err(info->dev, "iomap for framebuffer failed\n");
+               dev_err(info->device, "iomap for framebuffer failed\n");
                goto err_iomap;
        }
 
@@ -1004,19 +1004,19 @@ static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_
        rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8);
        if (! ((rc == 1) || (rc == 2))) {
                rc = -EINVAL;
-               dev_err(info->dev, "mode %s not found\n", mode_option);
+               dev_err(info->device, "mode %s not found\n", mode_option);
                goto err_find_mode;
        }
 
        rc = fb_alloc_cmap(&info->cmap, 256, 0);
        if (rc < 0) {
-               dev_err(info->dev, "cannot allocate colormap\n");
+               dev_err(info->device, "cannot allocate colormap\n");
                goto err_alloc_cmap;
        }
 
        rc = register_framebuffer(info);
        if (rc < 0) {
-               dev_err(info->dev, "cannot register framebugger\n");
+               dev_err(info->device, "cannot register framebugger\n");
                goto err_reg_fb;
        }
 
@@ -1090,7 +1090,7 @@ static int ark_pci_suspend (struct pci_dev* dev, pm_message_t state)
        struct fb_info *info = pci_get_drvdata(dev);
        struct arkfb_info *par = info->par;
 
-       dev_info(info->dev, "suspend\n");
+       dev_info(info->device, "suspend\n");
 
        acquire_console_sem();
        mutex_lock(&(par->open_lock));
@@ -1121,7 +1121,7 @@ static int ark_pci_resume (struct pci_dev* dev)
        struct fb_info *info = pci_get_drvdata(dev);
        struct arkfb_info *par = info->par;
 
-       dev_info(info->dev, "resume\n");
+       dev_info(info->device, "resume\n");
 
        acquire_console_sem();
        mutex_lock(&(par->open_lock));
index 620ba8120368524c18ff7c71fc28f085bac6108b..cc6b470073daa3085c0694a77909fcebec10fd6e 100644 (file)
@@ -244,7 +244,7 @@ static int atyfb_sync(struct fb_info *info);
      */
 
 static int aty_init(struct fb_info *info);
-static void aty_resume_chip(struct fb_info *info);
+
 #ifdef CONFIG_ATARI
 static int store_video_par(char *videopar, unsigned char m64_num);
 #endif
@@ -2023,6 +2023,20 @@ static int atyfb_pci_suspend(struct pci_dev *pdev, pm_message_t state)
        return 0;
 }
 
+static void aty_resume_chip(struct fb_info *info)
+{
+       struct atyfb_par *par = info->par;
+
+       aty_st_le32(MEM_CNTL, par->mem_cntl, par);
+
+       if (par->pll_ops->resume_pll)
+               par->pll_ops->resume_pll(info, &par->pll);
+
+       if (par->aux_start)
+               aty_st_le32(BUS_CNTL,
+                       aty_ld_le32(BUS_CNTL, par) | BUS_APER_REG_DIS, par);
+}
+
 static int atyfb_pci_resume(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
@@ -2659,19 +2673,6 @@ aty_init_exit:
        return ret;
 }
 
-static void aty_resume_chip(struct fb_info *info)
-{
-       struct atyfb_par *par = info->par;
-
-       aty_st_le32(MEM_CNTL, par->mem_cntl, par);
-
-       if (par->pll_ops->resume_pll)
-               par->pll_ops->resume_pll(info, &par->pll);
-
-       if (par->aux_start)
-               aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL, par) | BUS_APER_REG_DIS, par);
-}
-
 #ifdef CONFIG_ATARI
 static int __devinit store_video_par(char *video_str, unsigned char m64_num)
 {
index 3ca27cb13caa0d64c2447a4c2bd4aca70566121f..4d13f68436e6efa1d9942563d9d70250d28b5b30 100644 (file)
@@ -241,8 +241,8 @@ void radeonfb_engine_reset(struct radeonfb_info *rinfo)
        INREG(HOST_PATH_CNTL);
        OUTREG(HOST_PATH_CNTL, host_path_cntl);
 
-       if (rinfo->family != CHIP_FAMILY_R300 ||
-           rinfo->family != CHIP_FAMILY_R350 ||
+       if (rinfo->family != CHIP_FAMILY_R300 &&
+           rinfo->family != CHIP_FAMILY_R350 &&
            rinfo->family != CHIP_FAMILY_RV350)
                OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset);
 
index f9e7c29ad9bf8eb516c8d386c460426f7cfcd925..8c8fa35f1b7c2b13cd6a35341abddcf7ca42d9f5 100644 (file)
@@ -69,7 +69,8 @@ static int radeon_setup_i2c_bus(struct radeon_i2c_chan *chan, const char *name)
 {
        int rc;
 
-       strcpy(chan->adapter.name, name);
+       snprintf(chan->adapter.name, sizeof(chan->adapter.name),
+                "radeonfb %s", name);
        chan->adapter.owner             = THIS_MODULE;
        chan->adapter.id                = I2C_HW_B_RADEON;
        chan->adapter.algo_data         = &chan->algo;
index 6338d0e2fe0794f100e4d55c37dcb847dcf646c6..ea07258565f0e686186ba3479baf5b45ed92ea29 100644 (file)
@@ -68,8 +68,10 @@ static int pwm_backlight_probe(struct platform_device *pdev)
        struct pwm_bl_data *pb;
        int ret;
 
-       if (!data)
+       if (!data) {
+               dev_err(&pdev->dev, "failed to find platform data\n");
                return -EINVAL;
+       }
 
        if (data->init) {
                ret = data->init(&pdev->dev);
@@ -79,6 +81,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
 
        pb = kzalloc(sizeof(*pb), GFP_KERNEL);
        if (!pb) {
+               dev_err(&pdev->dev, "no memory for state\n");
                ret = -ENOMEM;
                goto err_alloc;
        }
@@ -91,7 +94,8 @@ static int pwm_backlight_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "unable to request PWM for backlight\n");
                ret = PTR_ERR(pb->pwm);
                goto err_pwm;
-       }
+       } else
+               dev_dbg(&pdev->dev, "got pwm for backlight\n");
 
        bl = backlight_device_register(pdev->name, &pdev->dev,
                        pb, &pwm_backlight_ops);
@@ -183,3 +187,5 @@ module_exit(pwm_backlight_exit);
 
 MODULE_DESCRIPTION("PWM based Backlight Driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:pwm-backlight");
+
diff --git a/drivers/video/console/.gitignore b/drivers/video/console/.gitignore
new file mode 100644 (file)
index 0000000..0c258b4
--- /dev/null
@@ -0,0 +1,2 @@
+# conmakehash generated file
+promcon_tbl.c
index 3ccfa76d9b2a0c7f523dcb6e37dc10ad3fac59ea..33859934a8e465b1654bf08e454633253685fd98 100644 (file)
@@ -1311,6 +1311,9 @@ static void fbcon_clear(struct vc_data *vc, int sy, int sx, int height,
        if (!height || !width)
                return;
 
+       if (sy < vc->vc_top && vc->vc_top == logo_lines)
+               vc->vc_top = 0;
+
        /* Split blits that cross physical y_wrap boundary */
 
        y_break = p->vrows - p->yscroll;
index 9cd36c223d334c05768b61c055ac8e1b16d81cb0..bd320a2bfb7c5ef92b5e803aa30bbb648979da4a 100644 (file)
@@ -1649,8 +1649,10 @@ static int __init fsl_diu_init(void)
        }
 
        prop = of_get_property(np, "d-cache-size", NULL);
-       if (prop == NULL)
+       if (prop == NULL) {
+               of_node_put(np);
                return -ENODEV;
+       }
 
        /* Freescale PLRU requires 13/8 times the cache size to do a proper
           displacement flush
@@ -1659,8 +1661,10 @@ static int __init fsl_diu_init(void)
        coherence_data_size /= 8;
 
        prop = of_get_property(np, "d-cache-line-size", NULL);
-       if (prop == NULL)
+       if (prop == NULL) {
+               of_node_put(np);
                return -ENODEV;
+       }
        d_cache_line_size = *prop;
 
        of_node_put(np);
index 2972f112dbed29876c3652210812c7c5e854eebe..8361bd0e3df1dd55bdbf1f31b3d1eb08802df28a 100644 (file)
@@ -903,13 +903,13 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i
        /* Prepare PCI device */
        rc = pci_enable_device(dev);
        if (rc < 0) {
-               dev_err(info->dev, "cannot enable PCI device\n");
+               dev_err(info->device, "cannot enable PCI device\n");
                goto err_enable_device;
        }
 
        rc = pci_request_regions(dev, "s3fb");
        if (rc < 0) {
-               dev_err(info->dev, "cannot reserve framebuffer region\n");
+               dev_err(info->device, "cannot reserve framebuffer region\n");
                goto err_request_regions;
        }
 
@@ -921,7 +921,7 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i
        info->screen_base = pci_iomap(dev, 0, 0);
        if (! info->screen_base) {
                rc = -ENOMEM;
-               dev_err(info->dev, "iomap for framebuffer failed\n");
+               dev_err(info->device, "iomap for framebuffer failed\n");
                goto err_iomap;
        }
 
@@ -965,19 +965,19 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i
        rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8);
        if (! ((rc == 1) || (rc == 2))) {
                rc = -EINVAL;
-               dev_err(info->dev, "mode %s not found\n", mode_option);
+               dev_err(info->device, "mode %s not found\n", mode_option);
                goto err_find_mode;
        }
 
        rc = fb_alloc_cmap(&info->cmap, 256, 0);
        if (rc < 0) {
-               dev_err(info->dev, "cannot allocate colormap\n");
+               dev_err(info->device, "cannot allocate colormap\n");
                goto err_alloc_cmap;
        }
 
        rc = register_framebuffer(info);
        if (rc < 0) {
-               dev_err(info->dev, "cannot register framebuffer\n");
+               dev_err(info->device, "cannot register framebuffer\n");
                goto err_reg_fb;
        }
 
@@ -1053,7 +1053,7 @@ static int s3_pci_suspend(struct pci_dev* dev, pm_message_t state)
        struct fb_info *info = pci_get_drvdata(dev);
        struct s3fb_info *par = info->par;
 
-       dev_info(info->dev, "suspend\n");
+       dev_info(info->device, "suspend\n");
 
        acquire_console_sem();
        mutex_lock(&(par->open_lock));
@@ -1085,7 +1085,7 @@ static int s3_pci_resume(struct pci_dev* dev)
        struct s3fb_info *par = info->par;
        int err;
 
-       dev_info(info->dev, "resume\n");
+       dev_info(info->device, "resume\n");
 
        acquire_console_sem();
        mutex_lock(&(par->open_lock));
@@ -1102,7 +1102,7 @@ static int s3_pci_resume(struct pci_dev* dev)
        if (err) {
                mutex_unlock(&(par->open_lock));
                release_console_sem();
-               dev_err(info->dev, "error %d enabling device for resume\n", err);
+               dev_err(info->device, "error %d enabling device for resume\n", err);
                return err;
        }
        pci_set_master(dev);
index 4a484ee98f8a5e1af8bbe355bbe7ed5d37593311..34aae7a2a62b35a3dd2aa4436816f844f588f616 100644 (file)
@@ -677,13 +677,13 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi
 
        rc = pci_enable_device(dev);
        if (rc < 0) {
-               dev_err(info->dev, "cannot enable PCI device\n");
+               dev_err(info->device, "cannot enable PCI device\n");
                goto err_enable_device;
        }
 
        rc = pci_request_regions(dev, "vt8623fb");
        if (rc < 0) {
-               dev_err(info->dev, "cannot reserve framebuffer region\n");
+               dev_err(info->device, "cannot reserve framebuffer region\n");
                goto err_request_regions;
        }
 
@@ -696,14 +696,14 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi
        info->screen_base = pci_iomap(dev, 0, 0);
        if (! info->screen_base) {
                rc = -ENOMEM;
-               dev_err(info->dev, "iomap for framebuffer failed\n");
+               dev_err(info->device, "iomap for framebuffer failed\n");
                goto err_iomap_1;
        }
 
        par->mmio_base = pci_iomap(dev, 1, 0);
        if (! par->mmio_base) {
                rc = -ENOMEM;
-               dev_err(info->dev, "iomap for MMIO failed\n");
+               dev_err(info->device, "iomap for MMIO failed\n");
                goto err_iomap_2;
        }
 
@@ -714,7 +714,7 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi
        if ((16 <= memsize1) && (memsize1 <= 64) && (memsize1 == memsize2))
                info->screen_size = memsize1 << 20;
        else {
-               dev_err(info->dev, "memory size detection failed (%x %x), suppose 16 MB\n", memsize1, memsize2);
+               dev_err(info->device, "memory size detection failed (%x %x), suppose 16 MB\n", memsize1, memsize2);
                info->screen_size = 16 << 20;
        }
 
@@ -731,19 +731,19 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi
        rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8);
        if (! ((rc == 1) || (rc == 2))) {
                rc = -EINVAL;
-               dev_err(info->dev, "mode %s not found\n", mode_option);
+               dev_err(info->device, "mode %s not found\n", mode_option);
                goto err_find_mode;
        }
 
        rc = fb_alloc_cmap(&info->cmap, 256, 0);
        if (rc < 0) {
-               dev_err(info->dev, "cannot allocate colormap\n");
+               dev_err(info->device, "cannot allocate colormap\n");
                goto err_alloc_cmap;
        }
 
        rc = register_framebuffer(info);
        if (rc < 0) {
-               dev_err(info->dev, "cannot register framebugger\n");
+               dev_err(info->device, "cannot register framebugger\n");
                goto err_reg_fb;
        }
 
@@ -817,7 +817,7 @@ static int vt8623_pci_suspend(struct pci_dev* dev, pm_message_t state)
        struct fb_info *info = pci_get_drvdata(dev);
        struct vt8623fb_info *par = info->par;
 
-       dev_info(info->dev, "suspend\n");
+       dev_info(info->device, "suspend\n");
 
        acquire_console_sem();
        mutex_lock(&(par->open_lock));
@@ -848,7 +848,7 @@ static int vt8623_pci_resume(struct pci_dev* dev)
        struct fb_info *info = pci_get_drvdata(dev);
        struct vt8623fb_info *par = info->par;
 
-       dev_info(info->dev, "resume\n");
+       dev_info(info->device, "resume\n");
 
        acquire_console_sem();
        mutex_lock(&(par->open_lock));
index 2eb48c0df32c9889fa93e0d4123912f735f6f1c7..ef7b0d67095ea8ee053731eb6e66cb9835e6ce19 100644 (file)
@@ -69,7 +69,8 @@ struct ar7_wdt {
        u32 prescale;
 };
 
-static struct semaphore open_semaphore;
+static unsigned long wdt_is_open;
+static spinlock_t wdt_lock;
 static unsigned expect_close;
 
 /* XXX currently fixed, allows max margin ~68.72 secs */
@@ -154,8 +155,10 @@ static void ar7_wdt_update_margin(int new_margin)
        u32 change;
 
        change = new_margin * (ar7_vbus_freq() / prescale_value);
-       if (change < 1) change = 1;
-       if (change > 0xffff) change = 0xffff;
+       if (change < 1)
+               change = 1;
+       if (change > 0xffff)
+               change = 0xffff;
        ar7_wdt_change(change);
        margin = change * prescale_value / ar7_vbus_freq();
        printk(KERN_INFO DRVNAME
@@ -179,7 +182,7 @@ static void ar7_wdt_disable_wdt(void)
 static int ar7_wdt_open(struct inode *inode, struct file *file)
 {
        /* only allow one at a time */
-       if (down_trylock(&open_semaphore))
+       if (test_and_set_bit(0, &wdt_is_open))
                return -EBUSY;
        ar7_wdt_enable_wdt();
        expect_close = 0;
@@ -195,9 +198,7 @@ static int ar7_wdt_release(struct inode *inode, struct file *file)
                "will not disable the watchdog timer\n");
        else if (!nowayout)
                ar7_wdt_disable_wdt();
-
-       up(&open_semaphore);
-
+       clear_bit(0, &wdt_is_open);
        return 0;
 }
 
@@ -222,7 +223,9 @@ static ssize_t ar7_wdt_write(struct file *file, const char *data,
        if (len) {
                size_t i;
 
+               spin_lock(&wdt_lock);
                ar7_wdt_kick(1);
+               spin_unlock(&wdt_lock);
 
                expect_close = 0;
                for (i = 0; i < len; ++i) {
@@ -237,8 +240,8 @@ static ssize_t ar7_wdt_write(struct file *file, const char *data,
        return len;
 }
 
-static int ar7_wdt_ioctl(struct inode *inode, struct file *file,
-                        unsigned int cmd, unsigned long arg)
+static long ar7_wdt_ioctl(struct file *file,
+                                       unsigned int cmd, unsigned long arg)
 {
        static struct watchdog_info ident = {
                .identity = LONGNAME,
@@ -269,8 +272,10 @@ static int ar7_wdt_ioctl(struct inode *inode, struct file *file,
                if (new_margin < 1)
                        return -EINVAL;
 
+               spin_lock(&wdt_lock);
                ar7_wdt_update_margin(new_margin);
                ar7_wdt_kick(1);
+               spin_unlock(&wdt_lock);
 
        case WDIOC_GETTIMEOUT:
                if (put_user(margin, (int *)arg))
@@ -282,7 +287,7 @@ static int ar7_wdt_ioctl(struct inode *inode, struct file *file,
 static const struct file_operations ar7_wdt_fops = {
        .owner          = THIS_MODULE,
        .write          = ar7_wdt_write,
-       .ioctl          = ar7_wdt_ioctl,
+       .unlocked_ioctl = ar7_wdt_ioctl,
        .open           = ar7_wdt_open,
        .release        = ar7_wdt_release,
 };
@@ -297,6 +302,8 @@ static int __init ar7_wdt_init(void)
 {
        int rc;
 
+       spin_lock_init(&wdt_lock);
+
        ar7_wdt_get_regs();
 
        if (!request_mem_region(ar7_regs_wdt, sizeof(struct ar7_wdt),
@@ -312,8 +319,6 @@ static int __init ar7_wdt_init(void)
        ar7_wdt_prescale(prescale_value);
        ar7_wdt_update_margin(margin);
 
-       sema_init(&open_semaphore, 1);
-
        rc = register_reboot_notifier(&ar7_wdt_notifier);
        if (rc) {
                printk(KERN_ERR DRVNAME
index 445b7e812112572ba82925576b6129ebafe8aed5..51bfd572183300430f6df7b6580b72bcb9c0e75f 100644 (file)
@@ -30,9 +30,8 @@
 #include <linux/fs.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
+#include <linux/uaccess.h>
+#include <linux/io.h>
 
 #define NAME "it8712f_wdt"
 
@@ -50,7 +49,7 @@ static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
 MODULE_PARM_DESC(nowayout, "Disable watchdog shutdown on close");
 
-static struct semaphore it8712f_wdt_sem;
+static unsigned long wdt_open;
 static unsigned expect_close;
 static spinlock_t io_lock;
 static unsigned char revision;
@@ -86,22 +85,19 @@ static unsigned short address;
 #define WDT_OUT_PWROK  0x10
 #define WDT_OUT_KRST   0x40
 
-static int
-superio_inb(int reg)
+static int superio_inb(int reg)
 {
        outb(reg, REG);
        return inb(VAL);
 }
 
-static void
-superio_outb(int val, int reg)
+static void superio_outb(int val, int reg)
 {
        outb(reg, REG);
        outb(val, VAL);
 }
 
-static int
-superio_inw(int reg)
+static int superio_inw(int reg)
 {
        int val;
        outb(reg++, REG);
@@ -111,15 +107,13 @@ superio_inw(int reg)
        return val;
 }
 
-static inline void
-superio_select(int ldn)
+static inline void superio_select(int ldn)
 {
        outb(LDN, REG);
        outb(ldn, VAL);
 }
 
-static inline void
-superio_enter(void)
+static inline void superio_enter(void)
 {
        spin_lock(&io_lock);
        outb(0x87, REG);
@@ -128,22 +122,19 @@ superio_enter(void)
        outb(0x55, REG);
 }
 
-static inline void
-superio_exit(void)
+static inline void superio_exit(void)
 {
        outb(0x02, REG);
        outb(0x02, VAL);
        spin_unlock(&io_lock);
 }
 
-static inline void
-it8712f_wdt_ping(void)
+static inline void it8712f_wdt_ping(void)
 {
        inb(address);
 }
 
-static void
-it8712f_wdt_update_margin(void)
+static void it8712f_wdt_update_margin(void)
 {
        int config = WDT_OUT_KRST | WDT_OUT_PWROK;
        int units = margin;
@@ -165,8 +156,7 @@ it8712f_wdt_update_margin(void)
        superio_outb(units, WDT_TIMEOUT);
 }
 
-static int
-it8712f_wdt_get_status(void)
+static int it8712f_wdt_get_status(void)
 {
        if (superio_inb(WDT_CONTROL) & 0x01)
                return WDIOF_CARDRESET;
@@ -174,8 +164,7 @@ it8712f_wdt_get_status(void)
                return 0;
 }
 
-static void
-it8712f_wdt_enable(void)
+static void it8712f_wdt_enable(void)
 {
        printk(KERN_DEBUG NAME ": enabling watchdog timer\n");
        superio_enter();
@@ -190,8 +179,7 @@ it8712f_wdt_enable(void)
        it8712f_wdt_ping();
 }
 
-static void
-it8712f_wdt_disable(void)
+static void it8712f_wdt_disable(void)
 {
        printk(KERN_DEBUG NAME ": disabling watchdog timer\n");
 
@@ -207,8 +195,7 @@ it8712f_wdt_disable(void)
        superio_exit();
 }
 
-static int
-it8712f_wdt_notify(struct notifier_block *this,
+static int it8712f_wdt_notify(struct notifier_block *this,
                    unsigned long code, void *unused)
 {
        if (code == SYS_HALT || code == SYS_POWER_OFF)
@@ -222,9 +209,8 @@ static struct notifier_block it8712f_wdt_notifier = {
        .notifier_call = it8712f_wdt_notify,
 };
 
-static ssize_t
-it8712f_wdt_write(struct file *file, const char __user *data,
-       size_t len, loff_t *ppos)
+static ssize_t it8712f_wdt_write(struct file *file, const char __user *data,
+                                       size_t len, loff_t *ppos)
 {
        /* check for a magic close character */
        if (len) {
@@ -245,9 +231,8 @@ it8712f_wdt_write(struct file *file, const char __user *data,
        return len;
 }
 
-static int
-it8712f_wdt_ioctl(struct inode *inode, struct file *file,
-       unsigned int cmd, unsigned long arg)
+static long it8712f_wdt_ioctl(struct file *file, unsigned int cmd,
+                                                       unsigned long arg)
 {
        void __user *argp = (void __user *)arg;
        int __user *p = argp;
@@ -302,19 +287,16 @@ it8712f_wdt_ioctl(struct inode *inode, struct file *file,
        }
 }
 
-static int
-it8712f_wdt_open(struct inode *inode, struct file *file)
+static int it8712f_wdt_open(struct inode *inode, struct file *file)
 {
        /* only allow one at a time */
-       if (down_trylock(&it8712f_wdt_sem))
+       if (test_and_set_bit(0, &wdt_open))
                return -EBUSY;
        it8712f_wdt_enable();
-
        return nonseekable_open(inode, file);
 }
 
-static int
-it8712f_wdt_release(struct inode *inode, struct file *file)
+static int it8712f_wdt_release(struct inode *inode, struct file *file)
 {
        if (expect_close != 42) {
                printk(KERN_WARNING NAME
@@ -324,7 +306,7 @@ it8712f_wdt_release(struct inode *inode, struct file *file)
                it8712f_wdt_disable();
        }
        expect_close = 0;
-       up(&it8712f_wdt_sem);
+       clear_bit(0, &wdt_open);
 
        return 0;
 }
@@ -333,7 +315,7 @@ static const struct file_operations it8712f_wdt_fops = {
        .owner = THIS_MODULE,
        .llseek = no_llseek,
        .write = it8712f_wdt_write,
-       .ioctl = it8712f_wdt_ioctl,
+       .unlocked_ioctl = it8712f_wdt_ioctl,
        .open = it8712f_wdt_open,
        .release = it8712f_wdt_release,
 };
@@ -344,8 +326,7 @@ static struct miscdevice it8712f_wdt_miscdev = {
        .fops = &it8712f_wdt_fops,
 };
 
-static int __init
-it8712f_wdt_find(unsigned short *address)
+static int __init it8712f_wdt_find(unsigned short *address)
 {
        int err = -ENODEV;
        int chip_type;
@@ -387,8 +368,7 @@ exit:
        return err;
 }
 
-static int __init
-it8712f_wdt_init(void)
+static int __init it8712f_wdt_init(void)
 {
        int err = 0;
 
@@ -404,8 +384,6 @@ it8712f_wdt_init(void)
 
        it8712f_wdt_disable();
 
-       sema_init(&it8712f_wdt_sem, 1);
-
        err = register_reboot_notifier(&it8712f_wdt_notifier);
        if (err) {
                printk(KERN_ERR NAME ": unable to register reboot notifier\n");
@@ -430,8 +408,7 @@ out:
        return err;
 }
 
-static void __exit
-it8712f_wdt_exit(void)
+static void __exit it8712f_wdt_exit(void)
 {
        misc_deregister(&it8712f_wdt_miscdev);
        unregister_reboot_notifier(&it8712f_wdt_notifier);
index 98532c0e0689c93726976cb3507385321849f828..97b4a2e8eb09a62db3e5fa0eae184952be4e76b3 100644 (file)
@@ -46,9 +46,8 @@
 #include <linux/platform_device.h>
 #include <linux/interrupt.h>
 #include <linux/clk.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
+#include <linux/uaccess.h>
+#include <linux/io.h>
 
 #include <asm/arch/map.h>
 
@@ -65,8 +64,8 @@
 static int nowayout    = WATCHDOG_NOWAYOUT;
 static int tmr_margin  = CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME;
 static int tmr_atboot  = CONFIG_S3C2410_WATCHDOG_ATBOOT;
-static int soft_noboot = 0;
-static int debug       = 0;
+static int soft_noboot;
+static int debug;
 
 module_param(tmr_margin,  int, 0);
 module_param(tmr_atboot,  int, 0);
@@ -74,24 +73,23 @@ module_param(nowayout,    int, 0);
 module_param(soft_noboot, int, 0);
 module_param(debug,      int, 0);
 
-MODULE_PARM_DESC(tmr_margin, "Watchdog tmr_margin in seconds. default=" __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME) ")");
-
-MODULE_PARM_DESC(tmr_atboot, "Watchdog is started at boot time if set to 1, default=" __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_ATBOOT));
-
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
-
+MODULE_PARM_DESC(tmr_margin, "Watchdog tmr_margin in seconds. default="
+               __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME) ")");
+MODULE_PARM_DESC(tmr_atboot,
+               "Watchdog is started at boot time if set to 1, default="
+                       __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_ATBOOT));
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
+                       __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 MODULE_PARM_DESC(soft_noboot, "Watchdog action, set to 1 to ignore reboots, 0 to reboot (default depends on ONLY_TESTING)");
-
 MODULE_PARM_DESC(debug, "Watchdog debug, set to >1 for debug, (default 0)");
 
 
 typedef enum close_state {
        CLOSE_STATE_NOT,
-       CLOSE_STATE_ALLOW=0x4021
+       CLOSE_STATE_ALLOW = 0x4021
 } close_state_t;
 
-static DECLARE_MUTEX(open_lock);
-
+static unsigned long open_lock;
 static struct device    *wdt_dev;      /* platform device attached to */
 static struct resource *wdt_mem;
 static struct resource *wdt_irq;
@@ -99,38 +97,58 @@ static struct clk   *wdt_clock;
 static void __iomem    *wdt_base;
 static unsigned int     wdt_count;
 static close_state_t    allow_close;
+static DEFINE_SPINLOCK(wdt_lock);
 
 /* watchdog control routines */
 
 #define DBG(msg...) do { \
        if (debug) \
                printk(KERN_INFO msg); \
-       } while(0)
+       } while (0)
 
 /* functions */
 
-static int s3c2410wdt_keepalive(void)
+static void s3c2410wdt_keepalive(void)
 {
+       spin_lock(&wdt_lock);
        writel(wdt_count, wdt_base + S3C2410_WTCNT);
-       return 0;
+       spin_unlock(&wdt_lock);
 }
 
-static int s3c2410wdt_stop(void)
+static void __s3c2410wdt_stop(void)
 {
        unsigned long wtcon;
 
+       spin_lock(&wdt_lock);
        wtcon = readl(wdt_base + S3C2410_WTCON);
        wtcon &= ~(S3C2410_WTCON_ENABLE | S3C2410_WTCON_RSTEN);
        writel(wtcon, wdt_base + S3C2410_WTCON);
+       spin_unlock(&wdt_lock);
+}
 
-       return 0;
+static void __s3c2410wdt_stop(void)
+{
+       unsigned long wtcon;
+
+       wtcon = readl(wdt_base + S3C2410_WTCON);
+       wtcon &= ~(S3C2410_WTCON_ENABLE | S3C2410_WTCON_RSTEN);
+       writel(wtcon, wdt_base + S3C2410_WTCON);
+}
+
+static void s3c2410wdt_stop(void)
+{
+       spin_lock(&wdt_lock);
+       __s3c2410wdt_stop();
+       spin_unlock(&wdt_lock);
 }
 
-static int s3c2410wdt_start(void)
+static void s3c2410wdt_start(void)
 {
        unsigned long wtcon;
 
-       s3c2410wdt_stop();
+       spin_lock(&wdt_lock);
+
+       __s3c2410wdt_stop();
 
        wtcon = readl(wdt_base + S3C2410_WTCON);
        wtcon |= S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV128;
@@ -149,6 +167,7 @@ static int s3c2410wdt_start(void)
        writel(wdt_count, wdt_base + S3C2410_WTDAT);
        writel(wdt_count, wdt_base + S3C2410_WTCNT);
        writel(wtcon, wdt_base + S3C2410_WTCON);
+       spin_unlock(&wdt_lock);
 
        return 0;
 }
@@ -211,7 +230,7 @@ static int s3c2410wdt_set_heartbeat(int timeout)
 
 static int s3c2410wdt_open(struct inode *inode, struct file *file)
 {
-       if(down_trylock(&open_lock))
+       if (test_and_set_bit(0, &open_lock))
                return -EBUSY;
 
        if (nowayout)
@@ -231,15 +250,14 @@ static int s3c2410wdt_release(struct inode *inode, struct file *file)
         *      Lock it in if it's a module and we set nowayout
         */
 
-       if (allow_close == CLOSE_STATE_ALLOW) {
+       if (allow_close == CLOSE_STATE_ALLOW)
                s3c2410wdt_stop();
-       else {
+       else {
                dev_err(wdt_dev, "Unexpected close, not stopping watchdog\n");
                s3c2410wdt_keepalive();
        }
-
        allow_close = CLOSE_STATE_NOT;
-       up(&open_lock);
+       clear_bit(0, &open_lock);
        return 0;
 }
 
@@ -249,7 +267,7 @@ static ssize_t s3c2410wdt_write(struct file *file, const char __user *data,
        /*
         *      Refresh the timer.
         */
-       if(len) {
+       if (len) {
                if (!nowayout) {
                        size_t i;
 
@@ -265,7 +283,6 @@ static ssize_t s3c2410wdt_write(struct file *file, const char __user *data,
                                        allow_close = CLOSE_STATE_ALLOW;
                        }
                }
-
                s3c2410wdt_keepalive();
        }
        return len;
@@ -273,48 +290,41 @@ static ssize_t s3c2410wdt_write(struct file *file, const char __user *data,
 
 #define OPTIONS WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE
 
-static struct watchdog_info s3c2410_wdt_ident = {
+static const struct watchdog_info s3c2410_wdt_ident = {
        .options          =     OPTIONS,
        .firmware_version =     0,
        .identity         =     "S3C2410 Watchdog",
 };
 
 
-static int s3c2410wdt_ioctl(struct inode *inode, struct file *file,
-       unsigned int cmd, unsigned long arg)
+static long s3c2410wdt_ioctl(struct file *file,        unsigned int cmd,
+                                                       unsigned long arg)
 {
        void __user *argp = (void __user *)arg;
        int __user *p = argp;
        int new_margin;
 
        switch (cmd) {
-               default:
-                       return -ENOTTY;
-
-               case WDIOC_GETSUPPORT:
-                       return copy_to_user(argp, &s3c2410_wdt_ident,
-                               sizeof(s3c2410_wdt_ident)) ? -EFAULT : 0;
-
-               case WDIOC_GETSTATUS:
-               case WDIOC_GETBOOTSTATUS:
-                       return put_user(0, p);
-
-               case WDIOC_KEEPALIVE:
-                       s3c2410wdt_keepalive();
-                       return 0;
-
-               case WDIOC_SETTIMEOUT:
-                       if (get_user(new_margin, p))
-                               return -EFAULT;
-
-                       if (s3c2410wdt_set_heartbeat(new_margin))
-                               return -EINVAL;
-
-                       s3c2410wdt_keepalive();
-                       return put_user(tmr_margin, p);
-
-               case WDIOC_GETTIMEOUT:
-                       return put_user(tmr_margin, p);
+       default:
+               return -ENOTTY;
+       case WDIOC_GETSUPPORT:
+               return copy_to_user(argp, &s3c2410_wdt_ident,
+                       sizeof(s3c2410_wdt_ident)) ? -EFAULT : 0;
+       case WDIOC_GETSTATUS:
+       case WDIOC_GETBOOTSTATUS:
+               return put_user(0, p);
+       case WDIOC_KEEPALIVE:
+               s3c2410wdt_keepalive();
+               return 0;
+       case WDIOC_SETTIMEOUT:
+               if (get_user(new_margin, p))
+                       return -EFAULT;
+               if (s3c2410wdt_set_heartbeat(new_margin))
+                       return -EINVAL;
+               s3c2410wdt_keepalive();
+               return put_user(tmr_margin, p);
+       case WDIOC_GETTIMEOUT:
+               return put_user(tmr_margin, p);
        }
 }
 
@@ -324,7 +334,7 @@ static const struct file_operations s3c2410wdt_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .write          = s3c2410wdt_write,
-       .ioctl          = s3c2410wdt_ioctl,
+       .unlocked_ioctl = s3c2410wdt_ioctl,
        .open           = s3c2410wdt_open,
        .release        = s3c2410wdt_release,
 };
@@ -411,14 +421,15 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
         * not, try the default value */
 
        if (s3c2410wdt_set_heartbeat(tmr_margin)) {
-               started = s3c2410wdt_set_heartbeat(CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME);
+               started = s3c2410wdt_set_heartbeat(
+                                       CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME);
 
-               if (started == 0) {
-                       dev_info(dev,"tmr_margin value out of range, default %d used\n",
+               if (started == 0)
+                       dev_info(dev,
+                          "tmr_margin value out of range, default %d used\n",
                               CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME);
-               } else {
+               else
                        dev_info(dev, "default timer value is out of range, cannot start\n");
-               }
        }
 
        ret = misc_register(&s3c2410wdt_miscdev);
@@ -447,7 +458,7 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
                 (wtcon & S3C2410_WTCON_ENABLE) ?  "" : "in",
                 (wtcon & S3C2410_WTCON_RSTEN) ? "" : "dis",
                 (wtcon & S3C2410_WTCON_INTEN) ? "" : "en");
-       
+
        return 0;
 
  err_clk:
@@ -487,7 +498,7 @@ static int s3c2410wdt_remove(struct platform_device *dev)
 
 static void s3c2410wdt_shutdown(struct platform_device *dev)
 {
-       s3c2410wdt_stop();      
+       s3c2410wdt_stop();
 }
 
 #ifdef CONFIG_PM
@@ -540,7 +551,8 @@ static struct platform_driver s3c2410wdt_driver = {
 };
 
 
-static char banner[] __initdata = KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics\n";
+static char banner[] __initdata =
+       KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics\n";
 
 static int __init watchdog_init(void)
 {
index 35cddff7020fe081c6401253a76b1a21cf94797d..621ebad56d86cdf798b22edf7a316c80eaa81e46 100644 (file)
  *
  *     Changelog:
  *     20020220 Zwane Mwaikambo        Code based on datasheet, no hardware.
- *     20020221 Zwane Mwaikambo        Cleanups as suggested by Jeff Garzik and Alan Cox.
+ *     20020221 Zwane Mwaikambo        Cleanups as suggested by Jeff Garzik
+ *                                     and Alan Cox.
  *     20020222 Zwane Mwaikambo        Added probing.
  *     20020225 Zwane Mwaikambo        Added ISAPNP support.
  *     20020412 Rob Radez              Broke out start/stop functions
- *              <rob@osinvestor.com>   Return proper status instead of temperature warning
- *                                     Add WDIOC_GETBOOTSTATUS and WDIOC_SETOPTIONS ioctls
+ *              <rob@osinvestor.com>   Return proper status instead of
+ *                                     temperature warning
+ *                                     Add WDIOC_GETBOOTSTATUS and
+ *                                     WDIOC_SETOPTIONS ioctls
  *                                     Fix CONFIG_WATCHDOG_NOWAYOUT
- *     20020530 Joel Becker            Add Matt Domsch's nowayout module option
+ *     20020530 Joel Becker            Add Matt Domsch's nowayout module
+ *                                     option
  *     20030116 Adam Belay             Updated to the latest pnp code
  *
  */
@@ -39,9 +43,8 @@
 #include <linux/pnp.h>
 #include <linux/fs.h>
 #include <linux/semaphore.h>
-
-#include <asm/io.h>
-#include <asm/uaccess.h>
+#include <linux/io.h>
+#include <linux/uaccess.h>
 
 #define SC1200_MODULE_VER      "build 20020303"
 #define SC1200_MODULE_NAME     "sc1200wdt"
@@ -72,7 +75,7 @@ static char banner[] __initdata = KERN_INFO PFX SC1200_MODULE_VER;
 static int timeout = 1;
 static int io = -1;
 static int io_len = 2;         /* for non plug and play */
-static struct semaphore open_sem;
+static unsigned long open_flag;
 static char expect_close;
 static DEFINE_SPINLOCK(sc1200wdt_lock);        /* io port access serialisation */
 
@@ -81,7 +84,8 @@ static int isapnp = 1;
 static struct pnp_dev *wdt_dev;
 
 module_param(isapnp, int, 0);
-MODULE_PARM_DESC(isapnp, "When set to 0 driver ISA PnP support will be disabled");
+MODULE_PARM_DESC(isapnp,
+       "When set to 0 driver ISA PnP support will be disabled");
 #endif
 
 module_param(io, int, 0);
@@ -91,26 +95,40 @@ MODULE_PARM_DESC(timeout, "range is 0-255 minutes, default is 1");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+MODULE_PARM_DESC(nowayout,
+       "Watchdog cannot be stopped once started (default="
+                               __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 
 
 /* Read from Data Register */
-static inline void sc1200wdt_read_data(unsigned char index, unsigned char *data)
+static inline void __sc1200wdt_read_data(unsigned char index,
+                                               unsigned char *data)
 {
-       spin_lock(&sc1200wdt_lock);
        outb_p(index, PMIR);
        *data = inb(PMDR);
-       spin_unlock(&sc1200wdt_lock);
 }
 
+static void sc1200wdt_read_data(unsigned char index, unsigned char *data)
+{
+       spin_lock(&sc1200wdt_lock);
+       __sc1200wdt_read_data(index, data);
+       spin_unlock(&sc1200wdt_lock);
+}
 
 /* Write to Data Register */
-static inline void sc1200wdt_write_data(unsigned char index, unsigned char data)
+static inline void __sc1200wdt_write_data(unsigned char index,
+                                               unsigned char data)
 {
-       spin_lock(&sc1200wdt_lock);
        outb_p(index, PMIR);
        outb(data, PMDR);
+}
+
+static inline void sc1200wdt_write_data(unsigned char index,
+                                               unsigned char data)
+{
+       spin_lock(&sc1200wdt_lock);
+       __sc1200wdt_write_data(index, data);
        spin_unlock(&sc1200wdt_lock);
 }
 
@@ -118,22 +136,23 @@ static inline void sc1200wdt_write_data(unsigned char index, unsigned char data)
 static void sc1200wdt_start(void)
 {
        unsigned char reg;
+       spin_lock(&sc1200wdt_lock);
 
-       sc1200wdt_read_data(WDCF, &reg);
+       __sc1200wdt_read_data(WDCF, &reg);
        /* assert WDO when any of the following interrupts are triggered too */
        reg |= (KBC_IRQ | MSE_IRQ | UART1_IRQ | UART2_IRQ);
-       sc1200wdt_write_data(WDCF, reg);
+       __sc1200wdt_write_data(WDCF, reg);
        /* set the timeout and get the ball rolling */
-       sc1200wdt_write_data(WDTO, timeout);
-}
+       __sc1200wdt_write_data(WDTO, timeout);
 
+       spin_unlock(&sc1200wdt_lock);
+}
 
 static void sc1200wdt_stop(void)
 {
        sc1200wdt_write_data(WDTO, 0);
 }
 
-
 /* This returns the status of the WDO signal, inactive high. */
 static inline int sc1200wdt_status(void)
 {
@@ -144,14 +163,13 @@ static inline int sc1200wdt_status(void)
         * KEEPALIVEPING which is a bit of a kludge because there's nothing
         * else for enabled/disabled status
         */
-       return (ret & 0x01) ? 0 : WDIOF_KEEPALIVEPING;  /* bits 1 - 7 are undefined */
+       return (ret & 0x01) ? 0 : WDIOF_KEEPALIVEPING;
 }
 
-
 static int sc1200wdt_open(struct inode *inode, struct file *file)
 {
        /* allow one at a time */
-       if (down_trylock(&open_sem))
+       if (test_and_set_bit(0, &open_flag))
                return -EBUSY;
 
        if (timeout > MAX_TIMEOUT)
@@ -164,71 +182,71 @@ static int sc1200wdt_open(struct inode *inode, struct file *file)
 }
 
 
-static int sc1200wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static long sc1200wdt_ioctl(struct file *file, unsigned int cmd,
+                                               unsigned long arg)
 {
        int new_timeout;
        void __user *argp = (void __user *)arg;
        int __user *p = argp;
-       static struct watchdog_info ident = {
-               .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
+       static const struct watchdog_info ident = {
+               .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT |
+                                                       WDIOF_MAGICCLOSE,
                .firmware_version = 0,
                .identity = "PC87307/PC97307",
        };
 
        switch (cmd) {
-               default:
-                       return -ENOTTY;
-
-               case WDIOC_GETSUPPORT:
-                       if (copy_to_user(argp, &ident, sizeof ident))
-                               return -EFAULT;
-                       return 0;
-
-               case WDIOC_GETSTATUS:
-                       return put_user(sc1200wdt_status(), p);
-
-               case WDIOC_GETBOOTSTATUS:
-                       return put_user(0, p);
-
-               case WDIOC_KEEPALIVE:
-                       sc1200wdt_write_data(WDTO, timeout);
-                       return 0;
 
-               case WDIOC_SETTIMEOUT:
-                       if (get_user(new_timeout, p))
-                               return -EFAULT;
+       case WDIOC_GETSUPPORT:
+               if (copy_to_user(argp, &ident, sizeof ident))
+                       return -EFAULT;
+               return 0;
 
-                       /* the API states this is given in secs */
-                       new_timeout /= 60;
-                       if (new_timeout < 0 || new_timeout > MAX_TIMEOUT)
-                               return -EINVAL;
+       case WDIOC_GETSTATUS:
+               return put_user(sc1200wdt_status(), p);
 
-                       timeout = new_timeout;
-                       sc1200wdt_write_data(WDTO, timeout);
-                       /* fall through and return the new timeout */
+       case WDIOC_GETBOOTSTATUS:
+               return put_user(0, p);
 
-               case WDIOC_GETTIMEOUT:
-                       return put_user(timeout * 60, p);
+       case WDIOC_KEEPALIVE:
+               sc1200wdt_write_data(WDTO, timeout);
+               return 0;
+
+       case WDIOC_SETTIMEOUT:
+               if (get_user(new_timeout, p))
+                       return -EFAULT;
+               /* the API states this is given in secs */
+               new_timeout /= 60;
+               if (new_timeout < 0 || new_timeout > MAX_TIMEOUT)
+                       return -EINVAL;
+               timeout = new_timeout;
+               sc1200wdt_write_data(WDTO, timeout);
+               /* fall through and return the new timeout */
 
-               case WDIOC_SETOPTIONS:
-               {
-                       int options, retval = -EINVAL;
+       case WDIOC_GETTIMEOUT:
+               return put_user(timeout * 60, p);
 
-                       if (get_user(options, p))
-                               return -EFAULT;
+       case WDIOC_SETOPTIONS:
+       {
+               int options, retval = -EINVAL;
 
-                       if (options & WDIOS_DISABLECARD) {
-                               sc1200wdt_stop();
-                               retval = 0;
-                       }
+               if (get_user(options, p))
+                       return -EFAULT;
 
-                       if (options & WDIOS_ENABLECARD) {
-                               sc1200wdt_start();
-                               retval = 0;
-                       }
+               if (options & WDIOS_DISABLECARD) {
+                       sc1200wdt_stop();
+                       retval = 0;
+               }
 
-                       return retval;
+               if (options & WDIOS_ENABLECARD) {
+                       sc1200wdt_start();
+                       retval = 0;
                }
+
+               return retval;
+       }
+       default:
+               return -ENOTTY;
        }
 }
 
@@ -240,16 +258,18 @@ static int sc1200wdt_release(struct inode *inode, struct file *file)
                printk(KERN_INFO PFX "Watchdog disabled\n");
        } else {
                sc1200wdt_write_data(WDTO, timeout);
-               printk(KERN_CRIT PFX "Unexpected close!, timeout = %d min(s)\n", timeout);
+               printk(KERN_CRIT PFX
+                       "Unexpected close!, timeout = %d min(s)\n", timeout);
        }
-       up(&open_sem);
+       clear_bit(0, &open_flag);
        expect_close = 0;
 
        return 0;
 }
 
 
-static ssize_t sc1200wdt_write(struct file *file, const char __user *data, size_t len, loff_t *ppos)
+static ssize_t sc1200wdt_write(struct file *file, const char __user *data,
+                                               size_t len, loff_t *ppos)
 {
        if (len) {
                if (!nowayout) {
@@ -275,7 +295,8 @@ static ssize_t sc1200wdt_write(struct file *file, const char __user *data, size_
 }
 
 
-static int sc1200wdt_notify_sys(struct notifier_block *this, unsigned long code, void *unused)
+static int sc1200wdt_notify_sys(struct notifier_block *this,
+                                       unsigned long code, void *unused)
 {
        if (code == SYS_DOWN || code == SYS_HALT)
                sc1200wdt_stop();
@@ -284,23 +305,20 @@ static int sc1200wdt_notify_sys(struct notifier_block *this, unsigned long code,
 }
 
 
-static struct notifier_block sc1200wdt_notifier =
-{
+static struct notifier_block sc1200wdt_notifier = {
        .notifier_call =        sc1200wdt_notify_sys,
 };
 
-static const struct file_operations sc1200wdt_fops =
-{
+static const struct file_operations sc1200wdt_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .write          = sc1200wdt_write,
-       .ioctl          = sc1200wdt_ioctl,
+       .unlocked_ioctl = sc1200wdt_ioctl,
        .open           = sc1200wdt_open,
        .release        = sc1200wdt_release,
 };
 
-static struct miscdevice sc1200wdt_miscdev =
-{
+static struct miscdevice sc1200wdt_miscdev = {
        .minor          = WATCHDOG_MINOR,
        .name           = "watchdog",
        .fops           = &sc1200wdt_fops,
@@ -312,14 +330,14 @@ static int __init sc1200wdt_probe(void)
        /* The probe works by reading the PMC3 register's default value of 0x0e
         * there is one caveat, if the device disables the parallel port or any
         * of the UARTs we won't be able to detect it.
-        * Nb. This could be done with accuracy by reading the SID registers, but
-        * we don't have access to those io regions.
+        * NB. This could be done with accuracy by reading the SID registers,
+        * but we don't have access to those io regions.
         */
 
        unsigned char reg;
 
        sc1200wdt_read_data(PMC3, &reg);
-       reg &= 0x0f;                            /* we don't want the UART busy bits */
+       reg &= 0x0f;            /* we don't want the UART busy bits */
        return (reg == 0x0e) ? 0 : -ENODEV;
 }
 
@@ -332,7 +350,8 @@ static struct pnp_device_id scl200wdt_pnp_devices[] = {
        {.id = ""},
 };
 
-static int scl200wdt_pnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id)
+static int scl200wdt_pnp_probe(struct pnp_dev *dev,
+                                       const struct pnp_device_id *dev_id)
 {
        /* this driver only supports one card at a time */
        if (wdt_dev || !isapnp)
@@ -347,13 +366,14 @@ static int scl200wdt_pnp_probe(struct pnp_dev * dev, const struct pnp_device_id
                return -EBUSY;
        }
 
-       printk(KERN_INFO "scl200wdt: PnP device found at io port %#x/%d\n", io, io_len);
+       printk(KERN_INFO "scl200wdt: PnP device found at io port %#x/%d\n",
+                                                               io, io_len);
        return 0;
 }
 
-static void scl200wdt_pnp_remove(struct pnp_dev * dev)
+static void scl200wdt_pnp_remove(struct pnp_dev *dev)
 {
-       if (wdt_dev){
+       if (wdt_dev) {
                release_region(io, io_len);
                wdt_dev = NULL;
        }
@@ -375,8 +395,6 @@ static int __init sc1200wdt_init(void)
 
        printk("%s\n", banner);
 
-       sema_init(&open_sem, 1);
-
 #if defined CONFIG_PNP
        if (isapnp) {
                ret = pnp_register_driver(&scl200wdt_pnp_driver);
@@ -410,13 +428,16 @@ static int __init sc1200wdt_init(void)
 
        ret = register_reboot_notifier(&sc1200wdt_notifier);
        if (ret) {
-               printk(KERN_ERR PFX "Unable to register reboot notifier err = %d\n", ret);
+               printk(KERN_ERR PFX
+                       "Unable to register reboot notifier err = %d\n", ret);
                goto out_io;
        }
 
        ret = misc_register(&sc1200wdt_miscdev);
        if (ret) {
-               printk(KERN_ERR PFX "Unable to register miscdev on minor %d\n", WATCHDOG_MINOR);
+               printk(KERN_ERR PFX
+                       "Unable to register miscdev on minor %d\n",
+                                                       WATCHDOG_MINOR);
                goto out_rbt;
        }
 
@@ -446,7 +467,7 @@ static void __exit sc1200wdt_exit(void)
        unregister_reboot_notifier(&sc1200wdt_notifier);
 
 #if defined CONFIG_PNP
-       if(isapnp)
+       if (isapnp)
                pnp_unregister_driver(&scl200wdt_pnp_driver);
        else
 #endif
index 756fb15fdce7aa97c1bfebbf0e8fcbf42fb5ee14..53a6b18bcb9ad8275f43454ce1cdde856e9bb6b8 100644 (file)
  *                                     Matt Crocker).
  *             Alan Cox        :       Added wdt= boot option
  *             Alan Cox        :       Cleaned up copy/user stuff
- *             Tim Hockin      :       Added insmod parameters, comment cleanup
- *                                     Parameterized timeout
- *             Tigran Aivazian :       Restructured wdt_init() to handle failures
+ *             Tim Hockin      :       Added insmod parameters, comment
+ *                                     cleanup, parameterized timeout
+ *             Tigran Aivazian :       Restructured wdt_init() to handle
+ *                                     failures
  *             Joel Becker     :       Added WDIOC_GET/SETTIMEOUT
  *             Matt Domsch     :       Added nowayout module option
  */
@@ -42,9 +43,9 @@
 #include <linux/notifier.h>
 #include <linux/reboot.h>
 #include <linux/init.h>
+#include <linux/io.h>
+#include <linux/uaccess.h>
 
-#include <asm/io.h>
-#include <asm/uaccess.h>
 #include <asm/system.h>
 #include "wd501p.h"
 
@@ -60,15 +61,19 @@ static char expect_close;
 static int heartbeat = WD_TIMO;
 static int wd_heartbeat;
 module_param(heartbeat, int, 0);
-MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" __MODULE_STRING(WD_TIMO) ")");
+MODULE_PARM_DESC(heartbeat,
+       "Watchdog heartbeat in seconds. (0 < heartbeat < 65536, default="
+                               __MODULE_STRING(WD_TIMO) ")");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+MODULE_PARM_DESC(nowayout,
+       "Watchdog cannot be stopped once started (default="
+                               __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /* You must set these - there is no sane way to probe for this board. */
-static int io=0x240;
-static int irq=11;
+static int io = 0x240;
+static int irq = 11;
 
 static DEFINE_SPINLOCK(wdt_lock);
 
@@ -82,7 +87,8 @@ MODULE_PARM_DESC(irq, "WDT irq (default=11)");
 static int tachometer;
 
 module_param(tachometer, int, 0);
-MODULE_PARM_DESC(tachometer, "WDT501-P Fan Tachometer support (0=disable, default=0)");
+MODULE_PARM_DESC(tachometer,
+               "WDT501-P Fan Tachometer support (0=disable, default=0)");
 #endif /* CONFIG_WDT_501 */
 
 /*
@@ -91,9 +97,9 @@ MODULE_PARM_DESC(tachometer, "WDT501-P Fan Tachometer support (0=disable, defaul
 
 static void wdt_ctr_mode(int ctr, int mode)
 {
-       ctr<<=6;
-       ctr|=0x30;
-       ctr|=(mode<<1);
+       ctr <<= 6;
+       ctr |= 0x30;
+       ctr |= (mode << 1);
        outb_p(ctr, WDT_CR);
 }
 
@@ -114,12 +120,15 @@ static int wdt_start(void)
        unsigned long flags;
        spin_lock_irqsave(&wdt_lock, flags);
        inb_p(WDT_DC);                  /* Disable watchdog */
-       wdt_ctr_mode(0,3);              /* Program CTR0 for Mode 3: Square Wave Generator */
-       wdt_ctr_mode(1,2);              /* Program CTR1 for Mode 2: Rate Generator */
-       wdt_ctr_mode(2,0);              /* Program CTR2 for Mode 0: Pulse on Terminal Count */
+       wdt_ctr_mode(0, 3);             /* Program CTR0 for Mode 3:
+                                               Square Wave Generator */
+       wdt_ctr_mode(1, 2);             /* Program CTR1 for Mode 2:
+                                               Rate Generator */
+       wdt_ctr_mode(2, 0);             /* Program CTR2 for Mode 0:
+                                               Pulse on Terminal Count */
        wdt_ctr_load(0, 8948);          /* Count at 100Hz */
-       wdt_ctr_load(1,wd_heartbeat);   /* Heartbeat */
-       wdt_ctr_load(2,65535);          /* Length of reset pulse */
+       wdt_ctr_load(1, wd_heartbeat);  /* Heartbeat */
+       wdt_ctr_load(2, 65535);         /* Length of reset pulse */
        outb_p(0, WDT_DC);              /* Enable watchdog */
        spin_unlock_irqrestore(&wdt_lock, flags);
        return 0;
@@ -131,13 +140,13 @@ static int wdt_start(void)
  *     Stop the watchdog driver.
  */
 
-static int wdt_stop (void)
+static int wdt_stop(void)
 {
        unsigned long flags;
        spin_lock_irqsave(&wdt_lock, flags);
        /* Turn the card off */
        inb_p(WDT_DC);                  /* Disable watchdog */
-       wdt_ctr_load(2,0);              /* 0 length reset pulses now */
+       wdt_ctr_load(2, 0);             /* 0 length reset pulses now */
        spin_unlock_irqrestore(&wdt_lock, flags);
        return 0;
 }
@@ -145,8 +154,8 @@ static int wdt_stop (void)
 /**
  *     wdt_ping:
  *
- *     Reload counter one with the watchdog heartbeat. We don't bother reloading
- *     the cascade counter.
+ *     Reload counter one with the watchdog heartbeat. We don't bother
+ *     reloading the cascade counter.
  */
 
 static int wdt_ping(void)
@@ -155,8 +164,9 @@ static int wdt_ping(void)
        spin_lock_irqsave(&wdt_lock, flags);
        /* Write a watchdog value */
        inb_p(WDT_DC);                  /* Disable watchdog */
-       wdt_ctr_mode(1,2);              /* Re-Program CTR1 for Mode 2: Rate Generator */
-       wdt_ctr_load(1,wd_heartbeat);   /* Heartbeat */
+       wdt_ctr_mode(1, 2);             /* Re-Program CTR1 for Mode 2:
+                                                       Rate Generator */
+       wdt_ctr_load(1, wd_heartbeat);  /* Heartbeat */
        outb_p(0, WDT_DC);              /* Enable watchdog */
        spin_unlock_irqrestore(&wdt_lock, flags);
        return 0;
@@ -166,13 +176,14 @@ static int wdt_ping(void)
  *     wdt_set_heartbeat:
  *     @t:             the new heartbeat value that needs to be set.
  *
- *     Set a new heartbeat value for the watchdog device. If the heartbeat value is
- *     incorrect we keep the old value and return -EINVAL. If successfull we
- *     return 0.
+ *     Set a new heartbeat value for the watchdog device. If the heartbeat
+ *     value is incorrect we keep the old value and return -EINVAL. If
+ *     successful we return 0.
  */
+
 static int wdt_set_heartbeat(int t)
 {
-       if ((t < 1) || (t > 65535))
+       if (t < 1 || t > 65535)
                return -EINVAL;
 
        heartbeat = t;
@@ -200,7 +211,7 @@ static int wdt_get_status(int *status)
        new_status = inb_p(WDT_SR);
        spin_unlock_irqrestore(&wdt_lock, flags);
 
-       *status=0;
+       *status = 0;
        if (new_status & WDC_SR_ISOI0)
                *status |= WDIOF_EXTERN1;
        if (new_status & WDC_SR_ISII1)
@@ -266,7 +277,7 @@ static irqreturn_t wdt_interrupt(int irq, void *dev_id)
 
 #ifdef CONFIG_WDT_501
        if (!(status & WDC_SR_TGOOD))
-               printk(KERN_CRIT "Overheat alarm.(%d)\n",inb_p(WDT_RT));
+               printk(KERN_CRIT "Overheat alarm.(%d)\n", inb_p(WDT_RT));
        if (!(status & WDC_SR_PSUOVER))
                printk(KERN_CRIT "PSU over voltage.\n");
        if (!(status & WDC_SR_PSUUNDR))
@@ -304,9 +315,10 @@ static irqreturn_t wdt_interrupt(int irq, void *dev_id)
  *     write of data will do, as we we don't define content meaning.
  */
 
-static ssize_t wdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
+static ssize_t wdt_write(struct file *file, const char __user *buf,
+                                               size_t count, loff_t *ppos)
 {
-       if(count) {
+       if (count) {
                if (!nowayout) {
                        size_t i;
 
@@ -328,7 +340,6 @@ static ssize_t wdt_write(struct file *file, const char __user *buf, size_t count
 
 /**
  *     wdt_ioctl:
- *     @inode: inode of the device
  *     @file: file handle to the device
  *     @cmd: watchdog command
  *     @arg: argument pointer
@@ -338,8 +349,7 @@ static ssize_t wdt_write(struct file *file, const char __user *buf, size_t count
  *     querying capabilities and current status.
  */
 
-static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-       unsigned long arg)
+static long wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        void __user *argp = (void __user *)arg;
        int __user *p = argp;
@@ -362,32 +372,28 @@ static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                ident.options |= WDIOF_FANFAULT;
 #endif /* CONFIG_WDT_501 */
 
-       switch(cmd)
-       {
-               default:
-                       return -ENOTTY;
-               case WDIOC_GETSUPPORT:
-                       return copy_to_user(argp, &ident, sizeof(ident))?-EFAULT:0;
-
-               case WDIOC_GETSTATUS:
-                       wdt_get_status(&status);
-                       return put_user(status, p);
-               case WDIOC_GETBOOTSTATUS:
-                       return put_user(0, p);
-               case WDIOC_KEEPALIVE:
-                       wdt_ping();
-                       return 0;
-               case WDIOC_SETTIMEOUT:
-                       if (get_user(new_heartbeat, p))
-                               return -EFAULT;
-
-                       if (wdt_set_heartbeat(new_heartbeat))
-                               return -EINVAL;
-
-                       wdt_ping();
-                       /* Fall */
-               case WDIOC_GETTIMEOUT:
-                       return put_user(heartbeat, p);
+       switch (cmd) {
+       default:
+               return -ENOTTY;
+       case WDIOC_GETSUPPORT:
+               return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0;
+       case WDIOC_GETSTATUS:
+               wdt_get_status(&status);
+               return put_user(status, p);
+       case WDIOC_GETBOOTSTATUS:
+               return put_user(0, p);
+       case WDIOC_KEEPALIVE:
+               wdt_ping();
+               return 0;
+       case WDIOC_SETTIMEOUT:
+               if (get_user(new_heartbeat, p))
+                       return -EFAULT;
+               if (wdt_set_heartbeat(new_heartbeat))
+                       return -EINVAL;
+               wdt_ping();
+               /* Fall */
+       case WDIOC_GETTIMEOUT:
+               return put_user(heartbeat, p);
        }
 }
 
@@ -405,7 +411,7 @@ static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
 
 static int wdt_open(struct inode *inode, struct file *file)
 {
-       if(test_and_set_bit(0, &wdt_is_open))
+       if (test_and_set_bit(0, &wdt_is_open))
                return -EBUSY;
        /*
         *      Activate
@@ -432,7 +438,8 @@ static int wdt_release(struct inode *inode, struct file *file)
                wdt_stop();
                clear_bit(0, &wdt_is_open);
        } else {
-               printk(KERN_CRIT "wdt: WDT device closed unexpectedly.  WDT will not stop!\n");
+               printk(KERN_CRIT
+                "wdt: WDT device closed unexpectedly.  WDT will not stop!\n");
                wdt_ping();
        }
        expect_close = 0;
@@ -451,14 +458,15 @@ static int wdt_release(struct inode *inode, struct file *file)
  *     farenheit. It was designed by an imperial measurement luddite.
  */
 
-static ssize_t wdt_temp_read(struct file *file, char __user *buf, size_t count, loff_t *ptr)
+static ssize_t wdt_temp_read(struct file *file, char __user *buf,
+                                               size_t count, loff_t *ptr)
 {
        int temperature;
 
        if (wdt_get_temperature(&temperature))
                return -EFAULT;
 
-       if (copy_to_user (buf, &temperature, 1))
+       if (copy_to_user(buf, &temperature, 1))
                return -EFAULT;
 
        return 1;
@@ -506,10 +514,8 @@ static int wdt_temp_release(struct inode *inode, struct file *file)
 static int wdt_notify_sys(struct notifier_block *this, unsigned long code,
        void *unused)
 {
-       if(code==SYS_DOWN || code==SYS_HALT) {
-               /* Turn the card off */
+       if (code == SYS_DOWN || code == SYS_HALT)
                wdt_stop();
-       }
        return NOTIFY_DONE;
 }
 
@@ -522,7 +528,7 @@ static const struct file_operations wdt_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .write          = wdt_write,
-       .ioctl          = wdt_ioctl,
+       .unlocked_ioctl = wdt_ioctl,
        .open           = wdt_open,
        .release        = wdt_release,
 };
@@ -576,7 +582,7 @@ static void __exit wdt_exit(void)
 #endif /* CONFIG_WDT_501 */
        unregister_reboot_notifier(&wdt_notifier);
        free_irq(irq, NULL);
-       release_region(io,8);
+       release_region(io, 8);
 }
 
 /**
@@ -591,44 +597,49 @@ static int __init wdt_init(void)
 {
        int ret;
 
-       /* Check that the heartbeat value is within it's range ; if not reset to the default */
+       /* Check that the heartbeat value is within it's range;
+          if not reset to the default */
        if (wdt_set_heartbeat(heartbeat)) {
                wdt_set_heartbeat(WD_TIMO);
-               printk(KERN_INFO "wdt: heartbeat value must be 0<heartbeat<65536, using %d\n",
+               printk(KERN_INFO "wdt: heartbeat value must be 0 < heartbeat < 65536, using %d\n",
                        WD_TIMO);
        }
 
        if (!request_region(io, 8, "wdt501p")) {
-               printk(KERN_ERR "wdt: I/O address 0x%04x already in use\n", io);
+               printk(KERN_ERR
+                       "wdt: I/O address 0x%04x already in use\n", io);
                ret = -EBUSY;
                goto out;
        }
 
        ret = request_irq(irq, wdt_interrupt, IRQF_DISABLED, "wdt501p", NULL);
-       if(ret) {
+       if (ret) {
                printk(KERN_ERR "wdt: IRQ %d is not free.\n", irq);
                goto outreg;
        }
 
        ret = register_reboot_notifier(&wdt_notifier);
-       if(ret) {
-               printk(KERN_ERR "wdt: cannot register reboot notifier (err=%d)\n", ret);
+       if (ret) {
+               printk(KERN_ERR
+                     "wdt: cannot register reboot notifier (err=%d)\n", ret);
                goto outirq;
        }
 
 #ifdef CONFIG_WDT_501
        ret = misc_register(&temp_miscdev);
        if (ret) {
-               printk(KERN_ERR "wdt: cannot register miscdev on minor=%d (err=%d)\n",
-                       TEMP_MINOR, ret);
+               printk(KERN_ERR
+                       "wdt: cannot register miscdev on minor=%d (err=%d)\n",
+                                                       TEMP_MINOR, ret);
                goto outrbt;
        }
 #endif /* CONFIG_WDT_501 */
 
        ret = misc_register(&wdt_miscdev);
        if (ret) {
-               printk(KERN_ERR "wdt: cannot register miscdev on minor=%d (err=%d)\n",
-                       WATCHDOG_MINOR, ret);
+               printk(KERN_ERR
+                       "wdt: cannot register miscdev on minor=%d (err=%d)\n",
+                                                       WATCHDOG_MINOR, ret);
                goto outmisc;
        }
 
@@ -636,7 +647,8 @@ static int __init wdt_init(void)
        printk(KERN_INFO "WDT500/501-P driver 0.10 at 0x%04x (Interrupt %d). heartbeat=%d sec (nowayout=%d)\n",
                io, irq, heartbeat, nowayout);
 #ifdef CONFIG_WDT_501
-       printk(KERN_INFO "wdt: Fan Tachometer is %s\n", (tachometer ? "Enabled" : "Disabled"));
+       printk(KERN_INFO "wdt: Fan Tachometer is %s\n",
+                               (tachometer ? "Enabled" : "Disabled"));
 #endif /* CONFIG_WDT_501 */
 
 out:
@@ -651,7 +663,7 @@ outrbt:
 outirq:
        free_irq(irq, NULL);
 outreg:
-       release_region(io,8);
+       release_region(io, 8);
        goto out;
 }
 
index 1355608683e40e8c124c140981d66727a0fb4300..5d922fd6eafcddb60eb44ab948f56e86e28be82d 100644 (file)
  *             JP Nollmann     :       Added support for PCI wdt501p
  *             Alan Cox        :       Split ISA and PCI cards into two drivers
  *             Jeff Garzik     :       PCI cleanups
- *             Tigran Aivazian :       Restructured wdtpci_init_one() to handle failures
+ *             Tigran Aivazian :       Restructured wdtpci_init_one() to handle
+ *                                     failures
  *             Joel Becker     :       Added WDIOC_GET/SETTIMEOUT
- *             Zwane Mwaikambo :       Magic char closing, locking changes, cleanups
+ *             Zwane Mwaikambo :       Magic char closing, locking changes,
+ *                                     cleanups
  *             Matt Domsch     :       nowayout module option
  */
 
 #include <linux/miscdevice.h>
 #include <linux/watchdog.h>
 #include <linux/ioport.h>
+#include <linux/delay.h>
 #include <linux/notifier.h>
 #include <linux/reboot.h>
 #include <linux/init.h>
 #include <linux/fs.h>
 #include <linux/pci.h>
+#include <linux/io.h>
+#include <linux/uaccess.h>
 
-#include <asm/io.h>
-#include <asm/uaccess.h>
 #include <asm/system.h>
 
 #define WDT_IS_PCI
@@ -73,7 +76,7 @@
 /* We can only use 1 card due to the /dev/watchdog restriction */
 static int dev_count;
 
-static struct semaphore open_sem;
+static unsigned long open_lock;
 static DEFINE_SPINLOCK(wdtpci_lock);
 static char expect_close;
 
@@ -86,18 +89,23 @@ static int irq;
 static int heartbeat = WD_TIMO;
 static int wd_heartbeat;
 module_param(heartbeat, int, 0);
-MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" __MODULE_STRING(WD_TIMO) ")");
+MODULE_PARM_DESC(heartbeat,
+               "Watchdog heartbeat in seconds. (0<heartbeat<65536, default="
+                               __MODULE_STRING(WD_TIMO) ")");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+MODULE_PARM_DESC(nowayout,
+               "Watchdog cannot be stopped once started (default="
+                               __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 #ifdef CONFIG_WDT_501_PCI
 /* Support for the Fan Tachometer on the PCI-WDT501 */
 static int tachometer;
 
 module_param(tachometer, int, 0);
-MODULE_PARM_DESC(tachometer, "PCI-WDT501 Fan Tachometer support (0=disable, default=0)");
+MODULE_PARM_DESC(tachometer,
+       "PCI-WDT501 Fan Tachometer support (0=disable, default=0)");
 #endif /* CONFIG_WDT_501_PCI */
 
 /*
@@ -106,16 +114,19 @@ MODULE_PARM_DESC(tachometer, "PCI-WDT501 Fan Tachometer support (0=disable, defa
 
 static void wdtpci_ctr_mode(int ctr, int mode)
 {
-       ctr<<=6;
-       ctr|=0x30;
-       ctr|=(mode<<1);
-       outb_p(ctr, WDT_CR);
+       ctr <<= 6;
+       ctr |= 0x30;
+       ctr |= (mode << 1);
+       outb(ctr, WDT_CR);
+       udelay(8);
 }
 
 static void wdtpci_ctr_load(int ctr, int val)
 {
-       outb_p(val&0xFF, WDT_COUNT0+ctr);
-       outb_p(val>>8, WDT_COUNT0+ctr);
+       outb(val & 0xFF, WDT_COUNT0 + ctr);
+       udelay(8);
+       outb(val >> 8, WDT_COUNT0 + ctr);
+       udelay(8);
 }
 
 /**
@@ -134,23 +145,35 @@ static int wdtpci_start(void)
         * "pet" the watchdog, as Access says.
         * This resets the clock outputs.
         */
-       inb_p(WDT_DC);                  /* Disable watchdog */
-       wdtpci_ctr_mode(2,0);           /* Program CTR2 for Mode 0: Pulse on Terminal Count */
-       outb_p(0, WDT_DC);              /* Enable watchdog */
-
-       inb_p(WDT_DC);                  /* Disable watchdog */
-       outb_p(0, WDT_CLOCK);           /* 2.0833MHz clock */
-       inb_p(WDT_BUZZER);              /* disable */
-       inb_p(WDT_OPTONOTRST);          /* disable */
-       inb_p(WDT_OPTORST);             /* disable */
-       inb_p(WDT_PROGOUT);             /* disable */
-       wdtpci_ctr_mode(0,3);           /* Program CTR0 for Mode 3: Square Wave Generator */
-       wdtpci_ctr_mode(1,2);           /* Program CTR1 for Mode 2: Rate Generator */
-       wdtpci_ctr_mode(2,1);           /* Program CTR2 for Mode 1: Retriggerable One-Shot */
-       wdtpci_ctr_load(0,20833);       /* count at 100Hz */
-       wdtpci_ctr_load(1,wd_heartbeat);/* Heartbeat */
+       inb(WDT_DC);                    /* Disable watchdog */
+       udelay(8);
+       wdtpci_ctr_mode(2, 0);          /* Program CTR2 for Mode 0:
+                                               Pulse on Terminal Count */
+       outb(0, WDT_DC);                /* Enable watchdog */
+       udelay(8);
+       inb(WDT_DC);                    /* Disable watchdog */
+       udelay(8);
+       outb(0, WDT_CLOCK);             /* 2.0833MHz clock */
+       udelay(8);
+       inb(WDT_BUZZER);                /* disable */
+       udelay(8);
+       inb(WDT_OPTONOTRST);            /* disable */
+       udelay(8);
+       inb(WDT_OPTORST);               /* disable */
+       udelay(8);
+       inb(WDT_PROGOUT);               /* disable */
+       udelay(8);
+       wdtpci_ctr_mode(0, 3);          /* Program CTR0 for Mode 3:
+                                               Square Wave Generator */
+       wdtpci_ctr_mode(1, 2);          /* Program CTR1 for Mode 2:
+                                               Rate Generator */
+       wdtpci_ctr_mode(2, 1);          /* Program CTR2 for Mode 1:
+                                               Retriggerable One-Shot */
+       wdtpci_ctr_load(0, 20833);      /* count at 100Hz */
+       wdtpci_ctr_load(1, wd_heartbeat);/* Heartbeat */
        /* DO NOT LOAD CTR2 on PCI card! -- JPN */
-       outb_p(0, WDT_DC);              /* Enable watchdog */
+       outb(0, WDT_DC);                /* Enable watchdog */
+       udelay(8);
 
        spin_unlock_irqrestore(&wdtpci_lock, flags);
        return 0;
@@ -162,14 +185,15 @@ static int wdtpci_start(void)
  *     Stop the watchdog driver.
  */
 
-static int wdtpci_stop (void)
+static int wdtpci_stop(void)
 {
        unsigned long flags;
 
        /* Turn the card off */
        spin_lock_irqsave(&wdtpci_lock, flags);
-       inb_p(WDT_DC);                  /* Disable watchdog */
-       wdtpci_ctr_load(2,0);           /* 0 length reset pulses now */
+       inb(WDT_DC);                    /* Disable watchdog */
+       udelay(8);
+       wdtpci_ctr_load(2, 0);          /* 0 length reset pulses now */
        spin_unlock_irqrestore(&wdtpci_lock, flags);
        return 0;
 }
@@ -177,20 +201,23 @@ static int wdtpci_stop (void)
 /**
  *     wdtpci_ping:
  *
- *     Reload counter one with the watchdog heartbeat. We don't bother reloading
- *     the cascade counter.
+ *     Reload counter one with the watchdog heartbeat. We don't bother
+ *     reloading the cascade counter.
  */
 
 static int wdtpci_ping(void)
 {
        unsigned long flags;
 
-       /* Write a watchdog value */
        spin_lock_irqsave(&wdtpci_lock, flags);
-       inb_p(WDT_DC);                  /* Disable watchdog */
-       wdtpci_ctr_mode(1,2);           /* Re-Program CTR1 for Mode 2: Rate Generator */
-       wdtpci_ctr_load(1,wd_heartbeat);/* Heartbeat */
-       outb_p(0, WDT_DC);              /* Enable watchdog */
+       /* Write a watchdog value */
+       inb(WDT_DC);                    /* Disable watchdog */
+       udelay(8);
+       wdtpci_ctr_mode(1, 2);          /* Re-Program CTR1 for Mode 2:
+                                                       Rate Generator */
+       wdtpci_ctr_load(1, wd_heartbeat);/* Heartbeat */
+       outb(0, WDT_DC);                /* Enable watchdog */
+       udelay(8);
        spin_unlock_irqrestore(&wdtpci_lock, flags);
        return 0;
 }
@@ -199,14 +226,14 @@ static int wdtpci_ping(void)
  *     wdtpci_set_heartbeat:
  *     @t:             the new heartbeat value that needs to be set.
  *
- *     Set a new heartbeat value for the watchdog device. If the heartbeat value is
- *     incorrect we keep the old value and return -EINVAL. If successfull we
- *     return 0.
+ *     Set a new heartbeat value for the watchdog device. If the heartbeat
+ *     value is incorrect we keep the old value and return -EINVAL.
+ *     If successful we return 0.
  */
 static int wdtpci_set_heartbeat(int t)
 {
        /* Arbitrary, can't find the card's limits */
-       if ((t < 1) || (t > 65535))
+       if (t < 1 || t > 65535)
                return -EINVAL;
 
        heartbeat = t;
@@ -227,9 +254,14 @@ static int wdtpci_set_heartbeat(int t)
 
 static int wdtpci_get_status(int *status)
 {
-       unsigned char new_status=inb_p(WDT_SR);
+       unsigned char new_status;
+       unsigned long flags;
+
+       spin_lock_irqsave(&wdtpci_lock, flags);
+       new_status = inb(WDT_SR);
+       spin_unlock_irqrestore(&wdtpci_lock, flags);
 
-       *status=0;
+       *status = 0;
        if (new_status & WDC_SR_ISOI0)
                *status |= WDIOF_EXTERN1;
        if (new_status & WDC_SR_ISII1)
@@ -259,8 +291,12 @@ static int wdtpci_get_status(int *status)
 
 static int wdtpci_get_temperature(int *temperature)
 {
-       unsigned short c=inb_p(WDT_RT);
-
+       unsigned short c;
+       unsigned long flags;
+       spin_lock_irqsave(&wdtpci_lock, flags);
+       c = inb(WDT_RT);
+       udelay(8);
+       spin_unlock_irqrestore(&wdtpci_lock, flags);
        *temperature = (c * 11 / 15) + 7;
        return 0;
 }
@@ -282,17 +318,25 @@ static irqreturn_t wdtpci_interrupt(int irq, void *dev_id)
         *      Read the status register see what is up and
         *      then printk it.
         */
-       unsigned char status=inb_p(WDT_SR);
+       unsigned char status;
+
+       spin_lock(&wdtpci_lock);
+
+       status = inb(WDT_SR);
+       udelay(8);
 
        printk(KERN_CRIT PFX "status %d\n", status);
 
 #ifdef CONFIG_WDT_501_PCI
-       if (!(status & WDC_SR_TGOOD))
-               printk(KERN_CRIT PFX "Overheat alarm.(%d)\n",inb_p(WDT_RT));
+       if (!(status & WDC_SR_TGOOD)) {
+               u8 alarm = inb(WDT_RT);
+               printk(KERN_CRIT PFX "Overheat alarm.(%d)\n", alarm);
+               udelay(8);
+       }
        if (!(status & WDC_SR_PSUOVER))
-               printk(KERN_CRIT PFX "PSU over voltage.\n");
+               printk(KERN_CRIT PFX "PSU over voltage.\n");
        if (!(status & WDC_SR_PSUUNDR))
-               printk(KERN_CRIT PFX "PSU under voltage.\n");
+               printk(KERN_CRIT PFX "PSU under voltage.\n");
        if (tachometer) {
                if (!(status & WDC_SR_FANGOOD))
                        printk(KERN_CRIT PFX "Possible fan fault.\n");
@@ -310,6 +354,7 @@ static irqreturn_t wdtpci_interrupt(int irq, void *dev_id)
                printk(KERN_CRIT PFX "Reset in 5ms.\n");
 #endif
        }
+       spin_unlock(&wdtpci_lock);
        return IRQ_HANDLED;
 }
 
@@ -325,7 +370,8 @@ static irqreturn_t wdtpci_interrupt(int irq, void *dev_id)
  *     write of data will do, as we we don't define content meaning.
  */
 
-static ssize_t wdtpci_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
+static ssize_t wdtpci_write(struct file *file, const char __user *buf,
+                                       size_t count, loff_t *ppos)
 {
        if (count) {
                if (!nowayout) {
@@ -335,7 +381,7 @@ static ssize_t wdtpci_write(struct file *file, const char __user *buf, size_t co
 
                        for (i = 0; i != count; i++) {
                                char c;
-                               if(get_user(c, buf+i))
+                               if (get_user(c, buf+i))
                                        return -EFAULT;
                                if (c == 'V')
                                        expect_close = 42;
@@ -343,13 +389,11 @@ static ssize_t wdtpci_write(struct file *file, const char __user *buf, size_t co
                }
                wdtpci_ping();
        }
-
        return count;
 }
 
 /**
  *     wdtpci_ioctl:
- *     @inode: inode of the device
  *     @file: file handle to the device
  *     @cmd: watchdog command
  *     @arg: argument pointer
@@ -359,8 +403,8 @@ static ssize_t wdtpci_write(struct file *file, const char __user *buf, size_t co
  *     querying capabilities and current status.
  */
 
-static int wdtpci_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-       unsigned long arg)
+static long wdtpci_ioctl(struct file *file, unsigned int cmd,
+                                                       unsigned long arg)
 {
        int new_heartbeat;
        int status;
@@ -383,33 +427,29 @@ static int wdtpci_ioctl(struct inode *inode, struct file *file, unsigned int cmd
                ident.options |= WDIOF_FANFAULT;
 #endif /* CONFIG_WDT_501_PCI */
 
-       switch(cmd)
-       {
-               default:
-                       return -ENOTTY;
-               case WDIOC_GETSUPPORT:
-                       return copy_to_user(argp, &ident, sizeof(ident))?-EFAULT:0;
-
-               case WDIOC_GETSTATUS:
-                       wdtpci_get_status(&status);
-                       return put_user(status, p);
-               case WDIOC_GETBOOTSTATUS:
-                       return put_user(0, p);
-               case WDIOC_KEEPALIVE:
-                       wdtpci_ping();
-                       return 0;
-               case WDIOC_SETTIMEOUT:
-                       if (get_user(new_heartbeat, p))
-                               return -EFAULT;
-
-                       if (wdtpci_set_heartbeat(new_heartbeat))
-                               return -EINVAL;
-
-                       wdtpci_ping();
-                       /* Fall */
-               case WDIOC_GETTIMEOUT:
-                       return put_user(heartbeat, p);
-       }
+       switch (cmd) {
+       default:
+               return -ENOTTY;
+       case WDIOC_GETSUPPORT:
+               return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0;
+       case WDIOC_GETSTATUS:
+               wdtpci_get_status(&status);
+               return put_user(status, p);
+       case WDIOC_GETBOOTSTATUS:
+               return put_user(0, p);
+       case WDIOC_KEEPALIVE:
+               wdtpci_ping();
+               return 0;
+       case WDIOC_SETTIMEOUT:
+               if (get_user(new_heartbeat, p))
+                       return -EFAULT;
+               if (wdtpci_set_heartbeat(new_heartbeat))
+                       return -EINVAL;
+               wdtpci_ping();
+               /* Fall */
+       case WDIOC_GETTIMEOUT:
+               return put_user(heartbeat, p);
+               }
 }
 
 /**
@@ -426,12 +466,11 @@ static int wdtpci_ioctl(struct inode *inode, struct file *file, unsigned int cmd
 
 static int wdtpci_open(struct inode *inode, struct file *file)
 {
-       if (down_trylock(&open_sem))
+       if (test_and_set_bit(0, &open_lock))
                return -EBUSY;
 
-       if (nowayout) {
+       if (nowayout)
                __module_get(THIS_MODULE);
-       }
        /*
         *      Activate
         */
@@ -460,7 +499,7 @@ static int wdtpci_release(struct inode *inode, struct file *file)
                wdtpci_ping();
        }
        expect_close = 0;
-       up(&open_sem);
+       clear_bit(0, &open_lock);
        return 0;
 }
 
@@ -476,14 +515,15 @@ static int wdtpci_release(struct inode *inode, struct file *file)
  *     fahrenheit. It was designed by an imperial measurement luddite.
  */
 
-static ssize_t wdtpci_temp_read(struct file *file, char __user *buf, size_t count, loff_t *ptr)
+static ssize_t wdtpci_temp_read(struct file *file, char __user *buf,
+                                               size_t count, loff_t *ptr)
 {
        int temperature;
 
        if (wdtpci_get_temperature(&temperature))
                return -EFAULT;
 
-       if (copy_to_user (buf, &temperature, 1))
+       if (copy_to_user(buf, &temperature, 1))
                return -EFAULT;
 
        return 1;
@@ -529,12 +569,10 @@ static int wdtpci_temp_release(struct inode *inode, struct file *file)
  */
 
 static int wdtpci_notify_sys(struct notifier_block *this, unsigned long code,
-       void *unused)
+                                                       void *unused)
 {
-       if (code==SYS_DOWN || code==SYS_HALT) {
-               /* Turn the card off */
+       if (code == SYS_DOWN || code == SYS_HALT)
                wdtpci_stop();
-       }
        return NOTIFY_DONE;
 }
 
@@ -547,7 +585,7 @@ static const struct file_operations wdtpci_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .write          = wdtpci_write,
-       .ioctl          = wdtpci_ioctl,
+       .unlocked_ioctl = wdtpci_ioctl,
        .open           = wdtpci_open,
        .release        = wdtpci_release,
 };
@@ -584,80 +622,85 @@ static struct notifier_block wdtpci_notifier = {
 };
 
 
-static int __devinit wdtpci_init_one (struct pci_dev *dev,
-                                  const struct pci_device_id *ent)
+static int __devinit wdtpci_init_one(struct pci_dev *dev,
+                                       const struct pci_device_id *ent)
 {
        int ret = -EIO;
 
        dev_count++;
        if (dev_count > 1) {
-               printk (KERN_ERR PFX "this driver only supports 1 device\n");
+               printk(KERN_ERR PFX "This driver only supports one device\n");
                return -ENODEV;
        }
 
-       if (pci_enable_device (dev)) {
-               printk (KERN_ERR PFX "Not possible to enable PCI Device\n");
+       if (pci_enable_device(dev)) {
+               printk(KERN_ERR PFX "Not possible to enable PCI Device\n");
                return -ENODEV;
        }
 
-       if (pci_resource_start (dev, 2) == 0x0000) {
-               printk (KERN_ERR PFX "No I/O-Address for card detected\n");
+       if (pci_resource_start(dev, 2) == 0x0000) {
+               printk(KERN_ERR PFX "No I/O-Address for card detected\n");
                ret = -ENODEV;
                goto out_pci;
        }
 
-       sema_init(&open_sem, 1);
-
        irq = dev->irq;
-       io = pci_resource_start (dev, 2);
+       io = pci_resource_start(dev, 2);
 
-       if (request_region (io, 16, "wdt_pci") == NULL) {
-               printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", io);
+       if (request_region(io, 16, "wdt_pci") == NULL) {
+               printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", io);
                goto out_pci;
        }
 
-       if (request_irq (irq, wdtpci_interrupt, IRQF_DISABLED | IRQF_SHARED,
+       if (request_irq(irq, wdtpci_interrupt, IRQF_DISABLED | IRQF_SHARED,
                         "wdt_pci", &wdtpci_miscdev)) {
-               printk (KERN_ERR PFX "IRQ %d is not free\n", irq);
+               printk(KERN_ERR PFX "IRQ %d is not free\n", irq);
                goto out_reg;
        }
 
-       printk ("PCI-WDT500/501 (PCI-WDG-CSM) driver 0.10 at 0x%04x (Interrupt %d)\n",
-               io, irq);
+       printk(KERN_INFO
+        "PCI-WDT500/501 (PCI-WDG-CSM) driver 0.10 at 0x%04x (Interrupt %d)\n",
+                                                               io, irq);
 
-       /* Check that the heartbeat value is within it's range ; if not reset to the default */
+       /* Check that the heartbeat value is within its range;
+          if not reset to the default */
        if (wdtpci_set_heartbeat(heartbeat)) {
                wdtpci_set_heartbeat(WD_TIMO);
-               printk(KERN_INFO PFX "heartbeat value must be 0<heartbeat<65536, using %d\n",
-                       WD_TIMO);
+               printk(KERN_INFO PFX
+                 "heartbeat value must be 0 < heartbeat < 65536, using %d\n",
+                                                               WD_TIMO);
        }
 
-       ret = register_reboot_notifier (&wdtpci_notifier);
+       ret = register_reboot_notifier(&wdtpci_notifier);
        if (ret) {
-               printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", ret);
+               printk(KERN_ERR PFX
+                       "cannot register reboot notifier (err=%d)\n", ret);
                goto out_irq;
        }
 
 #ifdef CONFIG_WDT_501_PCI
-       ret = misc_register (&temp_miscdev);
+       ret = misc_register(&temp_miscdev);
        if (ret) {
-               printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
-                       TEMP_MINOR, ret);
+               printk(KERN_ERR PFX
+                       "cannot register miscdev on minor=%d (err=%d)\n",
+                                       TEMP_MINOR, ret);
                goto out_rbt;
        }
 #endif /* CONFIG_WDT_501_PCI */
 
-       ret = misc_register (&wdtpci_miscdev);
+       ret = misc_register(&wdtpci_miscdev);
        if (ret) {
-               printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
-                       WATCHDOG_MINOR, ret);
+               printk(KERN_ERR PFX
+                       "cannot register miscdev on minor=%d (err=%d)\n",
+                                               WATCHDOG_MINOR, ret);
                goto out_misc;
        }
 
        printk(KERN_INFO PFX "initialized. heartbeat=%d sec (nowayout=%d)\n",
                heartbeat, nowayout);
 #ifdef CONFIG_WDT_501_PCI
-       printk(KERN_INFO "wdt: Fan Tachometer is %s\n", (tachometer ? "Enabled" : "Disabled"));
+       printk(KERN_INFO "wdt: Fan Tachometer is %s\n",
+                               (tachometer ? "Enabled" : "Disabled"));
 #endif /* CONFIG_WDT_501_PCI */
 
        ret = 0;
@@ -673,14 +716,14 @@ out_rbt:
 out_irq:
        free_irq(irq, &wdtpci_miscdev);
 out_reg:
-       release_region (io, 16);
+       release_region(io, 16);
 out_pci:
        pci_disable_device(dev);
        goto out;
 }
 
 
-static void __devexit wdtpci_remove_one (struct pci_dev *pdev)
+static void __devexit wdtpci_remove_one(struct pci_dev *pdev)
 {
        /* here we assume only one device will ever have
         * been picked up and registered by probe function */
@@ -728,7 +771,7 @@ static struct pci_driver wdtpci_driver = {
 
 static void __exit wdtpci_cleanup(void)
 {
-       pci_unregister_driver (&wdtpci_driver);
+       pci_unregister_driver(&wdtpci_driver);
 }
 
 
@@ -742,7 +785,7 @@ static void __exit wdtpci_cleanup(void)
 
 static int __init wdtpci_init(void)
 {
-       return pci_register_driver (&wdtpci_driver);
+       return pci_register_driver(&wdtpci_driver);
 }
 
 
index 660b191ed75efe5415007927162224f408c24654..8f7fdaa9e010b39157eee6121b6e1b5e0f265295 100644 (file)
@@ -250,19 +250,19 @@ static void file_record(struct ihex_binrec *record)
 
 static int output_records(int outfd)
 {
-       unsigned char zeroes[5] = {0, 0, 0, 0, 0};
+       unsigned char zeroes[6] = {0, 0, 0, 0, 0, 0};
        struct ihex_binrec *p = records;
 
        while (p) {
                uint16_t writelen = (p->len + 9) & ~3;
 
                p->addr = htonl(p->addr);
-               p->len = htonl(p->len);
+               p->len = htons(p->len);
                write(outfd, &p->addr, writelen);
                p = p->next;
        }
        /* EOF record is zero length, since we don't bother to represent
           the type field in the binary version */
-       write(outfd, zeroes, 5);
+       write(outfd, zeroes, 6);
        return 0;
 }
index 9a849ad3c489411c8043cb66d50f8feceadfe7b8..065b4e10681ae2e449b700ad01c9d3f1c75cd9ab 100644 (file)
@@ -404,7 +404,7 @@ static int afs_write_back_from_locked_page(struct afs_writeback *wb,
                        page = pages[loop];
                        if (page->index > wb->last)
                                break;
-                       if (TestSetPageLocked(page))
+                       if (!trylock_page(page))
                                break;
                        if (!PageDirty(page) ||
                            page_private(page) != (unsigned long) wb) {
index 4dbe52948e8f4cc56d55a7fe5f61485a860520f3..38653e36e2252189dfad1cbf8f31f5473d2ccb00 100644 (file)
@@ -1720,7 +1720,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page,
                 */
                if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) {
                        lock_buffer(bh);
-               } else if (test_set_buffer_locked(bh)) {
+               } else if (!trylock_buffer(bh)) {
                        redirty_page_for_writepage(wbc, page);
                        continue;
                }
@@ -3000,7 +3000,7 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[])
 
                if (rw == SWRITE || rw == SWRITE_SYNC)
                        lock_buffer(bh);
-               else if (test_set_buffer_locked(bh))
+               else if (!trylock_buffer(bh))
                        continue;
 
                if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC) {
index 0aac824371a579bd4f508f7360685b15c4ad74a4..e692c42f24b5ffcbcbe1cf50b31b5f23ca243fa6 100644 (file)
@@ -1280,7 +1280,7 @@ retry:
 
                        if (first < 0)
                                lock_page(page);
-                       else if (TestSetPageLocked(page))
+                       else if (!trylock_page(page))
                                break;
 
                        if (unlikely(page->mapping != mapping)) {
index c7d04e165446dfc5391930b24ce2a1d3280e71d1..694ed6fadcc8c59e1936a49919c67a427ba670e5 100644 (file)
@@ -40,34 +40,35 @@ ext4_acl_from_disk(const void *value, size_t size)
        acl = posix_acl_alloc(count, GFP_NOFS);
        if (!acl)
                return ERR_PTR(-ENOMEM);
-       for (n=0; n < count; n++) {
+       for (n = 0; n < count; n++) {
                ext4_acl_entry *entry =
                        (ext4_acl_entry *)value;
                if ((char *)value + sizeof(ext4_acl_entry_short) > end)
                        goto fail;
                acl->a_entries[n].e_tag  = le16_to_cpu(entry->e_tag);
                acl->a_entries[n].e_perm = le16_to_cpu(entry->e_perm);
-               switch(acl->a_entries[n].e_tag) {
-                       case ACL_USER_OBJ:
-                       case ACL_GROUP_OBJ:
-                       case ACL_MASK:
-                       case ACL_OTHER:
-                               value = (char *)value +
-                                       sizeof(ext4_acl_entry_short);
-                               acl->a_entries[n].e_id = ACL_UNDEFINED_ID;
-                               break;
-
-                       case ACL_USER:
-                       case ACL_GROUP:
-                               value = (char *)value + sizeof(ext4_acl_entry);
-                               if ((char *)value > end)
-                                       goto fail;
-                               acl->a_entries[n].e_id =
-                                       le32_to_cpu(entry->e_id);
-                               break;
-
-                       default:
+
+               switch (acl->a_entries[n].e_tag) {
+               case ACL_USER_OBJ:
+               case ACL_GROUP_OBJ:
+               case ACL_MASK:
+               case ACL_OTHER:
+                       value = (char *)value +
+                               sizeof(ext4_acl_entry_short);
+                       acl->a_entries[n].e_id = ACL_UNDEFINED_ID;
+                       break;
+
+               case ACL_USER:
+               case ACL_GROUP:
+                       value = (char *)value + sizeof(ext4_acl_entry);
+                       if ((char *)value > end)
                                goto fail;
+                       acl->a_entries[n].e_id =
+                               le32_to_cpu(entry->e_id);
+                       break;
+
+               default:
+                       goto fail;
                }
        }
        if (value != end)
@@ -96,27 +97,26 @@ ext4_acl_to_disk(const struct posix_acl *acl, size_t *size)
                return ERR_PTR(-ENOMEM);
        ext_acl->a_version = cpu_to_le32(EXT4_ACL_VERSION);
        e = (char *)ext_acl + sizeof(ext4_acl_header);
-       for (n=0; n < acl->a_count; n++) {
+       for (n = 0; n < acl->a_count; n++) {
                ext4_acl_entry *entry = (ext4_acl_entry *)e;
                entry->e_tag  = cpu_to_le16(acl->a_entries[n].e_tag);
                entry->e_perm = cpu_to_le16(acl->a_entries[n].e_perm);
-               switch(acl->a_entries[n].e_tag) {
-                       case ACL_USER:
-                       case ACL_GROUP:
-                               entry->e_id =
-                                       cpu_to_le32(acl->a_entries[n].e_id);
-                               e += sizeof(ext4_acl_entry);
-                               break;
-
-                       case ACL_USER_OBJ:
-                       case ACL_GROUP_OBJ:
-                       case ACL_MASK:
-                       case ACL_OTHER:
-                               e += sizeof(ext4_acl_entry_short);
-                               break;
-
-                       default:
-                               goto fail;
+               switch (acl->a_entries[n].e_tag) {
+               case ACL_USER:
+               case ACL_GROUP:
+                       entry->e_id = cpu_to_le32(acl->a_entries[n].e_id);
+                       e += sizeof(ext4_acl_entry);
+                       break;
+
+               case ACL_USER_OBJ:
+               case ACL_GROUP_OBJ:
+               case ACL_MASK:
+               case ACL_OTHER:
+                       e += sizeof(ext4_acl_entry_short);
+                       break;
+
+               default:
+                       goto fail;
                }
        }
        return (char *)ext_acl;
@@ -167,23 +167,23 @@ ext4_get_acl(struct inode *inode, int type)
        if (!test_opt(inode->i_sb, POSIX_ACL))
                return NULL;
 
-       switch(type) {
-               case ACL_TYPE_ACCESS:
-                       acl = ext4_iget_acl(inode, &ei->i_acl);
-                       if (acl != EXT4_ACL_NOT_CACHED)
-                               return acl;
-                       name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS;
-                       break;
-
-               case ACL_TYPE_DEFAULT:
-                       acl = ext4_iget_acl(inode, &ei->i_default_acl);
-                       if (acl != EXT4_ACL_NOT_CACHED)
-                               return acl;
-                       name_index = EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT;
-                       break;
-
-               default:
-                       return ERR_PTR(-EINVAL);
+       switch (type) {
+       case ACL_TYPE_ACCESS:
+               acl = ext4_iget_acl(inode, &ei->i_acl);
+               if (acl != EXT4_ACL_NOT_CACHED)
+                       return acl;
+               name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS;
+               break;
+
+       case ACL_TYPE_DEFAULT:
+               acl = ext4_iget_acl(inode, &ei->i_default_acl);
+               if (acl != EXT4_ACL_NOT_CACHED)
+                       return acl;
+               name_index = EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT;
+               break;
+
+       default:
+               return ERR_PTR(-EINVAL);
        }
        retval = ext4_xattr_get(inode, name_index, "", NULL, 0);
        if (retval > 0) {
@@ -201,14 +201,14 @@ ext4_get_acl(struct inode *inode, int type)
        kfree(value);
 
        if (!IS_ERR(acl)) {
-               switch(type) {
-                       case ACL_TYPE_ACCESS:
-                               ext4_iset_acl(inode, &ei->i_acl, acl);
-                               break;
-
-                       case ACL_TYPE_DEFAULT:
-                               ext4_iset_acl(inode, &ei->i_default_acl, acl);
-                               break;
+               switch (type) {
+               case ACL_TYPE_ACCESS:
+                       ext4_iset_acl(inode, &ei->i_acl, acl);
+                       break;
+
+               case ACL_TYPE_DEFAULT:
+                       ext4_iset_acl(inode, &ei->i_default_acl, acl);
+                       break;
                }
        }
        return acl;
@@ -232,31 +232,31 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type,
        if (S_ISLNK(inode->i_mode))
                return -EOPNOTSUPP;
 
-       switch(type) {
-               case ACL_TYPE_ACCESS:
-                       name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS;
-                       if (acl) {
-                               mode_t mode = inode->i_mode;
-                               error = posix_acl_equiv_mode(acl, &mode);
-                               if (error < 0)
-                                       return error;
-                               else {
-                                       inode->i_mode = mode;
-                                       ext4_mark_inode_dirty(handle, inode);
-                                       if (error == 0)
-                                               acl = NULL;
-                               }
+       switch (type) {
+       case ACL_TYPE_ACCESS:
+               name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS;
+               if (acl) {
+                       mode_t mode = inode->i_mode;
+                       error = posix_acl_equiv_mode(acl, &mode);
+                       if (error < 0)
+                               return error;
+                       else {
+                               inode->i_mode = mode;
+                               ext4_mark_inode_dirty(handle, inode);
+                               if (error == 0)
+                                       acl = NULL;
                        }
-                       break;
+               }
+               break;
 
-               case ACL_TYPE_DEFAULT:
-                       name_index = EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT;
-                       if (!S_ISDIR(inode->i_mode))
-                               return acl ? -EACCES : 0;
-                       break;
+       case ACL_TYPE_DEFAULT:
+               name_index = EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT;
+               if (!S_ISDIR(inode->i_mode))
+                       return acl ? -EACCES : 0;
+               break;
 
-               default:
-                       return -EINVAL;
+       default:
+               return -EINVAL;
        }
        if (acl) {
                value = ext4_acl_to_disk(acl, &size);
@@ -269,14 +269,14 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type,
 
        kfree(value);
        if (!error) {
-               switch(type) {
-                       case ACL_TYPE_ACCESS:
-                               ext4_iset_acl(inode, &ei->i_acl, acl);
-                               break;
-
-                       case ACL_TYPE_DEFAULT:
-                               ext4_iset_acl(inode, &ei->i_default_acl, acl);
-                               break;
+               switch (type) {
+               case ACL_TYPE_ACCESS:
+                       ext4_iset_acl(inode, &ei->i_acl, acl);
+                       break;
+
+               case ACL_TYPE_DEFAULT:
+                       ext4_iset_acl(inode, &ei->i_default_acl, acl);
+                       break;
                }
        }
        return error;
index 495ab21b9832a7c5e48116b1dbe2f123af27ec25..1ae5004e93fc20ffd99a652efa6be9897a0518c1 100644 (file)
@@ -314,25 +314,28 @@ ext4_read_block_bitmap(struct super_block *sb, ext4_group_t block_group)
        if (unlikely(!bh)) {
                ext4_error(sb, __func__,
                            "Cannot read block bitmap - "
-                           "block_group = %d, block_bitmap = %llu",
-                           (int)block_group, (unsigned long long)bitmap_blk);
+                           "block_group = %lu, block_bitmap = %llu",
+                           block_group, bitmap_blk);
                return NULL;
        }
        if (bh_uptodate_or_lock(bh))
                return bh;
 
+       spin_lock(sb_bgl_lock(EXT4_SB(sb), block_group));
        if (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
                ext4_init_block_bitmap(sb, bh, block_group, desc);
                set_buffer_uptodate(bh);
                unlock_buffer(bh);
+               spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
                return bh;
        }
+       spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
        if (bh_submit_read(bh) < 0) {
                put_bh(bh);
                ext4_error(sb, __func__,
                            "Cannot read block bitmap - "
-                           "block_group = %d, block_bitmap = %llu",
-                           (int)block_group, (unsigned long long)bitmap_blk);
+                           "block_group = %lu, block_bitmap = %llu",
+                           block_group, bitmap_blk);
                return NULL;
        }
        ext4_valid_block_bitmap(sb, desc, block_group, bh);
index 303e41cf7b142344d7ee202293e15a6647d6b1ce..6c7924d9e358caf3c0803dc43d0d26b76dd9b620 100644 (file)
@@ -1044,7 +1044,6 @@ extern void ext4_mb_update_group_info(struct ext4_group_info *grp,
 
 
 /* inode.c */
-void ext4_da_release_space(struct inode *inode, int used, int to_free);
 int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode,
                struct buffer_head *bh, ext4_fsblk_t blocknr);
 struct buffer_head *ext4_getblk(handle_t *, struct inode *,
index 42c4c0c892ed9b442617207b00acbdc7be99249f..612c3d2c38240ff59a643bcbf405c2229443a848 100644 (file)
@@ -99,7 +99,7 @@ static int ext4_ext_journal_restart(handle_t *handle, int needed)
        if (handle->h_buffer_credits > needed)
                return 0;
        err = ext4_journal_extend(handle, needed);
-       if (err)
+       if (err <= 0)
                return err;
        return ext4_journal_restart(handle, needed);
 }
@@ -1441,7 +1441,7 @@ unsigned int ext4_ext_check_overlap(struct inode *inode,
 
        /*
         * get the next allocated block if the extent in the path
-        * is before the requested block(s) 
+        * is before the requested block(s)
         */
        if (b2 < b1) {
                b2 = ext4_ext_next_allocated_block(path);
@@ -1910,9 +1910,13 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode,
                        BUG_ON(b != ex_ee_block + ex_ee_len - 1);
                }
 
-               /* at present, extent can't cross block group: */
-               /* leaf + bitmap + group desc + sb + inode */
-               credits = 5;
+               /*
+                * 3 for leaf, sb, and inode plus 2 (bmap and group
+                * descriptor) for each block group; assume two block
+                * groups plus ex_ee_len/blocks_per_block_group for
+                * the worst case
+                */
+               credits = 7 + 2*(ex_ee_len/EXT4_BLOCKS_PER_GROUP(inode->i_sb));
                if (ex == EXT_FIRST_EXTENT(eh)) {
                        correct_index = 1;
                        credits += (ext_depth(inode)) + 1;
@@ -2323,7 +2327,10 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
                unsigned int newdepth;
                /* If extent has less than EXT4_EXT_ZERO_LEN zerout directly */
                if (allocated <= EXT4_EXT_ZERO_LEN) {
-                       /* Mark first half uninitialized.
+                       /*
+                        * iblock == ee_block is handled by the zerouout
+                        * at the beginning.
+                        * Mark first half uninitialized.
                         * Mark second half initialized and zero out the
                         * initialized extent
                         */
@@ -2346,7 +2353,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
                                ex->ee_len   = orig_ex.ee_len;
                                ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
                                ext4_ext_dirty(handle, inode, path + depth);
-                               /* zeroed the full extent */
+                               /* blocks available from iblock */
                                return allocated;
 
                        } else if (err)
@@ -2374,6 +2381,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
                                        err = PTR_ERR(path);
                                        return err;
                                }
+                               /* get the second half extent details */
                                ex = path[depth].p_ext;
                                err = ext4_ext_get_access(handle, inode,
                                                                path + depth);
@@ -2403,6 +2411,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
                        ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
                        ext4_ext_dirty(handle, inode, path + depth);
                        /* zeroed the full extent */
+                       /* blocks available from iblock */
                        return allocated;
 
                } else if (err)
@@ -2418,23 +2427,22 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
                 */
                orig_ex.ee_len = cpu_to_le16(ee_len -
                                                ext4_ext_get_actual_len(ex3));
-               if (newdepth != depth) {
-                       depth = newdepth;
-                       ext4_ext_drop_refs(path);
-                       path = ext4_ext_find_extent(inode, iblock, path);
-                       if (IS_ERR(path)) {
-                               err = PTR_ERR(path);
-                               goto out;
-                       }
-                       eh = path[depth].p_hdr;
-                       ex = path[depth].p_ext;
-                       if (ex2 != &newex)
-                               ex2 = ex;
-
-                       err = ext4_ext_get_access(handle, inode, path + depth);
-                       if (err)
-                               goto out;
+               depth = newdepth;
+               ext4_ext_drop_refs(path);
+               path = ext4_ext_find_extent(inode, iblock, path);
+               if (IS_ERR(path)) {
+                       err = PTR_ERR(path);
+                       goto out;
                }
+               eh = path[depth].p_hdr;
+               ex = path[depth].p_ext;
+               if (ex2 != &newex)
+                       ex2 = ex;
+
+               err = ext4_ext_get_access(handle, inode, path + depth);
+               if (err)
+                       goto out;
+
                allocated = max_blocks;
 
                /* If extent has less than EXT4_EXT_ZERO_LEN and we are trying
@@ -2452,6 +2460,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
                        ext4_ext_store_pblock(ex, ext_pblock(&orig_ex));
                        ext4_ext_dirty(handle, inode, path + depth);
                        /* zero out the first half */
+                       /* blocks available from iblock */
                        return allocated;
                }
        }
index a92eb305344fe2fd299cd3c15928a033a1374d10..655e760212b871655c2fa55a0e0f1b889476ae77 100644 (file)
@@ -97,34 +97,44 @@ unsigned ext4_init_inode_bitmap(struct super_block *sb, struct buffer_head *bh,
  * Return buffer_head of bitmap on success or NULL.
  */
 static struct buffer_head *
-read_inode_bitmap(struct super_block *sb, ext4_group_t block_group)
+ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group)
 {
        struct ext4_group_desc *desc;
        struct buffer_head *bh = NULL;
+       ext4_fsblk_t bitmap_blk;
 
        desc = ext4_get_group_desc(sb, block_group, NULL);
        if (!desc)
-               goto error_out;
-       if (desc->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) {
-               bh = sb_getblk(sb, ext4_inode_bitmap(sb, desc));
-               if (!buffer_uptodate(bh)) {
-                       lock_buffer(bh);
-                       if (!buffer_uptodate(bh)) {
-                               ext4_init_inode_bitmap(sb, bh, block_group,
-                                                      desc);
-                               set_buffer_uptodate(bh);
-                       }
-                       unlock_buffer(bh);
-               }
-       } else {
-               bh = sb_bread(sb, ext4_inode_bitmap(sb, desc));
+               return NULL;
+       bitmap_blk = ext4_inode_bitmap(sb, desc);
+       bh = sb_getblk(sb, bitmap_blk);
+       if (unlikely(!bh)) {
+               ext4_error(sb, __func__,
+                           "Cannot read inode bitmap - "
+                           "block_group = %lu, inode_bitmap = %llu",
+                           block_group, bitmap_blk);
+               return NULL;
        }
-       if (!bh)
-               ext4_error(sb, "read_inode_bitmap",
+       if (bh_uptodate_or_lock(bh))
+               return bh;
+
+       spin_lock(sb_bgl_lock(EXT4_SB(sb), block_group));
+       if (desc->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) {
+               ext4_init_inode_bitmap(sb, bh, block_group, desc);
+               set_buffer_uptodate(bh);
+               unlock_buffer(bh);
+               spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
+               return bh;
+       }
+       spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
+       if (bh_submit_read(bh) < 0) {
+               put_bh(bh);
+               ext4_error(sb, __func__,
                            "Cannot read inode bitmap - "
                            "block_group = %lu, inode_bitmap = %llu",
-                           block_group, ext4_inode_bitmap(sb, desc));
-error_out:
+                           block_group, bitmap_blk);
+               return NULL;
+       }
        return bh;
 }
 
@@ -200,7 +210,7 @@ void ext4_free_inode (handle_t *handle, struct inode * inode)
        }
        block_group = (ino - 1) / EXT4_INODES_PER_GROUP(sb);
        bit = (ino - 1) % EXT4_INODES_PER_GROUP(sb);
-       bitmap_bh = read_inode_bitmap(sb, block_group);
+       bitmap_bh = ext4_read_inode_bitmap(sb, block_group);
        if (!bitmap_bh)
                goto error_return;
 
@@ -623,7 +633,7 @@ got_group:
                        goto fail;
 
                brelse(bitmap_bh);
-               bitmap_bh = read_inode_bitmap(sb, group);
+               bitmap_bh = ext4_read_inode_bitmap(sb, group);
                if (!bitmap_bh)
                        goto fail;
 
@@ -728,7 +738,7 @@ got:
 
                        /* When marking the block group with
                         * ~EXT4_BG_INODE_UNINIT we don't want to depend
-                        * on the value of bg_itable_unsed even though
+                        * on the value of bg_itable_unused even though
                         * mke2fs could have initialized the same for us.
                         * Instead we calculated the value below
                         */
@@ -891,7 +901,7 @@ struct inode *ext4_orphan_get(struct super_block *sb, unsigned long ino)
 
        block_group = (ino - 1) / EXT4_INODES_PER_GROUP(sb);
        bit = (ino - 1) % EXT4_INODES_PER_GROUP(sb);
-       bitmap_bh = read_inode_bitmap(sb, block_group);
+       bitmap_bh = ext4_read_inode_bitmap(sb, block_group);
        if (!bitmap_bh) {
                ext4_warning(sb, __func__,
                             "inode bitmap error for orphan %lu", ino);
@@ -969,7 +979,7 @@ unsigned long ext4_count_free_inodes (struct super_block * sb)
                        continue;
                desc_count += le16_to_cpu(gdp->bg_free_inodes_count);
                brelse(bitmap_bh);
-               bitmap_bh = read_inode_bitmap(sb, i);
+               bitmap_bh = ext4_read_inode_bitmap(sb, i);
                if (!bitmap_bh)
                        continue;
 
index 9843b046c2358974bff4bea0449583c688c27358..59fbbe899acc24a5817befbc67fda67ba427b3d1 100644 (file)
@@ -191,6 +191,7 @@ static int ext4_journal_test_restart(handle_t *handle, struct inode *inode)
 void ext4_delete_inode (struct inode * inode)
 {
        handle_t *handle;
+       int err;
 
        if (ext4_should_order_data(inode))
                ext4_begin_ordered_truncate(inode, 0);
@@ -199,8 +200,9 @@ void ext4_delete_inode (struct inode * inode)
        if (is_bad_inode(inode))
                goto no_delete;
 
-       handle = start_transaction(inode);
+       handle = ext4_journal_start(inode, blocks_for_truncate(inode)+3);
        if (IS_ERR(handle)) {
+               ext4_std_error(inode->i_sb, PTR_ERR(handle));
                /*
                 * If we're going to skip the normal cleanup, we still need to
                 * make sure that the in-core orphan linked list is properly
@@ -213,8 +215,34 @@ void ext4_delete_inode (struct inode * inode)
        if (IS_SYNC(inode))
                handle->h_sync = 1;
        inode->i_size = 0;
+       err = ext4_mark_inode_dirty(handle, inode);
+       if (err) {
+               ext4_warning(inode->i_sb, __func__,
+                            "couldn't mark inode dirty (err %d)", err);
+               goto stop_handle;
+       }
        if (inode->i_blocks)
                ext4_truncate(inode);
+
+       /*
+        * ext4_ext_truncate() doesn't reserve any slop when it
+        * restarts journal transactions; therefore there may not be
+        * enough credits left in the handle to remove the inode from
+        * the orphan list and set the dtime field.
+        */
+       if (handle->h_buffer_credits < 3) {
+               err = ext4_journal_extend(handle, 3);
+               if (err > 0)
+                       err = ext4_journal_restart(handle, 3);
+               if (err != 0) {
+                       ext4_warning(inode->i_sb, __func__,
+                                    "couldn't extend journal (err %d)", err);
+               stop_handle:
+                       ext4_journal_stop(handle);
+                       goto no_delete;
+               }
+       }
+
        /*
         * Kill off the orphan record which ext4_truncate created.
         * AKPM: I think this can be inside the above `if'.
@@ -952,6 +980,67 @@ out:
        return err;
 }
 
+/*
+ * Calculate the number of metadata blocks need to reserve
+ * to allocate @blocks for non extent file based file
+ */
+static int ext4_indirect_calc_metadata_amount(struct inode *inode, int blocks)
+{
+       int icap = EXT4_ADDR_PER_BLOCK(inode->i_sb);
+       int ind_blks, dind_blks, tind_blks;
+
+       /* number of new indirect blocks needed */
+       ind_blks = (blocks + icap - 1) / icap;
+
+       dind_blks = (ind_blks + icap - 1) / icap;
+
+       tind_blks = 1;
+
+       return ind_blks + dind_blks + tind_blks;
+}
+
+/*
+ * Calculate the number of metadata blocks need to reserve
+ * to allocate given number of blocks
+ */
+static int ext4_calc_metadata_amount(struct inode *inode, int blocks)
+{
+       if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)
+               return ext4_ext_calc_metadata_amount(inode, blocks);
+
+       return ext4_indirect_calc_metadata_amount(inode, blocks);
+}
+
+static void ext4_da_update_reserve_space(struct inode *inode, int used)
+{
+       struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
+       int total, mdb, mdb_free;
+
+       spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
+       /* recalculate the number of metablocks still need to be reserved */
+       total = EXT4_I(inode)->i_reserved_data_blocks - used;
+       mdb = ext4_calc_metadata_amount(inode, total);
+
+       /* figure out how many metablocks to release */
+       BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
+       mdb_free = EXT4_I(inode)->i_reserved_meta_blocks - mdb;
+
+       /* Account for allocated meta_blocks */
+       mdb_free -= EXT4_I(inode)->i_allocated_meta_blocks;
+
+       /* update fs free blocks counter for truncate case */
+       percpu_counter_add(&sbi->s_freeblocks_counter, mdb_free);
+
+       /* update per-inode reservations */
+       BUG_ON(used  > EXT4_I(inode)->i_reserved_data_blocks);
+       EXT4_I(inode)->i_reserved_data_blocks -= used;
+
+       BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
+       EXT4_I(inode)->i_reserved_meta_blocks = mdb;
+       EXT4_I(inode)->i_allocated_meta_blocks = 0;
+       spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
+}
+
 /* Maximum number of blocks we map for direct IO at once. */
 #define DIO_MAX_BLOCKS 4096
 /*
@@ -965,10 +1054,9 @@ out:
 
 
 /*
+ * The ext4_get_blocks_wrap() function try to look up the requested blocks,
+ * and returns if the blocks are already mapped.
  *
- *
- * ext4_ext4 get_block() wrapper function
- * It will do a look up first, and returns if the blocks already mapped.
  * Otherwise it takes the write lock of the i_data_sem and allocate blocks
  * and store the allocated blocks in the result buffer head and mark it
  * mapped.
@@ -1069,7 +1157,7 @@ int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block,
                 * which were deferred till now
                 */
                if ((retval > 0) && buffer_delay(bh))
-                       ext4_da_release_space(inode, retval, 0);
+                       ext4_da_update_reserve_space(inode, retval);
        }
 
        up_write((&EXT4_I(inode)->i_data_sem));
@@ -1336,12 +1424,8 @@ static int ext4_ordered_write_end(struct file *file,
 {
        handle_t *handle = ext4_journal_current_handle();
        struct inode *inode = mapping->host;
-       unsigned from, to;
        int ret = 0, ret2;
 
-       from = pos & (PAGE_CACHE_SIZE - 1);
-       to = from + len;
-
        ret = ext4_jbd2_file_inode(handle, inode);
 
        if (ret == 0) {
@@ -1437,36 +1521,6 @@ static int ext4_journalled_write_end(struct file *file,
 
        return ret ? ret : copied;
 }
-/*
- * Calculate the number of metadata blocks need to reserve
- * to allocate @blocks for non extent file based file
- */
-static int ext4_indirect_calc_metadata_amount(struct inode *inode, int blocks)
-{
-       int icap = EXT4_ADDR_PER_BLOCK(inode->i_sb);
-       int ind_blks, dind_blks, tind_blks;
-
-       /* number of new indirect blocks needed */
-       ind_blks = (blocks + icap - 1) / icap;
-
-       dind_blks = (ind_blks + icap - 1) / icap;
-
-       tind_blks = 1;
-
-       return ind_blks + dind_blks + tind_blks;
-}
-
-/*
- * Calculate the number of metadata blocks need to reserve
- * to allocate given number of blocks
- */
-static int ext4_calc_metadata_amount(struct inode *inode, int blocks)
-{
-       if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)
-               return ext4_ext_calc_metadata_amount(inode, blocks);
-
-       return ext4_indirect_calc_metadata_amount(inode, blocks);
-}
 
 static int ext4_da_reserve_space(struct inode *inode, int nrblocks)
 {
@@ -1490,7 +1544,6 @@ static int ext4_da_reserve_space(struct inode *inode, int nrblocks)
                spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
                return -ENOSPC;
        }
-
        /* reduce fs free blocks counter */
        percpu_counter_sub(&sbi->s_freeblocks_counter, total);
 
@@ -1501,35 +1554,31 @@ static int ext4_da_reserve_space(struct inode *inode, int nrblocks)
        return 0;       /* success */
 }
 
-void ext4_da_release_space(struct inode *inode, int used, int to_free)
+static void ext4_da_release_space(struct inode *inode, int to_free)
 {
        struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
        int total, mdb, mdb_free, release;
 
        spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
        /* recalculate the number of metablocks still need to be reserved */
-       total = EXT4_I(inode)->i_reserved_data_blocks - used - to_free;
+       total = EXT4_I(inode)->i_reserved_data_blocks - to_free;
        mdb = ext4_calc_metadata_amount(inode, total);
 
        /* figure out how many metablocks to release */
        BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
        mdb_free = EXT4_I(inode)->i_reserved_meta_blocks - mdb;
 
-       /* Account for allocated meta_blocks */
-       mdb_free -= EXT4_I(inode)->i_allocated_meta_blocks;
-
        release = to_free + mdb_free;
 
        /* update fs free blocks counter for truncate case */
        percpu_counter_add(&sbi->s_freeblocks_counter, release);
 
        /* update per-inode reservations */
-       BUG_ON(used + to_free > EXT4_I(inode)->i_reserved_data_blocks);
-       EXT4_I(inode)->i_reserved_data_blocks -= (used + to_free);
+       BUG_ON(to_free > EXT4_I(inode)->i_reserved_data_blocks);
+       EXT4_I(inode)->i_reserved_data_blocks -= to_free;
 
        BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
        EXT4_I(inode)->i_reserved_meta_blocks = mdb;
-       EXT4_I(inode)->i_allocated_meta_blocks = 0;
        spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
 }
 
@@ -1551,7 +1600,7 @@ static void ext4_da_page_release_reservation(struct page *page,
                }
                curr_off = next_off;
        } while ((bh = bh->b_this_page) != head);
-       ext4_da_release_space(page->mapping->host, 0, to_release);
+       ext4_da_release_space(page->mapping->host, to_release);
 }
 
 /*
@@ -2280,8 +2329,11 @@ retry:
        }
 
        page = __grab_cache_page(mapping, index);
-       if (!page)
-               return -ENOMEM;
+       if (!page) {
+               ext4_journal_stop(handle);
+               ret = -ENOMEM;
+               goto out;
+       }
        *pagep = page;
 
        ret = block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
@@ -3590,6 +3642,16 @@ static int __ext4_get_inode_loc(struct inode *inode,
        }
        if (!buffer_uptodate(bh)) {
                lock_buffer(bh);
+
+               /*
+                * If the buffer has the write error flag, we have failed
+                * to write out another inode in the same block.  In this
+                * case, we don't have to read the block because we may
+                * read the old inode data successfully.
+                */
+               if (buffer_write_io_error(bh) && !buffer_uptodate(bh))
+                       set_buffer_uptodate(bh);
+
                if (buffer_uptodate(bh)) {
                        /* someone brought it uptodate while we waited */
                        unlock_buffer(bh);
index 8d141a25bbeece7ce4a3894374810daaa52cd4aa..865e9ddb44d406d298da48b0137a4f426f8d45dd 100644 (file)
@@ -787,13 +787,16 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
                if (bh_uptodate_or_lock(bh[i]))
                        continue;
 
+               spin_lock(sb_bgl_lock(EXT4_SB(sb), first_group + i));
                if (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
                        ext4_init_block_bitmap(sb, bh[i],
                                                first_group + i, desc);
                        set_buffer_uptodate(bh[i]);
                        unlock_buffer(bh[i]);
+                       spin_unlock(sb_bgl_lock(EXT4_SB(sb), first_group + i));
                        continue;
                }
+               spin_unlock(sb_bgl_lock(EXT4_SB(sb), first_group + i));
                get_bh(bh[i]);
                bh[i]->b_end_io = end_buffer_read_sync;
                submit_bh(READ, bh[i]);
@@ -2477,7 +2480,7 @@ err_freesgi:
 int ext4_mb_init(struct super_block *sb, int needs_recovery)
 {
        struct ext4_sb_info *sbi = EXT4_SB(sb);
-       unsigned i;
+       unsigned i, j;
        unsigned offset;
        unsigned max;
        int ret;
@@ -2537,7 +2540,7 @@ int ext4_mb_init(struct super_block *sb, int needs_recovery)
        sbi->s_mb_history_filter = EXT4_MB_HISTORY_DEFAULT;
        sbi->s_mb_group_prealloc = MB_DEFAULT_GROUP_PREALLOC;
 
-       i = sizeof(struct ext4_locality_group) * NR_CPUS;
+       i = sizeof(struct ext4_locality_group) * nr_cpu_ids;
        sbi->s_locality_groups = kmalloc(i, GFP_KERNEL);
        if (sbi->s_locality_groups == NULL) {
                clear_opt(sbi->s_mount_opt, MBALLOC);
@@ -2545,11 +2548,12 @@ int ext4_mb_init(struct super_block *sb, int needs_recovery)
                kfree(sbi->s_mb_maxs);
                return -ENOMEM;
        }
-       for (i = 0; i < NR_CPUS; i++) {
+       for (i = 0; i < nr_cpu_ids; i++) {
                struct ext4_locality_group *lg;
                lg = &sbi->s_locality_groups[i];
                mutex_init(&lg->lg_mutex);
-               INIT_LIST_HEAD(&lg->lg_prealloc_list);
+               for (j = 0; j < PREALLOC_TB_SIZE; j++)
+                       INIT_LIST_HEAD(&lg->lg_prealloc_list[j]);
                spin_lock_init(&lg->lg_prealloc_lock);
        }
 
@@ -3260,6 +3264,7 @@ static void ext4_mb_use_group_pa(struct ext4_allocation_context *ac,
                                struct ext4_prealloc_space *pa)
 {
        unsigned int len = ac->ac_o_ex.fe_len;
+
        ext4_get_group_no_and_offset(ac->ac_sb, pa->pa_pstart,
                                        &ac->ac_b_ex.fe_group,
                                        &ac->ac_b_ex.fe_start);
@@ -3282,6 +3287,7 @@ static void ext4_mb_use_group_pa(struct ext4_allocation_context *ac,
 static noinline_for_stack int
 ext4_mb_use_preallocated(struct ext4_allocation_context *ac)
 {
+       int order, i;
        struct ext4_inode_info *ei = EXT4_I(ac->ac_inode);
        struct ext4_locality_group *lg;
        struct ext4_prealloc_space *pa;
@@ -3322,22 +3328,29 @@ ext4_mb_use_preallocated(struct ext4_allocation_context *ac)
        lg = ac->ac_lg;
        if (lg == NULL)
                return 0;
-
-       rcu_read_lock();
-       list_for_each_entry_rcu(pa, &lg->lg_prealloc_list, pa_inode_list) {
-               spin_lock(&pa->pa_lock);
-               if (pa->pa_deleted == 0 && pa->pa_free >= ac->ac_o_ex.fe_len) {
-                       atomic_inc(&pa->pa_count);
-                       ext4_mb_use_group_pa(ac, pa);
+       order  = fls(ac->ac_o_ex.fe_len) - 1;
+       if (order > PREALLOC_TB_SIZE - 1)
+               /* The max size of hash table is PREALLOC_TB_SIZE */
+               order = PREALLOC_TB_SIZE - 1;
+
+       for (i = order; i < PREALLOC_TB_SIZE; i++) {
+               rcu_read_lock();
+               list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[i],
+                                       pa_inode_list) {
+                       spin_lock(&pa->pa_lock);
+                       if (pa->pa_deleted == 0 &&
+                                       pa->pa_free >= ac->ac_o_ex.fe_len) {
+                               atomic_inc(&pa->pa_count);
+                               ext4_mb_use_group_pa(ac, pa);
+                               spin_unlock(&pa->pa_lock);
+                               ac->ac_criteria = 20;
+                               rcu_read_unlock();
+                               return 1;
+                       }
                        spin_unlock(&pa->pa_lock);
-                       ac->ac_criteria = 20;
-                       rcu_read_unlock();
-                       return 1;
                }
-               spin_unlock(&pa->pa_lock);
+               rcu_read_unlock();
        }
-       rcu_read_unlock();
-
        return 0;
 }
 
@@ -3560,6 +3573,7 @@ ext4_mb_new_group_pa(struct ext4_allocation_context *ac)
        pa->pa_free = pa->pa_len;
        atomic_set(&pa->pa_count, 1);
        spin_lock_init(&pa->pa_lock);
+       INIT_LIST_HEAD(&pa->pa_inode_list);
        pa->pa_deleted = 0;
        pa->pa_linear = 1;
 
@@ -3580,10 +3594,10 @@ ext4_mb_new_group_pa(struct ext4_allocation_context *ac)
        list_add(&pa->pa_group_list, &grp->bb_prealloc_list);
        ext4_unlock_group(sb, ac->ac_b_ex.fe_group);
 
-       spin_lock(pa->pa_obj_lock);
-       list_add_tail_rcu(&pa->pa_inode_list, &lg->lg_prealloc_list);
-       spin_unlock(pa->pa_obj_lock);
-
+       /*
+        * We will later add the new pa to the right bucket
+        * after updating the pa_free in ext4_mb_release_context
+        */
        return 0;
 }
 
@@ -3733,20 +3747,23 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,
 
        bitmap_bh = ext4_read_block_bitmap(sb, group);
        if (bitmap_bh == NULL) {
-               /* error handling here */
-               ext4_mb_release_desc(&e4b);
-               BUG_ON(bitmap_bh == NULL);
+               ext4_error(sb, __func__, "Error in reading block "
+                               "bitmap for %lu\n", group);
+               return 0;
        }
 
        err = ext4_mb_load_buddy(sb, group, &e4b);
-       BUG_ON(err != 0); /* error handling here */
+       if (err) {
+               ext4_error(sb, __func__, "Error in loading buddy "
+                               "information for %lu\n", group);
+               put_bh(bitmap_bh);
+               return 0;
+       }
 
        if (needed == 0)
                needed = EXT4_BLOCKS_PER_GROUP(sb) + 1;
 
-       grp = ext4_get_group_info(sb, group);
        INIT_LIST_HEAD(&list);
-
        ac = kmem_cache_alloc(ext4_ac_cachep, GFP_NOFS);
 repeat:
        ext4_lock_group(sb, group);
@@ -3903,13 +3920,18 @@ repeat:
                ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, NULL);
 
                err = ext4_mb_load_buddy(sb, group, &e4b);
-               BUG_ON(err != 0); /* error handling here */
+               if (err) {
+                       ext4_error(sb, __func__, "Error in loading buddy "
+                                       "information for %lu\n", group);
+                       continue;
+               }
 
                bitmap_bh = ext4_read_block_bitmap(sb, group);
                if (bitmap_bh == NULL) {
-                       /* error handling here */
+                       ext4_error(sb, __func__, "Error in reading block "
+                                       "bitmap for %lu\n", group);
                        ext4_mb_release_desc(&e4b);
-                       BUG_ON(bitmap_bh == NULL);
+                       continue;
                }
 
                ext4_lock_group(sb, group);
@@ -4112,22 +4134,168 @@ ext4_mb_initialize_context(struct ext4_allocation_context *ac,
 
 }
 
+static noinline_for_stack void
+ext4_mb_discard_lg_preallocations(struct super_block *sb,
+                                       struct ext4_locality_group *lg,
+                                       int order, int total_entries)
+{
+       ext4_group_t group = 0;
+       struct ext4_buddy e4b;
+       struct list_head discard_list;
+       struct ext4_prealloc_space *pa, *tmp;
+       struct ext4_allocation_context *ac;
+
+       mb_debug("discard locality group preallocation\n");
+
+       INIT_LIST_HEAD(&discard_list);
+       ac = kmem_cache_alloc(ext4_ac_cachep, GFP_NOFS);
+
+       spin_lock(&lg->lg_prealloc_lock);
+       list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[order],
+                                               pa_inode_list) {
+               spin_lock(&pa->pa_lock);
+               if (atomic_read(&pa->pa_count)) {
+                       /*
+                        * This is the pa that we just used
+                        * for block allocation. So don't
+                        * free that
+                        */
+                       spin_unlock(&pa->pa_lock);
+                       continue;
+               }
+               if (pa->pa_deleted) {
+                       spin_unlock(&pa->pa_lock);
+                       continue;
+               }
+               /* only lg prealloc space */
+               BUG_ON(!pa->pa_linear);
+
+               /* seems this one can be freed ... */
+               pa->pa_deleted = 1;
+               spin_unlock(&pa->pa_lock);
+
+               list_del_rcu(&pa->pa_inode_list);
+               list_add(&pa->u.pa_tmp_list, &discard_list);
+
+               total_entries--;
+               if (total_entries <= 5) {
+                       /*
+                        * we want to keep only 5 entries
+                        * allowing it to grow to 8. This
+                        * mak sure we don't call discard
+                        * soon for this list.
+                        */
+                       break;
+               }
+       }
+       spin_unlock(&lg->lg_prealloc_lock);
+
+       list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) {
+
+               ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, NULL);
+               if (ext4_mb_load_buddy(sb, group, &e4b)) {
+                       ext4_error(sb, __func__, "Error in loading buddy "
+                                       "information for %lu\n", group);
+                       continue;
+               }
+               ext4_lock_group(sb, group);
+               list_del(&pa->pa_group_list);
+               ext4_mb_release_group_pa(&e4b, pa, ac);
+               ext4_unlock_group(sb, group);
+
+               ext4_mb_release_desc(&e4b);
+               list_del(&pa->u.pa_tmp_list);
+               call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback);
+       }
+       if (ac)
+               kmem_cache_free(ext4_ac_cachep, ac);
+}
+
+/*
+ * We have incremented pa_count. So it cannot be freed at this
+ * point. Also we hold lg_mutex. So no parallel allocation is
+ * possible from this lg. That means pa_free cannot be updated.
+ *
+ * A parallel ext4_mb_discard_group_preallocations is possible.
+ * which can cause the lg_prealloc_list to be updated.
+ */
+
+static void ext4_mb_add_n_trim(struct ext4_allocation_context *ac)
+{
+       int order, added = 0, lg_prealloc_count = 1;
+       struct super_block *sb = ac->ac_sb;
+       struct ext4_locality_group *lg = ac->ac_lg;
+       struct ext4_prealloc_space *tmp_pa, *pa = ac->ac_pa;
+
+       order = fls(pa->pa_free) - 1;
+       if (order > PREALLOC_TB_SIZE - 1)
+               /* The max size of hash table is PREALLOC_TB_SIZE */
+               order = PREALLOC_TB_SIZE - 1;
+       /* Add the prealloc space to lg */
+       rcu_read_lock();
+       list_for_each_entry_rcu(tmp_pa, &lg->lg_prealloc_list[order],
+                                               pa_inode_list) {
+               spin_lock(&tmp_pa->pa_lock);
+               if (tmp_pa->pa_deleted) {
+                       spin_unlock(&pa->pa_lock);
+                       continue;
+               }
+               if (!added && pa->pa_free < tmp_pa->pa_free) {
+                       /* Add to the tail of the previous entry */
+                       list_add_tail_rcu(&pa->pa_inode_list,
+                                               &tmp_pa->pa_inode_list);
+                       added = 1;
+                       /*
+                        * we want to count the total
+                        * number of entries in the list
+                        */
+               }
+               spin_unlock(&tmp_pa->pa_lock);
+               lg_prealloc_count++;
+       }
+       if (!added)
+               list_add_tail_rcu(&pa->pa_inode_list,
+                                       &lg->lg_prealloc_list[order]);
+       rcu_read_unlock();
+
+       /* Now trim the list to be not more than 8 elements */
+       if (lg_prealloc_count > 8) {
+               ext4_mb_discard_lg_preallocations(sb, lg,
+                                               order, lg_prealloc_count);
+               return;
+       }
+       return ;
+}
+
 /*
  * release all resource we used in allocation
  */
 static int ext4_mb_release_context(struct ext4_allocation_context *ac)
 {
-       if (ac->ac_pa) {
-               if (ac->ac_pa->pa_linear) {
+       struct ext4_prealloc_space *pa = ac->ac_pa;
+       if (pa) {
+               if (pa->pa_linear) {
                        /* see comment in ext4_mb_use_group_pa() */
-                       spin_lock(&ac->ac_pa->pa_lock);
-                       ac->ac_pa->pa_pstart += ac->ac_b_ex.fe_len;
-                       ac->ac_pa->pa_lstart += ac->ac_b_ex.fe_len;
-                       ac->ac_pa->pa_free -= ac->ac_b_ex.fe_len;
-                       ac->ac_pa->pa_len -= ac->ac_b_ex.fe_len;
-                       spin_unlock(&ac->ac_pa->pa_lock);
+                       spin_lock(&pa->pa_lock);
+                       pa->pa_pstart += ac->ac_b_ex.fe_len;
+                       pa->pa_lstart += ac->ac_b_ex.fe_len;
+                       pa->pa_free -= ac->ac_b_ex.fe_len;
+                       pa->pa_len -= ac->ac_b_ex.fe_len;
+                       spin_unlock(&pa->pa_lock);
+                       /*
+                        * We want to add the pa to the right bucket.
+                        * Remove it from the list and while adding
+                        * make sure the list to which we are adding
+                        * doesn't grow big.
+                        */
+                       if (likely(pa->pa_free)) {
+                               spin_lock(pa->pa_obj_lock);
+                               list_del_rcu(&pa->pa_inode_list);
+                               spin_unlock(pa->pa_obj_lock);
+                               ext4_mb_add_n_trim(ac);
+                       }
                }
-               ext4_mb_put_pa(ac, ac->ac_sb, ac->ac_pa);
+               ext4_mb_put_pa(ac, ac->ac_sb, pa);
        }
        if (ac->ac_bitmap_page)
                page_cache_release(ac->ac_bitmap_page);
@@ -4420,11 +4588,15 @@ do_more:
                count -= overflow;
        }
        bitmap_bh = ext4_read_block_bitmap(sb, block_group);
-       if (!bitmap_bh)
+       if (!bitmap_bh) {
+               err = -EIO;
                goto error_return;
+       }
        gdp = ext4_get_group_desc(sb, block_group, &gd_bh);
-       if (!gdp)
+       if (!gdp) {
+               err = -EIO;
                goto error_return;
+       }
 
        if (in_range(ext4_block_bitmap(sb, gdp), block, count) ||
            in_range(ext4_inode_bitmap(sb, gdp), block, count) ||
index bfe6add46bcfdaa2988a449b2c6cd316c4802419..c7c9906c2a754dec0953412b1c0843873ef7f6b9 100644 (file)
@@ -164,11 +164,17 @@ struct ext4_free_extent {
  * Locality group:
  *   we try to group all related changes together
  *   so that writeback can flush/allocate them together as well
+ *   Size of lg_prealloc_list hash is determined by MB_DEFAULT_GROUP_PREALLOC
+ *   (512). We store prealloc space into the hash based on the pa_free blocks
+ *   order value.ie, fls(pa_free)-1;
  */
+#define PREALLOC_TB_SIZE 10
 struct ext4_locality_group {
        /* for allocator */
-       struct mutex            lg_mutex;       /* to serialize allocates */
-       struct list_head        lg_prealloc_list;/* list of preallocations */
+       /* to serialize allocates */
+       struct mutex            lg_mutex;
+       /* list of preallocations */
+       struct list_head        lg_prealloc_list[PREALLOC_TB_SIZE];
        spinlock_t              lg_prealloc_lock;
 };
 
index f000fbe2cd93c0fb10938e1eba8c89e63dfc434a..0a9265164265fda4be2aa94c1db1941c3bb0b247 100644 (file)
@@ -73,7 +73,7 @@ static int verify_group_input(struct super_block *sb,
                             "Inode bitmap not in group (block %llu)",
                             (unsigned long long)input->inode_bitmap);
        else if (outside(input->inode_table, start, end) ||
-                outside(itend - 1, start, end))
+                outside(itend - 1, start, end))
                ext4_warning(sb, __func__,
                             "Inode table not in group (blocks %llu-%llu)",
                             (unsigned long long)input->inode_table, itend - 1);
@@ -104,7 +104,7 @@ static int verify_group_input(struct super_block *sb,
                             (unsigned long long)input->inode_bitmap,
                             start, metaend - 1);
        else if (inside(input->inode_table, start, metaend) ||
-                inside(itend - 1, start, metaend))
+                inside(itend - 1, start, metaend))
                ext4_warning(sb, __func__,
                             "Inode table (%llu-%llu) overlaps"
                             "GDT table (%llu-%llu)",
@@ -158,9 +158,9 @@ static int extend_or_restart_transaction(handle_t *handle, int thresh,
        if (err) {
                if ((err = ext4_journal_restart(handle, EXT4_MAX_TRANS_DATA)))
                        return err;
-               if ((err = ext4_journal_get_write_access(handle, bh)))
+               if ((err = ext4_journal_get_write_access(handle, bh)))
                        return err;
-        }
+       }
 
        return 0;
 }
@@ -416,11 +416,11 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
                       "EXT4-fs: ext4_add_new_gdb: adding group block %lu\n",
                       gdb_num);
 
-       /*
-        * If we are not using the primary superblock/GDT copy don't resize,
-        * because the user tools have no way of handling this.  Probably a
-        * bad time to do it anyways.
-        */
+        /*
+         * If we are not using the primary superblock/GDT copy don't resize,
+         * because the user tools have no way of handling this.  Probably a
+         * bad time to do it anyways.
+         */
        if (EXT4_SB(sb)->s_sbh->b_blocknr !=
            le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block)) {
                ext4_warning(sb, __func__,
@@ -507,14 +507,14 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
        return 0;
 
 exit_inode:
-       //ext4_journal_release_buffer(handle, iloc.bh);
+       /* ext4_journal_release_buffer(handle, iloc.bh); */
        brelse(iloc.bh);
 exit_dindj:
-       //ext4_journal_release_buffer(handle, dind);
+       /* ext4_journal_release_buffer(handle, dind); */
 exit_primary:
-       //ext4_journal_release_buffer(handle, *primary);
+       /* ext4_journal_release_buffer(handle, *primary); */
 exit_sbh:
-       //ext4_journal_release_buffer(handle, *primary);
+       /* ext4_journal_release_buffer(handle, *primary); */
 exit_dind:
        brelse(dind);
 exit_bh:
@@ -818,12 +818,12 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
        if ((err = ext4_journal_get_write_access(handle, sbi->s_sbh)))
                goto exit_journal;
 
-       /*
-        * We will only either add reserved group blocks to a backup group
-        * or remove reserved blocks for the first group in a new group block.
-        * Doing both would be mean more complex code, and sane people don't
-        * use non-sparse filesystems anymore.  This is already checked above.
-        */
+        /*
+         * We will only either add reserved group blocks to a backup group
+         * or remove reserved blocks for the first group in a new group block.
+         * Doing both would be mean more complex code, and sane people don't
+         * use non-sparse filesystems anymore.  This is already checked above.
+         */
        if (gdb_off) {
                primary = sbi->s_group_desc[gdb_num];
                if ((err = ext4_journal_get_write_access(handle, primary)))
@@ -835,24 +835,24 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
        } else if ((err = add_new_gdb(handle, inode, input, &primary)))
                goto exit_journal;
 
-       /*
-        * OK, now we've set up the new group.  Time to make it active.
-        *
-        * Current kernels don't lock all allocations via lock_super(),
-        * so we have to be safe wrt. concurrent accesses the group
-        * data.  So we need to be careful to set all of the relevant
-        * group descriptor data etc. *before* we enable the group.
-        *
-        * The key field here is sbi->s_groups_count: as long as
-        * that retains its old value, nobody is going to access the new
-        * group.
-        *
-        * So first we update all the descriptor metadata for the new
-        * group; then we update the total disk blocks count; then we
-        * update the groups count to enable the group; then finally we
-        * update the free space counts so that the system can start
-        * using the new disk blocks.
-        */
+        /*
+         * OK, now we've set up the new group.  Time to make it active.
+         *
+         * Current kernels don't lock all allocations via lock_super(),
+         * so we have to be safe wrt. concurrent accesses the group
+         * data.  So we need to be careful to set all of the relevant
+         * group descriptor data etc. *before* we enable the group.
+         *
+         * The key field here is sbi->s_groups_count: as long as
+         * that retains its old value, nobody is going to access the new
+         * group.
+         *
+         * So first we update all the descriptor metadata for the new
+         * group; then we update the total disk blocks count; then we
+         * update the groups count to enable the group; then finally we
+         * update the free space counts so that the system can start
+         * using the new disk blocks.
+         */
 
        /* Update group descriptor block for new group */
        gdp = (struct ext4_group_desc *)((char *)primary->b_data +
@@ -946,7 +946,8 @@ exit_put:
        return err;
 } /* ext4_group_add */
 
-/* Extend the filesystem to the new number of blocks specified.  This entry
+/*
+ * Extend the filesystem to the new number of blocks specified.  This entry
  * point is only used to extend the current filesystem to the end of the last
  * existing group.  It can be accessed via ioctl, or by "remount,resize=<size>"
  * for emergencies (because it has no dependencies on reserved blocks).
@@ -1024,7 +1025,7 @@ int ext4_group_extend(struct super_block *sb, struct ext4_super_block *es,
                             o_blocks_count + add, add);
 
        /* See if the device is actually as big as what was requested */
-       bh = sb_bread(sb, o_blocks_count + add -1);
+       bh = sb_bread(sb, o_blocks_count + add - 1);
        if (!bh) {
                ext4_warning(sb, __func__,
                             "can't read last block, resize aborted");
index 1e69f29a8c5582ba209ad7dbeb49e57396d7e2fe..d5d77958b861b9fc29114965a566a7e2dfdd4a84 100644 (file)
@@ -49,20 +49,19 @@ static int ext4_load_journal(struct super_block *, struct ext4_super_block *,
                             unsigned long journal_devnum);
 static int ext4_create_journal(struct super_block *, struct ext4_super_block *,
                               unsigned int);
-static void ext4_commit_super (struct super_block * sb,
-                              struct ext4_super_block * es,
-                              int sync);
-static void ext4_mark_recovery_complete(struct super_block * sb,
-                                       struct ext4_super_block * es);
-static void ext4_clear_journal_err(struct super_block * sb,
-                                  struct ext4_super_block * es);
+static void ext4_commit_super(struct super_block *sb,
+                             struct ext4_super_block *es, int sync);
+static void ext4_mark_recovery_complete(struct super_block *sb,
+                                       struct ext4_super_block *es);
+static void ext4_clear_journal_err(struct super_block *sb,
+                                  struct ext4_super_block *es);
 static int ext4_sync_fs(struct super_block *sb, int wait);
-static const char *ext4_decode_error(struct super_block * sb, int errno,
+static const char *ext4_decode_error(struct super_block *sb, int errno,
                                     char nbuf[16]);
-static int ext4_remount (struct super_block * sb, int * flags, char * data);
-static int ext4_statfs (struct dentry * dentry, struct kstatfs * buf);
+static int ext4_remount(struct super_block *sb, int *flags, char *data);
+static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf);
 static void ext4_unlockfs(struct super_block *sb);
-static void ext4_write_super (struct super_block * sb);
+static void ext4_write_super(struct super_block *sb);
 static void ext4_write_super_lockfs(struct super_block *sb);
 
 
@@ -211,15 +210,15 @@ static void ext4_handle_error(struct super_block *sb)
        if (sb->s_flags & MS_RDONLY)
                return;
 
-       if (!test_opt (sb, ERRORS_CONT)) {
+       if (!test_opt(sb, ERRORS_CONT)) {
                journal_t *journal = EXT4_SB(sb)->s_journal;
 
                EXT4_SB(sb)->s_mount_opt |= EXT4_MOUNT_ABORT;
                if (journal)
                        jbd2_journal_abort(journal, -EIO);
        }
-       if (test_opt (sb, ERRORS_RO)) {
-               printk (KERN_CRIT "Remounting filesystem read-only\n");
+       if (test_opt(sb, ERRORS_RO)) {
+               printk(KERN_CRIT "Remounting filesystem read-only\n");
                sb->s_flags |= MS_RDONLY;
        }
        ext4_commit_super(sb, es, 1);
@@ -228,13 +227,13 @@ static void ext4_handle_error(struct super_block *sb)
                        sb->s_id);
 }
 
-void ext4_error (struct super_block * sb, const char * function,
-                const char * fmt, ...)
+void ext4_error(struct super_block *sb, const char *function,
+               const char *fmt, ...)
 {
        va_list args;
 
        va_start(args, fmt);
-       printk(KERN_CRIT "EXT4-fs error (device %s): %s: ",sb->s_id, function);
+       printk(KERN_CRIT "EXT4-fs error (device %s): %s: ", sb->s_id, function);
        vprintk(fmt, args);
        printk("\n");
        va_end(args);
@@ -242,7 +241,7 @@ void ext4_error (struct super_block * sb, const char * function,
        ext4_handle_error(sb);
 }
 
-static const char *ext4_decode_error(struct super_block * sb, int errno,
+static const char *ext4_decode_error(struct super_block *sb, int errno,
                                     char nbuf[16])
 {
        char *errstr = NULL;
@@ -278,8 +277,7 @@ static const char *ext4_decode_error(struct super_block * sb, int errno,
 /* __ext4_std_error decodes expected errors from journaling functions
  * automatically and invokes the appropriate error response.  */
 
-void __ext4_std_error (struct super_block * sb, const char * function,
-                      int errno)
+void __ext4_std_error(struct super_block *sb, const char *function, int errno)
 {
        char nbuf[16];
        const char *errstr;
@@ -292,8 +290,8 @@ void __ext4_std_error (struct super_block * sb, const char * function,
                return;
 
        errstr = ext4_decode_error(sb, errno, nbuf);
-       printk (KERN_CRIT "EXT4-fs error (device %s) in %s: %s\n",
-               sb->s_id, function, errstr);
+       printk(KERN_CRIT "EXT4-fs error (device %s) in %s: %s\n",
+              sb->s_id, function, errstr);
 
        ext4_handle_error(sb);
 }
@@ -308,15 +306,15 @@ void __ext4_std_error (struct super_block * sb, const char * function,
  * case we take the easy way out and panic immediately.
  */
 
-void ext4_abort (struct super_block * sb, const char * function,
-                const char * fmt, ...)
+void ext4_abort(struct super_block *sb, const char *function,
+               const char *fmt, ...)
 {
        va_list args;
 
-       printk (KERN_CRIT "ext4_abort called.\n");
+       printk(KERN_CRIT "ext4_abort called.\n");
 
        va_start(args, fmt);
-       printk(KERN_CRIT "EXT4-fs error (device %s): %s: ",sb->s_id, function);
+       printk(KERN_CRIT "EXT4-fs error (device %s): %s: ", sb->s_id, function);
        vprintk(fmt, args);
        printk("\n");
        va_end(args);
@@ -334,8 +332,8 @@ void ext4_abort (struct super_block * sb, const char * function,
        jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO);
 }
 
-void ext4_warning (struct super_block * sb, const char * function,
-                  const char * fmt, ...)
+void ext4_warning(struct super_block *sb, const char *function,
+                 const char *fmt, ...)
 {
        va_list args;
 
@@ -496,7 +494,7 @@ static void dump_orphan_list(struct super_block *sb, struct ext4_sb_info *sbi)
        }
 }
 
-static void ext4_put_super (struct super_block * sb)
+static void ext4_put_super(struct super_block *sb)
 {
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        struct ext4_super_block *es = sbi->s_es;
@@ -647,7 +645,8 @@ static void ext4_clear_inode(struct inode *inode)
                                       &EXT4_I(inode)->jinode);
 }
 
-static inline void ext4_show_quota_options(struct seq_file *seq, struct super_block *sb)
+static inline void ext4_show_quota_options(struct seq_file *seq,
+                                          struct super_block *sb)
 {
 #if defined(CONFIG_QUOTA)
        struct ext4_sb_info *sbi = EXT4_SB(sb);
@@ -822,8 +821,8 @@ static struct dentry *ext4_fh_to_parent(struct super_block *sb, struct fid *fid,
 }
 
 #ifdef CONFIG_QUOTA
-#define QTYPE2NAME(t) ((t)==USRQUOTA?"user":"group")
-#define QTYPE2MOPT(on, t) ((t)==USRQUOTA?((on)##USRJQUOTA):((on)##GRPJQUOTA))
+#define QTYPE2NAME(t) ((t) == USRQUOTA?"user":"group")
+#define QTYPE2MOPT(on, t) ((t) == USRQUOTA?((on)##USRJQUOTA):((on)##GRPJQUOTA))
 
 static int ext4_dquot_initialize(struct inode *inode, int type);
 static int ext4_dquot_drop(struct inode *inode);
@@ -991,12 +990,12 @@ static ext4_fsblk_t get_sb_block(void **data)
        return sb_block;
 }
 
-static int parse_options (char *options, struct super_block *sb,
-                         unsigned int *inum, unsigned long *journal_devnum,
-                         ext4_fsblk_t *n_blocks_count, int is_remount)
+static int parse_options(char *options, struct super_block *sb,
+                        unsigned int *inum, unsigned long *journal_devnum,
+                        ext4_fsblk_t *n_blocks_count, int is_remount)
 {
        struct ext4_sb_info *sbi = EXT4_SB(sb);
-       char * p;
+       char *p;
        substring_t args[MAX_OPT_ARGS];
        int data_opt = 0;
        int option;
@@ -1009,7 +1008,7 @@ static int parse_options (char *options, struct super_block *sb,
        if (!options)
                return 1;
 
-       while ((p = strsep (&options, ",")) != NULL) {
+       while ((p = strsep(&options, ",")) != NULL) {
                int token;
                if (!*p)
                        continue;
@@ -1017,16 +1016,16 @@ static int parse_options (char *options, struct super_block *sb,
                token = match_token(p, tokens, args);
                switch (token) {
                case Opt_bsd_df:
-                       clear_opt (sbi->s_mount_opt, MINIX_DF);
+                       clear_opt(sbi->s_mount_opt, MINIX_DF);
                        break;
                case Opt_minix_df:
-                       set_opt (sbi->s_mount_opt, MINIX_DF);
+                       set_opt(sbi->s_mount_opt, MINIX_DF);
                        break;
                case Opt_grpid:
-                       set_opt (sbi->s_mount_opt, GRPID);
+                       set_opt(sbi->s_mount_opt, GRPID);
                        break;
                case Opt_nogrpid:
-                       clear_opt (sbi->s_mount_opt, GRPID);
+                       clear_opt(sbi->s_mount_opt, GRPID);
                        break;
                case Opt_resuid:
                        if (match_int(&args[0], &option))
@@ -1043,41 +1042,41 @@ static int parse_options (char *options, struct super_block *sb,
                        /* *sb_block = match_int(&args[0]); */
                        break;
                case Opt_err_panic:
-                       clear_opt (sbi->s_mount_opt, ERRORS_CONT);
-                       clear_opt (sbi->s_mount_opt, ERRORS_RO);
-                       set_opt (sbi->s_mount_opt, ERRORS_PANIC);
+                       clear_opt(sbi->s_mount_opt, ERRORS_CONT);
+                       clear_opt(sbi->s_mount_opt, ERRORS_RO);
+                       set_opt(sbi->s_mount_opt, ERRORS_PANIC);
                        break;
                case Opt_err_ro:
-                       clear_opt (sbi->s_mount_opt, ERRORS_CONT);
-                       clear_opt (sbi->s_mount_opt, ERRORS_PANIC);
-                       set_opt (sbi->s_mount_opt, ERRORS_RO);
+                       clear_opt(sbi->s_mount_opt, ERRORS_CONT);
+                       clear_opt(sbi->s_mount_opt, ERRORS_PANIC);
+                       set_opt(sbi->s_mount_opt, ERRORS_RO);
                        break;
                case Opt_err_cont:
-                       clear_opt (sbi->s_mount_opt, ERRORS_RO);
-                       clear_opt (sbi->s_mount_opt, ERRORS_PANIC);
-                       set_opt (sbi->s_mount_opt, ERRORS_CONT);
+                       clear_opt(sbi->s_mount_opt, ERRORS_RO);
+                       clear_opt(sbi->s_mount_opt, ERRORS_PANIC);
+                       set_opt(sbi->s_mount_opt, ERRORS_CONT);
                        break;
                case Opt_nouid32:
-                       set_opt (sbi->s_mount_opt, NO_UID32);
+                       set_opt(sbi->s_mount_opt, NO_UID32);
                        break;
                case Opt_nocheck:
-                       clear_opt (sbi->s_mount_opt, CHECK);
+                       clear_opt(sbi->s_mount_opt, CHECK);
                        break;
                case Opt_debug:
-                       set_opt (sbi->s_mount_opt, DEBUG);
+                       set_opt(sbi->s_mount_opt, DEBUG);
                        break;
                case Opt_oldalloc:
-                       set_opt (sbi->s_mount_opt, OLDALLOC);
+                       set_opt(sbi->s_mount_opt, OLDALLOC);
                        break;
                case Opt_orlov:
-                       clear_opt (sbi->s_mount_opt, OLDALLOC);
+                       clear_opt(sbi->s_mount_opt, OLDALLOC);
                        break;
 #ifdef CONFIG_EXT4DEV_FS_XATTR
                case Opt_user_xattr:
-                       set_opt (sbi->s_mount_opt, XATTR_USER);
+                       set_opt(sbi->s_mount_opt, XATTR_USER);
                        break;
                case Opt_nouser_xattr:
-                       clear_opt (sbi->s_mount_opt, XATTR_USER);
+                       clear_opt(sbi->s_mount_opt, XATTR_USER);
                        break;
 #else
                case Opt_user_xattr:
@@ -1115,7 +1114,7 @@ static int parse_options (char *options, struct super_block *sb,
                                       "journal on remount\n");
                                return 0;
                        }
-                       set_opt (sbi->s_mount_opt, UPDATE_JOURNAL);
+                       set_opt(sbi->s_mount_opt, UPDATE_JOURNAL);
                        break;
                case Opt_journal_inum:
                        if (is_remount) {
@@ -1145,7 +1144,7 @@ static int parse_options (char *options, struct super_block *sb,
                        set_opt(sbi->s_mount_opt, JOURNAL_CHECKSUM);
                        break;
                case Opt_noload:
-                       set_opt (sbi->s_mount_opt, NOLOAD);
+                       set_opt(sbi->s_mount_opt, NOLOAD);
                        break;
                case Opt_commit:
                        if (match_int(&args[0], &option))
@@ -1331,7 +1330,7 @@ set_qf_format:
                                        "on this filesystem, use tune2fs\n");
                                return 0;
                        }
-                       set_opt (sbi->s_mount_opt, EXTENTS);
+                       set_opt(sbi->s_mount_opt, EXTENTS);
                        break;
                case Opt_noextents:
                        /*
@@ -1348,7 +1347,7 @@ set_qf_format:
                                                "-o noextents options\n");
                                return 0;
                        }
-                       clear_opt (sbi->s_mount_opt, EXTENTS);
+                       clear_opt(sbi->s_mount_opt, EXTENTS);
                        break;
                case Opt_i_version:
                        set_opt(sbi->s_mount_opt, I_VERSION);
@@ -1374,9 +1373,9 @@ set_qf_format:
                        set_opt(sbi->s_mount_opt, DELALLOC);
                        break;
                default:
-                       printk (KERN_ERR
-                               "EXT4-fs: Unrecognized mount option \"%s\" "
-                               "or missing value\n", p);
+                       printk(KERN_ERR
+                              "EXT4-fs: Unrecognized mount option \"%s\" "
+                              "or missing value\n", p);
                        return 0;
                }
        }
@@ -1423,31 +1422,31 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es,
        int res = 0;
 
        if (le32_to_cpu(es->s_rev_level) > EXT4_MAX_SUPP_REV) {
-               printk (KERN_ERR "EXT4-fs warning: revision level too high, "
-                       "forcing read-only mode\n");
+               printk(KERN_ERR "EXT4-fs warning: revision level too high, "
+                      "forcing read-only mode\n");
                res = MS_RDONLY;
        }
        if (read_only)
                return res;
        if (!(sbi->s_mount_state & EXT4_VALID_FS))
-               printk (KERN_WARNING "EXT4-fs warning: mounting unchecked fs, "
-                       "running e2fsck is recommended\n");
+               printk(KERN_WARNING "EXT4-fs warning: mounting unchecked fs, "
+                      "running e2fsck is recommended\n");
        else if ((sbi->s_mount_state & EXT4_ERROR_FS))
-               printk (KERN_WARNING
-                       "EXT4-fs warning: mounting fs with errors, "
-                       "running e2fsck is recommended\n");
+               printk(KERN_WARNING
+                      "EXT4-fs warning: mounting fs with errors, "
+                      "running e2fsck is recommended\n");
        else if ((__s16) le16_to_cpu(es->s_max_mnt_count) >= 0 &&
                 le16_to_cpu(es->s_mnt_count) >=
                 (unsigned short) (__s16) le16_to_cpu(es->s_max_mnt_count))
-               printk (KERN_WARNING
-                       "EXT4-fs warning: maximal mount count reached, "
-                       "running e2fsck is recommended\n");
+               printk(KERN_WARNING
+                      "EXT4-fs warning: maximal mount count reached, "
+                      "running e2fsck is recommended\n");
        else if (le32_to_cpu(es->s_checkinterval) &&
                (le32_to_cpu(es->s_lastcheck) +
                        le32_to_cpu(es->s_checkinterval) <= get_seconds()))
-               printk (KERN_WARNING
-                       "EXT4-fs warning: checktime reached, "
-                       "running e2fsck is recommended\n");
+               printk(KERN_WARNING
+                      "EXT4-fs warning: checktime reached, "
+                      "running e2fsck is recommended\n");
 #if 0
                /* @@@ We _will_ want to clear the valid bit if we find
                 * inconsistencies, to force a fsck at reboot.  But for
@@ -1506,14 +1505,13 @@ static int ext4_fill_flex_info(struct super_block *sb)
 
        flex_group_count = (sbi->s_groups_count + groups_per_flex - 1) /
                groups_per_flex;
-       sbi->s_flex_groups = kmalloc(flex_group_count *
+       sbi->s_flex_groups = kzalloc(flex_group_count *
                                     sizeof(struct flex_groups), GFP_KERNEL);
        if (sbi->s_flex_groups == NULL) {
-               printk(KERN_ERR "EXT4-fs: not enough memory\n");
+               printk(KERN_ERR "EXT4-fs: not enough memory for "
+                               "%lu flex groups\n", flex_group_count);
                goto failed;
        }
-       memset(sbi->s_flex_groups, 0, flex_group_count *
-              sizeof(struct flex_groups));
 
        gdp = ext4_get_group_desc(sb, 1, &bh);
        block_bitmap = ext4_block_bitmap(sb, gdp) - 1;
@@ -1597,16 +1595,14 @@ static int ext4_check_descriptors(struct super_block *sb)
                                (EXT4_BLOCKS_PER_GROUP(sb) - 1);
 
                block_bitmap = ext4_block_bitmap(sb, gdp);
-               if (block_bitmap < first_block || block_bitmap > last_block)
-               {
+               if (block_bitmap < first_block || block_bitmap > last_block) {
                        printk(KERN_ERR "EXT4-fs: ext4_check_descriptors: "
                               "Block bitmap for group %lu not in group "
                               "(block %llu)!", i, block_bitmap);
                        return 0;
                }
                inode_bitmap = ext4_inode_bitmap(sb, gdp);
-               if (inode_bitmap < first_block || inode_bitmap > last_block)
-               {
+               if (inode_bitmap < first_block || inode_bitmap > last_block) {
                        printk(KERN_ERR "EXT4-fs: ext4_check_descriptors: "
                               "Inode bitmap for group %lu not in group "
                               "(block %llu)!", i, inode_bitmap);
@@ -1614,26 +1610,28 @@ static int ext4_check_descriptors(struct super_block *sb)
                }
                inode_table = ext4_inode_table(sb, gdp);
                if (inode_table < first_block ||
-                   inode_table + sbi->s_itb_per_group - 1 > last_block)
-               {
+                   inode_table + sbi->s_itb_per_group - 1 > last_block) {
                        printk(KERN_ERR "EXT4-fs: ext4_check_descriptors: "
                               "Inode table for group %lu not in group "
                               "(block %llu)!", i, inode_table);
                        return 0;
                }
+               spin_lock(sb_bgl_lock(sbi, i));
                if (!ext4_group_desc_csum_verify(sbi, i, gdp)) {
                        printk(KERN_ERR "EXT4-fs: ext4_check_descriptors: "
                               "Checksum for group %lu failed (%u!=%u)\n",
                               i, le16_to_cpu(ext4_group_desc_csum(sbi, i,
                               gdp)), le16_to_cpu(gdp->bg_checksum));
-                       return 0;
+                       if (!(sb->s_flags & MS_RDONLY))
+                               return 0;
                }
+               spin_unlock(sb_bgl_lock(sbi, i));
                if (!flexbg_flag)
                        first_block += EXT4_BLOCKS_PER_GROUP(sb);
        }
 
        ext4_free_blocks_count_set(sbi->s_es, ext4_count_free_blocks(sb));
-       sbi->s_es->s_free_inodes_count=cpu_to_le32(ext4_count_free_inodes(sb));
+       sbi->s_es->s_free_inodes_count = cpu_to_le32(ext4_count_free_inodes(sb));
        return 1;
 }
 
@@ -1654,8 +1652,8 @@ static int ext4_check_descriptors(struct super_block *sb)
  * e2fsck was run on this filesystem, and it must have already done the orphan
  * inode cleanup for us, so we can safely abort without any further action.
  */
-static void ext4_orphan_cleanup (struct super_block * sb,
-                                struct ext4_super_block * es)
+static void ext4_orphan_cleanup(struct super_block *sb,
+                               struct ext4_super_block *es)
 {
        unsigned int s_flags = sb->s_flags;
        int nr_orphans = 0, nr_truncates = 0;
@@ -1732,7 +1730,7 @@ static void ext4_orphan_cleanup (struct super_block * sb,
                iput(inode);  /* The delete magic happens here! */
        }
 
-#define PLURAL(x) (x), ((x)==1) ? "" : "s"
+#define PLURAL(x) (x), ((x) == 1) ? "" : "s"
 
        if (nr_orphans)
                printk(KERN_INFO "EXT4-fs: %s: %d orphan inode%s deleted\n",
@@ -1899,12 +1897,12 @@ static unsigned long ext4_get_stripe_size(struct ext4_sb_info *sbi)
        return 0;
 }
 
-static int ext4_fill_super (struct super_block *sb, void *data, int silent)
+static int ext4_fill_super(struct super_block *sb, void *data, int silent)
                                __releases(kernel_lock)
                                __acquires(kernel_lock)
 
 {
-       struct buffer_head * bh;
+       struct buffer_head *bh;
        struct ext4_super_block *es = NULL;
        struct ext4_sb_info *sbi;
        ext4_fsblk_t block;
@@ -1953,7 +1951,7 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
        }
 
        if (!(bh = sb_bread(sb, logical_sb_block))) {
-               printk (KERN_ERR "EXT4-fs: unable to read superblock\n");
+               printk(KERN_ERR "EXT4-fs: unable to read superblock\n");
                goto out_fail;
        }
        /*
@@ -2026,8 +2024,8 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
        set_opt(sbi->s_mount_opt, DELALLOC);
 
 
-       if (!parse_options ((char *) data, sb, &journal_inum, &journal_devnum,
-                           NULL, 0))
+       if (!parse_options((char *) data, sb, &journal_inum, &journal_devnum,
+                          NULL, 0))
                goto failed_mount;
 
        sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
@@ -2102,7 +2100,7 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
                        goto failed_mount;
                }
 
-               brelse (bh);
+               brelse(bh);
                logical_sb_block = sb_block * EXT4_MIN_BLOCK_SIZE;
                offset = do_div(logical_sb_block, blocksize);
                bh = sb_bread(sb, logical_sb_block);
@@ -2114,8 +2112,8 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
                es = (struct ext4_super_block *)(((char *)bh->b_data) + offset);
                sbi->s_es = es;
                if (es->s_magic != cpu_to_le16(EXT4_SUPER_MAGIC)) {
-                       printk (KERN_ERR
-                               "EXT4-fs: Magic mismatch, very weird !\n");
+                       printk(KERN_ERR
+                              "EXT4-fs: Magic mismatch, very weird !\n");
                        goto failed_mount;
                }
        }
@@ -2132,9 +2130,9 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
                if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) ||
                    (!is_power_of_2(sbi->s_inode_size)) ||
                    (sbi->s_inode_size > blocksize)) {
-                       printk (KERN_ERR
-                               "EXT4-fs: unsupported inode size: %d\n",
-                               sbi->s_inode_size);
+                       printk(KERN_ERR
+                              "EXT4-fs: unsupported inode size: %d\n",
+                              sbi->s_inode_size);
                        goto failed_mount;
                }
                if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE)
@@ -2166,20 +2164,20 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
        sbi->s_mount_state = le16_to_cpu(es->s_state);
        sbi->s_addr_per_block_bits = ilog2(EXT4_ADDR_PER_BLOCK(sb));
        sbi->s_desc_per_block_bits = ilog2(EXT4_DESC_PER_BLOCK(sb));
-       for (i=0; i < 4; i++)
+       for (i = 0; i < 4; i++)
                sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]);
        sbi->s_def_hash_version = es->s_def_hash_version;
 
        if (sbi->s_blocks_per_group > blocksize * 8) {
-               printk (KERN_ERR
-                       "EXT4-fs: #blocks per group too big: %lu\n",
-                       sbi->s_blocks_per_group);
+               printk(KERN_ERR
+                      "EXT4-fs: #blocks per group too big: %lu\n",
+                      sbi->s_blocks_per_group);
                goto failed_mount;
        }
        if (sbi->s_inodes_per_group > blocksize * 8) {
-               printk (KERN_ERR
-                       "EXT4-fs: #inodes per group too big: %lu\n",
-                       sbi->s_inodes_per_group);
+               printk(KERN_ERR
+                      "EXT4-fs: #inodes per group too big: %lu\n",
+                      sbi->s_inodes_per_group);
                goto failed_mount;
        }
 
@@ -2213,10 +2211,10 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
        sbi->s_groups_count = blocks_count;
        db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) /
                   EXT4_DESC_PER_BLOCK(sb);
-       sbi->s_group_desc = kmalloc(db_count * sizeof (struct buffer_head *),
+       sbi->s_group_desc = kmalloc(db_count * sizeof(struct buffer_head *),
                                    GFP_KERNEL);
        if (sbi->s_group_desc == NULL) {
-               printk (KERN_ERR "EXT4-fs: not enough memory\n");
+               printk(KERN_ERR "EXT4-fs: not enough memory\n");
                goto failed_mount;
        }
 
@@ -2226,13 +2224,13 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
                block = descriptor_loc(sb, logical_sb_block, i);
                sbi->s_group_desc[i] = sb_bread(sb, block);
                if (!sbi->s_group_desc[i]) {
-                       printk (KERN_ERR "EXT4-fs: "
-                               "can't read group descriptor %d\n", i);
+                       printk(KERN_ERR "EXT4-fs: "
+                              "can't read group descriptor %d\n", i);
                        db_count = i;
                        goto failed_mount2;
                }
        }
-       if (!ext4_check_descriptors (sb)) {
+       if (!ext4_check_descriptors(sb)) {
                printk(KERN_ERR "EXT4-fs: group descriptors corrupted!\n");
                goto failed_mount2;
        }
@@ -2308,11 +2306,11 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
                    EXT4_SB(sb)->s_journal->j_failed_commit) {
                        printk(KERN_CRIT "EXT4-fs error (device %s): "
                               "ext4_fill_super: Journal transaction "
-                              "%u is corrupt\n", sb->s_id, 
+                              "%u is corrupt\n", sb->s_id,
                               EXT4_SB(sb)->s_journal->j_failed_commit);
-                       if (test_opt (sb, ERRORS_RO)) {
-                               printk (KERN_CRIT
-                                       "Mounting filesystem read-only\n");
+                       if (test_opt(sb, ERRORS_RO)) {
+                               printk(KERN_CRIT
+                                      "Mounting filesystem read-only\n");
                                sb->s_flags |= MS_RDONLY;
                                EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;
                                es->s_state |= cpu_to_le16(EXT4_ERROR_FS);
@@ -2332,9 +2330,9 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
                        goto failed_mount3;
        } else {
                if (!silent)
-                       printk (KERN_ERR
-                               "ext4: No journal on filesystem on %s\n",
-                               sb->s_id);
+                       printk(KERN_ERR
+                              "ext4: No journal on filesystem on %s\n",
+                              sb->s_id);
                goto failed_mount3;
        }
 
@@ -2418,7 +2416,7 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
                goto failed_mount4;
        }
 
-       ext4_setup_super (sb, es, sb->s_flags & MS_RDONLY);
+       ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY);
 
        /* determine the minimum size of new large inodes, if present */
        if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) {
@@ -2457,12 +2455,12 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
        ext4_orphan_cleanup(sb, es);
        EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS;
        if (needs_recovery)
-               printk (KERN_INFO "EXT4-fs: recovery complete.\n");
+               printk(KERN_INFO "EXT4-fs: recovery complete.\n");
        ext4_mark_recovery_complete(sb, es);
-       printk (KERN_INFO "EXT4-fs: mounted filesystem with %s data mode.\n",
-               test_opt(sb,DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA ? "journal":
-               test_opt(sb,DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA ? "ordered":
-               "writeback");
+       printk(KERN_INFO "EXT4-fs: mounted filesystem with %s data mode.\n",
+              test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA ? "journal":
+              test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA ? "ordered":
+              "writeback");
 
        if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) {
                printk(KERN_WARNING "EXT4-fs: Ignoring delalloc option - "
@@ -2575,14 +2573,14 @@ static journal_t *ext4_get_journal(struct super_block *sb,
 static journal_t *ext4_get_dev_journal(struct super_block *sb,
                                       dev_t j_dev)
 {
-       struct buffer_head * bh;
+       struct buffer_head *bh;
        journal_t *journal;
        ext4_fsblk_t start;
        ext4_fsblk_t len;
        int hblock, blocksize;
        ext4_fsblk_t sb_block;
        unsigned long offset;
-       struct ext4_super_block * es;
+       struct ext4_super_block *es;
        struct block_device *bdev;
 
        bdev = ext4_blkdev_get(j_dev);
@@ -2697,8 +2695,8 @@ static int ext4_load_journal(struct super_block *sb,
                                        "unavailable, cannot proceed.\n");
                                return -EROFS;
                        }
-                       printk (KERN_INFO "EXT4-fs: write access will "
-                                       "be enabled during recovery.\n");
+                       printk(KERN_INFO "EXT4-fs: write access will "
+                              "be enabled during recovery.\n");
                }
        }
 
@@ -2751,8 +2749,8 @@ static int ext4_load_journal(struct super_block *sb,
        return 0;
 }
 
-static int ext4_create_journal(struct super_block * sb,
-                              struct ext4_super_block * es,
+static int ext4_create_journal(struct super_block *sb,
+                              struct ext4_super_block *es,
                               unsigned int journal_inum)
 {
        journal_t *journal;
@@ -2793,9 +2791,8 @@ static int ext4_create_journal(struct super_block * sb,
        return 0;
 }
 
-static void ext4_commit_super (struct super_block * sb,
-                              struct ext4_super_block * es,
-                              int sync)
+static void ext4_commit_super(struct super_block *sb,
+                             struct ext4_super_block *es, int sync)
 {
        struct buffer_head *sbh = EXT4_SB(sb)->s_sbh;
 
@@ -2816,8 +2813,8 @@ static void ext4_commit_super (struct super_block * sb,
  * remounting) the filesystem readonly, then we will end up with a
  * consistent fs on disk.  Record that fact.
  */
-static void ext4_mark_recovery_complete(struct super_block * sb,
-                                       struct ext4_super_block * es)
+static void ext4_mark_recovery_complete(struct super_block *sb,
+                                       struct ext4_super_block *es)
 {
        journal_t *journal = EXT4_SB(sb)->s_journal;
 
@@ -2839,8 +2836,8 @@ static void ext4_mark_recovery_complete(struct super_block * sb,
  * has recorded an error from a previous lifetime, move that error to the
  * main filesystem now.
  */
-static void ext4_clear_journal_err(struct super_block * sb,
-                                  struct ext4_super_block * es)
+static void ext4_clear_journal_err(struct super_block *sb,
+                                  struct ext4_super_block *es)
 {
        journal_t *journal;
        int j_errno;
@@ -2865,7 +2862,7 @@ static void ext4_clear_journal_err(struct super_block * sb,
 
                EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;
                es->s_state |= cpu_to_le16(EXT4_ERROR_FS);
-               ext4_commit_super (sb, es, 1);
+               ext4_commit_super(sb, es, 1);
 
                jbd2_journal_clear_err(journal);
        }
@@ -2898,7 +2895,7 @@ int ext4_force_commit(struct super_block *sb)
  * This implicitly triggers the writebehind on sync().
  */
 
-static void ext4_write_super (struct super_block * sb)
+static void ext4_write_super(struct super_block *sb)
 {
        if (mutex_trylock(&sb->s_lock) != 0)
                BUG();
@@ -2954,13 +2951,14 @@ static void ext4_unlockfs(struct super_block *sb)
        }
 }
 
-static int ext4_remount (struct super_block * sb, int * flags, char * data)
+static int ext4_remount(struct super_block *sb, int *flags, char *data)
 {
-       struct ext4_super_block * es;
+       struct ext4_super_block *es;
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        ext4_fsblk_t n_blocks_count = 0;
        unsigned long old_sb_flags;
        struct ext4_mount_options old_opts;
+       ext4_group_t g;
        int err;
 #ifdef CONFIG_QUOTA
        int i;
@@ -3038,6 +3036,26 @@ static int ext4_remount (struct super_block * sb, int * flags, char * data)
                                goto restore_opts;
                        }
 
+                       /*
+                        * Make sure the group descriptor checksums
+                        * are sane.  If they aren't, refuse to
+                        * remount r/w.
+                        */
+                       for (g = 0; g < sbi->s_groups_count; g++) {
+                               struct ext4_group_desc *gdp =
+                                       ext4_get_group_desc(sb, g, NULL);
+
+                               if (!ext4_group_desc_csum_verify(sbi, g, gdp)) {
+                                       printk(KERN_ERR
+              "EXT4-fs: ext4_remount: "
+               "Checksum for group %lu failed (%u!=%u)\n",
+               g, le16_to_cpu(ext4_group_desc_csum(sbi, g, gdp)),
+                                              le16_to_cpu(gdp->bg_checksum));
+                                       err = -EINVAL;
+                                       goto restore_opts;
+                               }
+                       }
+
                        /*
                         * If we have an unprocessed orphan list hanging
                         * around from a previously readonly bdev mount,
@@ -3063,7 +3081,7 @@ static int ext4_remount (struct super_block * sb, int * flags, char * data)
                        sbi->s_mount_state = le16_to_cpu(es->s_state);
                        if ((err = ext4_group_extend(sb, es, n_blocks_count)))
                                goto restore_opts;
-                       if (!ext4_setup_super (sb, es, 0))
+                       if (!ext4_setup_super(sb, es, 0))
                                sb->s_flags &= ~MS_RDONLY;
                }
        }
@@ -3093,7 +3111,7 @@ restore_opts:
        return err;
 }
 
-static int ext4_statfs (struct dentry * dentry, struct kstatfs * buf)
+static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf)
 {
        struct super_block *sb = dentry->d_sb;
        struct ext4_sb_info *sbi = EXT4_SB(sb);
@@ -3331,12 +3349,12 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id,
        }
        /* Journaling quota? */
        if (EXT4_SB(sb)->s_qf_names[type]) {
-               /* Quotafile not of fs root? */
+               /* Quotafile not in fs root? */
                if (nd.path.dentry->d_parent->d_inode != sb->s_root->d_inode)
                        printk(KERN_WARNING
                                "EXT4-fs: Quota file not on filesystem root. "
                                "Journaled quota will not work.\n");
-       }
+       }
 
        /*
         * When we journal data on quota file, we have to flush journal to see
index 93c5fdcdad2e3beae27e16f0c35830ce11d20db3..8954208b489328a662b68803caa8b2b9e5b59daf 100644 (file)
@@ -1512,7 +1512,7 @@ static inline void ext4_xattr_hash_entry(struct ext4_xattr_header *header,
        char *name = entry->e_name;
        int n;
 
-       for (n=0; n < entry->e_name_len; n++) {
+       for (n = 0; n < entry->e_name_len; n++) {
                hash = (hash << NAME_HASH_SHIFT) ^
                       (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^
                       *name++;
index 8707a8cfa02cdd8454056ed320ee49a4604c84f8..ddde37025ca674827d5dafe836a0956c70648f06 100644 (file)
@@ -313,6 +313,8 @@ static int fat_allow_set_time(struct msdos_sb_info *sbi, struct inode *inode)
        return 0;
 }
 
+#define TIMES_SET_FLAGS        (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)
+
 int fat_setattr(struct dentry *dentry, struct iattr *attr)
 {
        struct msdos_sb_info *sbi = MSDOS_SB(dentry->d_sb);
@@ -336,9 +338,9 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)
 
        /* Check for setting the inode time. */
        ia_valid = attr->ia_valid;
-       if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET)) {
+       if (ia_valid & TIMES_SET_FLAGS) {
                if (fat_allow_set_time(sbi, inode))
-                       attr->ia_valid &= ~(ATTR_MTIME_SET | ATTR_ATIME_SET);
+                       attr->ia_valid &= ~TIMES_SET_FLAGS;
        }
 
        error = inode_change_ok(inode, attr);
index 2eccbfaa1d48186934de93b8391e360fc77ede6d..ae08c057e751454ad2f0d922faa9be08d3c6d80d 100644 (file)
@@ -63,7 +63,7 @@ static void release_buffer_page(struct buffer_head *bh)
                goto nope;
 
        /* OK, it's a truncated page */
-       if (TestSetPageLocked(page))
+       if (!trylock_page(page))
                goto nope;
 
        page_cache_get(page);
@@ -221,7 +221,7 @@ write_out_data:
                 * blocking lock_buffer().
                 */
                if (buffer_dirty(bh)) {
-                       if (test_set_buffer_locked(bh)) {
+                       if (!trylock_buffer(bh)) {
                                BUFFER_TRACE(bh, "needs blocking lock");
                                spin_unlock(&journal->j_list_lock);
                                /* Write out all data to prevent deadlocks */
@@ -446,7 +446,7 @@ void journal_commit_transaction(journal_t *journal)
                        spin_lock(&journal->j_list_lock);
                }
                if (unlikely(!buffer_uptodate(bh))) {
-                       if (TestSetPageLocked(bh->b_page)) {
+                       if (!trylock_page(bh->b_page)) {
                                spin_unlock(&journal->j_list_lock);
                                lock_page(bh->b_page);
                                spin_lock(&journal->j_list_lock);
index f8b3be8732262f1642c0a1b4e19399bd048b964f..f2ad061e95ec93937b7b5f3adfe48fb2b446ad0d 100644 (file)
@@ -67,7 +67,7 @@ static void release_buffer_page(struct buffer_head *bh)
                goto nope;
 
        /* OK, it's a truncated page */
-       if (TestSetPageLocked(page))
+       if (!trylock_page(page))
                goto nope;
 
        page_cache_get(page);
@@ -262,8 +262,18 @@ static int journal_finish_inode_data_buffers(journal_t *journal,
                jinode->i_flags |= JI_COMMIT_RUNNING;
                spin_unlock(&journal->j_list_lock);
                err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
-               if (!ret)
-                       ret = err;
+               if (err) {
+                       /*
+                        * Because AS_EIO is cleared by
+                        * wait_on_page_writeback_range(), set it again so
+                        * that user process can get -EIO from fsync().
+                        */
+                       set_bit(AS_EIO,
+                               &jinode->i_vfs_inode->i_mapping->flags);
+
+                       if (!ret)
+                               ret = err;
+               }
                spin_lock(&journal->j_list_lock);
                jinode->i_flags &= ~JI_COMMIT_RUNNING;
                wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
@@ -670,8 +680,14 @@ start_journal_io:
         * commit block, which happens below in such setting.
         */
        err = journal_finish_inode_data_buffers(journal, commit_transaction);
-       if (err)
-               jbd2_journal_abort(journal, err);
+       if (err) {
+               char b[BDEVNAME_SIZE];
+
+               printk(KERN_WARNING
+                       "JBD2: Detected IO errors while flushing file data "
+                       "on %s\n", bdevname(journal->j_fs_dev, b));
+               err = 0;
+       }
 
        /* Lo and behold: we have just managed to send a transaction to
            the log.  Before we can commit it, wait for the IO so far to
index b26c6d9fe6aeaeadb241e5b187dcb1ac75bc8884..8207a01c4edbea2d28747d93cf069d526c446aed 100644 (file)
@@ -68,7 +68,6 @@ EXPORT_SYMBOL(jbd2_journal_set_features);
 EXPORT_SYMBOL(jbd2_journal_create);
 EXPORT_SYMBOL(jbd2_journal_load);
 EXPORT_SYMBOL(jbd2_journal_destroy);
-EXPORT_SYMBOL(jbd2_journal_update_superblock);
 EXPORT_SYMBOL(jbd2_journal_abort);
 EXPORT_SYMBOL(jbd2_journal_errno);
 EXPORT_SYMBOL(jbd2_journal_ack_err);
index 8478fc25daee196383f3e40a34999795be41585e..46763d1cd3976bca27f4d5dca5d3dd9e36d3453b 100644 (file)
@@ -127,7 +127,7 @@ enum {
        Opt_err
 };
 
-static match_table_t __initconst tokens = {
+static match_table_t __initdata tokens = {
        {Opt_port, "port=%u"},
        {Opt_rsize, "rsize=%u"},
        {Opt_wsize, "wsize=%u"},
index 00e9ccde8e42b787724bee44aedc432df37e7875..b38f944f0667351b69d947acf0e15660d995834b 100644 (file)
@@ -1194,7 +1194,7 @@ lock_retry_remap:
                tbh = bhs[i];
                if (!tbh)
                        continue;
-               if (unlikely(test_set_buffer_locked(tbh)))
+               if (!trylock_buffer(tbh))
                        BUG();
                /* The buffer dirty state is now irrelevant, just clean it. */
                clear_buffer_dirty(tbh);
index 33ff314cc5073cf9f88a3623db7129fd4ad4e772..9669541d01193813f93a7a39616511be3bca00e9 100644 (file)
@@ -665,7 +665,7 @@ lock_retry_remap:
        for (i = 0; i < nr_bhs; i++) {
                struct buffer_head *tbh = bhs[i];
 
-               if (unlikely(test_set_buffer_locked(tbh)))
+               if (!trylock_buffer(tbh))
                        continue;
                if (unlikely(buffer_uptodate(tbh))) {
                        unlock_buffer(tbh);
index 790defb847e71786e8b34358a11ccf5dfe1e0609..17d32ca6bc35b7dc5036033e1afa8b91e5ee4d38 100644 (file)
@@ -586,7 +586,7 @@ int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no,
                for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) {
                        struct buffer_head *tbh = bhs[i_bhs];
 
-                       if (unlikely(test_set_buffer_locked(tbh)))
+                       if (!trylock_buffer(tbh))
                                BUG();
                        BUG_ON(!buffer_uptodate(tbh));
                        clear_buffer_dirty(tbh);
@@ -779,7 +779,7 @@ int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync)
        for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) {
                struct buffer_head *tbh = bhs[i_bhs];
 
-               if (unlikely(test_set_buffer_locked(tbh)))
+               if (!trylock_buffer(tbh))
                        BUG();
                BUG_ON(!buffer_uptodate(tbh));
                clear_buffer_dirty(tbh);
index d865f553543651edda75b2039952f3c2c882a3ff..a95fe5984f4b24b5dc89ee2a94e424d2e97af0d3 100644 (file)
@@ -492,7 +492,8 @@ static int omfs_fill_super(struct super_block *sb, void *data, int silent)
        if (sbi->s_num_blocks != be64_to_cpu(omfs_rb->r_num_blocks)) {
                printk(KERN_ERR "omfs: block count discrepancy between "
                        "super and root blocks (%llx, %llx)\n",
-                       sbi->s_num_blocks, be64_to_cpu(omfs_rb->r_num_blocks));
+                       (unsigned long long)sbi->s_num_blocks,
+                       (unsigned long long)be64_to_cpu(omfs_rb->r_num_blocks));
                goto out_brelse_bh2;
        }
 
index 01ed610f9b87f6fc0ffe1bfa89f2177e77d07323..a28840b11b89b5ca0b544f44ce58182544f51eef 100644 (file)
@@ -2423,10 +2423,13 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole)
                        "read_bytes: %llu\n"
                        "write_bytes: %llu\n"
                        "cancelled_write_bytes: %llu\n",
-                       acct.rchar, acct.wchar,
-                       acct.syscr, acct.syscw,
-                       acct.read_bytes, acct.write_bytes,
-                       acct.cancelled_write_bytes);
+                       (unsigned long long)acct.rchar,
+                       (unsigned long long)acct.wchar,
+                       (unsigned long long)acct.syscr,
+                       (unsigned long long)acct.syscw,
+                       (unsigned long long)acct.read_bytes,
+                       (unsigned long long)acct.write_bytes,
+                       (unsigned long long)acct.cancelled_write_bytes);
 }
 
 static int proc_tid_io_accounting(struct task_struct *task, char *buffer)
index 192269698a8ac44b3b7c58a327d7fde6d35db375..5699171212ae2d3d3428c3b23c42c604d56a26ab 100644 (file)
@@ -2435,7 +2435,7 @@ static int reiserfs_write_full_page(struct page *page,
                if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) {
                        lock_buffer(bh);
                } else {
-                       if (test_set_buffer_locked(bh)) {
+                       if (!trylock_buffer(bh)) {
                                redirty_page_for_writepage(wbc, page);
                                continue;
                        }
index c8f60ee183b5b53d4799116e776f990ba6bf2d93..c21df71943a635c7eedabbf36e0ae3ac6107c770 100644 (file)
@@ -627,7 +627,7 @@ static int journal_list_still_alive(struct super_block *s,
 static void release_buffer_page(struct buffer_head *bh)
 {
        struct page *page = bh->b_page;
-       if (!page->mapping && !TestSetPageLocked(page)) {
+       if (!page->mapping && trylock_page(page)) {
                page_cache_get(page);
                put_bh(bh);
                if (!page->mapping)
@@ -855,7 +855,7 @@ static int write_ordered_buffers(spinlock_t * lock,
                jh = JH_ENTRY(list->next);
                bh = jh->bh;
                get_bh(bh);
-               if (test_set_buffer_locked(bh)) {
+               if (!trylock_buffer(bh)) {
                        if (!buffer_dirty(bh)) {
                                list_move(&jh->list, &tmp);
                                goto loop_next;
@@ -3871,7 +3871,7 @@ int reiserfs_prepare_for_journal(struct super_block *p_s_sb,
 {
        PROC_INFO_INC(p_s_sb, journal.prepare);
 
-       if (test_set_buffer_locked(bh)) {
+       if (!trylock_buffer(bh)) {
                if (!wait)
                        return 0;
                lock_buffer(bh);
index b30311ba8af6ff23ee45af51d07655e68c98fad2..1bbc6f4bb09cb850cec29e64ea34bfabe083bb3b 100644 (file)
@@ -371,7 +371,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
                         * for an in-flight io page
                         */
                        if (flags & SPLICE_F_NONBLOCK) {
-                               if (TestSetPageLocked(page)) {
+                               if (!trylock_page(page)) {
                                        error = -EAGAIN;
                                        break;
                                }
index 3e30e40aa24d04c454612565ba746f72dabfc652..3141969b456daa5223b5999607958c0b3b33557c 100644 (file)
@@ -1233,7 +1233,7 @@ static int ufs_show_options(struct seq_file *seq, struct vfsmount *vfs)
 {
        struct ufs_sb_info *sbi = UFS_SB(vfs->mnt_sb);
        unsigned mval = sbi->s_mount_opt & UFS_MOUNT_UFSTYPE;
-       const struct match_token *tp = tokens;
+       struct match_token *tp = tokens;
 
        while (tp->token != Opt_onerror_panic && tp->token != mval)
                ++tp;
index 0b211cba19098a610c222e98553d7cc968502d0d..fa47e43b8b41a525843c57cb4591ed9ffd334141 100644 (file)
@@ -675,7 +675,7 @@ xfs_probe_cluster(
                        } else
                                pg_offset = PAGE_CACHE_SIZE;
 
-                       if (page->index == tindex && !TestSetPageLocked(page)) {
+                       if (page->index == tindex && trylock_page(page)) {
                                pg_len = xfs_probe_page(page, pg_offset, mapped);
                                unlock_page(page);
                        }
@@ -759,7 +759,7 @@ xfs_convert_page(
 
        if (page->index != tindex)
                goto fail;
-       if (TestSetPageLocked(page))
+       if (!trylock_page(page))
                goto fail;
        if (PageWriteback(page))
                goto fail_unlock_page;
@@ -1104,7 +1104,7 @@ xfs_page_state_convert(
                         * that we are writing into for the first time.
                         */
                        type = IOMAP_NEW;
-                       if (!test_and_set_bit(BH_Lock, &bh->b_state)) {
+                       if (trylock_buffer(bh)) {
                                ASSERT(buffer_mapped(bh));
                                if (iomap_valid)
                                        all_bh = 1;
index b21b93eb2dbca21e20a42ba6ef447bc3a8b0ceb4..94680950ee6744ec78b68087d4861d62324e2da4 100644 (file)
@@ -9,7 +9,7 @@
  */
 #include <asm/hardware.h>
 
-#include <asm/arch-ns9xxx/regs-board-a9m9750dev.h>
+#include <asm/arch/regs-board-a9m9750dev.h>
 
                .macro  addruart,rx
                mrc     p15, 0, \rx, c1, c0
index 89a21c530468a4773916d92727ae4401fc501bd1..2f6c89ddf958cf60d152274cd551f6f4158bc5ec 100644 (file)
@@ -9,7 +9,7 @@
  * the Free Software Foundation.
  */
 #include <asm/hardware.h>
-#include <asm/arch-ns9xxx/regs-sys-common.h>
+#include <asm/arch/regs-sys-common.h>
 
                .macro  get_irqnr_preamble, base, tmp
                ldr     \base, =SYS_ISRADDR
index f7b53b65de8199af284734422138bf2aa076ab5c..3137e5ba01a9fa9501ec95a8744b8a288878d186 100644 (file)
@@ -11,7 +11,7 @@
 #ifndef __ASM_ARCH_PROCESSOR_H
 #define __ASM_ARCH_PROCESSOR_H
 
-#include <asm/arch-ns9xxx/module.h>
+#include <asm/arch/module.h>
 
 #define processor_is_ns9210()  (0                      \
                || module_is_cc7ucamry()                \
index 1348073afe48f0258331170f77df724eec02c6d5..c2941684d667b7db97233dbcb589bb593883bee6 100644 (file)
@@ -12,8 +12,8 @@
 #define __ASM_ARCH_SYSTEM_H
 
 #include <asm/proc-fns.h>
-#include <asm/arch-ns9xxx/processor.h>
-#include <asm/arch-ns9xxx/processor-ns9360.h>
+#include <asm/arch/processor.h>
+#include <asm/arch/processor-ns9360.h>
 
 static inline void arch_idle(void)
 {
index db44c5d1f1a0490d8f309530553c22685c20c897..99564c70f128e1c20f942c5152527a4d528218af 100644 (file)
@@ -154,7 +154,7 @@ struct omap_version_config {
 };
 
 
-#include <asm-arm/arch-omap/board-nokia.h>
+#include <asm/arch/board-nokia.h>
 
 struct omap_board_config_entry {
        u16 tag;
index 1e233e7d191ecea7764b2d5409326ef7a3dd7ad7..d1ea750bddfe05fbce1f9226b77ebd72a2ca1803 100644 (file)
@@ -1,4 +1,53 @@
 #ifndef _M68K_CONTREGS_H
 #define _M68K_CONTREGS_H
-#include <asm-sparc/contregs.h>
+
+/* contregs.h:  Addresses of registers in the ASI_CONTROL alternate address
+ *              space. These are for the mmu's context register, etc.
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ */
+
+/* 3=sun3
+   4=sun4 (as in sun4 sysmaint student book)
+   c=sun4c (according to davem) */
+
+#define AC_IDPROM     0x00000000    /* 34  ID PROM, R/O, byte, 32 bytes      */
+#define AC_PAGEMAP    0x10000000    /* 3   Pagemap R/W, long                 */
+#define AC_SEGMAP     0x20000000    /* 3   Segment map, byte                 */
+#define AC_CONTEXT    0x30000000    /* 34c current mmu-context               */
+#define AC_SENABLE    0x40000000    /* 34c system dvma/cache/reset enable reg*/
+#define AC_UDVMA_ENB  0x50000000    /* 34  Not used on Sun boards, byte      */
+#define AC_BUS_ERROR  0x60000000    /* 34  Not cleared on read, byte.        */
+#define AC_SYNC_ERR   0x60000000    /*  c fault type                         */
+#define AC_SYNC_VA    0x60000004    /*  c fault virtual address              */
+#define AC_ASYNC_ERR  0x60000008    /*  c asynchronous fault type            */
+#define AC_ASYNC_VA   0x6000000c    /*  c async fault virtual address        */
+#define AC_LEDS       0x70000000    /* 34  Zero turns on LEDs, byte          */
+#define AC_CACHETAGS  0x80000000    /* 34c direct access to the VAC tags     */
+#define AC_CACHEDDATA 0x90000000    /* 3 c direct access to the VAC data     */
+#define AC_UDVMA_MAP  0xD0000000    /* 4  Not used on Sun boards, byte       */
+#define AC_VME_VECTOR 0xE0000000    /* 4  For non-Autovector VME, byte       */
+#define AC_BOOT_SCC   0xF0000000    /* 34  bypass to access Zilog 8530. byte.*/
+
+/* s=Swift, h=Ross_HyperSPARC, v=TI_Viking, t=Tsunami, r=Ross_Cypress        */
+#define AC_M_PCR      0x0000        /* shv Processor Control Reg             */
+#define AC_M_CTPR     0x0100        /* shv Context Table Pointer Reg         */
+#define AC_M_CXR      0x0200        /* shv Context Register                  */
+#define AC_M_SFSR     0x0300        /* shv Synchronous Fault Status Reg      */
+#define AC_M_SFAR     0x0400        /* shv Synchronous Fault Address Reg     */
+#define AC_M_AFSR     0x0500        /*  hv Asynchronous Fault Status Reg     */
+#define AC_M_AFAR     0x0600        /*  hv Asynchronous Fault Address Reg    */
+#define AC_M_RESET    0x0700        /*  hv Reset Reg                         */
+#define AC_M_RPR      0x1000        /*  hv Root Pointer Reg                  */
+#define AC_M_TSUTRCR  0x1000        /* s   TLB Replacement Ctrl Reg          */
+#define AC_M_IAPTP    0x1100        /*  hv Instruction Access PTP            */
+#define AC_M_DAPTP    0x1200        /*  hv Data Access PTP                   */
+#define AC_M_ITR      0x1300        /*  hv Index Tag Register                */
+#define AC_M_TRCR     0x1400        /*  hv TLB Replacement Control Reg       */
+#define AC_M_SFSRX    0x1300        /* s   Synch Fault Status Reg prim       */
+#define AC_M_SFARX    0x1400        /* s   Synch Fault Address Reg prim      */
+#define AC_M_RPR1     0x1500        /*  h  Root Pointer Reg (entry 2)        */
+#define AC_M_IAPTP1   0x1600        /*  h  Instruction Access PTP (entry 2)  */
+#define AC_M_DAPTP1   0x1700        /*  h  Data Access PTP (entry 2)         */
+
 #endif /* _M68K_CONTREGS_H */
index c17edf8c7bc4df69f053eb1f3ea10fa1e6adb428..b9215a0907d3f429352edd0298dbc12dffbb8dca 100644 (file)
@@ -1 +1,330 @@
-#include <asm-sparc/fbio.h>
+#ifndef __LINUX_FBIO_H
+#define __LINUX_FBIO_H
+
+#include <linux/compiler.h>
+#include <linux/types.h>
+
+/* Constants used for fbio SunOS compatibility */
+/* (C) 1996 Miguel de Icaza */
+
+/* Frame buffer types */
+#define FBTYPE_NOTYPE           -1
+#define FBTYPE_SUN1BW           0   /* mono */
+#define FBTYPE_SUN1COLOR        1 
+#define FBTYPE_SUN2BW           2 
+#define FBTYPE_SUN2COLOR        3 
+#define FBTYPE_SUN2GP           4 
+#define FBTYPE_SUN5COLOR        5 
+#define FBTYPE_SUN3COLOR        6 
+#define FBTYPE_MEMCOLOR         7 
+#define FBTYPE_SUN4COLOR        8 
+#define FBTYPE_NOTSUN1          9 
+#define FBTYPE_NOTSUN2          10
+#define FBTYPE_NOTSUN3          11
+#define FBTYPE_SUNFAST_COLOR    12  /* cg6 */
+#define FBTYPE_SUNROP_COLOR     13
+#define FBTYPE_SUNFB_VIDEO      14
+#define FBTYPE_SUNGIFB          15
+#define FBTYPE_SUNGPLAS         16
+#define FBTYPE_SUNGP3           17
+#define FBTYPE_SUNGT            18
+#define FBTYPE_SUNLEO           19      /* zx Leo card */
+#define FBTYPE_MDICOLOR         20      /* cg14 */
+#define FBTYPE_TCXCOLOR                21      /* SUNW,tcx card */
+
+#define FBTYPE_LASTPLUSONE      21     /* This is not last + 1 in fact... */
+
+/* Does not seem to be listed in the Sun file either */
+#define FBTYPE_CREATOR          22
+#define FBTYPE_PCI_IGA1682     23
+#define FBTYPE_P9100COLOR      24
+
+#define FBTYPE_PCI_GENERIC     1000
+#define FBTYPE_PCI_MACH64      1001
+
+/* fbio ioctls */
+/* Returned by FBIOGTYPE */
+struct  fbtype {
+        int     fb_type;        /* fb type, see above */
+        int     fb_height;      /* pixels */
+        int     fb_width;       /* pixels */
+        int     fb_depth;
+        int     fb_cmsize;      /* color map entries */
+        int     fb_size;        /* fb size in bytes */
+};
+#define FBIOGTYPE _IOR('F', 0, struct fbtype)
+
+struct  fbcmap {
+        int             index;          /* first element (0 origin) */
+        int             count;
+        unsigned char   __user *red;
+        unsigned char   __user *green;
+        unsigned char   __user *blue;
+};
+
+#ifdef __KERNEL__
+#define FBIOPUTCMAP_SPARC _IOW('F', 3, struct fbcmap)
+#define FBIOGETCMAP_SPARC _IOW('F', 4, struct fbcmap)
+#else
+#define FBIOPUTCMAP _IOW('F', 3, struct fbcmap)
+#define FBIOGETCMAP _IOW('F', 4, struct fbcmap)
+#endif
+
+/* # of device specific values */
+#define FB_ATTR_NDEVSPECIFIC    8
+/* # of possible emulations */
+#define FB_ATTR_NEMUTYPES       4
+struct fbsattr {
+        int     flags;
+        int     emu_type;      /* -1 if none */
+        int     dev_specific[FB_ATTR_NDEVSPECIFIC];
+};
+struct fbgattr {
+        int     real_type;     /* real frame buffer type */
+        int     owner;         /* unknown */
+        struct fbtype fbtype;  /* real frame buffer fbtype */
+        struct fbsattr sattr;   
+        int     emu_types[FB_ATTR_NEMUTYPES]; /* supported emulations */
+};
+#define FBIOSATTR  _IOW('F', 5, struct fbgattr) /* Unsupported: */
+#define FBIOGATTR  _IOR('F', 6, struct fbgattr)        /* supported */
+
+#define FBIOSVIDEO _IOW('F', 7, int)
+#define FBIOGVIDEO _IOR('F', 8, int)
+
+struct fbcursor {
+        short set;              /* what to set, choose from the list above */
+        short enable;           /* cursor on/off */
+        struct fbcurpos pos;    /* cursor position */
+        struct fbcurpos hot;    /* cursor hot spot */
+        struct fbcmap cmap;     /* color map info */
+        struct fbcurpos size;   /* cursor bit map size */
+        char __user *image;     /* cursor image bits */
+        char __user *mask;      /* cursor mask bits */
+};
+
+/* set/get cursor attributes/shape */
+#define FBIOSCURSOR     _IOW('F', 24, struct fbcursor)
+#define FBIOGCURSOR     _IOWR('F', 25, struct fbcursor)
+/* set/get cursor position */
+#define FBIOSCURPOS     _IOW('F', 26, struct fbcurpos)
+#define FBIOGCURPOS     _IOW('F', 27, struct fbcurpos)
+/* get max cursor size */
+#define FBIOGCURMAX     _IOR('F', 28, struct fbcurpos)
+
+/* wid manipulation */
+struct fb_wid_alloc {
+#define FB_WID_SHARED_8                0
+#define FB_WID_SHARED_24       1
+#define FB_WID_DBL_8           2
+#define FB_WID_DBL_24          3
+       __u32   wa_type;
+       __s32   wa_index;       /* Set on return */
+       __u32   wa_count;       
+};
+struct fb_wid_item {
+       __u32   wi_type;
+       __s32   wi_index;
+       __u32   wi_attrs;
+       __u32   wi_values[32];
+};
+struct fb_wid_list {
+       __u32   wl_flags;
+       __u32   wl_count;
+       struct fb_wid_item      *wl_list;
+};
+
+#define FBIO_WID_ALLOC _IOWR('F', 30, struct fb_wid_alloc)
+#define FBIO_WID_FREE  _IOW('F', 31, struct fb_wid_alloc)
+#define FBIO_WID_PUT   _IOW('F', 32, struct fb_wid_list)
+#define FBIO_WID_GET   _IOWR('F', 33, struct fb_wid_list)
+
+/* Creator ioctls */
+#define FFB_IOCTL      ('F'<<8)
+#define FFB_SYS_INFO           (FFB_IOCTL|80)
+#define FFB_CLUTREAD           (FFB_IOCTL|81)
+#define FFB_CLUTPOST           (FFB_IOCTL|82)
+#define FFB_SETDIAGMODE                (FFB_IOCTL|83)
+#define FFB_GETMONITORID       (FFB_IOCTL|84)
+#define FFB_GETVIDEOMODE       (FFB_IOCTL|85)
+#define FFB_SETVIDEOMODE       (FFB_IOCTL|86)
+#define FFB_SETSERVER          (FFB_IOCTL|87)
+#define FFB_SETOVCTL           (FFB_IOCTL|88)
+#define FFB_GETOVCTL           (FFB_IOCTL|89)
+#define FFB_GETSAXNUM          (FFB_IOCTL|90)
+#define FFB_FBDEBUG            (FFB_IOCTL|91)
+
+/* Cg14 ioctls */
+#define MDI_IOCTL          ('M'<<8)
+#define MDI_RESET          (MDI_IOCTL|1)
+#define MDI_GET_CFGINFO    (MDI_IOCTL|2)
+#define MDI_SET_PIXELMODE  (MDI_IOCTL|3)
+#    define MDI_32_PIX     32
+#    define MDI_16_PIX     16
+#    define MDI_8_PIX      8
+
+struct mdi_cfginfo {
+       int     mdi_ncluts;     /* Number of implemented CLUTs in this MDI */
+        int     mdi_type;       /* FBTYPE name */
+        int     mdi_height;     /* height */
+        int     mdi_width;      /* widht */
+        int     mdi_size;       /* available ram */
+        int     mdi_mode;       /* 8bpp, 16bpp or 32bpp */
+        int     mdi_pixfreq;    /* pixel clock (from PROM) */
+};
+
+/* SparcLinux specific ioctl for the MDI, should be replaced for
+ * the SET_XLUT/SET_CLUTn ioctls instead
+ */
+#define MDI_CLEAR_XLUT       (MDI_IOCTL|9)
+
+/* leo & ffb ioctls */
+struct fb_clut_alloc {
+       __u32   clutid; /* Set on return */
+       __u32   flag;
+       __u32   index;
+};
+
+struct fb_clut {
+#define FB_CLUT_WAIT   0x00000001      /* Not yet implemented */
+       __u32   flag;
+       __u32   clutid;
+       __u32   offset;
+       __u32   count;
+       char *  red;
+       char *  green;
+       char *  blue;
+};
+
+struct fb_clut32 {
+       __u32   flag;
+       __u32   clutid;
+       __u32   offset;
+       __u32   count;
+       __u32   red;
+       __u32   green;
+       __u32   blue;
+};
+
+#define LEO_CLUTALLOC  _IOWR('L', 53, struct fb_clut_alloc)
+#define LEO_CLUTFREE   _IOW('L', 54, struct fb_clut_alloc)
+#define LEO_CLUTREAD   _IOW('L', 55, struct fb_clut)
+#define LEO_CLUTPOST   _IOW('L', 56, struct fb_clut)
+#define LEO_SETGAMMA   _IOW('L', 68, int) /* Not yet implemented */
+#define LEO_GETGAMMA   _IOR('L', 69, int) /* Not yet implemented */
+
+#ifdef __KERNEL__
+/* Addresses on the fd of a cgsix that are mappable */
+#define CG6_FBC    0x70000000
+#define CG6_TEC    0x70001000
+#define CG6_BTREGS 0x70002000
+#define CG6_FHC    0x70004000
+#define CG6_THC    0x70005000
+#define CG6_ROM    0x70006000
+#define CG6_RAM    0x70016000
+#define CG6_DHC    0x80000000
+
+#define CG3_MMAP_OFFSET 0x4000000
+
+/* Addresses on the fd of a tcx that are mappable */
+#define TCX_RAM8BIT            0x00000000
+#define TCX_RAM24BIT                   0x01000000
+#define TCX_UNK3               0x10000000
+#define TCX_UNK4               0x20000000
+#define TCX_CONTROLPLANE       0x28000000
+#define TCX_UNK6               0x30000000
+#define TCX_UNK7               0x38000000
+#define TCX_TEC                0x70000000
+#define TCX_BTREGS             0x70002000
+#define TCX_THC                0x70004000
+#define TCX_DHC                0x70008000
+#define TCX_ALT                        0x7000a000
+#define TCX_SYNC               0x7000e000
+#define TCX_UNK2               0x70010000
+
+/* CG14 definitions */
+
+/* Offsets into the OBIO space: */
+#define CG14_REGS        0       /* registers */
+#define CG14_CURSORREGS  0x1000  /* cursor registers */
+#define CG14_DACREGS     0x2000  /* DAC registers */
+#define CG14_XLUT        0x3000  /* X Look Up Table -- ??? */
+#define CG14_CLUT1       0x4000  /* Color Look Up Table */
+#define CG14_CLUT2       0x5000  /* Color Look Up Table */
+#define CG14_CLUT3       0x6000  /* Color Look Up Table */
+#define CG14_AUTO       0xf000
+
+#endif /* KERNEL */
+
+/* These are exported to userland for applications to use */
+/* Mappable offsets for the cg14: control registers */
+#define MDI_DIRECT_MAP 0x10000000
+#define MDI_CTLREG_MAP 0x20000000
+#define MDI_CURSOR_MAP 0x30000000
+#define MDI_SHDW_VRT_MAP 0x40000000
+
+/* Mappable offsets for the cg14: frame buffer resolutions */
+/* 32 bits */
+#define MDI_CHUNKY_XBGR_MAP 0x50000000
+#define MDI_CHUNKY_BGR_MAP 0x60000000
+
+/* 16 bits */
+#define MDI_PLANAR_X16_MAP 0x70000000
+#define MDI_PLANAR_C16_MAP 0x80000000
+
+/* 8 bit is done as CG3 MMAP offset */
+/* 32 bits, planar */
+#define MDI_PLANAR_X32_MAP 0x90000000
+#define MDI_PLANAR_B32_MAP 0xa0000000
+#define MDI_PLANAR_G32_MAP 0xb0000000
+#define MDI_PLANAR_R32_MAP 0xc0000000
+
+/* Mappable offsets on leo */
+#define LEO_SS0_MAP            0x00000000
+#define LEO_LC_SS0_USR_MAP     0x00800000
+#define LEO_LD_SS0_MAP         0x00801000
+#define LEO_LX_CURSOR_MAP      0x00802000
+#define LEO_SS1_MAP            0x00803000
+#define LEO_LC_SS1_USR_MAP     0x01003000
+#define LEO_LD_SS1_MAP         0x01004000
+#define LEO_UNK_MAP            0x01005000
+#define LEO_LX_KRN_MAP         0x01006000
+#define LEO_LC_SS0_KRN_MAP     0x01007000
+#define LEO_LC_SS1_KRN_MAP     0x01008000
+#define LEO_LD_GBL_MAP         0x01009000
+#define LEO_UNK2_MAP           0x0100a000
+
+#ifdef __KERNEL__
+struct  fbcmap32 {
+       int             index;          /* first element (0 origin) */
+       int             count;
+       u32             red;
+       u32             green;
+       u32             blue;
+};
+
+#define FBIOPUTCMAP32  _IOW('F', 3, struct fbcmap32)
+#define FBIOGETCMAP32  _IOW('F', 4, struct fbcmap32)
+
+struct fbcursor32 {
+       short set;              /* what to set, choose from the list above */
+       short enable;           /* cursor on/off */
+       struct fbcurpos pos;    /* cursor position */
+       struct fbcurpos hot;    /* cursor hot spot */
+       struct fbcmap32 cmap;   /* color map info */
+       struct fbcurpos size;   /* cursor bit map size */
+       u32     image;          /* cursor image bits */
+       u32     mask;           /* cursor mask bits */
+};
+
+#define FBIOSCURSOR32  _IOW('F', 24, struct fbcursor32)
+#define FBIOGCURSOR32  _IOW('F', 25, struct fbcursor32)
+#endif
+
+#endif /* __LINUX_FBIO_H */
index 4349eaf3cfe40f0fc0d6fe1357b1ac6f2d7413c3..160616a89e05159f105a84befa7fc4d89b7c81e3 100644 (file)
@@ -1,6 +1,25 @@
 #ifndef _M68K_IDPROM_H
 #define _M68K_IDPROM_H
-#include <asm-sparc/idprom.h>
+/*
+ * idprom.h: Macros and defines for idprom routines
+ *
+ * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu)
+ */
+
+#include <linux/types.h>
+
+struct idprom {
+       u8              id_format;      /* Format identifier (always 0x01) */
+       u8              id_machtype;    /* Machine type */
+       u8              id_ethaddr[6];  /* Hardware ethernet address */
+       s32             id_date;        /* Date of manufacture */
+       u32             id_sernum:24;   /* Unique serial number */
+       u8              id_cksum;       /* Checksum - xor of the data bytes */
+       u8              reserved[16];
+};
+
+extern struct idprom *idprom;
+extern void idprom_init(void);
 
 /* Sun3: in control space */
 #define SUN3_IDPROM_BASE       0x00000000
index 50cfe8ceb478508c3fd587fbe8109f0ad146259e..eadaab44015f62e4fa04ab003828945d6c6bf503 100644 (file)
@@ -115,7 +115,6 @@ BUFFER_FNS(Uptodate, uptodate)
 BUFFER_FNS(Dirty, dirty)
 TAS_BUFFER_FNS(Dirty, dirty)
 BUFFER_FNS(Lock, locked)
-TAS_BUFFER_FNS(Lock, locked)
 BUFFER_FNS(Req, req)
 TAS_BUFFER_FNS(Req, req)
 BUFFER_FNS(Mapped, mapped)
@@ -321,10 +320,15 @@ static inline void wait_on_buffer(struct buffer_head *bh)
                __wait_on_buffer(bh);
 }
 
+static inline int trylock_buffer(struct buffer_head *bh)
+{
+       return likely(!test_and_set_bit(BH_Lock, &bh->b_state));
+}
+
 static inline void lock_buffer(struct buffer_head *bh)
 {
        might_sleep();
-       if (test_set_buffer_locked(bh))
+       if (!trylock_buffer(bh))
                __lock_buffer(bh);
 }
 
index b846bc44a27ed62a62c6c30cf69ed2897579e7f1..87c12ed969548a233a8f9d8e8440ed0bc972a566 100644 (file)
@@ -219,18 +219,7 @@ static inline int __ide_default_irq(unsigned long base)
 #include <asm-generic/ide_iops.h>
 #endif
 
-#ifndef MAX_HWIFS
-#if defined(CONFIG_BLACKFIN) || defined(CONFIG_H8300) || defined(CONFIG_XTENSA)
-# define MAX_HWIFS     1
-#else
-# define MAX_HWIFS     10
-#endif
-#endif
-
-#if !defined(MAX_HWIFS) || defined(CONFIG_EMBEDDED)
-#undef MAX_HWIFS
-#define MAX_HWIFS      CONFIG_IDE_MAX_HWIFS
-#endif
+#define MAX_HWIFS      10
 
 /* Currently only m68k, apus and m8xx need it */
 #ifndef IDE_ARCH_ACK_INTR
@@ -509,24 +498,33 @@ struct ide_tp_ops {
 
 extern const struct ide_tp_ops default_tp_ops;
 
+/**
+ * struct ide_port_ops - IDE port operations
+ *
+ * @init_dev:          host specific initialization of a device
+ * @set_pio_mode:      routine to program host for PIO mode
+ * @set_dma_mode:      routine to program host for DMA mode
+ * @selectproc:                tweaks hardware to select drive
+ * @reset_poll:                chipset polling based on hba specifics
+ * @pre_reset:         chipset specific changes to default for device-hba resets
+ * @resetproc:         routine to reset controller after a disk reset
+ * @maskproc:          special host masking for drive selection
+ * @quirkproc:         check host's drive quirk list
+ *
+ * @mdma_filter:       filter MDMA modes
+ * @udma_filter:       filter UDMA modes
+ *
+ * @cable_detect:      detect cable type
+ */
 struct ide_port_ops {
-       /* host specific initialization of a device */
        void    (*init_dev)(ide_drive_t *);
-       /* routine to program host for PIO mode */
        void    (*set_pio_mode)(ide_drive_t *, const u8);
-       /* routine to program host for DMA mode */
        void    (*set_dma_mode)(ide_drive_t *, const u8);
-       /* tweaks hardware to select drive */
        void    (*selectproc)(ide_drive_t *);
-       /* chipset polling based on hba specifics */
        int     (*reset_poll)(ide_drive_t *);
-       /* chipset specific changes to default for device-hba resets */
        void    (*pre_reset)(ide_drive_t *);
-       /* routine to reset controller after a disk reset */
        void    (*resetproc)(ide_drive_t *);
-       /* special host masking for drive selection */
        void    (*maskproc)(ide_drive_t *, int);
-       /* check host's drive quirk list */
        void    (*quirkproc)(ide_drive_t *);
 
        u8      (*mdma_filter)(ide_drive_t *);
index 2baace2788a7d73cffcd12396ea2aa37dd117963..31d8629e75a15f55ae59d8d4e936dab96f9fa396 100644 (file)
@@ -18,7 +18,7 @@ struct ihex_binrec {
        __be32 addr;
        __be16 len;
        uint8_t data[0];
-} __attribute__((aligned(4)));
+} __attribute__((packed));
 
 /* Find the next record, taking into account the 4-byte alignment */
 static inline const struct ihex_binrec *
index 62aa4f895abe9fde4bd0fcbac99a9da71ceb0c63..58ff4e74b2f362bcc2078e76e9c5d10bdfba1f83 100644 (file)
@@ -223,35 +223,6 @@ static inline int disable_irq_wake(unsigned int irq)
 #define or_softirq_pending(x)  (local_softirq_pending() |= (x))
 #endif
 
-/*
- * Temporary defines for UP kernels, until all code gets fixed.
- */
-#ifndef CONFIG_SMP
-static inline void __deprecated cli(void)
-{
-       local_irq_disable();
-}
-static inline void __deprecated sti(void)
-{
-       local_irq_enable();
-}
-static inline void __deprecated save_flags(unsigned long *x)
-{
-       local_save_flags(*x);
-}
-#define save_flags(x) save_flags(&x)
-static inline void __deprecated restore_flags(unsigned long x)
-{
-       local_irq_restore(x);
-}
-
-static inline void __deprecated save_and_cli(unsigned long *x)
-{
-       local_irq_save(*x);
-}
-#define save_and_cli(x)        save_and_cli(&x)
-#endif /* CONFIG_SMP */
-
 /* Some architectures might implement lazy enabling/disabling of
  * interrupts. In some cases, such as stop_machine, we might want
  * to ensure that after a local_irq_disable(), interrupts have
index 82f88a8a827b4a41adc4199a38605d7dac7dd680..32110cede64fd23554f1c8c5a24233d5a63f14ab 100644 (file)
@@ -130,8 +130,8 @@ void vmcoreinfo_append_str(const char *fmt, ...)
        __attribute__ ((format (printf, 1, 2)));
 unsigned long paddr_vmcoreinfo_note(void);
 
-#define VMCOREINFO_OSRELEASE(name) \
-       vmcoreinfo_append_str("OSRELEASE=%s\n", #name)
+#define VMCOREINFO_OSRELEASE(value) \
+       vmcoreinfo_append_str("OSRELEASE=%s\n", value)
 #define VMCOREINFO_PAGESIZE(value) \
        vmcoreinfo_append_str("PAGESIZE=%ld\n", value)
 #define VMCOREINFO_SYMBOL(name) \
index 5c948f337817da7bb1386826d84f4e9f52e3d49a..8f2d60da04e757f1e1c5a9bbd26f486916a419da 100644 (file)
@@ -37,7 +37,7 @@
  */
 #define        MISDN_MAJOR_VERSION     1
 #define        MISDN_MINOR_VERSION     0
-#define MISDN_RELEASE          18
+#define MISDN_RELEASE          19
 
 /* primitives for information exchange
  * generell format
@@ -242,7 +242,8 @@ struct mISDNhead {
 #define TEI_SAPI               63
 #define CTRL_SAPI              0
 
-#define MISDN_CHMAP_SIZE       4
+#define MISDN_MAX_CHANNEL      127
+#define MISDN_CHMAP_SIZE       ((MISDN_MAX_CHANNEL + 1) >> 3)
 
 #define SOL_MISDN      0
 
@@ -275,11 +276,32 @@ struct mISDN_devinfo {
        u_int                   Dprotocols;
        u_int                   Bprotocols;
        u_int                   protocol;
-       u_long                  channelmap[MISDN_CHMAP_SIZE];
+       u_char                  channelmap[MISDN_CHMAP_SIZE];
        u_int                   nrbchan;
        char                    name[MISDN_MAX_IDLEN];
 };
 
+static inline int
+test_channelmap(u_int nr, u_char *map)
+{
+       if (nr <= MISDN_MAX_CHANNEL)
+               return map[nr >> 3] & (1 << (nr & 7));
+       else
+               return 0;
+}
+
+static inline void
+set_channelmap(u_int nr, u_char *map)
+{
+       map[nr >> 3] |= (1 << (nr & 7));
+}
+
+static inline void
+clear_channelmap(u_int nr, u_char *map)
+{
+       map[nr >> 3] &= ~(1 << (nr & 7));
+}
+
 /* CONTROL_CHANNEL parameters */
 #define MISDN_CTRL_GETOP               0x0000
 #define MISDN_CTRL_LOOP                        0x0001
@@ -405,7 +427,7 @@ struct mISDNdevice {
        u_int                   Dprotocols;
        u_int                   Bprotocols;
        u_int                   nrbchan;
-       u_long                  channelmap[MISDN_CHMAP_SIZE];
+       u_char                  channelmap[MISDN_CHMAP_SIZE];
        struct list_head        bchannels;
        struct mISDNchannel     *teimgr;
        struct device           dev;
@@ -430,7 +452,7 @@ struct mISDNstack {
 #endif
 };
 
-/* global alloc/queue dunctions */
+/* global alloc/queue functions */
 
 static inline struct sk_buff *
 mI_alloc_skb(unsigned int len, gfp_t gfp_mask)
index c853b10660183af6b27df8af218ac5478d124334..c23d3f51ba4090ec2aa9c99a734e50216e9bcca5 100644 (file)
@@ -51,7 +51,6 @@ struct maple_devinfo {
 struct maple_device {
        struct maple_driver *driver;
        struct mapleq *mq;
-       void *private_data;
        void (*callback) (struct mapleq * mq);
        unsigned long when, interval, function;
        struct maple_devinfo devinfo;
@@ -70,7 +69,9 @@ void maple_getcond_callback(struct maple_device *dev,
                            void (*callback) (struct mapleq * mq),
                            unsigned long interval,
                            unsigned long function);
-int maple_driver_register(struct device_driver *drv);
+int maple_driver_register(struct maple_driver *);
+void maple_driver_unregister(struct maple_driver *);
+
 int maple_add_packet_sleeps(struct maple_device *mdev, u32 function,
        u32 command, u32 length, void *data);
 void maple_clear_dev(struct maple_device *mdev);
@@ -78,4 +79,7 @@ void maple_clear_dev(struct maple_device *mdev);
 #define to_maple_dev(n) container_of(n, struct maple_device, dev)
 #define to_maple_driver(n) container_of(n, struct maple_driver, drv)
 
+#define maple_get_drvdata(d)           dev_get_drvdata(&(d)->dev)
+#define maple_set_drvdata(d,p)         dev_set_drvdata(&(d)->dev, (p))
+
 #endif                         /* __LINUX_MAPLE_H */
index 25aaccdb2f26ea3f091939764882d86bffa901ad..c74d3e87531420faf4e6a65b075ae078ff6277c3 100644 (file)
@@ -163,7 +163,7 @@ static inline int Page##uname(struct page *page)                    \
 
 struct page;   /* forward declaration */
 
-PAGEFLAG(Locked, locked) TESTSCFLAG(Locked, locked)
+TESTPAGEFLAG(Locked, locked)
 PAGEFLAG(Error, error)
 PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced)
 PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty)
index 69ed3cb1197ac942b8d982e395fb48d5ecdbb29b..5da31c12101c2e459524f0073a0af4f2f5dd7357 100644 (file)
@@ -250,29 +250,6 @@ static inline struct page *read_mapping_page(struct address_space *mapping,
        return read_cache_page(mapping, index, filler, data);
 }
 
-int add_to_page_cache_locked(struct page *page, struct address_space *mapping,
-                               pgoff_t index, gfp_t gfp_mask);
-int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
-                               pgoff_t index, gfp_t gfp_mask);
-extern void remove_from_page_cache(struct page *page);
-extern void __remove_from_page_cache(struct page *page);
-
-/*
- * Like add_to_page_cache_locked, but used to add newly allocated pages:
- * the page is new, so we can just run SetPageLocked() against it.
- */
-static inline int add_to_page_cache(struct page *page,
-               struct address_space *mapping, pgoff_t offset, gfp_t gfp_mask)
-{
-       int error;
-
-       SetPageLocked(page);
-       error = add_to_page_cache_locked(page, mapping, offset, gfp_mask);
-       if (unlikely(error))
-               ClearPageLocked(page);
-       return error;
-}
-
 /*
  * Return byte-offset into filesystem object for page.
  */
@@ -294,13 +271,28 @@ extern int __lock_page_killable(struct page *page);
 extern void __lock_page_nosync(struct page *page);
 extern void unlock_page(struct page *page);
 
+static inline void set_page_locked(struct page *page)
+{
+       set_bit(PG_locked, &page->flags);
+}
+
+static inline void clear_page_locked(struct page *page)
+{
+       clear_bit(PG_locked, &page->flags);
+}
+
+static inline int trylock_page(struct page *page)
+{
+       return !test_and_set_bit(PG_locked, &page->flags);
+}
+
 /*
  * lock_page may only be called if we have the page's inode pinned.
  */
 static inline void lock_page(struct page *page)
 {
        might_sleep();
-       if (TestSetPageLocked(page))
+       if (!trylock_page(page))
                __lock_page(page);
 }
 
@@ -312,7 +304,7 @@ static inline void lock_page(struct page *page)
 static inline int lock_page_killable(struct page *page)
 {
        might_sleep();
-       if (TestSetPageLocked(page))
+       if (!trylock_page(page))
                return __lock_page_killable(page);
        return 0;
 }
@@ -324,7 +316,7 @@ static inline int lock_page_killable(struct page *page)
 static inline void lock_page_nosync(struct page *page)
 {
        might_sleep();
-       if (TestSetPageLocked(page))
+       if (!trylock_page(page))
                __lock_page_nosync(page);
 }
        
@@ -409,4 +401,27 @@ static inline int fault_in_pages_readable(const char __user *uaddr, int size)
        return ret;
 }
 
+int add_to_page_cache_locked(struct page *page, struct address_space *mapping,
+                               pgoff_t index, gfp_t gfp_mask);
+int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
+                               pgoff_t index, gfp_t gfp_mask);
+extern void remove_from_page_cache(struct page *page);
+extern void __remove_from_page_cache(struct page *page);
+
+/*
+ * Like add_to_page_cache_locked, but used to add newly allocated pages:
+ * the page is new, so we can just run set_page_locked() against it.
+ */
+static inline int add_to_page_cache(struct page *page,
+               struct address_space *mapping, pgoff_t offset, gfp_t gfp_mask)
+{
+       int error;
+
+       set_page_locked(page);
+       error = add_to_page_cache_locked(page, mapping, offset, gfp_mask);
+       if (unlikely(error))
+               clear_page_locked(page);
+       return error;
+}
+
 #endif /* _LINUX_PAGEMAP_H */
index cc554ca8bc7836401807ec1359a13f44f679c908..7dcd050757567eb94265fb12b29d6f79e5cbcb3f 100644 (file)
@@ -14,7 +14,7 @@ struct match_token {
        const char *pattern;
 };
 
-typedef const struct match_token match_table_t[];
+typedef struct match_token match_table_t[];
 
 /* Maximum number of arguments that match_token will find in a pattern */
 enum {MAX_OPT_ARGS = 3};
index 2e4e97bd19f73ad9a2db3d43fef923a7af7e28af..d74f75ed1e47a86d8ef526f6929a57bcd5a0da34 100644 (file)
@@ -1,6 +1,6 @@
 /* interface for the pm_qos_power infrastructure of the linux kernel.
  *
- * Mark Gross
+ * Mark Gross <mgross@linux.intel.com>
  */
 #include <linux/list.h>
 #include <linux/notifier.h>
diff --git a/include/linux/spi/orion_spi.h b/include/linux/spi/orion_spi.h
new file mode 100644 (file)
index 0000000..b4d9fa6
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * orion_spi.h
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __LINUX_SPI_ORION_SPI_H
+#define __LINUX_SPI_ORION_SPI_H
+
+struct orion_spi_info {
+       u32     tclk;           /* no <linux/clk.h> support yet */
+};
+
+
+#endif
index 12532839f508da4d7692beaf7191c9711a78a556..ab3ef7aefa9593dcfcf3f531666eba2c1c8f2a2f 100644 (file)
@@ -487,6 +487,9 @@ static inline int tracehook_notify_jctl(int notify, int why)
        return notify || (current->ptrace & PT_PTRACED);
 }
 
+#define DEATH_REAP                     -1
+#define DEATH_DELAYED_GROUP_LEADER     -2
+
 /**
  * tracehook_notify_death - task is dead, ready to notify parent
  * @task:              @current task now exiting
@@ -501,8 +504,6 @@ static inline int tracehook_notify_jctl(int notify, int why)
  *
  * Called with write_lock_irq(&tasklist_lock) held.
  */
-#define DEATH_REAP                     -1
-#define DEATH_DELAYED_GROUP_LEADER     -2
 static inline int tracehook_notify_death(struct task_struct *task,
                                         void **death_cookie, int group_dead)
 {
index 8c8119ffee1204cf42dc6a4210fb15d435ddf7f0..1c78d56c57e546cf6492e075e6c5ad5604144457 100644 (file)
@@ -86,6 +86,7 @@ int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc);
 #define con_copy_unimap(d, s) (0)
 #define con_get_unimap(vc, ct, uct, list) (-EINVAL)
 #define con_free_unimap(vc) do { ; } while (0)
+#define con_protect_unimap(vc, rdonly) do { ; } while (0)
 
 #define vc_translate(vc, c) (c)
 #endif
index 291d56a19167db9b8688dbbba446d051daae3b17..9cecc409f0f8418cea3e547447e210d8304f4178 100644 (file)
@@ -140,8 +140,7 @@ struct scsi_device {
        unsigned fix_capacity:1;        /* READ_CAPACITY is too high by 1 */
        unsigned guess_capacity:1;      /* READ_CAPACITY might be too high by 1 */
        unsigned retry_hwerror:1;       /* Retry HARDWARE_ERROR */
-       unsigned last_sector_bug:1;     /* do not use multisector accesses on
-                                          SD_LAST_BUGGY_SECTORS */
+       unsigned last_sector_bug:1;     /* Always read last sector in a 1 sector read */
 
        DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
        struct list_head event_list;    /* asserted events */
index 83467e18f5e96337ee550f26f35bcd8ac9f0c36b..95a1f2038b1db145f07b76813cd55c4908fb1859 100644 (file)
 
 
 /* DSTCACHE_CTLSTAT bit constants */
-#define RB2D_DC_FLUSH                             (3 << 0)
-#define RB2D_DC_FLUSH_ALL                         0xf
+#define RB2D_DC_FLUSH_2D                          (1 << 0)
+#define RB2D_DC_FREE_2D                                   (1 << 2)
+#define RB2D_DC_FLUSH_ALL                         (RB2D_DC_FLUSH_2D | RB2D_DC_FREE_2D)
 #define RB2D_DC_BUSY                              (1 << 31)
 
 
index 9c3b68b86ca055ebd4d5236cf6217b9b35e7f877..0bc7e167bf4556c63dde64eb249a1880b6675548 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/init.h>
 #include <linux/smp_lock.h>
 #include <linux/initrd.h>
-#include <linux/hdreg.h>
 #include <linux/bootmem.h>
 #include <linux/tty.h>
 #include <linux/gfp.h>
index 496c3dd372761a4862791658d7635db3fca87e65..972f8e61d36ac4ca7742038b2a3f3004f1857eb9 100644 (file)
@@ -243,6 +243,9 @@ static inline int open_arg(int flags, int mask)
 
 static int audit_match_perm(struct audit_context *ctx, int mask)
 {
+       if (unlikely(!ctx))
+               return 0;
+
        unsigned n = ctx->major;
        switch (audit_classify_syscall(ctx->arch, n)) {
        case 0: /* native */
@@ -284,6 +287,10 @@ static int audit_match_filetype(struct audit_context *ctx, int which)
 {
        unsigned index = which & ~S_IFMT;
        mode_t mode = which & S_IFMT;
+
+       if (unlikely(!ctx))
+               return 0;
+
        if (index >= ctx->name_count)
                return 0;
        if (ctx->names[index].ino == -1)
index 7517115a8cce604cd9535d327d1ab7e12dce2f7a..91e96950cd521b442dd3388e976489e83df8f101 100644 (file)
@@ -77,15 +77,14 @@ void *dma_mark_declared_memory_occupied(struct device *dev,
 {
        struct dma_coherent_mem *mem = dev->dma_mem;
        int pos, err;
-       int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1);
 
-       pages >>= PAGE_SHIFT;
+       size += device_addr & ~PAGE_MASK;
 
        if (!mem)
                return ERR_PTR(-EINVAL);
 
        pos = (device_addr - mem->device_base) >> PAGE_SHIFT;
-       err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));
+       err = bitmap_allocate_region(mem->bitmap, pos, get_order(size));
        if (err != 0)
                return ERR_PTR(err);
        return mem->virt_base + (pos << PAGE_SHIFT);
index 152abfd3589f8fe77ea7e0e60a20b7812c7a1b0f..0314074fa232e72370db9e62b50cdc98a8d53f6a 100644 (file)
@@ -323,7 +323,8 @@ static int __irq_set_trigger(struct irq_chip *chip, unsigned int irq,
        ret = chip->set_type(irq, flags & IRQF_TRIGGER_MASK);
 
        if (ret)
-               pr_err("setting flow type for irq %u failed (%pF)\n",
+               pr_err("setting trigger mode %d for irq %u failed (%pF)\n",
+                               (int)(flags & IRQF_TRIGGER_MASK),
                                irq, chip->set_type);
 
        return ret;
index 8cb757026386f35f7f12e78cc0caef204ea93cb0..da9c2dda6a4e8ea8330841aee41851c022ab95ef 100644 (file)
@@ -24,7 +24,7 @@
  * requirement that the application has is cleaned up when closes the file
  * pointer or exits the pm_qos_object will get an opportunity to clean up.
  *
- * mark gross mgross@linux.intel.com
+ * Mark Gross <mgross@linux.intel.com>
  */
 
 #include <linux/pm_qos_params.h>
@@ -211,8 +211,8 @@ EXPORT_SYMBOL_GPL(pm_qos_requirement);
  * @value: defines the qos request
  *
  * This function inserts a new entry in the pm_qos_class list of requested qos
- * performance charactoistics.  It recomputes the agregate QoS expectations for
- * the pm_qos_class of parrameters.
+ * performance characteristics.  It recomputes the aggregate QoS expectations
+ * for the pm_qos_class of parameters.
  */
 int pm_qos_add_requirement(int pm_qos_class, char *name, s32 value)
 {
@@ -250,10 +250,10 @@ EXPORT_SYMBOL_GPL(pm_qos_add_requirement);
  * @name: identifies the request
  * @value: defines the qos request
  *
- * Updates an existing qos requierement for the pm_qos_class of parameters along
+ * Updates an existing qos requirement for the pm_qos_class of parameters along
  * with updating the target pm_qos_class value.
  *
- * If the named request isn't in the lest then no change is made.
+ * If the named request isn't in the list then no change is made.
  */
 int pm_qos_update_requirement(int pm_qos_class, char *name, s32 new_value)
 {
@@ -287,7 +287,7 @@ EXPORT_SYMBOL_GPL(pm_qos_update_requirement);
  * @pm_qos_class: identifies which list of qos request to us
  * @name: identifies the request
  *
- * Will remove named qos request from pm_qos_class list of parrameters and
+ * Will remove named qos request from pm_qos_class list of parameters and
  * recompute the current target value for the pm_qos_class.
  */
 void pm_qos_remove_requirement(int pm_qos_class, char *name)
@@ -319,7 +319,7 @@ EXPORT_SYMBOL_GPL(pm_qos_remove_requirement);
  * @notifier: notifier block managed by caller.
  *
  * will register the notifier into a notification chain that gets called
- * uppon changes to the pm_qos_class target value.
+ * upon changes to the pm_qos_class target value.
  */
  int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier)
 {
@@ -338,7 +338,7 @@ EXPORT_SYMBOL_GPL(pm_qos_add_notifier);
  * @notifier: notifier block to be removed.
  *
  * will remove the notifier from the notification chain that gets called
- * uppon changes to the pm_qos_class target value.
+ * upon changes to the pm_qos_class target value.
  */
 int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier)
 {
index 04006ef970b818b01d6cb152c5a5997896a06478..8d13a7855c0808858c20fd01d6decebc08c8eeaa 100644 (file)
@@ -944,6 +944,10 @@ static void relay_file_read_consume(struct rchan_buf *buf,
        size_t n_subbufs = buf->chan->n_subbufs;
        size_t read_subbuf;
 
+       if (buf->subbufs_produced == buf->subbufs_consumed &&
+           buf->offset == buf->bytes_consumed)
+               return;
+
        if (buf->bytes_consumed + bytes_consumed > subbuf_size) {
                relay_subbufs_consumed(buf->chan, buf->cpu, 1);
                buf->bytes_consumed = 0;
@@ -975,6 +979,8 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos)
 
        relay_file_read_consume(buf, read_pos, 0);
 
+       consumed = buf->subbufs_consumed;
+
        if (unlikely(buf->offset > subbuf_size)) {
                if (produced == consumed)
                        return 0;
@@ -993,8 +999,12 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos)
        if (consumed > produced)
                produced += n_subbufs * subbuf_size;
 
-       if (consumed == produced)
+       if (consumed == produced) {
+               if (buf->offset == subbuf_size &&
+                   buf->subbufs_produced > buf->subbufs_consumed)
+                       return 1;
                return 0;
+       }
 
        return 1;
 }
index 21f7da94662e20fb5bd31182d784ca02420495c3..04160d277e7aeafe5b34e58da1bcb5a786b1696d 100644 (file)
@@ -5004,19 +5004,21 @@ recheck:
                        return -EPERM;
        }
 
+       if (user) {
 #ifdef CONFIG_RT_GROUP_SCHED
-       /*
-        * Do not allow realtime tasks into groups that have no runtime
-        * assigned.
-        */
-       if (user
-           && rt_policy(policy) && task_group(p)->rt_bandwidth.rt_runtime == 0)
-               return -EPERM;
+               /*
+                * Do not allow realtime tasks into groups that have no runtime
+                * assigned.
+                */
+               if (rt_policy(policy) && task_group(p)->rt_bandwidth.rt_runtime == 0)
+                       return -EPERM;
 #endif
 
-       retval = security_task_setscheduler(p, policy, param);
-       if (retval)
-               return retval;
+               retval = security_task_setscheduler(p, policy, param);
+               if (retval)
+                       return retval;
+       }
+
        /*
         * make sure no PI-waiters arrive (or leave) while we are
         * changing the priority of the task:
index aaaeae8244e77aa7dffd26ff935e7e3260c58a97..94a62c0d4ade651b8c4e2a5c7cbb8ff26110738f 100644 (file)
@@ -212,9 +212,7 @@ static inline int __sched __down_common(struct semaphore *sem, long state,
        waiter.up = 0;
 
        for (;;) {
-               if (state == TASK_INTERRUPTIBLE && signal_pending(task))
-                       goto interrupted;
-               if (state == TASK_KILLABLE && fatal_signal_pending(task))
+               if (signal_pending_state(state, task))
                        goto interrupted;
                if (timeout <= 0)
                        goto timed_out;
index d97d1ad554737b7ced08ccab05891324faa01860..54e9686508550b198b4779df048bbfe46b2ddb08 100644 (file)
@@ -558,14 +558,14 @@ EXPORT_SYMBOL(wait_on_page_bit);
  * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep.
  *
  * The first mb is necessary to safely close the critical section opened by the
- * TestSetPageLocked(), the second mb is necessary to enforce ordering between
- * the clear_bit and the read of the waitqueue (to avoid SMP races with a
- * parallel wait_on_page_locked()).
+ * test_and_set_bit() to lock the page; the second mb is necessary to enforce
+ * ordering between the clear_bit and the read of the waitqueue (to avoid SMP
+ * races with a parallel wait_on_page_locked()).
  */
 void unlock_page(struct page *page)
 {
        smp_mb__before_clear_bit();
-       if (!TestClearPageLocked(page))
+       if (!test_and_clear_bit(PG_locked, &page->flags))
                BUG();
        smp_mb__after_clear_bit(); 
        wake_up_page(page, PG_locked);
@@ -931,7 +931,7 @@ grab_cache_page_nowait(struct address_space *mapping, pgoff_t index)
        struct page *page = find_get_page(mapping, index);
 
        if (page) {
-               if (!TestSetPageLocked(page))
+               if (trylock_page(page))
                        return page;
                page_cache_release(page);
                return NULL;
@@ -1027,7 +1027,7 @@ find_page:
                        if (inode->i_blkbits == PAGE_CACHE_SHIFT ||
                                        !mapping->a_ops->is_partially_uptodate)
                                goto page_not_up_to_date;
-                       if (TestSetPageLocked(page))
+                       if (!trylock_page(page))
                                goto page_not_up_to_date;
                        if (!mapping->a_ops->is_partially_uptodate(page,
                                                                desc, offset))
index 6793b9c681074ffb63b3c01765a5cc75aac462ec..1002f473f497c37f34c5c33d4dfa7d2bd49faed0 100644 (file)
@@ -1789,7 +1789,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
         * not dirty accountable.
         */
        if (PageAnon(old_page)) {
-               if (!TestSetPageLocked(old_page)) {
+               if (trylock_page(old_page)) {
                        reuse = can_share_swap_page(old_page);
                        unlock_page(old_page);
                }
@@ -2765,16 +2765,26 @@ int make_pages_present(unsigned long addr, unsigned long end)
 
        vma = find_vma(current->mm, addr);
        if (!vma)
-               return -1;
+               return -ENOMEM;
        write = (vma->vm_flags & VM_WRITE) != 0;
        BUG_ON(addr >= end);
        BUG_ON(end > vma->vm_end);
        len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE;
        ret = get_user_pages(current, current->mm, addr,
                        len, write, 0, NULL, NULL);
-       if (ret < 0)
+       if (ret < 0) {
+               /*
+                  SUS require strange return value to mlock
+                   - invalid addr generate to ENOMEM.
+                   - out of memory should generate EAGAIN.
+               */
+               if (ret == -EFAULT)
+                       ret = -ENOMEM;
+               else if (ret == -ENOMEM)
+                       ret = -EAGAIN;
                return ret;
-       return ret == len ? 0 : -1;
+       }
+       return ret == len ? 0 : -ENOMEM;
 }
 
 #if !defined(__HAVE_ARCH_GATE_AREA)
index 153572fb60b8debb24359e195e7a53b50f8e1c37..2a80136b23bbc16fb9d2ec2fad932b29e30dda50 100644 (file)
@@ -605,7 +605,7 @@ static int move_to_new_page(struct page *newpage, struct page *page)
         * establishing additional references. We are the only one
         * holding a reference to the new page at this point.
         */
-       if (TestSetPageLocked(newpage))
+       if (!trylock_page(newpage))
                BUG();
 
        /* Prepare mapping for the new page.*/
@@ -667,7 +667,7 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private,
        BUG_ON(charge);
 
        rc = -EAGAIN;
-       if (TestSetPageLocked(page)) {
+       if (!trylock_page(page)) {
                if (!force)
                        goto move_newpage;
                lock_page(page);
index 7b2656055d6a96a6b940574e4d23f0a4fc7dd6bc..01fbe93eff5ca25f1143b1295da6ce7115e00bde 100644 (file)
@@ -78,8 +78,6 @@ success:
 
        mm->locked_vm -= pages;
 out:
-       if (ret == -ENOMEM)
-               ret = -EAGAIN;
        return ret;
 }
 
index c6af41ea9994e79826c78f75d1d61c01323be63b..936ef2efd892029b1abf1c08c860fd40991d213d 100644 (file)
 #ifdef CONFIG_DEBUG_MEMORY_INIT
 int __meminitdata mminit_loglevel;
 
+#ifndef SECTIONS_SHIFT
+#define SECTIONS_SHIFT 0
+#endif
+
 /* The zonelists are simply reported, validation is manual. */
 void mminit_verify_zonelist(void)
 {
@@ -74,11 +78,7 @@ void __init mminit_verify_pageflags_layout(void)
                NR_PAGEFLAGS);
        mminit_dprintk(MMINIT_TRACE, "pageflags_layout_shifts",
                "Section %d Node %d Zone %d\n",
-#ifdef SECTIONS_SHIFT
                SECTIONS_SHIFT,
-#else
-               0,
-#endif
                NODES_SHIFT,
                ZONES_SHIFT);
        mminit_dprintk(MMINIT_TRACE, "pageflags_layout_offsets",
index 245c3d69067b7bc4c0b83ba2fa6a08df28bc7f9b..971d0eda754a539d73d669fa8d91bd2459f10715 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -370,7 +370,7 @@ find_vma_prepare(struct mm_struct *mm, unsigned long addr,
                if (vma_tmp->vm_end > addr) {
                        vma = vma_tmp;
                        if (vma_tmp->vm_start <= addr)
-                               return vma;
+                               break;
                        __rb_link = &__rb_parent->rb_left;
                } else {
                        rb_prev = __rb_parent;
index 5edccd9c9218cda91a4298d587737e88db29f2c0..ed75bc962fbe913f8a5835c0a9bc43170582dd7f 100644 (file)
@@ -266,6 +266,27 @@ void *vmalloc_node(unsigned long size, int node)
 }
 EXPORT_SYMBOL(vmalloc_node);
 
+#ifndef PAGE_KERNEL_EXEC
+# define PAGE_KERNEL_EXEC PAGE_KERNEL
+#endif
+
+/**
+ *     vmalloc_exec  -  allocate virtually contiguous, executable memory
+ *     @size:          allocation size
+ *
+ *     Kernel-internal function to allocate enough pages to cover @size
+ *     the page level allocator and map them into contiguous and
+ *     executable kernel virtual space.
+ *
+ *     For tight control over page level allocator and protection flags
+ *     use __vmalloc() instead.
+ */
+
+void *vmalloc_exec(unsigned long size)
+{
+       return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC);
+}
+
 /**
  * vmalloc_32  -  allocate virtually contiguous memory (32bit addressable)
  *     @size:          allocation size
index 94a5246a3f98b9e9b0ef71172bb184f561c0c294..1ea4e6fcee77986f673d578a42bece82a92fb81e 100644 (file)
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -422,7 +422,7 @@ int page_referenced(struct page *page, int is_locked,
                        referenced += page_referenced_anon(page, mem_cont);
                else if (is_locked)
                        referenced += page_referenced_file(page, mem_cont);
-               else if (TestSetPageLocked(page))
+               else if (!trylock_page(page))
                        referenced++;
                else {
                        if (page->mapping)
index c1e5a3b4f7583087d4f2558f96b1992bc2508696..04fb4f1ab88e7e0c87e646afded96e962251fb61 100644 (file)
@@ -1265,7 +1265,7 @@ repeat:
                }
 
                /* We have to do this with page locked to prevent races */
-               if (TestSetPageLocked(swappage)) {
+               if (!trylock_page(swappage)) {
                        shmem_swp_unmap(entry);
                        spin_unlock(&info->lock);
                        wait_on_page_locked(swappage);
@@ -1329,7 +1329,7 @@ repeat:
                shmem_swp_unmap(entry);
                filepage = find_get_page(mapping, idx);
                if (filepage &&
-                   (!PageUptodate(filepage) || TestSetPageLocked(filepage))) {
+                   (!PageUptodate(filepage) || !trylock_page(filepage))) {
                        spin_unlock(&info->lock);
                        wait_on_page_locked(filepage);
                        page_cache_release(filepage);
index 7417a2adbe50f40130badaf92016bcb42e4bc9e2..9e0cb3118079e6eae0cf27fed41b8f2ff59f8bc2 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -444,7 +444,7 @@ void pagevec_strip(struct pagevec *pvec)
        for (i = 0; i < pagevec_count(pvec); i++) {
                struct page *page = pvec->pages[i];
 
-               if (PagePrivate(page) && !TestSetPageLocked(page)) {
+               if (PagePrivate(page) && trylock_page(page)) {
                        if (PagePrivate(page))
                                try_to_release_page(page, 0);
                        unlock_page(page);
index b8035b0551297f6ca7c2e09239d454e4707f5320..167cf2dc8a03c16d3022c60a303b102f09732bdd 100644 (file)
@@ -201,7 +201,7 @@ void delete_from_swap_cache(struct page *page)
  */
 static inline void free_swap_cache(struct page *page)
 {
-       if (PageSwapCache(page) && !TestSetPageLocked(page)) {
+       if (PageSwapCache(page) && trylock_page(page)) {
                remove_exclusive_swap_page(page);
                unlock_page(page);
        }
@@ -302,9 +302,9 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
                 * re-using the just freed swap entry for an existing page.
                 * May fail (-ENOMEM) if radix-tree node allocation failed.
                 */
-               SetPageLocked(new_page);
+               set_page_locked(new_page);
                err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL);
-               if (!err) {
+               if (likely(!err)) {
                        /*
                         * Initiate read into locked page and return.
                         */
@@ -312,7 +312,7 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
                        swap_readpage(NULL, new_page);
                        return new_page;
                }
-               ClearPageLocked(new_page);
+               clear_page_locked(new_page);
                swap_free(entry);
        } while (err != -ENOMEM);
 
index bb7f79641f9e201274004bc9ffcd298956796936..1e330f2998fa259d2733f73f4c50ce0d649c5dc0 100644 (file)
@@ -403,7 +403,7 @@ void free_swap_and_cache(swp_entry_t entry)
        if (p) {
                if (swap_entry_free(p, swp_offset(entry)) == 1) {
                        page = find_get_page(&swapper_space, entry.val);
-                       if (page && unlikely(TestSetPageLocked(page))) {
+                       if (page && unlikely(!trylock_page(page))) {
                                page_cache_release(page);
                                page = NULL;
                        }
index e68443d7456702767d1b4c6213d5bb006f048b67..250505091d3773e67449c547a0b16f8c67680257 100644 (file)
@@ -104,7 +104,6 @@ truncate_complete_page(struct address_space *mapping, struct page *page)
        cancel_dirty_page(page, PAGE_CACHE_SIZE);
 
        remove_from_page_cache(page);
-       ClearPageUptodate(page);
        ClearPageMappedToDisk(page);
        page_cache_release(page);       /* pagecache ref */
 }
@@ -188,7 +187,7 @@ void truncate_inode_pages_range(struct address_space *mapping,
                        if (page_index > next)
                                next = page_index;
                        next++;
-                       if (TestSetPageLocked(page))
+                       if (!trylock_page(page))
                                continue;
                        if (PageWriteback(page)) {
                                unlock_page(page);
@@ -281,7 +280,7 @@ unsigned long __invalidate_mapping_pages(struct address_space *mapping,
                        pgoff_t index;
                        int lock_failed;
 
-                       lock_failed = TestSetPageLocked(page);
+                       lock_failed = !trylock_page(page);
 
                        /*
                         * We really shouldn't be looking at the ->index of an
@@ -356,7 +355,6 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page)
        BUG_ON(PagePrivate(page));
        __remove_from_page_cache(page);
        spin_unlock_irq(&mapping->tree_lock);
-       ClearPageUptodate(page);
        page_cache_release(page);       /* pagecache ref */
        return 1;
 failed:
index 75be453628bf6aed4fbcd6a3fdaa59f62603166e..1ff1a58e7c1075fffecda7eb9ce5c360e8369a17 100644 (file)
@@ -496,7 +496,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
                page = lru_to_page(page_list);
                list_del(&page->lru);
 
-               if (TestSetPageLocked(page))
+               if (!trylock_page(page))
                        goto keep;
 
                VM_BUG_ON(PageActive(page));
@@ -582,7 +582,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
                                 * A synchronous write - probably a ramdisk.  Go
                                 * ahead and try to reclaim the page.
                                 */
-                               if (TestSetPageLocked(page))
+                               if (!trylock_page(page))
                                        goto keep;
                                if (PageDirty(page) || PageWriteback(page))
                                        goto keep_locked;
index f63a663de1589106a05897270b56709e5400034a..6bf8e87f1dcf124021083b25babe9aab317b7bbf 100644 (file)
@@ -50,8 +50,12 @@ PHONY +=  __fw_install __fw_modinst FORCE
 .PHONY: $(PHONY)
 
 __fw_install: $(installed-fw)
+
 __fw_modinst: $(installed-mod-fw)
+       @:
+
 __fw_modbuild: $(addprefix $(obj)/,$(mod-fw))
+       @:
 
 FORCE:
 
index 9fba838c7069c4cb71d3fbd9c109e0f951c5e340..36b5eedcdc7518d9dc734078c2287e16cca9f4d0 100644 (file)
@@ -596,7 +596,7 @@ int main(int ac, char **av)
                break;
        }
 
-       if (conf_get_changed() && conf_write(NULL)) {
+       if (conf_write(NULL)) {
                fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
                exit(1);
        }
index 07597611cc504deca5098cdd7638ace892cd4441..df6a188b993002ae7d2ca82cb12e8b853aefcb42 100644 (file)
@@ -222,10 +222,8 @@ load:
                                continue;
                        if (def == S_DEF_USER) {
                                sym = sym_find(line + 9);
-                               if (!sym) {
-                                       conf_warning("trying to assign nonexistent symbol %s", line + 9);
+                               if (!sym)
                                        break;
-                               }
                        } else {
                                sym = sym_lookup(line + 9, 0);
                                if (sym->type == S_UNKNOWN)
@@ -261,10 +259,8 @@ load:
                        }
                        if (def == S_DEF_USER) {
                                sym = sym_find(line + 7);
-                               if (!sym) {
-                                       conf_warning("trying to assign nonexistent symbol %s", line + 7);
+                               if (!sym)
                                        break;
-                               }
                        } else {
                                sym = sym_lookup(line + 7, 0);
                                if (sym->type == S_UNKNOWN)
index d8f77e26081c230a3bc489f5c773950cab3b10d3..ff787e6ff8edcbef0edc7fbfaef7f3d088f930a0 100755 (executable)
@@ -1403,7 +1403,7 @@ sub dump_struct($$) {
        my $members = $3;
 
        # ignore embedded structs or unions
-       $members =~ s/{.*?}//g;
+       $members =~ s/{.*}//g;
 
        # ignore members marked private:
        $members =~ s/\/\*.*?private:.*?public:.*?\*\///gos;
index 558dadbf45f12e39387573ca5566b8d31b5be562..e024e4588b829280b8871420c7d32a616352e7ef 100644 (file)
@@ -604,6 +604,9 @@ snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_in
 {
        struct seq_oss_synth *rec;
 
+       if (dev < 0 || dev >= dp->max_synthdev)
+               return -ENXIO;
+
        if (dp->synths[dev].is_midi) {
                struct midi_info minf;
                snd_seq_oss_midi_make_info(dp, dp->synths[dev].midi_mapped, &minf);