Merge tag 'split-asm_system_h-for-linus-20120328' of git://git.kernel.org/pub/scm...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 28 Mar 2012 22:58:21 +0000 (15:58 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 28 Mar 2012 22:58:21 +0000 (15:58 -0700)
Pull "Disintegrate and delete asm/system.h" from David Howells:
 "Here are a bunch of patches to disintegrate asm/system.h into a set of
  separate bits to relieve the problem of circular inclusion
  dependencies.

  I've built all the working defconfigs from all the arches that I can
  and made sure that they don't break.

  The reason for these patches is that I recently encountered a circular
  dependency problem that came about when I produced some patches to
  optimise get_order() by rewriting it to use ilog2().

  This uses bitops - and on the SH arch asm/bitops.h drags in
  asm-generic/get_order.h by a circuituous route involving asm/system.h.

  The main difficulty seems to be asm/system.h.  It holds a number of
  low level bits with no/few dependencies that are commonly used (eg.
  memory barriers) and a number of bits with more dependencies that
  aren't used in many places (eg.  switch_to()).

  These patches break asm/system.h up into the following core pieces:

    (1) asm/barrier.h

        Move memory barriers here.  This already done for MIPS and Alpha.

    (2) asm/switch_to.h

        Move switch_to() and related stuff here.

    (3) asm/exec.h

        Move arch_align_stack() here.  Other process execution related bits
        could perhaps go here from asm/processor.h.

    (4) asm/cmpxchg.h

        Move xchg() and cmpxchg() here as they're full word atomic ops and
        frequently used by atomic_xchg() and atomic_cmpxchg().

    (5) asm/bug.h

        Move die() and related bits.

    (6) asm/auxvec.h

        Move AT_VECTOR_SIZE_ARCH here.

  Other arch headers are created as needed on a per-arch basis."

Fixed up some conflicts from other header file cleanups and moving code
around that has happened in the meantime, so David's testing is somewhat
weakened by that.  We'll find out anything that got broken and fix it..

* tag 'split-asm_system_h-for-linus-20120328' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-asm_system: (38 commits)
  Delete all instances of asm/system.h
  Remove all #inclusions of asm/system.h
  Add #includes needed to permit the removal of asm/system.h
  Move all declarations of free_initmem() to linux/mm.h
  Disintegrate asm/system.h for OpenRISC
  Split arch_align_stack() out from asm-generic/system.h
  Split the switch_to() wrapper out of asm-generic/system.h
  Move the asm-generic/system.h xchg() implementation to asm-generic/cmpxchg.h
  Create asm-generic/barrier.h
  Make asm-generic/cmpxchg.h #include asm-generic/cmpxchg-local.h
  Disintegrate asm/system.h for Xtensa
  Disintegrate asm/system.h for Unicore32 [based on ver #3, changed by gxt]
  Disintegrate asm/system.h for Tile
  Disintegrate asm/system.h for Sparc
  Disintegrate asm/system.h for SH
  Disintegrate asm/system.h for Score
  Disintegrate asm/system.h for S390
  Disintegrate asm/system.h for PowerPC
  Disintegrate asm/system.h for PA-RISC
  Disintegrate asm/system.h for MN10300
  ...

155 files changed:
1  2 
arch/alpha/kernel/sys_marvel.c
arch/alpha/kernel/sys_titan.c
arch/arm/include/asm/system_misc.h
arch/arm/kernel/entry-armv.S
arch/arm/kernel/process.c
arch/arm/mach-at91/at91rm9200.c
arch/arm/mach-at91/at91sam9260.c
arch/arm/mach-at91/at91sam9261.c
arch/arm/mach-at91/at91sam9263.c
arch/arm/mach-at91/at91sam9g45.c
arch/arm/mach-at91/at91sam9rl.c
arch/arm/mach-clps711x/common.c
arch/arm/mach-ebsa110/core.c
arch/arm/mach-ebsa110/leds.c
arch/arm/mach-footbridge/dc21285.c
arch/arm/mach-imx/mach-imx6q.c
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/pci_v3.c
arch/arm/mach-ixp2000/ixdp2400.c
arch/arm/mach-ixp2000/ixdp2800.c
arch/arm/mach-ixp2000/ixdp2x00.c
arch/arm/mach-ixp2000/pci.c
arch/arm/mach-ixp23xx/core.c
arch/arm/mach-ixp23xx/pci.c
arch/arm/mach-ixp4xx/common-pci.c
arch/arm/mach-mmp/pxa168.c
arch/arm/mach-mxs/system.c
arch/arm/mach-omap1/id.c
arch/arm/mach-omap1/time.c
arch/arm/mach-omap1/timer32k.c
arch/arm/mach-omap2/board-omap3touchbook.c
arch/arm/mach-omap2/board-rx51-peripherals.c
arch/arm/mach-omap2/mux.c
arch/arm/mach-omap2/omap-mpuss-lowpower.c
arch/arm/mach-omap2/pm24xx.c
arch/arm/mach-omap2/pm34xx.c
arch/arm/mach-omap2/pm44xx.c
arch/arm/mach-pxa/magician.c
arch/arm/mach-rpc/riscpc.c
arch/arm/mach-s3c24xx/s3c2410.c
arch/arm/mach-s3c24xx/s3c2412.c
arch/arm/mach-s3c24xx/s3c2416.c
arch/arm/mach-s3c24xx/s3c2443.c
arch/arm/mach-s3c24xx/s3c244x.c
arch/arm/mach-s5p64x0/common.c
arch/arm/mach-s5pc100/common.c
arch/arm/mach-sa1100/generic.c
arch/arm/mach-shmobile/include/mach/system.h
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/pci.c
arch/arm/plat-iop/pci.c
arch/arm/plat-mxc/system.c
arch/arm/plat-omap/dma.c
arch/arm/plat-s3c24xx/cpu.c
arch/ia64/include/asm/pci.h
arch/ia64/kernel/acpi.c
arch/ia64/kernel/mca.c
arch/ia64/pci/pci.c
arch/ia64/sn/kernel/tiocx.c
arch/microblaze/include/asm/page.h
arch/microblaze/include/asm/setup.h
arch/microblaze/kernel/setup.c
arch/microblaze/kernel/timer.c
arch/openrisc/kernel/ptrace.c
arch/openrisc/kernel/setup.c
arch/openrisc/kernel/traps.c
arch/openrisc/mm/init.c
arch/parisc/kernel/pci.c
arch/powerpc/include/asm/rtas.h
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/prom_init.c
arch/powerpc/kernel/rtas.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/vdso.c
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/platforms/wsp/wsp_pci.c
arch/s390/kernel/vdso.c
arch/s390/kvm/kvm-s390.c
arch/s390/oprofile/hwsampler.c
arch/tile/mm/elf.c
arch/unicore32/kernel/process.c
arch/x86/include/asm/processor.h
arch/x86/kernel/irqinit.c
arch/x86/kernel/kgdb.c
arch/x86/kernel/paravirt.c
drivers/cpufreq/omap-cpufreq.c
drivers/input/serio/rpckbd.c
drivers/input/serio/sa1111ps2.c
drivers/media/media-devnode.c
drivers/media/video/ivtv/ivtv-driver.h
drivers/media/video/v4l2-dev.c
drivers/mfd/mcp-core.c
drivers/mfd/mcp-sa11x0.c
drivers/net/bonding/bond_main.c
drivers/net/ethernet/broadcom/tg3.c
drivers/net/ethernet/cirrus/cs89x0.c
drivers/parisc/dino.c
drivers/parisc/lba_pci.c
drivers/pcmcia/pxa2xx_base.c
drivers/pcmcia/sa11xx_base.c
drivers/pcmcia/soc_common.c
drivers/s390/char/sclp_cmd.c
drivers/staging/media/go7007/go7007-v4l2.c
drivers/staging/media/lirc/lirc_serial.c
drivers/usb/gadget/at91_udc.c
drivers/usb/host/ohci-hcd.c
drivers/watchdog/advantechwdt.c
drivers/watchdog/alim7101_wdt.c
drivers/watchdog/booke_wdt.c
drivers/watchdog/eurotechwdt.c
drivers/watchdog/ib700wdt.c
drivers/watchdog/it87_wdt.c
drivers/watchdog/machzwd.c
drivers/watchdog/pc87413_wdt.c
drivers/watchdog/sbc60xxwdt.c
drivers/watchdog/sbc7240_wdt.c
drivers/watchdog/sbc8360.c
drivers/watchdog/sbc_fitpc2_wdt.c
drivers/watchdog/sc520_wdt.c
drivers/watchdog/smsc37b787_wdt.c
drivers/watchdog/w83627hf_wdt.c
drivers/watchdog/w83697hf_wdt.c
drivers/watchdog/w83697ug_wdt.c
drivers/watchdog/w83877f_wdt.c
drivers/watchdog/w83977f_wdt.c
drivers/watchdog/wdt.c
drivers/watchdog/wdt285.c
drivers/watchdog/wdt977.c
drivers/watchdog/wdt_pci.c
fs/binfmt_elf.c
fs/binfmt_flat.c
fs/eventpoll.c
fs/jbd2/commit.c
fs/jbd2/journal.c
fs/nfs/client.c
fs/nfs/direct.c
fs/nfs/file.c
fs/nfs/inode.c
fs/nfs/read.c
fs/nfs/super.c
include/linux/debug_locks.h
include/linux/ide.h
include/linux/mm.h
include/linux/sched.h
include/linux/skbuff.h
include/linux/spinlock.h
init/main.c
kernel/debug/debug_core.c
kernel/signal.c
kernel/sysctl.c
lib/llist.c
net/core/dev.c
net/core/skbuff.c
net/ipv4/devinet.c
net/sunrpc/clnt.c

@@@ -13,7 -13,6 +13,6 @@@
  #include <linux/bitops.h>
  
  #include <asm/ptrace.h>
- #include <asm/system.h>
  #include <asm/dma.h>
  #include <asm/irq.h>
  #include <asm/mmu_context.h>
@@@ -384,8 -383,7 +383,8 @@@ marvel_init_pci(void
  
        marvel_register_error_handlers();
  
 -      pci_probe_only = 1;
 +      /* Indicate that we trust the console to configure things properly */
 +      pci_set_flags(PCI_PROBE_ONLY);
        common_init_pci();
        locate_and_init_vga(NULL);
  
@@@ -21,7 -21,6 +21,6 @@@
  #include <linux/bitops.h>
  
  #include <asm/ptrace.h>
- #include <asm/system.h>
  #include <asm/dma.h>
  #include <asm/irq.h>
  #include <asm/mmu_context.h>
@@@ -331,8 -330,7 +330,8 @@@ titan_init_pci(void
         */
        titan_late_init();
   
 -      pci_probe_only = 1;
 +      /* Indicate that we trust the console to configure things properly */
 +      pci_set_flags(PCI_PROBE_ONLY);
        common_init_pci();
        SMC669_Init(0);
        locate_and_init_vga(NULL);
index 0000000,9e65b23..5a85f14
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,28 +1,29 @@@
+ #ifndef __ASM_ARM_SYSTEM_MISC_H
+ #define __ASM_ARM_SYSTEM_MISC_H
+ #ifndef __ASSEMBLY__
+ #include <linux/compiler.h>
+ #include <linux/linkage.h>
+ #include <linux/irqflags.h>
+ extern void cpu_init(void);
+ void soft_restart(unsigned long);
+ extern void (*arm_pm_restart)(char str, const char *cmd);
++extern void (*arm_pm_idle)(void);
+ #define UDBG_UNDEFINED        (1 << 0)
+ #define UDBG_SYSCALL  (1 << 1)
+ #define UDBG_BADABORT (1 << 2)
+ #define UDBG_SEGV     (1 << 3)
+ #define UDBG_BUS      (1 << 4)
+ extern unsigned int user_debug;
+ extern void disable_hlt(void);
+ extern void enable_hlt(void);
+ #endif /* !__ASSEMBLY__ */
+ #endif /* __ASM_ARM_SYSTEM_MISC_H */
  #include <asm/glue-df.h>
  #include <asm/glue-pf.h>
  #include <asm/vfpmacros.h>
 +#ifndef CONFIG_MULTI_IRQ_HANDLER
  #include <mach/entry-macro.S>
 +#endif
  #include <asm/thread_notify.h>
  #include <asm/unwind.h>
  #include <asm/unistd.h>
  #include <asm/tls.h>
- #include <asm/system.h>
+ #include <asm/system_info.h>
  
  #include "entry-header.S"
  #include <asm/entry-macro-multi.S>
@@@ -1103,6 -1101,7 +1103,6 @@@ __stubs_start
   * get out of that mode without clobbering one register.
   */
  vector_fiq:
 -      disable_fiq
        subs    pc, lr, #4
  
  /*=============================================================================
@@@ -35,7 -35,6 +35,6 @@@
  #include <asm/cacheflush.h>
  #include <asm/leds.h>
  #include <asm/processor.h>
- #include <asm/system.h>
  #include <asm/thread_notify.h>
  #include <asm/stacktrace.h>
  #include <asm/mach/time.h>
@@@ -61,6 -60,8 +60,6 @@@ extern void setup_mm_for_reboot(void)
  
  static volatile int hlt_counter;
  
 -#include <mach/system.h>
 -
  void disable_hlt(void)
  {
        hlt_counter++;
@@@ -179,17 -180,13 +178,17 @@@ void cpu_idle_wait(void
  EXPORT_SYMBOL_GPL(cpu_idle_wait);
  
  /*
 - * This is our default idle handler.  We need to disable
 - * interrupts here to ensure we don't miss a wakeup call.
 + * This is our default idle handler.
   */
 +
 +void (*arm_pm_idle)(void);
 +
  static void default_idle(void)
  {
 -      if (!need_resched())
 -              arch_idle();
 +      if (arm_pm_idle)
 +              arm_pm_idle();
 +      else
 +              cpu_do_idle();
        local_irq_enable();
  }
  
@@@ -217,10 -214,6 +216,10 @@@ void cpu_idle(void
                                cpu_die();
  #endif
  
 +                      /*
 +                       * We need to disable interrupts here
 +                       * to ensure we don't miss a wakeup call.
 +                       */
                        local_irq_disable();
  #ifdef CONFIG_PL310_ERRATA_769419
                        wmb();
                        if (hlt_counter) {
                                local_irq_enable();
                                cpu_relax();
 -                      } else {
 +                      } else if (!need_resched()) {
                                stop_critical_timings();
                                if (cpuidle_idle_call())
                                        pm_idle();
                                start_critical_timings();
                                /*
 -                               * This will eventually be removed - pm_idle
 -                               * functions should always return with IRQs
 -                               * enabled.
 +                               * pm_idle functions must always
 +                               * return with IRQs enabled.
                                 */
                                WARN_ON(irqs_disabled());
 +                      } else
                                local_irq_enable();
 -                      }
                }
                leds_event(led_idle_end);
                rcu_idle_exit();
@@@ -538,7 -532,8 +537,7 @@@ int vectors_user_mapping(void
        struct mm_struct *mm = current->mm;
        return install_special_mapping(mm, 0xffff0000, PAGE_SIZE,
                                       VM_READ | VM_EXEC |
 -                                     VM_MAYREAD | VM_MAYEXEC |
 -                                     VM_ALWAYSDUMP | VM_RESERVED,
 +                                     VM_MAYREAD | VM_MAYEXEC | VM_RESERVED,
                                       NULL);
  }
  
@@@ -15,6 -15,7 +15,7 @@@
  #include <asm/irq.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
+ #include <asm/system_misc.h>
  #include <mach/at91rm9200.h>
  #include <mach/at91_pmc.h>
  #include <mach/at91_st.h>
@@@ -289,22 -290,13 +290,22 @@@ static struct at91_gpio_bank at91rm9200
        }
  };
  
 +static void at91rm9200_idle(void)
 +{
 +      /*
 +       * Disable the processor clock.  The processor will be automatically
 +       * re-enabled by an interrupt or by a reset.
 +       */
 +      at91_pmc_write(AT91_PMC_SCDR, AT91_PMC_PCK);
 +}
 +
  static void at91rm9200_restart(char mode, const char *cmd)
  {
        /*
         * Perform a hardware reset with the use of the Watchdog timer.
         */
 -      at91_sys_write(AT91_ST_WDMR, AT91_ST_RSTEN | AT91_ST_EXTEN | 1);
 -      at91_sys_write(AT91_ST_CR, AT91_ST_WDRST);
 +      at91_st_write(AT91_ST_WDMR, AT91_ST_RSTEN | AT91_ST_EXTEN | 1);
 +      at91_st_write(AT91_ST_CR, AT91_ST_WDRST);
  }
  
  /* --------------------------------------------------------------------
@@@ -319,13 -311,10 +320,13 @@@ static void __init at91rm9200_map_io(vo
  
  static void __init at91rm9200_ioremap_registers(void)
  {
 +      at91rm9200_ioremap_st(AT91RM9200_BASE_ST);
 +      at91_ioremap_ramc(0, AT91RM9200_BASE_MC, 256);
  }
  
  static void __init at91rm9200_initialize(void)
  {
 +      arm_pm_idle = at91rm9200_idle;
        arm_pm_restart = at91rm9200_restart;
        at91_extern_irq = (1 << AT91RM9200_ID_IRQ0) | (1 << AT91RM9200_ID_IRQ1)
                        | (1 << AT91RM9200_ID_IRQ2) | (1 << AT91RM9200_ID_IRQ3)
  
  #include <linux/module.h>
  
 +#include <asm/proc-fns.h>
  #include <asm/irq.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
+ #include <asm/system_misc.h>
  #include <mach/cpu.h>
  #include <mach/at91_dbgu.h>
  #include <mach/at91sam9260.h>
@@@ -209,14 -209,6 +210,14 @@@ static struct clk_lookup periph_clocks_
        CLKDEV_CON_DEV_ID("usart", "fffd0000.serial", &usart3_clk),
        CLKDEV_CON_DEV_ID("usart", "fffd4000.serial", &usart4_clk),
        CLKDEV_CON_DEV_ID("usart", "fffd8000.serial", &usart5_clk),
 +      /* more tc lookup table for DT entries */
 +      CLKDEV_CON_DEV_ID("t0_clk", "fffa0000.timer", &tc0_clk),
 +      CLKDEV_CON_DEV_ID("t1_clk", "fffa0000.timer", &tc1_clk),
 +      CLKDEV_CON_DEV_ID("t2_clk", "fffa0000.timer", &tc2_clk),
 +      CLKDEV_CON_DEV_ID("t0_clk", "fffdc000.timer", &tc3_clk),
 +      CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk),
 +      CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk),
 +      CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk),
        /* fake hclk clock */
        CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
        CLKDEV_CON_ID("pioA", &pioA_clk),
@@@ -318,27 -310,27 +319,27 @@@ static void __init at91sam9xe_map_io(vo
  
  static void __init at91sam9260_map_io(void)
  {
 -      if (cpu_is_at91sam9xe()) {
 +      if (cpu_is_at91sam9xe())
                at91sam9xe_map_io();
 -      } else if (cpu_is_at91sam9g20()) {
 -              at91_init_sram(0, AT91SAM9G20_SRAM0_BASE, AT91SAM9G20_SRAM0_SIZE);
 -              at91_init_sram(1, AT91SAM9G20_SRAM1_BASE, AT91SAM9G20_SRAM1_SIZE);
 -      } else {
 -              at91_init_sram(0, AT91SAM9260_SRAM0_BASE, AT91SAM9260_SRAM0_SIZE);
 -              at91_init_sram(1, AT91SAM9260_SRAM1_BASE, AT91SAM9260_SRAM1_SIZE);
 -      }
 +      else if (cpu_is_at91sam9g20())
 +              at91_init_sram(0, AT91SAM9G20_SRAM_BASE, AT91SAM9G20_SRAM_SIZE);
 +      else
 +              at91_init_sram(0, AT91SAM9260_SRAM_BASE, AT91SAM9260_SRAM_SIZE);
  }
  
  static void __init at91sam9260_ioremap_registers(void)
  {
        at91_ioremap_shdwc(AT91SAM9260_BASE_SHDWC);
        at91_ioremap_rstc(AT91SAM9260_BASE_RSTC);
 +      at91_ioremap_ramc(0, AT91SAM9260_BASE_SDRAMC, 512);
        at91sam926x_ioremap_pit(AT91SAM9260_BASE_PIT);
        at91sam9_ioremap_smc(0, AT91SAM9260_BASE_SMC);
 +      at91_ioremap_matrix(AT91SAM9260_BASE_MATRIX);
  }
  
  static void __init at91sam9260_initialize(void)
  {
 +      arm_pm_idle = at91sam9_idle;
        arm_pm_restart = at91sam9_alt_restart;
        at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1)
                        | (1 << AT91SAM9260_ID_IRQ2);
  
  #include <linux/module.h>
  
 +#include <asm/proc-fns.h>
  #include <asm/irq.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
+ #include <asm/system_misc.h>
  #include <mach/cpu.h>
  #include <mach/at91sam9261.h>
  #include <mach/at91_pmc.h>
@@@ -283,15 -283,12 +284,15 @@@ static void __init at91sam9261_ioremap_
  {
        at91_ioremap_shdwc(AT91SAM9261_BASE_SHDWC);
        at91_ioremap_rstc(AT91SAM9261_BASE_RSTC);
 +      at91_ioremap_ramc(0, AT91SAM9261_BASE_SDRAMC, 512);
        at91sam926x_ioremap_pit(AT91SAM9261_BASE_PIT);
        at91sam9_ioremap_smc(0, AT91SAM9261_BASE_SMC);
 +      at91_ioremap_matrix(AT91SAM9261_BASE_MATRIX);
  }
  
  static void __init at91sam9261_initialize(void)
  {
 +      arm_pm_idle = at91sam9_idle;
        arm_pm_restart = at91sam9_alt_restart;
        at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1)
                        | (1 << AT91SAM9261_ID_IRQ2);
  
  #include <linux/module.h>
  
 +#include <asm/proc-fns.h>
  #include <asm/irq.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
+ #include <asm/system_misc.h>
  #include <mach/at91sam9263.h>
  #include <mach/at91_pmc.h>
  #include <mach/at91_rstc.h>
@@@ -303,17 -303,13 +304,17 @@@ static void __init at91sam9263_ioremap_
  {
        at91_ioremap_shdwc(AT91SAM9263_BASE_SHDWC);
        at91_ioremap_rstc(AT91SAM9263_BASE_RSTC);
 +      at91_ioremap_ramc(0, AT91SAM9263_BASE_SDRAMC0, 512);
 +      at91_ioremap_ramc(1, AT91SAM9263_BASE_SDRAMC1, 512);
        at91sam926x_ioremap_pit(AT91SAM9263_BASE_PIT);
        at91sam9_ioremap_smc(0, AT91SAM9263_BASE_SMC0);
        at91sam9_ioremap_smc(1, AT91SAM9263_BASE_SMC1);
 +      at91_ioremap_matrix(AT91SAM9263_BASE_MATRIX);
  }
  
  static void __init at91sam9263_initialize(void)
  {
 +      arm_pm_idle = at91sam9_idle;
        arm_pm_restart = at91sam9_alt_restart;
        at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1);
  
@@@ -16,6 -16,7 +16,7 @@@
  #include <asm/irq.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
+ #include <asm/system_misc.h>
  #include <mach/at91sam9g45.h>
  #include <mach/at91_pmc.h>
  #include <mach/cpu.h>
@@@ -229,11 -230,6 +230,11 @@@ static struct clk_lookup periph_clocks_
        CLKDEV_CON_DEV_ID("usart", "fff90000.serial", &usart1_clk),
        CLKDEV_CON_DEV_ID("usart", "fff94000.serial", &usart2_clk),
        CLKDEV_CON_DEV_ID("usart", "fff98000.serial", &usart3_clk),
 +      /* more tc lookup table for DT entries */
 +      CLKDEV_CON_DEV_ID("t0_clk", "fff7c000.timer", &tcb0_clk),
 +      CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk),
 +      CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk),
 +      CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk),
        /* fake hclk clock */
        CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk),
        CLKDEV_CON_ID("pioA", &pioA_clk),
@@@ -336,16 -332,12 +337,16 @@@ static void __init at91sam9g45_ioremap_
  {
        at91_ioremap_shdwc(AT91SAM9G45_BASE_SHDWC);
        at91_ioremap_rstc(AT91SAM9G45_BASE_RSTC);
 +      at91_ioremap_ramc(0, AT91SAM9G45_BASE_DDRSDRC1, 512);
 +      at91_ioremap_ramc(1, AT91SAM9G45_BASE_DDRSDRC0, 512);
        at91sam926x_ioremap_pit(AT91SAM9G45_BASE_PIT);
        at91sam9_ioremap_smc(0, AT91SAM9G45_BASE_SMC);
 +      at91_ioremap_matrix(AT91SAM9G45_BASE_MATRIX);
  }
  
  static void __init at91sam9g45_initialize(void)
  {
 +      arm_pm_idle = at91sam9_idle;
        arm_pm_restart = at91sam9g45_restart;
        at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0);
  
  
  #include <linux/module.h>
  
 +#include <asm/proc-fns.h>
  #include <asm/irq.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
+ #include <asm/system_misc.h>
  #include <mach/cpu.h>
  #include <mach/at91_dbgu.h>
  #include <mach/at91sam9rl.h>
@@@ -288,15 -288,12 +289,15 @@@ static void __init at91sam9rl_ioremap_r
  {
        at91_ioremap_shdwc(AT91SAM9RL_BASE_SHDWC);
        at91_ioremap_rstc(AT91SAM9RL_BASE_RSTC);
 +      at91_ioremap_ramc(0, AT91SAM9RL_BASE_SDRAMC, 512);
        at91sam926x_ioremap_pit(AT91SAM9RL_BASE_PIT);
        at91sam9_ioremap_smc(0, AT91SAM9RL_BASE_SMC);
 +      at91_ioremap_matrix(AT91SAM9RL_BASE_MATRIX);
  }
  
  static void __init at91sam9rl_initialize(void)
  {
 +      arm_pm_idle = at91sam9_idle;
        arm_pm_restart = at91sam9_alt_restart;
        at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0);
  
@@@ -37,6 -37,7 +37,7 @@@
  #include <asm/mach/map.h>
  #include <asm/mach/time.h>
  #include <asm/hardware/clps7111.h>
+ #include <asm/system_misc.h>
  
  /*
   * This maps the generic CLPS711x registers
@@@ -225,19 -226,3 +226,19 @@@ void clps711x_restart(char mode, const 
  {
        soft_restart(0);
  }
 +
 +static void clps711x_idle(void)
 +{
 +      clps_writel(1, HALT);
 +      __asm__ __volatile__(
 +      "mov    r0, r0\n\
 +      mov     r0, r0");
 +}
 +
 +static int __init clps711x_idle_init(void)
 +{
 +      arm_pm_idle = clps711x_idle;
 +      return 0;
 +}
 +
 +arch_initcall(clps711x_idle_init);
@@@ -22,7 -22,7 +22,7 @@@
  #include <asm/mach-types.h>
  #include <asm/pgtable.h>
  #include <asm/page.h>
- #include <asm/system.h>
+ #include <asm/system_misc.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach/irq.h>
  
  #include <asm/mach/time.h>
  
 -#define IRQ_MASK              0xfe000000      /* read */
 -#define IRQ_MSET              0xfe000000      /* write */
 -#define IRQ_STAT              0xff000000      /* read */
 -#define IRQ_MCLR              0xff000000      /* write */
 +#include "core.h"
  
  static void ebsa110_mask_irq(struct irq_data *d)
  {
@@@ -76,22 -79,22 +76,22 @@@ static struct map_desc ebsa110_io_desc[
        {       /* IRQ_STAT/IRQ_MCLR */
                .virtual        = IRQ_STAT,
                .pfn            = __phys_to_pfn(TRICK4_PHYS),
 -              .length         = PGDIR_SIZE,
 +              .length         = TRICK4_SIZE,
                .type           = MT_DEVICE
        }, {    /* IRQ_MASK/IRQ_MSET */
                .virtual        = IRQ_MASK,
                .pfn            = __phys_to_pfn(TRICK3_PHYS),
 -              .length         = PGDIR_SIZE,
 +              .length         = TRICK3_SIZE,
                .type           = MT_DEVICE
        }, {    /* SOFT_BASE */
                .virtual        = SOFT_BASE,
                .pfn            = __phys_to_pfn(TRICK1_PHYS),
 -              .length         = PGDIR_SIZE,
 +              .length         = TRICK1_SIZE,
                .type           = MT_DEVICE
        }, {    /* PIT_BASE */
                .virtual        = PIT_BASE,
                .pfn            = __phys_to_pfn(TRICK0_PHYS),
 -              .length         = PGDIR_SIZE,
 +              .length         = TRICK0_SIZE,
                .type           = MT_DEVICE
        },
  
@@@ -268,33 -271,8 +268,33 @@@ static struct platform_device *ebsa110_
        &am79c961_device,
  };
  
 +/*
 + * EBSA110 idling methodology:
 + *
 + * We can not execute the "wait for interrupt" instruction since that
 + * will stop our MCLK signal (which provides the clock for the glue
 + * logic, and therefore the timer interrupt).
 + *
 + * Instead, we spin, polling the IRQ_STAT register for the occurrence
 + * of any interrupt with core clock down to the memory clock.
 + */
 +static void ebsa110_idle(void)
 +{
 +      const char *irq_stat = (char *)0xff000000;
 +
 +      /* disable clock switching */
 +      asm volatile ("mcr p15, 0, ip, c15, c2, 2" : : : "cc");
 +
 +      /* wait for an interrupt to occur */
 +      while (!*irq_stat);
 +
 +      /* enable clock switching */
 +      asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc");
 +}
 +
  static int __init ebsa110_init(void)
  {
 +      arm_pm_idle = ebsa110_idle;
        return platform_add_devices(ebsa110_devices, ARRAY_SIZE(ebsa110_devices));
  }
  
  
  #include <mach/hardware.h>
  #include <asm/leds.h>
- #include <asm/system.h>
  #include <asm/mach-types.h>
  
 +#include "core.h"
 +
  static spinlock_t leds_lock;
  
  static void ebsa110_leds_event(led_event_t ledevt)
@@@ -21,7 -21,6 +21,6 @@@
  #include <video/vga.h>
  
  #include <asm/irq.h>
- #include <asm/system.h>
  #include <asm/mach/pci.h>
  #include <asm/hardware/dec21285.h>
  
@@@ -275,13 -274,11 +274,13 @@@ int __init dc21285_setup(int nr, struc
        allocate_resource(&iomem_resource, &res[0], 0x40000000,
                          0x80000000, 0xffffffff, 0x40000000, NULL, NULL);
  
 -      pci_add_resource(&sys->resources, &ioport_resource);
 -      pci_add_resource(&sys->resources, &res[0]);
 -      pci_add_resource(&sys->resources, &res[1]);
        sys->mem_offset  = DC21285_PCI_MEM;
  
 +      pci_add_resource_offset(&sys->resources,
 +                              &ioport_resource, sys->io_offset);
 +      pci_add_resource_offset(&sys->resources, &res[0], sys->mem_offset);
 +      pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset);
 +
        return 1;
  }
  
  #include <linux/of_platform.h>
  #include <linux/phy.h>
  #include <linux/micrel_phy.h>
 +#include <asm/smp_twd.h>
  #include <asm/hardware/cache-l2x0.h>
  #include <asm/hardware/gic.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/time.h>
+ #include <asm/system_misc.h>
  #include <mach/common.h>
  #include <mach/hardware.h>
  
@@@ -121,7 -121,6 +122,7 @@@ static void __init imx6q_init_irq(void
  static void __init imx6q_timer_init(void)
  {
        mx6q_clocks_init();
 +      twd_local_timer_of_register();
  }
  
  static struct sys_timer imx6q_timer = {
  static const char *imx6q_dt_compat[] __initdata = {
        "fsl,imx6q-arm2",
        "fsl,imx6q-sabrelite",
 +      "fsl,imx6q",
        NULL,
  };
  
@@@ -27,7 -27,6 +27,6 @@@
  #include <mach/platform.h>
  #include <asm/irq.h>
  #include <mach/cm.h>
- #include <asm/system.h>
  #include <asm/leds.h>
  #include <asm/mach-types.h>
  #include <asm/mach/time.h>
  
  static struct amba_pl010_data integrator_uart_data;
  
 -static struct amba_device rtc_device = {
 -      .dev            = {
 -              .init_name = "mb:15",
 -      },
 -      .res            = {
 -              .start  = INTEGRATOR_RTC_BASE,
 -              .end    = INTEGRATOR_RTC_BASE + SZ_4K - 1,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      .irq            = { IRQ_RTCINT, NO_IRQ },
 -};
 +#define INTEGRATOR_RTC_IRQ    { IRQ_RTCINT }
 +#define INTEGRATOR_UART0_IRQ  { IRQ_UARTINT0 }
 +#define INTEGRATOR_UART1_IRQ  { IRQ_UARTINT1 }
 +#define KMI0_IRQ              { IRQ_KMIINT0 }
 +#define KMI1_IRQ              { IRQ_KMIINT1 }
  
 -static struct amba_device uart0_device = {
 -      .dev            = {
 -              .init_name = "mb:16",
 -              .platform_data = &integrator_uart_data,
 -      },
 -      .res            = {
 -              .start  = INTEGRATOR_UART0_BASE,
 -              .end    = INTEGRATOR_UART0_BASE + SZ_4K - 1,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      .irq            = { IRQ_UARTINT0, NO_IRQ },
 -};
 +static AMBA_APB_DEVICE(rtc, "mb:15", 0,
 +      INTEGRATOR_RTC_BASE, INTEGRATOR_RTC_IRQ, NULL);
  
 -static struct amba_device uart1_device = {
 -      .dev            = {
 -              .init_name = "mb:17",
 -              .platform_data = &integrator_uart_data,
 -      },
 -      .res            = {
 -              .start  = INTEGRATOR_UART1_BASE,
 -              .end    = INTEGRATOR_UART1_BASE + SZ_4K - 1,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      .irq            = { IRQ_UARTINT1, NO_IRQ },
 -};
 +static AMBA_APB_DEVICE(uart0, "mb:16", 0,
 +      INTEGRATOR_UART0_BASE, INTEGRATOR_UART0_IRQ, &integrator_uart_data);
  
 -static struct amba_device kmi0_device = {
 -      .dev            = {
 -              .init_name = "mb:18",
 -      },
 -      .res            = {
 -              .start  = KMI0_BASE,
 -              .end    = KMI0_BASE + SZ_4K - 1,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      .irq            = { IRQ_KMIINT0, NO_IRQ },
 -};
 +static AMBA_APB_DEVICE(uart1, "mb:17", 0,
 +      INTEGRATOR_UART1_BASE, INTEGRATOR_UART1_IRQ, &integrator_uart_data);
  
 -static struct amba_device kmi1_device = {
 -      .dev            = {
 -              .init_name = "mb:19",
 -      },
 -      .res            = {
 -              .start  = KMI1_BASE,
 -              .end    = KMI1_BASE + SZ_4K - 1,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      .irq            = { IRQ_KMIINT1, NO_IRQ },
 -};
 +static AMBA_APB_DEVICE(kmi0, "mb:18", 0, KMI0_BASE, KMI0_IRQ, NULL);
 +static AMBA_APB_DEVICE(kmi1, "mb:19", 0, KMI1_BASE, KMI1_IRQ, NULL);
  
  static struct amba_device *amba_devs[] __initdata = {
        &rtc_device,
@@@ -32,7 -32,6 +32,6 @@@
  #include <mach/platform.h>
  #include <asm/irq.h>
  #include <asm/signal.h>
- #include <asm/system.h>
  #include <asm/mach/pci.h>
  #include <asm/irq_regs.h>
  
@@@ -378,10 -377,9 +377,10 @@@ static int __init pci_v3_setup_resource
         * the mem resource for this bus
         * the prefetch mem resource for this bus
         */
 -      pci_add_resource(&sys->resources, &ioport_resource);
 -      pci_add_resource(&sys->resources, &non_mem);
 -      pci_add_resource(&sys->resources, &pre_mem);
 +      pci_add_resource_offset(&sys->resources,
 +                              &ioport_resource, sys->io_offset);
 +      pci_add_resource_offset(&sys->resources, &non_mem, sys->mem_offset);
 +      pci_add_resource_offset(&sys->resources, &pre_mem, sys->mem_offset);
  
        return 1;
  }
@@@ -29,7 -29,6 +29,6 @@@
  #include <asm/irq.h>
  #include <asm/pgtable.h>
  #include <asm/page.h>
- #include <asm/system.h>
  #include <mach/hardware.h>
  #include <asm/mach-types.h>
  
@@@ -134,11 -133,11 +133,11 @@@ static void ixdp2400_pci_postinit(void
  
        if (ixdp2x00_master_npu()) {
                dev = pci_get_bus_and_slot(1, IXDP2400_SLAVE_ENET_DEVFN);
 -              pci_remove_bus_device(dev);
 +              pci_stop_and_remove_bus_device(dev);
                pci_dev_put(dev);
        } else {
                dev = pci_get_bus_and_slot(1, IXDP2400_MASTER_ENET_DEVFN);
 -              pci_remove_bus_device(dev);
 +              pci_stop_and_remove_bus_device(dev);
                pci_dev_put(dev);
  
                ixdp2x00_slave_pci_postinit();
@@@ -29,7 -29,6 +29,6 @@@
  #include <asm/irq.h>
  #include <asm/pgtable.h>
  #include <asm/page.h>
- #include <asm/system.h>
  #include <mach/hardware.h>
  #include <asm/mach-types.h>
  
@@@ -262,14 -261,14 +261,14 @@@ int __init ixdp2800_pci_init(void
                pci_common_init(&ixdp2800_pci);
                if (ixdp2x00_master_npu()) {
                        dev = pci_get_bus_and_slot(1, IXDP2800_SLAVE_ENET_DEVFN);
 -                      pci_remove_bus_device(dev);
 +                      pci_stop_and_remove_bus_device(dev);
                        pci_dev_put(dev);
  
                        ixdp2800_master_enable_slave();
                        ixdp2800_master_wait_for_slave_bus_scan();
                } else {
                        dev = pci_get_bus_and_slot(1, IXDP2800_MASTER_ENET_DEVFN);
 -                      pci_remove_bus_device(dev);
 +                      pci_stop_and_remove_bus_device(dev);
                        pci_dev_put(dev);
                }
        }
@@@ -30,7 -30,6 +30,6 @@@
  #include <asm/irq.h>
  #include <asm/pgtable.h>
  #include <asm/page.h>
- #include <asm/system.h>
  #include <mach/hardware.h>
  #include <asm/mach-types.h>
  
@@@ -239,12 -238,12 +238,12 @@@ void ixdp2x00_slave_pci_postinit(void
         * Remove PMC device is there is one
         */
        if((dev = pci_get_bus_and_slot(1, IXDP2X00_PMC_DEVFN))) {
 -              pci_remove_bus_device(dev);
 +              pci_stop_and_remove_bus_device(dev);
                pci_dev_put(dev);
        }
  
        dev = pci_get_bus_and_slot(0, IXDP2X00_21555_DEVFN);
 -      pci_remove_bus_device(dev);
 +      pci_stop_and_remove_bus_device(dev);
        pci_dev_put(dev);
  }
  
@@@ -26,7 -26,6 +26,6 @@@
  #include <linux/io.h>
  
  #include <asm/irq.h>
- #include <asm/system.h>
  #include <mach/hardware.h>
  
  #include <asm/mach/pci.h>
@@@ -243,10 -242,8 +242,10 @@@ int ixp2000_pci_setup(int nr, struct pc
        if (nr >= 1)
                return 0;
  
 -      pci_add_resource(&sys->resources, &ixp2000_pci_io_space);
 -      pci_add_resource(&sys->resources, &ixp2000_pci_mem_space);
 +      pci_add_resource_offset(&sys->resources,
 +                              &ixp2000_pci_io_space, sys->io_offset);
 +      pci_add_resource_offset(&sys->resources,
 +                              &ixp2000_pci_mem_space, sys->mem_offset);
  
        return 1;
  }
@@@ -34,7 -34,6 +34,6 @@@
  #include <asm/memory.h>
  #include <mach/hardware.h>
  #include <asm/irq.h>
- #include <asm/system.h>
  #include <asm/tlbflush.h>
  #include <asm/pgtable.h>
  
@@@ -441,9 -440,6 +440,9 @@@ static struct platform_device *ixp23xx_
  
  void __init ixp23xx_sys_init(void)
  {
 +      /* by default, the idle code is disabled */
 +      disable_hlt();
 +
        *IXP23XX_EXP_UNIT_FUSE |= 0xf;
        platform_add_devices(ixp23xx_devices, ARRAY_SIZE(ixp23xx_devices));
  }
@@@ -28,7 -28,6 +28,6 @@@
  
  #include <asm/irq.h>
  #include <asm/sizes.h>
- #include <asm/system.h>
  #include <asm/mach/pci.h>
  #include <mach/hardware.h>
  
@@@ -281,10 -280,8 +280,10 @@@ int ixp23xx_pci_setup(int nr, struct pc
        if (nr >= 1)
                return 0;
  
 -      pci_add_resource(&sys->resources, &ixp23xx_pci_io_space);
 -      pci_add_resource(&sys->resources, &ixp23xx_pci_mem_space);
 +      pci_add_resource_offset(&sys->resources,
 +                              &ixp23xx_pci_io_space, sys->io_offset);
 +      pci_add_resource_offset(&sys->resources,
 +                              &ixp23xx_pci_mem_space, sys->mem_offset);
  
        return 1;
  }
@@@ -32,7 -32,6 +32,6 @@@
  #include <asm/cputype.h>
  #include <asm/irq.h>
  #include <asm/sizes.h>
- #include <asm/system.h>
  #include <asm/mach/pci.h>
  #include <mach/hardware.h>
  
@@@ -472,8 -471,8 +471,8 @@@ int ixp4xx_setup(int nr, struct pci_sys
        request_resource(&ioport_resource, &res[0]);
        request_resource(&iomem_resource, &res[1]);
  
 -      pci_add_resource(&sys->resources, &res[0]);
 -      pci_add_resource(&sys->resources, &res[1]);
 +      pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset);
 +      pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset);
  
        platform_notify = ixp4xx_pci_platform_notify;
        platform_notify_remove = ixp4xx_pci_platform_notify_remove;
@@@ -16,6 -16,7 +16,7 @@@
  #include <linux/platform_device.h>
  
  #include <asm/mach/time.h>
+ #include <asm/system_misc.h>
  #include <mach/addr-map.h>
  #include <mach/cputype.h>
  #include <mach/regs-apbc.h>
@@@ -64,7 -65,6 +65,7 @@@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0
  static APBC_CLK(ssp5, PXA168_SSP5, 4, 0);
  static APBC_CLK(gpio, PXA168_GPIO, 0, 13000000);
  static APBC_CLK(keypad, PXA168_KPC, 0, 32000);
 +static APBC_CLK(rtc, PXA168_RTC, 8, 32768);
  
  static APMU_CLK(nand, NAND, 0x19b, 156000000);
  static APMU_CLK(lcd, LCD, 0x7f, 312000000);
@@@ -93,7 -93,6 +94,7 @@@ static struct clk_lookup pxa168_clkregs
        INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
        INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"),
        INIT_CLKREG(&clk_usb, "pxa168-ehci", "PXA168-USBCLK"),
 +      INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL),
  };
  
  static int __init pxa168_init(void)
@@@ -168,7 -167,6 +169,7 @@@ struct resource pxa168_resource_gpio[] 
        }, {
                .start  = IRQ_PXA168_GPIOX,
                .end    = IRQ_PXA168_GPIOX,
 +              .name   = "gpio_mux",
                .flags  = IORESOURCE_IRQ,
        },
  };
@@@ -25,7 -25,7 +25,7 @@@
  #include <linux/module.h>
  
  #include <asm/proc-fns.h>
- #include <asm/system.h>
+ #include <asm/system_misc.h>
  
  #include <mach/mxs.h>
  #include <mach/common.h>
@@@ -37,8 -37,6 +37,8 @@@
  #define MXS_MODULE_CLKGATE            (1 << 30)
  #define MXS_MODULE_SFTRST             (1 << 31)
  
 +#define CLKCTRL_TIMEOUT               10      /* 10 ms */
 +
  static void __iomem *mxs_clkctrl_reset_addr;
  
  /*
@@@ -139,17 -137,3 +139,17 @@@ error
        return -ETIMEDOUT;
  }
  EXPORT_SYMBOL(mxs_reset_block);
 +
 +int mxs_clkctrl_timeout(unsigned int reg_offset, unsigned int mask)
 +{
 +      unsigned long timeout = jiffies + msecs_to_jiffies(CLKCTRL_TIMEOUT);
 +      while (readl_relaxed(MXS_IO_ADDRESS(MXS_CLKCTRL_BASE_ADDR)
 +                                              + reg_offset) & mask) {
 +              if (time_after(jiffies, timeout)) {
 +                      pr_err("Timeout at CLKCTRL + 0x%x\n", reg_offset);
 +                      return -ETIMEDOUT;
 +              }
 +      }
 +
 +      return 0;
 +}
diff --combined arch/arm/mach-omap1/id.c
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/io.h>
+ #include <asm/system_info.h>
 +
  #include <plat/cpu.h>
  
 +#include <mach/hardware.h>
 +
  #define OMAP_DIE_ID_0         0xfffe1800
  #define OMAP_DIE_ID_1         0xfffe1804
  #define OMAP_PRODUCTION_ID_0  0xfffe2000
  #include <linux/clockchips.h>
  #include <linux/io.h>
  
- #include <asm/system.h>
 -#include <mach/hardware.h>
  #include <asm/leds.h>
  #include <asm/irq.h>
  #include <asm/sched_clock.h>
  
 +#include <mach/hardware.h>
  #include <asm/mach/irq.h>
  #include <asm/mach/time.h>
  
 +#include "iomap.h"
  #include "common.h"
  
  #ifdef CONFIG_OMAP_MPU_TIMER
  #include <linux/clockchips.h>
  #include <linux/io.h>
  
- #include <asm/system.h>
 -#include <mach/hardware.h>
  #include <asm/leds.h>
  #include <asm/irq.h>
  #include <asm/mach/irq.h>
  #include <asm/mach/time.h>
 -#include "common.h"
 +
  #include <plat/dmtimer.h>
  
 +#include <mach/hardware.h>
 +
 +#include "common.h"
 +
  /*
   * ---------------------------------------------------------------------------
   * 32KHz OS timer
@@@ -42,6 -42,7 +42,7 @@@
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/mach/flash.h>
+ #include <asm/system_info.h>
  
  #include <plat/board.h>
  #include "common.h"
@@@ -100,7 -101,6 +101,7 @@@ static struct omap2_hsmmc_info mmc[] = 
                .mmc            = 1,
                .caps           = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
                .gpio_wp        = 29,
 +              .deferred       = true,
        },
        {}      /* Terminator */
  };
@@@ -118,9 -118,15 +119,9 @@@ static struct gpio_led gpio_leds[]
  static int touchbook_twl_gpio_setup(struct device *dev,
                unsigned gpio, unsigned ngpio)
  {
 -      if (system_rev >= 0x20 && system_rev <= 0x34301000) {
 -              omap_mux_init_gpio(23, OMAP_PIN_INPUT);
 -              mmc[0].gpio_wp = 23;
 -      } else {
 -              omap_mux_init_gpio(29, OMAP_PIN_INPUT);
 -      }
        /* gpio + 0 is "mmc0_cd" (input/IRQ) */
        mmc[0].gpio_cd = gpio + 0;
 -      omap2_hsmmc_init(mmc);
 +      omap_hsmmc_late_init(mmc);
  
        /* REVISIT: need ehci-omap hooks for external VBUS
         * power switch and overcurrent detect
@@@ -346,14 -352,6 +347,14 @@@ static void __init omap3_touchbook_init
  
        pm_power_off = omap3_touchbook_poweroff;
  
 +      if (system_rev >= 0x20 && system_rev <= 0x34301000) {
 +              omap_mux_init_gpio(23, OMAP_PIN_INPUT);
 +              mmc[0].gpio_wp = 23;
 +      } else {
 +              omap_mux_init_gpio(29, OMAP_PIN_INPUT);
 +      }
 +      omap_hsmmc_init(mmc);
 +
        omap3_touchbook_i2c_init();
        platform_add_devices(omap3_touchbook_devices,
                        ARRAY_SIZE(omap3_touchbook_devices));
@@@ -25,6 -25,7 +25,7 @@@
  #include <linux/gpio_keys.h>
  #include <linux/mmc/host.h>
  #include <linux/power/isp1704_charger.h>
+ #include <asm/system_info.h>
  
  #include <plat/mcspi.h>
  #include <plat/board.h>
@@@ -138,14 -139,17 +139,14 @@@ static struct lp5523_platform_data rx51
  
  static struct omap2_mcspi_device_config wl1251_mcspi_config = {
        .turbo_mode     = 0,
 -      .single_channel = 1,
  };
  
  static struct omap2_mcspi_device_config mipid_mcspi_config = {
        .turbo_mode     = 0,
 -      .single_channel = 1,
  };
  
  static struct omap2_mcspi_device_config tsc2005_mcspi_config = {
        .turbo_mode     = 0,
 -      .single_channel = 1,
  };
  
  static struct spi_board_info rx51_peripherals_spi_board_info[] __initdata = {
@@@ -1102,11 -1106,6 +1103,11 @@@ static struct tsc2005_platform_data tsc
        .esd_timeout_ms         = 8000,
  };
  
 +static struct gpio rx51_tsc2005_gpios[] __initdata = {
 +      { RX51_TSC2005_IRQ_GPIO,   GPIOF_IN,            "tsc2005 IRQ"   },
 +      { RX51_TSC2005_RESET_GPIO, GPIOF_OUT_INIT_HIGH, "tsc2005 reset" },
 +};
 +
  static void rx51_tsc2005_set_reset(bool enable)
  {
        gpio_set_value(RX51_TSC2005_RESET_GPIO, enable);
@@@ -1116,18 -1115,20 +1117,18 @@@ static void __init rx51_init_tsc2005(vo
  {
        int r;
  
 -      r = gpio_request_one(RX51_TSC2005_IRQ_GPIO, GPIOF_IN, "tsc2005 IRQ");
 -      if (r < 0) {
 -              printk(KERN_ERR "unable to get %s GPIO\n", "tsc2005 IRQ");
 -              rx51_peripherals_spi_board_info[RX51_SPI_TSC2005].irq = 0;
 -      }
 +      omap_mux_init_gpio(RX51_TSC2005_RESET_GPIO, OMAP_PIN_OUTPUT);
 +      omap_mux_init_gpio(RX51_TSC2005_IRQ_GPIO, OMAP_PIN_INPUT_PULLUP);
  
 -      r = gpio_request_one(RX51_TSC2005_RESET_GPIO, GPIOF_OUT_INIT_HIGH,
 -              "tsc2005 reset");
 -      if (r >= 0) {
 -              tsc2005_pdata.set_reset = rx51_tsc2005_set_reset;
 -      } else {
 -              printk(KERN_ERR "unable to get %s GPIO\n", "tsc2005 reset");
 +      r = gpio_request_array(rx51_tsc2005_gpios,
 +                             ARRAY_SIZE(rx51_tsc2005_gpios));
 +      if (r < 0) {
 +              printk(KERN_ERR "tsc2005 board initialization failed\n");
                tsc2005_pdata.esd_timeout_ms = 0;
 +              return;
        }
 +
 +      tsc2005_pdata.set_reset = rx51_tsc2005_set_reset;
  }
  
  void __init rx51_peripherals_init(void)
  
        partition = omap_mux_get("core");
        if (partition)
 -              omap2_hsmmc_init(mmc);
 +              omap_hsmmc_init(mmc);
  
        rx51_charger_init();
  }
@@@ -35,7 -35,6 +35,6 @@@
  #include <linux/irq.h>
  #include <linux/interrupt.h>
  
- #include <asm/system.h>
  
  #include <plat/omap_hwmod.h>
  
@@@ -100,8 -99,8 +99,8 @@@ void omap_mux_write_array(struct omap_m
  
  static char *omap_mux_options;
  
 -static int _omap_mux_init_gpio(struct omap_mux_partition *partition,
 -                             int gpio, int val)
 +static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition,
 +                                    int gpio, int val)
  {
        struct omap_mux_entry *e;
        struct omap_mux *gpio_mux = NULL;
        return 0;
  }
  
 -int omap_mux_init_gpio(int gpio, int val)
 +int __init omap_mux_init_gpio(int gpio, int val)
  {
        struct omap_mux_partition *partition;
        int ret;
        return -ENODEV;
  }
  
 -static int _omap_mux_get_by_name(struct omap_mux_partition *partition,
 -                               const char *muxname,
 -                               struct omap_mux **found_mux)
 +static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,
 +                                      const char *muxname,
 +                                      struct omap_mux **found_mux)
  {
        struct omap_mux *mux = NULL;
        struct omap_mux_entry *e;
        return -ENODEV;
  }
  
 -static int
 +static int __init
  omap_mux_get_by_name(const char *muxname,
                        struct omap_mux_partition **found_partition,
                        struct omap_mux **found_mux)
        return -ENODEV;
  }
  
 -int omap_mux_init_signal(const char *muxname, int val)
 +int __init omap_mux_init_signal(const char *muxname, int val)
  {
        struct omap_mux_partition *partition = NULL;
        struct omap_mux *mux = NULL;
@@@ -46,7 -46,6 +46,6 @@@
  #include <asm/cacheflush.h>
  #include <asm/tlbflush.h>
  #include <asm/smp_scu.h>
- #include <asm/system.h>
  #include <asm/pgalloc.h>
  #include <asm/suspend.h>
  #include <asm/hardware/cache-l2x0.h>
@@@ -263,10 -262,12 +262,10 @@@ int omap4_enter_lowpower(unsigned int c
         * In MPUSS OSWR or device OFF, interrupt controller  contest is lost.
         */
        mpuss_clear_prev_logic_pwrst();
 -      pwrdm_clear_all_prev_pwrst(mpuss_pd);
        if ((pwrdm_read_next_pwrst(mpuss_pd) == PWRDM_POWER_RET) &&
                (pwrdm_read_logic_retst(mpuss_pd) == PWRDM_POWER_OFF))
                save_state = 2;
  
 -      clear_cpu_prev_pwrst(cpu);
        cpu_clear_prev_logic_pwrst(cpu);
        set_cpu_next_pwrst(cpu, power_state);
        set_cpu_wakeup_addr(cpu, virt_to_phys(omap4_cpu_resume));
   * @cpu : CPU ID
   * @power_state: CPU low power state.
   */
 -int omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state)
 +int __cpuinit omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state)
  {
        unsigned int cpu_state = 0;
  
@@@ -26,6 -26,7 +26,6 @@@
  #include <linux/module.h>
  #include <linux/delay.h>
  #include <linux/clk.h>
 -#include <linux/io.h>
  #include <linux/irq.h>
  #include <linux/time.h>
  #include <linux/gpio.h>
  #include <asm/mach/time.h>
  #include <asm/mach/irq.h>
  #include <asm/mach-types.h>
+ #include <asm/system_misc.h>
  
 -#include <mach/irqs.h>
  #include <plat/clock.h>
  #include <plat/sram.h>
  #include <plat/dma.h>
  #include <plat/board.h>
  
 +#include <mach/irqs.h>
 +
  #include "common.h"
  #include "prm2xxx_3xxx.h"
  #include "prm-regbits-24xx.h"
  #include "sdrc.h"
  #include "pm.h"
  #include "control.h"
  #include "powerdomain.h"
  #include "clockdomain.h"
  
 -#ifdef CONFIG_SUSPEND
 -static suspend_state_t suspend_state = PM_SUSPEND_ON;
 -static inline bool is_suspending(void)
 -{
 -      return (suspend_state != PM_SUSPEND_ON);
 -}
 -#else
 -static inline bool is_suspending(void)
 -{
 -      return false;
 -}
 -#endif
 -
  static void (*omap2_sram_idle)(void);
  static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl,
                                  void __iomem *sdrc_power);
@@@ -71,7 -86,7 +72,7 @@@ static int omap2_fclks_active(void
        return (f1 | f2) ? 1 : 0;
  }
  
 -static void omap2_enter_full_retention(void)
 +static int omap2_enter_full_retention(void)
  {
        u32 l;
  
@@@ -134,8 -149,6 +135,8 @@@ no_sleep
  
        /* Mask future PRCM-to-MPU interrupts */
        omap2_prm_write_mod_reg(0x0, OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET);
 +
 +      return 0;
  }
  
  static int omap2_i2c_active(void)
@@@ -214,6 -227,7 +215,6 @@@ static int omap2_can_sleep(void
  
  static void omap2_pm_idle(void)
  {
 -      local_irq_disable();
        local_fiq_disable();
  
        if (!omap2_can_sleep()) {
  
  out:
        local_fiq_enable();
 -      local_irq_enable();
 -}
 -
 -#ifdef CONFIG_SUSPEND
 -static int omap2_pm_begin(suspend_state_t state)
 -{
 -      disable_hlt();
 -      suspend_state = state;
 -      return 0;
 -}
 -
 -static int omap2_pm_suspend(void)
 -{
 -      u32 wken_wkup, mir1;
 -
 -      wken_wkup = omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN);
 -      wken_wkup &= ~OMAP24XX_EN_GPT1_MASK;
 -      omap2_prm_write_mod_reg(wken_wkup, WKUP_MOD, PM_WKEN);
 -
 -      /* Mask GPT1 */
 -      mir1 = omap_readl(0x480fe0a4);
 -      omap_writel(1 << 5, 0x480fe0ac);
 -
 -      omap2_enter_full_retention();
 -
 -      omap_writel(mir1, 0x480fe0a4);
 -      omap2_prm_write_mod_reg(wken_wkup, WKUP_MOD, PM_WKEN);
 -
 -      return 0;
 -}
 -
 -static int omap2_pm_enter(suspend_state_t state)
 -{
 -      int ret = 0;
 -
 -      switch (state) {
 -      case PM_SUSPEND_STANDBY:
 -      case PM_SUSPEND_MEM:
 -              ret = omap2_pm_suspend();
 -              break;
 -      default:
 -              ret = -EINVAL;
 -      }
 -
 -      return ret;
 -}
 -
 -static void omap2_pm_end(void)
 -{
 -      suspend_state = PM_SUSPEND_ON;
 -      enable_hlt();
 -}
 -
 -static const struct platform_suspend_ops omap_pm_ops = {
 -      .begin          = omap2_pm_begin,
 -      .enter          = omap2_pm_enter,
 -      .end            = omap2_pm_end,
 -      .valid          = suspend_valid_only_mem,
 -};
 -#else
 -static const struct platform_suspend_ops __initdata omap_pm_ops;
 -#endif /* CONFIG_SUSPEND */
 -
 -/* XXX This function should be shareable between OMAP2xxx and OMAP3 */
 -static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
 -{
 -      if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
 -              clkdm_allow_idle(clkdm);
 -      else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
 -               atomic_read(&clkdm->usecount) == 0)
 -              clkdm_sleep(clkdm);
 -      return 0;
  }
  
  static void __init prcm_setup_regs(void)
        clkdm_sleep(gfx_clkdm);
  
        /* Enable hardware-supervised idle for all clkdms */
 -      clkdm_for_each(clkdms_setup, NULL);
 +      clkdm_for_each(omap_pm_clkdms_setup, NULL);
        clkdm_add_wkdep(mpu_clkdm, wkup_clkdm);
  
 +#ifdef CONFIG_SUSPEND
 +      omap_pm_suspend = omap2_enter_full_retention;
 +#endif
 +
        /* REVISIT: Configure number of 32 kHz clock cycles for sys_clk
         * stabilisation */
        omap2_prm_write_mod_reg(15 << OMAP_SETUP_TIME_SHIFT, OMAP24XX_GR_MOD,
@@@ -380,7 -462,8 +381,7 @@@ static int __init omap2_pm_init(void
                                                    omap24xx_cpu_suspend_sz);
        }
  
 -      suspend_set_ops(&omap_pm_ops);
 -      pm_idle = omap2_pm_idle;
 +      arm_pm_idle = omap2_pm_idle;
  
        return 0;
  }
@@@ -31,6 -31,7 +31,7 @@@
  #include <trace/events/power.h>
  
  #include <asm/suspend.h>
+ #include <asm/system_misc.h>
  
  #include <plat/sram.h>
  #include "clockdomain.h"
  #include "sdrc.h"
  #include "control.h"
  
 -#ifdef CONFIG_SUSPEND
 -static suspend_state_t suspend_state = PM_SUSPEND_ON;
 -#endif
 -
  /* pm34xx errata defined in pm.h */
  u16 pm34xx_errata;
  
@@@ -71,6 -76,16 +72,6 @@@ static struct powerdomain *mpu_pwrdm, *
  static struct powerdomain *core_pwrdm, *per_pwrdm;
  static struct powerdomain *cam_pwrdm;
  
 -static inline void omap3_per_save_context(void)
 -{
 -      omap_gpio_save_context();
 -}
 -
 -static inline void omap3_per_restore_context(void)
 -{
 -      omap_gpio_restore_context();
 -}
 -
  static void omap3_enable_io_chain(void)
  {
        int timeout = 0;
@@@ -276,6 -291,11 +277,6 @@@ void omap_sram_idle(void
        int core_prev_state, per_prev_state;
        u32 sdrc_pwr = 0;
  
 -      pwrdm_clear_all_prev_pwrst(mpu_pwrdm);
 -      pwrdm_clear_all_prev_pwrst(neon_pwrdm);
 -      pwrdm_clear_all_prev_pwrst(core_pwrdm);
 -      pwrdm_clear_all_prev_pwrst(per_pwrdm);
 -
        mpu_next_state = pwrdm_read_next_pwrst(mpu_pwrdm);
        switch (mpu_next_state) {
        case PWRDM_POWER_ON:
        if (per_next_state < PWRDM_POWER_ON) {
                per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0;
                omap2_gpio_prepare_for_idle(per_going_off);
 -              if (per_next_state == PWRDM_POWER_OFF)
 -                              omap3_per_save_context();
        }
  
        /* CORE */
        if (per_next_state < PWRDM_POWER_ON) {
                per_prev_state = pwrdm_read_prev_pwrst(per_pwrdm);
                omap2_gpio_resume_after_idle();
 -              if (per_prev_state == PWRDM_POWER_OFF)
 -                      omap3_per_restore_context();
        }
  
        /* Disable IO-PAD and IO-CHAIN wakeup */
  
  static void omap3_pm_idle(void)
  {
 -      local_irq_disable();
        local_fiq_disable();
  
 -      if (omap_irq_pending() || need_resched())
 +      if (omap_irq_pending())
                goto out;
  
        trace_power_start(POWER_CSTATE, 1, smp_processor_id());
  
  out:
        local_fiq_enable();
 -      local_irq_enable();
  }
  
  #ifdef CONFIG_SUSPEND
@@@ -454,6 -480,50 +455,6 @@@ restore
        return ret;
  }
  
 -static int omap3_pm_enter(suspend_state_t unused)
 -{
 -      int ret = 0;
 -
 -      switch (suspend_state) {
 -      case PM_SUSPEND_STANDBY:
 -      case PM_SUSPEND_MEM:
 -              ret = omap3_pm_suspend();
 -              break;
 -      default:
 -              ret = -EINVAL;
 -      }
 -
 -      return ret;
 -}
 -
 -/* Hooks to enable / disable UART interrupts during suspend */
 -static int omap3_pm_begin(suspend_state_t state)
 -{
 -      disable_hlt();
 -      suspend_state = state;
 -      omap_prcm_irq_prepare();
 -      return 0;
 -}
 -
 -static void omap3_pm_end(void)
 -{
 -      suspend_state = PM_SUSPEND_ON;
 -      enable_hlt();
 -      return;
 -}
 -
 -static void omap3_pm_finish(void)
 -{
 -      omap_prcm_irq_complete();
 -}
 -
 -static const struct platform_suspend_ops omap_pm_ops = {
 -      .begin          = omap3_pm_begin,
 -      .end            = omap3_pm_end,
 -      .enter          = omap3_pm_enter,
 -      .finish         = omap3_pm_finish,
 -      .valid          = suspend_valid_only_mem,
 -};
  #endif /* CONFIG_SUSPEND */
  
  
@@@ -674,6 -744,21 +675,6 @@@ static int __init pwrdms_setup(struct p
  }
  
  /*
 - * Enable hw supervised mode for all clockdomains if it's
 - * supported. Initiate sleep transition for other clockdomains, if
 - * they are not used
 - */
 -static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
 -{
 -      if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
 -              clkdm_allow_idle(clkdm);
 -      else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
 -               atomic_read(&clkdm->usecount) == 0)
 -              clkdm_sleep(clkdm);
 -      return 0;
 -}
 -
 -/*
   * Push functions to SRAM
   *
   * The minimum set of functions is pushed to SRAM for execution:
@@@ -742,7 -827,7 +743,7 @@@ static int __init omap3_pm_init(void
                goto err2;
        }
  
 -      (void) clkdm_for_each(clkdms_setup, NULL);
 +      (void) clkdm_for_each(omap_pm_clkdms_setup, NULL);
  
        mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
        if (mpu_pwrdm == NULL) {
        core_clkdm = clkdm_lookup("core_clkdm");
  
  #ifdef CONFIG_SUSPEND
 -      suspend_set_ops(&omap_pm_ops);
 -#endif /* CONFIG_SUSPEND */
 +      omap_pm_suspend = omap3_pm_suspend;
 +#endif
  
 -      pm_idle = omap3_pm_idle;
 +      arm_pm_idle = omap3_pm_idle;
        omap3_idle_init();
  
        /*
@@@ -16,6 -16,7 +16,7 @@@
  #include <linux/list.h>
  #include <linux/err.h>
  #include <linux/slab.h>
+ #include <asm/system_misc.h>
  
  #include "common.h"
  #include "clockdomain.h"
@@@ -83,8 -84,59 +84,8 @@@ static int omap4_pm_suspend(void
  
        return 0;
  }
 -
 -static int omap4_pm_enter(suspend_state_t suspend_state)
 -{
 -      int ret = 0;
 -
 -      switch (suspend_state) {
 -      case PM_SUSPEND_STANDBY:
 -      case PM_SUSPEND_MEM:
 -              ret = omap4_pm_suspend();
 -              break;
 -      default:
 -              ret = -EINVAL;
 -      }
 -
 -      return ret;
 -}
 -
 -static int omap4_pm_begin(suspend_state_t state)
 -{
 -      disable_hlt();
 -      return 0;
 -}
 -
 -static void omap4_pm_end(void)
 -{
 -      enable_hlt();
 -      return;
 -}
 -
 -static const struct platform_suspend_ops omap_pm_ops = {
 -      .begin          = omap4_pm_begin,
 -      .end            = omap4_pm_end,
 -      .enter          = omap4_pm_enter,
 -      .valid          = suspend_valid_only_mem,
 -};
  #endif /* CONFIG_SUSPEND */
  
 -/*
 - * Enable hardware supervised mode for all clockdomains if it's
 - * supported. Initiate sleep transition for other clockdomains, if
 - * they are not used
 - */
 -static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
 -{
 -      if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
 -              clkdm_allow_idle(clkdm);
 -      else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
 -                      atomic_read(&clkdm->usecount) == 0)
 -              clkdm_sleep(clkdm);
 -      return 0;
 -}
 -
 -
  static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
  {
        struct power_state *pwrst;
   * omap_default_idle - OMAP4 default ilde routine.'
   *
   * Implements OMAP4 memory, IO ordering requirements which can't be addressed
 - * with default arch_idle() hook. Used by all CPUs with !CONFIG_CPUIDLE and
 + * with default cpu_do_idle() hook. Used by all CPUs with !CONFIG_CPUIDLE and
   * by secondary CPU with CONFIG_CPUIDLE.
   */
  static void omap_default_idle(void)
  {
 -      local_irq_disable();
        local_fiq_disable();
  
        omap_do_wfi();
  
        local_fiq_enable();
 -      local_irq_enable();
  }
  
  /**
@@@ -196,14 -250,14 +197,14 @@@ static int __init omap4_pm_init(void
                goto err2;
        }
  
 -      (void) clkdm_for_each(clkdms_setup, NULL);
 +      (void) clkdm_for_each(omap_pm_clkdms_setup, NULL);
  
  #ifdef CONFIG_SUSPEND
 -      suspend_set_ops(&omap_pm_ops);
 -#endif /* CONFIG_SUSPEND */
 +      omap_pm_suspend = omap4_pm_suspend;
 +#endif
  
 -      /* Overwrite the default arch_idle() */
 -      pm_idle = omap_default_idle;
 +      /* Overwrite the default cpu_do_idle() */
 +      arm_pm_idle = omap_default_idle;
  
        omap4_idle_init();
  
@@@ -25,8 -25,7 +25,8 @@@
  #include <linux/mtd/physmap.h>
  #include <linux/pda_power.h>
  #include <linux/pwm_backlight.h>
 -#include <linux/regulator/bq24022.h>
 +#include <linux/regulator/driver.h>
 +#include <linux/regulator/gpio-regulator.h>
  #include <linux/regulator/machine.h>
  #include <linux/usb/gpio_vbus.h>
  #include <linux/i2c/pxa-i2c.h>
@@@ -34,6 -33,7 +34,7 @@@
  #include <mach/hardware.h>
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
+ #include <asm/system_info.h>
  
  #include <mach/pxa27x.h>
  #include <mach/magician.h>
@@@ -597,34 -597,14 +598,34 @@@ static struct regulator_init_data bq240
        .consumer_supplies      = bq24022_consumers,
  };
  
 -static struct bq24022_mach_info bq24022_info = {
 -      .gpio_nce   = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
 -      .gpio_iset2 = EGPIO_MAGICIAN_BQ24022_ISET2,
 -      .init_data  = &bq24022_init_data,
 +static struct gpio bq24022_gpios[] = {
 +      { EGPIO_MAGICIAN_BQ24022_ISET2, GPIOF_OUT_INIT_LOW, "bq24022_iset2" },
 +};
 +
 +static struct gpio_regulator_state bq24022_states[] = {
 +      { .value = 100000, .gpios = (0 << 0) },
 +      { .value = 500000, .gpios = (1 << 0) },
 +};
 +
 +static struct gpio_regulator_config bq24022_info = {
 +      .supply_name = "bq24022",
 +
 +      .enable_gpio = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
 +      .enable_high = 0,
 +      .enabled_at_boot = 0,
 +
 +      .gpios = bq24022_gpios,
 +      .nr_gpios = ARRAY_SIZE(bq24022_gpios),
 +
 +      .states = bq24022_states,
 +      .nr_states = ARRAY_SIZE(bq24022_states),
 +
 +      .type = REGULATOR_CURRENT,
 +      .init_data = &bq24022_init_data,
  };
  
  static struct platform_device bq24022 = {
 -      .name = "bq24022",
 +      .name = "gpio-regulator",
        .id   = -1,
        .dev  = {
                .platform_data = &bq24022_info,
@@@ -28,6 -28,7 +28,7 @@@
  #include <asm/page.h>
  #include <asm/domain.h>
  #include <asm/setup.h>
+ #include <asm/system_misc.h>
  
  #include <asm/mach/map.h>
  #include <asm/mach/arch.h>
@@@ -98,9 -99,15 +99,9 @@@ static void __init rpc_map_io(void
  }
  
  static struct resource acornfb_resources[] = {
 -      {       /* VIDC */
 -              .start          = 0x03400000,
 -              .end            = 0x035fffff,
 -              .flags          = IORESOURCE_MEM,
 -      }, {
 -              .start          = IRQ_VSYNCPULSE,
 -              .end            = IRQ_VSYNCPULSE,
 -              .flags          = IORESOURCE_IRQ,
 -      },
 +      /* VIDC */
 +      DEFINE_RES_MEM(0x03400000, 0x00200000),
 +      DEFINE_RES_IRQ(IRQ_VSYNCPULSE),
  };
  
  static struct platform_device acornfb_device = {
  };
  
  static struct resource iomd_resources[] = {
 -      {
 -              .start          = 0x03200000,
 -              .end            = 0x0320ffff,
 -              .flags          = IORESOURCE_MEM,
 -      },
 +      DEFINE_RES_MEM(0x03200000, 0x10000),
  };
  
  static struct platform_device iomd_device = {
        .resource               = iomd_resources,
  };
  
 +static struct resource iomd_kart_resources[] = {
 +      DEFINE_RES_IRQ(IRQ_KEYBOARDRX),
 +      DEFINE_RES_IRQ(IRQ_KEYBOARDTX),
 +};
 +
  static struct platform_device kbd_device = {
        .name                   = "kart",
        .id                     = -1,
        .dev                    = {
                .parent         = &iomd_device.dev,
        },
 +      .num_resources          = ARRAY_SIZE(iomd_kart_resources),
 +      .resource               = iomd_kart_resources,
  };
  
  static struct plat_serial8250_port serial_platform_data[] = {
        {
                .mapbase        = 0x03010fe0,
 -              .irq            = 10,
 +              .irq            = IRQ_SERIALPORT,
                .uartclk        = 1843200,
                .regshift       = 2,
                .iotype         = UPIO_MEM,
@@@ -164,9 -168,21 +165,9 @@@ static struct pata_platform_info pata_p
  };
  
  static struct resource pata_resources[] = {
 -      [0] = {
 -              .start          = 0x030107c0,
 -              .end            = 0x030107df,
 -              .flags          = IORESOURCE_MEM,
 -      },
 -      [1] = {
 -              .start          = 0x03010fd8,
 -              .end            = 0x03010fdb,
 -              .flags          = IORESOURCE_MEM,
 -      },
 -      [2] = {
 -              .start          = IRQ_HARDDISK,
 -              .end            = IRQ_HARDDISK,
 -              .flags          = IORESOURCE_IRQ,
 -      },
 +      DEFINE_RES_MEM(0x030107c0, 0x20),
 +      DEFINE_RES_MEM(0x03010fd8, 0x04),
 +      DEFINE_RES_IRQ(IRQ_HARDDISK),
  };
  
  static struct platform_device pata_device = {
index 061b6bb,0000000..a3c5cb0
mode 100644,000000..100644
--- /dev/null
@@@ -1,206 -1,0 +1,207 @@@
 +/* linux/arch/arm/mach-s3c2410/s3c2410.c
 + *
 + * Copyright (c) 2003-2005 Simtec Electronics
 + *    Ben Dooks <ben@simtec.co.uk>
 + *
 + * http://www.simtec.co.uk/products/EB2410ITX/
 + *
 + * 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/kernel.h>
 +#include <linux/types.h>
 +#include <linux/interrupt.h>
 +#include <linux/list.h>
 +#include <linux/timer.h>
 +#include <linux/init.h>
 +#include <linux/gpio.h>
 +#include <linux/clk.h>
 +#include <linux/device.h>
 +#include <linux/syscore_ops.h>
 +#include <linux/serial_core.h>
 +#include <linux/platform_device.h>
 +#include <linux/io.h>
 +
 +#include <asm/mach/arch.h>
 +#include <asm/mach/map.h>
 +#include <asm/mach/irq.h>
 +
 +#include <mach/hardware.h>
 +#include <asm/irq.h>
++#include <asm/system_misc.h>
 +
 +#include <plat/cpu-freq.h>
 +
 +#include <mach/regs-clock.h>
 +#include <plat/regs-serial.h>
 +
 +#include <plat/s3c2410.h>
 +#include <plat/cpu.h>
 +#include <plat/devs.h>
 +#include <plat/clock.h>
 +#include <plat/pll.h>
 +#include <plat/pm.h>
 +#include <plat/watchdog-reset.h>
 +
 +#include <plat/gpio-core.h>
 +#include <plat/gpio-cfg.h>
 +#include <plat/gpio-cfg-helpers.h>
 +
 +/* Initial IO mappings */
 +
 +static struct map_desc s3c2410_iodesc[] __initdata = {
 +      IODESC_ENT(CLKPWR),
 +      IODESC_ENT(TIMER),
 +      IODESC_ENT(WATCHDOG),
 +};
 +
 +/* our uart devices */
 +
 +/* uart registration process */
 +
 +void __init s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no)
 +{
 +      s3c24xx_init_uartdevs("s3c2410-uart", s3c2410_uart_resources, cfg, no);
 +}
 +
 +/* s3c2410_map_io
 + *
 + * register the standard cpu IO areas, and any passed in from the
 + * machine specific initialisation.
 +*/
 +
 +void __init s3c2410_map_io(void)
 +{
 +      s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up;
 +      s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up;
 +
 +      iotable_init(s3c2410_iodesc, ARRAY_SIZE(s3c2410_iodesc));
 +}
 +
 +void __init_or_cpufreq s3c2410_setup_clocks(void)
 +{
 +      struct clk *xtal_clk;
 +      unsigned long tmp;
 +      unsigned long xtal;
 +      unsigned long fclk;
 +      unsigned long hclk;
 +      unsigned long pclk;
 +
 +      xtal_clk = clk_get(NULL, "xtal");
 +      xtal = clk_get_rate(xtal_clk);
 +      clk_put(xtal_clk);
 +
 +      /* now we've got our machine bits initialised, work out what
 +       * clocks we've got */
 +
 +      fclk = s3c24xx_get_pll(__raw_readl(S3C2410_MPLLCON), xtal);
 +
 +      tmp = __raw_readl(S3C2410_CLKDIVN);
 +
 +      /* work out clock scalings */
 +
 +      hclk = fclk / ((tmp & S3C2410_CLKDIVN_HDIVN) ? 2 : 1);
 +      pclk = hclk / ((tmp & S3C2410_CLKDIVN_PDIVN) ? 2 : 1);
 +
 +      /* print brieft summary of clocks, etc */
 +
 +      printk("S3C2410: core %ld.%03ld MHz, memory %ld.%03ld MHz, peripheral %ld.%03ld MHz\n",
 +             print_mhz(fclk), print_mhz(hclk), print_mhz(pclk));
 +
 +      /* initialise the clocks here, to allow other things like the
 +       * console to use them
 +       */
 +
 +      s3c24xx_setup_clocks(fclk, hclk, pclk);
 +}
 +
 +/* fake ARMCLK for use with cpufreq, etc. */
 +
 +static struct clk s3c2410_armclk = {
 +      .name   = "armclk",
 +      .parent = &clk_f,
 +      .id     = -1,
 +};
 +
 +static struct clk_lookup s3c2410_clk_lookup[] = {
 +      CLKDEV_INIT(NULL, "clk_uart_baud0", &clk_p),
 +      CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk),
 +};
 +
 +void __init s3c2410_init_clocks(int xtal)
 +{
 +      s3c24xx_register_baseclocks(xtal);
 +      s3c2410_setup_clocks();
 +      s3c2410_baseclk_add();
 +      s3c24xx_register_clock(&s3c2410_armclk);
 +      clkdev_add_table(s3c2410_clk_lookup, ARRAY_SIZE(s3c2410_clk_lookup));
 +}
 +
 +struct bus_type s3c2410_subsys = {
 +      .name = "s3c2410-core",
 +      .dev_name = "s3c2410-core",
 +};
 +
 +/* Note, we would have liked to name this s3c2410-core, but we cannot
 + * register two subsystems with the same name.
 + */
 +struct bus_type s3c2410a_subsys = {
 +      .name = "s3c2410a-core",
 +      .dev_name = "s3c2410a-core",
 +};
 +
 +static struct device s3c2410_dev = {
 +      .bus            = &s3c2410_subsys,
 +};
 +
 +/* need to register the subsystem before we actually register the device, and
 + * we also need to ensure that it has been initialised before any of the
 + * drivers even try to use it (even if not on an s3c2410 based system)
 + * as a driver which may support both 2410 and 2440 may try and use it.
 +*/
 +
 +static int __init s3c2410_core_init(void)
 +{
 +      return subsys_system_register(&s3c2410_subsys, NULL);
 +}
 +
 +core_initcall(s3c2410_core_init);
 +
 +static int __init s3c2410a_core_init(void)
 +{
 +      return subsys_system_register(&s3c2410a_subsys, NULL);
 +}
 +
 +core_initcall(s3c2410a_core_init);
 +
 +int __init s3c2410_init(void)
 +{
 +      printk("S3C2410: Initialising architecture\n");
 +
 +#ifdef CONFIG_PM
 +      register_syscore_ops(&s3c2410_pm_syscore_ops);
 +#endif
 +      register_syscore_ops(&s3c24xx_irq_syscore_ops);
 +
 +      return device_register(&s3c2410_dev);
 +}
 +
 +int __init s3c2410a_init(void)
 +{
 +      s3c2410_dev.bus = &s3c2410a_subsys;
 +      return s3c2410_init();
 +}
 +
 +void s3c2410_restart(char mode, const char *cmd)
 +{
 +      if (mode == 's') {
 +              soft_restart(0);
 +      }
 +
 +      arch_wdt_reset();
 +
 +      /* we'll take a jump through zero as a poor second */
 +      soft_restart(0);
 +}
index c6eac98,0000000..d4bc7f9
mode 100644,000000..100644
--- /dev/null
@@@ -1,251 -1,0 +1,252 @@@
 +/* linux/arch/arm/mach-s3c2412/s3c2412.c
 + *
 + * Copyright (c) 2006 Simtec Electronics
 + *    Ben Dooks <ben@simtec.co.uk>
 + *
 + * http://armlinux.simtec.co.uk/.
 + *
 + * 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/kernel.h>
 +#include <linux/types.h>
 +#include <linux/interrupt.h>
 +#include <linux/list.h>
 +#include <linux/timer.h>
 +#include <linux/init.h>
 +#include <linux/clk.h>
 +#include <linux/delay.h>
 +#include <linux/device.h>
 +#include <linux/syscore_ops.h>
 +#include <linux/serial_core.h>
 +#include <linux/platform_device.h>
 +#include <linux/io.h>
 +
 +#include <asm/mach/arch.h>
 +#include <asm/mach/map.h>
 +#include <asm/mach/irq.h>
 +
 +#include <mach/hardware.h>
 +#include <asm/proc-fns.h>
 +#include <asm/irq.h>
++#include <asm/system_misc.h>
 +
 +#include <plat/cpu-freq.h>
 +
 +#include <mach/regs-clock.h>
 +#include <plat/regs-serial.h>
 +#include <mach/regs-power.h>
 +#include <mach/regs-gpio.h>
 +#include <mach/regs-gpioj.h>
 +#include <mach/regs-dsc.h>
 +#include <plat/regs-spi.h>
 +#include <mach/regs-s3c2412.h>
 +
 +#include <plat/s3c2412.h>
 +#include <plat/cpu.h>
 +#include <plat/devs.h>
 +#include <plat/clock.h>
 +#include <plat/pm.h>
 +#include <plat/pll.h>
 +#include <plat/nand-core.h>
 +
 +#ifndef CONFIG_CPU_S3C2412_ONLY
 +void __iomem *s3c24xx_va_gpio2 = S3C24XX_VA_GPIO;
 +
 +static inline void s3c2412_init_gpio2(void)
 +{
 +      s3c24xx_va_gpio2 = S3C24XX_VA_GPIO + 0x10;
 +}
 +#else
 +#define s3c2412_init_gpio2() do { } while(0)
 +#endif
 +
 +/* Initial IO mappings */
 +
 +static struct map_desc s3c2412_iodesc[] __initdata = {
 +      IODESC_ENT(CLKPWR),
 +      IODESC_ENT(TIMER),
 +      IODESC_ENT(WATCHDOG),
 +      {
 +              .virtual = (unsigned long)S3C2412_VA_SSMC,
 +              .pfn     = __phys_to_pfn(S3C2412_PA_SSMC),
 +              .length  = SZ_1M,
 +              .type    = MT_DEVICE,
 +      },
 +      {
 +              .virtual = (unsigned long)S3C2412_VA_EBI,
 +              .pfn     = __phys_to_pfn(S3C2412_PA_EBI),
 +              .length  = SZ_1M,
 +              .type    = MT_DEVICE,
 +      },
 +};
 +
 +/* uart registration process */
 +
 +void __init s3c2412_init_uarts(struct s3c2410_uartcfg *cfg, int no)
 +{
 +      s3c24xx_init_uartdevs("s3c2412-uart", s3c2410_uart_resources, cfg, no);
 +
 +      /* rename devices that are s3c2412/s3c2413 specific */
 +      s3c_device_sdi.name  = "s3c2412-sdi";
 +      s3c_device_lcd.name  = "s3c2412-lcd";
 +      s3c_nand_setname("s3c2412-nand");
 +
 +      /* alter IRQ of SDI controller */
 +
 +      s3c_device_sdi.resource[1].start = IRQ_S3C2412_SDI;
 +      s3c_device_sdi.resource[1].end   = IRQ_S3C2412_SDI;
 +
 +      /* spi channel related changes, s3c2412/13 specific */
 +      s3c_device_spi0.name = "s3c2412-spi";
 +      s3c_device_spi0.resource[0].end = S3C24XX_PA_SPI + 0x24;
 +      s3c_device_spi1.name = "s3c2412-spi";
 +      s3c_device_spi1.resource[0].start = S3C24XX_PA_SPI + S3C2412_SPI1;
 +      s3c_device_spi1.resource[0].end = S3C24XX_PA_SPI + S3C2412_SPI1 + 0x24;
 +
 +}
 +
 +/* s3c2412_idle
 + *
 + * use the standard idle call by ensuring the idle mode
 + * in power config, then issuing the idle co-processor
 + * instruction
 +*/
 +
 +static void s3c2412_idle(void)
 +{
 +      unsigned long tmp;
 +
 +      /* ensure our idle mode is to go to idle */
 +
 +      tmp = __raw_readl(S3C2412_PWRCFG);
 +      tmp &= ~S3C2412_PWRCFG_STANDBYWFI_MASK;
 +      tmp |= S3C2412_PWRCFG_STANDBYWFI_IDLE;
 +      __raw_writel(tmp, S3C2412_PWRCFG);
 +
 +      cpu_do_idle();
 +}
 +
 +void s3c2412_restart(char mode, const char *cmd)
 +{
 +      if (mode == 's')
 +              soft_restart(0);
 +
 +      /* errata "Watch-dog/Software Reset Problem" specifies that
 +       * this reset must be done with the SYSCLK sourced from
 +       * EXTCLK instead of FOUT to avoid a glitch in the reset
 +       * mechanism.
 +       *
 +       * See the watchdog section of the S3C2412 manual for more
 +       * information on this fix.
 +       */
 +
 +      __raw_writel(0x00, S3C2412_CLKSRC);
 +      __raw_writel(S3C2412_SWRST_RESET, S3C2412_SWRST);
 +
 +      mdelay(1);
 +}
 +
 +/* s3c2412_map_io
 + *
 + * register the standard cpu IO areas, and any passed in from the
 + * machine specific initialisation.
 +*/
 +
 +void __init s3c2412_map_io(void)
 +{
 +      /* move base of IO */
 +
 +      s3c2412_init_gpio2();
 +
 +      /* set our idle function */
 +
 +      arm_pm_idle = s3c2412_idle;
 +
 +      /* register our io-tables */
 +
 +      iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc));
 +}
 +
 +void __init_or_cpufreq s3c2412_setup_clocks(void)
 +{
 +      struct clk *xtal_clk;
 +      unsigned long tmp;
 +      unsigned long xtal;
 +      unsigned long fclk;
 +      unsigned long hclk;
 +      unsigned long pclk;
 +
 +      xtal_clk = clk_get(NULL, "xtal");
 +      xtal = clk_get_rate(xtal_clk);
 +      clk_put(xtal_clk);
 +
 +      /* now we've got our machine bits initialised, work out what
 +       * clocks we've got */
 +
 +      fclk = s3c24xx_get_pll(__raw_readl(S3C2410_MPLLCON), xtal * 2);
 +
 +      clk_mpll.rate = fclk;
 +
 +      tmp = __raw_readl(S3C2410_CLKDIVN);
 +
 +      /* work out clock scalings */
 +
 +      hclk = fclk / ((tmp & S3C2412_CLKDIVN_HDIVN_MASK) + 1);
 +      hclk /= ((tmp & S3C2412_CLKDIVN_ARMDIVN) ? 2 : 1);
 +      pclk = hclk / ((tmp & S3C2412_CLKDIVN_PDIVN) ? 2 : 1);
 +
 +      /* print brieft summary of clocks, etc */
 +
 +      printk("S3C2412: core %ld.%03ld MHz, memory %ld.%03ld MHz, peripheral %ld.%03ld MHz\n",
 +             print_mhz(fclk), print_mhz(hclk), print_mhz(pclk));
 +
 +      s3c24xx_setup_clocks(fclk, hclk, pclk);
 +}
 +
 +void __init s3c2412_init_clocks(int xtal)
 +{
 +      /* initialise the clocks here, to allow other things like the
 +       * console to use them
 +       */
 +
 +      s3c24xx_register_baseclocks(xtal);
 +      s3c2412_setup_clocks();
 +      s3c2412_baseclk_add();
 +}
 +
 +/* need to register the subsystem before we actually register the device, and
 + * we also need to ensure that it has been initialised before any of the
 + * drivers even try to use it (even if not on an s3c2412 based system)
 + * as a driver which may support both 2410 and 2440 may try and use it.
 +*/
 +
 +struct bus_type s3c2412_subsys = {
 +      .name = "s3c2412-core",
 +      .dev_name = "s3c2412-core",
 +};
 +
 +static int __init s3c2412_core_init(void)
 +{
 +      return subsys_system_register(&s3c2412_subsys, NULL);
 +}
 +
 +core_initcall(s3c2412_core_init);
 +
 +static struct device s3c2412_dev = {
 +      .bus            = &s3c2412_subsys,
 +};
 +
 +int __init s3c2412_init(void)
 +{
 +      printk("S3C2412: Initialising architecture\n");
 +
 +#ifdef CONFIG_PM
 +      register_syscore_ops(&s3c2412_pm_syscore_ops);
 +#endif
 +      register_syscore_ops(&s3c24xx_irq_syscore_ops);
 +
 +      return device_register(&s3c2412_dev);
 +}
index 0e9a71c,0000000..7743fad
mode 100644,000000..100644
--- /dev/null
@@@ -1,148 -1,0 +1,149 @@@
 +/* linux/arch/arm/mach-s3c2416/s3c2416.c
 + *
 + * Copyright (c) 2009 Yauhen Kharuzhy <jekhor@gmail.com>,
 + *    as part of OpenInkpot project
 + * Copyright (c) 2009 Promwad Innovation Company
 + *    Yauhen Kharuzhy <yauhen.kharuzhy@promwad.com>
 + *
 + * Samsung S3C2416 Mobile CPU support
 + *
 + * 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 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/kernel.h>
 +#include <linux/types.h>
 +#include <linux/interrupt.h>
 +#include <linux/list.h>
 +#include <linux/timer.h>
 +#include <linux/init.h>
 +#include <linux/gpio.h>
 +#include <linux/platform_device.h>
 +#include <linux/serial_core.h>
 +#include <linux/device.h>
 +#include <linux/syscore_ops.h>
 +#include <linux/clk.h>
 +#include <linux/io.h>
 +
 +#include <asm/mach/arch.h>
 +#include <asm/mach/map.h>
 +#include <asm/mach/irq.h>
 +
 +#include <mach/hardware.h>
 +#include <asm/proc-fns.h>
 +#include <asm/irq.h>
++#include <asm/system_misc.h>
 +
 +#include <mach/regs-s3c2443-clock.h>
 +
 +#include <plat/gpio-core.h>
 +#include <plat/gpio-cfg.h>
 +#include <plat/gpio-cfg-helpers.h>
 +#include <plat/s3c2416.h>
 +#include <plat/devs.h>
 +#include <plat/cpu.h>
 +#include <plat/sdhci.h>
 +#include <plat/pm.h>
 +
 +#include <plat/iic-core.h>
 +#include <plat/fb-core.h>
 +#include <plat/nand-core.h>
 +#include <plat/adc-core.h>
 +#include <plat/rtc-core.h>
 +
 +static struct map_desc s3c2416_iodesc[] __initdata = {
 +      IODESC_ENT(WATCHDOG),
 +      IODESC_ENT(CLKPWR),
 +      IODESC_ENT(TIMER),
 +};
 +
 +struct bus_type s3c2416_subsys = {
 +      .name = "s3c2416-core",
 +      .dev_name = "s3c2416-core",
 +};
 +
 +static struct device s3c2416_dev = {
 +      .bus            = &s3c2416_subsys,
 +};
 +
 +void s3c2416_restart(char mode, const char *cmd)
 +{
 +      if (mode == 's')
 +              soft_restart(0);
 +
 +      __raw_writel(S3C2443_SWRST_RESET, S3C2443_SWRST);
 +}
 +
 +int __init s3c2416_init(void)
 +{
 +      printk(KERN_INFO "S3C2416: Initializing architecture\n");
 +
 +      /* change WDT IRQ number */
 +      s3c_device_wdt.resource[1].start = IRQ_S3C2443_WDT;
 +      s3c_device_wdt.resource[1].end   = IRQ_S3C2443_WDT;
 +
 +      /* the i2c devices are directly compatible with s3c2440 */
 +      s3c_i2c0_setname("s3c2440-i2c");
 +      s3c_i2c1_setname("s3c2440-i2c");
 +
 +      s3c_fb_setname("s3c2443-fb");
 +
 +      s3c_adc_setname("s3c2416-adc");
 +      s3c_rtc_setname("s3c2416-rtc");
 +
 +#ifdef CONFIG_PM
 +      register_syscore_ops(&s3c2416_pm_syscore_ops);
 +#endif
 +      register_syscore_ops(&s3c24xx_irq_syscore_ops);
 +
 +      return device_register(&s3c2416_dev);
 +}
 +
 +void __init s3c2416_init_uarts(struct s3c2410_uartcfg *cfg, int no)
 +{
 +      s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no);
 +
 +      s3c_nand_setname("s3c2412-nand");
 +}
 +
 +/* s3c2416_map_io
 + *
 + * register the standard cpu IO areas, and any passed in from the
 + * machine specific initialisation.
 + */
 +
 +void __init s3c2416_map_io(void)
 +{
 +      s3c24xx_gpiocfg_default.set_pull = samsung_gpio_setpull_updown;
 +      s3c24xx_gpiocfg_default.get_pull = samsung_gpio_getpull_updown;
 +
 +      /* initialize device information early */
 +      s3c2416_default_sdhci0();
 +      s3c2416_default_sdhci1();
 +
 +      iotable_init(s3c2416_iodesc, ARRAY_SIZE(s3c2416_iodesc));
 +}
 +
 +/* need to register the subsystem before we actually register the device, and
 + * we also need to ensure that it has been initialised before any of the
 + * drivers even try to use it (even if not on an s3c2416 based system)
 + * as a driver which may support both 2443 and 2440 may try and use it.
 +*/
 +
 +static int __init s3c2416_core_init(void)
 +{
 +      return subsys_system_register(&s3c2416_subsys, NULL);
 +}
 +
 +core_initcall(s3c2416_core_init);
index b7778a9,0000000..ab648ad
mode 100644,000000..100644
--- /dev/null
@@@ -1,116 -1,0 +1,117 @@@
 +/* linux/arch/arm/mach-s3c2443/s3c2443.c
 + *
 + * Copyright (c) 2007 Simtec Electronics
 + *   Ben Dooks <ben@simtec.co.uk>
 + *
 + * Samsung S3C2443 Mobile CPU support
 + *
 + * 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/kernel.h>
 +#include <linux/types.h>
 +#include <linux/interrupt.h>
 +#include <linux/list.h>
 +#include <linux/timer.h>
 +#include <linux/init.h>
 +#include <linux/gpio.h>
 +#include <linux/platform_device.h>
 +#include <linux/serial_core.h>
 +#include <linux/device.h>
 +#include <linux/clk.h>
 +#include <linux/io.h>
 +
 +#include <asm/mach/arch.h>
 +#include <asm/mach/map.h>
 +#include <asm/mach/irq.h>
 +
 +#include <mach/hardware.h>
 +#include <asm/irq.h>
++#include <asm/system_misc.h>
 +
 +#include <mach/regs-s3c2443-clock.h>
 +
 +#include <plat/gpio-core.h>
 +#include <plat/gpio-cfg.h>
 +#include <plat/gpio-cfg-helpers.h>
 +#include <plat/s3c2443.h>
 +#include <plat/devs.h>
 +#include <plat/cpu.h>
 +#include <plat/fb-core.h>
 +#include <plat/nand-core.h>
 +#include <plat/adc-core.h>
 +#include <plat/rtc-core.h>
 +
 +static struct map_desc s3c2443_iodesc[] __initdata = {
 +      IODESC_ENT(WATCHDOG),
 +      IODESC_ENT(CLKPWR),
 +      IODESC_ENT(TIMER),
 +};
 +
 +struct bus_type s3c2443_subsys = {
 +      .name = "s3c2443-core",
 +      .dev_name = "s3c2443-core",
 +};
 +
 +static struct device s3c2443_dev = {
 +      .bus            = &s3c2443_subsys,
 +};
 +
 +void s3c2443_restart(char mode, const char *cmd)
 +{
 +      if (mode == 's')
 +              soft_restart(0);
 +
 +      __raw_writel(S3C2443_SWRST_RESET, S3C2443_SWRST);
 +}
 +
 +int __init s3c2443_init(void)
 +{
 +      printk("S3C2443: Initialising architecture\n");
 +
 +      s3c_nand_setname("s3c2412-nand");
 +      s3c_fb_setname("s3c2443-fb");
 +
 +      s3c_adc_setname("s3c2443-adc");
 +      s3c_rtc_setname("s3c2443-rtc");
 +
 +      /* change WDT IRQ number */
 +      s3c_device_wdt.resource[1].start = IRQ_S3C2443_WDT;
 +      s3c_device_wdt.resource[1].end   = IRQ_S3C2443_WDT;
 +
 +      return device_register(&s3c2443_dev);
 +}
 +
 +void __init s3c2443_init_uarts(struct s3c2410_uartcfg *cfg, int no)
 +{
 +      s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no);
 +}
 +
 +/* s3c2443_map_io
 + *
 + * register the standard cpu IO areas, and any passed in from the
 + * machine specific initialisation.
 + */
 +
 +void __init s3c2443_map_io(void)
 +{
 +      s3c24xx_gpiocfg_default.set_pull = s3c2443_gpio_setpull;
 +      s3c24xx_gpiocfg_default.get_pull = s3c2443_gpio_getpull;
 +
 +      iotable_init(s3c2443_iodesc, ARRAY_SIZE(s3c2443_iodesc));
 +}
 +
 +/* need to register the subsystem before we actually register the device, and
 + * we also need to ensure that it has been initialised before any of the
 + * drivers even try to use it (even if not on an s3c2443 based system)
 + * as a driver which may support both 2443 and 2440 may try and use it.
 +*/
 +
 +static int __init s3c2443_core_init(void)
 +{
 +      return subsys_system_register(&s3c2443_subsys, NULL);
 +}
 +
 +core_initcall(s3c2443_core_init);
index d15852f,0000000..6f74118
mode 100644,000000..100644
--- /dev/null
@@@ -1,210 -1,0 +1,211 @@@
 +/* linux/arch/arm/plat-s3c24xx/s3c244x.c
 + *
 + * Copyright (c) 2004-2006 Simtec Electronics
 + *   Ben Dooks <ben@simtec.co.uk>
 + *
 + * Samsung S3C2440 and S3C2442 Mobile CPU support (not S3C2443)
 + *
 + * 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/kernel.h>
 +#include <linux/types.h>
 +#include <linux/interrupt.h>
 +#include <linux/list.h>
 +#include <linux/timer.h>
 +#include <linux/init.h>
 +#include <linux/serial_core.h>
 +#include <linux/platform_device.h>
 +#include <linux/device.h>
 +#include <linux/syscore_ops.h>
 +#include <linux/clk.h>
 +#include <linux/io.h>
 +
++#include <asm/system_misc.h>
 +#include <asm/mach/arch.h>
 +#include <asm/mach/map.h>
 +#include <asm/mach/irq.h>
 +
 +#include <mach/hardware.h>
 +#include <asm/irq.h>
 +
 +#include <plat/cpu-freq.h>
 +
 +#include <mach/regs-clock.h>
 +#include <plat/regs-serial.h>
 +#include <mach/regs-gpio.h>
 +#include <mach/regs-gpioj.h>
 +#include <mach/regs-dsc.h>
 +
 +#include <plat/s3c2410.h>
 +#include <plat/s3c244x.h>
 +#include <plat/clock.h>
 +#include <plat/devs.h>
 +#include <plat/cpu.h>
 +#include <plat/pm.h>
 +#include <plat/pll.h>
 +#include <plat/nand-core.h>
 +#include <plat/watchdog-reset.h>
 +
 +static struct map_desc s3c244x_iodesc[] __initdata = {
 +      IODESC_ENT(CLKPWR),
 +      IODESC_ENT(TIMER),
 +      IODESC_ENT(WATCHDOG),
 +};
 +
 +/* uart initialisation */
 +
 +void __init s3c244x_init_uarts(struct s3c2410_uartcfg *cfg, int no)
 +{
 +      s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no);
 +}
 +
 +void __init s3c244x_map_io(void)
 +{
 +      /* register our io-tables */
 +
 +      iotable_init(s3c244x_iodesc, ARRAY_SIZE(s3c244x_iodesc));
 +
 +      /* rename any peripherals used differing from the s3c2410 */
 +
 +      s3c_device_sdi.name  = "s3c2440-sdi";
 +      s3c_device_i2c0.name  = "s3c2440-i2c";
 +      s3c_nand_setname("s3c2440-nand");
 +      s3c_device_ts.name = "s3c2440-ts";
 +      s3c_device_usbgadget.name = "s3c2440-usbgadget";
 +}
 +
 +void __init_or_cpufreq s3c244x_setup_clocks(void)
 +{
 +      struct clk *xtal_clk;
 +      unsigned long clkdiv;
 +      unsigned long camdiv;
 +      unsigned long xtal;
 +      unsigned long hclk, fclk, pclk;
 +      int hdiv = 1;
 +
 +      xtal_clk = clk_get(NULL, "xtal");
 +      xtal = clk_get_rate(xtal_clk);
 +      clk_put(xtal_clk);
 +
 +      fclk = s3c24xx_get_pll(__raw_readl(S3C2410_MPLLCON), xtal) * 2;
 +
 +      clkdiv = __raw_readl(S3C2410_CLKDIVN);
 +      camdiv = __raw_readl(S3C2440_CAMDIVN);
 +
 +      /* work out clock scalings */
 +
 +      switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
 +      case S3C2440_CLKDIVN_HDIVN_1:
 +              hdiv = 1;
 +              break;
 +
 +      case S3C2440_CLKDIVN_HDIVN_2:
 +              hdiv = 2;
 +              break;
 +
 +      case S3C2440_CLKDIVN_HDIVN_4_8:
 +              hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
 +              break;
 +
 +      case S3C2440_CLKDIVN_HDIVN_3_6:
 +              hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
 +              break;
 +      }
 +
 +      hclk = fclk / hdiv;
 +      pclk = hclk / ((clkdiv & S3C2440_CLKDIVN_PDIVN) ? 2 : 1);
 +
 +      /* print brief summary of clocks, etc */
 +
 +      printk("S3C244X: core %ld.%03ld MHz, memory %ld.%03ld MHz, peripheral %ld.%03ld MHz\n",
 +             print_mhz(fclk), print_mhz(hclk), print_mhz(pclk));
 +
 +      s3c24xx_setup_clocks(fclk, hclk, pclk);
 +}
 +
 +void __init s3c244x_init_clocks(int xtal)
 +{
 +      /* initialise the clocks here, to allow other things like the
 +       * console to use them, and to add new ones after the initialisation
 +       */
 +
 +      s3c24xx_register_baseclocks(xtal);
 +      s3c244x_setup_clocks();
 +      s3c2410_baseclk_add();
 +}
 +
 +/* Since the S3C2442 and S3C2440 share items, put both subsystems here */
 +
 +struct bus_type s3c2440_subsys = {
 +      .name           = "s3c2440-core",
 +      .dev_name       = "s3c2440-core",
 +};
 +
 +struct bus_type s3c2442_subsys = {
 +      .name           = "s3c2442-core",
 +      .dev_name       = "s3c2442-core",
 +};
 +
 +/* need to register the subsystem before we actually register the device, and
 + * we also need to ensure that it has been initialised before any of the
 + * drivers even try to use it (even if not on an s3c2440 based system)
 + * as a driver which may support both 2410 and 2440 may try and use it.
 +*/
 +
 +static int __init s3c2440_core_init(void)
 +{
 +      return subsys_system_register(&s3c2440_subsys, NULL);
 +}
 +
 +core_initcall(s3c2440_core_init);
 +
 +static int __init s3c2442_core_init(void)
 +{
 +      return subsys_system_register(&s3c2442_subsys, NULL);
 +}
 +
 +core_initcall(s3c2442_core_init);
 +
 +
 +#ifdef CONFIG_PM
 +static struct sleep_save s3c244x_sleep[] = {
 +      SAVE_ITEM(S3C2440_DSC0),
 +      SAVE_ITEM(S3C2440_DSC1),
 +      SAVE_ITEM(S3C2440_GPJDAT),
 +      SAVE_ITEM(S3C2440_GPJCON),
 +      SAVE_ITEM(S3C2440_GPJUP)
 +};
 +
 +static int s3c244x_suspend(void)
 +{
 +      s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
 +      return 0;
 +}
 +
 +static void s3c244x_resume(void)
 +{
 +      s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
 +}
 +#else
 +#define s3c244x_suspend NULL
 +#define s3c244x_resume  NULL
 +#endif
 +
 +struct syscore_ops s3c244x_pm_syscore_ops = {
 +      .suspend        = s3c244x_suspend,
 +      .resume         = s3c244x_resume,
 +};
 +
 +void s3c244x_restart(char mode, const char *cmd)
 +{
 +      if (mode == 's')
 +              soft_restart(0);
 +
 +      arch_wdt_reset();
 +
 +      /* we'll take a jump through zero as a poor second */
 +      soft_restart(0);
 +}
@@@ -27,6 -27,7 +27,7 @@@
  
  #include <asm/irq.h>
  #include <asm/proc-fns.h>
+ #include <asm/system_misc.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/mach/irq.h>
@@@ -146,12 -147,15 +147,12 @@@ static void s5p64x0_idle(void
  {
        unsigned long val;
  
 -      if (!need_resched()) {
 -              val = __raw_readl(S5P64X0_PWR_CFG);
 -              val &= ~(0x3 << 5);
 -              val |= (0x1 << 5);
 -              __raw_writel(val, S5P64X0_PWR_CFG);
 +      val = __raw_readl(S5P64X0_PWR_CFG);
 +      val &= ~(0x3 << 5);
 +      val |= (0x1 << 5);
 +      __raw_writel(val, S5P64X0_PWR_CFG);
  
 -              cpu_do_idle();
 -      }
 -      local_irq_enable();
 +      cpu_do_idle();
  }
  
  /*
@@@ -283,7 -287,7 +284,7 @@@ int __init s5p64x0_init(void
        printk(KERN_INFO "S5P64X0(S5P6440/S5P6450): Initializing architecture\n");
  
        /* set idle function */
 -      pm_idle = s5p64x0_idle;
 +      arm_pm_idle = s5p64x0_idle;
  
        return device_register(&s5p64x0_dev);
  }
@@@ -27,6 -27,7 +27,7 @@@
  
  #include <asm/irq.h>
  #include <asm/proc-fns.h>
+ #include <asm/system_misc.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/mach/irq.h>
@@@ -129,6 -130,14 +130,6 @@@ static struct map_desc s5pc100_iodesc[
        }
  };
  
 -static void s5pc100_idle(void)
 -{
 -      if (!need_resched())
 -              cpu_do_idle();
 -
 -      local_irq_enable();
 -}
 -
  /*
   * s5pc100_map_io
   *
@@@ -202,6 -211,10 +203,6 @@@ core_initcall(s5pc100_core_init)
  int __init s5pc100_init(void)
  {
        printk(KERN_INFO "S5PC100: Initializing architecture\n");
 -
 -      /* set idle function */
 -      pm_idle = s5pc100_idle;
 -
        return device_register(&s5pc100_dev);
  }
  
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/delay.h>
 +#include <linux/dma-mapping.h>
  #include <linux/pm.h>
  #include <linux/cpufreq.h>
  #include <linux/ioport.h>
  #include <linux/platform_device.h>
  
 +#include <video/sa1100fb.h>
 +
  #include <asm/div64.h>
  #include <asm/mach/map.h>
  #include <asm/mach/flash.h>
  #include <asm/irq.h>
+ #include <asm/system_misc.h>
  
 +#include <mach/hardware.h>
 +#include <mach/irqs.h>
 +
  #include "generic.h"
  
  unsigned int reset_status;
@@@ -154,8 -149,16 +154,8 @@@ static void sa11x0_register_device(stru
  
  
  static struct resource sa11x0udc_resources[] = {
 -      [0] = {
 -              .start  = __PREG(Ser0UDCCR),
 -              .end    = __PREG(Ser0UDCCR) + 0xffff,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      [1] = {
 -              .start  = IRQ_Ser0UDC,
 -              .end    = IRQ_Ser0UDC,
 -              .flags  = IORESOURCE_IRQ,
 -      },
 +      [0] = DEFINE_RES_MEM(__PREG(Ser0UDCCR), SZ_64K),
 +      [1] = DEFINE_RES_IRQ(IRQ_Ser0UDC),
  };
  
  static u64 sa11x0udc_dma_mask = 0xffffffffUL;
@@@ -172,8 -175,16 +172,8 @@@ static struct platform_device sa11x0udc
  };
  
  static struct resource sa11x0uart1_resources[] = {
 -      [0] = {
 -              .start  = __PREG(Ser1UTCR0),
 -              .end    = __PREG(Ser1UTCR0) + 0xffff,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      [1] = {
 -              .start  = IRQ_Ser1UART,
 -              .end    = IRQ_Ser1UART,
 -              .flags  = IORESOURCE_IRQ,
 -      },
 +      [0] = DEFINE_RES_MEM(__PREG(Ser1UTCR0), SZ_64K),
 +      [1] = DEFINE_RES_IRQ(IRQ_Ser1UART),
  };
  
  static struct platform_device sa11x0uart1_device = {
  };
  
  static struct resource sa11x0uart3_resources[] = {
 -      [0] = {
 -              .start  = __PREG(Ser3UTCR0),
 -              .end    = __PREG(Ser3UTCR0) + 0xffff,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      [1] = {
 -              .start  = IRQ_Ser3UART,
 -              .end    = IRQ_Ser3UART,
 -              .flags  = IORESOURCE_IRQ,
 -      },
 +      [0] = DEFINE_RES_MEM(__PREG(Ser3UTCR0), SZ_64K),
 +      [1] = DEFINE_RES_IRQ(IRQ_Ser3UART),
  };
  
  static struct platform_device sa11x0uart3_device = {
  };
  
  static struct resource sa11x0mcp_resources[] = {
 -      [0] = {
 -              .start  = __PREG(Ser4MCCR0),
 -              .end    = __PREG(Ser4MCCR0) + 0xffff,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      [1] = {
 -              .start  = IRQ_Ser4MCP,
 -              .end    = IRQ_Ser4MCP,
 -              .flags  = IORESOURCE_IRQ,
 -      },
 +      [0] = DEFINE_RES_MEM(__PREG(Ser4MCCR0), SZ_64K),
 +      [1] = DEFINE_RES_MEM(__PREG(Ser4MCCR1), 4),
 +      [2] = DEFINE_RES_IRQ(IRQ_Ser4MCP),
  };
  
  static u64 sa11x0mcp_dma_mask = 0xffffffffUL;
@@@ -214,24 -240,22 +214,24 @@@ static struct platform_device sa11x0mcp
        .resource       = sa11x0mcp_resources,
  };
  
 +void __init sa11x0_ppc_configure_mcp(void)
 +{
 +      /* Setup the PPC unit for the MCP */
 +      PPDR &= ~PPC_RXD4;
 +      PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
 +      PSDR |= PPC_RXD4;
 +      PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
 +      PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
 +}
 +
  void sa11x0_register_mcp(struct mcp_plat_data *data)
  {
        sa11x0_register_device(&sa11x0mcp_device, data);
  }
  
  static struct resource sa11x0ssp_resources[] = {
 -      [0] = {
 -              .start  = 0x80070000,
 -              .end    = 0x8007ffff,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      [1] = {
 -              .start  = IRQ_Ser4SSP,
 -              .end    = IRQ_Ser4SSP,
 -              .flags  = IORESOURCE_IRQ,
 -      },
 +      [0] = DEFINE_RES_MEM(0x80070000, SZ_64K),
 +      [1] = DEFINE_RES_IRQ(IRQ_Ser4SSP),
  };
  
  static u64 sa11x0ssp_dma_mask = 0xffffffffUL;
@@@ -248,8 -272,16 +248,8 @@@ static struct platform_device sa11x0ssp
  };
  
  static struct resource sa11x0fb_resources[] = {
 -      [0] = {
 -              .start  = 0xb0100000,
 -              .end    = 0xb010ffff,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -      [1] = {
 -              .start  = IRQ_LCD,
 -              .end    = IRQ_LCD,
 -              .flags  = IORESOURCE_IRQ,
 -      },
 +      [0] = DEFINE_RES_MEM(0xb0100000, SZ_64K),
 +      [1] = DEFINE_RES_IRQ(IRQ_LCD),
  };
  
  static struct platform_device sa11x0fb_device = {
        .resource       = sa11x0fb_resources,
  };
  
 +void sa11x0_register_lcd(struct sa1100fb_mach_info *inf)
 +{
 +      sa11x0_register_device(&sa11x0fb_device, inf);
 +}
 +
  static struct platform_device sa11x0pcmcia_device = {
        .name           = "sa11x0-pcmcia",
        .id             = -1,
@@@ -287,10 -314,23 +287,10 @@@ void sa11x0_register_mtd(struct flash_p
  }
  
  static struct resource sa11x0ir_resources[] = {
 -      {
 -              .start  = __PREG(Ser2UTCR0),
 -              .end    = __PREG(Ser2UTCR0) + 0x24 - 1,
 -              .flags  = IORESOURCE_MEM,
 -      }, {
 -              .start  = __PREG(Ser2HSCR0),
 -              .end    = __PREG(Ser2HSCR0) + 0x1c - 1,
 -              .flags  = IORESOURCE_MEM,
 -      }, {
 -              .start  = __PREG(Ser2HSCR2),
 -              .end    = __PREG(Ser2HSCR2) + 0x04 - 1,
 -              .flags  = IORESOURCE_MEM,
 -      }, {
 -              .start  = IRQ_Ser2ICP,
 -              .end    = IRQ_Ser2ICP,
 -              .flags  = IORESOURCE_IRQ,
 -      }
 +      DEFINE_RES_MEM(__PREG(Ser2UTCR0), 0x24),
 +      DEFINE_RES_MEM(__PREG(Ser2HSCR0), 0x1c),
 +      DEFINE_RES_MEM(__PREG(Ser2HSCR2), 0x04),
 +      DEFINE_RES_IRQ(IRQ_Ser2ICP),
  };
  
  static struct platform_device sa11x0ir_device = {
@@@ -305,40 -345,9 +305,40 @@@ void sa11x0_register_irda(struct irda_p
        sa11x0_register_device(&sa11x0ir_device, irda);
  }
  
 +static struct resource sa1100_rtc_resources[] = {
 +      DEFINE_RES_MEM(0x90010000, 0x9001003f),
 +      DEFINE_RES_IRQ_NAMED(IRQ_RTC1Hz, "rtc 1Hz"),
 +      DEFINE_RES_IRQ_NAMED(IRQ_RTCAlrm, "rtc alarm"),
 +};
 +
  static struct platform_device sa11x0rtc_device = {
        .name           = "sa1100-rtc",
        .id             = -1,
 +      .num_resources  = ARRAY_SIZE(sa1100_rtc_resources),
 +      .resource       = sa1100_rtc_resources,
 +};
 +
 +static struct resource sa11x0dma_resources[] = {
 +      DEFINE_RES_MEM(DMA_PHYS, DMA_SIZE),
 +      DEFINE_RES_IRQ(IRQ_DMA0),
 +      DEFINE_RES_IRQ(IRQ_DMA1),
 +      DEFINE_RES_IRQ(IRQ_DMA2),
 +      DEFINE_RES_IRQ(IRQ_DMA3),
 +      DEFINE_RES_IRQ(IRQ_DMA4),
 +      DEFINE_RES_IRQ(IRQ_DMA5),
 +};
 +
 +static u64 sa11x0dma_dma_mask = DMA_BIT_MASK(32);
 +
 +static struct platform_device sa11x0dma_device = {
 +      .name           = "sa11x0-dma",
 +      .id             = -1,
 +      .dev = {
 +              .dma_mask = &sa11x0dma_dma_mask,
 +              .coherent_dma_mask = 0xffffffff,
 +      },
 +      .num_resources  = ARRAY_SIZE(sa11x0dma_resources),
 +      .resource       = sa11x0dma_resources,
  };
  
  static struct platform_device *sa11x0_devices[] __initdata = {
        &sa11x0uart3_device,
        &sa11x0ssp_device,
        &sa11x0pcmcia_device,
 -      &sa11x0fb_device,
        &sa11x0rtc_device,
 +      &sa11x0dma_device,
  };
  
  static int __init sa1100_init(void)
  
  arch_initcall(sa1100_init);
  
 -void (*sa1100fb_backlight_power)(int on);
 -void (*sa1100fb_lcd_power)(int on);
 -
 -EXPORT_SYMBOL(sa1100fb_backlight_power);
 -EXPORT_SYMBOL(sa1100fb_lcd_power);
 -
  
  /*
   * Common I/O mapping:
@@@ -413,7 -428,7 +413,7 @@@ void __init sa1100_map_io(void
   * the MBGNT signal false to ensure the SA1111 doesn't own the
   * SDRAM bus.
   */
 -void __init sa1110_mb_disable(void)
 +void sa1110_mb_disable(void)
  {
        unsigned long flags;
  
   * If the system is going to use the SA-1111 DMA engines, set up
   * the memory bus request/grant pins.
   */
 -void __devinit sa1110_mb_enable(void)
 +void sa1110_mb_enable(void)
  {
        unsigned long flags;
  
@@@ -1,6 -1,13 +1,8 @@@
  #ifndef __ASM_ARCH_SYSTEM_H
  #define __ASM_ARCH_SYSTEM_H
  
+ #include <asm/system_misc.h>
 -static inline void arch_idle(void)
 -{
 -      cpu_do_idle();
 -}
 -
  static inline void arch_reset(char mode, const char *cmd)
  {
        soft_restart(0);
@@@ -36,7 -36,6 +36,6 @@@
  #include <linux/clkdev.h>
  #include <linux/mtd/physmap.h>
  
- #include <asm/system.h>
  #include <asm/irq.h>
  #include <asm/leds.h>
  #include <asm/hardware/arm_timer.h>
@@@ -585,58 -584,58 +584,58 @@@ static struct pl022_ssp_controller ssp0
        .num_chipselect = 1,
  };
  
 -#define AACI_IRQ      { IRQ_AACI, NO_IRQ }
 +#define AACI_IRQ      { IRQ_AACI }
  #define MMCI0_IRQ     { IRQ_MMCI0A,IRQ_SIC_MMCI0B }
 -#define KMI0_IRQ      { IRQ_SIC_KMI0, NO_IRQ }
 -#define KMI1_IRQ      { IRQ_SIC_KMI1, NO_IRQ }
 +#define KMI0_IRQ      { IRQ_SIC_KMI0 }
 +#define KMI1_IRQ      { IRQ_SIC_KMI1 }
  
  /*
   * These devices are connected directly to the multi-layer AHB switch
   */
 -#define SMC_IRQ               { NO_IRQ, NO_IRQ }
 -#define MPMC_IRQ      { NO_IRQ, NO_IRQ }
 -#define CLCD_IRQ      { IRQ_CLCDINT, NO_IRQ }
 -#define DMAC_IRQ      { IRQ_DMAINT, NO_IRQ }
 +#define SMC_IRQ               { }
 +#define MPMC_IRQ      { }
 +#define CLCD_IRQ      { IRQ_CLCDINT }
 +#define DMAC_IRQ      { IRQ_DMAINT }
  
  /*
   * These devices are connected via the core APB bridge
   */
 -#define SCTL_IRQ      { NO_IRQ, NO_IRQ }
 -#define WATCHDOG_IRQ  { IRQ_WDOGINT, NO_IRQ }
 -#define GPIO0_IRQ     { IRQ_GPIOINT0, NO_IRQ }
 -#define GPIO1_IRQ     { IRQ_GPIOINT1, NO_IRQ }
 -#define RTC_IRQ               { IRQ_RTCINT, NO_IRQ }
 +#define SCTL_IRQ      { }
 +#define WATCHDOG_IRQ  { IRQ_WDOGINT }
 +#define GPIO0_IRQ     { IRQ_GPIOINT0 }
 +#define GPIO1_IRQ     { IRQ_GPIOINT1 }
 +#define RTC_IRQ               { IRQ_RTCINT }
  
  /*
   * These devices are connected via the DMA APB bridge
   */
 -#define SCI_IRQ               { IRQ_SCIINT, NO_IRQ }
 -#define UART0_IRQ     { IRQ_UARTINT0, NO_IRQ }
 -#define UART1_IRQ     { IRQ_UARTINT1, NO_IRQ }
 -#define UART2_IRQ     { IRQ_UARTINT2, NO_IRQ }
 -#define SSP_IRQ               { IRQ_SSPINT, NO_IRQ }
 +#define SCI_IRQ               { IRQ_SCIINT }
 +#define UART0_IRQ     { IRQ_UARTINT0 }
 +#define UART1_IRQ     { IRQ_UARTINT1 }
 +#define UART2_IRQ     { IRQ_UARTINT2 }
 +#define SSP_IRQ               { IRQ_SSPINT }
  
  /* FPGA Primecells */
 -AMBA_DEVICE(aaci,  "fpga:04", AACI,     NULL);
 -AMBA_DEVICE(mmc0,  "fpga:05", MMCI0,    &mmc0_plat_data);
 -AMBA_DEVICE(kmi0,  "fpga:06", KMI0,     NULL);
 -AMBA_DEVICE(kmi1,  "fpga:07", KMI1,     NULL);
 +APB_DEVICE(aaci,  "fpga:04", AACI,     NULL);
 +APB_DEVICE(mmc0,  "fpga:05", MMCI0,    &mmc0_plat_data);
 +APB_DEVICE(kmi0,  "fpga:06", KMI0,     NULL);
 +APB_DEVICE(kmi1,  "fpga:07", KMI1,     NULL);
  
  /* DevChip Primecells */
 -AMBA_DEVICE(smc,   "dev:00",  SMC,      NULL);
 -AMBA_DEVICE(mpmc,  "dev:10",  MPMC,     NULL);
 -AMBA_DEVICE(clcd,  "dev:20",  CLCD,     &clcd_plat_data);
 -AMBA_DEVICE(dmac,  "dev:30",  DMAC,     NULL);
 -AMBA_DEVICE(sctl,  "dev:e0",  SCTL,     NULL);
 -AMBA_DEVICE(wdog,  "dev:e1",  WATCHDOG, NULL);
 -AMBA_DEVICE(gpio0, "dev:e4",  GPIO0,    &gpio0_plat_data);
 -AMBA_DEVICE(gpio1, "dev:e5",  GPIO1,    &gpio1_plat_data);
 -AMBA_DEVICE(rtc,   "dev:e8",  RTC,      NULL);
 -AMBA_DEVICE(sci0,  "dev:f0",  SCI,      NULL);
 -AMBA_DEVICE(uart0, "dev:f1",  UART0,    NULL);
 -AMBA_DEVICE(uart1, "dev:f2",  UART1,    NULL);
 -AMBA_DEVICE(uart2, "dev:f3",  UART2,    NULL);
 -AMBA_DEVICE(ssp0,  "dev:f4",  SSP,      &ssp0_plat_data);
 +AHB_DEVICE(smc,   "dev:00",  SMC,      NULL);
 +AHB_DEVICE(mpmc,  "dev:10",  MPMC,     NULL);
 +AHB_DEVICE(clcd,  "dev:20",  CLCD,     &clcd_plat_data);
 +AHB_DEVICE(dmac,  "dev:30",  DMAC,     NULL);
 +APB_DEVICE(sctl,  "dev:e0",  SCTL,     NULL);
 +APB_DEVICE(wdog,  "dev:e1",  WATCHDOG, NULL);
 +APB_DEVICE(gpio0, "dev:e4",  GPIO0,    &gpio0_plat_data);
 +APB_DEVICE(gpio1, "dev:e5",  GPIO1,    &gpio1_plat_data);
 +APB_DEVICE(rtc,   "dev:e8",  RTC,      NULL);
 +APB_DEVICE(sci0,  "dev:f0",  SCI,      NULL);
 +APB_DEVICE(uart0, "dev:f1",  UART0,    NULL);
 +APB_DEVICE(uart1, "dev:f2",  UART1,    NULL);
 +APB_DEVICE(uart2, "dev:f3",  UART2,    NULL);
 +APB_DEVICE(ssp0,  "dev:f4",  SSP,      &ssp0_plat_data);
  
  static struct amba_device *amba_devs[] __initdata = {
        &dmac_device,
@@@ -24,7 -24,6 +24,6 @@@
  
  #include <mach/hardware.h>
  #include <asm/irq.h>
- #include <asm/system.h>
  #include <asm/mach/pci.h>
  
  /*
@@@ -219,9 -218,9 +218,9 @@@ static int __init pci_versatile_setup_r
         * the mem resource for this bus
         * the prefetch mem resource for this bus
         */
 -      pci_add_resource(resources, &io_mem);
 -      pci_add_resource(resources, &non_mem);
 -      pci_add_resource(resources, &pre_mem);
 +      pci_add_resource_offset(resources, &io_mem, sys->io_offset);
 +      pci_add_resource_offset(resources, &non_mem, sys->mem_offset);
 +      pci_add_resource_offset(resources, &pre_mem, sys->mem_offset);
  
        goto out;
  
diff --combined arch/arm/plat-iop/pci.c
@@@ -20,7 -20,6 +20,6 @@@
  #include <linux/io.h>
  #include <asm/irq.h>
  #include <asm/signal.h>
- #include <asm/system.h>
  #include <mach/hardware.h>
  #include <asm/mach/pci.h>
  #include <asm/hardware/iop3xx.h>
@@@ -215,8 -214,8 +214,8 @@@ int iop3xx_pci_setup(int nr, struct pci
        sys->mem_offset = IOP3XX_PCI_LOWER_MEM_PA - *IOP3XX_OMWTVR0;
        sys->io_offset  = IOP3XX_PCI_LOWER_IO_PA - *IOP3XX_OIOWTVR;
  
 -      pci_add_resource(&sys->resources, &res[0]);
 -      pci_add_resource(&sys->resources, &res[1]);
 +      pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset);
 +      pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset);
  
        return 1;
  }
@@@ -25,8 -25,8 +25,8 @@@
  
  #include <mach/hardware.h>
  #include <mach/common.h>
+ #include <asm/system_misc.h>
  #include <asm/proc-fns.h>
- #include <asm/system.h>
  #include <asm/mach-types.h>
  
  void __iomem *(*imx_ioremap)(unsigned long, size_t, unsigned int) = NULL;
@@@ -48,7 -48,7 +48,7 @@@ void mxc_restart(char mode, const char 
  
                clk = clk_get_sys("imx2-wdt.0", NULL);
                if (!IS_ERR(clk))
 -                      clk_enable(clk);
 +                      clk_prepare_enable(clk);
                wcr_enable = (1 << 2);
        }
  
diff --combined arch/arm/plat-omap/dma.c
@@@ -36,7 -36,6 +36,6 @@@
  #include <linux/slab.h>
  #include <linux/delay.h>
  
- #include <asm/system.h>
  #include <mach/hardware.h>
  #include <plat/dma.h>
  
@@@ -164,8 -163,6 +163,8 @@@ static inline void set_gdma_dev(int req
  }
  #else
  #define set_gdma_dev(req, dev)        do {} while (0)
 +#define omap_readl(reg)               0
 +#define omap_writel(val, reg) do {} while (0)
  #endif
  
  void omap_set_dma_priority(int lch, int dst_port, int priority)
@@@ -2127,7 -2124,7 +2126,7 @@@ static int __devexit omap_system_dma_re
  
  static struct platform_driver omap_system_dma_driver = {
        .probe          = omap_system_dma_probe,
 -      .remove         = omap_system_dma_remove,
 +      .remove         = __devexit_p(omap_system_dma_remove),
        .driver         = {
                .name   = "omap_dma_system"
        },
  #include <linux/io.h>
  
  #include <mach/hardware.h>
 +#include <mach/regs-clock.h>
  #include <asm/irq.h>
  #include <asm/cacheflush.h>
+ #include <asm/system_info.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
@@@ -191,34 -191,8 +192,34 @@@ static unsigned long s3c24xx_read_idcod
        return __raw_readl(S3C2410_GSTATUS1);
  }
  
 +static void s3c24xx_default_idle(void)
 +{
 +      unsigned long tmp;
 +      int i;
 +
 +      /* idle the system by using the idle mode which will wait for an
 +       * interrupt to happen before restarting the system.
 +       */
 +
 +      /* Warning: going into idle state upsets jtag scanning */
 +
 +      __raw_writel(__raw_readl(S3C2410_CLKCON) | S3C2410_CLKCON_IDLE,
 +                   S3C2410_CLKCON);
 +
 +      /* the samsung port seems to do a loop and then unset idle.. */
 +      for (i = 0; i < 50; i++)
 +              tmp += __raw_readl(S3C2410_CLKCON); /* ensure loop not optimised out */
 +
 +      /* this bit is not cleared on re-start... */
 +
 +      __raw_writel(__raw_readl(S3C2410_CLKCON) & ~S3C2410_CLKCON_IDLE,
 +                   S3C2410_CLKCON);
 +}
 +
  void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
  {
 +      arm_pm_idle = s3c24xx_default_idle;
 +
        /* initialise the io descriptors we need for initialisation */
        iotable_init(mach_desc, size);
        iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));
  #include <asm/scatterlist.h>
  #include <asm/hw_irq.h>
  
+ struct pci_vector_struct {
+       __u16 segment;  /* PCI Segment number */
+       __u16 bus;      /* PCI Bus number */
+       __u32 pci_id;   /* ACPI split 16 bits device, 16 bits function (see section 6.1.1) */
+       __u8 pin;       /* PCI PIN (0 = A, 1 = B, 2 = C, 3 = D) */
+       __u32 irq;      /* IRQ assigned */
+ };
  /*
   * Can be used to override the logic in pci_scan_bus for skipping already-configured bus
   * numbers - to be used for buggy BIOSes or architectures with incomplete PCI setup by the
@@@ -108,6 -116,12 +116,6 @@@ static inline int pci_proc_domain(struc
        return (pci_domain_nr(bus) != 0);
  }
  
 -extern void pcibios_resource_to_bus(struct pci_dev *dev,
 -              struct pci_bus_region *region, struct resource *res);
 -
 -extern void pcibios_bus_to_resource(struct pci_dev *dev,
 -              struct resource *res, struct pci_bus_region *region);
 -
  static inline struct resource *
  pcibios_select_root(struct pci_dev *pdev, struct resource *res)
  {
diff --combined arch/ia64/kernel/acpi.c
@@@ -50,7 -50,6 +50,6 @@@
  #include <asm/iosapic.h>
  #include <asm/machvec.h>
  #include <asm/page.h>
- #include <asm/system.h>
  #include <asm/numa.h>
  #include <asm/sal.h>
  #include <asm/cyclone.h>
@@@ -349,11 -348,11 +348,11 @@@ acpi_parse_int_src_ovr(struct acpi_subt
  
        iosapic_override_isa_irq(p->source_irq, p->global_irq,
                                 ((p->inti_flags & ACPI_MADT_POLARITY_MASK) ==
 -                                ACPI_MADT_POLARITY_ACTIVE_HIGH) ?
 -                               IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW,
 +                                ACPI_MADT_POLARITY_ACTIVE_LOW) ?
 +                               IOSAPIC_POL_LOW : IOSAPIC_POL_HIGH,
                                 ((p->inti_flags & ACPI_MADT_TRIGGER_MASK) ==
 -                               ACPI_MADT_TRIGGER_EDGE) ?
 -                               IOSAPIC_EDGE : IOSAPIC_LEVEL);
 +                               ACPI_MADT_TRIGGER_LEVEL) ?
 +                               IOSAPIC_LEVEL : IOSAPIC_EDGE);
        return 0;
  }
  
diff --combined arch/ia64/kernel/mca.c
@@@ -92,7 -92,6 +92,6 @@@
  #include <asm/meminit.h>
  #include <asm/page.h>
  #include <asm/ptrace.h>
- #include <asm/system.h>
  #include <asm/sal.h>
  #include <asm/mca.h>
  #include <asm/kexec.h>
@@@ -1447,8 -1446,6 +1446,8 @@@ out
        /* Get the CMC error record and log it */
        ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CMC);
  
 +      local_irq_disable();
 +
        return IRQ_HANDLED;
  }
  
diff --combined arch/ia64/pci/pci.c
@@@ -24,7 -24,6 +24,6 @@@
  
  #include <asm/machvec.h>
  #include <asm/page.h>
- #include <asm/system.h>
  #include <asm/io.h>
  #include <asm/sal.h>
  #include <asm/smp.h>
@@@ -320,8 -319,7 +319,8 @@@ static __devinit acpi_status add_window
         * Ignore these tiny memory ranges */
        if (!((window->resource.flags & IORESOURCE_MEM) &&
              (window->resource.end - window->resource.start < 16)))
 -              pci_add_resource(&info->resources, &window->resource);
 +              pci_add_resource_offset(&info->resources, &window->resource,
 +                                      window->offset);
  
        return AE_OK;
  }
@@@ -396,6 -394,54 +395,6 @@@ out1
        return NULL;
  }
  
 -void pcibios_resource_to_bus(struct pci_dev *dev,
 -              struct pci_bus_region *region, struct resource *res)
 -{
 -      struct pci_controller *controller = PCI_CONTROLLER(dev);
 -      unsigned long offset = 0;
 -      int i;
 -
 -      for (i = 0; i < controller->windows; i++) {
 -              struct pci_window *window = &controller->window[i];
 -              if (!(window->resource.flags & res->flags))
 -                      continue;
 -              if (window->resource.start > res->start)
 -                      continue;
 -              if (window->resource.end < res->end)
 -                      continue;
 -              offset = window->offset;
 -              break;
 -      }
 -
 -      region->start = res->start - offset;
 -      region->end = res->end - offset;
 -}
 -EXPORT_SYMBOL(pcibios_resource_to_bus);
 -
 -void pcibios_bus_to_resource(struct pci_dev *dev,
 -              struct resource *res, struct pci_bus_region *region)
 -{
 -      struct pci_controller *controller = PCI_CONTROLLER(dev);
 -      unsigned long offset = 0;
 -      int i;
 -
 -      for (i = 0; i < controller->windows; i++) {
 -              struct pci_window *window = &controller->window[i];
 -              if (!(window->resource.flags & res->flags))
 -                      continue;
 -              if (window->resource.start - window->offset > region->start)
 -                      continue;
 -              if (window->resource.end - window->offset < region->end)
 -                      continue;
 -              offset = window->offset;
 -              break;
 -      }
 -
 -      res->start = region->start + offset;
 -      res->end = region->end + offset;
 -}
 -EXPORT_SYMBOL(pcibios_bus_to_resource);
 -
  static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
  {
        unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
  static void __devinit
  pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)
  {
 -      struct pci_bus_region region;
        int i;
  
        for (i = start; i < limit; i++) {
                if (!dev->resource[i].flags)
                        continue;
 -              region.start = dev->resource[i].start;
 -              region.end = dev->resource[i].end;
 -              pcibios_bus_to_resource(dev, &dev->resource[i], &region);
                if ((is_valid_resource(dev, i)))
                        pci_claim_resource(dev, i);
        }
@@@ -14,7 -14,6 +14,6 @@@
  #include <linux/capability.h>
  #include <linux/device.h>
  #include <linux/delay.h>
- #include <asm/system.h>
  #include <asm/uaccess.h>
  #include <asm/sn/sn_sal.h>
  #include <asm/sn/addrs.h>
@@@ -191,7 -190,6 +190,7 @@@ cx_device_register(nasid_t nasid, int p
                   struct hubdev_info *hubdev, int bt)
  {
        struct cx_dev *cx_dev;
 +      int r;
  
        cx_dev = kzalloc(sizeof(struct cx_dev), GFP_KERNEL);
        DBG("cx_dev= 0x%p\n", cx_dev);
        cx_dev->dev.bus = &tiocx_bus_type;
        cx_dev->dev.release = tiocx_bus_release;
        dev_set_name(&cx_dev->dev, "%d", cx_dev->cx_id.nasid);
 -      device_register(&cx_dev->dev);
 +      r = device_register(&cx_dev->dev);
 +      if (r) {
 +              kfree(cx_dev);
 +              return r;
 +      }
        get_device(&cx_dev->dev);
  
        device_create_file(&cx_dev->dev, &dev_attr_cxdev_control);
@@@ -135,9 -135,9 +135,11 @@@ extern unsigned long min_low_pfn
  extern unsigned long max_pfn;
  
  extern unsigned long memory_start;
 -extern unsigned long memory_end;
  extern unsigned long memory_size;
 +extern unsigned long lowmem_size;
 +
++extern unsigned long kernel_tlb;
  extern int page_is_ram(unsigned long pfn);
  
  # define phys_to_pfn(phys)    (PFN_DOWN(phys))
@@@ -20,6 -20,8 +20,8 @@@ extern unsigned int boot_cpuid; /* mov
  
  extern char cmd_line[COMMAND_LINE_SIZE];
  
+ extern char *klimit;
  void early_printk(const char *fmt, ...);
  
  int setup_early_printk(char *opt);
@@@ -39,14 -41,17 +41,18 @@@ extern void of_platform_reset_gpio_prob
  void time_init(void);
  void init_IRQ(void);
  void machine_early_init(const char *cmdline, unsigned int ram,
 -                      unsigned int fdt, unsigned int msr);
 +              unsigned int fdt, unsigned int msr, unsigned int tlb0,
 +              unsigned int tlb1);
  
  void machine_restart(char *cmd);
  void machine_shutdown(void);
  void machine_halt(void);
  void machine_power_off(void);
  
+ void free_init_pages(char *what, unsigned long begin, unsigned long end);
+ extern void *alloc_maybe_bootmem(size_t size, gfp_t mask);
+ extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);
  #  endif/* __KERNEL__ */
  # endif /* __ASSEMBLY__ */
  #endif /* _ASM_MICROBLAZE_SETUP_H */
@@@ -30,7 -30,6 +30,6 @@@
  #include <asm/entry.h>
  #include <asm/cpuinfo.h>
  
- #include <asm/system.h>
  #include <asm/prom.h>
  #include <asm/pgtable.h>
  
@@@ -95,11 -94,8 +94,11 @@@ inline unsigned get_romfs_len(unsigned 
  }
  #endif        /* CONFIG_MTD_UCLINUX_EBSS */
  
 +unsigned long kernel_tlb;
 +
  void __init machine_early_init(const char *cmdline, unsigned int ram,
 -              unsigned int fdt, unsigned int msr)
 +              unsigned int fdt, unsigned int msr, unsigned int tlb0,
 +              unsigned int tlb1)
  {
        unsigned long *src, *dst;
        unsigned int offset = 0;
        setup_early_printk(NULL);
  #endif
  
 +      /* setup kernel_tlb after BSS cleaning
 +       * Maybe worth to move to asm code */
 +      kernel_tlb = tlb0 + tlb1;
 +      /* printk("TLB1 0x%08x, TLB0 0x%08x, tlb 0x%x\n", tlb0,
 +                                                      tlb1, kernel_tlb); */
 +
        printk("Ramdisk addr 0x%08x, ", ram);
        if (fdt)
                printk("FDT at 0x%08x\n", fdt);
@@@ -206,19 -196,6 +205,19 @@@ static int microblaze_debugfs_init(void
        return of_debugfs_root == NULL;
  }
  arch_initcall(microblaze_debugfs_init);
 +
 +static int __init debugfs_tlb(void)
 +{
 +      struct dentry *d;
 +
 +      if (!of_debugfs_root)
 +              return -ENODEV;
 +
 +      d = debugfs_create_u32("tlb_skip", S_IRUGO, of_debugfs_root, &tlb_skip);
 +      if (!d)
 +              return -ENOMEM;
 +}
 +device_initcall(debugfs_tlb);
  #endif
  
  static int dflt_bus_notify(struct notifier_block *nb,
@@@ -27,7 -27,6 +27,6 @@@
  #include <asm/setup.h>
  #include <asm/prom.h>
  #include <asm/irq.h>
- #include <asm/system.h>
  #include <linux/cnt32_to_63.h>
  
  #ifdef CONFIG_SELFMOD_TIMER
@@@ -79,7 -78,7 +78,7 @@@ static inline void microblaze_timer0_st
         * !PWMA - disable pwm
         * TINT - clear interrupt status
         * ENT- enable timer itself
 -       * EINT - enable interrupt
 +       * ENIT - enable interrupt
         * !LOAD - clear the bit to let go
         * ARHT - auto reload
         * !CAPT - no external trigger
@@@ -274,8 -273,8 +273,8 @@@ void __init time_init(void
  #ifdef CONFIG_SELFMOD_TIMER
        selfmod_function((int *) arr_func, timer_baseaddr);
  #endif
 -      printk(KERN_INFO "XPS timer #0 at 0x%08x, irq=%d\n",
 -              timer_baseaddr, irq);
 +      printk(KERN_INFO "%s #0 at 0x%08x, irq=%d\n",
 +              timer->name, timer_baseaddr, irq);
  
        /* If there is clock-frequency property than use it */
        prop = of_get_property(timer, "clock-frequency", NULL);
@@@ -33,7 -33,6 +33,6 @@@
  #include <asm/segment.h>
  #include <asm/page.h>
  #include <asm/pgtable.h>
- #include <asm/system.h>
  
  /*
   * Copy the thread state to a regset that can be interpreted by userspace.
@@@ -188,11 -187,11 +187,11 @@@ asmlinkage long do_syscall_trace_enter(
                 */
                ret = -1L;
  
 -      audit_syscall_entry(audit_arch(), regs->syscallno,
 +      audit_syscall_entry(audit_arch(), regs->gpr[11],
                            regs->gpr[3], regs->gpr[4],
                            regs->gpr[5], regs->gpr[6]);
  
 -      return ret ? : regs->syscallno;
 +      return ret ? : regs->gpr[11];
  }
  
  asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)
@@@ -41,7 -41,6 +41,6 @@@
  #include <linux/of_platform.h>
  
  #include <asm/segment.h>
- #include <asm/system.h>
  #include <asm/pgtable.h>
  #include <asm/types.h>
  #include <asm/setup.h>
@@@ -207,18 -206,18 +206,18 @@@ void __init setup_cpuinfo(void
   * Handles the pointer to the device tree that this kernel is to use
   * for establishing the available platform devices.
   *
 - * For now, this is limited to using the built-in device tree.  In the future,
 - * it is intended that this function will take a pointer to the device tree
 - * that is potentially built-in, but potentially also passed in by the
 - * bootloader, or discovered by some equally clever means...
 + * Falls back on built-in device tree in case null pointer is passed.
   */
  
 -void __init or32_early_setup(void)
 +void __init or32_early_setup(unsigned int fdt)
  {
 -
 -      early_init_devtree(__dtb_start);
 -
 -      printk(KERN_INFO "Compiled-in FDT at 0x%p\n", __dtb_start);
 +      if (fdt) {
 +              early_init_devtree((void*) fdt);
 +              printk(KERN_INFO "FDT at 0x%08x\n", fdt);
 +      } else {
 +              early_init_devtree(__dtb_start);
 +              printk(KERN_INFO "Compiled-in FDT at %p\n", __dtb_start);
 +      }
  }
  
  static int __init openrisc_device_probe(void)
@@@ -33,7 -33,6 +33,6 @@@
  #include <linux/kallsyms.h>
  #include <asm/uaccess.h>
  
- #include <asm/system.h>
  #include <asm/segment.h>
  #include <asm/io.h>
  #include <asm/pgtable.h>
@@@ -115,7 -114,6 +114,7 @@@ void dump_stack(void
  
        show_stack(current, &stack);
  }
 +EXPORT_SYMBOL(dump_stack);
  
  void show_registers(struct pt_regs *regs)
  {
               regs->gpr[24], regs->gpr[25], regs->gpr[26], regs->gpr[27]);
        printk("GPR28: %08lx GPR29: %08lx GPR30: %08lx GPR31: %08lx\n",
               regs->gpr[28], regs->gpr[29], regs->gpr[30], regs->gpr[31]);
 -      printk("  RES: %08lx oGPR11: %08lx syscallno: %08lx\n",
 -             regs->gpr[11], regs->orig_gpr11, regs->syscallno);
 +      printk("  RES: %08lx oGPR11: %08lx\n",
 +             regs->gpr[11], regs->orig_gpr11);
  
        printk("Process %s (pid: %d, stackpage=%08lx)\n",
               current->comm, current->pid, (unsigned long)current);
@@@ -208,8 -206,8 +207,8 @@@ void nommu_dump_state(struct pt_regs *r
               regs->gpr[24], regs->gpr[25], regs->gpr[26], regs->gpr[27]);
        printk("GPR28: %08lx GPR29: %08lx GPR30: %08lx GPR31: %08lx\n",
               regs->gpr[28], regs->gpr[29], regs->gpr[30], regs->gpr[31]);
 -      printk("  RES: %08lx oGPR11: %08lx syscallno: %08lx\n",
 -             regs->gpr[11], regs->orig_gpr11, regs->syscallno);
 +      printk("  RES: %08lx oGPR11: %08lx\n",
 +             regs->gpr[11], regs->orig_gpr11);
  
        printk("Process %s (pid: %d, stackpage=%08lx)\n",
               ((struct task_struct *)(__pa(current)))->comm,
diff --combined arch/openrisc/mm/init.c
@@@ -33,7 -33,6 +33,6 @@@
  #include <linux/pagemap.h>
  #include <linux/memblock.h>
  
- #include <asm/system.h>
  #include <asm/segment.h>
  #include <asm/pgalloc.h>
  #include <asm/pgtable.h>
@@@ -222,7 -221,8 +221,7 @@@ void __init mem_init(void
  {
        int codesize, reservedpages, datasize, initsize;
  
 -      if (!mem_map)
 -              BUG();
 +      BUG_ON(!mem_map);
  
        set_max_mapnr_init();
  
diff --combined arch/parisc/kernel/pci.c
@@@ -16,7 -16,6 +16,6 @@@
  #include <linux/types.h>
  
  #include <asm/io.h>
- #include <asm/system.h>
  #include <asm/superio.h>
  
  #define DEBUG_RESOURCES 0
@@@ -195,6 -194,58 +194,6 @@@ void __init pcibios_init_bus(struct pci
        pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bridge_ctl);
  }
  
 -/* called by drivers/pci/setup-bus.c:pci_setup_bridge().  */
 -void __devinit pcibios_resource_to_bus(struct pci_dev *dev,
 -              struct pci_bus_region *region, struct resource *res)
 -{
 -#ifdef CONFIG_64BIT
 -      struct pci_hba_data *hba = HBA_DATA(dev->bus->bridge->platform_data);
 -#endif
 -
 -      if (res->flags & IORESOURCE_IO) {
 -              /*
 -              ** I/O space may see busnumbers here. Something
 -              ** in the form of 0xbbxxxx where bb is the bus num
 -              ** and xxxx is the I/O port space address.
 -              ** Remaining address translation are done in the
 -              ** PCI Host adapter specific code - ie dino_out8.
 -              */
 -              region->start = PCI_PORT_ADDR(res->start);
 -              region->end   = PCI_PORT_ADDR(res->end);
 -      } else if (res->flags & IORESOURCE_MEM) {
 -              /* Convert MMIO addr to PCI addr (undo global virtualization) */
 -              region->start = PCI_BUS_ADDR(hba, res->start);
 -              region->end   = PCI_BUS_ADDR(hba, res->end);
 -      }
 -
 -      DBG_RES("pcibios_resource_to_bus(%02x %s [%lx,%lx])\n",
 -              dev->bus->number, res->flags & IORESOURCE_IO ? "IO" : "MEM",
 -              region->start, region->end);
 -}
 -
 -void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
 -                            struct pci_bus_region *region)
 -{
 -#ifdef CONFIG_64BIT
 -      struct pci_hba_data *hba = HBA_DATA(dev->bus->bridge->platform_data);
 -#endif
 -
 -      if (res->flags & IORESOURCE_MEM) {
 -              res->start = PCI_HOST_ADDR(hba, region->start);
 -              res->end = PCI_HOST_ADDR(hba, region->end);
 -      }
 -
 -      if (res->flags & IORESOURCE_IO) {
 -              res->start = region->start;
 -              res->end = region->end;
 -      }
 -}
 -
 -#ifdef CONFIG_HOTPLUG
 -EXPORT_SYMBOL(pcibios_resource_to_bus);
 -EXPORT_SYMBOL(pcibios_bus_to_resource);
 -#endif
 -
  /*
   * pcibios align resources() is called every time generic PCI code
   * wants to generate a new address. The process of looking for
@@@ -74,6 -74,7 +74,6 @@@ struct rtas_suspend_me_data 
  /* RTAS event classes */
  #define RTAS_INTERNAL_ERROR           0x80000000 /* set bit 0 */
  #define RTAS_EPOW_WARNING             0x40000000 /* set bit 1 */
 -#define RTAS_POWERMGM_EVENTS          0x20000000 /* set bit 2 */
  #define RTAS_HOTPLUG_EVENTS           0x10000000 /* set bit 3 */
  #define RTAS_IO_EVENTS                        0x08000000 /* set bit 4 */
  #define RTAS_EVENT_SCAN_ALL_EVENTS    0xffffffff
@@@ -203,39 -204,6 +203,39 @@@ struct rtas_ext_event_log_v6 
                                        /* Variable length.             */
  };
  
 +/* pSeries event log format */
 +
 +/* Two bytes ASCII section IDs */
 +#define PSERIES_ELOG_SECT_ID_PRIV_HDR         (('P' << 8) | 'H')
 +#define PSERIES_ELOG_SECT_ID_USER_HDR         (('U' << 8) | 'H')
 +#define PSERIES_ELOG_SECT_ID_PRIMARY_SRC      (('P' << 8) | 'S')
 +#define PSERIES_ELOG_SECT_ID_EXTENDED_UH      (('E' << 8) | 'H')
 +#define PSERIES_ELOG_SECT_ID_FAILING_MTMS     (('M' << 8) | 'T')
 +#define PSERIES_ELOG_SECT_ID_SECONDARY_SRC    (('S' << 8) | 'S')
 +#define PSERIES_ELOG_SECT_ID_DUMP_LOCATOR     (('D' << 8) | 'H')
 +#define PSERIES_ELOG_SECT_ID_FW_ERROR         (('S' << 8) | 'W')
 +#define PSERIES_ELOG_SECT_ID_IMPACT_PART_ID   (('L' << 8) | 'P')
 +#define PSERIES_ELOG_SECT_ID_LOGIC_RESOURCE_ID        (('L' << 8) | 'R')
 +#define PSERIES_ELOG_SECT_ID_HMC_ID           (('H' << 8) | 'M')
 +#define PSERIES_ELOG_SECT_ID_EPOW             (('E' << 8) | 'P')
 +#define PSERIES_ELOG_SECT_ID_IO_EVENT         (('I' << 8) | 'E')
 +#define PSERIES_ELOG_SECT_ID_MANUFACT_INFO    (('M' << 8) | 'I')
 +#define PSERIES_ELOG_SECT_ID_CALL_HOME                (('C' << 8) | 'H')
 +#define PSERIES_ELOG_SECT_ID_USER_DEF         (('U' << 8) | 'D')
 +
 +/* Vendor specific Platform Event Log Format, Version 6, section header */
 +struct pseries_errorlog {
 +      uint16_t id;                    /* 0x00 2-byte ASCII section ID */
 +      uint16_t length;                /* 0x02 Section length in bytes */
 +      uint8_t version;                /* 0x04 Section version         */
 +      uint8_t subtype;                /* 0x05 Section subtype         */
 +      uint16_t creator_component;     /* 0x06 Creator component ID    */
 +      uint8_t data[];                 /* 0x08 Start of section data   */
 +};
 +
 +struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log,
 +                                            uint16_t section_id);
 +
  /*
   * This can be set by the rtas_flash module so that it can get called
   * as the absolutely last thing before the kernel terminates.
@@@ -357,5 -325,7 +357,7 @@@ static inline int page_is_rtas_user_buf
  static inline int page_is_rtas_user_buf(unsigned long pfn) { return 0;}
  #endif
  
+ extern int call_rtas(const char *, int, int, unsigned long *, ...);
  #endif /* __KERNEL__ */
  #endif /* _POWERPC_RTAS_H */
@@@ -57,7 -57,6 +57,6 @@@
  #include <linux/of_irq.h>
  
  #include <asm/uaccess.h>
- #include <asm/system.h>
  #include <asm/io.h>
  #include <asm/pgtable.h>
  #include <asm/irq.h>
@@@ -67,6 -66,7 +66,7 @@@
  #include <asm/machdep.h>
  #include <asm/udbg.h>
  #include <asm/smp.h>
+ #include <asm/debug.h>
  
  #ifdef CONFIG_PPC64
  #include <asm/paca.h>
@@@ -208,8 -208,8 +208,8 @@@ notrace void arch_local_irq_restore(uns
         * we are checking the "new" CPU instead of the old one. This
         * is only a problem if an event happened on the "old" CPU.
         *
 -       * External interrupt events on non-iseries will have caused
 -       * interrupts to be hard-disabled, so there is no problem, we
 +       * External interrupt events will have caused interrupts to
 +       * be hard-disabled, so there is no problem, we
         * cannot have preempted.
         */
        irq_happened = get_irq_happened();
@@@ -445,9 -445,9 +445,9 @@@ void do_IRQ(struct pt_regs *regs
        may_hard_irq_enable();
  
        /* And finally process it */
 -      if (irq != NO_IRQ && irq != NO_IRQ_IGNORE)
 +      if (irq != NO_IRQ)
                handle_one_irq(irq);
 -      else if (irq != NO_IRQ_IGNORE)
 +      else
                __get_cpu_var(irq_stat).spurious_irqs++;
  
        irq_exit();
@@@ -35,7 -35,6 +35,6 @@@
  #include <asm/irq.h>
  #include <asm/io.h>
  #include <asm/smp.h>
- #include <asm/system.h>
  #include <asm/mmu.h>
  #include <asm/pgtable.h>
  #include <asm/pci.h>
@@@ -447,7 -446,7 +446,7 @@@ static void __init __attribute__((noret
        if (RELOC(of_platform) == PLATFORM_POWERMAC)
                asm("trap\n");
  
 -      /* ToDo: should put up an SRC here on p/iSeries */
 +      /* ToDo: should put up an SRC here on pSeries */
        call_prom("exit", 0, 0);
  
        for (;;)                        /* should never get here */
@@@ -33,7 -33,6 +33,6 @@@
  #include <asm/firmware.h>
  #include <asm/page.h>
  #include <asm/param.h>
- #include <asm/system.h>
  #include <asm/delay.h>
  #include <asm/uaccess.h>
  #include <asm/udbg.h>
@@@ -868,40 -867,6 +867,40 @@@ int rtas_ibm_suspend_me(struct rtas_arg
  }
  #endif
  
 +/**
 + * Find a specific pseries error log in an RTAS extended event log.
 + * @log: RTAS error/event log
 + * @section_id: two character section identifier
 + *
 + * Returns a pointer to the specified errorlog or NULL if not found.
 + */
 +struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log,
 +                                            uint16_t section_id)
 +{
 +      struct rtas_ext_event_log_v6 *ext_log =
 +              (struct rtas_ext_event_log_v6 *)log->buffer;
 +      struct pseries_errorlog *sect;
 +      unsigned char *p, *log_end;
 +
 +      /* Check that we understand the format */
 +      if (log->extended_log_length < sizeof(struct rtas_ext_event_log_v6) ||
 +          ext_log->log_format != RTAS_V6EXT_LOG_FORMAT_EVENT_LOG ||
 +          ext_log->company_id != RTAS_V6EXT_COMPANY_ID_IBM)
 +              return NULL;
 +
 +      log_end = log->buffer + log->extended_log_length;
 +      p = ext_log->vendor_log;
 +
 +      while (p < log_end) {
 +              sect = (struct pseries_errorlog *)p;
 +              if (sect->id == section_id)
 +                      return sect;
 +              p += sect->length;
 +      }
 +
 +      return NULL;
 +}
 +
  asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
  {
        struct rtas_args args;
@@@ -52,7 -52,6 +52,6 @@@
  #include <asm/btext.h>
  #include <asm/nvram.h>
  #include <asm/setup.h>
- #include <asm/system.h>
  #include <asm/rtas.h>
  #include <asm/iommu.h>
  #include <asm/serial.h>
@@@ -598,7 -597,7 +597,7 @@@ void __init setup_arch(char **cmdline_p
        /* Initialize the MMU context management stuff */
        mmu_context_init();
  
 -      kvm_rma_init();
 +      kvm_linear_init();
  
        ppc64_boot_msg(0x15, "Setup Done");
  }
@@@ -24,7 -24,6 +24,6 @@@
  #include <linux/memblock.h>
  
  #include <asm/pgtable.h>
- #include <asm/system.h>
  #include <asm/processor.h>
  #include <asm/mmu.h>
  #include <asm/mmu_context.h>
@@@ -263,11 -262,17 +262,11 @@@ int arch_setup_additional_pages(struct 
         * the "data" page of the vDSO or you'll stop getting kernel updates
         * and your nice userland gettimeofday will be totally dead.
         * It's fine to use that for setting breakpoints in the vDSO code
 -       * pages though
 -       *
 -       * Make sure the vDSO gets into every core dump.
 -       * Dumping its contents makes post-mortem fully interpretable later
 -       * without matching up the same kernel and hardware config to see
 -       * what PC values meant.
 +       * pages though.
         */
        rc = install_special_mapping(mm, vdso_base, vdso_pages << PAGE_SHIFT,
                                     VM_READ|VM_EXEC|
 -                                   VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC|
 -                                   VM_ALWAYSDUMP,
 +                                   VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
                                     vdso_pagelist);
        if (rc) {
                current->mm->context.vdso_base = 0;
@@@ -721,10 -726,10 +720,10 @@@ static int __init vdso_init(void
        vdso_data->version.minor = SYSTEMCFG_MINOR;
        vdso_data->processor = mfspr(SPRN_PVR);
        /*
 -       * Fake the old platform number for pSeries and iSeries and add
 +       * Fake the old platform number for pSeries and add
         * in LPAR bit if necessary
         */
 -      vdso_data->platform = machine_is(iseries) ? 0x200 : 0x100;
 +      vdso_data->platform = 0x100;
        if (firmware_has_feature(FW_FEATURE_LPAR))
                vdso_data->platform |= 1;
        vdso_data->physicalMemorySize = memblock_phys_mem_size();
  #include <asm/cputhreads.h>
  #include <asm/page.h>
  #include <asm/hvcall.h>
+ #include <asm/switch_to.h>
  #include <linux/gfp.h>
  #include <linux/vmalloc.h>
  #include <linux/highmem.h>
 -
 -/*
 - * For now, limit memory to 64GB and require it to be large pages.
 - * This value is chosen because it makes the ram_pginfo array be
 - * 64kB in size, which is about as large as we want to be trying
 - * to allocate with kmalloc.
 - */
 -#define MAX_MEM_ORDER         36
 -
 -#define LARGE_PAGE_ORDER      24      /* 16MB pages */
 +#include <linux/hugetlb.h>
  
  /* #define EXIT_DEBUG */
  /* #define EXIT_DEBUG_SIMPLE */
  /* #define EXIT_DEBUG_INT */
  
  static void kvmppc_end_cede(struct kvm_vcpu *vcpu);
 +static int kvmppc_hv_setup_rma(struct kvm_vcpu *vcpu);
  
  void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
  {
@@@ -138,10 -147,10 +139,10 @@@ static unsigned long do_h_register_vpa(
                                       unsigned long vcpuid, unsigned long vpa)
  {
        struct kvm *kvm = vcpu->kvm;
 -      unsigned long pg_index, ra, len;
 -      unsigned long pg_offset;
 +      unsigned long len, nb;
        void *va;
        struct kvm_vcpu *tvcpu;
 +      int err = H_PARAMETER;
  
        tvcpu = kvmppc_find_vcpu(kvm, vcpuid);
        if (!tvcpu)
        if (flags < 4) {
                if (vpa & 0x7f)
                        return H_PARAMETER;
 +              if (flags >= 2 && !tvcpu->arch.vpa)
 +                      return H_RESOURCE;
                /* registering new area; convert logical addr to real */
 -              pg_index = vpa >> kvm->arch.ram_porder;
 -              pg_offset = vpa & (kvm->arch.ram_psize - 1);
 -              if (pg_index >= kvm->arch.ram_npages)
 +              va = kvmppc_pin_guest_page(kvm, vpa, &nb);
 +              if (va == NULL)
                        return H_PARAMETER;
 -              if (kvm->arch.ram_pginfo[pg_index].pfn == 0)
 -                      return H_PARAMETER;
 -              ra = kvm->arch.ram_pginfo[pg_index].pfn << PAGE_SHIFT;
 -              ra |= pg_offset;
 -              va = __va(ra);
                if (flags <= 1)
                        len = *(unsigned short *)(va + 4);
                else
                        len = *(unsigned int *)(va + 4);
 -              if (pg_offset + len > kvm->arch.ram_psize)
 -                      return H_PARAMETER;
 +              if (len > nb)
 +                      goto out_unpin;
                switch (flags) {
                case 1:         /* register VPA */
                        if (len < 640)
 -                              return H_PARAMETER;
 +                              goto out_unpin;
 +                      if (tvcpu->arch.vpa)
 +                              kvmppc_unpin_guest_page(kvm, vcpu->arch.vpa);
                        tvcpu->arch.vpa = va;
                        init_vpa(vcpu, va);
                        break;
                case 2:         /* register DTL */
                        if (len < 48)
 -                              return H_PARAMETER;
 -                      if (!tvcpu->arch.vpa)
 -                              return H_RESOURCE;
 +                              goto out_unpin;
                        len -= len % 48;
 +                      if (tvcpu->arch.dtl)
 +                              kvmppc_unpin_guest_page(kvm, vcpu->arch.dtl);
                        tvcpu->arch.dtl = va;
                        tvcpu->arch.dtl_end = va + len;
                        break;
                case 3:         /* register SLB shadow buffer */
 -                      if (len < 8)
 -                              return H_PARAMETER;
 -                      if (!tvcpu->arch.vpa)
 -                              return H_RESOURCE;
 -                      tvcpu->arch.slb_shadow = va;
 -                      len = (len - 16) / 16;
 +                      if (len < 16)
 +                              goto out_unpin;
 +                      if (tvcpu->arch.slb_shadow)
 +                              kvmppc_unpin_guest_page(kvm, vcpu->arch.slb_shadow);
                        tvcpu->arch.slb_shadow = va;
                        break;
                }
                case 5:         /* unregister VPA */
                        if (tvcpu->arch.slb_shadow || tvcpu->arch.dtl)
                                return H_RESOURCE;
 +                      if (!tvcpu->arch.vpa)
 +                              break;
 +                      kvmppc_unpin_guest_page(kvm, tvcpu->arch.vpa);
                        tvcpu->arch.vpa = NULL;
                        break;
                case 6:         /* unregister DTL */
 +                      if (!tvcpu->arch.dtl)
 +                              break;
 +                      kvmppc_unpin_guest_page(kvm, tvcpu->arch.dtl);
                        tvcpu->arch.dtl = NULL;
                        break;
                case 7:         /* unregister SLB shadow buffer */
 +                      if (!tvcpu->arch.slb_shadow)
 +                              break;
 +                      kvmppc_unpin_guest_page(kvm, tvcpu->arch.slb_shadow);
                        tvcpu->arch.slb_shadow = NULL;
                        break;
                }
        }
        return H_SUCCESS;
 +
 + out_unpin:
 +      kvmppc_unpin_guest_page(kvm, va);
 +      return err;
  }
  
  int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
        struct kvm_vcpu *tvcpu;
  
        switch (req) {
 +      case H_ENTER:
 +              ret = kvmppc_virtmode_h_enter(vcpu, kvmppc_get_gpr(vcpu, 4),
 +                                            kvmppc_get_gpr(vcpu, 5),
 +                                            kvmppc_get_gpr(vcpu, 6),
 +                                            kvmppc_get_gpr(vcpu, 7));
 +              break;
        case H_CEDE:
                break;
        case H_PROD:
@@@ -325,19 -319,20 +326,19 @@@ static int kvmppc_handle_exit(struct kv
                break;
        }
        /*
 -       * We get these next two if the guest does a bad real-mode access,
 -       * as we have enabled VRMA (virtualized real mode area) mode in the
 -       * LPCR.  We just generate an appropriate DSI/ISI to the guest.
 +       * We get these next two if the guest accesses a page which it thinks
 +       * it has mapped but which is not actually present, either because
 +       * it is for an emulated I/O device or because the corresonding
 +       * host page has been paged out.  Any other HDSI/HISI interrupts
 +       * have been handled already.
         */
        case BOOK3S_INTERRUPT_H_DATA_STORAGE:
 -              vcpu->arch.shregs.dsisr = vcpu->arch.fault_dsisr;
 -              vcpu->arch.shregs.dar = vcpu->arch.fault_dar;
 -              kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_DATA_STORAGE, 0);
 -              r = RESUME_GUEST;
 +              r = kvmppc_book3s_hv_page_fault(run, vcpu,
 +                              vcpu->arch.fault_dar, vcpu->arch.fault_dsisr);
                break;
        case BOOK3S_INTERRUPT_H_INST_STORAGE:
 -              kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_INST_STORAGE,
 -                                      0x08000000);
 -              r = RESUME_GUEST;
 +              r = kvmppc_book3s_hv_page_fault(run, vcpu,
 +                              kvmppc_get_pc(vcpu), 0);
                break;
        /*
         * This occurs if the guest executes an illegal instruction.
@@@ -397,42 -392,6 +398,42 @@@ int kvm_arch_vcpu_ioctl_set_sregs(struc
        return 0;
  }
  
 +int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
 +{
 +      int r = -EINVAL;
 +
 +      switch (reg->id) {
 +      case KVM_REG_PPC_HIOR:
 +              r = put_user(0, (u64 __user *)reg->addr);
 +              break;
 +      default:
 +              break;
 +      }
 +
 +      return r;
 +}
 +
 +int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
 +{
 +      int r = -EINVAL;
 +
 +      switch (reg->id) {
 +      case KVM_REG_PPC_HIOR:
 +      {
 +              u64 hior;
 +              /* Only allow this to be set to zero */
 +              r = get_user(hior, (u64 __user *)reg->addr);
 +              if (!r && (hior != 0))
 +                      r = -EINVAL;
 +              break;
 +      }
 +      default:
 +              break;
 +      }
 +
 +      return r;
 +}
 +
  int kvmppc_core_check_processor_compat(void)
  {
        if (cpu_has_feature(CPU_FTR_HVMODE))
@@@ -452,7 -411,7 +453,7 @@@ struct kvm_vcpu *kvmppc_core_vcpu_creat
                goto out;
  
        err = -ENOMEM;
 -      vcpu = kzalloc(sizeof(struct kvm_vcpu), GFP_KERNEL);
 +      vcpu = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL);
        if (!vcpu)
                goto out;
  
        return vcpu;
  
  free_vcpu:
 -      kfree(vcpu);
 +      kmem_cache_free(kvm_vcpu_cache, vcpu);
  out:
        return ERR_PTR(err);
  }
  
  void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
  {
 +      if (vcpu->arch.dtl)
 +              kvmppc_unpin_guest_page(vcpu->kvm, vcpu->arch.dtl);
 +      if (vcpu->arch.slb_shadow)
 +              kvmppc_unpin_guest_page(vcpu->kvm, vcpu->arch.slb_shadow);
 +      if (vcpu->arch.vpa)
 +              kvmppc_unpin_guest_page(vcpu->kvm, vcpu->arch.vpa);
        kvm_vcpu_uninit(vcpu);
 -      kfree(vcpu);
 +      kmem_cache_free(kvm_vcpu_cache, vcpu);
  }
  
  static void kvmppc_set_timer(struct kvm_vcpu *vcpu)
        if (now > vcpu->arch.dec_expires) {
                /* decrementer has already gone negative */
                kvmppc_core_queue_dec(vcpu);
 -              kvmppc_core_deliver_interrupts(vcpu);
 +              kvmppc_core_prepare_to_enter(vcpu);
                return;
        }
        dec_nsec = (vcpu->arch.dec_expires - now) * NSEC_PER_SEC
@@@ -844,7 -797,7 +845,7 @@@ static int kvmppc_run_vcpu(struct kvm_r
  
                list_for_each_entry_safe(v, vn, &vc->runnable_threads,
                                         arch.run_list) {
 -                      kvmppc_core_deliver_interrupts(v);
 +                      kvmppc_core_prepare_to_enter(v);
                        if (signal_pending(v->arch.run_task)) {
                                kvmppc_remove_runnable(vc, v);
                                v->stat.signal_exits++;
@@@ -883,26 -836,20 +884,26 @@@ int kvmppc_vcpu_run(struct kvm_run *run
                return -EINVAL;
        }
  
 +      kvmppc_core_prepare_to_enter(vcpu);
 +
        /* No need to go into the guest when all we'll do is come back out */
        if (signal_pending(current)) {
                run->exit_reason = KVM_EXIT_INTR;
                return -EINTR;
        }
  
 -      /* On PPC970, check that we have an RMA region */
 -      if (!vcpu->kvm->arch.rma && cpu_has_feature(CPU_FTR_ARCH_201))
 -              return -EPERM;
 +      /* On the first time here, set up VRMA or RMA */
 +      if (!vcpu->kvm->arch.rma_setup_done) {
 +              r = kvmppc_hv_setup_rma(vcpu);
 +              if (r)
 +                      return r;
 +      }
  
        flush_fp_to_thread(current);
        flush_altivec_to_thread(current);
        flush_vsx_to_thread(current);
        vcpu->arch.wqp = &vcpu->arch.vcore->wq;
 +      vcpu->arch.pgdir = current->mm->pgd;
  
        do {
                r = kvmppc_run_vcpu(run, vcpu);
                if (run->exit_reason == KVM_EXIT_PAPR_HCALL &&
                    !(vcpu->arch.shregs.msr & MSR_PR)) {
                        r = kvmppc_pseries_do_hcall(vcpu);
 -                      kvmppc_core_deliver_interrupts(vcpu);
 +                      kvmppc_core_prepare_to_enter(vcpu);
                }
        } while (r == RESUME_GUEST);
        return r;
@@@ -1054,7 -1001,7 +1055,7 @@@ static inline int lpcr_rmls(unsigned lo
  
  static int kvm_rma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
  {
 -      struct kvmppc_rma_info *ri = vma->vm_file->private_data;
 +      struct kvmppc_linear_info *ri = vma->vm_file->private_data;
        struct page *page;
  
        if (vmf->pgoff >= ri->npages)
@@@ -1079,7 -1026,7 +1080,7 @@@ static int kvm_rma_mmap(struct file *fi
  
  static int kvm_rma_release(struct inode *inode, struct file *filp)
  {
 -      struct kvmppc_rma_info *ri = filp->private_data;
 +      struct kvmppc_linear_info *ri = filp->private_data;
  
        kvm_release_rma(ri);
        return 0;
@@@ -1092,7 -1039,7 +1093,7 @@@ static struct file_operations kvm_rma_f
  
  long kvm_vm_ioctl_allocate_rma(struct kvm *kvm, struct kvm_allocate_rma *ret)
  {
 -      struct kvmppc_rma_info *ri;
 +      struct kvmppc_linear_info *ri;
        long fd;
  
        ri = kvm_alloc_rma();
        return fd;
  }
  
 -static struct page *hva_to_page(unsigned long addr)
 +/*
 + * Get (and clear) the dirty memory log for a memory slot.
 + */
 +int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
  {
 -      struct page *page[1];
 -      int npages;
 +      struct kvm_memory_slot *memslot;
 +      int r;
 +      unsigned long n;
  
 -      might_sleep();
 +      mutex_lock(&kvm->slots_lock);
  
 -      npages = get_user_pages_fast(addr, 1, 1, page);
 +      r = -EINVAL;
 +      if (log->slot >= KVM_MEMORY_SLOTS)
 +              goto out;
  
 -      if (unlikely(npages != 1))
 -              return 0;
 +      memslot = id_to_memslot(kvm->memslots, log->slot);
 +      r = -ENOENT;
 +      if (!memslot->dirty_bitmap)
 +              goto out;
 +
 +      n = kvm_dirty_bitmap_bytes(memslot);
 +      memset(memslot->dirty_bitmap, 0, n);
 +
 +      r = kvmppc_hv_get_dirty_log(kvm, memslot);
 +      if (r)
 +              goto out;
  
 -      return page[0];
 +      r = -EFAULT;
 +      if (copy_to_user(log->dirty_bitmap, memslot->dirty_bitmap, n))
 +              goto out;
 +
 +      r = 0;
 +out:
 +      mutex_unlock(&kvm->slots_lock);
 +      return r;
 +}
 +
 +static unsigned long slb_pgsize_encoding(unsigned long psize)
 +{
 +      unsigned long senc = 0;
 +
 +      if (psize > 0x1000) {
 +              senc = SLB_VSID_L;
 +              if (psize == 0x10000)
 +                      senc |= SLB_VSID_LP_01;
 +      }
 +      return senc;
  }
  
  int kvmppc_core_prepare_memory_region(struct kvm *kvm,
                                struct kvm_userspace_memory_region *mem)
  {
 -      unsigned long psize, porder;
 -      unsigned long i, npages, totalpages;
 -      unsigned long pg_ix;
 -      struct kvmppc_pginfo *pginfo;
 -      unsigned long hva;
 -      struct kvmppc_rma_info *ri = NULL;
 +      unsigned long npages;
 +      unsigned long *phys;
 +
 +      /* Allocate a slot_phys array */
 +      phys = kvm->arch.slot_phys[mem->slot];
 +      if (!kvm->arch.using_mmu_notifiers && !phys) {
 +              npages = mem->memory_size >> PAGE_SHIFT;
 +              phys = vzalloc(npages * sizeof(unsigned long));
 +              if (!phys)
 +                      return -ENOMEM;
 +              kvm->arch.slot_phys[mem->slot] = phys;
 +              kvm->arch.slot_npages[mem->slot] = npages;
 +      }
 +
 +      return 0;
 +}
 +
 +static void unpin_slot(struct kvm *kvm, int slot_id)
 +{
 +      unsigned long *physp;
 +      unsigned long j, npages, pfn;
        struct page *page;
  
 -      /* For now, only allow 16MB pages */
 -      porder = LARGE_PAGE_ORDER;
 -      psize = 1ul << porder;
 -      if ((mem->memory_size & (psize - 1)) ||
 -          (mem->guest_phys_addr & (psize - 1))) {
 -              pr_err("bad memory_size=%llx @ %llx\n",
 -                     mem->memory_size, mem->guest_phys_addr);
 -              return -EINVAL;
 +      physp = kvm->arch.slot_phys[slot_id];
 +      npages = kvm->arch.slot_npages[slot_id];
 +      if (physp) {
 +              spin_lock(&kvm->arch.slot_phys_lock);
 +              for (j = 0; j < npages; j++) {
 +                      if (!(physp[j] & KVMPPC_GOT_PAGE))
 +                              continue;
 +                      pfn = physp[j] >> PAGE_SHIFT;
 +                      page = pfn_to_page(pfn);
 +                      if (PageHuge(page))
 +                              page = compound_head(page);
 +                      SetPageDirty(page);
 +                      put_page(page);
 +              }
 +              kvm->arch.slot_phys[slot_id] = NULL;
 +              spin_unlock(&kvm->arch.slot_phys_lock);
 +              vfree(physp);
        }
 +}
  
 -      npages = mem->memory_size >> porder;
 -      totalpages = (mem->guest_phys_addr + mem->memory_size) >> porder;
 +void kvmppc_core_commit_memory_region(struct kvm *kvm,
 +                              struct kvm_userspace_memory_region *mem)
 +{
 +}
  
 -      /* More memory than we have space to track? */
 -      if (totalpages > (1ul << (MAX_MEM_ORDER - LARGE_PAGE_ORDER)))
 -              return -EINVAL;
 +static int kvmppc_hv_setup_rma(struct kvm_vcpu *vcpu)
 +{
 +      int err = 0;
 +      struct kvm *kvm = vcpu->kvm;
 +      struct kvmppc_linear_info *ri = NULL;
 +      unsigned long hva;
 +      struct kvm_memory_slot *memslot;
 +      struct vm_area_struct *vma;
 +      unsigned long lpcr, senc;
 +      unsigned long psize, porder;
 +      unsigned long rma_size;
 +      unsigned long rmls;
 +      unsigned long *physp;
 +      unsigned long i, npages;
  
 -      /* Do we already have an RMA registered? */
 -      if (mem->guest_phys_addr == 0 && kvm->arch.rma)
 -              return -EINVAL;
 +      mutex_lock(&kvm->lock);
 +      if (kvm->arch.rma_setup_done)
 +              goto out;       /* another vcpu beat us to it */
  
 -      if (totalpages > kvm->arch.ram_npages)
 -              kvm->arch.ram_npages = totalpages;
 +      /* Look up the memslot for guest physical address 0 */
 +      memslot = gfn_to_memslot(kvm, 0);
 +
 +      /* We must have some memory at 0 by now */
 +      err = -EINVAL;
 +      if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID))
 +              goto out;
 +
 +      /* Look up the VMA for the start of this memory slot */
 +      hva = memslot->userspace_addr;
 +      down_read(&current->mm->mmap_sem);
 +      vma = find_vma(current->mm, hva);
 +      if (!vma || vma->vm_start > hva || (vma->vm_flags & VM_IO))
 +              goto up_out;
 +
 +      psize = vma_kernel_pagesize(vma);
 +      porder = __ilog2(psize);
  
        /* Is this one of our preallocated RMAs? */
 -      if (mem->guest_phys_addr == 0) {
 -              struct vm_area_struct *vma;
 -
 -              down_read(&current->mm->mmap_sem);
 -              vma = find_vma(current->mm, mem->userspace_addr);
 -              if (vma && vma->vm_file &&
 -                  vma->vm_file->f_op == &kvm_rma_fops &&
 -                  mem->userspace_addr == vma->vm_start)
 -                      ri = vma->vm_file->private_data;
 -              up_read(&current->mm->mmap_sem);
 -              if (!ri && cpu_has_feature(CPU_FTR_ARCH_201)) {
 -                      pr_err("CPU requires an RMO\n");
 -                      return -EINVAL;
 +      if (vma->vm_file && vma->vm_file->f_op == &kvm_rma_fops &&
 +          hva == vma->vm_start)
 +              ri = vma->vm_file->private_data;
 +
 +      up_read(&current->mm->mmap_sem);
 +
 +      if (!ri) {
 +              /* On POWER7, use VRMA; on PPC970, give up */
 +              err = -EPERM;
 +              if (cpu_has_feature(CPU_FTR_ARCH_201)) {
 +                      pr_err("KVM: CPU requires an RMO\n");
 +                      goto out;
                }
 -      }
  
 -      if (ri) {
 -              unsigned long rma_size;
 -              unsigned long lpcr;
 -              long rmls;
 +              /* We can handle 4k, 64k or 16M pages in the VRMA */
 +              err = -EINVAL;
 +              if (!(psize == 0x1000 || psize == 0x10000 ||
 +                    psize == 0x1000000))
 +                      goto out;
 +
 +              /* Update VRMASD field in the LPCR */
 +              senc = slb_pgsize_encoding(psize);
 +              kvm->arch.vrma_slb_v = senc | SLB_VSID_B_1T |
 +                      (VRMA_VSID << SLB_VSID_SHIFT_1T);
 +              lpcr = kvm->arch.lpcr & ~LPCR_VRMASD;
 +              lpcr |= senc << (LPCR_VRMASD_SH - 4);
 +              kvm->arch.lpcr = lpcr;
  
 -              rma_size = ri->npages << PAGE_SHIFT;
 -              if (rma_size > mem->memory_size)
 -                      rma_size = mem->memory_size;
 +              /* Create HPTEs in the hash page table for the VRMA */
 +              kvmppc_map_vrma(vcpu, memslot, porder);
 +
 +      } else {
 +              /* Set up to use an RMO region */
 +              rma_size = ri->npages;
 +              if (rma_size > memslot->npages)
 +                      rma_size = memslot->npages;
 +              rma_size <<= PAGE_SHIFT;
                rmls = lpcr_rmls(rma_size);
 +              err = -EINVAL;
                if (rmls < 0) {
 -                      pr_err("Can't use RMA of 0x%lx bytes\n", rma_size);
 -                      return -EINVAL;
 +                      pr_err("KVM: Can't use RMA of 0x%lx bytes\n", rma_size);
 +                      goto out;
                }
                atomic_inc(&ri->use_count);
                kvm->arch.rma = ri;
 -              kvm->arch.n_rma_pages = rma_size >> porder;
  
                /* Update LPCR and RMOR */
                lpcr = kvm->arch.lpcr;
                        kvm->arch.rmor = kvm->arch.rma->base_pfn << PAGE_SHIFT;
                }
                kvm->arch.lpcr = lpcr;
 -              pr_info("Using RMO at %lx size %lx (LPCR = %lx)\n",
 +              pr_info("KVM: Using RMO at %lx size %lx (LPCR = %lx)\n",
                        ri->base_pfn << PAGE_SHIFT, rma_size, lpcr);
 -      }
  
 -      pg_ix = mem->guest_phys_addr >> porder;
 -      pginfo = kvm->arch.ram_pginfo + pg_ix;
 -      for (i = 0; i < npages; ++i, ++pg_ix) {
 -              if (ri && pg_ix < kvm->arch.n_rma_pages) {
 -                      pginfo[i].pfn = ri->base_pfn +
 -                              (pg_ix << (porder - PAGE_SHIFT));
 -                      continue;
 -              }
 -              hva = mem->userspace_addr + (i << porder);
 -              page = hva_to_page(hva);
 -              if (!page) {
 -                      pr_err("oops, no pfn for hva %lx\n", hva);
 -                      goto err;
 -              }
 -              /* Check it's a 16MB page */
 -              if (!PageHead(page) ||
 -                  compound_order(page) != (LARGE_PAGE_ORDER - PAGE_SHIFT)) {
 -                      pr_err("page at %lx isn't 16MB (o=%d)\n",
 -                             hva, compound_order(page));
 -                      goto err;
 -              }
 -              pginfo[i].pfn = page_to_pfn(page);
 +              /* Initialize phys addrs of pages in RMO */
 +              npages = ri->npages;
 +              porder = __ilog2(npages);
 +              physp = kvm->arch.slot_phys[memslot->id];
 +              spin_lock(&kvm->arch.slot_phys_lock);
 +              for (i = 0; i < npages; ++i)
 +                      physp[i] = ((ri->base_pfn + i) << PAGE_SHIFT) + porder;
 +              spin_unlock(&kvm->arch.slot_phys_lock);
        }
  
 -      return 0;
 -
 - err:
 -      return -EINVAL;
 -}
 +      /* Order updates to kvm->arch.lpcr etc. vs. rma_setup_done */
 +      smp_wmb();
 +      kvm->arch.rma_setup_done = 1;
 +      err = 0;
 + out:
 +      mutex_unlock(&kvm->lock);
 +      return err;
  
 -void kvmppc_core_commit_memory_region(struct kvm *kvm,
 -                              struct kvm_userspace_memory_region *mem)
 -{
 -      if (mem->guest_phys_addr == 0 && mem->memory_size != 0 &&
 -          !kvm->arch.rma)
 -              kvmppc_map_vrma(kvm, mem);
 + up_out:
 +      up_read(&current->mm->mmap_sem);
 +      goto out;
  }
  
  int kvmppc_core_init_vm(struct kvm *kvm)
  {
        long r;
 -      unsigned long npages = 1ul << (MAX_MEM_ORDER - LARGE_PAGE_ORDER);
 -      long err = -ENOMEM;
        unsigned long lpcr;
  
        /* Allocate hashed page table */
  
        INIT_LIST_HEAD(&kvm->arch.spapr_tce_tables);
  
 -      kvm->arch.ram_pginfo = kzalloc(npages * sizeof(struct kvmppc_pginfo),
 -                                     GFP_KERNEL);
 -      if (!kvm->arch.ram_pginfo) {
 -              pr_err("kvmppc_core_init_vm: couldn't alloc %lu bytes\n",
 -                     npages * sizeof(struct kvmppc_pginfo));
 -              goto out_free;
 -      }
 -
 -      kvm->arch.ram_npages = 0;
 -      kvm->arch.ram_psize = 1ul << LARGE_PAGE_ORDER;
 -      kvm->arch.ram_porder = LARGE_PAGE_ORDER;
        kvm->arch.rma = NULL;
 -      kvm->arch.n_rma_pages = 0;
  
        kvm->arch.host_sdr1 = mfspr(SPRN_SDR1);
  
                kvm->arch.host_lpcr = lpcr = mfspr(SPRN_LPCR);
                lpcr &= LPCR_PECE | LPCR_LPES;
                lpcr |= (4UL << LPCR_DPFD_SH) | LPCR_HDICE |
 -                      LPCR_VPM0 | LPCR_VRMA_L;
 +                      LPCR_VPM0 | LPCR_VPM1;
 +              kvm->arch.vrma_slb_v = SLB_VSID_B_1T |
 +                      (VRMA_VSID << SLB_VSID_SHIFT_1T);
        }
        kvm->arch.lpcr = lpcr;
  
 +      kvm->arch.using_mmu_notifiers = !!cpu_has_feature(CPU_FTR_ARCH_206);
 +      spin_lock_init(&kvm->arch.slot_phys_lock);
        return 0;
 -
 - out_free:
 -      kvmppc_free_hpt(kvm);
 -      return err;
  }
  
  void kvmppc_core_destroy_vm(struct kvm *kvm)
  {
 -      struct kvmppc_pginfo *pginfo;
        unsigned long i;
  
 -      if (kvm->arch.ram_pginfo) {
 -              pginfo = kvm->arch.ram_pginfo;
 -              kvm->arch.ram_pginfo = NULL;
 -              for (i = kvm->arch.n_rma_pages; i < kvm->arch.ram_npages; ++i)
 -                      if (pginfo[i].pfn)
 -                              put_page(pfn_to_page(pginfo[i].pfn));
 -              kfree(pginfo);
 -      }
 +      if (!kvm->arch.using_mmu_notifiers)
 +              for (i = 0; i < KVM_MEM_SLOTS_NUM; i++)
 +                      unpin_slot(kvm, i);
 +
        if (kvm->arch.rma) {
                kvm_release_rma(kvm->arch.rma);
                kvm->arch.rma = NULL;
@@@ -27,6 -27,7 +27,7 @@@
  #include <asm/ppc-pci.h>
  #include <asm/iommu.h>
  #include <asm/io-workarounds.h>
+ #include <asm/debug.h>
  
  #include "wsp.h"
  #include "wsp_pci.h"
@@@ -682,6 -683,7 +683,6 @@@ static int __init wsp_setup_one_phb(str
        /* XXX Force re-assigning of everything for now */
        pci_add_flags(PCI_REASSIGN_ALL_BUS | PCI_REASSIGN_ALL_RSRC |
                      PCI_ENABLE_PROC_DOMAINS);
 -      pci_probe_only = 0;
  
        /* Calculate how the TCE space is divided */
        phb->dma32_base         = 0;
diff --combined arch/s390/kernel/vdso.c
  #include <linux/compat.h>
  #include <asm/asm-offsets.h>
  #include <asm/pgtable.h>
- #include <asm/system.h>
  #include <asm/processor.h>
  #include <asm/mmu.h>
  #include <asm/mmu_context.h>
  #include <asm/sections.h>
  #include <asm/vdso.h>
+ #include <asm/facility.h>
  
  #if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
  extern char vdso32_start, vdso32_end;
@@@ -241,11 -241,17 +241,11 @@@ int arch_setup_additional_pages(struct 
         * on the "data" page of the vDSO or you'll stop getting kernel
         * updates and your nice userland gettimeofday will be totally dead.
         * It's fine to use that for setting breakpoints in the vDSO code
 -       * pages though
 -       *
 -       * Make sure the vDSO gets into every core dump.
 -       * Dumping its contents makes post-mortem fully interpretable later
 -       * without matching up the same kernel and hardware config to see
 -       * what PC values meant.
 +       * pages though.
         */
        rc = install_special_mapping(mm, vdso_base, vdso_pages << PAGE_SHIFT,
                                     VM_READ|VM_EXEC|
 -                                   VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC|
 -                                   VM_ALWAYSDUMP,
 +                                   VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
                                     vdso_pagelist);
        if (rc)
                current->mm->context.vdso_base = 0;
diff --combined arch/s390/kvm/kvm-s390.c
@@@ -27,7 -27,7 +27,7 @@@
  #include <asm/lowcore.h>
  #include <asm/pgtable.h>
  #include <asm/nmi.h>
- #include <asm/system.h>
+ #include <asm/switch_to.h>
  #include "kvm-s390.h"
  #include "gaccess.h"
  
@@@ -129,10 -129,6 +129,10 @@@ int kvm_dev_ioctl_check_extension(long 
        case KVM_CAP_S390_PSW:
        case KVM_CAP_S390_GMAP:
        case KVM_CAP_SYNC_MMU:
 +#ifdef CONFIG_KVM_S390_UCONTROL
 +      case KVM_CAP_S390_UCONTROL:
 +#endif
 +      case KVM_CAP_SYNC_REGS:
                r = 1;
                break;
        default:
@@@ -175,22 -171,11 +175,22 @@@ long kvm_arch_vm_ioctl(struct file *fil
        return r;
  }
  
 -int kvm_arch_init_vm(struct kvm *kvm)
 +int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
  {
        int rc;
        char debug_name[16];
  
 +      rc = -EINVAL;
 +#ifdef CONFIG_KVM_S390_UCONTROL
 +      if (type & ~KVM_VM_S390_UCONTROL)
 +              goto out_err;
 +      if ((type & KVM_VM_S390_UCONTROL) && (!capable(CAP_SYS_ADMIN)))
 +              goto out_err;
 +#else
 +      if (type)
 +              goto out_err;
 +#endif
 +
        rc = s390_enable_sie();
        if (rc)
                goto out_err;
        debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
        VM_EVENT(kvm, 3, "%s", "vm created");
  
 -      kvm->arch.gmap = gmap_alloc(current->mm);
 -      if (!kvm->arch.gmap)
 -              goto out_nogmap;
 -
 +      if (type & KVM_VM_S390_UCONTROL) {
 +              kvm->arch.gmap = NULL;
 +      } else {
 +              kvm->arch.gmap = gmap_alloc(current->mm);
 +              if (!kvm->arch.gmap)
 +                      goto out_nogmap;
 +      }
        return 0;
  out_nogmap:
        debug_unregister(kvm->arch.dbf);
@@@ -232,18 -214,11 +232,18 @@@ out_err
  void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
  {
        VCPU_EVENT(vcpu, 3, "%s", "free cpu");
 -      clear_bit(63 - vcpu->vcpu_id, (unsigned long *) &vcpu->kvm->arch.sca->mcn);
 -      if (vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda ==
 -              (__u64) vcpu->arch.sie_block)
 -              vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
 +      if (!kvm_is_ucontrol(vcpu->kvm)) {
 +              clear_bit(63 - vcpu->vcpu_id,
 +                        (unsigned long *) &vcpu->kvm->arch.sca->mcn);
 +              if (vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda ==
 +                  (__u64) vcpu->arch.sie_block)
 +                      vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sda = 0;
 +      }
        smp_mb();
 +
 +      if (kvm_is_ucontrol(vcpu->kvm))
 +              gmap_free(vcpu->arch.gmap);
 +
        free_page((unsigned long)(vcpu->arch.sie_block));
        kvm_vcpu_uninit(vcpu);
        kfree(vcpu);
@@@ -274,25 -249,13 +274,25 @@@ void kvm_arch_destroy_vm(struct kvm *kv
        kvm_free_vcpus(kvm);
        free_page((unsigned long)(kvm->arch.sca));
        debug_unregister(kvm->arch.dbf);
 -      gmap_free(kvm->arch.gmap);
 +      if (!kvm_is_ucontrol(kvm))
 +              gmap_free(kvm->arch.gmap);
  }
  
  /* Section: vcpu related */
  int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
  {
 +      if (kvm_is_ucontrol(vcpu->kvm)) {
 +              vcpu->arch.gmap = gmap_alloc(current->mm);
 +              if (!vcpu->arch.gmap)
 +                      return -ENOMEM;
 +              return 0;
 +      }
 +
        vcpu->arch.gmap = vcpu->kvm->arch.gmap;
 +      vcpu->run->kvm_valid_regs = KVM_SYNC_PREFIX |
 +                                  KVM_SYNC_GPRS |
 +                                  KVM_SYNC_ACRS |
 +                                  KVM_SYNC_CRS;
        return 0;
  }
  
@@@ -307,7 -270,7 +307,7 @@@ void kvm_arch_vcpu_load(struct kvm_vcp
        save_access_regs(vcpu->arch.host_acrs);
        vcpu->arch.guest_fpregs.fpc &= FPC_VALID_MASK;
        restore_fp_regs(&vcpu->arch.guest_fpregs);
 -      restore_access_regs(vcpu->arch.guest_acrs);
 +      restore_access_regs(vcpu->run->s.regs.acrs);
        gmap_enable(vcpu->arch.gmap);
        atomic_set_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
  }
@@@ -317,7 -280,7 +317,7 @@@ void kvm_arch_vcpu_put(struct kvm_vcpu 
        atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
        gmap_disable(vcpu->arch.gmap);
        save_fp_regs(&vcpu->arch.guest_fpregs);
 -      save_access_regs(vcpu->arch.guest_acrs);
 +      save_access_regs(vcpu->run->s.regs.acrs);
        restore_fp_regs(&vcpu->arch.host_fpregs);
        restore_access_regs(vcpu->arch.host_acrs);
  }
@@@ -327,7 -290,8 +327,7 @@@ static void kvm_s390_vcpu_initial_reset
        /* this equals initial cpu reset in pop, but we don't switch to ESA */
        vcpu->arch.sie_block->gpsw.mask = 0UL;
        vcpu->arch.sie_block->gpsw.addr = 0UL;
 -      vcpu->arch.sie_block->prefix    = 0UL;
 -      vcpu->arch.sie_block->ihcpu     = 0xffff;
 +      kvm_s390_set_prefix(vcpu, 0);
        vcpu->arch.sie_block->cputm     = 0UL;
        vcpu->arch.sie_block->ckc       = 0UL;
        vcpu->arch.sie_block->todpr     = 0;
@@@ -378,19 -342,12 +378,19 @@@ struct kvm_vcpu *kvm_arch_vcpu_create(s
                goto out_free_cpu;
  
        vcpu->arch.sie_block->icpua = id;
 -      BUG_ON(!kvm->arch.sca);
 -      if (!kvm->arch.sca->cpu[id].sda)
 -              kvm->arch.sca->cpu[id].sda = (__u64) vcpu->arch.sie_block;
 -      vcpu->arch.sie_block->scaoh = (__u32)(((__u64)kvm->arch.sca) >> 32);
 -      vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca;
 -      set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn);
 +      if (!kvm_is_ucontrol(kvm)) {
 +              if (!kvm->arch.sca) {
 +                      WARN_ON_ONCE(1);
 +                      goto out_free_cpu;
 +              }
 +              if (!kvm->arch.sca->cpu[id].sda)
 +                      kvm->arch.sca->cpu[id].sda =
 +                              (__u64) vcpu->arch.sie_block;
 +              vcpu->arch.sie_block->scaoh =
 +                      (__u32)(((__u64)kvm->arch.sca) >> 32);
 +              vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca;
 +              set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn);
 +      }
  
        spin_lock_init(&vcpu->arch.local_int.lock);
        INIT_LIST_HEAD(&vcpu->arch.local_int.list);
@@@ -431,29 -388,29 +431,29 @@@ static int kvm_arch_vcpu_ioctl_initial_
  
  int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
  {
 -      memcpy(&vcpu->arch.guest_gprs, &regs->gprs, sizeof(regs->gprs));
 +      memcpy(&vcpu->run->s.regs.gprs, &regs->gprs, sizeof(regs->gprs));
        return 0;
  }
  
  int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
  {
 -      memcpy(&regs->gprs, &vcpu->arch.guest_gprs, sizeof(regs->gprs));
 +      memcpy(&regs->gprs, &vcpu->run->s.regs.gprs, sizeof(regs->gprs));
        return 0;
  }
  
  int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
                                  struct kvm_sregs *sregs)
  {
 -      memcpy(&vcpu->arch.guest_acrs, &sregs->acrs, sizeof(sregs->acrs));
 +      memcpy(&vcpu->run->s.regs.acrs, &sregs->acrs, sizeof(sregs->acrs));
        memcpy(&vcpu->arch.sie_block->gcr, &sregs->crs, sizeof(sregs->crs));
 -      restore_access_regs(vcpu->arch.guest_acrs);
 +      restore_access_regs(vcpu->run->s.regs.acrs);
        return 0;
  }
  
  int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
                                  struct kvm_sregs *sregs)
  {
 -      memcpy(&sregs->acrs, &vcpu->arch.guest_acrs, sizeof(sregs->acrs));
 +      memcpy(&sregs->acrs, &vcpu->run->s.regs.acrs, sizeof(sregs->acrs));
        memcpy(&sregs->crs, &vcpu->arch.sie_block->gcr, sizeof(sregs->crs));
        return 0;
  }
  int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
  {
        memcpy(&vcpu->arch.guest_fpregs.fprs, &fpu->fprs, sizeof(fpu->fprs));
 -      vcpu->arch.guest_fpregs.fpc = fpu->fpc;
 +      vcpu->arch.guest_fpregs.fpc = fpu->fpc & FPC_VALID_MASK;
        restore_fp_regs(&vcpu->arch.guest_fpregs);
        return 0;
  }
@@@ -510,11 -467,9 +510,11 @@@ int kvm_arch_vcpu_ioctl_set_mpstate(str
        return -EINVAL; /* not implemented yet */
  }
  
 -static void __vcpu_run(struct kvm_vcpu *vcpu)
 +static int __vcpu_run(struct kvm_vcpu *vcpu)
  {
 -      memcpy(&vcpu->arch.sie_block->gg14, &vcpu->arch.guest_gprs[14], 16);
 +      int rc;
 +
 +      memcpy(&vcpu->arch.sie_block->gg14, &vcpu->run->s.regs.gprs[14], 16);
  
        if (need_resched())
                schedule();
        if (test_thread_flag(TIF_MCCK_PENDING))
                s390_handle_mcck();
  
 -      kvm_s390_deliver_pending_interrupts(vcpu);
 +      if (!kvm_is_ucontrol(vcpu->kvm))
 +              kvm_s390_deliver_pending_interrupts(vcpu);
  
        vcpu->arch.sie_block->icptcode = 0;
        local_irq_disable();
        local_irq_enable();
        VCPU_EVENT(vcpu, 6, "entering sie flags %x",
                   atomic_read(&vcpu->arch.sie_block->cpuflags));
 -      if (sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs)) {
 -              VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
 -              kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
 +      rc = sie64a(vcpu->arch.sie_block, vcpu->run->s.regs.gprs);
 +      if (rc) {
 +              if (kvm_is_ucontrol(vcpu->kvm)) {
 +                      rc = SIE_INTERCEPT_UCONTROL;
 +              } else {
 +                      VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
 +                      kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
 +                      rc = 0;
 +              }
        }
        VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
                   vcpu->arch.sie_block->icptcode);
        kvm_guest_exit();
        local_irq_enable();
  
 -      memcpy(&vcpu->arch.guest_gprs[14], &vcpu->arch.sie_block->gg14, 16);
 +      memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16);
 +      return rc;
  }
  
  int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
@@@ -569,7 -516,6 +569,7 @@@ rerun_vcpu
        case KVM_EXIT_UNKNOWN:
        case KVM_EXIT_INTR:
        case KVM_EXIT_S390_RESET:
 +      case KVM_EXIT_S390_UCONTROL:
                break;
        default:
                BUG();
  
        vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
        vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
 +      if (kvm_run->kvm_dirty_regs & KVM_SYNC_PREFIX) {
 +              kvm_run->kvm_dirty_regs &= ~KVM_SYNC_PREFIX;
 +              kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
 +      }
 +      if (kvm_run->kvm_dirty_regs & KVM_SYNC_CRS) {
 +              kvm_run->kvm_dirty_regs &= ~KVM_SYNC_CRS;
 +              memcpy(&vcpu->arch.sie_block->gcr, &kvm_run->s.regs.crs, 128);
 +              kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
 +      }
  
        might_fault();
  
        do {
 -              __vcpu_run(vcpu);
 -              rc = kvm_handle_sie_intercept(vcpu);
 +              rc = __vcpu_run(vcpu);
 +              if (rc)
 +                      break;
 +              if (kvm_is_ucontrol(vcpu->kvm))
 +                      rc = -EOPNOTSUPP;
 +              else
 +                      rc = kvm_handle_sie_intercept(vcpu);
        } while (!signal_pending(current) && !rc);
  
        if (rc == SIE_INTERCEPT_RERUNVCPU)
                rc = -EINTR;
        }
  
 +#ifdef CONFIG_KVM_S390_UCONTROL
 +      if (rc == SIE_INTERCEPT_UCONTROL) {
 +              kvm_run->exit_reason = KVM_EXIT_S390_UCONTROL;
 +              kvm_run->s390_ucontrol.trans_exc_code =
 +                      current->thread.gmap_addr;
 +              kvm_run->s390_ucontrol.pgm_code = 0x10;
 +              rc = 0;
 +      }
 +#endif
 +
        if (rc == -EOPNOTSUPP) {
                /* intercept cannot be handled in-kernel, prepare kvm-run */
                kvm_run->exit_reason         = KVM_EXIT_S390_SIEIC;
  
        kvm_run->psw_mask     = vcpu->arch.sie_block->gpsw.mask;
        kvm_run->psw_addr     = vcpu->arch.sie_block->gpsw.addr;
 +      kvm_run->s.regs.prefix = vcpu->arch.sie_block->prefix;
 +      memcpy(&kvm_run->s.regs.crs, &vcpu->arch.sie_block->gcr, 128);
  
        if (vcpu->sigset_active)
                sigprocmask(SIG_SETMASK, &sigsaved, NULL);
@@@ -682,7 -602,7 +682,7 @@@ int kvm_s390_vcpu_store_status(struct k
                return -EFAULT;
  
        if (__guestcopy(vcpu, addr + offsetof(struct save_area, gp_regs),
 -                      vcpu->arch.guest_gprs, 128, prefix))
 +                      vcpu->run->s.regs.gprs, 128, prefix))
                return -EFAULT;
  
        if (__guestcopy(vcpu, addr + offsetof(struct save_area, psw),
                return -EFAULT;
  
        if (__guestcopy(vcpu, addr + offsetof(struct save_area, acc_regs),
 -                      &vcpu->arch.guest_acrs, 64, prefix))
 +                      &vcpu->run->s.regs.acrs, 64, prefix))
                return -EFAULT;
  
        if (__guestcopy(vcpu,
@@@ -753,77 -673,12 +753,77 @@@ long kvm_arch_vcpu_ioctl(struct file *f
        case KVM_S390_INITIAL_RESET:
                r = kvm_arch_vcpu_ioctl_initial_reset(vcpu);
                break;
 +#ifdef CONFIG_KVM_S390_UCONTROL
 +      case KVM_S390_UCAS_MAP: {
 +              struct kvm_s390_ucas_mapping ucasmap;
 +
 +              if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
 +                      r = -EFAULT;
 +                      break;
 +              }
 +
 +              if (!kvm_is_ucontrol(vcpu->kvm)) {
 +                      r = -EINVAL;
 +                      break;
 +              }
 +
 +              r = gmap_map_segment(vcpu->arch.gmap, ucasmap.user_addr,
 +                                   ucasmap.vcpu_addr, ucasmap.length);
 +              break;
 +      }
 +      case KVM_S390_UCAS_UNMAP: {
 +              struct kvm_s390_ucas_mapping ucasmap;
 +
 +              if (copy_from_user(&ucasmap, argp, sizeof(ucasmap))) {
 +                      r = -EFAULT;
 +                      break;
 +              }
 +
 +              if (!kvm_is_ucontrol(vcpu->kvm)) {
 +                      r = -EINVAL;
 +                      break;
 +              }
 +
 +              r = gmap_unmap_segment(vcpu->arch.gmap, ucasmap.vcpu_addr,
 +                      ucasmap.length);
 +              break;
 +      }
 +#endif
 +      case KVM_S390_VCPU_FAULT: {
 +              r = gmap_fault(arg, vcpu->arch.gmap);
 +              if (!IS_ERR_VALUE(r))
 +                      r = 0;
 +              break;
 +      }
        default:
 -              r = -EINVAL;
 +              r = -ENOTTY;
        }
        return r;
  }
  
 +int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
 +{
 +#ifdef CONFIG_KVM_S390_UCONTROL
 +      if ((vmf->pgoff == KVM_S390_SIE_PAGE_OFFSET)
 +               && (kvm_is_ucontrol(vcpu->kvm))) {
 +              vmf->page = virt_to_page(vcpu->arch.sie_block);
 +              get_page(vmf->page);
 +              return 0;
 +      }
 +#endif
 +      return VM_FAULT_SIGBUS;
 +}
 +
 +void kvm_arch_free_memslot(struct kvm_memory_slot *free,
 +                         struct kvm_memory_slot *dont)
 +{
 +}
 +
 +int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
 +{
 +      return 0;
 +}
 +
  /* Section: memory related */
  int kvm_arch_prepare_memory_region(struct kvm *kvm,
                                   struct kvm_memory_slot *memslot,
@@@ -17,7 -17,9 +17,9 @@@
  #include <linux/semaphore.h>
  #include <linux/oom.h>
  #include <linux/oprofile.h>
+ #include <asm/facility.h>
 -#include <asm/lowcore.h>
 +#include <asm/cpu_mf.h>
  #include <asm/irq.h>
  
  #include "hwsampler.h"
  #define ALERT_REQ_MASK   0x4000000000000000ul
  #define BUFFER_FULL_MASK 0x8000000000000000ul
  
 -#define EI_IEA      (1 << 31) /* invalid entry address              */
 -#define EI_ISE      (1 << 30) /* incorrect SDBT entry               */
 -#define EI_PRA      (1 << 29) /* program request alert              */
 -#define EI_SACA     (1 << 23) /* sampler authorization change alert */
 -#define EI_LSDA     (1 << 22) /* loss of sample data alert          */
 -
  DECLARE_PER_CPU(struct hws_cpu_buffer, sampler_cpu_buffer);
  
  struct hws_execute_parms {
@@@ -225,20 -233,9 +227,20 @@@ static inline unsigned long *trailer_en
        return (unsigned long *) ret;
  }
  
 -/* prototypes for external interrupt handler and worker */
  static void hws_ext_handler(struct ext_code ext_code,
 -                          unsigned int param32, unsigned long param64);
 +                          unsigned int param32, unsigned long param64)
 +{
 +      struct hws_cpu_buffer *cb = &__get_cpu_var(sampler_cpu_buffer);
 +
 +      if (!(param32 & CPU_MF_INT_SF_MASK))
 +              return;
 +
 +      kstat_cpu(smp_processor_id()).irqs[EXTINT_CPM]++;
 +      atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);
 +
 +      if (hws_wq)
 +              queue_work(hws_wq, &cb->worker);
 +}
  
  static void worker(struct work_struct *work);
  
@@@ -677,6 -674,18 +679,6 @@@ int hwsampler_activate(unsigned int cpu
        return rc;
  }
  
 -static void hws_ext_handler(struct ext_code ext_code,
 -                          unsigned int param32, unsigned long param64)
 -{
 -      struct hws_cpu_buffer *cb;
 -
 -      kstat_cpu(smp_processor_id()).irqs[EXTINT_CPM]++;
 -      cb = &__get_cpu_var(sampler_cpu_buffer);
 -      atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);
 -      if (hws_wq)
 -              queue_work(hws_wq, &cb->worker);
 -}
 -
  static int check_qsi_on_setup(void)
  {
        int rc;
@@@ -752,23 -761,23 +754,23 @@@ static int worker_check_error(unsigned 
        if (!sdbt || !*sdbt)
                return -EINVAL;
  
 -      if (ext_params & EI_PRA)
 +      if (ext_params & CPU_MF_INT_SF_PRA)
                cb->req_alert++;
  
 -      if (ext_params & EI_LSDA)
 +      if (ext_params & CPU_MF_INT_SF_LSDA)
                cb->loss_of_sample_data++;
  
 -      if (ext_params & EI_IEA) {
 +      if (ext_params & CPU_MF_INT_SF_IAE) {
                cb->invalid_entry_address++;
                rc = -EINVAL;
        }
  
 -      if (ext_params & EI_ISE) {
 +      if (ext_params & CPU_MF_INT_SF_ISE) {
                cb->incorrect_sdbt_entry++;
                rc = -EINVAL;
        }
  
 -      if (ext_params & EI_SACA) {
 +      if (ext_params & CPU_MF_INT_SF_SACA) {
                cb->sample_auth_change_alert++;
                rc = -EINVAL;
        }
@@@ -1001,7 -1010,7 +1003,7 @@@ int hwsampler_deallocate(void
        if (hws_state != HWS_STOPPED)
                goto deallocate_exit;
  
 -      ctl_clear_bit(0, 5); /* set bit 58 CR0 off */
 +      measurement_alert_subclass_unregister();
        deallocate_sdbt();
  
        hws_state = HWS_DEALLOCATED;
@@@ -1115,7 -1124,7 +1117,7 @@@ int hwsampler_shutdown(void
                mutex_lock(&hws_sem);
  
                if (hws_state == HWS_STOPPED) {
 -                      ctl_clear_bit(0, 5); /* set bit 58 CR0 off */
 +                      measurement_alert_subclass_unregister();
                        deallocate_sdbt();
                }
                if (hws_wq) {
@@@ -1190,7 -1199,7 +1192,7 @@@ start_all_exit
        hws_oom = 1;
        hws_flush_all = 0;
        /* now let them in, 1407 CPUMF external interrupts */
 -      ctl_set_bit(0, 5); /* set CR0 bit 58 */
 +      measurement_alert_subclass_register();
  
        return 0;
  }
diff --combined arch/tile/mm/elf.c
@@@ -21,6 -21,7 +21,7 @@@
  #include <asm/pgtable.h>
  #include <asm/pgalloc.h>
  #include <asm/sections.h>
+ #include <arch/sim_def.h>
  
  /* Notify a running simulator, if any, that an exec just occurred. */
  static void sim_notify_exec(const char *binary_name)
@@@ -117,11 -118,17 +118,11 @@@ int arch_setup_additional_pages(struct 
  
        /*
         * MAYWRITE to allow gdb to COW and set breakpoints
 -       *
 -       * Make sure the vDSO gets into every core dump.  Dumping its
 -       * contents makes post-mortem fully interpretable later
 -       * without matching up the same kernel and hardware config to
 -       * see what PC values meant.
         */
        vdso_base = VDSO_BASE;
        retval = install_special_mapping(mm, vdso_base, PAGE_SIZE,
                                         VM_READ|VM_EXEC|
 -                                       VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC|
 -                                       VM_ALWAYSDUMP,
 +                                       VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
                                         vdso_pages);
  
  #ifndef __tilegx__
@@@ -34,7 -34,6 +34,6 @@@
  
  #include <asm/cacheflush.h>
  #include <asm/processor.h>
- #include <asm/system.h>
  #include <asm/stacktrace.h>
  
  #include "setup.h"
@@@ -381,7 -380,7 +380,7 @@@ int vectors_user_mapping(void
        return install_special_mapping(mm, 0xffff0000, PAGE_SIZE,
                                       VM_READ | VM_EXEC |
                                       VM_MAYREAD | VM_MAYEXEC |
 -                                     VM_ALWAYSDUMP | VM_RESERVED,
 +                                     VM_RESERVED,
                                       NULL);
  }
  
@@@ -14,13 -14,13 +14,13 @@@ struct mm_struct
  #include <asm/sigcontext.h>
  #include <asm/current.h>
  #include <asm/cpufeature.h>
- #include <asm/system.h>
  #include <asm/page.h>
  #include <asm/pgtable_types.h>
  #include <asm/percpu.h>
  #include <asm/msr.h>
  #include <asm/desc_defs.h>
  #include <asm/nops.h>
+ #include <asm/special_insns.h>
  
  #include <linux/personality.h>
  #include <linux/cpumask.h>
  #include <linux/math64.h>
  #include <linux/init.h>
  #include <linux/err.h>
+ #include <linux/irqflags.h>
+ /*
+  * We handle most unaligned accesses in hardware.  On the other hand
+  * unaligned DMA can be quite expensive on some Nehalem processors.
+  *
+  * Based on this we disable the IP header alignment in network drivers.
+  */
+ #define NET_IP_ALIGN  0
  
  #define HBP_NUM 4
  /*
@@@ -475,6 -484,61 +484,6 @@@ struct thread_struct 
        unsigned                io_bitmap_max;
  };
  
 -static inline unsigned long native_get_debugreg(int regno)
 -{
 -      unsigned long val = 0;  /* Damn you, gcc! */
 -
 -      switch (regno) {
 -      case 0:
 -              asm("mov %%db0, %0" :"=r" (val));
 -              break;
 -      case 1:
 -              asm("mov %%db1, %0" :"=r" (val));
 -              break;
 -      case 2:
 -              asm("mov %%db2, %0" :"=r" (val));
 -              break;
 -      case 3:
 -              asm("mov %%db3, %0" :"=r" (val));
 -              break;
 -      case 6:
 -              asm("mov %%db6, %0" :"=r" (val));
 -              break;
 -      case 7:
 -              asm("mov %%db7, %0" :"=r" (val));
 -              break;
 -      default:
 -              BUG();
 -      }
 -      return val;
 -}
 -
 -static inline void native_set_debugreg(int regno, unsigned long value)
 -{
 -      switch (regno) {
 -      case 0:
 -              asm("mov %0, %%db0"     ::"r" (value));
 -              break;
 -      case 1:
 -              asm("mov %0, %%db1"     ::"r" (value));
 -              break;
 -      case 2:
 -              asm("mov %0, %%db2"     ::"r" (value));
 -              break;
 -      case 3:
 -              asm("mov %0, %%db3"     ::"r" (value));
 -              break;
 -      case 6:
 -              asm("mov %0, %%db6"     ::"r" (value));
 -              break;
 -      case 7:
 -              asm("mov %0, %%db7"     ::"r" (value));
 -              break;
 -      default:
 -              BUG();
 -      }
 -}
 -
  /*
   * Set IOPL bits in EFLAGS from given mask
   */
@@@ -520,6 -584,14 +529,6 @@@ static inline void native_swapgs(void
  #define __cpuid                       native_cpuid
  #define paravirt_enabled()    0
  
 -/*
 - * These special macros can be used to get or set a debugging register
 - */
 -#define get_debugreg(var, register)                           \
 -      (var) = native_get_debugreg(register)
 -#define set_debugreg(value, register)                         \
 -      native_set_debugreg(register, value)
 -
  static inline void load_sp0(struct tss_struct *tss,
                            struct thread_struct *thread)
  {
@@@ -959,4 -1031,24 +968,24 @@@ extern bool cpu_has_amd_erratum(const i
  #define cpu_has_amd_erratum(x)        (false)
  #endif /* CONFIG_CPU_SUP_AMD */
  
+ #ifdef CONFIG_X86_32
+ /*
+  * disable hlt during certain critical i/o operations
+  */
+ #define HAVE_DISABLE_HLT
+ #endif
+ void disable_hlt(void);
+ void enable_hlt(void);
+ void cpu_idle_wait(void);
+ extern unsigned long arch_align_stack(unsigned long sp);
+ extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
+ void default_idle(void);
+ bool set_pm_idle_to_default(void);
+ void stop_this_cpu(void *dummy);
  #endif /* _ASM_X86_PROCESSOR_H */
@@@ -16,7 -16,6 +16,6 @@@
  #include <linux/delay.h>
  
  #include <linux/atomic.h>
- #include <asm/system.h>
  #include <asm/timer.h>
  #include <asm/hw_irq.h>
  #include <asm/pgtable.h>
@@@ -306,10 -305,10 +305,10 @@@ void __init native_init_IRQ(void
         * us. (some of these will be overridden and become
         * 'special' SMP interrupts)
         */
 -      for (i = FIRST_EXTERNAL_VECTOR; i < NR_VECTORS; i++) {
 +      i = FIRST_EXTERNAL_VECTOR;
 +      for_each_clear_bit_from(i, used_vectors, NR_VECTORS) {
                /* IA32_SYSCALL_VECTOR could be used in trap_init already. */
 -              if (!test_bit(i, used_vectors))
 -                      set_intr_gate(i, interrupt[i-FIRST_EXTERNAL_VECTOR]);
 +              set_intr_gate(i, interrupt[i - FIRST_EXTERNAL_VECTOR]);
        }
  
        if (!acpi_ioapic && !of_ioapic)
diff --combined arch/x86/kernel/kgdb.c
@@@ -46,7 -46,6 +46,6 @@@
  
  #include <asm/debugreg.h>
  #include <asm/apicdef.h>
- #include <asm/system.h>
  #include <asm/apic.h>
  #include <asm/nmi.h>
  
@@@ -67,6 -66,8 +66,6 @@@ struct dbg_reg_def_t dbg_reg_def[DBG_MA
        { "ss", 4, offsetof(struct pt_regs, ss) },
        { "ds", 4, offsetof(struct pt_regs, ds) },
        { "es", 4, offsetof(struct pt_regs, es) },
 -      { "fs", 4, -1 },
 -      { "gs", 4, -1 },
  #else
        { "ax", 8, offsetof(struct pt_regs, ax) },
        { "bx", 8, offsetof(struct pt_regs, bx) },
        { "flags", 4, offsetof(struct pt_regs, flags) },
        { "cs", 4, offsetof(struct pt_regs, cs) },
        { "ss", 4, offsetof(struct pt_regs, ss) },
 +      { "ds", 4, -1 },
 +      { "es", 4, -1 },
  #endif
 +      { "fs", 4, -1 },
 +      { "gs", 4, -1 },
  };
  
  int dbg_set_reg(int regno, void *mem, struct pt_regs *regs)
@@@ -26,7 -26,6 +26,7 @@@
  
  #include <asm/bug.h>
  #include <asm/paravirt.h>
 +#include <asm/debugreg.h>
  #include <asm/desc.h>
  #include <asm/setup.h>
  #include <asm/pgtable.h>
@@@ -38,6 -37,7 +38,7 @@@
  #include <asm/apic.h>
  #include <asm/tlbflush.h>
  #include <asm/timer.h>
+ #include <asm/special_insns.h>
  
  /* nop stub */
  void _paravirt_nop(void)
@@@ -25,9 -25,7 +25,8 @@@
  #include <linux/opp.h>
  #include <linux/cpu.h>
  #include <linux/module.h>
 +#include <linux/regulator/consumer.h>
  
- #include <asm/system.h>
  #include <asm/smp_plat.h>
  #include <asm/cpu.h>
  
@@@ -38,9 -36,6 +37,9 @@@
  
  #include <mach/hardware.h>
  
 +/* OPP tolerance in percentage */
 +#define       OPP_TOLERANCE   4
 +
  #ifdef CONFIG_SMP
  struct lpj_info {
        unsigned long   ref;
@@@ -56,7 -51,6 +55,7 @@@ static atomic_t freq_table_users = ATOM
  static struct clk *mpu_clk;
  static char *mpu_clk_name;
  static struct device *mpu_dev;
 +static struct regulator *mpu_reg;
  
  static int omap_verify_speed(struct cpufreq_policy *policy)
  {
@@@ -81,10 -75,8 +80,10 @@@ static int omap_target(struct cpufreq_p
                       unsigned int relation)
  {
        unsigned int i;
 -      int ret = 0;
 +      int r, ret = 0;
        struct cpufreq_freqs freqs;
 +      struct opp *opp;
 +      unsigned long freq, volt = 0, volt_old = 0, tol = 0;
  
        if (!freq_table) {
                dev_err(mpu_dev, "%s: cpu%d: no freq table!\n", __func__,
                cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
        }
  
 -#ifdef CONFIG_CPU_FREQ_DEBUG
 -      pr_info("cpufreq-omap: transition: %u --> %u\n", freqs.old, freqs.new);
 -#endif
 +      freq = freqs.new * 1000;
 +
 +      if (mpu_reg) {
 +              opp = opp_find_freq_ceil(mpu_dev, &freq);
 +              if (IS_ERR(opp)) {
 +                      dev_err(mpu_dev, "%s: unable to find MPU OPP for %d\n",
 +                              __func__, freqs.new);
 +                      return -EINVAL;
 +              }
 +              volt = opp_get_voltage(opp);
 +              tol = volt * OPP_TOLERANCE / 100;
 +              volt_old = regulator_get_voltage(mpu_reg);
 +      }
 +
 +      dev_dbg(mpu_dev, "cpufreq-omap: %u MHz, %ld mV --> %u MHz, %ld mV\n", 
 +              freqs.old / 1000, volt_old ? volt_old / 1000 : -1,
 +              freqs.new / 1000, volt ? volt / 1000 : -1);
 +
 +      /* scaling up?  scale voltage before frequency */
 +      if (mpu_reg && (freqs.new > freqs.old)) {
 +              r = regulator_set_voltage(mpu_reg, volt - tol, volt + tol);
 +              if (r < 0) {
 +                      dev_warn(mpu_dev, "%s: unable to scale voltage up.\n",
 +                               __func__);
 +                      freqs.new = freqs.old;
 +                      goto done;
 +              }
 +      }
  
        ret = clk_set_rate(mpu_clk, freqs.new * 1000);
 -      freqs.new = omap_getspeed(policy->cpu);
  
 +      /* scaling down?  scale voltage after frequency */
 +      if (mpu_reg && (freqs.new < freqs.old)) {
 +              r = regulator_set_voltage(mpu_reg, volt - tol, volt + tol);
 +              if (r < 0) {
 +                      dev_warn(mpu_dev, "%s: unable to scale voltage down.\n",
 +                               __func__);
 +                      ret = clk_set_rate(mpu_clk, freqs.old * 1000);
 +                      freqs.new = freqs.old;
 +                      goto done;
 +              }
 +      }
 +
 +      freqs.new = omap_getspeed(policy->cpu);
  #ifdef CONFIG_SMP
        /*
         * Note that loops_per_jiffy is not updated on SMP systems in
                                        freqs.new);
  #endif
  
 +done:
        /* notifiers */
        for_each_cpu(i, policy->cpus) {
                freqs.cpu = i;
@@@ -305,23 -259,6 +304,23 @@@ static int __init omap_cpufreq_init(voi
                return -EINVAL;
        }
  
 +      mpu_reg = regulator_get(mpu_dev, "vcc");
 +      if (IS_ERR(mpu_reg)) {
 +              pr_warning("%s: unable to get MPU regulator\n", __func__);
 +              mpu_reg = NULL;
 +      } else {
 +              /* 
 +               * Ensure physical regulator is present.
 +               * (e.g. could be dummy regulator.)
 +               */
 +              if (regulator_get_voltage(mpu_reg) < 0) {
 +                      pr_warn("%s: physical regulator not present for MPU\n",
 +                              __func__);
 +                      regulator_put(mpu_reg);
 +                      mpu_reg = NULL;
 +              }
 +      }
 +
        return cpufreq_register_driver(&omap_driver);
  }
  
  #include <linux/io.h>
  #include <linux/slab.h>
  
 -#include <asm/irq.h>
  #include <mach/hardware.h>
  #include <asm/hardware/iomd.h>
- #include <asm/system.h>
  
  MODULE_AUTHOR("Vojtech Pavlik, Russell King");
  MODULE_DESCRIPTION("Acorn RiscPC PS/2 keyboard controller driver");
  MODULE_LICENSE("GPL");
  MODULE_ALIAS("platform:kart");
  
 +struct rpckbd_data {
 +      int tx_irq;
 +      int rx_irq;
 +};
 +
  static int rpckbd_write(struct serio *port, unsigned char val)
  {
        while (!(iomd_readb(IOMD_KCTRL) & (1 << 7)))
@@@ -82,21 -77,19 +81,21 @@@ static irqreturn_t rpckbd_tx(int irq, v
  
  static int rpckbd_open(struct serio *port)
  {
 +      struct rpckbd_data *rpckbd = port->port_data;
 +
        /* Reset the keyboard state machine. */
        iomd_writeb(0, IOMD_KCTRL);
        iomd_writeb(8, IOMD_KCTRL);
        iomd_readb(IOMD_KARTRX);
  
 -      if (request_irq(IRQ_KEYBOARDRX, rpckbd_rx, 0, "rpckbd", port) != 0) {
 +      if (request_irq(rpckbd->rx_irq, rpckbd_rx, 0, "rpckbd", port) != 0) {
                printk(KERN_ERR "rpckbd.c: Could not allocate keyboard receive IRQ\n");
                return -EBUSY;
        }
  
 -      if (request_irq(IRQ_KEYBOARDTX, rpckbd_tx, 0, "rpckbd", port) != 0) {
 +      if (request_irq(rpckbd->tx_irq, rpckbd_tx, 0, "rpckbd", port) != 0) {
                printk(KERN_ERR "rpckbd.c: Could not allocate keyboard transmit IRQ\n");
 -              free_irq(IRQ_KEYBOARDRX, port);
 +              free_irq(rpckbd->rx_irq, port);
                return -EBUSY;
        }
  
  
  static void rpckbd_close(struct serio *port)
  {
 -      free_irq(IRQ_KEYBOARDRX, port);
 -      free_irq(IRQ_KEYBOARDTX, port);
 +      struct rpckbd_data *rpckbd = port->port_data;
 +
 +      free_irq(rpckbd->rx_irq, port);
 +      free_irq(rpckbd->tx_irq, port);
  }
  
  /*
   */
  static int __devinit rpckbd_probe(struct platform_device *dev)
  {
 +      struct rpckbd_data *rpckbd;
        struct serio *serio;
 +      int tx_irq, rx_irq;
 +
 +      rx_irq = platform_get_irq(dev, 0);
 +      if (rx_irq <= 0)
 +              return rx_irq < 0 ? rx_irq : -ENXIO;
 +
 +      tx_irq = platform_get_irq(dev, 1);
 +      if (tx_irq <= 0)
 +              return tx_irq < 0 ? tx_irq : -ENXIO;
  
        serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
 -      if (!serio)
 +      rpckbd = kzalloc(sizeof(*rpckbd), GFP_KERNEL);
 +      if (!serio || !rpckbd) {
 +              kfree(rpckbd);
 +              kfree(serio);
                return -ENOMEM;
 +      }
 +
 +      rpckbd->rx_irq = rx_irq;
 +      rpckbd->tx_irq = tx_irq;
  
        serio->id.type          = SERIO_8042;
        serio->write            = rpckbd_write;
        serio->open             = rpckbd_open;
        serio->close            = rpckbd_close;
        serio->dev.parent       = &dev->dev;
 +      serio->port_data        = rpckbd;
        strlcpy(serio->name, "RiscPC PS/2 kbd port", sizeof(serio->name));
        strlcpy(serio->phys, "rpckbd/serio0", sizeof(serio->phys));
  
  static int __devexit rpckbd_remove(struct platform_device *dev)
  {
        struct serio *serio = platform_get_drvdata(dev);
 +      struct rpckbd_data *rpckbd = serio->port_data;
 +
        serio_unregister_port(serio);
 +      kfree(rpckbd);
 +
        return 0;
  }
  
  #include <linux/spinlock.h>
  
  #include <asm/io.h>
  
  #include <asm/hardware/sa1111.h>
  
 +#define PS2CR         0x0000
 +#define PS2STAT               0x0004
 +#define PS2DATA               0x0008
 +#define PS2CLKDIV     0x000c
 +#define PS2PRECNT     0x0010
 +
 +#define PS2CR_ENA     0x08
 +#define PS2CR_FKD     0x02
 +#define PS2CR_FKC     0x01
 +
 +#define PS2STAT_STP   0x0100
 +#define PS2STAT_TXE   0x0080
 +#define PS2STAT_TXB   0x0040
 +#define PS2STAT_RXF   0x0020
 +#define PS2STAT_RXB   0x0010
 +#define PS2STAT_ENA   0x0008
 +#define PS2STAT_RXP   0x0004
 +#define PS2STAT_KBD   0x0002
 +#define PS2STAT_KBC   0x0001
 +
  struct ps2if {
        struct serio            *io;
        struct sa1111_dev       *dev;
@@@ -65,22 -44,22 +64,22 @@@ static irqreturn_t ps2_rxint(int irq, v
        struct ps2if *ps2if = dev_id;
        unsigned int scancode, flag, status;
  
 -      status = sa1111_readl(ps2if->base + SA1111_PS2STAT);
 +      status = sa1111_readl(ps2if->base + PS2STAT);
        while (status & PS2STAT_RXF) {
                if (status & PS2STAT_STP)
 -                      sa1111_writel(PS2STAT_STP, ps2if->base + SA1111_PS2STAT);
 +                      sa1111_writel(PS2STAT_STP, ps2if->base + PS2STAT);
  
                flag = (status & PS2STAT_STP ? SERIO_FRAME : 0) |
                       (status & PS2STAT_RXP ? 0 : SERIO_PARITY);
  
 -              scancode = sa1111_readl(ps2if->base + SA1111_PS2DATA) & 0xff;
 +              scancode = sa1111_readl(ps2if->base + PS2DATA) & 0xff;
  
                if (hweight8(scancode) & 1)
                        flag ^= SERIO_PARITY;
  
                serio_interrupt(ps2if->io, scancode, flag);
  
 -              status = sa1111_readl(ps2if->base + SA1111_PS2STAT);
 +              status = sa1111_readl(ps2if->base + PS2STAT);
          }
  
          return IRQ_HANDLED;
@@@ -95,12 -74,12 +94,12 @@@ static irqreturn_t ps2_txint(int irq, v
        unsigned int status;
  
        spin_lock(&ps2if->lock);
 -      status = sa1111_readl(ps2if->base + SA1111_PS2STAT);
 +      status = sa1111_readl(ps2if->base + PS2STAT);
        if (ps2if->head == ps2if->tail) {
                disable_irq_nosync(irq);
                /* done */
        } else if (status & PS2STAT_TXE) {
 -              sa1111_writel(ps2if->buf[ps2if->tail], ps2if->base + SA1111_PS2DATA);
 +              sa1111_writel(ps2if->buf[ps2if->tail], ps2if->base + PS2DATA);
                ps2if->tail = (ps2if->tail + 1) & (sizeof(ps2if->buf) - 1);
        }
        spin_unlock(&ps2if->lock);
@@@ -123,8 -102,8 +122,8 @@@ static int ps2_write(struct serio *io, 
        /*
         * If the TX register is empty, we can go straight out.
         */
 -      if (sa1111_readl(ps2if->base + SA1111_PS2STAT) & PS2STAT_TXE) {
 -              sa1111_writel(val, ps2if->base + SA1111_PS2DATA);
 +      if (sa1111_readl(ps2if->base + PS2STAT) & PS2STAT_TXE) {
 +              sa1111_writel(val, ps2if->base + PS2DATA);
        } else {
                if (ps2if->head == ps2if->tail)
                        enable_irq(ps2if->dev->irq[1]);
@@@ -144,16 -123,13 +143,16 @@@ static int ps2_open(struct serio *io
        struct ps2if *ps2if = io->port_data;
        int ret;
  
 -      sa1111_enable_device(ps2if->dev);
 +      ret = sa1111_enable_device(ps2if->dev);
 +      if (ret)
 +              return ret;
  
        ret = request_irq(ps2if->dev->irq[0], ps2_rxint, 0,
                          SA1111_DRIVER_NAME(ps2if->dev), ps2if);
        if (ret) {
                printk(KERN_ERR "sa1111ps2: could not allocate IRQ%d: %d\n",
                        ps2if->dev->irq[0], ret);
 +              sa1111_disable_device(ps2if->dev);
                return ret;
        }
  
                printk(KERN_ERR "sa1111ps2: could not allocate IRQ%d: %d\n",
                        ps2if->dev->irq[1], ret);
                free_irq(ps2if->dev->irq[0], ps2if);
 +              sa1111_disable_device(ps2if->dev);
                return ret;
        }
  
  
        enable_irq_wake(ps2if->dev->irq[0]);
  
 -      sa1111_writel(PS2CR_ENA, ps2if->base + SA1111_PS2CR);
 +      sa1111_writel(PS2CR_ENA, ps2if->base + PS2CR);
        return 0;
  }
  
@@@ -179,7 -154,7 +178,7 @@@ static void ps2_close(struct serio *io
  {
        struct ps2if *ps2if = io->port_data;
  
 -      sa1111_writel(0, ps2if->base + SA1111_PS2CR);
 +      sa1111_writel(0, ps2if->base + PS2CR);
  
        disable_irq_wake(ps2if->dev->irq[0]);
  
@@@ -199,7 -174,7 +198,7 @@@ static void __devinit ps2_clear_input(s
        int maxread = 100;
  
        while (maxread--) {
 -              if ((sa1111_readl(ps2if->base + SA1111_PS2DATA) & 0xff) == 0xff)
 +              if ((sa1111_readl(ps2if->base + PS2DATA) & 0xff) == 0xff)
                        break;
        }
  }
@@@ -209,11 -184,11 +208,11 @@@ static unsigned int __devinit ps2_test_
  {
        unsigned int val;
  
 -      sa1111_writel(PS2CR_ENA | mask, ps2if->base + SA1111_PS2CR);
 +      sa1111_writel(PS2CR_ENA | mask, ps2if->base + PS2CR);
  
        udelay(2);
  
 -      val = sa1111_readl(ps2if->base + SA1111_PS2STAT);
 +      val = sa1111_readl(ps2if->base + PS2STAT);
        return val & (PS2STAT_KBC | PS2STAT_KBD);
  }
  
@@@ -244,7 -219,7 +243,7 @@@ static int __devinit ps2_test(struct ps
                ret = -ENODEV;
        }
  
 -      sa1111_writel(0, ps2if->base + SA1111_PS2CR);
 +      sa1111_writel(0, ps2if->base + PS2CR);
  
        return ret;
  }
@@@ -298,8 -273,8 +297,8 @@@ static int __devinit ps2_probe(struct s
        sa1111_enable_device(ps2if->dev);
  
        /* Incoming clock is 8MHz */
 -      sa1111_writel(0, ps2if->base + SA1111_PS2CLKDIV);
 -      sa1111_writel(127, ps2if->base + SA1111_PS2PRECNT);
 +      sa1111_writel(0, ps2if->base + PS2CLKDIV);
 +      sa1111_writel(127, ps2if->base + PS2PRECNT);
  
        /*
         * Flush any pending input.
@@@ -354,7 -329,6 +353,7 @@@ static int __devexit ps2_remove(struct 
  static struct sa1111_driver ps2_driver = {
        .drv = {
                .name   = "sa1111-ps2",
 +              .owner  = THIS_MODULE,
        },
        .devid          = SA1111_DEVID_PS2,
        .probe          = ps2_probe,
@@@ -40,7 -40,6 +40,6 @@@
  #include <linux/string.h>
  #include <linux/types.h>
  #include <linux/uaccess.h>
- #include <asm/system.h>
  
  #include <media/media-devnode.h>
  
@@@ -312,7 -311,7 +311,7 @@@ static void __exit media_devnode_exit(v
        unregister_chrdev_region(media_dev_t, MEDIA_NUM_DEVICES);
  }
  
 -module_init(media_devnode_init)
 +subsys_initcall(media_devnode_init);
  module_exit(media_devnode_exit)
  
  MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>");
@@@ -54,7 -54,6 +54,6 @@@
  #include <linux/mutex.h>
  #include <linux/slab.h>
  #include <asm/uaccess.h>
- #include <asm/system.h>
  #include <asm/byteorder.h>
  
  #include <linux/dvb/video.h>
@@@ -331,7 -330,6 +330,7 @@@ struct ivtv_stream 
        struct ivtv *itv;               /* for ease of use */
        const char *name;               /* name of the stream */
        int type;                       /* stream type */
 +      u32 caps;                       /* V4L2 capabilities */
  
        struct v4l2_fh *fh;             /* pointer to the streaming filehandle */
        spinlock_t qlock;               /* locks access to the queues */
@@@ -631,16 -629,6 +630,16 @@@ struct ivtv 
  
        struct v4l2_device v4l2_dev;
        struct cx2341x_handler cxhdl;
 +      struct {
 +              /* PTS/Frame count control cluster */
 +              struct v4l2_ctrl *ctrl_pts;
 +              struct v4l2_ctrl *ctrl_frame;
 +      };
 +      struct {
 +              /* Audio Playback control cluster */
 +              struct v4l2_ctrl *ctrl_audio_playback;
 +              struct v4l2_ctrl *ctrl_audio_multilingual_playback;
 +      };
        struct v4l2_ctrl_handler hdl_gpio;
        struct v4l2_subdev sd_gpio;     /* GPIO sub-device */
        u16 instance;
        u8 audio_stereo_mode;           /* decoder setting how to handle stereo MPEG audio */
        u8 audio_bilingual_mode;        /* decoder setting how to handle bilingual MPEG audio */
  
 -
        /* Locking */
        spinlock_t lock;                /* lock access to this struct */
        struct mutex serialize_lock;    /* mutex used to serialize open/close/start/stop/ioctl operations */
@@@ -26,7 -26,6 +26,6 @@@
  #include <linux/kmod.h>
  #include <linux/slab.h>
  #include <asm/uaccess.h>
- #include <asm/system.h>
  
  #include <media/v4l2-common.h>
  #include <media/v4l2-device.h>
@@@ -788,7 -787,7 +787,7 @@@ static void __exit videodev_exit(void
        unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
  }
  
 -module_init(videodev_init)
 +subsys_initcall(videodev_init);
  module_exit(videodev_exit)
  
  MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>");
diff --combined drivers/mfd/mcp-core.c
@@@ -19,8 -19,8 +19,6 @@@
  #include <linux/string.h>
  #include <linux/mfd/mcp.h>
  
- #include <asm/system.h>
 -#include <mach/dma.h>
 -
  
  #define to_mcp(d)             container_of(d, struct mcp, attached_device)
  #define to_mcp_driver(d)      container_of(d, struct mcp_driver, drv)
@@@ -47,11 -47,39 +45,11 @@@ static int mcp_bus_remove(struct devic
        return 0;
  }
  
 -static int mcp_bus_suspend(struct device *dev, pm_message_t state)
 -{
 -      struct mcp *mcp = to_mcp(dev);
 -      int ret = 0;
 -
 -      if (dev->driver) {
 -              struct mcp_driver *drv = to_mcp_driver(dev->driver);
 -
 -              ret = drv->suspend(mcp, state);
 -      }
 -      return ret;
 -}
 -
 -static int mcp_bus_resume(struct device *dev)
 -{
 -      struct mcp *mcp = to_mcp(dev);
 -      int ret = 0;
 -
 -      if (dev->driver) {
 -              struct mcp_driver *drv = to_mcp_driver(dev->driver);
 -
 -              ret = drv->resume(mcp);
 -      }
 -      return ret;
 -}
 -
  static struct bus_type mcp_bus_type = {
        .name           = "mcp",
        .match          = mcp_bus_match,
        .probe          = mcp_bus_probe,
        .remove         = mcp_bus_remove,
 -      .suspend        = mcp_bus_suspend,
 -      .resume         = mcp_bus_resume,
  };
  
  /**
@@@ -179,7 -207,6 +177,7 @@@ struct mcp *mcp_host_alloc(struct devic
        mcp = kzalloc(sizeof(struct mcp) + size, GFP_KERNEL);
        if (mcp) {
                spin_lock_init(&mcp->lock);
 +              device_initialize(&mcp->attached_device);
                mcp->attached_device.parent = parent;
                mcp->attached_device.bus = &mcp_bus_type;
                mcp->attached_device.dma_mask = parent->dma_mask;
  }
  EXPORT_SYMBOL(mcp_host_alloc);
  
 -int mcp_host_register(struct mcp *mcp)
 +int mcp_host_add(struct mcp *mcp, void *pdata)
  {
 +      mcp->attached_device.platform_data = pdata;
        dev_set_name(&mcp->attached_device, "mcp0");
 -      return device_register(&mcp->attached_device);
 +      return device_add(&mcp->attached_device);
 +}
 +EXPORT_SYMBOL(mcp_host_add);
 +
 +void mcp_host_del(struct mcp *mcp)
 +{
 +      device_del(&mcp->attached_device);
  }
 -EXPORT_SYMBOL(mcp_host_register);
 +EXPORT_SYMBOL(mcp_host_del);
  
 -void mcp_host_unregister(struct mcp *mcp)
 +void mcp_host_free(struct mcp *mcp)
  {
 -      device_unregister(&mcp->attached_device);
 +      put_device(&mcp->attached_device);
  }
 -EXPORT_SYMBOL(mcp_host_unregister);
 +EXPORT_SYMBOL(mcp_host_free);
  
  int mcp_driver_register(struct mcp_driver *mcpdrv)
  {
diff --combined drivers/mfd/mcp-sa11x0.c
   */
  #include <linux/module.h>
  #include <linux/init.h>
 +#include <linux/io.h>
  #include <linux/errno.h>
  #include <linux/kernel.h>
  #include <linux/delay.h>
  #include <linux/spinlock.h>
  #include <linux/platform_device.h>
 +#include <linux/pm.h>
  #include <linux/mfd/mcp.h>
  
 -#include <mach/dma.h>
  #include <mach/hardware.h>
  #include <asm/mach-types.h>
- #include <asm/system.h>
  #include <mach/mcp.h>
  
 -#include <mach/assabet.h>
 -
 +#define DRIVER_NAME "sa11x0-mcp"
  
  struct mcp_sa11x0 {
 -      u32     mccr0;
 -      u32     mccr1;
 +      void __iomem    *base0;
 +      void __iomem    *base1;
 +      u32             mccr0;
 +      u32             mccr1;
  };
  
 +/* Register offsets */
 +#define MCCR0(m)      ((m)->base0 + 0x00)
 +#define MCDR0(m)      ((m)->base0 + 0x08)
 +#define MCDR1(m)      ((m)->base0 + 0x0c)
 +#define MCDR2(m)      ((m)->base0 + 0x10)
 +#define MCSR(m)               ((m)->base0 + 0x18)
 +#define MCCR1(m)      ((m)->base1 + 0x00)
 +
  #define priv(mcp)     ((struct mcp_sa11x0 *)mcp_priv(mcp))
  
  static void
  mcp_sa11x0_set_telecom_divisor(struct mcp *mcp, unsigned int divisor)
  {
 -      unsigned int mccr0;
 +      struct mcp_sa11x0 *m = priv(mcp);
  
        divisor /= 32;
  
 -      mccr0 = Ser4MCCR0 & ~0x00007f00;
 -      mccr0 |= divisor << 8;
 -      Ser4MCCR0 = mccr0;
 +      m->mccr0 &= ~0x00007f00;
 +      m->mccr0 |= divisor << 8;
 +      writel_relaxed(m->mccr0, MCCR0(m));
  }
  
  static void
  mcp_sa11x0_set_audio_divisor(struct mcp *mcp, unsigned int divisor)
  {
 -      unsigned int mccr0;
 +      struct mcp_sa11x0 *m = priv(mcp);
  
        divisor /= 32;
  
 -      mccr0 = Ser4MCCR0 & ~0x0000007f;
 -      mccr0 |= divisor;
 -      Ser4MCCR0 = mccr0;
 +      m->mccr0 &= ~0x0000007f;
 +      m->mccr0 |= divisor;
 +      writel_relaxed(m->mccr0, MCCR0(m));
  }
  
  /*
  static void
  mcp_sa11x0_write(struct mcp *mcp, unsigned int reg, unsigned int val)
  {
 +      struct mcp_sa11x0 *m = priv(mcp);
        int ret = -ETIME;
        int i;
  
 -      Ser4MCDR2 = reg << 17 | MCDR2_Wr | (val & 0xffff);
 +      writel_relaxed(reg << 17 | MCDR2_Wr | (val & 0xffff), MCDR2(m));
  
        for (i = 0; i < 2; i++) {
                udelay(mcp->rw_timeout);
 -              if (Ser4MCSR & MCSR_CWC) {
 +              if (readl_relaxed(MCSR(m)) & MCSR_CWC) {
                        ret = 0;
                        break;
                }
  static unsigned int
  mcp_sa11x0_read(struct mcp *mcp, unsigned int reg)
  {
 +      struct mcp_sa11x0 *m = priv(mcp);
        int ret = -ETIME;
        int i;
  
 -      Ser4MCDR2 = reg << 17 | MCDR2_Rd;
 +      writel_relaxed(reg << 17 | MCDR2_Rd, MCDR2(m));
  
        for (i = 0; i < 2; i++) {
                udelay(mcp->rw_timeout);
 -              if (Ser4MCSR & MCSR_CRC) {
 -                      ret = Ser4MCDR2 & 0xffff;
 +              if (readl_relaxed(MCSR(m)) & MCSR_CRC) {
 +                      ret = readl_relaxed(MCDR2(m)) & 0xffff;
                        break;
                }
        }
  
  static void mcp_sa11x0_enable(struct mcp *mcp)
  {
 -      Ser4MCSR = -1;
 -      Ser4MCCR0 |= MCCR0_MCE;
 +      struct mcp_sa11x0 *m = priv(mcp);
 +
 +      writel(-1, MCSR(m));
 +      m->mccr0 |= MCCR0_MCE;
 +      writel_relaxed(m->mccr0, MCCR0(m));
  }
  
  static void mcp_sa11x0_disable(struct mcp *mcp)
  {
 -      Ser4MCCR0 &= ~MCCR0_MCE;
 +      struct mcp_sa11x0 *m = priv(mcp);
 +
 +      m->mccr0 &= ~MCCR0_MCE;
 +      writel_relaxed(m->mccr0, MCCR0(m));
  }
  
  /*
@@@ -155,64 -136,55 +154,64 @@@ static struct mcp_ops mcp_sa11x0 = 
        .disable                = mcp_sa11x0_disable,
  };
  
 -static int mcp_sa11x0_probe(struct platform_device *pdev)
 +static int mcp_sa11x0_probe(struct platform_device *dev)
  {
 -      struct mcp_plat_data *data = pdev->dev.platform_data;
 +      struct mcp_plat_data *data = dev->dev.platform_data;
 +      struct resource *mem0, *mem1;
 +      struct mcp_sa11x0 *m;
        struct mcp *mcp;
        int ret;
  
        if (!data)
                return -ENODEV;
  
 -      if (!request_mem_region(0x80060000, 0x60, "sa11x0-mcp"))
 -              return -EBUSY;
 +      mem0 = platform_get_resource(dev, IORESOURCE_MEM, 0);
 +      mem1 = platform_get_resource(dev, IORESOURCE_MEM, 1);
 +      if (!mem0 || !mem1)
 +              return -ENXIO;
 +
 +      if (!request_mem_region(mem0->start, resource_size(mem0),
 +                              DRIVER_NAME)) {
 +              ret = -EBUSY;
 +              goto err_mem0;
 +      }
  
 -      mcp = mcp_host_alloc(&pdev->dev, sizeof(struct mcp_sa11x0));
 +      if (!request_mem_region(mem1->start, resource_size(mem1),
 +                              DRIVER_NAME)) {
 +              ret = -EBUSY;
 +              goto err_mem1;
 +      }
 +
 +      mcp = mcp_host_alloc(&dev->dev, sizeof(struct mcp_sa11x0));
        if (!mcp) {
                ret = -ENOMEM;
 -              goto release;
 +              goto err_alloc;
        }
  
        mcp->owner              = THIS_MODULE;
        mcp->ops                = &mcp_sa11x0;
        mcp->sclk_rate          = data->sclk_rate;
 -      mcp->dma_audio_rd       = DMA_Ser4MCP0Rd;
 -      mcp->dma_audio_wr       = DMA_Ser4MCP0Wr;
 -      mcp->dma_telco_rd       = DMA_Ser4MCP1Rd;
 -      mcp->dma_telco_wr       = DMA_Ser4MCP1Wr;
 -      mcp->gpio_base          = data->gpio_base;
  
 -      platform_set_drvdata(pdev, mcp);
 +      m = priv(mcp);
 +      m->mccr0 = data->mccr0 | 0x7f7f;
 +      m->mccr1 = data->mccr1;
  
 -      if (machine_is_assabet()) {
 -              ASSABET_BCR_set(ASSABET_BCR_CODEC_RST);
 +      m->base0 = ioremap(mem0->start, resource_size(mem0));
 +      m->base1 = ioremap(mem1->start, resource_size(mem1));
 +      if (!m->base0 || !m->base1) {
 +              ret = -ENOMEM;
 +              goto err_ioremap;
        }
  
 -      /*
 -       * Setup the PPC unit correctly.
 -       */
 -      PPDR &= ~PPC_RXD4;
 -      PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
 -      PSDR |= PPC_RXD4;
 -      PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
 -      PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
 +      platform_set_drvdata(dev, mcp);
  
        /*
         * Initialise device.  Note that we initially
         * set the sampling rate to minimum.
         */
 -      Ser4MCSR = -1;
 -      Ser4MCCR1 = data->mccr1;
 -      Ser4MCCR0 = data->mccr0 | 0x7f7f;
 +      writel_relaxed(-1, MCSR(m));
 +      writel_relaxed(m->mccr1, MCCR1(m));
 +      writel_relaxed(m->mccr0, MCCR0(m));
  
        /*
         * Calculate the read/write timeout (us) from the bit clock
        mcp->rw_timeout = (64 * 3 * 1000000 + mcp->sclk_rate - 1) /
                          mcp->sclk_rate;
  
 -      ret = mcp_host_register(mcp);
 +      ret = mcp_host_add(mcp, data->codec_pdata);
        if (ret == 0)
 -              goto out;
 +              return 0;
  
 - release:
 -      release_mem_region(0x80060000, 0x60);
 -      platform_set_drvdata(pdev, NULL);
 +      platform_set_drvdata(dev, NULL);
  
 - out:
 + err_ioremap:
 +      iounmap(m->base1);
 +      iounmap(m->base0);
 +      mcp_host_free(mcp);
 + err_alloc:
 +      release_mem_region(mem1->start, resource_size(mem1));
 + err_mem1:
 +      release_mem_region(mem0->start, resource_size(mem0));
 + err_mem0:
        return ret;
  }
  
  static int mcp_sa11x0_remove(struct platform_device *dev)
  {
        struct mcp *mcp = platform_get_drvdata(dev);
 +      struct mcp_sa11x0 *m = priv(mcp);
 +      struct resource *mem0, *mem1;
 +
 +      if (m->mccr0 & MCCR0_MCE)
 +              dev_warn(&dev->dev,
 +                       "device left active (missing disable call?)\n");
 +
 +      mem0 = platform_get_resource(dev, IORESOURCE_MEM, 0);
 +      mem1 = platform_get_resource(dev, IORESOURCE_MEM, 1);
  
        platform_set_drvdata(dev, NULL);
 -      mcp_host_unregister(mcp);
 -      release_mem_region(0x80060000, 0x60);
 +      mcp_host_del(mcp);
 +      iounmap(m->base1);
 +      iounmap(m->base0);
 +      mcp_host_free(mcp);
 +      release_mem_region(mem1->start, resource_size(mem1));
 +      release_mem_region(mem0->start, resource_size(mem0));
  
        return 0;
  }
  
 -static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state)
 +#ifdef CONFIG_PM_SLEEP
 +static int mcp_sa11x0_suspend(struct device *dev)
  {
 -      struct mcp *mcp = platform_get_drvdata(dev);
 +      struct mcp_sa11x0 *m = priv(dev_get_drvdata(dev));
 +
 +      if (m->mccr0 & MCCR0_MCE)
 +              dev_warn(dev, "device left active (missing disable call?)\n");
  
 -      priv(mcp)->mccr0 = Ser4MCCR0;
 -      priv(mcp)->mccr1 = Ser4MCCR1;
 -      Ser4MCCR0 &= ~MCCR0_MCE;
 +      writel(m->mccr0 & ~MCCR0_MCE, MCCR0(m));
  
        return 0;
  }
  
 -static int mcp_sa11x0_resume(struct platform_device *dev)
 +static int mcp_sa11x0_resume(struct device *dev)
  {
 -      struct mcp *mcp = platform_get_drvdata(dev);
 +      struct mcp_sa11x0 *m = priv(dev_get_drvdata(dev));
  
 -      Ser4MCCR1 = priv(mcp)->mccr1;
 -      Ser4MCCR0 = priv(mcp)->mccr0;
 +      writel_relaxed(m->mccr1, MCCR1(m));
 +      writel_relaxed(m->mccr0, MCCR0(m));
  
        return 0;
  }
 -
 -/*
 - * The driver for the SA11x0 MCP port.
 - */
 -MODULE_ALIAS("platform:sa11x0-mcp");
 +#endif
 +
 +static const struct dev_pm_ops mcp_sa11x0_pm_ops = {
 +#ifdef CONFIG_PM_SLEEP
 +      .suspend = mcp_sa11x0_suspend,
 +      .freeze = mcp_sa11x0_suspend,
 +      .poweroff = mcp_sa11x0_suspend,
 +      .resume_noirq = mcp_sa11x0_resume,
 +      .thaw_noirq = mcp_sa11x0_resume,
 +      .restore_noirq = mcp_sa11x0_resume,
 +#endif
 +};
  
  static struct platform_driver mcp_sa11x0_driver = {
        .probe          = mcp_sa11x0_probe,
        .remove         = mcp_sa11x0_remove,
 -      .suspend        = mcp_sa11x0_suspend,
 -      .resume         = mcp_sa11x0_resume,
        .driver         = {
 -              .name   = "sa11x0-mcp",
 +              .name   = DRIVER_NAME,
 +              .owner  = THIS_MODULE,
 +              .pm     = &mcp_sa11x0_pm_ops,
        },
  };
  
   */
  module_platform_driver(mcp_sa11x0_driver);
  
 +MODULE_ALIAS("platform:" DRIVER_NAME);
  MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
  MODULE_DESCRIPTION("SA11x0 multimedia communications port driver");
  MODULE_LICENSE("GPL");
@@@ -54,7 -54,6 +54,6 @@@
  #include <linux/inet.h>
  #include <linux/bitops.h>
  #include <linux/io.h>
- #include <asm/system.h>
  #include <asm/dma.h>
  #include <linux/uaccess.h>
  #include <linux/errno.h>
@@@ -2573,16 -2572,12 +2572,16 @@@ re_arm
  static int bond_has_this_ip(struct bonding *bond, __be32 ip)
  {
        struct vlan_entry *vlan;
 +      struct net_device *vlan_dev;
  
 -      if (ip == bond->master_ip)
 +      if (ip == bond_confirm_addr(bond->dev, 0, ip))
                return 1;
  
        list_for_each_entry(vlan, &bond->vlan_list, vlan_list) {
 -              if (ip == vlan->vlan_ip)
 +              rcu_read_lock();
 +              vlan_dev = __vlan_find_dev_deep(bond->dev, vlan->vlan_id);
 +              rcu_read_unlock();
 +              if (vlan_dev && ip == bond_confirm_addr(vlan_dev, 0, ip))
                        return 1;
        }
  
@@@ -2624,19 -2619,17 +2623,19 @@@ static void bond_arp_send_all(struct bo
        int i, vlan_id;
        __be32 *targets = bond->params.arp_targets;
        struct vlan_entry *vlan;
 -      struct net_device *vlan_dev;
 +      struct net_device *vlan_dev = NULL;
        struct rtable *rt;
  
        for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
 +              __be32 addr;
                if (!targets[i])
                        break;
                pr_debug("basa: target %x\n", targets[i]);
                if (!bond_vlan_used(bond)) {
                        pr_debug("basa: empty vlan: arp_send\n");
 +                      addr = bond_confirm_addr(bond->dev, targets[i], 0);
                        bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i],
 -                                    bond->master_ip, 0);
 +                                    addr, 0);
                        continue;
                }
  
                if (rt->dst.dev == bond->dev) {
                        ip_rt_put(rt);
                        pr_debug("basa: rtdev == bond->dev: arp_send\n");
 +                      addr = bond_confirm_addr(bond->dev, targets[i], 0);
                        bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i],
 -                                    bond->master_ip, 0);
 +                                    addr, 0);
                        continue;
                }
  
                        }
                }
  
 -              if (vlan_id) {
 +              if (vlan_id && vlan_dev) {
                        ip_rt_put(rt);
 +                      addr = bond_confirm_addr(vlan_dev, targets[i], 0);
                        bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i],
 -                                    vlan->vlan_ip, vlan_id);
 +                                    addr, vlan_id);
                        continue;
                }
  
@@@ -3307,10 -3298,68 +3306,10 @@@ static int bond_netdev_event(struct not
        return NOTIFY_DONE;
  }
  
 -/*
 - * bond_inetaddr_event: handle inetaddr notifier chain events.
 - *
 - * We keep track of device IPs primarily to use as source addresses in
 - * ARP monitor probes (rather than spewing out broadcasts all the time).
 - *
 - * We track one IP for the main device (if it has one), plus one per VLAN.
 - */
 -static int bond_inetaddr_event(struct notifier_block *this, unsigned long event, void *ptr)
 -{
 -      struct in_ifaddr *ifa = ptr;
 -      struct net_device *vlan_dev, *event_dev = ifa->ifa_dev->dev;
 -      struct bond_net *bn = net_generic(dev_net(event_dev), bond_net_id);
 -      struct bonding *bond;
 -      struct vlan_entry *vlan;
 -
 -      /* we only care about primary address */
 -      if(ifa->ifa_flags & IFA_F_SECONDARY)
 -              return NOTIFY_DONE;
 -
 -      list_for_each_entry(bond, &bn->dev_list, bond_list) {
 -              if (bond->dev == event_dev) {
 -                      switch (event) {
 -                      case NETDEV_UP:
 -                              bond->master_ip = ifa->ifa_local;
 -                              return NOTIFY_OK;
 -                      case NETDEV_DOWN:
 -                              bond->master_ip = 0;
 -                              return NOTIFY_OK;
 -                      default:
 -                              return NOTIFY_DONE;
 -                      }
 -              }
 -
 -              list_for_each_entry(vlan, &bond->vlan_list, vlan_list) {
 -                      vlan_dev = __vlan_find_dev_deep(bond->dev,
 -                                                      vlan->vlan_id);
 -                      if (vlan_dev == event_dev) {
 -                              switch (event) {
 -                              case NETDEV_UP:
 -                                      vlan->vlan_ip = ifa->ifa_local;
 -                                      return NOTIFY_OK;
 -                              case NETDEV_DOWN:
 -                                      vlan->vlan_ip = 0;
 -                                      return NOTIFY_OK;
 -                              default:
 -                                      return NOTIFY_DONE;
 -                              }
 -                      }
 -              }
 -      }
 -      return NOTIFY_DONE;
 -}
 -
  static struct notifier_block bond_netdev_notifier = {
        .notifier_call = bond_netdev_event,
  };
  
 -static struct notifier_block bond_inetaddr_notifier = {
 -      .notifier_call = bond_inetaddr_event,
 -};
 -
  /*---------------------------- Hashing Policies -----------------------------*/
  
  /*
@@@ -4879,6 -4928,7 +4878,6 @@@ static int __init bonding_init(void
        }
  
        register_netdevice_notifier(&bond_netdev_notifier);
 -      register_inetaddr_notifier(&bond_inetaddr_notifier);
  out:
        return res;
  err:
@@@ -4892,6 -4942,7 +4891,6 @@@ err_link
  static void __exit bonding_exit(void)
  {
        unregister_netdevice_notifier(&bond_netdev_notifier);
 -      unregister_inetaddr_notifier(&bond_inetaddr_notifier);
  
        bond_destroy_debugfs();
  
@@@ -48,7 -48,6 +48,6 @@@
  #include <net/checksum.h>
  #include <net/ip.h>
  
- #include <asm/system.h>
  #include <linux/io.h>
  #include <asm/byteorder.h>
  #include <linux/uaccess.h>
@@@ -89,10 -88,10 +88,10 @@@ static inline void _tg3_flag_clear(enu
  
  #define DRV_MODULE_NAME               "tg3"
  #define TG3_MAJ_NUM                   3
 -#define TG3_MIN_NUM                   122
 +#define TG3_MIN_NUM                   123
  #define DRV_MODULE_VERSION    \
        __stringify(TG3_MAJ_NUM) "." __stringify(TG3_MIN_NUM)
 -#define DRV_MODULE_RELDATE    "December 7, 2011"
 +#define DRV_MODULE_RELDATE    "March 21, 2012"
  
  #define RESET_KIND_SHUTDOWN   0
  #define RESET_KIND_INIT               1
@@@ -5953,10 -5952,8 +5952,10 @@@ next_pkt_nopost
                tpr->rx_std_prod_idx = std_prod_idx & tp->rx_std_ring_mask;
                tpr->rx_jmb_prod_idx = jmb_prod_idx & tp->rx_jmb_ring_mask;
  
 -              if (tnapi != &tp->napi[1])
 +              if (tnapi != &tp->napi[1]) {
 +                      tp->rx_refill = true;
                        napi_schedule(&tp->napi[1].napi);
 +              }
        }
  
        return received;
@@@ -6136,7 -6133,6 +6135,7 @@@ static int tg3_poll_work(struct tg3_nap
                u32 std_prod_idx = dpr->rx_std_prod_idx;
                u32 jmb_prod_idx = dpr->rx_jmb_prod_idx;
  
 +              tp->rx_refill = false;
                for (i = 1; i < tp->irq_cnt; i++)
                        err |= tg3_rx_prodring_xfer(tp, dpr,
                                                    &tp->napi[i].prodring);
@@@ -6200,25 -6196,9 +6199,25 @@@ static int tg3_poll_msix(struct napi_st
                /* check for RX/TX work to do */
                if (likely(sblk->idx[0].tx_consumer == tnapi->tx_cons &&
                           *(tnapi->rx_rcb_prod_idx) == tnapi->rx_rcb_ptr)) {
 +
 +                      /* This test here is not race free, but will reduce
 +                       * the number of interrupts by looping again.
 +                       */
 +                      if (tnapi == &tp->napi[1] && tp->rx_refill)
 +                              continue;
 +
                        napi_complete(napi);
                        /* Reenable interrupts. */
                        tw32_mailbox(tnapi->int_mbox, tnapi->last_tag << 24);
 +
 +                      /* This test here is synchronized by napi_schedule()
 +                       * and napi_complete() to close the race condition.
 +                       */
 +                      if (unlikely(tnapi == &tp->napi[1] && tp->rx_refill)) {
 +                              tw32(HOSTCC_MODE, tp->coalesce_mode |
 +                                                HOSTCC_MODE_ENABLE |
 +                                                tnapi->coal_now);
 +                      }
                        mmiowb();
                        break;
                }
  
  */
  
 -/* Always include 'config.h' first in case the user wants to turn on
 -   or override something. */
 -#include <linux/module.h>
  
  /*
   * Set this to zero to disable DMA code
  
  */
  
 +#include <linux/module.h>
 +#include <linux/printk.h>
  #include <linux/errno.h>
  #include <linux/netdevice.h>
  #include <linux/etherdevice.h>
 +#include <linux/platform_device.h>
  #include <linux/kernel.h>
  #include <linux/types.h>
  #include <linux/fcntl.h>
  #include <linux/delay.h>
  #include <linux/gfp.h>
  
- #include <asm/system.h>
  #include <asm/io.h>
  #include <asm/irq.h>
 +#include <linux/atomic.h>
  #if ALLOW_DMA
  #include <asm/dma.h>
  #endif
@@@ -175,20 -173,26 +174,20 @@@ static char version[] __initdata 
     them to system IRQ numbers. This mapping is card specific and is set to
     the configuration of the Cirrus Eval board for this chip. */
  #if defined(CONFIG_MACH_IXDP2351)
 +#define CS89x0_NONISA_IRQ
  static unsigned int netcard_portlist[] __used __initdata = {IXDP2351_VIRT_CS8900_BASE, 0};
  static unsigned int cs8900_irq_map[] = {IRQ_IXDP2351_CS8900, 0, 0, 0};
  #elif defined(CONFIG_ARCH_IXDP2X01)
 +#define CS89x0_NONISA_IRQ
  static unsigned int netcard_portlist[] __used __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0};
  static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0};
 -#elif defined(CONFIG_MACH_QQ2440)
 -#include <mach/qq2440.h>
 -static unsigned int netcard_portlist[] __used __initdata = { QQ2440_CS8900_VIRT_BASE + 0x300, 0 };
 -static unsigned int cs8900_irq_map[] = { QQ2440_CS8900_IRQ, 0, 0, 0 };
 -#elif defined(CONFIG_MACH_MX31ADS)
 -#include <mach/board-mx31ads.h>
 -static unsigned int netcard_portlist[] __used __initdata = {
 -      PBC_BASE_ADDRESS + PBC_CS8900A_IOBASE + 0x300, 0
 -};
 -static unsigned cs8900_irq_map[] = {EXPIO_INT_ENET_INT, 0, 0, 0};
  #else
 +#ifndef CONFIG_CS89x0_PLATFORM
  static unsigned int netcard_portlist[] __used __initdata =
     { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
  static unsigned int cs8900_irq_map[] = {10,11,12,5};
  #endif
 +#endif
  
  #if DEBUGGING
  static unsigned int net_debug = DEBUGGING;
@@@ -231,16 -235,11 +230,16 @@@ struct net_local 
        unsigned char *end_dma_buff;    /* points to the end of the buffer */
        unsigned char *rx_dma_ptr;      /* points to the next packet  */
  #endif
 +#ifdef CONFIG_CS89x0_PLATFORM
 +      void __iomem *virt_addr;/* Virtual address for accessing the CS89x0. */
 +      unsigned long phys_addr;/* Physical address for accessing the CS89x0. */
 +      unsigned long size;     /* Length of CS89x0 memory region. */
 +#endif
  };
  
  /* Index to functions, as function prototypes. */
  
 -static int cs89x0_probe1(struct net_device *dev, int ioaddr, int modular);
 +static int cs89x0_probe1(struct net_device *dev, unsigned long ioaddr, int modular);
  static int net_open(struct net_device *dev);
  static netdev_tx_t net_send_packet(struct sk_buff *skb, struct net_device *dev);
  static irqreturn_t net_interrupt(int irq, void *dev_id);
@@@ -294,7 -293,6 +293,7 @@@ static int __init media_fn(char *str
  __setup("cs89x0_media=", media_fn);
  
  
 +#ifndef CONFIG_CS89x0_PLATFORM
  /* Check for a network adaptor of this type, and return '0' iff one exists.
     If dev->base_addr == 0, probe all likely locations.
     If dev->base_addr == 1, always return failure.
@@@ -344,7 -342,6 +343,7 @@@ out
        return ERR_PTR(err);
  }
  #endif
 +#endif
  
  #if defined(CONFIG_MACH_IXDP2351)
  static u16
@@@ -506,7 -503,7 +505,7 @@@ static const struct net_device_ops net_
   */
  
  static int __init
 -cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)
 +cs89x0_probe1(struct net_device *dev, unsigned long ioaddr, int modular)
  {
        struct net_local *lp = netdev_priv(dev);
        static unsigned version_printed;
                lp->force = g_cs89x0_media__force;
  #endif
  
 -#if defined(CONFIG_MACH_QQ2440)
 -              lp->force |= FORCE_RJ45 | FORCE_FULL;
 -#endif
          }
  
        /* Grab the region so we can find another board if autoIRQ fails. */
        /* WTF is going on here? */
        if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, DRV_NAME)) {
 -              printk(KERN_ERR "%s: request_region(0x%x, 0x%x) failed\n",
 +              printk(KERN_ERR "%s: request_region(0x%lx, 0x%x) failed\n",
                                DRV_NAME, ioaddr, NETCARD_IO_EXTENT);
                retval = -EBUSY;
                goto out1;
           will skip the test for the ADD_PORT. */
        if (ioaddr & 1) {
                if (net_debug > 1)
 -                      printk(KERN_INFO "%s: odd ioaddr 0x%x\n", dev->name, ioaddr);
 +                      printk(KERN_INFO "%s: odd ioaddr 0x%lx\n", dev->name, ioaddr);
                if ((ioaddr & 2) != 2)
                        if ((readword(ioaddr & ~3, ADD_PORT) & ADD_MASK) != ADD_SIG) {
                                printk(KERN_ERR "%s: bad signature 0x%x\n",
        }
  
        ioaddr &= ~3;
 -      printk(KERN_DEBUG "PP_addr at %x[%x]: 0x%x\n",
 +      printk(KERN_DEBUG "PP_addr at %lx[%x]: 0x%x\n",
                        ioaddr, ADD_PORT, readword(ioaddr, ADD_PORT));
        writeword(ioaddr, ADD_PORT, PP_ChipID);
  
        tmp = readword(ioaddr, DATA_PORT);
        if (tmp != CHIP_EISA_ID_SIG) {
 -              printk(KERN_DEBUG "%s: incorrect signature at %x[%x]: 0x%x!="
 +              printk(KERN_DEBUG "%s: incorrect signature at %lx[%x]: 0x%x!="
                        CHIP_EISA_ID_SIG_STR "\n",
                        dev->name, ioaddr, DATA_PORT, tmp);
                retval = -ENODEV;
                        dev->irq = i;
        } else {
                i = lp->isa_config & INT_NO_MASK;
 +#ifndef CONFIG_CS89x0_PLATFORM
                if (lp->chip_type == CS8900) {
 -#ifdef CONFIG_CS89x0_NONISA_IRQ
 +#ifdef CS89x0_NONISA_IRQ
                        i = cs8900_irq_map[0];
  #else
                        /* Translate the IRQ using the IRQ mapping table. */
                        }
  #endif
                }
 +#endif
                if (!dev->irq)
                        dev->irq = i;
        }
@@@ -1169,7 -1167,6 +1168,7 @@@ write_irq(struct net_device *dev, int c
        int i;
  
        if (chip_type == CS8900) {
 +#ifndef CONFIG_CS89x0_PLATFORM
                /* Search the mapping table for the corresponding IRQ pin. */
                for (i = 0; i != ARRAY_SIZE(cs8900_irq_map); i++)
                        if (cs8900_irq_map[i] == irq)
                /* Not found */
                if (i == ARRAY_SIZE(cs8900_irq_map))
                        i = 3;
 +#else
 +              /* INTRQ0 pin is used for interrupt generation. */
 +              i = 0;
 +#endif
                writereg(dev, PP_CS8900_ISAINT, i);
        } else {
                writereg(dev, PP_CS8920_ISAINT, irq);
@@@ -1234,7 -1227,7 +1233,7 @@@ net_open(struct net_device *dev
        }
        else
        {
 -#ifndef CONFIG_CS89x0_NONISA_IRQ
 +#if !defined(CS89x0_NONISA_IRQ) && !defined(CONFIG_CS89x0_PLATFORM)
                if (((1 << dev->irq) & lp->irq_map) == 0) {
                        printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
                                 dev->name, dev->irq, lp->irq_map);
@@@ -1752,7 -1745,7 +1751,7 @@@ static int set_mac_address(struct net_d
        return 0;
  }
  
 -#ifdef MODULE
 +#if defined(MODULE) && !defined(CONFIG_CS89x0_PLATFORM)
  
  static struct net_device *dev_cs89x0;
  
@@@ -1906,97 -1899,7 +1905,97 @@@ cleanup_module(void
        release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT);
        free_netdev(dev_cs89x0);
  }
 -#endif /* MODULE */
 +#endif /* MODULE && !CONFIG_CS89x0_PLATFORM */
 +
 +#ifdef CONFIG_CS89x0_PLATFORM
 +static int __init cs89x0_platform_probe(struct platform_device *pdev)
 +{
 +      struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
 +      struct net_local *lp;
 +      struct resource *mem_res;
 +      int err;
 +
 +      if (!dev)
 +              return -ENOMEM;
 +
 +      lp = netdev_priv(dev);
 +
 +      mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 +      dev->irq = platform_get_irq(pdev, 0);
 +      if (mem_res == NULL || dev->irq <= 0) {
 +              dev_warn(&dev->dev, "memory/interrupt resource missing.\n");
 +              err = -ENXIO;
 +              goto free;
 +      }
 +
 +      lp->phys_addr = mem_res->start;
 +      lp->size = resource_size(mem_res);
 +      if (!request_mem_region(lp->phys_addr, lp->size, DRV_NAME)) {
 +              dev_warn(&dev->dev, "request_mem_region() failed.\n");
 +              err = -EBUSY;
 +              goto free;
 +      }
 +
 +      lp->virt_addr = ioremap(lp->phys_addr, lp->size);
 +      if (!lp->virt_addr) {
 +              dev_warn(&dev->dev, "ioremap() failed.\n");
 +              err = -ENOMEM;
 +              goto release;
 +      }
 +
 +      err = cs89x0_probe1(dev, (unsigned long)lp->virt_addr, 0);
 +      if (err) {
 +              dev_warn(&dev->dev, "no cs8900 or cs8920 detected.\n");
 +              goto unmap;
 +      }
 +
 +      platform_set_drvdata(pdev, dev);
 +      return 0;
 +
 +unmap:
 +      iounmap(lp->virt_addr);
 +release:
 +      release_mem_region(lp->phys_addr, lp->size);
 +free:
 +      free_netdev(dev);
 +      return err;
 +}
 +
 +static int cs89x0_platform_remove(struct platform_device *pdev)
 +{
 +      struct net_device *dev = platform_get_drvdata(pdev);
 +      struct net_local *lp = netdev_priv(dev);
 +
 +      unregister_netdev(dev);
 +      iounmap(lp->virt_addr);
 +      release_mem_region(lp->phys_addr, lp->size);
 +      free_netdev(dev);
 +      return 0;
 +}
 +
 +static struct platform_driver cs89x0_driver = {
 +      .driver = {
 +              .name   = DRV_NAME,
 +              .owner  = THIS_MODULE,
 +      },
 +      .remove = cs89x0_platform_remove,
 +};
 +
 +static int __init cs89x0_init(void)
 +{
 +      return platform_driver_probe(&cs89x0_driver, cs89x0_platform_probe);
 +}
 +
 +module_init(cs89x0_init);
 +
 +static void __exit cs89x0_cleanup(void)
 +{
 +      platform_driver_unregister(&cs89x0_driver);
 +}
 +
 +module_exit(cs89x0_cleanup);
 +
 +#endif /* CONFIG_CS89x0_PLATFORM */
  
  /*
   * Local variables:
diff --combined drivers/parisc/dino.c
@@@ -55,7 -55,6 +55,6 @@@
  
  #include <asm/pdc.h>
  #include <asm/page.h>
- #include <asm/system.h>
  #include <asm/io.h>
  #include <asm/hardware.h>
  
@@@ -553,6 -552,7 +552,6 @@@ dino_fixup_bus(struct pci_bus *bus
        struct list_head *ln;
          struct pci_dev *dev;
          struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->bridge));
 -      int port_base = HBA_PORT_BASE(dino_dev->hba.hba_num);
  
        DBG(KERN_WARNING "%s(0x%p) bus %d platform_data 0x%p\n",
            __func__, bus, bus->secondary,
  
  
        list_for_each(ln, &bus->devices) {
 -              int i;
 -
                dev = pci_dev_b(ln);
                if (is_card_dino(&dino_dev->hba.dev->id))
                        dino_card_fixup(dev);
                if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI)
                        continue;
  
 -              /* Adjust the I/O Port space addresses */
 -              for (i = 0; i < PCI_NUM_RESOURCES; i++) {
 -                      struct resource *res = &dev->resource[i];
 -                      if (res->flags & IORESOURCE_IO) {
 -                              res->start |= port_base;
 -                              res->end |= port_base;
 -                      }
 -#ifdef __LP64__
 -                      /* Sign Extend MMIO addresses */
 -                      else if (res->flags & IORESOURCE_MEM) {
 -                              res->start |= F_EXTEND(0UL);
 -                              res->end   |= F_EXTEND(0UL);
 -                      }
 -#endif
 -              }
                /* null out the ROM resource if there is one (we don't
                 * care about an expansion rom on parisc, since it
                 * usually contains (x86) bios code) */
@@@ -973,14 -990,11 +972,14 @@@ static int __init dino_probe(struct par
  
        dev->dev.platform_data = dino_dev;
  
 -      pci_add_resource(&resources, &dino_dev->hba.io_space);
 +      pci_add_resource_offset(&resources, &dino_dev->hba.io_space,
 +                              HBA_PORT_BASE(dino_dev->hba.hba_num));
        if (dino_dev->hba.lmmio_space.flags)
 -              pci_add_resource(&resources, &dino_dev->hba.lmmio_space);
 +              pci_add_resource_offset(&resources, &dino_dev->hba.lmmio_space,
 +                                      dino_dev->hba.lmmio_space_offset);
        if (dino_dev->hba.elmmio_space.flags)
 -              pci_add_resource(&resources, &dino_dev->hba.elmmio_space);
 +              pci_add_resource_offset(&resources, &dino_dev->hba.elmmio_space,
 +                                      dino_dev->hba.lmmio_space_offset);
        if (dino_dev->hba.gmmio_space.flags)
                pci_add_resource(&resources, &dino_dev->hba.gmmio_space);
  
diff --combined drivers/parisc/lba_pci.c
@@@ -43,7 -43,6 +43,6 @@@
  #include <asm/pdc.h>
  #include <asm/pdcpat.h>
  #include <asm/page.h>
- #include <asm/system.h>
  
  #include <asm/ropes.h>
  #include <asm/hardware.h>     /* for register_parisc_driver() stuff */
@@@ -635,6 -634,7 +634,6 @@@ lba_fixup_bus(struct pci_bus *bus
        u16 status;
  #endif
        struct lba_device *ldev = LBA_DEV(parisc_walk_tree(bus->bridge));
 -      int lba_portbase = HBA_PORT_BASE(ldev->hba.hba_num);
  
        DBG("lba_fixup_bus(0x%p) bus %d platform_data 0x%p\n",
                bus, bus->secondary, bus->bridge->platform_data);
                        if (!res->start)
                                continue;
  
 -                      if (res->flags & IORESOURCE_IO) {
 -                              DBG("lba_fixup_bus() I/O Ports [%lx/%lx] -> ",
 -                                      res->start, res->end);
 -                              res->start |= lba_portbase;
 -                              res->end   |= lba_portbase;
 -                              DBG("[%lx/%lx]\n", res->start, res->end);
 -                      } else if (res->flags & IORESOURCE_MEM) {
 -                              /*
 -                              ** Convert PCI (IO_VIEW) addresses to
 -                              ** processor (PA_VIEW) addresses
 -                               */
 -                              DBG("lba_fixup_bus() MMIO [%lx/%lx] -> ",
 -                                      res->start, res->end);
 -                              res->start = PCI_HOST_ADDR(HBA_DATA(ldev), res->start);
 -                              res->end   = PCI_HOST_ADDR(HBA_DATA(ldev), res->end);
 -                              DBG("[%lx/%lx]\n", res->start, res->end);
 -                      } else {
 -                              DBG("lba_fixup_bus() WTF? 0x%lx [%lx/%lx] XXX",
 -                                      res->flags, res->start, res->end);
 -                      }
 -
                        /*
                        ** FIXME: this will result in whinging for devices
                        ** that share expansion ROMs (think quad tulip), but
@@@ -1492,14 -1513,11 +1491,14 @@@ lba_driver_probe(struct parisc_device *
                lba_dev->hba.lmmio_space.flags = 0;
        }
  
 -      pci_add_resource(&resources, &lba_dev->hba.io_space);
 +      pci_add_resource_offset(&resources, &lba_dev->hba.io_space,
 +                              HBA_PORT_BASE(lba_dev->hba.hba_num));
        if (lba_dev->hba.elmmio_space.start)
 -              pci_add_resource(&resources, &lba_dev->hba.elmmio_space);
 +              pci_add_resource_offset(&resources, &lba_dev->hba.elmmio_space,
 +                                      lba_dev->hba.lmmio_space_offset);
        if (lba_dev->hba.lmmio_space.flags)
 -              pci_add_resource(&resources, &lba_dev->hba.lmmio_space);
 +              pci_add_resource_offset(&resources, &lba_dev->hba.lmmio_space,
 +                                      lba_dev->hba.lmmio_space_offset);
        if (lba_dev->hba.gmmio_space.flags)
                pci_add_resource(&resources, &lba_dev->hba.gmmio_space);
  
@@@ -29,7 -29,6 +29,6 @@@
  #include <mach/smemc.h>
  #include <asm/io.h>
  #include <asm/irq.h>
- #include <asm/system.h>
  #include <mach/pxa2xx-regs.h>
  #include <asm/mach-types.h>
  
@@@ -318,7 -317,10 +317,7 @@@ static int pxa2xx_drv_pcmcia_probe(stru
  
                skt->nr = ops->first + i;
                skt->clk = clk;
 -              skt->ops = ops;
 -              skt->socket.owner = ops->owner;
 -              skt->socket.dev.parent = &dev->dev;
 -              skt->socket.pci_irq = NO_IRQ;
 +              soc_pcmcia_init_one(skt, ops, &dev->dev);
  
                ret = pxa2xx_drv_pcmcia_add_one(skt);
                if (ret)
@@@ -41,7 -41,6 +41,6 @@@
  
  #include <mach/hardware.h>
  #include <asm/irq.h>
- #include <asm/system.h>
  
  #include "soc_common.h"
  #include "sa11xx_base.h"
@@@ -236,7 -235,10 +235,7 @@@ int sa11xx_drv_pcmcia_probe(struct devi
                skt = &sinfo->skt[i];
  
                skt->nr = first + i;
 -              skt->ops = ops;
 -              skt->socket.owner = ops->owner;
 -              skt->socket.dev.parent = dev;
 -              skt->socket.pci_irq = NO_IRQ;
 +              soc_pcmcia_init_one(skt, ops, dev);
  
                ret = sa11xx_drv_pcmcia_add_one(skt);
                if (ret)
@@@ -32,7 -32,6 +32,7 @@@
  
  
  #include <linux/cpufreq.h>
 +#include <linux/gpio.h>
  #include <linux/init.h>
  #include <linux/interrupt.h>
  #include <linux/io.h>
  #include <linux/timer.h>
  
  #include <mach/hardware.h>
  
  #include "soc_common.h"
  
 +static irqreturn_t soc_common_pcmcia_interrupt(int irq, void *dev);
 +
  #ifdef CONFIG_PCMCIA_DEBUG
  
  static int pc_debug;
@@@ -107,93 -103,6 +106,93 @@@ void soc_common_pcmcia_get_timing(struc
  }
  EXPORT_SYMBOL(soc_common_pcmcia_get_timing);
  
 +static void __soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt,
 +      unsigned int nr)
 +{
 +      unsigned int i;
 +
 +      for (i = 0; i < nr; i++) {
 +              if (skt->stat[i].irq)
 +                      free_irq(skt->stat[i].irq, skt);
 +              if (gpio_is_valid(skt->stat[i].gpio))
 +                      gpio_free(skt->stat[i].gpio);
 +      }
 +
 +      if (skt->ops->hw_shutdown)
 +              skt->ops->hw_shutdown(skt);
 +}
 +
 +static void soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
 +{
 +      __soc_pcmcia_hw_shutdown(skt, ARRAY_SIZE(skt->stat));
 +}
 +
 +static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
 +{
 +      int ret = 0, i;
 +
 +      if (skt->ops->hw_init) {
 +              ret = skt->ops->hw_init(skt);
 +              if (ret)
 +                      return ret;
 +      }
 +
 +      for (i = 0; i < ARRAY_SIZE(skt->stat); i++) {
 +              if (gpio_is_valid(skt->stat[i].gpio)) {
 +                      int irq;
 +
 +                      ret = gpio_request_one(skt->stat[i].gpio, GPIOF_IN,
 +                                             skt->stat[i].name);
 +                      if (ret) {
 +                              __soc_pcmcia_hw_shutdown(skt, i);
 +                              return ret;
 +                      }
 +
 +                      irq = gpio_to_irq(skt->stat[i].gpio);
 +
 +                      if (i == SOC_STAT_RDY)
 +                              skt->socket.pci_irq = irq;
 +                      else
 +                              skt->stat[i].irq = irq;
 +              }
 +
 +              if (skt->stat[i].irq) {
 +                      ret = request_irq(skt->stat[i].irq,
 +                                        soc_common_pcmcia_interrupt,
 +                                        IRQF_TRIGGER_NONE,
 +                                        skt->stat[i].name, skt);
 +                      if (ret) {
 +                              if (gpio_is_valid(skt->stat[i].gpio))
 +                                      gpio_free(skt->stat[i].gpio);
 +                              __soc_pcmcia_hw_shutdown(skt, i);
 +                              return ret;
 +                      }
 +              }
 +      }
 +
 +      return ret;
 +}
 +
 +static void soc_pcmcia_hw_enable(struct soc_pcmcia_socket *skt)
 +{
 +      int i;
 +
 +      for (i = 0; i < ARRAY_SIZE(skt->stat); i++)
 +              if (skt->stat[i].irq) {
 +                      irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_RISING);
 +                      irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_BOTH);
 +              }
 +}
 +
 +static void soc_pcmcia_hw_disable(struct soc_pcmcia_socket *skt)
 +{
 +      int i;
 +
 +      for (i = 0; i < ARRAY_SIZE(skt->stat); i++)
 +              if (skt->stat[i].irq)
 +                      irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_NONE);
 +}
 +
  static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt)
  {
        struct pcmcia_state state;
  
        memset(&state, 0, sizeof(struct pcmcia_state));
  
 +      /* Make battery voltage state report 'good' */
 +      state.bvd1 = 1;
 +      state.bvd2 = 1;
 +
 +      /* CD is active low by default */
 +      if (gpio_is_valid(skt->stat[SOC_STAT_CD].gpio))
 +              state.detect = !gpio_get_value(skt->stat[SOC_STAT_CD].gpio);
 +
 +      /* RDY and BVD are active high by default */
 +      if (gpio_is_valid(skt->stat[SOC_STAT_RDY].gpio))
 +              state.ready = !!gpio_get_value(skt->stat[SOC_STAT_RDY].gpio);
 +      if (gpio_is_valid(skt->stat[SOC_STAT_BVD1].gpio))
 +              state.bvd1 = !!gpio_get_value(skt->stat[SOC_STAT_BVD1].gpio);
 +      if (gpio_is_valid(skt->stat[SOC_STAT_BVD2].gpio))
 +              state.bvd2 = !!gpio_get_value(skt->stat[SOC_STAT_BVD2].gpio);
 +
        skt->ops->socket_state(skt, &state);
  
        stat = state.detect  ? SS_DETECT : 0;
@@@ -294,7 -187,6 +293,7 @@@ static int soc_common_pcmcia_sock_init(
        debug(skt, 2, "initializing socket\n");
        if (skt->ops->socket_init)
                skt->ops->socket_init(skt);
 +      soc_pcmcia_hw_enable(skt);
        return 0;
  }
  
@@@ -314,7 -206,6 +313,7 @@@ static int soc_common_pcmcia_suspend(st
  
        debug(skt, 2, "suspending socket\n");
  
 +      soc_pcmcia_hw_disable(skt);
        if (skt->ops->socket_suspend)
                skt->ops->socket_suspend(skt);
  
@@@ -634,6 -525,69 +633,6 @@@ static struct pccard_operations soc_com
  };
  
  
 -int soc_pcmcia_request_irqs(struct soc_pcmcia_socket *skt,
 -                          struct pcmcia_irqs *irqs, int nr)
 -{
 -      int i, res = 0;
 -
 -      for (i = 0; i < nr; i++) {
 -              if (irqs[i].sock != skt->nr)
 -                      continue;
 -              res = request_irq(irqs[i].irq, soc_common_pcmcia_interrupt,
 -                                IRQF_DISABLED, irqs[i].str, skt);
 -              if (res)
 -                      break;
 -              irq_set_irq_type(irqs[i].irq, IRQ_TYPE_NONE);
 -      }
 -
 -      if (res) {
 -              printk(KERN_ERR "PCMCIA: request for IRQ%d failed (%d)\n",
 -                      irqs[i].irq, res);
 -
 -              while (i--)
 -                      if (irqs[i].sock == skt->nr)
 -                              free_irq(irqs[i].irq, skt);
 -      }
 -      return res;
 -}
 -EXPORT_SYMBOL(soc_pcmcia_request_irqs);
 -
 -void soc_pcmcia_free_irqs(struct soc_pcmcia_socket *skt,
 -                        struct pcmcia_irqs *irqs, int nr)
 -{
 -      int i;
 -
 -      for (i = 0; i < nr; i++)
 -              if (irqs[i].sock == skt->nr)
 -                      free_irq(irqs[i].irq, skt);
 -}
 -EXPORT_SYMBOL(soc_pcmcia_free_irqs);
 -
 -void soc_pcmcia_disable_irqs(struct soc_pcmcia_socket *skt,
 -                           struct pcmcia_irqs *irqs, int nr)
 -{
 -      int i;
 -
 -      for (i = 0; i < nr; i++)
 -              if (irqs[i].sock == skt->nr)
 -                      irq_set_irq_type(irqs[i].irq, IRQ_TYPE_NONE);
 -}
 -EXPORT_SYMBOL(soc_pcmcia_disable_irqs);
 -
 -void soc_pcmcia_enable_irqs(struct soc_pcmcia_socket *skt,
 -                          struct pcmcia_irqs *irqs, int nr)
 -{
 -      int i;
 -
 -      for (i = 0; i < nr; i++)
 -              if (irqs[i].sock == skt->nr) {
 -                      irq_set_irq_type(irqs[i].irq, IRQ_TYPE_EDGE_RISING);
 -                      irq_set_irq_type(irqs[i].irq, IRQ_TYPE_EDGE_BOTH);
 -              }
 -}
 -EXPORT_SYMBOL(soc_pcmcia_enable_irqs);
 -
 -
  static LIST_HEAD(soc_pcmcia_sockets);
  static DEFINE_MUTEX(soc_pcmcia_sockets_lock);
  
@@@ -680,21 -634,6 +679,21 @@@ module_exit(soc_pcmcia_cpufreq_unregist
  
  #endif
  
 +void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt,
 +      struct pcmcia_low_level *ops, struct device *dev)
 +{
 +      int i;
 +
 +      skt->ops = ops;
 +      skt->socket.owner = ops->owner;
 +      skt->socket.dev.parent = dev;
 +      skt->socket.pci_irq = NO_IRQ;
 +
 +      for (i = 0; i < ARRAY_SIZE(skt->stat); i++)
 +              skt->stat[i].gpio = -EINVAL;
 +}
 +EXPORT_SYMBOL(soc_pcmcia_init_one);
 +
  void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt)
  {
        mutex_lock(&soc_pcmcia_sockets_lock);
  
        pcmcia_unregister_socket(&skt->socket);
  
 -      skt->ops->hw_shutdown(skt);
 +      soc_pcmcia_hw_shutdown(skt);
  
 +      /* should not be required; violates some lowlevel drivers */
        soc_common_pcmcia_config_skt(skt, &dead_socket);
  
        list_del(&skt->node);
@@@ -761,7 -699,7 +760,7 @@@ int soc_pcmcia_add_one(struct soc_pcmci
         */
        skt->ops->set_timing(skt);
  
 -      ret = skt->ops->hw_init(skt);
 +      ret = soc_pcmcia_hw_init(skt);
        if (ret)
                goto out_err_6;
  
        pcmcia_unregister_socket(&skt->socket);
  
   out_err_7:
 -      skt->ops->hw_shutdown(skt);
 +      soc_pcmcia_hw_shutdown(skt);
   out_err_6:
        list_del(&skt->node);
        mutex_unlock(&soc_pcmcia_sockets_lock);
@@@ -21,6 -21,7 +21,7 @@@
  #include <asm/chpid.h>
  #include <asm/sclp.h>
  #include <asm/setup.h>
+ #include <asm/ctl_reg.h>
  
  #include "sclp.h"
  
@@@ -441,8 -442,9 +442,8 @@@ static int sclp_mem_notifier(struct not
        start = arg->start_pfn << PAGE_SHIFT;
        size = arg->nr_pages << PAGE_SHIFT;
        mutex_lock(&sclp_mem_mutex);
 -      for (id = 0; id <= sclp_max_storage_id; id++)
 -              if (!test_bit(id, sclp_storage_ids))
 -                      sclp_attach_storage(id);
 +      for_each_clear_bit(id, sclp_storage_ids, sclp_max_storage_id + 1)
 +              sclp_attach_storage(id);
        switch (action) {
        case MEM_ONLINE:
        case MEM_GOING_OFFLINE:
@@@ -34,7 -34,6 +34,6 @@@
  #include <linux/i2c.h>
  #include <linux/mutex.h>
  #include <linux/uaccess.h>
- #include <asm/system.h>
  
  #include "go7007.h"
  #include "go7007-priv.h"
@@@ -1050,15 -1049,15 +1049,15 @@@ static int vidioc_s_parm(struct file *f
        return 0;
  }
  
 -/* VIDIOC_ENUMSTD on go7007 were used for enumberating the supported fps and
 +/* VIDIOC_ENUMSTD on go7007 were used for enumerating the supported fps and
     its resolution, when the device is not connected to TV.
 -   This were an API abuse, probably used by the lack of specific IOCTL's to
 -   enumberate it, by the time the driver were written.
 +   This is were an API abuse, probably used by the lack of specific IOCTL's to
 +   enumerate it, by the time the driver was written.
  
     However, since kernel 2.6.19, two new ioctls (VIDIOC_ENUM_FRAMEINTERVALS
     and VIDIOC_ENUM_FRAMESIZES) were added for this purpose.
  
 -   The two functions bellow implements the newer ioctls
 +   The two functions below implement the newer ioctls
  */
  static int vidioc_enum_framesizes(struct file *filp, void *priv,
                                  struct v4l2_frmsizeenum *fsize)
@@@ -66,7 -66,6 +66,6 @@@
  #include <linux/poll.h>
  #include <linux/platform_device.h>
  
- #include <asm/system.h>
  #include <linux/io.h>
  #include <linux/irq.h>
  #include <linux/fcntl.h>
@@@ -1282,7 -1281,7 +1281,7 @@@ MODULE_PARM_DESC(iommap, "physical bas
  /*
   * some architectures (e.g. intel xscale) align the 8bit serial registers
   * on 32bit word boundaries.
 - * See linux-kernel/serial/8250.c serial_in()/out()
 + * See linux-kernel/drivers/tty/serial/8250/8250.c serial_in()/out()
   */
  module_param(ioshift, int, S_IRUGO);
  MODULE_PARM_DESC(ioshift, "shift I/O register offset (0 = no shift)");
  #include <linux/clk.h>
  #include <linux/usb/ch9.h>
  #include <linux/usb/gadget.h>
 +#include <linux/of.h>
 +#include <linux/of_gpio.h>
  
  #include <asm/byteorder.h>
  #include <mach/hardware.h>
  #include <asm/io.h>
  #include <asm/irq.h>
- #include <asm/system.h>
  #include <asm/gpio.h>
  
  #include <mach/board.h>
  #include <mach/cpu.h>
  #include <mach/at91sam9261_matrix.h>
 +#include <mach/at91_matrix.h>
  
  #include "at91_udc.h"
  
@@@ -913,9 -909,9 +912,9 @@@ static void pullup(struct at91_udc *udc
                } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) {
                        u32     usbpucr;
  
 -                      usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR);
 +                      usbpucr = at91_matrix_read(AT91_MATRIX_USBPUCR);
                        usbpucr |= AT91_MATRIX_USBPUCR_PUON;
 -                      at91_sys_write(AT91_MATRIX_USBPUCR, usbpucr);
 +                      at91_matrix_write(AT91_MATRIX_USBPUCR, usbpucr);
                }
        } else {
                stop_activity(udc);
                } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) {
                        u32     usbpucr;
  
 -                      usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR);
 +                      usbpucr = at91_matrix_read(AT91_MATRIX_USBPUCR);
                        usbpucr &= ~AT91_MATRIX_USBPUCR_PUON;
 -                      at91_sys_write(AT91_MATRIX_USBPUCR, usbpucr);
 +                      at91_matrix_write(AT91_MATRIX_USBPUCR, usbpucr);
                }
                clk_off(udc);
        }
@@@ -1709,27 -1705,7 +1708,27 @@@ static void at91udc_shutdown(struct pla
        spin_unlock_irqrestore(&udc->lock, flags);
  }
  
 -static int __init at91udc_probe(struct platform_device *pdev)
 +static void __devinit at91udc_of_init(struct at91_udc *udc,
 +                                   struct device_node *np)
 +{
 +      struct at91_udc_data *board = &udc->board;
 +      u32 val;
 +      enum of_gpio_flags flags;
 +
 +      if (of_property_read_u32(np, "atmel,vbus-polled", &val) == 0)
 +              board->vbus_polled = 1;
 +
 +      board->vbus_pin = of_get_named_gpio_flags(np, "atmel,vbus-gpio", 0,
 +                                                &flags);
 +      board->vbus_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0;
 +
 +      board->pullup_pin = of_get_named_gpio_flags(np, "atmel,pullup-gpio", 0,
 +                                                &flags);
 +
 +      board->pullup_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0;
 +}
 +
 +static int __devinit at91udc_probe(struct platform_device *pdev)
  {
        struct device   *dev = &pdev->dev;
        struct at91_udc *udc;
        /* init software state */
        udc = &controller;
        udc->gadget.dev.parent = dev;
 -      udc->board = *(struct at91_udc_data *) dev->platform_data;
 +      if (pdev->dev.of_node)
 +              at91udc_of_init(udc, pdev->dev.of_node);
 +      else
 +              memcpy(&udc->board, dev->platform_data,
 +                     sizeof(struct at91_udc_data));
        udc->pdev = pdev;
        udc->enabled = 0;
        spin_lock_init(&udc->lock);
@@@ -1997,15 -1969,6 +1996,15 @@@ static int at91udc_resume(struct platfo
  #define       at91udc_resume  NULL
  #endif
  
 +#if defined(CONFIG_OF)
 +static const struct of_device_id at91_udc_dt_ids[] = {
 +      { .compatible = "atmel,at91rm9200-udc" },
 +      { /* sentinel */ }
 +};
 +
 +MODULE_DEVICE_TABLE(of, at91_udc_dt_ids);
 +#endif
 +
  static struct platform_driver at91_udc_driver = {
        .remove         = __exit_p(at91udc_remove),
        .shutdown       = at91udc_shutdown,
        .driver         = {
                .name   = (char *) driver_name,
                .owner  = THIS_MODULE,
 +              .of_match_table = of_match_ptr(at91_udc_dt_ids),
        },
  };
  
@@@ -42,7 -42,6 +42,6 @@@
  
  #include <asm/io.h>
  #include <asm/irq.h>
- #include <asm/system.h>
  #include <asm/unaligned.h>
  #include <asm/byteorder.h>
  
@@@ -1000,7 -999,7 +999,7 @@@ MODULE_LICENSE ("GPL")
  #define SA1111_DRIVER         ohci_hcd_sa1111_driver
  #endif
  
 -#if defined(CONFIG_ARCH_S3C2410) || defined(CONFIG_ARCH_S3C64XX)
 +#if defined(CONFIG_ARCH_S3C24XX) || defined(CONFIG_ARCH_S3C64XX)
  #include "ohci-s3c2410.c"
  #define PLATFORM_DRIVER               ohci_hcd_s3c2410_driver
  #endif
@@@ -28,8 -28,6 +28,8 @@@
   *        add wdt_start and wdt_stop as parameters.
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -42,9 -40,9 +42,8 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  #define DRV_NAME "advantechwdt"
 -#define PFX DRV_NAME ": "
  #define WATCHDOG_NAME "Advantech WDT"
  #define WATCHDOG_TIMEOUT 60           /* 60 sec default timeout */
  
@@@ -78,8 -76,8 +77,8 @@@ MODULE_PARM_DESC(timeout
        "Watchdog timeout in seconds. 1<= timeout <=63, default="
                __MODULE_STRING(WATCHDOG_TIMEOUT) ".");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
        "Watchdog cannot be stopped once started (default="
                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -208,7 -206,8 +207,7 @@@ static int advwdt_close(struct inode *i
        if (adv_expect_close == 42) {
                advwdt_disable();
        } else {
 -              printk(KERN_CRIT PFX
 -                              "Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
                advwdt_ping();
        }
        clear_bit(0, &advwdt_is_open);
@@@ -245,15 -244,18 +244,15 @@@ static int __devinit advwdt_probe(struc
  
        if (wdt_stop != wdt_start) {
                if (!request_region(wdt_stop, 1, WATCHDOG_NAME)) {
 -                      printk(KERN_ERR PFX
 -                              "I/O address 0x%04x already in use\n",
 -                                                              wdt_stop);
 +                      pr_err("I/O address 0x%04x already in use\n",
 +                             wdt_stop);
                        ret = -EIO;
                        goto out;
                }
        }
  
        if (!request_region(wdt_start, 1, WATCHDOG_NAME)) {
 -              printk(KERN_ERR PFX
 -                              "I/O address 0x%04x already in use\n",
 -                                                              wdt_start);
 +              pr_err("I/O address 0x%04x already in use\n", wdt_start);
                ret = -EIO;
                goto unreg_stop;
        }
         * if not reset to the default */
        if (advwdt_set_heartbeat(timeout)) {
                advwdt_set_heartbeat(WATCHDOG_TIMEOUT);
 -              printk(KERN_INFO PFX
 -                      "timeout value must be 1<=x<=63, using %d\n", timeout);
 +              pr_info("timeout value must be 1<=x<=63, using %d\n", timeout);
        }
  
        ret = misc_register(&advwdt_miscdev);
        if (ret != 0) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                                      WATCHDOG_MINOR, ret);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     WATCHDOG_MINOR, ret);
                goto unreg_regions;
        }
 -      printk(KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n",
 +      pr_info("initialized. timeout=%d sec (nowayout=%d)\n",
                timeout, nowayout);
  out:
        return ret;
@@@ -313,7 -317,8 +312,7 @@@ static int __init advwdt_init(void
  {
        int err;
  
 -      printk(KERN_INFO
 -           "WDT driver for Advantech single board computer initialising.\n");
 +      pr_info("WDT driver for Advantech single board computer initialising\n");
  
        err = platform_driver_register(&advwdt_driver);
        if (err)
@@@ -337,7 -342,7 +336,7 @@@ static void __exit advwdt_exit(void
  {
        platform_device_unregister(advwdt_platform_device);
        platform_driver_unregister(&advwdt_driver);
 -      printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
 +      pr_info("Watchdog Module Unloaded\n");
  }
  
  module_init(advwdt_init);
@@@ -19,8 -19,6 +19,8 @@@
   *                  -- Mike Waychison <michael.waychison@sun.com>
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
 -#define OUR_NAME "alim7101_wdt"
 -#define PFX OUR_NAME ": "
 -
  #define WDT_ENABLE 0x9C
  #define WDT_DISABLE 0x8C
  
@@@ -78,8 -78,8 +77,8 @@@ static unsigned long wdt_is_open
  static char wdt_expect_close;
  static struct pci_dev *alim7101_pmu;
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -111,7 -111,8 +110,7 @@@ static void wdt_timer_ping(unsigned lon
                                        ALI_7101_GPIO_O, tmp & ~0x20);
                }
        } else {
 -              printk(KERN_WARNING PFX
 -                      "Heartbeat lost! Will not ping the watchdog\n");
 +              pr_warn("Heartbeat lost! Will not ping the watchdog\n");
        }
        /* Re-set the timer interval */
        mod_timer(&timer, jiffies + WDT_INTERVAL);
@@@ -160,7 -161,7 +159,7 @@@ static void wdt_startup(void
        /* Start the timer */
        mod_timer(&timer, jiffies + WDT_INTERVAL);
  
 -      printk(KERN_INFO PFX "Watchdog timer is now enabled.\n");
 +      pr_info("Watchdog timer is now enabled\n");
  }
  
  static void wdt_turnoff(void)
        /* Stop the timer */
        del_timer_sync(&timer);
        wdt_change(WDT_DISABLE);
 -      printk(KERN_INFO PFX "Watchdog timer is now disabled...\n");
 +      pr_info("Watchdog timer is now disabled...\n");
  }
  
  static void wdt_keepalive(void)
@@@ -224,7 -225,8 +223,7 @@@ static int fop_close(struct inode *inod
                wdt_turnoff();
        else {
                /* wim: shouldn't there be a: del_timer(&timer); */
 -              printk(KERN_CRIT PFX
 -                "device file closed unexpectedly. Will not stop the WDT!\n");
 +              pr_crit("device file closed unexpectedly. Will not stop the WDT!\n");
        }
        clear_bit(0, &wdt_is_open);
        wdt_expect_close = 0;
@@@ -319,7 -321,8 +318,7 @@@ static int wdt_notify_sys(struct notifi
                 * watchdog on reboot with no heartbeat
                 */
                wdt_change(WDT_ENABLE);
 -              printk(KERN_INFO PFX "Watchdog timer is now enabled "
 -                      "with no heartbeat - should reboot in ~1 second.\n");
 +              pr_info("Watchdog timer is now enabled with no heartbeat - should reboot in ~1 second\n");
        }
        return NOTIFY_DONE;
  }
@@@ -348,11 -351,12 +347,11 @@@ static int __init alim7101_wdt_init(voi
        struct pci_dev *ali1543_south;
        char tmp;
  
 -      printk(KERN_INFO PFX "Steve Hill <steve@navaho.co.uk>.\n");
 +      pr_info("Steve Hill <steve@navaho.co.uk>\n");
        alim7101_pmu = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
                NULL);
        if (!alim7101_pmu) {
 -              printk(KERN_INFO PFX
 -                      "ALi M7101 PMU not present - WDT not set\n");
 +              pr_info("ALi M7101 PMU not present - WDT not set\n");
                return -EBUSY;
        }
  
        ali1543_south = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
                NULL);
        if (!ali1543_south) {
 -              printk(KERN_INFO PFX
 -                      "ALi 1543 South-Bridge not present - WDT not set\n");
 +              pr_info("ALi 1543 South-Bridge not present - WDT not set\n");
                goto err_out;
        }
        pci_read_config_byte(ali1543_south, 0x5e, &tmp);
        pci_dev_put(ali1543_south);
        if ((tmp & 0x1e) == 0x00) {
                if (!use_gpio) {
 -                      printk(KERN_INFO PFX
 -                              "Detected old alim7101 revision 'a1d'.  "
 -                              "If this is a cobalt board, set the 'use_gpio' "
 -                              "module parameter.\n");
 +                      pr_info("Detected old alim7101 revision 'a1d'.  If this is a cobalt board, set the 'use_gpio' module parameter.\n");
                        goto err_out;
                }
                nowayout = 1;
        } else if ((tmp & 0x1e) != 0x12 && (tmp & 0x1e) != 0x00) {
 -              printk(KERN_INFO PFX
 -                      "ALi 1543 South-Bridge does not have the correct "
 -                      "revision number (???1001?) - WDT not set\n");
 +              pr_info("ALi 1543 South-Bridge does not have the correct revision number (???1001?) - WDT not set\n");
                goto err_out;
        }
  
        if (timeout < 1 || timeout > 3600) {
                /* arbitrary upper limit */
                timeout = WATCHDOG_TIMEOUT;
 -              printk(KERN_INFO PFX
 -                      "timeout value must be 1 <= x <= 3600, using %d\n",
 -                                                              timeout);
 +              pr_info("timeout value must be 1 <= x <= 3600, using %d\n",
 +                      timeout);
        }
  
        rc = register_reboot_notifier(&wdt_notifier);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", rc);
 +              pr_err("cannot register reboot notifier (err=%d)\n", rc);
                goto err_out;
        }
  
        rc = misc_register(&wdt_miscdev);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                      wdt_miscdev.minor, rc);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     wdt_miscdev.minor, rc);
                goto err_out_reboot;
        }
  
        if (nowayout)
                __module_get(THIS_MODULE);
  
 -      printk(KERN_INFO PFX "WDT driver for ALi M7101 initialised. "
 -                                      "timeout=%d sec (nowayout=%d)\n",
 +      pr_info("WDT driver for ALi M7101 initialised. timeout=%d sec (nowayout=%d)\n",
                timeout, nowayout);
        return 0;
  
@@@ -12,8 -12,6 +12,8 @@@
   * option) any later version.
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/fs.h>
  #include <linux/smp.h>
@@@ -23,7 -21,6 +23,6 @@@
  #include <linux/uaccess.h>
  
  #include <asm/reg_booke.h>
- #include <asm/system.h>
  #include <asm/time.h>
  #include <asm/div64.h>
  
@@@ -227,8 -224,8 +226,8 @@@ static int booke_wdt_open(struct inode 
        if (booke_wdt_enabled == 0) {
                booke_wdt_enabled = 1;
                on_each_cpu(__booke_wdt_enable, NULL, 0);
 -              pr_debug("booke_wdt: watchdog enabled (timeout = %llu sec)\n",
 -                      period_to_sec(booke_wdt_period));
 +              pr_debug("watchdog enabled (timeout = %llu sec)\n",
 +                       period_to_sec(booke_wdt_period));
        }
        spin_unlock(&booke_wdt_lock);
  
@@@ -245,7 -242,7 +244,7 @@@ static int booke_wdt_release(struct ino
         */
        on_each_cpu(__booke_wdt_disable, NULL, 0);
        booke_wdt_enabled = 0;
 -      pr_debug("booke_wdt: watchdog disabled\n");
 +      pr_debug("watchdog disabled\n");
  #endif
  
        clear_bit(0, &wdt_is_active);
@@@ -277,19 -274,19 +276,19 @@@ static int __init booke_wdt_init(void
  {
        int ret = 0;
  
 -      pr_info("booke_wdt: powerpc book-e watchdog driver loaded\n");
 +      pr_info("powerpc book-e watchdog driver loaded\n");
        ident.firmware_version = cur_cpu_spec->pvr_value;
  
        ret = misc_register(&booke_wdt_miscdev);
        if (ret) {
 -              pr_err("booke_wdt: cannot register device (minor=%u, ret=%i)\n",
 +              pr_err("cannot register device (minor=%u, ret=%i)\n",
                       WATCHDOG_MINOR, ret);
                return ret;
        }
  
        spin_lock(&booke_wdt_lock);
        if (booke_wdt_enabled == 1) {
 -              pr_info("booke_wdt: watchdog enabled (timeout = %llu sec)\n",
 +              pr_info("watchdog enabled (timeout = %llu sec)\n",
                        period_to_sec(booke_wdt_period));
                on_each_cpu(__booke_wdt_enable, NULL, 0);
        }
@@@ -45,8 -45,6 +45,8 @@@
   *    of the on-board SUPER I/O device SMSC FDC 37B782.
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/interrupt.h>
  #include <linux/module.h>
  #include <linux/moduleparam.h>
@@@ -61,7 -59,6 +61,6 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  static unsigned long eurwdt_is_open;
  static int eurwdt_timeout;
@@@ -78,8 -75,8 +77,8 @@@ static char *ev = "int"
  
  #define WDT_TIMEOUT           60                /* 1 minute */
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -146,11 -143,11 +145,11 @@@ static void eurwdt_activate_timer(void
  
        /* Setting interrupt line */
        if (irq == 2 || irq > 15 || irq < 0) {
 -              printk(KERN_ERR ": invalid irq number\n");
 +              pr_err("invalid irq number\n");
                irq = 0;        /* if invalid we disable interrupt */
        }
        if (irq == 0)
 -              printk(KERN_INFO ": interrupt disabled\n");
 +              pr_info("interrupt disabled\n");
  
        eurwdt_write_reg(WDT_TIMER_CFG, irq << 4);
  
  
  static irqreturn_t eurwdt_interrupt(int irq, void *dev_id)
  {
 -      printk(KERN_CRIT "timeout WDT timeout\n");
 +      pr_crit("timeout WDT timeout\n");
  
  #ifdef ONLY_TESTING
 -      printk(KERN_CRIT "Would Reboot.\n");
 +      pr_crit("Would Reboot\n");
  #else
 -      printk(KERN_CRIT "Initiating system reboot.\n");
 +      pr_crit("Initiating system reboot\n");
        emergency_restart();
  #endif
        return IRQ_HANDLED;
@@@ -337,7 -334,8 +336,7 @@@ static int eurwdt_release(struct inode 
        if (eur_expect_close == 42)
                eurwdt_disable_timer();
        else {
 -              printk(KERN_CRIT
 -                      "eurwdt: Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
                eurwdt_ping();
        }
        clear_bit(0, &eurwdt_is_open);
@@@ -430,32 -428,35 +429,32 @@@ static int __init eurwdt_init(void
  
        ret = request_irq(irq, eurwdt_interrupt, 0, "eurwdt", NULL);
        if (ret) {
 -              printk(KERN_ERR "eurwdt: IRQ %d is not free.\n", irq);
 +              pr_err("IRQ %d is not free\n", irq);
                goto out;
        }
  
        if (!request_region(io, 2, "eurwdt")) {
 -              printk(KERN_ERR "eurwdt: IO %X is not free.\n", io);
 +              pr_err("IO %X is not free\n", io);
                ret = -EBUSY;
                goto outirq;
        }
  
        ret = register_reboot_notifier(&eurwdt_notifier);
        if (ret) {
 -              printk(KERN_ERR
 -                  "eurwdt: can't register reboot notifier (err=%d)\n", ret);
 +              pr_err("can't register reboot notifier (err=%d)\n", ret);
                goto outreg;
        }
  
        ret = misc_register(&eurwdt_miscdev);
        if (ret) {
 -              printk(KERN_ERR "eurwdt: can't misc_register on minor=%d\n",
 -              WATCHDOG_MINOR);
 +              pr_err("can't misc_register on minor=%d\n", WATCHDOG_MINOR);
                goto outreboot;
        }
  
        eurwdt_unlock_chip();
  
        ret = 0;
 -      printk(KERN_INFO "Eurotech WDT driver 0.01 at %X (Interrupt %d)"
 -              " - timeout event: %s\n",
 +      pr_info("Eurotech WDT driver 0.01 at %X (Interrupt %d) - timeout event: %s\n",
                io, irq, (!strcmp("int", ev) ? "int" : "reboot"));
  
  out:
@@@ -31,8 -31,6 +31,8 @@@
   *
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/types.h>
  #include <linux/miscdevice.h>
@@@ -46,7 -44,6 +46,6 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  static struct platform_device *ibwdt_platform_device;
  static unsigned long ibwdt_is_open;
@@@ -55,6 -52,7 +54,6 @@@ static char expect_close
  
  /* Module information */
  #define DRV_NAME "ib700wdt"
 -#define PFX DRV_NAME ": "
  
  /*
   *
@@@ -103,8 -101,8 +102,8 @@@ MODULE_PARM_DESC(timeout
        "Watchdog timeout in seconds. 0<= timeout <=30, default="
                __MODULE_STRING(WATCHDOG_TIMEOUT) ".");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -247,7 -245,8 +246,7 @@@ static int ibwdt_close(struct inode *in
        if (expect_close == 42) {
                ibwdt_disable();
        } else {
 -              printk(KERN_CRIT PFX
 -                   "WDT device closed unexpectedly.  WDT will not stop!\n");
 +              pr_crit("WDT device closed unexpectedly.  WDT will not stop!\n");
                ibwdt_ping();
        }
        clear_bit(0, &ibwdt_is_open);
@@@ -284,14 -283,16 +283,14 @@@ static int __devinit ibwdt_probe(struc
  
  #if WDT_START != WDT_STOP
        if (!request_region(WDT_STOP, 1, "IB700 WDT")) {
 -              printk(KERN_ERR PFX "STOP method I/O %X is not available.\n",
 -                                                              WDT_STOP);
 +              pr_err("STOP method I/O %X is not available\n", WDT_STOP);
                res = -EIO;
                goto out_nostopreg;
        }
  #endif
  
        if (!request_region(WDT_START, 1, "IB700 WDT")) {
 -              printk(KERN_ERR PFX "START method I/O %X is not available.\n",
 -                                                              WDT_START);
 +              pr_err("START method I/O %X is not available\n", WDT_START);
                res = -EIO;
                goto out_nostartreg;
        }
         * if not reset to the default */
        if (ibwdt_set_heartbeat(timeout)) {
                ibwdt_set_heartbeat(WATCHDOG_TIMEOUT);
 -              printk(KERN_INFO PFX
 -                      "timeout value must be 0<=x<=30, using %d\n", timeout);
 +              pr_info("timeout value must be 0<=x<=30, using %d\n", timeout);
        }
  
        res = misc_register(&ibwdt_miscdev);
        if (res) {
 -              printk(KERN_ERR PFX "failed to register misc device\n");
 +              pr_err("failed to register misc device\n");
                goto out_nomisc;
        }
        return 0;
@@@ -350,7 -352,8 +349,7 @@@ static int __init ibwdt_init(void
  {
        int err;
  
 -      printk(KERN_INFO PFX
 -              "WDT driver for IB700 single board computer initialising.\n");
 +      pr_info("WDT driver for IB700 single board computer initialising\n");
  
        err = platform_driver_register(&ibwdt_driver);
        if (err)
@@@ -374,7 -377,7 +373,7 @@@ static void __exit ibwdt_exit(void
  {
        platform_device_unregister(ibwdt_platform_device);
        platform_driver_unregister(&ibwdt_driver);
 -      printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
 +      pr_info("Watchdog Module Unloaded\n");
  }
  
  module_init(ibwdt_init);
@@@ -29,8 -29,6 +29,8 @@@
   *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
  #include <linux/uaccess.h>
  #include <linux/io.h>
  
  
  #define WATCHDOG_VERSION      "1.14"
  #define WATCHDOG_NAME         "IT87 WDT"
 -#define PFX                   WATCHDOG_NAME ": "
  #define DRIVER_VERSION                WATCHDOG_NAME " driver, v" WATCHDOG_VERSION "\n"
  #define WD_MAGIC              'V'
  
@@@ -143,7 -141,7 +142,7 @@@ static     int nogameport = DEFAULT_NOGAMEP
  static        int exclusive  = DEFAULT_EXCLUSIVE;
  static        int timeout    = DEFAULT_TIMEOUT;
  static        int testmode   = DEFAULT_TESTMODE;
 -static        int nowayout   = DEFAULT_NOWAYOUT;
 +static        bool nowayout   = DEFAULT_NOWAYOUT;
  
  module_param(nogameport, int, 0);
  MODULE_PARM_DESC(nogameport, "Forbid the activation of game port, default="
@@@ -157,7 -155,7 +156,7 @@@ MODULE_PARM_DESC(timeout, "Watchdog tim
  module_param(testmode, int, 0);
  MODULE_PARM_DESC(testmode, "Watchdog test mode (1 = no reboot), default="
                __MODULE_STRING(DEFAULT_TESTMODE));
 -module_param(nowayout, int, 0);
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started, default="
                __MODULE_STRING(WATCHDOG_NOWAYOUT));
  
@@@ -429,7 -427,8 +428,7 @@@ static int wdt_release(struct inode *in
                        clear_bit(WDTS_TIMER_RUN, &wdt_status);
                } else {
                        wdt_keepalive();
 -                      printk(KERN_CRIT PFX
 -                             "unexpected close, not stopping watchdog!\n");
 +                      pr_crit("unexpected close, not stopping watchdog!\n");
                }
        }
        clear_bit(WDTS_DEV_OPEN, &wdt_status);
@@@ -621,14 -620,16 +620,14 @@@ static int __init it87_wdt_init(void
                try_gameport = 0;
                break;
        case IT8705_ID:
 -              printk(KERN_ERR PFX
 -                     "Unsupported Chip found, Chip %04x Revision %02x\n",
 +              pr_err("Unsupported Chip found, Chip %04x Revision %02x\n",
                       chip_type, chip_rev);
                return -ENODEV;
        case NO_DEV_ID:
 -              printk(KERN_ERR PFX "no device\n");
 +              pr_err("no device\n");
                return -ENODEV;
        default:
 -              printk(KERN_ERR PFX
 -                     "Unknown Chip found, Chip %04x Revision %04x\n",
 +              pr_err("Unknown Chip found, Chip %04x Revision %04x\n",
                       chip_type, chip_rev);
                return -ENODEV;
        }
        if (!test_bit(WDTS_USE_GP, &wdt_status)) {
                if (!request_region(CIR_BASE, 8, WATCHDOG_NAME)) {
                        if (gp_rreq_fail)
 -                              printk(KERN_ERR PFX
 -                                      "I/O Address 0x%04x and 0x%04x"
 -                                      " already in use\n", base, CIR_BASE);
 +                              pr_err("I/O Address 0x%04x and 0x%04x already in use\n",
 +                                     base, CIR_BASE);
                        else
 -                              printk(KERN_ERR PFX
 -                                      "I/O Address 0x%04x already in use\n",
 -                                      CIR_BASE);
 +                              pr_err("I/O Address 0x%04x already in use\n",
 +                                     CIR_BASE);
                        rc = -EIO;
                        goto err_out;
                }
  
        if (timeout < 1 || timeout > max_units * 60) {
                timeout = DEFAULT_TIMEOUT;
 -              printk(KERN_WARNING PFX
 -                     "Timeout value out of range, use default %d sec\n",
 -                     DEFAULT_TIMEOUT);
 +              pr_warn("Timeout value out of range, use default %d sec\n",
 +                      DEFAULT_TIMEOUT);
        }
  
        if (timeout > max_units)
  
        rc = register_reboot_notifier(&wdt_notifier);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                     "Cannot register reboot notifier (err=%d)\n", rc);
 +              pr_err("Cannot register reboot notifier (err=%d)\n", rc);
                goto err_out_region;
        }
  
        rc = misc_register(&wdt_miscdev);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                     "Cannot register miscdev on minor=%d (err=%d)\n",
 -                      wdt_miscdev.minor, rc);
 +              pr_err("Cannot register miscdev on minor=%d (err=%d)\n",
 +                     wdt_miscdev.minor, rc);
                goto err_out_reboot;
        }
  
                outb(0x09, CIR_IER(base));
        }
  
 -      printk(KERN_INFO PFX "Chip IT%04x revision %d initialized. "
 -              "timeout=%d sec (nowayout=%d testmode=%d exclusive=%d "
 -              "nogameport=%d)\n", chip_type, chip_rev, timeout,
 +      pr_info("Chip IT%04x revision %d initialized. timeout=%d sec (nowayout=%d testmode=%d exclusive=%d nogameport=%d)\n",
 +              chip_type, chip_rev, timeout,
                nowayout, testmode, exclusive, nogameport);
  
        superio_exit();
@@@ -28,8 -28,6 +28,8 @@@
   *      Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -45,7 -43,6 +45,6 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  /* ports */
  #define ZF_IOBASE     0x218
@@@ -95,8 -92,8 +94,8 @@@ MODULE_DESCRIPTION("MachZ ZF-Logic Watc
  MODULE_LICENSE("GPL");
  MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -143,10 -140,10 +142,10 @@@ static unsigned long next_heartbeat
  #define ZF_CTIMEOUT 0xffff
  
  #ifndef ZF_DEBUG
 -#     define dprintk(format, args...)
 +#define dprintk(format, args...)
  #else
 -#     define dprintk(format, args...) printk(KERN_DEBUG PFX \
 -                              ":%s:%d: " format, __func__, __LINE__ , ## args)
 +#define dprintk(format, args...)                                      \
 +      pr_debug(":%s:%d: " format, __func__, __LINE__ , ## args)
  #endif
  
  
@@@ -205,7 -202,7 +204,7 @@@ static void zf_timer_off(void
        zf_set_control(ctrl_reg);
        spin_unlock_irqrestore(&zf_port_lock, flags);
  
 -      printk(KERN_INFO PFX ": Watchdog timer is now disabled\n");
 +      pr_info("Watchdog timer is now disabled\n");
  }
  
  
@@@ -235,7 -232,7 +234,7 @@@ static void zf_timer_on(void
        zf_set_control(ctrl_reg);
        spin_unlock_irqrestore(&zf_port_lock, flags);
  
 -      printk(KERN_INFO PFX ": Watchdog timer is now enabled\n");
 +      pr_info("Watchdog timer is now enabled\n");
  }
  
  
@@@ -265,7 -262,7 +264,7 @@@ static void zf_ping(unsigned long data
  
                mod_timer(&zf_timer, jiffies + ZF_HW_TIMEO);
        } else
 -              printk(KERN_CRIT PFX ": I will reset your machine\n");
 +              pr_crit("I will reset your machine\n");
  }
  
  static ssize_t zf_write(struct file *file, const char __user *buf, size_t count,
@@@ -344,7 -341,8 +343,7 @@@ static int zf_close(struct inode *inode
                zf_timer_off();
        else {
                del_timer(&zf_timer);
 -              printk(KERN_ERR PFX ": device file closed unexpectedly. "
 -                                              "Will not stop the WDT!\n");
 +              pr_err("device file closed unexpectedly. Will not stop the WDT!\n");
        }
        clear_bit(0, &zf_is_open);
        zf_expect_close = 0;
@@@ -391,18 -389,19 +390,18 @@@ static void __init zf_show_action(int a
  {
        static const char * const str[] = { "RESET", "SMI", "NMI", "SCI" };
  
 -      printk(KERN_INFO PFX ": Watchdog using action = %s\n", str[act]);
 +      pr_info("Watchdog using action = %s\n", str[act]);
  }
  
  static int __init zf_init(void)
  {
        int ret;
  
 -      printk(KERN_INFO PFX
 -              ": MachZ ZF-Logic Watchdog driver initializing.\n");
 +      pr_info("MachZ ZF-Logic Watchdog driver initializing\n");
  
        ret = zf_get_ZFL_version();
        if (!ret || ret == 0xffff) {
 -              printk(KERN_WARNING PFX ": no ZF-Logic found\n");
 +              pr_warn("no ZF-Logic found\n");
                return -ENODEV;
        }
  
        zf_show_action(action);
  
        if (!request_region(ZF_IOBASE, 3, "MachZ ZFL WDT")) {
 -              printk(KERN_ERR "cannot reserve I/O ports at %d\n",
 -                                                      ZF_IOBASE);
 +              pr_err("cannot reserve I/O ports at %d\n", ZF_IOBASE);
                ret = -EBUSY;
                goto no_region;
        }
  
        ret = register_reboot_notifier(&zf_notifier);
        if (ret) {
 -              printk(KERN_ERR "can't register reboot notifier (err=%d)\n",
 -                                                                      ret);
 +              pr_err("can't register reboot notifier (err=%d)\n", ret);
                goto no_reboot;
        }
  
        ret = misc_register(&zf_miscdev);
        if (ret) {
 -              printk(KERN_ERR "can't misc_register on minor=%d\n",
 -                                                      WATCHDOG_MINOR);
 +              pr_err("can't misc_register on minor=%d\n", WATCHDOG_MINOR);
                goto no_misc;
        }
  
@@@ -18,8 -18,6 +18,8 @@@
   *      Release 1.1
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/types.h>
  #include <linux/miscdevice.h>
@@@ -35,7 -33,6 +35,6 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  /* #define DEBUG 1 */
  
@@@ -44,6 -41,7 +43,6 @@@
  
  #define VERSION             "1.1"
  #define MODNAME             "pc87413 WDT"
 -#define PFX                 MODNAME ": "
  #define DPFX                MODNAME " - DEBUG: "
  
  #define WDT_INDEX_IO_PORT   (io+0)    /* I/O port base (index register) */
@@@ -66,7 -64,7 +65,7 @@@ static char expect_close;             /* is the cl
  
  static DEFINE_SPINLOCK(io_lock);      /* to guard us from io races */
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 +static bool nowayout = WATCHDOG_NOWAYOUT;
  
  /* -- Low level function ----------------------------------------*/
  
@@@ -88,7 -86,7 +87,7 @@@ static inline void pc87413_select_wdt_o
        outb_p(cr_data, WDT_DATA_IO_PORT);
  
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX
 +      pr_info(DPFX
                "Select multiple pin,pin55,as WDT output: Bit7 to 1: %d\n",
                                                                cr_data);
  #endif
@@@ -112,7 -110,7 +111,7 @@@ static inline void pc87413_enable_swc(v
        outb_p(cr_data, WDT_DATA_IO_PORT);      /* Index0x30_bit0P1 */
  
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX "pc87413 - Enable SWC functions\n");
 +      pr_info(DPFX "pc87413 - Enable SWC functions\n");
  #endif
  }
  
@@@ -133,7 -131,7 +132,7 @@@ static void pc87413_get_swc_base_addr(v
  
        swc_base_addr = (addr_h << 8) + addr_l;
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX
 +      pr_info(DPFX
                "Read SWC I/O Base Address: low %d, high %d, res %d\n",
                                                addr_l, addr_h, swc_base_addr);
  #endif
@@@ -146,7 -144,7 +145,7 @@@ static inline void pc87413_swc_bank3(vo
        /* Step 4: Select Bank3 of SWC */
        outb_p(inb(swc_base_addr + 0x0f) | 0x03, swc_base_addr + 0x0f);
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX "Select Bank3 of SWC\n");
 +      pr_info(DPFX "Select Bank3 of SWC\n");
  #endif
  }
  
@@@ -157,7 -155,7 +156,7 @@@ static inline void pc87413_programm_wdt
        /* Step 5: Programm WDTO, Twd. */
        outb_p(pc87413_time, swc_base_addr + WDTO);
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX "Set WDTO to %d minutes\n", pc87413_time);
 +      pr_info(DPFX "Set WDTO to %d minutes\n", pc87413_time);
  #endif
  }
  
@@@ -168,7 -166,7 +167,7 @@@ static inline void pc87413_enable_wden(
        /* Step 6: Enable WDEN */
        outb_p(inb(swc_base_addr + WDCTL) | 0x01, swc_base_addr + WDCTL);
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX "Enable WDEN\n");
 +      pr_info(DPFX "Enable WDEN\n");
  #endif
  }
  
@@@ -178,7 -176,7 +177,7 @@@ static inline void pc87413_enable_sw_wd
        /* Enable SW_WD_TREN */
        outb_p(inb(swc_base_addr + WDCFG) | 0x80, swc_base_addr + WDCFG);
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX "Enable SW_WD_TREN\n");
 +      pr_info(DPFX "Enable SW_WD_TREN\n");
  #endif
  }
  
@@@ -189,7 -187,7 +188,7 @@@ static inline void pc87413_disable_sw_w
        /* Disable SW_WD_TREN */
        outb_p(inb(swc_base_addr + WDCFG) & 0x7f, swc_base_addr + WDCFG);
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX "pc87413 - Disable SW_WD_TREN\n");
 +      pr_info(DPFX "pc87413 - Disable SW_WD_TREN\n");
  #endif
  }
  
@@@ -200,7 -198,7 +199,7 @@@ static inline void pc87413_enable_sw_wd
        /* Enable SW_WD_TRG */
        outb_p(inb(swc_base_addr + WDCTL) | 0x80, swc_base_addr + WDCTL);
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX "pc87413 - Enable SW_WD_TRG\n");
 +      pr_info(DPFX "pc87413 - Enable SW_WD_TRG\n");
  #endif
  }
  
@@@ -211,7 -209,7 +210,7 @@@ static inline void pc87413_disable_sw_w
        /* Disable SW_WD_TRG */
        outb_p(inb(swc_base_addr + WDCTL) & 0x7f, swc_base_addr + WDCTL);
  #ifdef DEBUG
 -      printk(KERN_INFO DPFX "Disable SW_WD_TRG\n");
 +      pr_info(DPFX "Disable SW_WD_TRG\n");
  #endif
  }
  
@@@ -285,7 -283,8 +284,7 @@@ static int pc87413_open(struct inode *i
        /* Reload and activate timer */
        pc87413_refresh();
  
 -      printk(KERN_INFO MODNAME
 -              "Watchdog enabled. Timeout set to %d minute(s).\n", timeout);
 +      pr_info("Watchdog enabled. Timeout set to %d minute(s).\n", timeout);
  
        return nonseekable_open(inode, file);
  }
@@@ -308,9 -307,11 +307,9 @@@ static int pc87413_release(struct inod
  
        if (expect_close == 42) {
                pc87413_disable();
 -              printk(KERN_INFO MODNAME
 -                              "Watchdog disabled, sleeping again...\n");
 +              pr_info("Watchdog disabled, sleeping again...\n");
        } else {
 -              printk(KERN_CRIT MODNAME
 -                              "Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
                pc87413_refresh();
        }
        clear_bit(0, &timer_enabled);
@@@ -426,7 -427,7 +425,7 @@@ static long pc87413_ioctl(struct file *
        case WDIOC_KEEPALIVE:
                pc87413_refresh();
  #ifdef DEBUG
 -              printk(KERN_INFO DPFX "keepalive\n");
 +              pr_info(DPFX "keepalive\n");
  #endif
                return 0;
        case WDIOC_SETTIMEOUT:
@@@ -506,7 -507,7 +505,7 @@@ static int __init pc87413_init(void
  {
        int ret;
  
 -      printk(KERN_INFO PFX "Version " VERSION " at io 0x%X\n",
 +      pr_info("Version " VERSION " at io 0x%X\n",
                                                        WDT_INDEX_IO_PORT);
  
        if (!request_muxed_region(io, 2, MODNAME))
  
        ret = register_reboot_notifier(&pc87413_notifier);
        if (ret != 0) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", ret);
 +              pr_err("cannot register reboot notifier (err=%d)\n", ret);
        }
  
        ret = misc_register(&pc87413_miscdev);
        if (ret != 0) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                      WATCHDOG_MINOR, ret);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     WATCHDOG_MINOR, ret);
                goto reboot_unreg;
        }
 -      printk(KERN_INFO PFX "initialized. timeout=%d min \n", timeout);
 +      pr_info("initialized. timeout=%d min\n", timeout);
  
        pc87413_select_wdt_out();
        pc87413_enable_swc();
        pc87413_get_swc_base_addr();
  
        if (!request_region(swc_base_addr, 0x20, MODNAME)) {
 -              printk(KERN_ERR PFX
 -                      "cannot request SWC region at 0x%x\n", swc_base_addr);
 +              pr_err("cannot request SWC region at 0x%x\n", swc_base_addr);
                ret = -EBUSY;
                goto misc_unreg;
        }
@@@ -563,14 -567,14 +562,14 @@@ static void __exit pc87413_exit(void
        /* Stop the timer before we leave */
        if (!nowayout) {
                pc87413_disable();
 -              printk(KERN_INFO MODNAME "Watchdog disabled.\n");
 +              pr_info("Watchdog disabled\n");
        }
  
        misc_deregister(&pc87413_miscdev);
        unregister_reboot_notifier(&pc87413_notifier);
        release_region(swc_base_addr, 0x20);
  
 -      printk(KERN_INFO MODNAME " watchdog component driver removed.\n");
 +      pr_info("watchdog component driver removed\n");
  }
  
  module_init(pc87413_init);
@@@ -592,7 -596,7 +591,7 @@@ MODULE_PARM_DESC(timeout
                "Watchdog timeout in minutes (default="
                                __MODULE_STRING(DEFAULT_TIMEOUT) ").");
  
 -module_param(nowayout, int, 0);
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -48,8 -48,6 +48,8 @@@
   *
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -65,7 -63,6 +65,6 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  #define OUR_NAME "sbc60xxwdt"
  #define PFX OUR_NAME ": "
@@@ -107,8 -104,8 +106,8 @@@ MODULE_PARM_DESC(timeout
        "Watchdog timeout in seconds. (1<=timeout<=3600, default="
                                __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
        "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -134,7 -131,8 +133,7 @@@ static void wdt_timer_ping(unsigned lon
                /* Re-set the timer interval */
                mod_timer(&timer, jiffies + WDT_INTERVAL);
        } else
 -              printk(KERN_WARNING PFX
 -                      "Heartbeat lost! Will not ping the watchdog\n");
 +              pr_warn("Heartbeat lost! Will not ping the watchdog\n");
  }
  
  /*
@@@ -147,7 -145,7 +146,7 @@@ static void wdt_startup(void
  
        /* Start the timer */
        mod_timer(&timer, jiffies + WDT_INTERVAL);
 -      printk(KERN_INFO PFX "Watchdog timer is now enabled.\n");
 +      pr_info("Watchdog timer is now enabled\n");
  }
  
  static void wdt_turnoff(void)
        /* Stop the timer */
        del_timer(&timer);
        inb_p(wdt_stop);
 -      printk(KERN_INFO PFX "Watchdog timer is now disabled...\n");
 +      pr_info("Watchdog timer is now disabled...\n");
  }
  
  static void wdt_keepalive(void)
@@@ -218,7 -216,8 +217,7 @@@ static int fop_close(struct inode *inod
                wdt_turnoff();
        else {
                del_timer(&timer);
 -              printk(KERN_CRIT PFX
 -                "device file closed unexpectedly. Will not stop the WDT!\n");
 +              pr_crit("device file closed unexpectedly. Will not stop the WDT!\n");
        }
        clear_bit(0, &wdt_is_open);
        wdt_expect_close = 0;
@@@ -335,12 -334,14 +334,12 @@@ static int __init sbc60xxwdt_init(void
  
        if (timeout < 1 || timeout > 3600) { /* arbitrary upper limit */
                timeout = WATCHDOG_TIMEOUT;
 -              printk(KERN_INFO PFX
 -                      "timeout value must be 1 <= x <= 3600, using %d\n",
 -                                                              timeout);
 +              pr_info("timeout value must be 1 <= x <= 3600, using %d\n",
 +                      timeout);
        }
  
        if (!request_region(wdt_start, 1, "SBC 60XX WDT")) {
 -              printk(KERN_ERR PFX "I/O address 0x%04x already in use\n",
 -                      wdt_start);
 +              pr_err("I/O address 0x%04x already in use\n", wdt_start);
                rc = -EIO;
                goto err_out;
        }
        /* We cannot reserve 0x45 - the kernel already has! */
        if (wdt_stop != 0x45 && wdt_stop != wdt_start) {
                if (!request_region(wdt_stop, 1, "SBC 60XX WDT")) {
 -                      printk(KERN_ERR PFX
 -                              "I/O address 0x%04x already in use\n",
 -                                                      wdt_stop);
 +                      pr_err("I/O address 0x%04x already in use\n", wdt_stop);
                        rc = -EIO;
                        goto err_out_region1;
                }
  
        rc = register_reboot_notifier(&wdt_notifier);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", rc);
 +              pr_err("cannot register reboot notifier (err=%d)\n", rc);
                goto err_out_region2;
        }
  
        rc = misc_register(&wdt_miscdev);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                              wdt_miscdev.minor, rc);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     wdt_miscdev.minor, rc);
                goto err_out_reboot;
        }
 -      printk(KERN_INFO PFX
 -              "WDT driver for 60XX single board computer initialised. "
 -              "timeout=%d sec (nowayout=%d)\n", timeout, nowayout);
 +      pr_info("WDT driver for 60XX single board computer initialised. timeout=%d sec (nowayout=%d)\n",
 +              timeout, nowayout);
  
        return 0;
  
@@@ -16,8 -16,6 +16,8 @@@
   *
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/fs.h>
  #include <linux/init.h>
  #include <linux/ioport.h>
@@@ -32,8 -30,9 +32,7 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  #include <linux/atomic.h>
- #include <asm/system.h>
  
 -#define SBC7240_PREFIX "sbc7240_wdt: "
 -
  #define SBC7240_ENABLE_PORT           0x443
  #define SBC7240_DISABLE_PORT          0x043
  #define SBC7240_SET_TIMEOUT_PORT      SBC7240_ENABLE_PORT
@@@ -47,8 -46,8 +46,8 @@@ MODULE_PARM_DESC(timeout, "Watchdog tim
                 __MODULE_STRING(SBC7240_MAX_TIMEOUT) ", default="
                 __MODULE_STRING(SBC7240_TIMEOUT) ")");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout, "Disable watchdog when closing device file");
  
  #define SBC7240_OPEN_STATUS_BIT               0
@@@ -65,7 -64,8 +64,7 @@@ static void wdt_disable(void
        /* disable the watchdog */
        if (test_and_clear_bit(SBC7240_ENABLED_STATUS_BIT, &wdt_status)) {
                inb_p(SBC7240_DISABLE_PORT);
 -              printk(KERN_INFO SBC7240_PREFIX
 -                     "Watchdog timer is now disabled.\n");
 +              pr_info("Watchdog timer is now disabled\n");
        }
  }
  
@@@ -74,20 -74,23 +73,20 @@@ static void wdt_enable(void
        /* enable the watchdog */
        if (!test_and_set_bit(SBC7240_ENABLED_STATUS_BIT, &wdt_status)) {
                inb_p(SBC7240_ENABLE_PORT);
 -              printk(KERN_INFO SBC7240_PREFIX
 -                     "Watchdog timer is now enabled.\n");
 +              pr_info("Watchdog timer is now enabled\n");
        }
  }
  
  static int wdt_set_timeout(int t)
  {
        if (t < 1 || t > SBC7240_MAX_TIMEOUT) {
 -              printk(KERN_ERR SBC7240_PREFIX
 -                     "timeout value must be 1<=x<=%d\n",
 -                     SBC7240_MAX_TIMEOUT);
 +              pr_err("timeout value must be 1<=x<=%d\n", SBC7240_MAX_TIMEOUT);
                return -1;
        }
        /* set the timeout */
        outb_p((unsigned)t, SBC7240_SET_TIMEOUT_PORT);
        timeout = t;
 -      printk(KERN_INFO SBC7240_PREFIX "timeout set to %d seconds\n", t);
 +      pr_info("timeout set to %d seconds\n", t);
        return 0;
  }
  
@@@ -146,7 -149,8 +145,7 @@@ static int fop_close(struct inode *inod
            || !nowayout) {
                wdt_disable();
        } else {
 -              printk(KERN_CRIT SBC7240_PREFIX
 -                     "Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
                wdt_keepalive();
        }
  
@@@ -247,7 -251,7 +246,7 @@@ static struct notifier_block wdt_notifi
  
  static void __exit sbc7240_wdt_unload(void)
  {
 -      printk(KERN_INFO SBC7240_PREFIX "Removing watchdog\n");
 +      pr_info("Removing watchdog\n");
        misc_deregister(&wdt_miscdev);
  
        unregister_reboot_notifier(&wdt_notifier);
@@@ -259,7 -263,8 +258,7 @@@ static int __init sbc7240_wdt_init(void
        int rc = -EBUSY;
  
        if (!request_region(SBC7240_ENABLE_PORT, 1, "SBC7240 WDT")) {
 -              printk(KERN_ERR SBC7240_PREFIX
 -                     "I/O address 0x%04x already in use\n",
 +              pr_err("I/O address 0x%04x already in use\n",
                       SBC7240_ENABLE_PORT);
                rc = -EIO;
                goto err_out;
  
        if (timeout < 1 || timeout > SBC7240_MAX_TIMEOUT) {
                timeout = SBC7240_TIMEOUT;
 -              printk(KERN_INFO SBC7240_PREFIX
 -                     "timeout value must be 1<=x<=%d, using %d\n",
 -                     SBC7240_MAX_TIMEOUT, timeout);
 +              pr_info("timeout value must be 1<=x<=%d, using %d\n",
 +                      SBC7240_MAX_TIMEOUT, timeout);
        }
        wdt_set_timeout(timeout);
        wdt_disable();
  
        rc = register_reboot_notifier(&wdt_notifier);
        if (rc) {
 -              printk(KERN_ERR SBC7240_PREFIX
 -                     "cannot register reboot notifier (err=%d)\n", rc);
 +              pr_err("cannot register reboot notifier (err=%d)\n", rc);
                goto err_out_region;
        }
  
        rc = misc_register(&wdt_miscdev);
        if (rc) {
 -              printk(KERN_ERR SBC7240_PREFIX
 -                     "cannot register miscdev on minor=%d (err=%d)\n",
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
                       wdt_miscdev.minor, rc);
                goto err_out_reboot_notifier;
        }
  
 -      printk(KERN_INFO SBC7240_PREFIX
 -             "Watchdog driver for SBC7240 initialised (nowayout=%d)\n",
 -             nowayout);
 +      pr_info("Watchdog driver for SBC7240 initialised (nowayout=%d)\n",
 +              nowayout);
  
        return 0;
  
@@@ -36,8 -36,6 +36,8 @@@
   *
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/types.h>
  #include <linux/miscdevice.h>
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  static unsigned long sbc8360_is_open;
  static char expect_close;
  
 -#define PFX "sbc8360: "
 -
  /*
   *
   * Watchdog Timer Configuration
@@@ -197,11 -196,11 +196,11 @@@ static int wd_times[64][2] = 
  static int timeout = 27;
  static int wd_margin = 0xB;
  static int wd_multiplier = 2;
 -static int nowayout = WATCHDOG_NOWAYOUT;
 +static bool nowayout = WATCHDOG_NOWAYOUT;
  
  module_param(timeout, int, 0);
  MODULE_PARM_DESC(timeout, "Index into timeout table (0-63) (default=27 (60s))");
 -module_param(nowayout, int, 0);
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                 "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -280,7 -279,8 +279,7 @@@ static int sbc8360_close(struct inode *
        if (expect_close == 42)
                sbc8360_stop();
        else
 -              printk(KERN_CRIT PFX "SBC8360 device closed unexpectedly.  "
 -                                              "SBC8360 will not stop!\n");
 +              pr_crit("SBC8360 device closed unexpectedly.  SBC8360 will not stop!\n");
  
        clear_bit(0, &sbc8360_is_open);
        expect_close = 0;
@@@ -333,19 -333,20 +332,19 @@@ static int __init sbc8360_init(void
        unsigned long int mseconds = 60000;
  
        if (timeout < 0 || timeout > 63) {
 -              printk(KERN_ERR PFX "Invalid timeout index (must be 0-63).\n");
 +              pr_err("Invalid timeout index (must be 0-63)\n");
                res = -EINVAL;
                goto out;
        }
  
        if (!request_region(SBC8360_ENABLE, 1, "SBC8360")) {
 -              printk(KERN_ERR PFX "ENABLE method I/O %X is not available.\n",
 +              pr_err("ENABLE method I/O %X is not available\n",
                       SBC8360_ENABLE);
                res = -EIO;
                goto out;
        }
        if (!request_region(SBC8360_BASETIME, 1, "SBC8360")) {
 -              printk(KERN_ERR PFX
 -                     "BASETIME method I/O %X is not available.\n",
 +              pr_err("BASETIME method I/O %X is not available\n",
                       SBC8360_BASETIME);
                res = -EIO;
                goto out_nobasetimereg;
  
        res = register_reboot_notifier(&sbc8360_notifier);
        if (res) {
 -              printk(KERN_ERR PFX "Failed to register reboot notifier.\n");
 +              pr_err("Failed to register reboot notifier\n");
                goto out_noreboot;
        }
  
        res = misc_register(&sbc8360_miscdev);
        if (res) {
 -              printk(KERN_ERR PFX "failed to register misc device\n");
 +              pr_err("failed to register misc device\n");
                goto out_nomisc;
        }
  
                mseconds = (wd_margin + 1) * 100000;
  
        /* My kingdom for the ability to print "0.5 seconds" in the kernel! */
 -      printk(KERN_INFO PFX "Timeout set at %ld ms.\n", mseconds);
 +      pr_info("Timeout set at %ld ms\n", mseconds);
  
        return 0;
  
@@@ -25,9 -25,8 +25,8 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 +static bool nowayout = WATCHDOG_NOWAYOUT;
  static unsigned int margin = 60;      /* (secs) Default is 1 minute */
  static unsigned long wdt_status;
  static DEFINE_MUTEX(wdt_lock);
@@@ -171,7 -170,8 +170,7 @@@ static int fitpc2_wdt_release(struct in
                wdt_disable();
                pr_info("Device disabled\n");
        } else {
 -              pr_warning("Device closed unexpectedly -"
 -                      " timer will not stop\n");
 +              pr_warn("Device closed unexpectedly - timer will not stop\n");
                wdt_enable();
        }
  
@@@ -221,8 -221,8 +220,8 @@@ static int __init fitpc2_wdt_init(void
        }
  
        if (margin < 31 || margin > 255) {
 -              pr_err("margin must be in range 31 - 255"
 -                     " seconds, you tried to set %d\n", margin);
 +              pr_err("margin must be in range 31 - 255 seconds, you tried to set %d\n",
 +                     margin);
                err = -EINVAL;
                goto err_margin;
        }
        err = misc_register(&fitpc2_wdt_miscdev);
        if (err) {
                pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 -                                                      WATCHDOG_MINOR, err);
 +                     WATCHDOG_MINOR, err);
                goto err_margin;
        }
  
@@@ -260,7 -260,7 +259,7 @@@ MODULE_DESCRIPTION("SBC-FITPC2 Watchdog
  module_param(margin, int, 0);
  MODULE_PARM_DESC(margin, "Watchdog margin in seconds (default 60s)");
  
 -module_param(nowayout, int, 0);
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started");
  
  MODULE_LICENSE("GPL");
@@@ -52,8 -52,6 +52,8 @@@
   *  This driver uses memory mapped IO, and spinlock.
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
 -#define OUR_NAME "sc520_wdt"
 -#define PFX OUR_NAME ": "
 -
  /*
   * The AMD Elan SC520 timeout value is 492us times a power of 2 (0-7)
   *
@@@ -97,8 -97,8 +96,8 @@@ MODULE_PARM_DESC(timeout
        "Watchdog timeout in seconds. (1 <= timeout <= 3600, default="
                                __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -150,7 -150,8 +149,7 @@@ static void wdt_timer_ping(unsigned lon
                /* Re-set the timer interval */
                mod_timer(&timer, jiffies + WDT_INTERVAL);
        } else
 -              printk(KERN_WARNING PFX
 -                      "Heartbeat lost! Will not ping the watchdog\n");
 +              pr_warn("Heartbeat lost! Will not ping the watchdog\n");
  }
  
  /*
@@@ -185,7 -186,7 +184,7 @@@ static int wdt_startup(void
        /* Start the watchdog */
        wdt_config(WDT_ENB | WDT_WRST_ENB | WDT_EXP_SEL_04);
  
 -      printk(KERN_INFO PFX "Watchdog timer is now enabled.\n");
 +      pr_info("Watchdog timer is now enabled\n");
        return 0;
  }
  
@@@ -197,7 -198,7 +196,7 @@@ static int wdt_turnoff(void
        /* Stop the watchdog */
        wdt_config(0);
  
 -      printk(KERN_INFO PFX "Watchdog timer is now disabled...\n");
 +      pr_info("Watchdog timer is now disabled...\n");
        return 0;
  }
  
@@@ -268,7 -269,8 +267,7 @@@ static int fop_close(struct inode *inod
        if (wdt_expect_close == 42)
                wdt_turnoff();
        else {
 -              printk(KERN_CRIT PFX
 -                      "Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
                wdt_keepalive();
        }
        clear_bit(0, &wdt_is_open);
@@@ -390,32 -392,36 +389,32 @@@ static int __init sc520_wdt_init(void
           if not reset to the default */
        if (wdt_set_heartbeat(timeout)) {
                wdt_set_heartbeat(WATCHDOG_TIMEOUT);
 -              printk(KERN_INFO PFX
 -                  "timeout value must be 1 <= timeout <= 3600, using %d\n",
 -                                                      WATCHDOG_TIMEOUT);
 +              pr_info("timeout value must be 1 <= timeout <= 3600, using %d\n",
 +                      WATCHDOG_TIMEOUT);
        }
  
        wdtmrctl = ioremap(MMCR_BASE + OFFS_WDTMRCTL, 2);
        if (!wdtmrctl) {
 -              printk(KERN_ERR PFX "Unable to remap memory\n");
 +              pr_err("Unable to remap memory\n");
                rc = -ENOMEM;
                goto err_out_region2;
        }
  
        rc = register_reboot_notifier(&wdt_notifier);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", rc);
 +              pr_err("cannot register reboot notifier (err=%d)\n", rc);
                goto err_out_ioremap;
        }
  
        rc = misc_register(&wdt_miscdev);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                                      WATCHDOG_MINOR, rc);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     WATCHDOG_MINOR, rc);
                goto err_out_notifier;
        }
  
 -      printk(KERN_INFO PFX
 -         "WDT driver for SC520 initialised. timeout=%d sec (nowayout=%d)\n",
 -                                                      timeout, nowayout);
 +      pr_info("WDT driver for SC520 initialised. timeout=%d sec (nowayout=%d)\n",
 +              timeout, nowayout);
  
        return 0;
  
@@@ -43,8 -43,6 +43,8 @@@
   *   Documentation/watchdog/wdt.txt
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -60,7 -58,6 +60,6 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  /* enable support for minutes as units? */
  /* (does not always work correctly, so disabled by default!) */
@@@ -72,6 -69,7 +71,6 @@@
  #define UNIT_SECOND     0
  #define UNIT_MINUTE     1
  
 -#define MODNAME               "smsc37b787_wdt: "
  #define VERSION               "1.1"
  
  #define IOPORT                0x3F0
@@@ -86,7 -84,7 +85,7 @@@ static char expect_close;       /* is t
  
  static DEFINE_SPINLOCK(io_lock);/* to guard the watchdog from io races */
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 +static bool nowayout = WATCHDOG_NOWAYOUT;
  
  /* -- Low level function ----------------------------------------*/
  
@@@ -364,7 -362,8 +363,7 @@@ static int wb_smsc_wdt_open(struct inod
        /* Reload and activate timer */
        wb_smsc_wdt_enable();
  
 -      printk(KERN_INFO MODNAME
 -              "Watchdog enabled. Timeout set to %d %s.\n",
 +      pr_info("Watchdog enabled. Timeout set to %d %s\n",
                timeout, (unit == UNIT_SECOND) ? "second(s)" : "minute(s)");
  
        return nonseekable_open(inode, file);
@@@ -378,9 -377,11 +377,9 @@@ static int wb_smsc_wdt_release(struct i
  
        if (expect_close == 42) {
                wb_smsc_wdt_disable();
 -              printk(KERN_INFO MODNAME
 -                              "Watchdog disabled, sleeping again...\n");
 +              pr_info("Watchdog disabled, sleeping again...\n");
        } else {
 -              printk(KERN_CRIT MODNAME
 -                              "Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
                wb_smsc_wdt_reset_timer();
        }
  
@@@ -532,11 -533,12 +531,11 @@@ static int __init wb_smsc_wdt_init(void
  {
        int ret;
  
 -      printk(KERN_INFO "SMsC 37B787 watchdog component driver "
 -                                      VERSION " initialising...\n");
 +      pr_info("SMsC 37B787 watchdog component driver "
 +              VERSION " initialising...\n");
  
        if (!request_region(IOPORT, IOPORT_SIZE, "SMsC 37B787 watchdog")) {
 -              printk(KERN_ERR MODNAME "Unable to register IO port %#x\n",
 -                                                              IOPORT);
 +              pr_err("Unable to register IO port %#x\n", IOPORT);
                ret = -EBUSY;
                goto out_pnp;
        }
  
        ret = register_reboot_notifier(&wb_smsc_wdt_notifier);
        if (ret) {
 -              printk(KERN_ERR MODNAME
 -                      "Unable to register reboot notifier err = %d\n", ret);
 +              pr_err("Unable to register reboot notifier err = %d\n", ret);
                goto out_io;
        }
  
        ret = misc_register(&wb_smsc_wdt_miscdev);
        if (ret) {
 -              printk(KERN_ERR MODNAME
 -                      "Unable to register miscdev on minor %d\n",
 -                                                      WATCHDOG_MINOR);
 +              pr_err("Unable to register miscdev on minor %d\n",
 +                     WATCHDOG_MINOR);
                goto out_rbt;
        }
  
        /* output info */
 -      printk(KERN_INFO MODNAME "Timeout set to %d %s.\n",
 +      pr_info("Timeout set to %d %s\n",
                timeout, (unit == UNIT_SECOND) ? "second(s)" : "minute(s)");
 -      printk(KERN_INFO MODNAME
 -              "Watchdog initialized and sleeping (nowayout=%d)...\n",
 -                                                              nowayout);
 +      pr_info("Watchdog initialized and sleeping (nowayout=%d)...\n",
 +              nowayout);
  out_clean:
        return ret;
  
@@@ -586,14 -591,14 +585,14 @@@ static void __exit wb_smsc_wdt_exit(voi
        /* Stop the timer before we leave */
        if (!nowayout) {
                wb_smsc_wdt_shutdown();
 -              printk(KERN_INFO MODNAME "Watchdog disabled.\n");
 +              pr_info("Watchdog disabled\n");
        }
  
        misc_deregister(&wb_smsc_wdt_miscdev);
        unregister_reboot_notifier(&wb_smsc_wdt_notifier);
        release_region(IOPORT, IOPORT_SIZE);
  
 -      printk(KERN_INFO "SMsC 37B787 watchdog component driver removed.\n");
 +      pr_info("SMsC 37B787 watchdog component driver removed\n");
  }
  
  module_init(wb_smsc_wdt_init);
@@@ -615,7 -620,7 +614,7 @@@ MODULE_PARM_DESC(unit
  module_param(timeout, int, 0);
  MODULE_PARM_DESC(timeout, "range is 1-255 units, default is 60");
  
 -module_param(nowayout, int, 0);
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -26,8 -26,6 +26,8 @@@
   *    (c) Copyright 1995    Alan Cox <alan@lxorguk.ukuu.org.uk>
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -42,9 -40,9 +42,8 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  #define WATCHDOG_NAME "w83627hf/thf/hg/dhg WDT"
 -#define PFX WATCHDOG_NAME ": "
  #define WATCHDOG_TIMEOUT 60           /* 60 sec default timeout */
  
  static unsigned long wdt_is_open;
@@@ -62,8 -60,8 +61,8 @@@ MODULE_PARM_DESC(timeout
                "Watchdog timeout in seconds. 1 <= timeout <= 255, default="
                                __MODULE_STRING(WATCHDOG_TIMEOUT) ".");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -120,8 -118,9 +119,8 @@@ static void w83627hf_init(void
        outb_p(0xF6, WDT_EFER); /* Select CRF6 */
        t = inb_p(WDT_EFDR);      /* read CRF6 */
        if (t != 0) {
 -              printk(KERN_INFO PFX
 -                   "Watchdog already running. Resetting timeout to %d sec\n",
 -                                                              timeout);
 +              pr_info("Watchdog already running. Resetting timeout to %d sec\n",
 +                      timeout);
                outb_p(timeout, WDT_EFDR);    /* Write back to CRF6 */
        }
  
@@@ -290,7 -289,8 +289,7 @@@ static int wdt_close(struct inode *inod
        if (expect_close == 42)
                wdt_disable();
        else {
 -              printk(KERN_CRIT PFX
 -                      "Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
                wdt_ping();
        }
        expect_close = 0;
@@@ -343,16 -343,18 +342,16 @@@ static int __init wdt_init(void
  {
        int ret;
  
 -      printk(KERN_INFO "WDT driver for the Winbond(TM) W83627HF/THF/HG/DHG Super I/O chip initialising.\n");
 +      pr_info("WDT driver for the Winbond(TM) W83627HF/THF/HG/DHG Super I/O chip initialising\n");
  
        if (wdt_set_heartbeat(timeout)) {
                wdt_set_heartbeat(WATCHDOG_TIMEOUT);
 -              printk(KERN_INFO PFX
 -                   "timeout value must be 1 <= timeout <= 255, using %d\n",
 -                              WATCHDOG_TIMEOUT);
 +              pr_info("timeout value must be 1 <= timeout <= 255, using %d\n",
 +                      WATCHDOG_TIMEOUT);
        }
  
        if (!request_region(wdt_io, 1, WATCHDOG_NAME)) {
 -              printk(KERN_ERR PFX "I/O address 0x%04x already in use\n",
 -                      wdt_io);
 +              pr_err("I/O address 0x%04x already in use\n", wdt_io);
                ret = -EIO;
                goto out;
        }
  
        ret = register_reboot_notifier(&wdt_notifier);
        if (ret != 0) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", ret);
 +              pr_err("cannot register reboot notifier (err=%d)\n", ret);
                goto unreg_regions;
        }
  
        ret = misc_register(&wdt_miscdev);
        if (ret != 0) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                                      WATCHDOG_MINOR, ret);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     WATCHDOG_MINOR, ret);
                goto unreg_reboot;
        }
  
 -      printk(KERN_INFO PFX
 -                      "initialized. timeout=%d sec (nowayout=%d)\n",
 -                                                      timeout, nowayout);
 +      pr_info("initialized. timeout=%d sec (nowayout=%d)\n",
 +              timeout, nowayout);
  
  out:
        return ret;
@@@ -25,8 -25,6 +25,8 @@@
   *    "AS-IS" and at no charge.
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -41,9 -39,9 +41,8 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  #define WATCHDOG_NAME "w83697hf/hg WDT"
 -#define PFX WATCHDOG_NAME ": "
  #define WATCHDOG_TIMEOUT 60           /* 60 sec default timeout */
  #define WATCHDOG_EARLY_DISABLE 1      /* Disable until userland kicks in */
  
@@@ -63,8 -61,8 +62,8 @@@ MODULE_PARM_DESC(timeout
        "Watchdog timeout in seconds. 1<= timeout <=255 (default="
                                __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
        "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -310,7 -308,8 +309,7 @@@ static int wdt_close(struct inode *inod
        if (expect_close == 42)
                wdt_disable();
        else {
 -              printk(KERN_CRIT PFX
 -                      "Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
                wdt_ping();
        }
        expect_close = 0;
@@@ -362,21 -361,24 +361,21 @@@ static struct notifier_block wdt_notifi
  static int w83697hf_check_wdt(void)
  {
        if (!request_region(wdt_io, 2, WATCHDOG_NAME)) {
 -              printk(KERN_ERR PFX
 -                      "I/O address 0x%x already in use\n", wdt_io);
 +              pr_err("I/O address 0x%x already in use\n", wdt_io);
                return -EIO;
        }
  
 -      printk(KERN_DEBUG PFX
 -                      "Looking for watchdog at address 0x%x\n", wdt_io);
 +      pr_debug("Looking for watchdog at address 0x%x\n", wdt_io);
        w83697hf_unlock();
        if (w83697hf_get_reg(0x20) == 0x60) {
 -              printk(KERN_INFO PFX
 -                      "watchdog found at address 0x%x\n", wdt_io);
 +              pr_info("watchdog found at address 0x%x\n", wdt_io);
                w83697hf_lock();
                return 0;
        }
        /* Reprotect in case it was a compatible device */
        w83697hf_lock();
  
 -      printk(KERN_INFO PFX "watchdog not found at address 0x%x\n", wdt_io);
 +      pr_info("watchdog not found at address 0x%x\n", wdt_io);
        release_region(wdt_io, 2);
        return -EIO;
  }
@@@ -387,7 -389,7 +386,7 @@@ static int __init wdt_init(void
  {
        int ret, i, found = 0;
  
 -      printk(KERN_INFO PFX "WDT driver for W83697HF/HG initializing\n");
 +      pr_info("WDT driver for W83697HF/HG initializing\n");
  
        if (wdt_io == 0) {
                /* we will autodetect the W83697HF/HG watchdog */
        }
  
        if (!found) {
 -              printk(KERN_ERR PFX "No W83697HF/HG could be found\n");
 +              pr_err("No W83697HF/HG could be found\n");
                ret = -EIO;
                goto out;
        }
        w83697hf_init();
        if (early_disable) {
                if (wdt_running())
 -                      printk(KERN_WARNING PFX "Stopping previously enabled "
 -                                      "watchdog until userland kicks in\n");
 +                      pr_warn("Stopping previously enabled watchdog until userland kicks in\n");
                wdt_disable();
        }
  
        if (wdt_set_heartbeat(timeout)) {
                wdt_set_heartbeat(WATCHDOG_TIMEOUT);
 -              printk(KERN_INFO PFX
 -                   "timeout value must be 1 <= timeout <= 255, using %d\n",
 -                                                      WATCHDOG_TIMEOUT);
 +              pr_info("timeout value must be 1 <= timeout <= 255, using %d\n",
 +                      WATCHDOG_TIMEOUT);
        }
  
        ret = register_reboot_notifier(&wdt_notifier);
        if (ret != 0) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", ret);
 +              pr_err("cannot register reboot notifier (err=%d)\n", ret);
                goto unreg_regions;
        }
  
        ret = misc_register(&wdt_miscdev);
        if (ret != 0) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                              WATCHDOG_MINOR, ret);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     WATCHDOG_MINOR, ret);
                goto unreg_reboot;
        }
  
 -      printk(KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n",
 +      pr_info("initialized. timeout=%d sec (nowayout=%d)\n",
                timeout, nowayout);
  
  out:
@@@ -30,8 -30,6 +30,8 @@@
   *    (c) Copyright 1995    Alan Cox <alan@redhat.com>
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -46,9 -44,9 +46,8 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  #define WATCHDOG_NAME "w83697ug/uf WDT"
 -#define PFX WATCHDOG_NAME ": "
  #define WATCHDOG_TIMEOUT 60           /* 60 sec default timeout */
  
  static unsigned long wdt_is_open;
@@@ -65,8 -63,8 +64,8 @@@ MODULE_PARM_DESC(timeout
        "Watchdog timeout in seconds. 1<= timeout <=255 (default="
                                __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
        "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -92,8 -90,8 +91,8 @@@ static int w83697ug_select_wd_register(
        version = inb(WDT_EFDR);
  
        if (version == 0x68) {  /* W83697UG             */
 -              printk(KERN_INFO PFX "Watchdog chip version 0x%02x = "
 -                      "W83697UG/UF found at 0x%04x\n", version, wdt_io);
 +              pr_info("Watchdog chip version 0x%02x = W83697UG/UF found at 0x%04x\n",
 +                      version, wdt_io);
  
                outb_p(0x2b, WDT_EFER);
                c = inb_p(WDT_EFDR);    /* select WDT0 */
                outb_p(c, WDT_EFDR);    /* set pin118 to WDT0 */
  
        } else {
 -              printk(KERN_ERR PFX "No W83697UG/UF could be found\n");
 +              pr_err("No W83697UG/UF could be found\n");
                return -ENODEV;
        }
  
@@@ -132,8 -130,8 +131,8 @@@ static int w83697ug_init(void
        outb_p(0xF6, WDT_EFER); /* Select CRF6 */
        t = inb_p(WDT_EFDR);    /* read CRF6 */
        if (t != 0) {
 -              printk(KERN_INFO PFX "Watchdog already running."
 -                      " Resetting timeout to %d sec\n", timeout);
 +              pr_info("Watchdog already running. Resetting timeout to %d sec\n",
 +                      timeout);
                outb_p(timeout, WDT_EFDR);    /* Write back to CRF6 */
        }
        outb_p(0xF5, WDT_EFER); /* Select CRF5 */
@@@ -287,7 -285,8 +286,7 @@@ static int wdt_close(struct inode *inod
        if (expect_close == 42)
                wdt_disable();
        else {
 -              printk(KERN_CRIT PFX
 -                      "Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
                wdt_ping();
        }
        expect_close = 0;
@@@ -340,16 -339,18 +339,16 @@@ static int __init wdt_init(void
  {
        int ret;
  
 -      printk(KERN_INFO "WDT driver for the Winbond(TM) W83697UG/UF Super I/O chip initialising.\n");
 +      pr_info("WDT driver for the Winbond(TM) W83697UG/UF Super I/O chip initialising\n");
  
        if (wdt_set_heartbeat(timeout)) {
                wdt_set_heartbeat(WATCHDOG_TIMEOUT);
 -              printk(KERN_INFO PFX
 -                      "timeout value must be 1<=timeout<=255, using %d\n",
 +              pr_info("timeout value must be 1<=timeout<=255, using %d\n",
                        WATCHDOG_TIMEOUT);
        }
  
        if (!request_region(wdt_io, 1, WATCHDOG_NAME)) {
 -              printk(KERN_ERR PFX "I/O address 0x%04x already in use\n",
 -                      wdt_io);
 +              pr_err("I/O address 0x%04x already in use\n", wdt_io);
                ret = -EIO;
                goto out;
        }
  
        ret = register_reboot_notifier(&wdt_notifier);
        if (ret != 0) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", ret);
 +              pr_err("cannot register reboot notifier (err=%d)\n", ret);
                goto unreg_regions;
        }
  
        ret = misc_register(&wdt_miscdev);
        if (ret != 0) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                      WATCHDOG_MINOR, ret);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     WATCHDOG_MINOR, ret);
                goto unreg_reboot;
        }
  
 -      printk(KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n",
 +      pr_info("initialized. timeout=%d sec (nowayout=%d)\n",
                timeout, nowayout);
  
  out:
@@@ -42,8 -42,6 +42,8 @@@
   *  daemon always getting scheduled within that time frame.
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -58,9 -56,9 +58,8 @@@
  #include <linux/init.h>
  #include <linux/io.h>
  #include <linux/uaccess.h>
- #include <asm/system.h>
  
  #define OUR_NAME "w83877f_wdt"
 -#define PFX OUR_NAME ": "
  
  #define ENABLE_W83877F_PORT 0x3F0
  #define ENABLE_W83877F 0x87
@@@ -92,8 -90,8 +91,8 @@@ MODULE_PARM_DESC(timeout
                                __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
  
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -127,7 -125,8 +126,7 @@@ static void wdt_timer_ping(unsigned lon
                spin_unlock(&wdt_spinlock);
  
        } else
 -              printk(KERN_WARNING PFX
 -                      "Heartbeat lost! Will not ping the watchdog\n");
 +              pr_warn("Heartbeat lost! Will not ping the watchdog\n");
  }
  
  /*
@@@ -165,7 -164,7 +164,7 @@@ static void wdt_startup(void
  
        wdt_change(WDT_ENABLE);
  
 -      printk(KERN_INFO PFX "Watchdog timer is now enabled.\n");
 +      pr_info("Watchdog timer is now enabled\n");
  }
  
  static void wdt_turnoff(void)
  
        wdt_change(WDT_DISABLE);
  
 -      printk(KERN_INFO PFX "Watchdog timer is now disabled...\n");
 +      pr_info("Watchdog timer is now disabled...\n");
  }
  
  static void wdt_keepalive(void)
@@@ -234,7 -233,8 +233,7 @@@ static int fop_close(struct inode *inod
                wdt_turnoff();
        else {
                del_timer(&timer);
 -              printk(KERN_CRIT PFX
 -                "device file closed unexpectedly. Will not stop the WDT!\n");
 +              pr_crit("device file closed unexpectedly. Will not stop the WDT!\n");
        }
        clear_bit(0, &wdt_is_open);
        wdt_expect_close = 0;
@@@ -356,37 -356,42 +355,37 @@@ static int __init w83877f_wdt_init(void
  
        if (timeout < 1 || timeout > 3600) { /* arbitrary upper limit */
                timeout = WATCHDOG_TIMEOUT;
 -              printk(KERN_INFO PFX
 -                      "timeout value must be 1 <= x <= 3600, using %d\n",
 -                                                      timeout);
 +              pr_info("timeout value must be 1 <= x <= 3600, using %d\n",
 +                      timeout);
        }
  
        if (!request_region(ENABLE_W83877F_PORT, 2, "W83877F WDT")) {
 -              printk(KERN_ERR PFX "I/O address 0x%04x already in use\n",
 -                      ENABLE_W83877F_PORT);
 +              pr_err("I/O address 0x%04x already in use\n",
 +                     ENABLE_W83877F_PORT);
                rc = -EIO;
                goto err_out;
        }
  
        if (!request_region(WDT_PING, 1, "W8387FF WDT")) {
 -              printk(KERN_ERR PFX "I/O address 0x%04x already in use\n",
 -                      WDT_PING);
 +              pr_err("I/O address 0x%04x already in use\n", WDT_PING);
                rc = -EIO;
                goto err_out_region1;
        }
  
        rc = register_reboot_notifier(&wdt_notifier);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", rc);
 +              pr_err("cannot register reboot notifier (err=%d)\n", rc);
                goto err_out_region2;
        }
  
        rc = misc_register(&wdt_miscdev);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                                      wdt_miscdev.minor, rc);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     wdt_miscdev.minor, rc);
                goto err_out_reboot;
        }
  
 -      printk(KERN_INFO PFX
 -        "WDT driver for W83877F initialised. timeout=%d sec (nowayout=%d)\n",
 +      pr_info("WDT driver for W83877F initialised. timeout=%d sec (nowayout=%d)\n",
                timeout, nowayout);
  
        return 0;
@@@ -15,8 -15,6 +15,8 @@@
   *
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
  #include <linux/uaccess.h>
  #include <linux/io.h>
  
  
  #define WATCHDOG_VERSION  "1.00"
  #define WATCHDOG_NAME     "W83977F WDT"
 -#define PFX WATCHDOG_NAME ": "
 -#define DRIVER_VERSION    WATCHDOG_NAME " driver, v" WATCHDOG_VERSION "\n"
  
  #define IO_INDEX_PORT     0x3F0
  #define IO_DATA_PORT      (IO_INDEX_PORT+1)
@@@ -59,8 -58,8 +58,8 @@@ MODULE_PARM_DESC(timeout
  module_param(testmode, int, 0);
  MODULE_PARM_DESC(testmode, "Watchdog testmode (1 = no reboot), default=0");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -131,7 -130,7 +130,7 @@@ static int wdt_start(void
  
        spin_unlock_irqrestore(&spinlock, flags);
  
 -      printk(KERN_INFO PFX "activated.\n");
 +      pr_info("activated\n");
  
        return 0;
  }
@@@ -185,7 -184,7 +184,7 @@@ static int wdt_stop(void
  
        spin_unlock_irqrestore(&spinlock, flags);
  
 -      printk(KERN_INFO PFX "shutdown.\n");
 +      pr_info("shutdown\n");
  
        return 0;
  }
@@@ -313,7 -312,8 +312,7 @@@ static int wdt_release(struct inode *in
                clear_bit(0, &timer_alive);
        } else {
                wdt_keepalive();
 -              printk(KERN_CRIT PFX
 -                      "unexpected close, not stopping watchdog!\n");
 +              pr_crit("unexpected close, not stopping watchdog!\n");
        }
        expect_close = 0;
        return 0;
@@@ -470,7 -470,7 +469,7 @@@ static int __init w83977f_wdt_init(void
  {
        int rc;
  
 -      printk(KERN_INFO PFX DRIVER_VERSION);
 +      pr_info("driver v%s\n", WATCHDOG_VERSION);
  
        /*
         * Check that the timeout value is within it's range;
         */
        if (wdt_set_timeout(timeout)) {
                wdt_set_timeout(DEFAULT_TIMEOUT);
 -              printk(KERN_INFO PFX
 -                  "timeout value must be 15 <= timeout <= 7635, using %d\n",
 -                                                      DEFAULT_TIMEOUT);
 +              pr_info("timeout value must be 15 <= timeout <= 7635, using %d\n",
 +                      DEFAULT_TIMEOUT);
        }
  
        if (!request_region(IO_INDEX_PORT, 2, WATCHDOG_NAME)) {
 -              printk(KERN_ERR PFX "I/O address 0x%04x already in use\n",
 -                      IO_INDEX_PORT);
 +              pr_err("I/O address 0x%04x already in use\n", IO_INDEX_PORT);
                rc = -EIO;
                goto err_out;
        }
  
        rc = register_reboot_notifier(&wdt_notifier);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", rc);
 +              pr_err("cannot register reboot notifier (err=%d)\n", rc);
                goto err_out_region;
        }
  
        rc = misc_register(&wdt_miscdev);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                              wdt_miscdev.minor, rc);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     wdt_miscdev.minor, rc);
                goto err_out_reboot;
        }
  
 -      printk(KERN_INFO PFX
 -              "initialized. timeout=%d sec (nowayout=%d testmode=%d)\n",
 -                                      timeout, nowayout, testmode);
 +      pr_info("initialized. timeout=%d sec (nowayout=%d testmode=%d)\n",
 +              timeout, nowayout, testmode);
  
        return 0;
  
diff --combined drivers/watchdog/wdt.c
@@@ -32,8 -32,6 +32,8 @@@
   *            Matt Domsch     :       Added nowayout module option
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/interrupt.h>
  #include <linux/module.h>
  #include <linux/moduleparam.h>
@@@ -48,7 -46,6 +48,6 @@@
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  #include "wd501p.h"
  
  static unsigned long wdt_is_open;
@@@ -67,8 -64,8 +66,8 @@@ 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);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
        "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -254,11 -251,11 +253,11 @@@ static int wdt_get_temperature(void
  static void wdt_decode_501(int status)
  {
        if (!(status & WDC_SR_TGOOD))
 -              printk(KERN_CRIT "Overheat alarm.(%d)\n", inb_p(WDT_RT));
 +              pr_crit("Overheat alarm (%d)\n", inb_p(WDT_RT));
        if (!(status & WDC_SR_PSUOVER))
 -              printk(KERN_CRIT "PSU over voltage.\n");
 +              pr_crit("PSU over voltage\n");
        if (!(status & WDC_SR_PSUUNDR))
 -              printk(KERN_CRIT "PSU under voltage.\n");
 +              pr_crit("PSU under voltage\n");
  }
  
  /**
@@@ -282,25 -279,25 +281,25 @@@ static irqreturn_t wdt_interrupt(int ir
        spin_lock(&wdt_lock);
        status = inb_p(WDT_SR);
  
 -      printk(KERN_CRIT "WDT status %d\n", status);
 +      pr_crit("WDT status %d\n", status);
  
        if (type == 501) {
                wdt_decode_501(status);
                if (tachometer) {
                        if (!(status & WDC_SR_FANGOOD))
 -                              printk(KERN_CRIT "Possible fan fault.\n");
 +                              pr_crit("Possible fan fault\n");
                }
        }
        if (!(status & WDC_SR_WCCR)) {
  #ifdef SOFTWARE_REBOOT
  #ifdef ONLY_TESTING
 -              printk(KERN_CRIT "Would Reboot.\n");
 +              pr_crit("Would Reboot\n");
  #else
 -              printk(KERN_CRIT "Initiating system reboot.\n");
 +              pr_crit("Initiating system reboot\n");
                emergency_restart();
  #endif
  #else
 -              printk(KERN_CRIT "Reset in 5ms.\n");
 +              pr_crit("Reset in 5ms\n");
  #endif
        }
        spin_unlock(&wdt_lock);
@@@ -443,7 -440,8 +442,7 @@@ static int wdt_release(struct inode *in
                wdt_stop();
                clear_bit(0, &wdt_is_open);
        } else {
 -              printk(KERN_CRIT
 -               "wdt: WDT device closed unexpectedly.  WDT will not stop!\n");
 +              pr_crit("WDT device closed unexpectedly.  WDT will not stop!\n");
                wdt_ping();
        }
        expect_close = 0;
@@@ -594,7 -592,7 +593,7 @@@ static int __init wdt_init(void
        int ret;
  
        if (type != 500 && type != 501) {
 -              printk(KERN_ERR "wdt: unknown card type '%d'.\n", type);
 +              pr_err("unknown card type '%d'\n", type);
                return -ENODEV;
        }
  
           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", WD_TIMO);
 +              pr_info("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);
 +              pr_err("I/O address 0x%04x already in use\n", io);
                ret = -EBUSY;
                goto out;
        }
  
        ret = request_irq(irq, wdt_interrupt, 0, "wdt501p", NULL);
        if (ret) {
 -              printk(KERN_ERR "wdt: IRQ %d is not free.\n", irq);
 +              pr_err("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);
 +              pr_err("cannot register reboot notifier (err=%d)\n", ret);
                goto outirq;
        }
  
        if (type == 501) {
                ret = misc_register(&temp_miscdev);
                if (ret) {
 -                      printk(KERN_ERR "wdt: cannot register miscdev "
 -                              "on minor=%d (err=%d)\n", TEMP_MINOR, ret);
 +                      pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                             TEMP_MINOR, ret);
                        goto outrbt;
                }
        }
  
        ret = misc_register(&wdt_miscdev);
        if (ret) {
 -              printk(KERN_ERR
 -                      "wdt: cannot register miscdev on minor=%d (err=%d)\n",
 -                                                      WATCHDOG_MINOR, ret);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     WATCHDOG_MINOR, ret);
                goto outmisc;
        }
  
 -      printk(KERN_INFO "WDT500/501-P driver 0.10 "
 -              "at 0x%04x (Interrupt %d). heartbeat=%d sec (nowayout=%d)\n",
 +      pr_info("WDT500/501-P driver 0.10 at 0x%04x (Interrupt %d). heartbeat=%d sec (nowayout=%d)\n",
                io, irq, heartbeat, nowayout);
        if (type == 501)
 -              printk(KERN_INFO "wdt: Fan Tachometer is %s\n",
 -                              (tachometer ? "Enabled" : "Disabled"));
 +              pr_info("Fan Tachometer is %s\n",
 +                      tachometer ? "Enabled" : "Disabled");
        return 0;
  
  outmisc:
@@@ -16,8 -16,6 +16,8 @@@
   *
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -34,6 -32,7 +34,7 @@@
  #include <mach/hardware.h>
  
  #include <asm/mach-types.h>
+ #include <asm/system_info.h>
  #include <asm/hardware/dec21285.h>
  
  /*
@@@ -51,7 -50,7 +52,7 @@@ static unsigned long timer_alive
   */
  static void watchdog_fire(int irq, void *dev_id)
  {
 -      printk(KERN_CRIT "Watchdog: Would Reboot.\n");
 +      pr_crit("Would Reboot\n");
        *CSR_TIMER4_CNTL = 0;
        *CSR_TIMER4_CLR = 0;
  }
@@@ -207,11 -206,13 +208,11 @@@ static int __init footbridge_watchdog_i
        if (retval < 0)
                return retval;
  
 -      printk(KERN_INFO
 -              "Footbridge Watchdog Timer: 0.01, timer margin: %d sec\n",
 -                                                              soft_margin);
 +      pr_info("Footbridge Watchdog Timer: 0.01, timer margin: %d sec\n",
 +              soft_margin);
  
        if (machine_is_cats())
 -              printk(KERN_WARNING
 -                "Warning: Watchdog reset may not work on this machine.\n");
 +              pr_warn("Warning: Watchdog reset may not work on this machine\n");
        return 0;
  }
  
@@@ -23,8 -23,6 +23,8 @@@
   *                                Netwinders only
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  #include <asm/mach-types.h>
  
  #define WATCHDOG_VERSION  "0.04"
  #define WATCHDOG_NAME     "Wdt977"
 -#define PFX WATCHDOG_NAME ": "
 -#define DRIVER_VERSION    WATCHDOG_NAME " driver, v" WATCHDOG_VERSION "\n"
  
  #define IO_INDEX_PORT 0x370           /* on some systems it can be 0x3F0 */
  #define IO_DATA_PORT  (IO_INDEX_PORT + 1)
@@@ -68,8 -67,8 +67,8 @@@ MODULE_PARM_DESC(timeout, "Watchdog tim
  module_param(testmode, int, 0);
  MODULE_PARM_DESC(testmode, "Watchdog testmode (1 = no reboot), default=0");
  
 -static int nowayout = WATCHDOG_NOWAYOUT;
 -module_param(nowayout, int, 0);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -119,7 -118,7 +118,7 @@@ static int wdt977_start(void
        outb_p(LOCK_DATA, IO_INDEX_PORT);
  
        spin_unlock_irqrestore(&spinlock, flags);
 -      printk(KERN_INFO PFX "activated.\n");
 +      pr_info("activated\n");
  
        return 0;
  }
@@@ -164,7 -163,7 +163,7 @@@ static int wdt977_stop(void
        outb_p(LOCK_DATA, IO_INDEX_PORT);
  
        spin_unlock_irqrestore(&spinlock, flags);
 -      printk(KERN_INFO PFX "shutdown.\n");
 +      pr_info("shutdown\n");
  
        return 0;
  }
@@@ -288,7 -287,8 +287,7 @@@ static int wdt977_release(struct inode 
                clear_bit(0, &timer_alive);
        } else {
                wdt977_keepalive();
 -              printk(KERN_CRIT PFX
 -                      "Unexpected close, not stopping watchdog!\n");
 +              pr_crit("Unexpected close, not stopping watchdog!\n");
        }
        expect_close = 0;
        return 0;
@@@ -445,14 -445,15 +444,14 @@@ static int __init wd977_init(void
  {
        int rc;
  
 -      printk(KERN_INFO PFX DRIVER_VERSION);
 +      pr_info("driver v%s\n", WATCHDOG_VERSION);
  
        /* Check that the timeout value is within its range;
           if not reset to the default */
        if (wdt977_set_timeout(timeout)) {
                wdt977_set_timeout(DEFAULT_TIMEOUT);
 -              printk(KERN_INFO PFX
 -                    "timeout value must be 60 < timeout < 15300, using %d\n",
 -                                                      DEFAULT_TIMEOUT);
 +              pr_info("timeout value must be 60 < timeout < 15300, using %d\n",
 +                      DEFAULT_TIMEOUT);
        }
  
        /* on Netwinder the IOports are already reserved by
         */
        if (!machine_is_netwinder()) {
                if (!request_region(IO_INDEX_PORT, 2, WATCHDOG_NAME)) {
 -                      printk(KERN_ERR PFX
 -                              "I/O address 0x%04x already in use\n",
 -                                                              IO_INDEX_PORT);
 +                      pr_err("I/O address 0x%04x already in use\n",
 +                             IO_INDEX_PORT);
                        rc = -EIO;
                        goto err_out;
                }
  
        rc = register_reboot_notifier(&wdt977_notifier);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", rc);
 +              pr_err("cannot register reboot notifier (err=%d)\n", rc);
                goto err_out_region;
        }
  
        rc = misc_register(&wdt977_miscdev);
        if (rc) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                              wdt977_miscdev.minor, rc);
 +              pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                     wdt977_miscdev.minor, rc);
                goto err_out_reboot;
        }
  
 -      printk(KERN_INFO PFX
 -              "initialized. timeout=%d sec (nowayout=%d, testmode=%i)\n",
 -                                              timeout, nowayout, testmode);
 +      pr_info("initialized. timeout=%d sec (nowayout=%d, testmode=%i)\n",
 +              timeout, nowayout, testmode);
  
        return 0;
  
@@@ -37,8 -37,6 +37,8 @@@
   *            Matt Domsch     :       nowayout module option
   */
  
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 +
  #include <linux/interrupt.h>
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/io.h>
  #include <linux/uaccess.h>
  
- #include <asm/system.h>
  
  #define WDT_IS_PCI
  #include "wd501p.h"
  
 -#define PFX "wdt_pci: "
 -
  /* We can only use 1 card due to the /dev/watchdog restriction */
  static int dev_count;
  
@@@ -80,8 -79,8 +79,8 @@@ 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);
 +static bool nowayout = WATCHDOG_NOWAYOUT;
 +module_param(nowayout, bool, 0);
  MODULE_PARM_DESC(nowayout,
                "Watchdog cannot be stopped once started (default="
                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
@@@ -312,32 -311,33 +311,32 @@@ static irqreturn_t wdtpci_interrupt(in
        status = inb(WDT_SR);
        udelay(8);
  
 -      printk(KERN_CRIT PFX "status %d\n", status);
 +      pr_crit("status %d\n", status);
  
        if (type == 501) {
                if (!(status & WDC_SR_TGOOD)) {
 -                      printk(KERN_CRIT PFX "Overheat alarm.(%d)\n",
 -                                                              inb(WDT_RT));
 +                      pr_crit("Overheat alarm (%d)\n", inb(WDT_RT));
                        udelay(8);
                }
                if (!(status & WDC_SR_PSUOVER))
 -                      printk(KERN_CRIT PFX "PSU over voltage.\n");
 +                      pr_crit("PSU over voltage\n");
                if (!(status & WDC_SR_PSUUNDR))
 -                      printk(KERN_CRIT PFX "PSU under voltage.\n");
 +                      pr_crit("PSU under voltage\n");
                if (tachometer) {
                        if (!(status & WDC_SR_FANGOOD))
 -                              printk(KERN_CRIT PFX "Possible fan fault.\n");
 +                              pr_crit("Possible fan fault\n");
                }
        }
        if (!(status & WDC_SR_WCCR)) {
  #ifdef SOFTWARE_REBOOT
  #ifdef ONLY_TESTING
 -              printk(KERN_CRIT PFX "Would Reboot.\n");
 +              pr_crit("Would Reboot\n");
  #else
 -              printk(KERN_CRIT PFX "Initiating system reboot.\n");
 +              pr_crit("Initiating system reboot\n");
                emergency_restart(NULL);
  #endif
  #else
 -              printk(KERN_CRIT PFX "Reset in 5ms.\n");
 +              pr_crit("Reset in 5ms\n");
  #endif
        }
        spin_unlock(&wdtpci_lock);
@@@ -483,7 -483,7 +482,7 @@@ static int wdtpci_release(struct inode 
        if (expect_close == 42) {
                wdtpci_stop();
        } else {
 -              printk(KERN_CRIT PFX "Unexpected close, not stopping timer!");
 +              pr_crit("Unexpected close, not stopping timer!\n");
                wdtpci_ping();
        }
        expect_close = 0;
@@@ -613,29 -613,29 +612,29 @@@ static int __devinit wdtpci_init_one(st
  
        dev_count++;
        if (dev_count > 1) {
 -              printk(KERN_ERR PFX "This driver only supports one device\n");
 +              pr_err("This driver only supports one device\n");
                return -ENODEV;
        }
  
        if (type != 500 && type != 501) {
 -              printk(KERN_ERR PFX "unknown card type '%d'.\n", type);
 +              pr_err("unknown card type '%d'\n", type);
                return -ENODEV;
        }
  
        if (pci_enable_device(dev)) {
 -              printk(KERN_ERR PFX "Not possible to enable PCI Device\n");
 +              pr_err("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");
 +              pr_err("No I/O-Address for card detected\n");
                ret = -ENODEV;
                goto out_pci;
        }
  
        if (pci_request_region(dev, 2, "wdt_pci")) {
 -              printk(KERN_ERR PFX "I/O address 0x%llx already in use\n",
 -                      (unsigned long long)pci_resource_start(dev, 2));
 +              pr_err("I/O address 0x%llx already in use\n",
 +                     (unsigned long long)pci_resource_start(dev, 2));
                goto out_pci;
        }
  
  
        if (request_irq(irq, wdtpci_interrupt, IRQF_SHARED,
                         "wdt_pci", &wdtpci_miscdev)) {
 -              printk(KERN_ERR PFX "IRQ %d is not free\n", irq);
 +              pr_err("IRQ %d is not free\n", irq);
                goto out_reg;
        }
  
 -      printk(KERN_INFO
 -       "PCI-WDT500/501 (PCI-WDG-CSM) driver 0.10 at 0x%llx (Interrupt %d)\n",
 -                                      (unsigned long long)io, irq);
 +      pr_info("PCI-WDT500/501 (PCI-WDG-CSM) driver 0.10 at 0x%llx (Interrupt %d)\n",
 +              (unsigned long long)io, irq);
  
        /* 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);
 +              pr_info("heartbeat value must be 0 < heartbeat < 65536, using %d\n",
 +                      WD_TIMO);
        }
  
        ret = register_reboot_notifier(&wdtpci_notifier);
        if (ret) {
 -              printk(KERN_ERR PFX
 -                      "cannot register reboot notifier (err=%d)\n", ret);
 +              pr_err("cannot register reboot notifier (err=%d)\n", ret);
                goto out_irq;
        }
  
        if (type == 501) {
                ret = misc_register(&temp_miscdev);
                if (ret) {
 -                      printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                                      TEMP_MINOR, ret);
 +                      pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 +                             TEMP_MINOR, ret);
                        goto out_rbt;
                }
        }
  
        ret = misc_register(&wdtpci_miscdev);
        if (ret) {
 -              printk(KERN_ERR PFX
 -                      "cannot register miscdev on minor=%d (err=%d)\n",
 -                                              WATCHDOG_MINOR, ret);
 +              pr_err("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",
 +      pr_info("initialized. heartbeat=%d sec (nowayout=%d)\n",
                heartbeat, nowayout);
        if (type == 501)
 -              printk(KERN_INFO "wdt: Fan Tachometer is %s\n",
 -                              (tachometer ? "Enabled" : "Disabled"));
 +              pr_info("Fan Tachometer is %s\n",
 +                      tachometer ? "Enabled" : "Disabled");
  
        ret = 0;
  out:
diff --combined fs/binfmt_elf.c
@@@ -35,6 -35,7 +35,7 @@@
  #include <asm/uaccess.h>
  #include <asm/param.h>
  #include <asm/page.h>
+ #include <asm/exec.h>
  
  static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs);
  static int load_elf_library(struct file *);
   */
  
  /*
 + * The purpose of always_dump_vma() is to make sure that special kernel mappings
 + * that are useful for post-mortem analysis are included in every core dump.
 + * In that way we ensure that the core dump is fully interpretable later
 + * without matching up the same kernel and hardware config to see what PC values
 + * meant. These special mappings include - vDSO, vsyscall, and other
 + * architecture specific mappings
 + */
 +static bool always_dump_vma(struct vm_area_struct *vma)
 +{
 +      /* Any vsyscall mappings? */
 +      if (vma == get_gate_vma(vma->vm_mm))
 +              return true;
 +      /*
 +       * arch_vma_name() returns non-NULL for special architecture mappings,
 +       * such as vDSO sections.
 +       */
 +      if (arch_vma_name(vma))
 +              return true;
 +
 +      return false;
 +}
 +
 +/*
   * Decide what to dump of a segment, part, all or none.
   */
  static unsigned long vma_dump_size(struct vm_area_struct *vma,
  {
  #define FILTER(type)  (mm_flags & (1UL << MMF_DUMP_##type))
  
 -      /* The vma can be set up to tell us the answer directly.  */
 -      if (vma->vm_flags & VM_ALWAYSDUMP)
 +      /* always dump the vdso and vsyscall sections */
 +      if (always_dump_vma(vma))
                goto whole;
  
 +      if (vma->vm_flags & VM_NODUMP)
 +              return 0;
 +
        /* Hugetlb memory check */
        if (vma->vm_flags & VM_HUGETLB) {
                if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
diff --combined fs/binfmt_flat.c
@@@ -15,7 -15,7 +15,7 @@@
   *    JAN/99 -- coded full program relocation (gerg@snapgear.com)
   */
  
 -#include <linux/module.h>
 +#include <linux/export.h>
  #include <linux/kernel.h>
  #include <linux/sched.h>
  #include <linux/mm.h>
@@@ -37,7 -37,6 +37,6 @@@
  #include <linux/syscalls.h>
  
  #include <asm/byteorder.h>
- #include <asm/system.h>
  #include <asm/uaccess.h>
  #include <asm/unaligned.h>
  #include <asm/cacheflush.h>
diff --combined fs/eventpoll.c
@@@ -34,7 -34,6 +34,6 @@@
  #include <linux/mutex.h>
  #include <linux/anon_inodes.h>
  #include <asm/uaccess.h>
- #include <asm/system.h>
  #include <asm/io.h>
  #include <asm/mman.h>
  #include <linux/atomic.h>
@@@ -427,31 -426,6 +426,31 @@@ out_unlock
        return error;
  }
  
 +/*
 + * As described in commit 0ccf831cb lockdep: annotate epoll
 + * the use of wait queues used by epoll is done in a very controlled
 + * manner. Wake ups can nest inside each other, but are never done
 + * with the same locking. For example:
 + *
 + *   dfd = socket(...);
 + *   efd1 = epoll_create();
 + *   efd2 = epoll_create();
 + *   epoll_ctl(efd1, EPOLL_CTL_ADD, dfd, ...);
 + *   epoll_ctl(efd2, EPOLL_CTL_ADD, efd1, ...);
 + *
 + * When a packet arrives to the device underneath "dfd", the net code will
 + * issue a wake_up() on its poll wake list. Epoll (efd1) has installed a
 + * callback wakeup entry on that queue, and the wake_up() performed by the
 + * "dfd" net code will end up in ep_poll_callback(). At this point epoll
 + * (efd1) notices that it may have some event ready, so it needs to wake up
 + * the waiters on its poll wait list (efd2). So it calls ep_poll_safewake()
 + * that ends up in another wake_up(), after having checked about the
 + * recursion constraints. That are, no more than EP_MAX_POLLWAKE_NESTS, to
 + * avoid stack blasting.
 + *
 + * When CONFIG_DEBUG_LOCK_ALLOC is enabled, make sure lockdep can handle
 + * this special case of epoll.
 + */
  #ifdef CONFIG_DEBUG_LOCK_ALLOC
  static inline void ep_wake_up_nested(wait_queue_head_t *wqueue,
                                     unsigned long events, int subclass)
@@@ -724,12 -698,9 +723,12 @@@ static int ep_read_events_proc(struct e
                               void *priv)
  {
        struct epitem *epi, *tmp;
 +      poll_table pt;
  
 +      init_poll_funcptr(&pt, NULL);
        list_for_each_entry_safe(epi, tmp, head, rdllink) {
 -              if (epi->ffd.file->f_op->poll(epi->ffd.file, NULL) &
 +              pt._key = epi->event.events;
 +              if (epi->ffd.file->f_op->poll(epi->ffd.file, &pt) &
                    epi->event.events)
                        return POLLIN | POLLRDNORM;
                else {
@@@ -1077,11 -1048,13 +1076,11 @@@ static int reverse_path_check_proc(voi
   */
  static int reverse_path_check(void)
  {
 -      int length = 0;
        int error = 0;
        struct file *current_file;
  
        /* let's call this for all tfiles */
        list_for_each_entry(current_file, &tfile_check_list, f_tfile_llink) {
 -              length++;
                path_count_init();
                error = ep_call_nested(&poll_loop_ncalls, EP_MAX_NESTS,
                                        reverse_path_check_proc, current_file,
@@@ -1123,7 -1096,6 +1122,7 @@@ static int ep_insert(struct eventpoll *
        /* Initialize the poll table using the queue callback */
        epq.epi = epi;
        init_poll_funcptr(&epq.pt, ep_ptable_queue_proc);
 +      epq.pt._key = event->events;
  
        /*
         * Attach the item to the poll hooks and get current event bits.
@@@ -1218,9 -1190,6 +1217,9 @@@ static int ep_modify(struct eventpoll *
  {
        int pwake = 0;
        unsigned int revents;
 +      poll_table pt;
 +
 +      init_poll_funcptr(&pt, NULL);
  
        /*
         * Set the new event interest mask before calling f_op->poll();
         * f_op->poll() call and the new event set registering.
         */
        epi->event.events = event->events;
 +      pt._key = event->events;
        epi->event.data = event->data; /* protected by mtx */
  
        /*
         * Get current event bits. We can safely use the file* here because
         * its usage count has been increased by the caller of this function.
         */
 -      revents = epi->ffd.file->f_op->poll(epi->ffd.file, NULL);
 +      revents = epi->ffd.file->f_op->poll(epi->ffd.file, &pt);
  
        /*
         * If the item is "hot" and it is not registered inside the ready
@@@ -1270,9 -1238,6 +1269,9 @@@ static int ep_send_events_proc(struct e
        unsigned int revents;
        struct epitem *epi;
        struct epoll_event __user *uevent;
 +      poll_table pt;
 +
 +      init_poll_funcptr(&pt, NULL);
  
        /*
         * We can loop without lock because we are passed a task private list.
  
                list_del_init(&epi->rdllink);
  
 -              revents = epi->ffd.file->f_op->poll(epi->ffd.file, NULL) &
 +              pt._key = epi->event.events;
 +              revents = epi->ffd.file->f_op->poll(epi->ffd.file, &pt) &
                        epi->event.events;
  
                /*
diff --combined fs/jbd2/commit.c
@@@ -28,7 -28,6 +28,6 @@@
  #include <linux/blkdev.h>
  #include <linux/bitops.h>
  #include <trace/events/jbd2.h>
- #include <asm/system.h>
  
  /*
   * Default IO end handler for temporary BJ_IO buffer_heads.
@@@ -331,10 -330,6 +330,10 @@@ void jbd2_journal_commit_transaction(jo
        struct buffer_head *cbh = NULL; /* For transactional checksums */
        __u32 crc32_sum = ~0;
        struct blk_plug plug;
 +      /* Tail of the journal */
 +      unsigned long first_block;
 +      tid_t first_tid;
 +      int update_tail;
  
        /*
         * First job: lock down the current transaction and wait for
        /* Do we need to erase the effects of a prior jbd2_journal_flush? */
        if (journal->j_flags & JBD2_FLUSHED) {
                jbd_debug(3, "super block updated\n");
 -              jbd2_journal_update_superblock(journal, 1);
 +              mutex_lock(&journal->j_checkpoint_mutex);
 +              /*
 +               * We hold j_checkpoint_mutex so tail cannot change under us.
 +               * We don't need any special data guarantees for writing sb
 +               * since journal is empty and it is ok for write to be
 +               * flushed only with transaction commit.
 +               */
 +              jbd2_journal_update_sb_log_tail(journal,
 +                                              journal->j_tail_sequence,
 +                                              journal->j_tail,
 +                                              WRITE_SYNC);
 +              mutex_unlock(&journal->j_checkpoint_mutex);
        } else {
                jbd_debug(3, "superblock not updated\n");
        }
@@@ -692,30 -676,10 +691,30 @@@ start_journal_io
                err = 0;
        }
  
 +      /*
 +       * Get current oldest transaction in the log before we issue flush
 +       * to the filesystem device. After the flush we can be sure that
 +       * blocks of all older transactions are checkpointed to persistent
 +       * storage and we will be safe to update journal start in the
 +       * superblock with the numbers we get here.
 +       */
 +      update_tail =
 +              jbd2_journal_get_log_tail(journal, &first_tid, &first_block);
 +
        write_lock(&journal->j_state_lock);
 +      if (update_tail) {
 +              long freed = first_block - journal->j_tail;
 +
 +              if (first_block < journal->j_tail)
 +                      freed += journal->j_last - journal->j_first;
 +              /* Update tail only if we free significant amount of space */
 +              if (freed < journal->j_maxlen / 4)
 +                      update_tail = 0;
 +      }
        J_ASSERT(commit_transaction->t_state == T_COMMIT);
        commit_transaction->t_state = T_COMMIT_DFLUSH;
        write_unlock(&journal->j_state_lock);
 +
        /* 
         * If the journal is not located on the file system device,
         * then we must flush the file system device before we issue
@@@ -866,14 -830,6 +865,14 @@@ wait_for_iobuf
        if (err)
                jbd2_journal_abort(journal, err);
  
 +      /*
 +       * Now disk caches for filesystem device are flushed so we are safe to
 +       * erase checkpointed transactions from the log by updating journal
 +       * superblock.
 +       */
 +      if (update_tail)
 +              jbd2_update_log_tail(journal, first_tid, first_block);
 +
        /* End of a transaction!  Finally, we can do checkpoint
             processing: any buffers committed as a result of this
             transaction can be removed from any checkpoint list it was on
@@@ -1091,7 -1047,7 +1090,7 @@@ restart_loop
        jbd_debug(1, "JBD2: commit %d complete, head %d\n",
                  journal->j_commit_sequence, journal->j_tail_sequence);
        if (to_free)
 -              kfree(commit_transaction);
 +              jbd2_journal_free_transaction(commit_transaction);
  
        wake_up(&journal->j_wait_done_commit);
  }
diff --combined fs/jbd2/journal.c
@@@ -50,7 -50,6 +50,6 @@@
  
  #include <asm/uaccess.h>
  #include <asm/page.h>
- #include <asm/system.h>
  
  EXPORT_SYMBOL(jbd2_journal_extend);
  EXPORT_SYMBOL(jbd2_journal_stop);
@@@ -71,6 -70,7 +70,6 @@@ EXPORT_SYMBOL(jbd2_journal_revoke)
  
  EXPORT_SYMBOL(jbd2_journal_init_dev);
  EXPORT_SYMBOL(jbd2_journal_init_inode);
 -EXPORT_SYMBOL(jbd2_journal_update_format);
  EXPORT_SYMBOL(jbd2_journal_check_used_features);
  EXPORT_SYMBOL(jbd2_journal_check_available_features);
  EXPORT_SYMBOL(jbd2_journal_set_features);
@@@ -95,6 -95,7 +94,6 @@@ EXPORT_SYMBOL(jbd2_journal_release_jbd_
  EXPORT_SYMBOL(jbd2_journal_begin_ordered_truncate);
  EXPORT_SYMBOL(jbd2_inode_cache);
  
 -static int journal_convert_superblock_v1(journal_t *, journal_superblock_t *);
  static void __journal_abort_soft (journal_t *journal, int errno);
  static int jbd2_journal_create_slab(size_t slab_size);
  
@@@ -744,98 -745,6 +743,98 @@@ struct journal_head *jbd2_journal_get_d
        return jbd2_journal_add_journal_head(bh);
  }
  
 +/*
 + * Return tid of the oldest transaction in the journal and block in the journal
 + * where the transaction starts.
 + *
 + * If the journal is now empty, return which will be the next transaction ID
 + * we will write and where will that transaction start.
 + *
 + * The return value is 0 if journal tail cannot be pushed any further, 1 if
 + * it can.
 + */
 +int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid,
 +                            unsigned long *block)
 +{
 +      transaction_t *transaction;
 +      int ret;
 +
 +      read_lock(&journal->j_state_lock);
 +      spin_lock(&journal->j_list_lock);
 +      transaction = journal->j_checkpoint_transactions;
 +      if (transaction) {
 +              *tid = transaction->t_tid;
 +              *block = transaction->t_log_start;
 +      } else if ((transaction = journal->j_committing_transaction) != NULL) {
 +              *tid = transaction->t_tid;
 +              *block = transaction->t_log_start;
 +      } else if ((transaction = journal->j_running_transaction) != NULL) {
 +              *tid = transaction->t_tid;
 +              *block = journal->j_head;
 +      } else {
 +              *tid = journal->j_transaction_sequence;
 +              *block = journal->j_head;
 +      }
 +      ret = tid_gt(*tid, journal->j_tail_sequence);
 +      spin_unlock(&journal->j_list_lock);
 +      read_unlock(&journal->j_state_lock);
 +
 +      return ret;
 +}
 +
 +/*
 + * Update information in journal structure and in on disk journal superblock
 + * about log tail. This function does not check whether information passed in
 + * really pushes log tail further. It's responsibility of the caller to make
 + * sure provided log tail information is valid (e.g. by holding
 + * j_checkpoint_mutex all the time between computing log tail and calling this
 + * function as is the case with jbd2_cleanup_journal_tail()).
 + *
 + * Requires j_checkpoint_mutex
 + */
 +void __jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block)
 +{
 +      unsigned long freed;
 +
 +      BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex));
 +
 +      /*
 +       * We cannot afford for write to remain in drive's caches since as
 +       * soon as we update j_tail, next transaction can start reusing journal
 +       * space and if we lose sb update during power failure we'd replay
 +       * old transaction with possibly newly overwritten data.
 +       */
 +      jbd2_journal_update_sb_log_tail(journal, tid, block, WRITE_FUA);
 +      write_lock(&journal->j_state_lock);
 +      freed = block - journal->j_tail;
 +      if (block < journal->j_tail)
 +              freed += journal->j_last - journal->j_first;
 +
 +      trace_jbd2_update_log_tail(journal, tid, block, freed);
 +      jbd_debug(1,
 +                "Cleaning journal tail from %d to %d (offset %lu), "
 +                "freeing %lu\n",
 +                journal->j_tail_sequence, tid, block, freed);
 +
 +      journal->j_free += freed;
 +      journal->j_tail_sequence = tid;
 +      journal->j_tail = block;
 +      write_unlock(&journal->j_state_lock);
 +}
 +
 +/*
 + * This is a variaon of __jbd2_update_log_tail which checks for validity of
 + * provided log tail and locks j_checkpoint_mutex. So it is safe against races
 + * with other threads updating log tail.
 + */
 +void jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block)
 +{
 +      mutex_lock(&journal->j_checkpoint_mutex);
 +      if (tid_gt(tid, journal->j_tail_sequence))
 +              __jbd2_update_log_tail(journal, tid, block);
 +      mutex_unlock(&journal->j_checkpoint_mutex);
 +}
 +
  struct jbd2_stats_proc_session {
        journal_t *journal;
        struct transaction_stats_s *stats;
@@@ -1204,45 -1113,40 +1203,45 @@@ static int journal_reset(journal_t *jou
  
        journal->j_max_transaction_buffers = journal->j_maxlen / 4;
  
 -      /* Add the dynamic fields and write it to disk. */
 -      jbd2_journal_update_superblock(journal, 1);
 -      return jbd2_journal_start_thread(journal);
 -}
 -
 -/**
 - * void jbd2_journal_update_superblock() - Update journal sb on disk.
 - * @journal: The journal to update.
 - * @wait: Set to '0' if you don't want to wait for IO completion.
 - *
 - * Update a journal's dynamic superblock fields and write it to disk,
 - * optionally waiting for the IO to complete.
 - */
 -void jbd2_journal_update_superblock(journal_t *journal, int wait)
 -{
 -      journal_superblock_t *sb = journal->j_superblock;
 -      struct buffer_head *bh = journal->j_sb_buffer;
 -
        /*
         * As a special case, if the on-disk copy is already marked as needing
 -       * no recovery (s_start == 0) and there are no outstanding transactions
 -       * in the filesystem, then we can safely defer the superblock update
 -       * until the next commit by setting JBD2_FLUSHED.  This avoids
 +       * no recovery (s_start == 0), then we can safely defer the superblock
 +       * update until the next commit by setting JBD2_FLUSHED.  This avoids
         * attempting a write to a potential-readonly device.
         */
 -      if (sb->s_start == 0 && journal->j_tail_sequence ==
 -                              journal->j_transaction_sequence) {
 +      if (sb->s_start == 0) {
                jbd_debug(1, "JBD2: Skipping superblock update on recovered sb "
                        "(start %ld, seq %d, errno %d)\n",
                        journal->j_tail, journal->j_tail_sequence,
                        journal->j_errno);
 -              goto out;
 +              journal->j_flags |= JBD2_FLUSHED;
 +      } else {
 +              /* Lock here to make assertions happy... */
 +              mutex_lock(&journal->j_checkpoint_mutex);
 +              /*
 +               * Update log tail information. We use WRITE_FUA since new
 +               * transaction will start reusing journal space and so we
 +               * must make sure information about current log tail is on
 +               * disk before that.
 +               */
 +              jbd2_journal_update_sb_log_tail(journal,
 +                                              journal->j_tail_sequence,
 +                                              journal->j_tail,
 +                                              WRITE_FUA);
 +              mutex_unlock(&journal->j_checkpoint_mutex);
        }
 +      return jbd2_journal_start_thread(journal);
 +}
  
 +static void jbd2_write_superblock(journal_t *journal, int write_op)
 +{
 +      struct buffer_head *bh = journal->j_sb_buffer;
 +      int ret;
 +
 +      trace_jbd2_write_superblock(journal, write_op);
 +      if (!(journal->j_flags & JBD2_BARRIER))
 +              write_op &= ~(REQ_FUA | REQ_FLUSH);
 +      lock_buffer(bh);
        if (buffer_write_io_error(bh)) {
                /*
                 * Oh, dear.  A previous attempt to write the journal
                clear_buffer_write_io_error(bh);
                set_buffer_uptodate(bh);
        }
 +      get_bh(bh);
 +      bh->b_end_io = end_buffer_write_sync;
 +      ret = submit_bh(write_op, bh);
 +      wait_on_buffer(bh);
 +      if (buffer_write_io_error(bh)) {
 +              clear_buffer_write_io_error(bh);
 +              set_buffer_uptodate(bh);
 +              ret = -EIO;
 +      }
 +      if (ret) {
 +              printk(KERN_ERR "JBD2: Error %d detected when updating "
 +                     "journal superblock for %s.\n", ret,
 +                     journal->j_devname);
 +      }
 +}
 +
 +/**
 + * jbd2_journal_update_sb_log_tail() - Update log tail in journal sb on disk.
 + * @journal: The journal to update.
 + * @tail_tid: TID of the new transaction at the tail of the log
 + * @tail_block: The first block of the transaction at the tail of the log
 + * @write_op: With which operation should we write the journal sb
 + *
 + * Update a journal's superblock information about log tail and write it to
 + * disk, waiting for the IO to complete.
 + */
 +void jbd2_journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid,
 +                                   unsigned long tail_block, int write_op)
 +{
 +      journal_superblock_t *sb = journal->j_superblock;
 +
 +      BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex));
 +      jbd_debug(1, "JBD2: updating superblock (start %lu, seq %u)\n",
 +                tail_block, tail_tid);
 +
 +      sb->s_sequence = cpu_to_be32(tail_tid);
 +      sb->s_start    = cpu_to_be32(tail_block);
 +
 +      jbd2_write_superblock(journal, write_op);
 +
 +      /* Log is no longer empty */
 +      write_lock(&journal->j_state_lock);
 +      WARN_ON(!sb->s_sequence);
 +      journal->j_flags &= ~JBD2_FLUSHED;
 +      write_unlock(&journal->j_state_lock);
 +}
 +
 +/**
 + * jbd2_mark_journal_empty() - Mark on disk journal as empty.
 + * @journal: The journal to update.
 + *
 + * Update a journal's dynamic superblock fields to show that journal is empty.
 + * Write updated superblock to disk waiting for IO to complete.
 + */
 +static void jbd2_mark_journal_empty(journal_t *journal)
 +{
 +      journal_superblock_t *sb = journal->j_superblock;
  
 +      BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex));
        read_lock(&journal->j_state_lock);
 -      jbd_debug(1, "JBD2: updating superblock (start %ld, seq %d, errno %d)\n",
 -                journal->j_tail, journal->j_tail_sequence, journal->j_errno);
 +      jbd_debug(1, "JBD2: Marking journal as empty (seq %d)\n",
 +                journal->j_tail_sequence);
  
        sb->s_sequence = cpu_to_be32(journal->j_tail_sequence);
 -      sb->s_start    = cpu_to_be32(journal->j_tail);
 -      sb->s_errno    = cpu_to_be32(journal->j_errno);
 +      sb->s_start    = cpu_to_be32(0);
        read_unlock(&journal->j_state_lock);
  
 -      BUFFER_TRACE(bh, "marking dirty");
 -      mark_buffer_dirty(bh);
 -      if (wait) {
 -              sync_dirty_buffer(bh);
 -              if (buffer_write_io_error(bh)) {
 -                      printk(KERN_ERR "JBD2: I/O error detected "
 -                             "when updating journal superblock for %s.\n",
 -                             journal->j_devname);
 -                      clear_buffer_write_io_error(bh);
 -                      set_buffer_uptodate(bh);
 -              }
 -      } else
 -              write_dirty_buffer(bh, WRITE);
 -
 -out:
 -      /* If we have just flushed the log (by marking s_start==0), then
 -       * any future commit will have to be careful to update the
 -       * superblock again to re-record the true start of the log. */
 +      jbd2_write_superblock(journal, WRITE_FUA);
  
 +      /* Log is no longer empty */
        write_lock(&journal->j_state_lock);
 -      if (sb->s_start)
 -              journal->j_flags &= ~JBD2_FLUSHED;
 -      else
 -              journal->j_flags |= JBD2_FLUSHED;
 +      journal->j_flags |= JBD2_FLUSHED;
        write_unlock(&journal->j_state_lock);
  }
  
 +
 +/**
 + * jbd2_journal_update_sb_errno() - Update error in the journal.
 + * @journal: The journal to update.
 + *
 + * Update a journal's errno.  Write updated superblock to disk waiting for IO
 + * to complete.
 + */
 +static void jbd2_journal_update_sb_errno(journal_t *journal)
 +{
 +      journal_superblock_t *sb = journal->j_superblock;
 +
 +      read_lock(&journal->j_state_lock);
 +      jbd_debug(1, "JBD2: updating superblock error (errno %d)\n",
 +                journal->j_errno);
 +      sb->s_errno    = cpu_to_be32(journal->j_errno);
 +      read_unlock(&journal->j_state_lock);
 +
 +      jbd2_write_superblock(journal, WRITE_SYNC);
 +}
 +
  /*
   * Read the superblock for a given journal, performing initial
   * validation of the format.
   */
 -
  static int journal_get_superblock(journal_t *journal)
  {
        struct buffer_head *bh;
@@@ -1551,11 -1397,14 +1550,11 @@@ int jbd2_journal_destroy(journal_t *jou
  
        if (journal->j_sb_buffer) {
                if (!is_journal_aborted(journal)) {
 -                      /* We can now mark the journal as empty. */
 -                      journal->j_tail = 0;
 -                      journal->j_tail_sequence =
 -                              ++journal->j_transaction_sequence;
 -                      jbd2_journal_update_superblock(journal, 1);
 -              } else {
 +                      mutex_lock(&journal->j_checkpoint_mutex);
 +                      jbd2_mark_journal_empty(journal);
 +                      mutex_unlock(&journal->j_checkpoint_mutex);
 +              } else
                        err = -EIO;
 -              }
                brelse(journal->j_sb_buffer);
        }
  
@@@ -1702,6 -1551,61 +1701,6 @@@ void jbd2_journal_clear_features(journa
  EXPORT_SYMBOL(jbd2_journal_clear_features);
  
  /**
 - * int jbd2_journal_update_format () - Update on-disk journal structure.
 - * @journal: Journal to act on.
 - *
 - * Given an initialised but unloaded journal struct, poke about in the
 - * on-disk structure to update it to the most recent supported version.
 - */
 -int jbd2_journal_update_format (journal_t *journal)
 -{
 -      journal_superblock_t *sb;
 -      int err;
 -
 -      err = journal_get_superblock(journal);
 -      if (err)
 -              return err;
 -
 -      sb = journal->j_superblock;
 -
 -      switch (be32_to_cpu(sb->s_header.h_blocktype)) {
 -      case JBD2_SUPERBLOCK_V2:
 -              return 0;
 -      case JBD2_SUPERBLOCK_V1:
 -              return journal_convert_superblock_v1(journal, sb);
 -      default:
 -              break;
 -      }
 -      return -EINVAL;
 -}
 -
 -static int journal_convert_superblock_v1(journal_t *journal,
 -                                       journal_superblock_t *sb)
 -{
 -      int offset, blocksize;
 -      struct buffer_head *bh;
 -
 -      printk(KERN_WARNING
 -              "JBD2: Converting superblock from version 1 to 2.\n");
 -
 -      /* Pre-initialise new fields to zero */
 -      offset = ((char *) &(sb->s_feature_compat)) - ((char *) sb);
 -      blocksize = be32_to_cpu(sb->s_blocksize);
 -      memset(&sb->s_feature_compat, 0, blocksize-offset);
 -
 -      sb->s_nr_users = cpu_to_be32(1);
 -      sb->s_header.h_blocktype = cpu_to_be32(JBD2_SUPERBLOCK_V2);
 -      journal->j_format_version = 2;
 -
 -      bh = journal->j_sb_buffer;
 -      BUFFER_TRACE(bh, "marking dirty");
 -      mark_buffer_dirty(bh);
 -      sync_dirty_buffer(bh);
 -      return 0;
 -}
 -
 -
 -/**
   * int jbd2_journal_flush () - Flush journal
   * @journal: Journal to act on.
   *
@@@ -1714,6 -1618,7 +1713,6 @@@ int jbd2_journal_flush(journal_t *journ
  {
        int err = 0;
        transaction_t *transaction = NULL;
 -      unsigned long old_tail;
  
        write_lock(&journal->j_state_lock);
  
        if (is_journal_aborted(journal))
                return -EIO;
  
 +      mutex_lock(&journal->j_checkpoint_mutex);
        jbd2_cleanup_journal_tail(journal);
  
        /* Finally, mark the journal as really needing no recovery.
         * the magic code for a fully-recovered superblock.  Any future
         * commits of data to the journal will restore the current
         * s_start value. */
 +      jbd2_mark_journal_empty(journal);
 +      mutex_unlock(&journal->j_checkpoint_mutex);
        write_lock(&journal->j_state_lock);
 -      old_tail = journal->j_tail;
 -      journal->j_tail = 0;
 -      write_unlock(&journal->j_state_lock);
 -      jbd2_journal_update_superblock(journal, 1);
 -      write_lock(&journal->j_state_lock);
 -      journal->j_tail = old_tail;
 -
        J_ASSERT(!journal->j_running_transaction);
        J_ASSERT(!journal->j_committing_transaction);
        J_ASSERT(!journal->j_checkpoint_transactions);
@@@ -1798,12 -1707,8 +1797,12 @@@ int jbd2_journal_wipe(journal_t *journa
                write ? "Clearing" : "Ignoring");
  
        err = jbd2_journal_skip_recovery(journal);
 -      if (write)
 -              jbd2_journal_update_superblock(journal, 1);
 +      if (write) {
 +              /* Lock to make assertions happy... */
 +              mutex_lock(&journal->j_checkpoint_mutex);
 +              jbd2_mark_journal_empty(journal);
 +              mutex_unlock(&journal->j_checkpoint_mutex);
 +      }
  
   no_recovery:
        return err;
@@@ -1853,7 -1758,7 +1852,7 @@@ static void __journal_abort_soft (journ
        __jbd2_journal_abort_hard(journal);
  
        if (errno)
 -              jbd2_journal_update_superblock(journal, 1);
 +              jbd2_journal_update_sb_errno(journal);
  }
  
  /**
@@@ -2111,7 -2016,7 +2110,7 @@@ static struct kmem_cache *jbd2_journal_
  static atomic_t nr_journal_heads = ATOMIC_INIT(0);
  #endif
  
 -static int journal_init_jbd2_journal_head_cache(void)
 +static int jbd2_journal_init_journal_head_cache(void)
  {
        int retval;
  
        return retval;
  }
  
 -static void jbd2_journal_destroy_jbd2_journal_head_cache(void)
 +static void jbd2_journal_destroy_journal_head_cache(void)
  {
        if (jbd2_journal_head_cache) {
                kmem_cache_destroy(jbd2_journal_head_cache);
@@@ -2417,7 -2322,7 +2416,7 @@@ static void __exit jbd2_remove_jbd_stat
  
  struct kmem_cache *jbd2_handle_cache, *jbd2_inode_cache;
  
 -static int __init journal_init_handle_cache(void)
 +static int __init jbd2_journal_init_handle_cache(void)
  {
        jbd2_handle_cache = KMEM_CACHE(jbd2_journal_handle, SLAB_TEMPORARY);
        if (jbd2_handle_cache == NULL) {
@@@ -2452,20 -2357,17 +2451,20 @@@ static int __init journal_init_caches(v
  
        ret = jbd2_journal_init_revoke_caches();
        if (ret == 0)
 -              ret = journal_init_jbd2_journal_head_cache();
 +              ret = jbd2_journal_init_journal_head_cache();
 +      if (ret == 0)
 +              ret = jbd2_journal_init_handle_cache();
        if (ret == 0)
 -              ret = journal_init_handle_cache();
 +              ret = jbd2_journal_init_transaction_cache();
        return ret;
  }
  
  static void jbd2_journal_destroy_caches(void)
  {
        jbd2_journal_destroy_revoke_caches();
 -      jbd2_journal_destroy_jbd2_journal_head_cache();
 +      jbd2_journal_destroy_journal_head_cache();
        jbd2_journal_destroy_handle_cache();
 +      jbd2_journal_destroy_transaction_cache();
        jbd2_journal_destroy_slabs();
  }
  
diff --combined fs/nfs/client.c
  #include <net/ipv6.h>
  #include <linux/nfs_xdr.h>
  #include <linux/sunrpc/bc_xprt.h>
 +#include <linux/nsproxy.h>
 +#include <linux/pid_namespace.h>
  
- #include <asm/system.h>
  
  #include "nfs4_fs.h"
  #include "callback.h"
  #include "internal.h"
  #include "fscache.h"
  #include "pnfs.h"
 +#include "netns.h"
  
  #define NFSDBG_FACILITY               NFSDBG_CLIENT
  
 -static DEFINE_SPINLOCK(nfs_client_lock);
 -static LIST_HEAD(nfs_client_list);
 -static LIST_HEAD(nfs_volume_list);
  static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq);
  #ifdef CONFIG_NFS_V4
 -static DEFINE_IDR(cb_ident_idr); /* Protected by nfs_client_lock */
  
  /*
   * Get a unique NFSv4.0 callback identifier which will be used
  static int nfs_get_cb_ident_idr(struct nfs_client *clp, int minorversion)
  {
        int ret = 0;
 +      struct nfs_net *nn = net_generic(clp->net, nfs_net_id);
  
        if (clp->rpc_ops->version != 4 || minorversion != 0)
                return ret;
  retry:
 -      if (!idr_pre_get(&cb_ident_idr, GFP_KERNEL))
 +      if (!idr_pre_get(&nn->cb_ident_idr, GFP_KERNEL))
                return -ENOMEM;
 -      spin_lock(&nfs_client_lock);
 -      ret = idr_get_new(&cb_ident_idr, clp, &clp->cl_cb_ident);
 -      spin_unlock(&nfs_client_lock);
 +      spin_lock(&nn->nfs_client_lock);
 +      ret = idr_get_new(&nn->cb_ident_idr, clp, &clp->cl_cb_ident);
 +      spin_unlock(&nn->nfs_client_lock);
        if (ret == -EAGAIN)
                goto retry;
        return ret;
@@@ -90,7 -89,7 +89,7 @@@ static bool nfs4_disable_idmapping = tr
  /*
   * RPC cruft for NFS
   */
 -static struct rpc_version *nfs_version[5] = {
 +static const struct rpc_version *nfs_version[5] = {
        [2]                     = &nfs_version2,
  #ifdef CONFIG_NFS_V3
        [3]                     = &nfs_version3,
  #endif
  };
  
 -struct rpc_program nfs_program = {
 +const struct rpc_program nfs_program = {
        .name                   = "nfs",
        .number                 = NFS_PROGRAM,
        .nrvers                 = ARRAY_SIZE(nfs_version),
@@@ -116,11 -115,11 +115,11 @@@ struct rpc_stat nfs_rpcstat = 
  
  #ifdef CONFIG_NFS_V3_ACL
  static struct rpc_stat                nfsacl_rpcstat = { &nfsacl_program };
 -static struct rpc_version *   nfsacl_version[] = {
 +static const struct rpc_version *nfsacl_version[] = {
        [3]                     = &nfsacl_version3,
  };
  
 -struct rpc_program            nfsacl_program = {
 +const struct rpc_program nfsacl_program = {
        .name                   = "nfsacl",
        .number                 = NFS_ACL_PROGRAM,
        .nrvers                 = ARRAY_SIZE(nfsacl_version),
@@@ -136,7 -135,6 +135,7 @@@ struct nfs_client_initdata 
        const struct nfs_rpc_ops *rpc_ops;
        int proto;
        u32 minorversion;
 +      struct net *net;
  };
  
  /*
@@@ -173,7 -171,6 +172,7 @@@ static struct nfs_client *nfs_alloc_cli
        clp->cl_rpcclient = ERR_PTR(-EINVAL);
  
        clp->cl_proto = cl_init->proto;
 +      clp->net = get_net(cl_init->net);
  
  #ifdef CONFIG_NFS_V4
        err = nfs_get_cb_ident_idr(clp, cl_init->minorversion);
@@@ -205,11 -202,8 +204,11 @@@ error_0
  #ifdef CONFIG_NFS_V4_1
  static void nfs4_shutdown_session(struct nfs_client *clp)
  {
 -      if (nfs4_has_session(clp))
 +      if (nfs4_has_session(clp)) {
 +              nfs4_deviceid_purge_client(clp);
                nfs4_destroy_session(clp->cl_session);
 +      }
 +
  }
  #else /* CONFIG_NFS_V4_1 */
  static void nfs4_shutdown_session(struct nfs_client *clp)
@@@ -239,20 -233,16 +238,20 @@@ static void nfs4_shutdown_client(struc
  }
  
  /* idr_remove_all is not needed as all id's are removed by nfs_put_client */
 -void nfs_cleanup_cb_ident_idr(void)
 +void nfs_cleanup_cb_ident_idr(struct net *net)
  {
 -      idr_destroy(&cb_ident_idr);
 +      struct nfs_net *nn = net_generic(net, nfs_net_id);
 +
 +      idr_destroy(&nn->cb_ident_idr);
  }
  
  /* nfs_client_lock held */
  static void nfs_cb_idr_remove_locked(struct nfs_client *clp)
  {
 +      struct nfs_net *nn = net_generic(clp->net, nfs_net_id);
 +
        if (clp->cl_cb_ident)
 -              idr_remove(&cb_ident_idr, clp->cl_cb_ident);
 +              idr_remove(&nn->cb_ident_idr, clp->cl_cb_ident);
  }
  
  static void pnfs_init_server(struct nfs_server *server)
@@@ -270,7 -260,7 +269,7 @@@ static void nfs4_shutdown_client(struc
  {
  }
  
 -void nfs_cleanup_cb_ident_idr(void)
 +void nfs_cleanup_cb_ident_idr(struct net *net)
  {
  }
  
@@@ -302,10 -292,10 +301,10 @@@ static void nfs_free_client(struct nfs_
        if (clp->cl_machine_cred != NULL)
                put_rpccred(clp->cl_machine_cred);
  
 -      nfs4_deviceid_purge_client(clp);
 -
 +      put_net(clp->net);
        kfree(clp->cl_hostname);
        kfree(clp->server_scope);
 +      kfree(clp->impl_id);
        kfree(clp);
  
        dprintk("<-- nfs_free_client()\n");
   */
  void nfs_put_client(struct nfs_client *clp)
  {
 +      struct nfs_net *nn;
 +
        if (!clp)
                return;
  
        dprintk("--> nfs_put_client({%d})\n", atomic_read(&clp->cl_count));
 +      nn = net_generic(clp->net, nfs_net_id);
  
 -      if (atomic_dec_and_lock(&clp->cl_count, &nfs_client_lock)) {
 +      if (atomic_dec_and_lock(&clp->cl_count, &nn->nfs_client_lock)) {
                list_del(&clp->cl_share_link);
                nfs_cb_idr_remove_locked(clp);
 -              spin_unlock(&nfs_client_lock);
 +              spin_unlock(&nn->nfs_client_lock);
  
                BUG_ON(!list_empty(&clp->cl_superblocks));
  
@@@ -405,7 -392,6 +404,7 @@@ static int nfs_sockaddr_cmp_ip4(const s
                (sin1->sin_port == sin2->sin_port);
  }
  
 +#if defined(CONFIG_NFS_V4_1)
  /*
   * Test if two socket addresses represent the same actual socket,
   * by comparing (only) relevant fields, excluding the port number.
@@@ -424,7 -410,6 +423,7 @@@ static int nfs_sockaddr_match_ipaddr(co
        }
        return 0;
  }
 +#endif /* CONFIG_NFS_V4_1 */
  
  /*
   * Test if two socket addresses represent the same actual socket,
@@@ -445,10 -430,10 +444,10 @@@ static int nfs_sockaddr_cmp(const struc
        return 0;
  }
  
 +#if defined(CONFIG_NFS_V4_1)
  /* Common match routine for v4.0 and v4.1 callback services */
 -bool
 -nfs4_cb_match_client(const struct sockaddr *addr, struct nfs_client *clp,
 -                   u32 minorversion)
 +static bool nfs4_cb_match_client(const struct sockaddr *addr,
 +              struct nfs_client *clp, u32 minorversion)
  {
        struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr;
  
  
        return true;
  }
 +#endif /* CONFIG_NFS_V4_1 */
  
  /*
   * Find an nfs_client on the list that matches the initialisation data
@@@ -478,9 -462,8 +477,9 @@@ static struct nfs_client *nfs_match_cli
  {
        struct nfs_client *clp;
        const struct sockaddr *sap = data->addr;
 +      struct nfs_net *nn = net_generic(data->net, nfs_net_id);
  
 -      list_for_each_entry(clp, &nfs_client_list, cl_share_link) {
 +      list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) {
                const struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr;
                /* Don't match clients that failed to initialise properly */
                if (clp->cl_cons_state < 0)
@@@ -518,14 -501,13 +517,14 @@@ nfs_get_client(const struct nfs_client_
  {
        struct nfs_client *clp, *new = NULL;
        int error;
 +      struct nfs_net *nn = net_generic(cl_init->net, nfs_net_id);
  
        dprintk("--> nfs_get_client(%s,v%u)\n",
                cl_init->hostname ?: "", cl_init->rpc_ops->version);
  
        /* see if the client already exists */
        do {
 -              spin_lock(&nfs_client_lock);
 +              spin_lock(&nn->nfs_client_lock);
  
                clp = nfs_match_client(cl_init);
                if (clp)
                if (new)
                        goto install_client;
  
 -              spin_unlock(&nfs_client_lock);
 +              spin_unlock(&nn->nfs_client_lock);
  
                new = nfs_alloc_client(cl_init);
        } while (!IS_ERR(new));
        /* install a new client and return with it unready */
  install_client:
        clp = new;
 -      list_add(&clp->cl_share_link, &nfs_client_list);
 -      spin_unlock(&nfs_client_lock);
 +      list_add(&clp->cl_share_link, &nn->nfs_client_list);
 +      spin_unlock(&nn->nfs_client_lock);
  
        error = cl_init->rpc_ops->init_client(clp, timeparms, ip_addr,
                                              authflavour, noresvport);
         * - make sure it's ready before returning
         */
  found_client:
 -      spin_unlock(&nfs_client_lock);
 +      spin_unlock(&nn->nfs_client_lock);
  
        if (new)
                nfs_free_client(new);
@@@ -660,7 -642,7 +659,7 @@@ static int nfs_create_rpc_client(struc
  {
        struct rpc_clnt         *clnt = NULL;
        struct rpc_create_args args = {
 -              .net            = &init_net,
 +              .net            = clp->net,
                .protocol       = clp->cl_proto,
                .address        = (struct sockaddr *)&clp->cl_addr,
                .addrsize       = clp->cl_addrlen,
@@@ -714,7 -696,6 +713,7 @@@ static int nfs_start_lockd(struct nfs_s
                .nfs_version    = clp->rpc_ops->version,
                .noresvport     = server->flags & NFS_MOUNT_NORESVPORT ?
                                        1 : 0,
 +              .net            = clp->net,
        };
  
        if (nlm_init.nfs_version > 3)
@@@ -850,7 -831,6 +849,7 @@@ static int nfs_init_server(struct nfs_s
                .addrlen = data->nfs_server.addrlen,
                .rpc_ops = &nfs_v2_clientops,
                .proto = data->nfs_server.protocol,
 +              .net = data->net,
        };
        struct rpc_timeout timeparms;
        struct nfs_client *clp;
@@@ -1049,30 -1029,25 +1048,30 @@@ static void nfs_server_copy_userdata(st
  static void nfs_server_insert_lists(struct nfs_server *server)
  {
        struct nfs_client *clp = server->nfs_client;
 +      struct nfs_net *nn = net_generic(clp->net, nfs_net_id);
  
 -      spin_lock(&nfs_client_lock);
 +      spin_lock(&nn->nfs_client_lock);
        list_add_tail_rcu(&server->client_link, &clp->cl_superblocks);
 -      list_add_tail(&server->master_link, &nfs_volume_list);
 +      list_add_tail(&server->master_link, &nn->nfs_volume_list);
        clear_bit(NFS_CS_STOP_RENEW, &clp->cl_res_state);
 -      spin_unlock(&nfs_client_lock);
 +      spin_unlock(&nn->nfs_client_lock);
  
  }
  
  static void nfs_server_remove_lists(struct nfs_server *server)
  {
        struct nfs_client *clp = server->nfs_client;
 +      struct nfs_net *nn;
  
 -      spin_lock(&nfs_client_lock);
 +      if (clp == NULL)
 +              return;
 +      nn = net_generic(clp->net, nfs_net_id);
 +      spin_lock(&nn->nfs_client_lock);
        list_del_rcu(&server->client_link);
 -      if (clp && list_empty(&clp->cl_superblocks))
 +      if (list_empty(&clp->cl_superblocks))
                set_bit(NFS_CS_STOP_RENEW, &clp->cl_res_state);
        list_del(&server->master_link);
 -      spin_unlock(&nfs_client_lock);
 +      spin_unlock(&nn->nfs_client_lock);
  
        synchronize_rcu();
  }
@@@ -1111,8 -1086,6 +1110,8 @@@ static struct nfs_server *nfs_alloc_ser
                return NULL;
        }
  
 +      ida_init(&server->openowner_id);
 +      ida_init(&server->lockowner_id);
        pnfs_init_server(server);
  
        return server;
@@@ -1138,8 -1111,6 +1137,8 @@@ void nfs_free_server(struct nfs_server 
  
        nfs_put_client(server->nfs_client);
  
 +      ida_destroy(&server->lockowner_id);
 +      ida_destroy(&server->openowner_id);
        nfs_free_iostats(server->io_stats);
        bdi_destroy(&server->backing_dev_info);
        kfree(server);
@@@ -1218,19 -1189,45 +1217,19 @@@ error
  /*
   * NFSv4.0 callback thread helper
   *
   * Find a client by callback identifier
   */
  struct nfs_client *
 -nfs4_find_client_ident(int cb_ident)
 +nfs4_find_client_ident(struct net *net, int cb_ident)
  {
        struct nfs_client *clp;
 +      struct nfs_net *nn = net_generic(net, nfs_net_id);
  
 -      spin_lock(&nfs_client_lock);
 -      clp = idr_find(&cb_ident_idr, cb_ident);
 +      spin_lock(&nn->nfs_client_lock);
 +      clp = idr_find(&nn->cb_ident_idr, cb_ident);
        if (clp)
                atomic_inc(&clp->cl_count);
 -      spin_unlock(&nfs_client_lock);
 +      spin_unlock(&nn->nfs_client_lock);
        return clp;
  }
  
   * Returns NULL if no such client
   */
  struct nfs_client *
 -nfs4_find_client_sessionid(const struct sockaddr *addr,
 +nfs4_find_client_sessionid(struct net *net, const struct sockaddr *addr,
                           struct nfs4_sessionid *sid)
  {
        struct nfs_client *clp;
 +      struct nfs_net *nn = net_generic(net, nfs_net_id);
  
 -      spin_lock(&nfs_client_lock);
 -      list_for_each_entry(clp, &nfs_client_list, cl_share_link) {
 +      spin_lock(&nn->nfs_client_lock);
 +      list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) {
                if (nfs4_cb_match_client(addr, clp, 1) == false)
                        continue;
  
                        continue;
  
                atomic_inc(&clp->cl_count);
 -              spin_unlock(&nfs_client_lock);
 +              spin_unlock(&nn->nfs_client_lock);
                return clp;
        }
 -      spin_unlock(&nfs_client_lock);
 +      spin_unlock(&nn->nfs_client_lock);
        return NULL;
  }
  
  #else /* CONFIG_NFS_V4_1 */
  
  struct nfs_client *
 -nfs4_find_client_sessionid(const struct sockaddr *addr,
 +nfs4_find_client_sessionid(struct net *net, const struct sockaddr *addr,
                           struct nfs4_sessionid *sid)
  {
        return NULL;
@@@ -1288,18 -1284,16 +1287,18 @@@ static int nfs4_init_callback(struct nf
        int error;
  
        if (clp->rpc_ops->version == 4) {
 +              struct rpc_xprt *xprt;
 +
 +              xprt = rcu_dereference_raw(clp->cl_rpcclient->cl_xprt);
 +
                if (nfs4_has_session(clp)) {
 -                      error = xprt_setup_backchannel(
 -                                              clp->cl_rpcclient->cl_xprt,
 +                      error = xprt_setup_backchannel(xprt,
                                                NFS41_BC_MIN_CALLBACKS);
                        if (error < 0)
                                return error;
                }
  
 -              error = nfs_callback_up(clp->cl_mvops->minor_version,
 -                                      clp->cl_rpcclient->cl_xprt);
 +              error = nfs_callback_up(clp->cl_mvops->minor_version, xprt);
                if (error < 0) {
                        dprintk("%s: failed to start callback. Error = %d\n",
                                __func__, error);
@@@ -1350,7 -1344,6 +1349,7 @@@ int nfs4_init_client(struct nfs_client 
                     rpc_authflavor_t authflavour,
                     int noresvport)
  {
 +      char buf[INET6_ADDRSTRLEN + 1];
        int error;
  
        if (clp->cl_cons_state == NFS_CS_READY) {
                                      1, noresvport);
        if (error < 0)
                goto error;
 +
 +      /* If no clientaddr= option was specified, find a usable cb address */
 +      if (ip_addr == NULL) {
 +              struct sockaddr_storage cb_addr;
 +              struct sockaddr *sap = (struct sockaddr *)&cb_addr;
 +
 +              error = rpc_localaddr(clp->cl_rpcclient, sap, sizeof(cb_addr));
 +              if (error < 0)
 +                      goto error;
 +              error = rpc_ntop(sap, buf, sizeof(buf));
 +              if (error < 0)
 +                      goto error;
 +              ip_addr = (const char *)buf;
 +      }
        strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
  
        error = nfs_idmap_new(clp);
@@@ -1414,7 -1393,7 +1413,7 @@@ static int nfs4_set_client(struct nfs_s
                const char *ip_addr,
                rpc_authflavor_t authflavour,
                int proto, const struct rpc_timeout *timeparms,
 -              u32 minorversion)
 +              u32 minorversion, struct net *net)
  {
        struct nfs_client_initdata cl_init = {
                .hostname = hostname,
                .rpc_ops = &nfs_v4_clientops,
                .proto = proto,
                .minorversion = minorversion,
 +              .net = net,
        };
        struct nfs_client *clp;
        int error;
@@@ -1475,7 -1453,6 +1474,7 @@@ struct nfs_client *nfs4_set_ds_client(s
                .rpc_ops = &nfs_v4_clientops,
                .proto = ds_proto,
                .minorversion = mds_clp->cl_minorversion,
 +              .net = mds_clp->net,
        };
        struct rpc_timeout ds_timeout = {
                .to_initval = 15 * HZ,
@@@ -1603,8 -1580,7 +1602,8 @@@ static int nfs4_init_server(struct nfs_
                        data->auth_flavors[0],
                        data->nfs_server.protocol,
                        &timeparms,
 -                      data->minorversion);
 +                      data->minorversion,
 +                      data->net);
        if (error < 0)
                goto error;
  
@@@ -1699,10 -1675,9 +1698,10 @@@ struct nfs_server *nfs4_create_referral
                                data->addrlen,
                                parent_client->cl_ipaddr,
                                data->authflavor,
 -                              parent_server->client->cl_xprt->prot,
 +                              rpc_protocol(parent_server->client),
                                parent_server->client->cl_timeout,
 -                              parent_client->cl_mvops->minor_version);
 +                              parent_client->cl_mvops->minor_version,
 +                              parent_client->net);
        if (error < 0)
                goto error;
  
@@@ -1795,18 -1770,6 +1794,18 @@@ out_free_server
        return ERR_PTR(error);
  }
  
 +void nfs_clients_init(struct net *net)
 +{
 +      struct nfs_net *nn = net_generic(net, nfs_net_id);
 +
 +      INIT_LIST_HEAD(&nn->nfs_client_list);
 +      INIT_LIST_HEAD(&nn->nfs_volume_list);
 +#ifdef CONFIG_NFS_V4
 +      idr_init(&nn->cb_ident_idr);
 +#endif
 +      spin_lock_init(&nn->nfs_client_lock);
 +}
 +
  #ifdef CONFIG_PROC_FS
  static struct proc_dir_entry *proc_fs_nfs;
  
@@@ -1860,15 -1823,13 +1859,15 @@@ static int nfs_server_list_open(struct 
  {
        struct seq_file *m;
        int ret;
 +      struct pid_namespace *pid_ns = file->f_dentry->d_sb->s_fs_info;
 +      struct net *net = pid_ns->child_reaper->nsproxy->net_ns;
  
        ret = seq_open(file, &nfs_server_list_ops);
        if (ret < 0)
                return ret;
  
        m = file->private_data;
 -      m->private = PDE(inode)->data;
 +      m->private = net;
  
        return 0;
  }
   */
  static void *nfs_server_list_start(struct seq_file *m, loff_t *_pos)
  {
 +      struct nfs_net *nn = net_generic(m->private, nfs_net_id);
 +
        /* lock the list against modification */
 -      spin_lock(&nfs_client_lock);
 -      return seq_list_start_head(&nfs_client_list, *_pos);
 +      spin_lock(&nn->nfs_client_lock);
 +      return seq_list_start_head(&nn->nfs_client_list, *_pos);
  }
  
  /*
   */
  static void *nfs_server_list_next(struct seq_file *p, void *v, loff_t *pos)
  {
 -      return seq_list_next(v, &nfs_client_list, pos);
 +      struct nfs_net *nn = net_generic(p->private, nfs_net_id);
 +
 +      return seq_list_next(v, &nn->nfs_client_list, pos);
  }
  
  /*
   */
  static void nfs_server_list_stop(struct seq_file *p, void *v)
  {
 -      spin_unlock(&nfs_client_lock);
 +      struct nfs_net *nn = net_generic(p->private, nfs_net_id);
 +
 +      spin_unlock(&nn->nfs_client_lock);
  }
  
  /*
  static int nfs_server_list_show(struct seq_file *m, void *v)
  {
        struct nfs_client *clp;
 +      struct nfs_net *nn = net_generic(m->private, nfs_net_id);
  
        /* display header on line 1 */
 -      if (v == &nfs_client_list) {
 +      if (v == &nn->nfs_client_list) {
                seq_puts(m, "NV SERVER   PORT USE HOSTNAME\n");
                return 0;
        }
        if (clp->cl_cons_state != NFS_CS_READY)
                return 0;
  
 +      rcu_read_lock();
        seq_printf(m, "v%u %s %s %3d %s\n",
                   clp->rpc_ops->version,
                   rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR),
                   rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_PORT),
                   atomic_read(&clp->cl_count),
                   clp->cl_hostname);
 +      rcu_read_unlock();
  
        return 0;
  }
@@@ -1945,15 -1897,13 +1944,15 @@@ static int nfs_volume_list_open(struct 
  {
        struct seq_file *m;
        int ret;
 +      struct pid_namespace *pid_ns = file->f_dentry->d_sb->s_fs_info;
 +      struct net *net = pid_ns->child_reaper->nsproxy->net_ns;
  
        ret = seq_open(file, &nfs_volume_list_ops);
        if (ret < 0)
                return ret;
  
        m = file->private_data;
 -      m->private = PDE(inode)->data;
 +      m->private = net;
  
        return 0;
  }
   */
  static void *nfs_volume_list_start(struct seq_file *m, loff_t *_pos)
  {
 +      struct nfs_net *nn = net_generic(m->private, nfs_net_id);
 +
        /* lock the list against modification */
 -      spin_lock(&nfs_client_lock);
 -      return seq_list_start_head(&nfs_volume_list, *_pos);
 +      spin_lock(&nn->nfs_client_lock);
 +      return seq_list_start_head(&nn->nfs_volume_list, *_pos);
  }
  
  /*
   */
  static void *nfs_volume_list_next(struct seq_file *p, void *v, loff_t *pos)
  {
 -      return seq_list_next(v, &nfs_volume_list, pos);
 +      struct nfs_net *nn = net_generic(p->private, nfs_net_id);
 +
 +      return seq_list_next(v, &nn->nfs_volume_list, pos);
  }
  
  /*
   */
  static void nfs_volume_list_stop(struct seq_file *p, void *v)
  {
 -      spin_unlock(&nfs_client_lock);
 +      struct nfs_net *nn = net_generic(p->private, nfs_net_id);
 +
 +      spin_unlock(&nn->nfs_client_lock);
  }
  
  /*
@@@ -1998,10 -1942,9 +1997,10 @@@ static int nfs_volume_list_show(struct 
        struct nfs_server *server;
        struct nfs_client *clp;
        char dev[8], fsid[17];
 +      struct nfs_net *nn = net_generic(m->private, nfs_net_id);
  
        /* display header on line 1 */
 -      if (v == &nfs_volume_list) {
 +      if (v == &nn->nfs_volume_list) {
                seq_puts(m, "NV SERVER   PORT DEV     FSID              FSC\n");
                return 0;
        }
                 (unsigned long long) server->fsid.major,
                 (unsigned long long) server->fsid.minor);
  
 +      rcu_read_lock();
        seq_printf(m, "v%u %s %s %-7s %-17s %s\n",
                   clp->rpc_ops->version,
                   rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR),
                   dev,
                   fsid,
                   nfs_server_fscache_state(server));
 +      rcu_read_unlock();
  
        return 0;
  }
diff --combined fs/nfs/direct.c
@@@ -51,7 -51,6 +51,6 @@@
  #include <linux/nfs_page.h>
  #include <linux/sunrpc/clnt.h>
  
- #include <asm/system.h>
  #include <asm/uaccess.h>
  #include <linux/atomic.h>
  
@@@ -265,7 -264,9 +264,7 @@@ static void nfs_direct_read_release(voi
  }
  
  static const struct rpc_call_ops nfs_read_direct_ops = {
 -#if defined(CONFIG_NFS_V4_1)
        .rpc_call_prepare = nfs_read_prepare,
 -#endif /* CONFIG_NFS_V4_1 */
        .rpc_call_done = nfs_direct_read_result,
        .rpc_release = nfs_direct_read_release,
  };
@@@ -552,7 -553,9 +551,7 @@@ static void nfs_direct_commit_release(v
  }
  
  static const struct rpc_call_ops nfs_commit_direct_ops = {
 -#if defined(CONFIG_NFS_V4_1)
        .rpc_call_prepare = nfs_write_prepare,
 -#endif /* CONFIG_NFS_V4_1 */
        .rpc_call_done = nfs_direct_commit_result,
        .rpc_release = nfs_direct_commit_release,
  };
@@@ -692,7 -695,9 +691,7 @@@ out_unlock
  }
  
  static const struct rpc_call_ops nfs_write_direct_ops = {
 -#if defined(CONFIG_NFS_V4_1)
        .rpc_call_prepare = nfs_write_prepare,
 -#endif /* CONFIG_NFS_V4_1 */
        .rpc_call_done = nfs_direct_write_result,
        .rpc_release = nfs_direct_write_release,
  };
diff --combined fs/nfs/file.c
@@@ -30,7 -30,6 +30,6 @@@
  #include <linux/swap.h>
  
  #include <asm/uaccess.h>
- #include <asm/system.h>
  
  #include "delegation.h"
  #include "internal.h"
@@@ -530,8 -529,6 +529,8 @@@ static int nfs_vm_page_mkwrite(struct v
        if (mapping != dentry->d_inode->i_mapping)
                goto out_unlock;
  
 +      wait_on_page_writeback(page);
 +
        pagelen = nfs_page_length(page);
        if (pagelen == 0)
                goto out_unlock;
diff --combined fs/nfs/inode.c
@@@ -39,9 -39,7 +39,8 @@@
  #include <linux/slab.h>
  #include <linux/compat.h>
  #include <linux/freezer.h>
 +#include <linux/crc32.h>
  
- #include <asm/system.h>
  #include <asm/uaccess.h>
  
  #include "nfs4_fs.h"
@@@ -52,7 -50,6 +51,7 @@@
  #include "fscache.h"
  #include "dns_resolve.h"
  #include "pnfs.h"
 +#include "netns.h"
  
  #define NFSDBG_FACILITY               NFSDBG_VFS
  
@@@ -390,10 -387,9 +389,10 @@@ nfs_fhget(struct super_block *sb, struc
                unlock_new_inode(inode);
        } else
                nfs_refresh_inode(inode, fattr);
 -      dprintk("NFS: nfs_fhget(%s/%Ld ct=%d)\n",
 +      dprintk("NFS: nfs_fhget(%s/%Ld fh_crc=0x%08x ct=%d)\n",
                inode->i_sb->s_id,
                (long long)NFS_FILEID(inode),
 +              nfs_display_fhandle_hash(fh),
                atomic_read(&inode->i_count));
  
  out:
@@@ -404,7 -400,7 +403,7 @@@ out_no_inode
        goto out;
  }
  
 -#define NFS_VALID_ATTRS (ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_SIZE|ATTR_ATIME|ATTR_ATIME_SET|ATTR_MTIME|ATTR_MTIME_SET|ATTR_FILE)
 +#define NFS_VALID_ATTRS (ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_SIZE|ATTR_ATIME|ATTR_ATIME_SET|ATTR_MTIME|ATTR_MTIME_SET|ATTR_FILE|ATTR_OPEN)
  
  int
  nfs_setattr(struct dentry *dentry, struct iattr *attr)
  
        /* Optimization: if the end result is no change, don't RPC */
        attr->ia_valid &= NFS_VALID_ATTRS;
 -      if ((attr->ia_valid & ~ATTR_FILE) == 0)
 +      if ((attr->ia_valid & ~(ATTR_FILE|ATTR_OPEN)) == 0)
                return 0;
  
        /* Write all dirty data */
@@@ -1047,67 -1043,6 +1046,67 @@@ struct nfs_fh *nfs_alloc_fhandle(void
        return fh;
  }
  
 +#ifdef NFS_DEBUG
 +/*
 + * _nfs_display_fhandle_hash - calculate the crc32 hash for the filehandle
 + *                             in the same way that wireshark does
 + *
 + * @fh: file handle
 + *
 + * For debugging only.
 + */
 +u32 _nfs_display_fhandle_hash(const struct nfs_fh *fh)
 +{
 +      /* wireshark uses 32-bit AUTODIN crc and does a bitwise
 +       * not on the result */
 +      return ~crc32(0xFFFFFFFF, &fh->data[0], fh->size);
 +}
 +
 +/*
 + * _nfs_display_fhandle - display an NFS file handle on the console
 + *
 + * @fh: file handle to display
 + * @caption: display caption
 + *
 + * For debugging only.
 + */
 +void _nfs_display_fhandle(const struct nfs_fh *fh, const char *caption)
 +{
 +      unsigned short i;
 +
 +      if (fh == NULL || fh->size == 0) {
 +              printk(KERN_DEFAULT "%s at %p is empty\n", caption, fh);
 +              return;
 +      }
 +
 +      printk(KERN_DEFAULT "%s at %p is %u bytes, crc: 0x%08x:\n",
 +             caption, fh, fh->size, _nfs_display_fhandle_hash(fh));
 +      for (i = 0; i < fh->size; i += 16) {
 +              __be32 *pos = (__be32 *)&fh->data[i];
 +
 +              switch ((fh->size - i - 1) >> 2) {
 +              case 0:
 +                      printk(KERN_DEFAULT " %08x\n",
 +                              be32_to_cpup(pos));
 +                      break;
 +              case 1:
 +                      printk(KERN_DEFAULT " %08x %08x\n",
 +                              be32_to_cpup(pos), be32_to_cpup(pos + 1));
 +                      break;
 +              case 2:
 +                      printk(KERN_DEFAULT " %08x %08x %08x\n",
 +                              be32_to_cpup(pos), be32_to_cpup(pos + 1),
 +                              be32_to_cpup(pos + 2));
 +                      break;
 +              default:
 +                      printk(KERN_DEFAULT " %08x %08x %08x %08x\n",
 +                              be32_to_cpup(pos), be32_to_cpup(pos + 1),
 +                              be32_to_cpup(pos + 2), be32_to_cpup(pos + 3));
 +              }
 +      }
 +}
 +#endif
 +
  /**
   * nfs_inode_attrs_need_update - check if the inode attributes need updating
   * @inode - pointer to inode
@@@ -1275,9 -1210,8 +1274,9 @@@ static int nfs_update_inode(struct inod
        unsigned long now = jiffies;
        unsigned long save_cache_validity;
  
 -      dfprintk(VFS, "NFS: %s(%s/%ld ct=%d info=0x%x)\n",
 +      dfprintk(VFS, "NFS: %s(%s/%ld fh_crc=0x%08x ct=%d info=0x%x)\n",
                        __func__, inode->i_sb->s_id, inode->i_ino,
 +                      nfs_display_fhandle_hash(NFS_FH(inode)),
                        atomic_read(&inode->i_count), fattr->valid);
  
        if ((fattr->valid & NFS_ATTR_FATTR_FILEID) && nfsi->fileid != fattr->fileid)
        /*
         * Big trouble! The inode has become a different object.
         */
 -      printk(KERN_DEBUG "%s: inode %ld mode changed, %07o to %07o\n",
 +      printk(KERN_DEBUG "NFS: %s: inode %ld mode changed, %07o to %07o\n",
                        __func__, inode->i_ino, inode->i_mode, fattr->mode);
   out_err:
        /*
@@@ -1560,7 -1494,7 +1559,7 @@@ static void init_once(void *foo
        INIT_LIST_HEAD(&nfsi->open_files);
        INIT_LIST_HEAD(&nfsi->access_cache_entry_lru);
        INIT_LIST_HEAD(&nfsi->access_cache_inode_lru);
 -      INIT_RADIX_TREE(&nfsi->nfs_page_tree, GFP_ATOMIC);
 +      INIT_LIST_HEAD(&nfsi->commit_list);
        nfsi->npages = 0;
        nfsi->ncommit = 0;
        atomic_set(&nfsi->silly_count, 1);
@@@ -1617,28 -1551,6 +1616,28 @@@ static void nfsiod_stop(void
        destroy_workqueue(wq);
  }
  
 +int nfs_net_id;
 +EXPORT_SYMBOL_GPL(nfs_net_id);
 +
 +static int nfs_net_init(struct net *net)
 +{
 +      nfs_clients_init(net);
 +      return nfs_dns_resolver_cache_init(net);
 +}
 +
 +static void nfs_net_exit(struct net *net)
 +{
 +      nfs_dns_resolver_cache_destroy(net);
 +      nfs_cleanup_cb_ident_idr(net);
 +}
 +
 +static struct pernet_operations nfs_net_ops = {
 +      .init = nfs_net_init,
 +      .exit = nfs_net_exit,
 +      .id   = &nfs_net_id,
 +      .size = sizeof(struct nfs_net),
 +};
 +
  /*
   * Initialize NFS
   */
@@@ -1648,14 -1560,10 +1647,14 @@@ static int __init init_nfs_fs(void
  
        err = nfs_idmap_init();
        if (err < 0)
 -              goto out9;
 +              goto out10;
  
        err = nfs_dns_resolver_init();
        if (err < 0)
 +              goto out9;
 +
 +      err = register_pernet_subsys(&nfs_net_ops);
 +      if (err < 0)
                goto out8;
  
        err = nfs_fscache_register();
                goto out0;
  
  #ifdef CONFIG_PROC_FS
 -      rpc_proc_register(&nfs_rpcstat);
 +      rpc_proc_register(&init_net, &nfs_rpcstat);
  #endif
        if ((err = register_nfs_fs()) != 0)
                goto out;
        return 0;
  out:
  #ifdef CONFIG_PROC_FS
 -      rpc_proc_unregister("nfs");
 +      rpc_proc_unregister(&init_net, "nfs");
  #endif
        nfs_destroy_directcache();
  out0:
@@@ -1716,12 -1624,10 +1715,12 @@@ out5
  out6:
        nfs_fscache_unregister();
  out7:
 -      nfs_dns_resolver_destroy();
 +      unregister_pernet_subsys(&nfs_net_ops);
  out8:
 -      nfs_idmap_quit();
 +      nfs_dns_resolver_destroy();
  out9:
 +      nfs_idmap_quit();
 +out10:
        return err;
  }
  
@@@ -1733,12 -1639,12 +1732,12 @@@ static void __exit exit_nfs_fs(void
        nfs_destroy_inodecache();
        nfs_destroy_nfspagecache();
        nfs_fscache_unregister();
 +      unregister_pernet_subsys(&nfs_net_ops);
        nfs_dns_resolver_destroy();
        nfs_idmap_quit();
  #ifdef CONFIG_PROC_FS
 -      rpc_proc_unregister("nfs");
 +      rpc_proc_unregister(&init_net, "nfs");
  #endif
 -      nfs_cleanup_cb_ident_idr();
        unregister_nfs_fs();
        nfs_fs_proc_exit();
        nfsiod_stop();
diff --combined fs/nfs/read.c
@@@ -20,7 -20,6 +20,6 @@@
  #include <linux/nfs_page.h>
  #include <linux/module.h>
  
- #include <asm/system.h>
  #include "pnfs.h"
  
  #include "nfs4_fs.h"
@@@ -66,6 -65,7 +65,6 @@@ void nfs_readdata_free(struct nfs_read_
  
  void nfs_readdata_release(struct nfs_read_data *rdata)
  {
 -      put_lseg(rdata->lseg);
        put_nfs_open_context(rdata->args.context);
        nfs_readdata_free(rdata);
  }
@@@ -464,14 -464,23 +463,14 @@@ static void nfs_readpage_release_partia
        nfs_readdata_release(calldata);
  }
  
  void nfs_read_prepare(struct rpc_task *task, void *calldata)
  {
        struct nfs_read_data *data = calldata;
 -
 -      if (nfs4_setup_sequence(NFS_SERVER(data->inode),
 -                              &data->args.seq_args, &data->res.seq_res,
 -                              0, task))
 -              return;
 -      rpc_call_start(task);
 +      NFS_PROTO(data->inode)->read_rpc_prepare(task, data);
  }
 -#endif /* CONFIG_NFS_V4_1 */
  
  static const struct rpc_call_ops nfs_read_partial_ops = {
 -#if defined(CONFIG_NFS_V4_1)
        .rpc_call_prepare = nfs_read_prepare,
 -#endif /* CONFIG_NFS_V4_1 */
        .rpc_call_done = nfs_readpage_result_partial,
        .rpc_release = nfs_readpage_release_partial,
  };
@@@ -535,7 -544,9 +534,7 @@@ static void nfs_readpage_release_full(v
  }
  
  static const struct rpc_call_ops nfs_read_full_ops = {
 -#if defined(CONFIG_NFS_V4_1)
        .rpc_call_prepare = nfs_read_prepare,
 -#endif /* CONFIG_NFS_V4_1 */
        .rpc_call_done = nfs_readpage_result_full,
        .rpc_release = nfs_readpage_release_full,
  };
diff --combined fs/nfs/super.c
  #include <linux/nfs_xdr.h>
  #include <linux/magic.h>
  #include <linux/parser.h>
 +#include <linux/nsproxy.h>
 +#include <linux/rcupdate.h>
  
- #include <asm/system.h>
  #include <asm/uaccess.h>
  
  #include "nfs4_fs.h"
@@@ -81,6 -78,7 +80,6 @@@ enum 
        Opt_cto, Opt_nocto,
        Opt_ac, Opt_noac,
        Opt_lock, Opt_nolock,
 -      Opt_v2, Opt_v3, Opt_v4,
        Opt_udp, Opt_tcp, Opt_rdma,
        Opt_acl, Opt_noacl,
        Opt_rdirplus, Opt_nordirplus,
        Opt_namelen,
        Opt_mountport,
        Opt_mountvers,
        Opt_minorversion,
  
        /* Mount options that take string arguments */
 +      Opt_nfsvers,
        Opt_sec, Opt_proto, Opt_mountproto, Opt_mounthost,
        Opt_addr, Opt_mountaddr, Opt_clientaddr,
        Opt_lookupcache,
@@@ -133,6 -131,9 +132,6 @@@ static const match_table_t nfs_mount_op
        { Opt_noac, "noac" },
        { Opt_lock, "lock" },
        { Opt_nolock, "nolock" },
 -      { Opt_v2, "v2" },
 -      { Opt_v3, "v3" },
 -      { Opt_v4, "v4" },
        { Opt_udp, "udp" },
        { Opt_tcp, "tcp" },
        { Opt_rdma, "rdma" },
        { Opt_namelen, "namlen=%s" },
        { Opt_mountport, "mountport=%s" },
        { Opt_mountvers, "mountvers=%s" },
 +      { Opt_minorversion, "minorversion=%s" },
 +
        { Opt_nfsvers, "nfsvers=%s" },
        { Opt_nfsvers, "vers=%s" },
 -      { Opt_minorversion, "minorversion=%s" },
  
        { Opt_sec, "sec=%s" },
        { Opt_proto, "proto=%s" },
        { Opt_fscache_uniq, "fsc=%s" },
        { Opt_local_lock, "local_lock=%s" },
  
 +      /* The following needs to be listed after all other options */
 +      { Opt_nfsvers, "v%s" },
 +
        { Opt_err, NULL }
  };
  
@@@ -261,22 -258,6 +260,22 @@@ static match_table_t nfs_local_lock_tok
        { Opt_local_lock_err, NULL }
  };
  
 +enum {
 +      Opt_vers_2, Opt_vers_3, Opt_vers_4, Opt_vers_4_0,
 +      Opt_vers_4_1,
 +
 +      Opt_vers_err
 +};
 +
 +static match_table_t nfs_vers_tokens = {
 +      { Opt_vers_2, "2" },
 +      { Opt_vers_3, "3" },
 +      { Opt_vers_4, "4" },
 +      { Opt_vers_4_0, "4.0" },
 +      { Opt_vers_4_1, "4.1" },
 +
 +      { Opt_vers_err, NULL }
 +};
  
  static void nfs_umount_begin(struct super_block *);
  static int  nfs_statfs(struct dentry *, struct kstatfs *);
@@@ -638,6 -619,7 +637,6 @@@ static void nfs_show_nfsv4_options(stru
        struct nfs_client *clp = nfss->nfs_client;
  
        seq_printf(m, ",clientaddr=%s", clp->cl_ipaddr);
 -      seq_printf(m, ",minorversion=%u", clp->cl_minorversion);
  }
  #else
  static void nfs_show_nfsv4_options(struct seq_file *m, struct nfs_server *nfss,
  }
  #endif
  
 +static void nfs_show_nfs_version(struct seq_file *m,
 +              unsigned int version,
 +              unsigned int minorversion)
 +{
 +      seq_printf(m, ",vers=%u", version);
 +      if (version == 4)
 +              seq_printf(m, ".%u", minorversion);
 +}
 +
  /*
   * Describe the mount options in force on this server representation
   */
@@@ -682,7 -655,7 +681,7 @@@ static void nfs_show_mount_options(stru
        u32 version = clp->rpc_ops->version;
        int local_flock, local_fcntl;
  
 -      seq_printf(m, ",vers=%u", version);
 +      nfs_show_nfs_version(m, version, clp->cl_minorversion);
        seq_printf(m, ",rsize=%u", nfss->rsize);
        seq_printf(m, ",wsize=%u", nfss->wsize);
        if (nfss->bsize != 0)
                else
                        seq_puts(m, nfs_infop->nostr);
        }
 +      rcu_read_lock();
        seq_printf(m, ",proto=%s",
                   rpc_peeraddr2str(nfss->client, RPC_DISPLAY_NETID));
 +      rcu_read_unlock();
        if (version == 4) {
                if (nfss->port != NFS_PORT)
                        seq_printf(m, ",port=%u", nfss->port);
@@@ -754,11 -725,9 +753,11 @@@ static int nfs_show_options(struct seq_
  
        nfs_show_mount_options(m, nfss, 0);
  
 +      rcu_read_lock();
        seq_printf(m, ",addr=%s",
                        rpc_peeraddr2str(nfss->nfs_client->cl_rpcclient,
                                                        RPC_DISPLAY_ADDR));
 +      rcu_read_unlock();
  
        return 0;
  }
@@@ -775,6 -744,7 +774,6 @@@ static void show_sessions(struct seq_fi
  #endif
  #endif
  
 -#ifdef CONFIG_NFS_V4
  #ifdef CONFIG_NFS_V4_1
  static void show_pnfs(struct seq_file *m, struct nfs_server *server)
  {
        else
                seq_printf(m, "not configured");
  }
 +
 +static void show_implementation_id(struct seq_file *m, struct nfs_server *nfss)
 +{
 +      if (nfss->nfs_client && nfss->nfs_client->impl_id) {
 +              struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
 +              seq_printf(m, "\n\timpl_id:\tname='%s',domain='%s',"
 +                         "date='%llu,%u'",
 +                         impl_id->name, impl_id->domain,
 +                         impl_id->date.seconds, impl_id->date.nseconds);
 +      }
 +}
  #else
 -static void show_pnfs(struct seq_file *m, struct nfs_server *server) {}
 +#ifdef CONFIG_NFS_V4
 +static void show_pnfs(struct seq_file *m, struct nfs_server *server)
 +{
 +}
  #endif
 +static void show_implementation_id(struct seq_file *m, struct nfs_server *nfss)
 +{
 +}
  #endif
  
  static int nfs_show_devname(struct seq_file *m, struct dentry *root)
@@@ -852,8 -805,6 +851,8 @@@ static int nfs_show_stats(struct seq_fi
  
        seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
  
 +      show_implementation_id(m, nfss);
 +
        seq_printf(m, "\n\tcaps:\t");
        seq_printf(m, "caps=0x%x", nfss->caps);
        seq_printf(m, ",wtmult=%u", nfss->wtmult);
@@@ -956,7 -907,6 +955,7 @@@ static struct nfs_parsed_mount_data *nf
                data->auth_flavor_len   = 1;
                data->version           = version;
                data->minorversion      = 0;
 +              data->net               = current->nsproxy->net_ns;
                security_init_mnt_opts(&data->lsm_opts);
        }
        return data;
@@@ -1101,40 -1051,6 +1100,40 @@@ static int nfs_parse_security_flavors(c
        return 1;
  }
  
 +static int nfs_parse_version_string(char *string,
 +              struct nfs_parsed_mount_data *mnt,
 +              substring_t *args)
 +{
 +      mnt->flags &= ~NFS_MOUNT_VER3;
 +      switch (match_token(string, nfs_vers_tokens, args)) {
 +      case Opt_vers_2:
 +              mnt->version = 2;
 +              break;
 +      case Opt_vers_3:
 +              mnt->flags |= NFS_MOUNT_VER3;
 +              mnt->version = 3;
 +              break;
 +      case Opt_vers_4:
 +              /* Backward compatibility option. In future,
 +               * the mount program should always supply
 +               * a NFSv4 minor version number.
 +               */
 +              mnt->version = 4;
 +              break;
 +      case Opt_vers_4_0:
 +              mnt->version = 4;
 +              mnt->minorversion = 0;
 +              break;
 +      case Opt_vers_4_1:
 +              mnt->version = 4;
 +              mnt->minorversion = 1;
 +              break;
 +      default:
 +              return 0;
 +      }
 +      return 1;
 +}
 +
  static int nfs_get_option_str(substring_t args[], char **option)
  {
        kfree(*option);
@@@ -1240,6 -1156,18 +1239,6 @@@ static int nfs_parse_mount_options(cha
                        mnt->flags |= (NFS_MOUNT_LOCAL_FLOCK |
                                       NFS_MOUNT_LOCAL_FCNTL);
                        break;
 -              case Opt_v2:
 -                      mnt->flags &= ~NFS_MOUNT_VER3;
 -                      mnt->version = 2;
 -                      break;
 -              case Opt_v3:
 -                      mnt->flags |= NFS_MOUNT_VER3;
 -                      mnt->version = 3;
 -                      break;
 -              case Opt_v4:
 -                      mnt->flags &= ~NFS_MOUNT_VER3;
 -                      mnt->version = 4;
 -                      break;
                case Opt_udp:
                        mnt->flags &= ~NFS_MOUNT_TCP;
                        mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP;
                                goto out_invalid_value;
                        mnt->mount_server.version = option;
                        break;
 -              case Opt_nfsvers:
 -                      if (nfs_get_option_ul(args, &option))
 -                              goto out_invalid_value;
 -                      switch (option) {
 -                      case NFS2_VERSION:
 -                              mnt->flags &= ~NFS_MOUNT_VER3;
 -                              mnt->version = 2;
 -                              break;
 -                      case NFS3_VERSION:
 -                              mnt->flags |= NFS_MOUNT_VER3;
 -                              mnt->version = 3;
 -                              break;
 -                      case NFS4_VERSION:
 -                              mnt->flags &= ~NFS_MOUNT_VER3;
 -                              mnt->version = 4;
 -                              break;
 -                      default:
 -                              goto out_invalid_value;
 -                      }
 -                      break;
                case Opt_minorversion:
                        if (nfs_get_option_ul(args, &option))
                                goto out_invalid_value;
                /*
                 * options that take text values
                 */
 +              case Opt_nfsvers:
 +                      string = match_strdup(args);
 +                      if (string == NULL)
 +                              goto out_nomem;
 +                      rc = nfs_parse_version_string(string, mnt, args);
 +                      kfree(string);
 +                      if (!rc)
 +                              goto out_invalid_value;
 +                      break;
                case Opt_sec:
                        string = match_strdup(args);
                        if (string == NULL)
                        if (string == NULL)
                                goto out_nomem;
                        mnt->nfs_server.addrlen =
 -                              rpc_pton(string, strlen(string),
 +                              rpc_pton(mnt->net, string, strlen(string),
                                        (struct sockaddr *)
                                        &mnt->nfs_server.address,
                                        sizeof(mnt->nfs_server.address));
                        if (string == NULL)
                                goto out_nomem;
                        mnt->mount_server.addrlen =
 -                              rpc_pton(string, strlen(string),
 +                              rpc_pton(mnt->net, string, strlen(string),
                                        (struct sockaddr *)
                                        &mnt->mount_server.address,
                                        sizeof(mnt->mount_server.address));
        if (!sloppy && invalid_option)
                return 0;
  
 +      if (mnt->minorversion && mnt->version != 4)
 +              goto out_minorversion_mismatch;
 +
        /*
         * verify that any proto=/mountproto= options match the address
         * familiies in the addr=/mountaddr= options.
@@@ -1612,10 -1548,6 +1611,10 @@@ out_invalid_address
  out_invalid_value:
        printk(KERN_INFO "NFS: bad mount option value specified: %s\n", p);
        return 0;
 +out_minorversion_mismatch:
 +      printk(KERN_INFO "NFS: mount option vers=%u does not support "
 +                       "minorversion=%u\n", mnt->version, mnt->minorversion);
 +      return 0;
  out_nomem:
        printk(KERN_INFO "NFS: not enough memory to parse option\n");
        return 0;
@@@ -1689,7 -1621,6 +1688,7 @@@ static int nfs_try_mount(struct nfs_par
                .noresvport     = args->flags & NFS_MOUNT_NORESVPORT,
                .auth_flav_len  = &server_authlist_len,
                .auth_flavs     = server_authlist,
 +              .net            = args->net,
        };
        int status;
  
@@@ -2115,7 -2046,7 +2114,7 @@@ static inline void nfs_initialise_sb(st
  
        /* We probably want something more informative here */
        snprintf(sb->s_id, sizeof(sb->s_id),
 -               "%x:%x", MAJOR(sb->s_dev), MINOR(sb->s_dev));
 +               "%u:%u", MAJOR(sb->s_dev), MINOR(sb->s_dev));
  
        if (sb->s_blocksize == 0)
                sb->s_blocksize = nfs_block_bits(server->wsize,
@@@ -2567,6 -2498,12 +2566,6 @@@ static int nfs4_validate_text_mount_dat
                return -EINVAL;
        }
  
 -      if (args->client_address == NULL) {
 -              dfprintk(MOUNT,
 -                       "NFS4: mount program didn't pass callback address\n");
 -              return -EINVAL;
 -      }
 -
        return nfs_parse_devname(dev_name,
                                   &args->nfs_server.hostname,
                                   NFS4_MAXNAMLEN,
@@@ -2725,7 -2662,8 +2724,7 @@@ nfs4_remote_mount(struct file_system_ty
        if (!s->s_root) {
                /* initial superblock/root creation */
                nfs4_fill_super(s);
 -              nfs_fscache_get_super_cookie(
 -                      s, data ? data->fscache_uniq : NULL, NULL);
 +              nfs_fscache_get_super_cookie(s, data->fscache_uniq, NULL);
        }
  
        mntroot = nfs4_get_root(s, mntfh, dev_name);
@@@ -3,8 -3,6 +3,7 @@@
  
  #include <linux/kernel.h>
  #include <linux/atomic.h>
 +#include <linux/bug.h>
- #include <asm/system.h>
  
  struct task_struct;
  
diff --combined include/linux/ide.h
@@@ -14,6 -14,7 +14,6 @@@
  #include <linux/interrupt.h>
  #include <linux/bitops.h>
  #include <linux/bio.h>
 -#include <linux/device.h>
  #include <linux/pci.h>
  #include <linux/completion.h>
  #include <linux/pm.h>
@@@ -22,7 -23,6 +22,6 @@@
  #include <acpi/acpi.h>
  #endif
  #include <asm/byteorder.h>
- #include <asm/system.h>
  #include <asm/io.h>
  
  /* for request_sense */
@@@ -42,8 -42,6 +41,8 @@@
  #define ERROR_RESET   3       /* Reset controller every 4th retry */
  #define ERROR_RECAL   1       /* Recalibrate every 2nd retry */
  
 +struct device;
 +
  /* Error codes returned in rq->errors to the higher part of the driver. */
  enum {
        IDE_DRV_ERROR_GENERAL   = 101,
diff --combined include/linux/mm.h
@@@ -6,7 -6,6 +6,7 @@@
  #ifdef __KERNEL__
  
  #include <linux/gfp.h>
 +#include <linux/bug.h>
  #include <linux/list.h>
  #include <linux/mmzone.h>
  #include <linux/rbtree.h>
@@@ -112,7 -111,7 +112,7 @@@ extern unsigned int kobjsize(const voi
  #define VM_HUGEPAGE   0x01000000      /* MADV_HUGEPAGE marked this vma */
  #endif
  #define VM_INSERTPAGE 0x02000000      /* The vma has had "vm_insert_page()" done on it */
 -#define VM_ALWAYSDUMP 0x04000000      /* Always include in core dumps */
 +#define VM_NODUMP     0x04000000      /* Do not include in the core dump */
  
  #define VM_CAN_NONLINEAR 0x08000000   /* Has ->fault & does nonlinear pages */
  #define VM_MIXEDMAP   0x10000000      /* Can contain "struct page" and pure PFN pages */
@@@ -1258,6 -1257,8 +1258,8 @@@ static inline void pgtable_page_dtor(st
  extern void free_area_init(unsigned long * zones_size);
  extern void free_area_init_node(int nid, unsigned long * zones_size,
                unsigned long zone_start_pfn, unsigned long *zholes_size);
+ extern void free_initmem(void);
  #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
  /*
   * With CONFIG_HAVE_MEMBLOCK_NODE_MAP set, an architecture may initialise its
diff --combined include/linux/sched.h
@@@ -63,7 -63,6 +63,6 @@@ struct sched_param 
  #include <linux/nodemask.h>
  #include <linux/mm_types.h>
  
- #include <asm/system.h>
  #include <asm/page.h>
  #include <asm/ptrace.h>
  #include <asm/cputime.h>
@@@ -553,18 -552,6 +552,18 @@@ struct signal_struct 
        int                     group_stop_count;
        unsigned int            flags; /* see SIGNAL_* flags below */
  
 +      /*
 +       * PR_SET_CHILD_SUBREAPER marks a process, like a service
 +       * manager, to re-parent orphan (double-forking) child processes
 +       * to this process instead of 'init'. The service manager is
 +       * able to receive SIGCHLD signals and is able to investigate
 +       * the process until it calls wait(). All children of this
 +       * process will inherit a flag if they should look for a
 +       * child_subreaper process at exit.
 +       */
 +      unsigned int            is_child_subreaper:1;
 +      unsigned int            has_child_subreaper:1;
 +
        /* POSIX.1b Interval Timers */
        struct list_head posix_timers;
  
diff --combined include/linux/skbuff.h
@@@ -18,7 -18,6 +18,7 @@@
  #include <linux/kmemcheck.h>
  #include <linux/compiler.h>
  #include <linux/time.h>
 +#include <linux/bug.h>
  #include <linux/cache.h>
  
  #include <linux/atomic.h>
@@@ -501,7 -500,6 +501,6 @@@ struct sk_buff 
   */
  #include <linux/slab.h>
  
- #include <asm/system.h>
  
  /*
   * skb might have a dst pointer attached, refcounted or not.
@@@ -1245,7 -1243,7 +1244,7 @@@ static inline void skb_fill_page_desc(s
  }
  
  extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page,
 -                          int off, int size);
 +                          int off, int size, unsigned int truesize);
  
  #define SKB_PAGE_ASSERT(skb)  BUG_ON(skb_shinfo(skb)->nr_frags)
  #define SKB_FRAG_ASSERT(skb)  BUG_ON(skb_has_frag_list(skb))
diff --combined include/linux/spinlock.h
@@@ -55,8 -55,8 +55,8 @@@
  #include <linux/kernel.h>
  #include <linux/stringify.h>
  #include <linux/bottom_half.h>
+ #include <asm/barrier.h>
  
- #include <asm/system.h>
  
  /*
   * Must define these before including other files, inline functions need them
@@@ -375,7 -375,10 +375,7 @@@ static inline int spin_can_lock(spinloc
        return raw_spin_can_lock(&lock->rlock);
  }
  
 -static inline void assert_spin_locked(spinlock_t *lock)
 -{
 -      assert_raw_spin_locked(&lock->rlock);
 -}
 +#define assert_spin_locked(lock)      assert_raw_spin_locked(&(lock)->rlock)
  
  /*
   * Pull the atomic_t declaration:
diff --combined init/main.c
@@@ -87,7 -87,6 +87,6 @@@ extern void mca_init(void)
  extern void sbus_init(void);
  extern void prio_tree_init(void);
  extern void radix_tree_init(void);
- extern void free_initmem(void);
  #ifndef CONFIG_DEBUG_RODATA
  static inline void mark_rodata_ro(void) { }
  #endif
@@@ -400,7 -399,7 +399,7 @@@ static int __init do_early_param(char *
  
  void __init parse_early_options(char *cmdline)
  {
 -      parse_args("early options", cmdline, NULL, 0, do_early_param);
 +      parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
  }
  
  /* Arch code calls this early on, or if not, just before other parsing. */
@@@ -503,7 -502,7 +502,7 @@@ asmlinkage void __init start_kernel(voi
        parse_early_param();
        parse_args("Booting kernel", static_command_line, __start___param,
                   __stop___param - __start___param,
 -                 &unknown_bootoption);
 +                 0, 0, &unknown_bootoption);
  
        jump_label_init();
  
@@@ -699,69 -698,16 +698,69 @@@ int __init_or_module do_one_initcall(in
  }
  
  
 -extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[];
 +extern initcall_t __initcall_start[];
 +extern initcall_t __initcall0_start[];
 +extern initcall_t __initcall1_start[];
 +extern initcall_t __initcall2_start[];
 +extern initcall_t __initcall3_start[];
 +extern initcall_t __initcall4_start[];
 +extern initcall_t __initcall5_start[];
 +extern initcall_t __initcall6_start[];
 +extern initcall_t __initcall7_start[];
 +extern initcall_t __initcall_end[];
 +
 +static initcall_t *initcall_levels[] __initdata = {
 +      __initcall0_start,
 +      __initcall1_start,
 +      __initcall2_start,
 +      __initcall3_start,
 +      __initcall4_start,
 +      __initcall5_start,
 +      __initcall6_start,
 +      __initcall7_start,
 +      __initcall_end,
 +};
 +
 +static char *initcall_level_names[] __initdata = {
 +      "early parameters",
 +      "core parameters",
 +      "postcore parameters",
 +      "arch parameters",
 +      "subsys parameters",
 +      "fs parameters",
 +      "device parameters",
 +      "late parameters",
 +};
 +
 +static int __init ignore_unknown_bootoption(char *param, char *val)
 +{
 +      return 0;
 +}
  
 -static void __init do_initcalls(void)
 +static void __init do_initcall_level(int level)
  {
 +      extern const struct kernel_param __start___param[], __stop___param[];
        initcall_t *fn;
  
 -      for (fn = __early_initcall_end; fn < __initcall_end; fn++)
 +      strcpy(static_command_line, saved_command_line);
 +      parse_args(initcall_level_names[level],
 +                 static_command_line, __start___param,
 +                 __stop___param - __start___param,
 +                 level, level,
 +                 ignore_unknown_bootoption);
 +
 +      for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
                do_one_initcall(*fn);
  }
  
 +static void __init do_initcalls(void)
 +{
 +      int level;
 +
 +      for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)
 +              do_initcall_level(level);
 +}
 +
  /*
   * Ok, the machine is now initialized. None of the devices
   * have been touched yet, but the CPU subsystem is up and
@@@ -785,7 -731,7 +784,7 @@@ static void __init do_pre_smp_initcalls
  {
        initcall_t *fn;
  
 -      for (fn = __initcall_start; fn < __early_initcall_end; fn++)
 +      for (fn = __initcall_start; fn < __initcall0_start; fn++)
                do_one_initcall(*fn);
  }
  
@@@ -41,7 -41,6 +41,7 @@@
  #include <linux/delay.h>
  #include <linux/sched.h>
  #include <linux/sysrq.h>
 +#include <linux/reboot.h>
  #include <linux/init.h>
  #include <linux/kgdb.h>
  #include <linux/kdb.h>
@@@ -53,7 -52,6 +53,6 @@@
  #include <asm/cacheflush.h>
  #include <asm/byteorder.h>
  #include <linux/atomic.h>
- #include <asm/system.h>
  
  #include "debug_core.h"
  
@@@ -76,8 -74,6 +75,8 @@@ static int                    exception_level
  struct kgdb_io                *dbg_io_ops;
  static DEFINE_SPINLOCK(kgdb_registration_lock);
  
 +/* Action for the reboot notifiter, a global allow kdb to change it */
 +static int kgdbreboot;
  /* kgdb console driver is loaded */
  static int kgdb_con_registered;
  /* determine if kgdb console output should be used */
@@@ -99,7 -95,6 +98,7 @@@ static int __init opt_kgdb_con(char *st
  early_param("kgdbcon", opt_kgdb_con);
  
  module_param(kgdb_use_con, int, 0644);
 +module_param(kgdbreboot, int, 0644);
  
  /*
   * Holds information about breakpoints in a kernel. These breakpoints are
@@@ -788,33 -783,6 +787,33 @@@ void __init dbg_late_init(void
        kdb_init(KDB_INIT_FULL);
  }
  
 +static int
 +dbg_notify_reboot(struct notifier_block *this, unsigned long code, void *x)
 +{
 +      /*
 +       * Take the following action on reboot notify depending on value:
 +       *    1 == Enter debugger
 +       *    0 == [the default] detatch debug client
 +       *   -1 == Do nothing... and use this until the board resets
 +       */
 +      switch (kgdbreboot) {
 +      case 1:
 +              kgdb_breakpoint();
 +      case -1:
 +              goto done;
 +      }
 +      if (!dbg_kdb_mode)
 +              gdbstub_exit(code);
 +done:
 +      return NOTIFY_DONE;
 +}
 +
 +static struct notifier_block dbg_reboot_notifier = {
 +      .notifier_call          = dbg_notify_reboot,
 +      .next                   = NULL,
 +      .priority               = INT_MAX,
 +};
 +
  static void kgdb_register_callbacks(void)
  {
        if (!kgdb_io_module_registered) {
                kgdb_arch_init();
                if (!dbg_is_early)
                        kgdb_arch_late();
 +              register_reboot_notifier(&dbg_reboot_notifier);
                atomic_notifier_chain_register(&panic_notifier_list,
                                               &kgdb_panic_event_nb);
  #ifdef CONFIG_MAGIC_SYSRQ
@@@ -844,7 -811,6 +843,7 @@@ static void kgdb_unregister_callbacks(v
         */
        if (kgdb_io_module_registered) {
                kgdb_io_module_registered = 0;
 +              unregister_reboot_notifier(&dbg_reboot_notifier);
                atomic_notifier_chain_unregister(&panic_notifier_list,
                                               &kgdb_panic_event_nb);
                kgdb_arch_exit();
diff --combined kernel/signal.c
@@@ -36,6 -36,7 +36,7 @@@
  #include <asm/uaccess.h>
  #include <asm/unistd.h>
  #include <asm/siginfo.h>
+ #include <asm/cacheflush.h>
  #include "audit.h"    /* audit_signal_info() */
  
  /*
@@@ -58,20 -59,21 +59,20 @@@ static int sig_handler_ignored(void __u
                (handler == SIG_DFL && sig_kernel_ignore(sig));
  }
  
 -static int sig_task_ignored(struct task_struct *t, int sig,
 -              int from_ancestor_ns)
 +static int sig_task_ignored(struct task_struct *t, int sig, bool force)
  {
        void __user *handler;
  
        handler = sig_handler(t, sig);
  
        if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) &&
 -                      handler == SIG_DFL && !from_ancestor_ns)
 +                      handler == SIG_DFL && !force)
                return 1;
  
        return sig_handler_ignored(handler, sig);
  }
  
 -static int sig_ignored(struct task_struct *t, int sig, int from_ancestor_ns)
 +static int sig_ignored(struct task_struct *t, int sig, bool force)
  {
        /*
         * Blocked signals are never ignored, since the
@@@ -81,7 -83,7 +82,7 @@@
        if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig))
                return 0;
  
 -      if (!sig_task_ignored(t, sig, from_ancestor_ns))
 +      if (!sig_task_ignored(t, sig, force))
                return 0;
  
        /*
@@@ -854,7 -856,7 +855,7 @@@ static void ptrace_trap_notify(struct t
   * Returns true if the signal should be actually delivered, otherwise
   * it should be dropped.
   */
 -static int prepare_signal(int sig, struct task_struct *p, int from_ancestor_ns)
 +static int prepare_signal(int sig, struct task_struct *p, bool force)
  {
        struct signal_struct *signal = p->signal;
        struct task_struct *t;
                }
        }
  
 -      return !sig_ignored(p, sig, from_ancestor_ns);
 +      return !sig_ignored(p, sig, force);
  }
  
  /*
@@@ -1058,8 -1060,7 +1059,8 @@@ static int __send_signal(int sig, struc
        assert_spin_locked(&t->sighand->siglock);
  
        result = TRACE_SIGNAL_IGNORED;
 -      if (!prepare_signal(sig, t, from_ancestor_ns))
 +      if (!prepare_signal(sig, t,
 +                      from_ancestor_ns || (info == SEND_SIG_FORCED)))
                goto ret;
  
        pending = group ? &t->signal->shared_pending : &t->pending;
@@@ -1601,7 -1602,7 +1602,7 @@@ int send_sigqueue(struct sigqueue *q, s
  
        ret = 1; /* the signal is ignored */
        result = TRACE_SIGNAL_IGNORED;
 -      if (!prepare_signal(sig, t, 0))
 +      if (!prepare_signal(sig, t, false))
                goto out;
  
        ret = 0;
diff --combined kernel/sysctl.c
@@@ -68,6 -68,9 +68,9 @@@
  #include <asm/stacktrace.h>
  #include <asm/io.h>
  #endif
+ #ifdef CONFIG_SPARC
+ #include <asm/setup.h>
+ #endif
  #ifdef CONFIG_BSD_PROCESS_ACCT
  #include <linux/acct.h>
  #endif
@@@ -142,7 -145,6 +145,6 @@@ static const int cap_last_cap = CAP_LAS
  #include <linux/inotify.h>
  #endif
  #ifdef CONFIG_SPARC
- #include <asm/system.h>
  #endif
  
  #ifdef CONFIG_SPARC64
@@@ -193,6 -195,20 +195,6 @@@ static int sysrq_sysctl_handler(ctl_tab
  
  #endif
  
 -static struct ctl_table root_table[];
 -static struct ctl_table_root sysctl_table_root;
 -static struct ctl_table_header root_table_header = {
 -      {{.count = 1,
 -      .ctl_table = root_table,
 -      .ctl_entry = LIST_HEAD_INIT(sysctl_table_root.default_set.list),}},
 -      .root = &sysctl_table_root,
 -      .set = &sysctl_table_root.default_set,
 -};
 -static struct ctl_table_root sysctl_table_root = {
 -      .root_list = LIST_HEAD_INIT(sysctl_table_root.root_list),
 -      .default_set.list = LIST_HEAD_INIT(root_table_header.ctl_entry),
 -};
 -
  static struct ctl_table kern_table[];
  static struct ctl_table vm_table[];
  static struct ctl_table fs_table[];
@@@ -209,7 -225,7 +211,7 @@@ int sysctl_legacy_va_layout
  
  /* The default sysctl tables: */
  
 -static struct ctl_table root_table[] = {
 +static struct ctl_table sysctl_base_table[] = {
        {
                .procname       = "kernel",
                .mode           = 0555,
@@@ -1546,12 -1562,490 +1548,12 @@@ static struct ctl_table dev_table[] = 
        { }
  };
  
 -static DEFINE_SPINLOCK(sysctl_lock);
 -
 -/* called under sysctl_lock */
 -static int use_table(struct ctl_table_header *p)
 -{
 -      if (unlikely(p->unregistering))
 -              return 0;
 -      p->used++;
 -      return 1;
 -}
 -
 -/* called under sysctl_lock */
 -static void unuse_table(struct ctl_table_header *p)
 -{
 -      if (!--p->used)
 -              if (unlikely(p->unregistering))
 -                      complete(p->unregistering);
 -}
 -
 -/* called under sysctl_lock, will reacquire if has to wait */
 -static void start_unregistering(struct ctl_table_header *p)
 -{
 -      /*
 -       * if p->used is 0, nobody will ever touch that entry again;
 -       * we'll eliminate all paths to it before dropping sysctl_lock
 -       */
 -      if (unlikely(p->used)) {
 -              struct completion wait;
 -              init_completion(&wait);
 -              p->unregistering = &wait;
 -              spin_unlock(&sysctl_lock);
 -              wait_for_completion(&wait);
 -              spin_lock(&sysctl_lock);
 -      } else {
 -              /* anything non-NULL; we'll never dereference it */
 -              p->unregistering = ERR_PTR(-EINVAL);
 -      }
 -      /*
 -       * do not remove from the list until nobody holds it; walking the
 -       * list in do_sysctl() relies on that.
 -       */
 -      list_del_init(&p->ctl_entry);
 -}
 -
 -void sysctl_head_get(struct ctl_table_header *head)
 -{
 -      spin_lock(&sysctl_lock);
 -      head->count++;
 -      spin_unlock(&sysctl_lock);
 -}
 -
 -void sysctl_head_put(struct ctl_table_header *head)
 -{
 -      spin_lock(&sysctl_lock);
 -      if (!--head->count)
 -              kfree_rcu(head, rcu);
 -      spin_unlock(&sysctl_lock);
 -}
 -
 -struct ctl_table_header *sysctl_head_grab(struct ctl_table_header *head)
 -{
 -      if (!head)
 -              BUG();
 -      spin_lock(&sysctl_lock);
 -      if (!use_table(head))
 -              head = ERR_PTR(-ENOENT);
 -      spin_unlock(&sysctl_lock);
 -      return head;
 -}
 -
 -void sysctl_head_finish(struct ctl_table_header *head)
 -{
 -      if (!head)
 -              return;
 -      spin_lock(&sysctl_lock);
 -      unuse_table(head);
 -      spin_unlock(&sysctl_lock);
 -}
 -
 -static struct ctl_table_set *
 -lookup_header_set(struct ctl_table_root *root, struct nsproxy *namespaces)
 -{
 -      struct ctl_table_set *set = &root->default_set;
 -      if (root->lookup)
 -              set = root->lookup(root, namespaces);
 -      return set;
 -}
 -
 -static struct list_head *
 -lookup_header_list(struct ctl_table_root *root, struct nsproxy *namespaces)
 -{
 -      struct ctl_table_set *set = lookup_header_set(root, namespaces);
 -      return &set->list;
 -}
 -
 -struct ctl_table_header *__sysctl_head_next(struct nsproxy *namespaces,
 -                                          struct ctl_table_header *prev)
 -{
 -      struct ctl_table_root *root;
 -      struct list_head *header_list;
 -      struct ctl_table_header *head;
 -      struct list_head *tmp;
 -
 -      spin_lock(&sysctl_lock);
 -      if (prev) {
 -              head = prev;
 -              tmp = &prev->ctl_entry;
 -              unuse_table(prev);
 -              goto next;
 -      }
 -      tmp = &root_table_header.ctl_entry;
 -      for (;;) {
 -              head = list_entry(tmp, struct ctl_table_header, ctl_entry);
 -
 -              if (!use_table(head))
 -                      goto next;
 -              spin_unlock(&sysctl_lock);
 -              return head;
 -      next:
 -              root = head->root;
 -              tmp = tmp->next;
 -              header_list = lookup_header_list(root, namespaces);
 -              if (tmp != header_list)
 -                      continue;
 -
 -              do {
 -                      root = list_entry(root->root_list.next,
 -                                      struct ctl_table_root, root_list);
 -                      if (root == &sysctl_table_root)
 -                              goto out;
 -                      header_list = lookup_header_list(root, namespaces);
 -              } while (list_empty(header_list));
 -              tmp = header_list->next;
 -      }
 -out:
 -      spin_unlock(&sysctl_lock);
 -      return NULL;
 -}
 -
 -struct ctl_table_header *sysctl_head_next(struct ctl_table_header *prev)
 -{
 -      return __sysctl_head_next(current->nsproxy, prev);
 -}
 -
 -void register_sysctl_root(struct ctl_table_root *root)
 -{
 -      spin_lock(&sysctl_lock);
 -      list_add_tail(&root->root_list, &sysctl_table_root.root_list);
 -      spin_unlock(&sysctl_lock);
 -}
 -
 -/*
 - * sysctl_perm does NOT grant the superuser all rights automatically, because
 - * some sysctl variables are readonly even to root.
 - */
 -
 -static int test_perm(int mode, int op)
 -{
 -      if (!current_euid())
 -              mode >>= 6;
 -      else if (in_egroup_p(0))
 -              mode >>= 3;
 -      if ((op & ~mode & (MAY_READ|MAY_WRITE|MAY_EXEC)) == 0)
 -              return 0;
 -      return -EACCES;
 -}
 -
 -int sysctl_perm(struct ctl_table_root *root, struct ctl_table *table, int op)
 -{
 -      int mode;
 -
 -      if (root->permissions)
 -              mode = root->permissions(root, current->nsproxy, table);
 -      else
 -              mode = table->mode;
 -
 -      return test_perm(mode, op);
 -}
 -
 -static void sysctl_set_parent(struct ctl_table *parent, struct ctl_table *table)
 -{
 -      for (; table->procname; table++) {
 -              table->parent = parent;
 -              if (table->child)
 -                      sysctl_set_parent(table, table->child);
 -      }
 -}
 -
 -static __init int sysctl_init(void)
 +int __init sysctl_init(void)
  {
 -      sysctl_set_parent(NULL, root_table);
 -#ifdef CONFIG_SYSCTL_SYSCALL_CHECK
 -      sysctl_check_table(current->nsproxy, root_table);
 -#endif
 +      register_sysctl_table(sysctl_base_table);
        return 0;
  }
  
 -core_initcall(sysctl_init);
 -
 -static struct ctl_table *is_branch_in(struct ctl_table *branch,
 -                                    struct ctl_table *table)
 -{
 -      struct ctl_table *p;
 -      const char *s = branch->procname;
 -
 -      /* branch should have named subdirectory as its first element */
 -      if (!s || !branch->child)
 -              return NULL;
 -
 -      /* ... and nothing else */
 -      if (branch[1].procname)
 -              return NULL;
 -
 -      /* table should contain subdirectory with the same name */
 -      for (p = table; p->procname; p++) {
 -              if (!p->child)
 -                      continue;
 -              if (p->procname && strcmp(p->procname, s) == 0)
 -                      return p;
 -      }
 -      return NULL;
 -}
 -
 -/* see if attaching q to p would be an improvement */
 -static void try_attach(struct ctl_table_header *p, struct ctl_table_header *q)
 -{
 -      struct ctl_table *to = p->ctl_table, *by = q->ctl_table;
 -      struct ctl_table *next;
 -      int is_better = 0;
 -      int not_in_parent = !p->attached_by;
 -
 -      while ((next = is_branch_in(by, to)) != NULL) {
 -              if (by == q->attached_by)
 -                      is_better = 1;
 -              if (to == p->attached_by)
 -                      not_in_parent = 1;
 -              by = by->child;
 -              to = next->child;
 -      }
 -
 -      if (is_better && not_in_parent) {
 -              q->attached_by = by;
 -              q->attached_to = to;
 -              q->parent = p;
 -      }
 -}
 -
 -/**
 - * __register_sysctl_paths - register a sysctl hierarchy
 - * @root: List of sysctl headers to register on
 - * @namespaces: Data to compute which lists of sysctl entries are visible
 - * @path: The path to the directory the sysctl table is in.
 - * @table: the top-level table structure
 - *
 - * Register a sysctl table hierarchy. @table should be a filled in ctl_table
 - * array. A completely 0 filled entry terminates the table.
 - *
 - * The members of the &struct ctl_table structure are used as follows:
 - *
 - * procname - the name of the sysctl file under /proc/sys. Set to %NULL to not
 - *            enter a sysctl file
 - *
 - * data - a pointer to data for use by proc_handler
 - *
 - * maxlen - the maximum size in bytes of the data
 - *
 - * mode - the file permissions for the /proc/sys file, and for sysctl(2)
 - *
 - * child - a pointer to the child sysctl table if this entry is a directory, or
 - *         %NULL.
 - *
 - * proc_handler - the text handler routine (described below)
 - *
 - * de - for internal use by the sysctl routines
 - *
 - * extra1, extra2 - extra pointers usable by the proc handler routines
 - *
 - * Leaf nodes in the sysctl tree will be represented by a single file
 - * under /proc; non-leaf nodes will be represented by directories.
 - *
 - * sysctl(2) can automatically manage read and write requests through
 - * the sysctl table.  The data and maxlen fields of the ctl_table
 - * struct enable minimal validation of the values being written to be
 - * performed, and the mode field allows minimal authentication.
 - *
 - * There must be a proc_handler routine for any terminal nodes
 - * mirrored under /proc/sys (non-terminals are handled by a built-in
 - * directory handler).  Several default handlers are available to
 - * cover common cases -
 - *
 - * proc_dostring(), proc_dointvec(), proc_dointvec_jiffies(),
 - * proc_dointvec_userhz_jiffies(), proc_dointvec_minmax(), 
 - * proc_doulongvec_ms_jiffies_minmax(), proc_doulongvec_minmax()
 - *
 - * It is the handler's job to read the input buffer from user memory
 - * and process it. The handler should return 0 on success.
 - *
 - * This routine returns %NULL on a failure to register, and a pointer
 - * to the table header on success.
 - */
 -struct ctl_table_header *__register_sysctl_paths(
 -      struct ctl_table_root *root,
 -      struct nsproxy *namespaces,
 -      const struct ctl_path *path, struct ctl_table *table)
 -{
 -      struct ctl_table_header *header;
 -      struct ctl_table *new, **prevp;
 -      unsigned int n, npath;
 -      struct ctl_table_set *set;
 -
 -      /* Count the path components */
 -      for (npath = 0; path[npath].procname; ++npath)
 -              ;
 -
 -      /*
 -       * For each path component, allocate a 2-element ctl_table array.
 -       * The first array element will be filled with the sysctl entry
 -       * for this, the second will be the sentinel (procname == 0).
 -       *
 -       * We allocate everything in one go so that we don't have to
 -       * worry about freeing additional memory in unregister_sysctl_table.
 -       */
 -      header = kzalloc(sizeof(struct ctl_table_header) +
 -                       (2 * npath * sizeof(struct ctl_table)), GFP_KERNEL);
 -      if (!header)
 -              return NULL;
 -
 -      new = (struct ctl_table *) (header + 1);
 -
 -      /* Now connect the dots */
 -      prevp = &header->ctl_table;
 -      for (n = 0; n < npath; ++n, ++path) {
 -              /* Copy the procname */
 -              new->procname = path->procname;
 -              new->mode     = 0555;
 -
 -              *prevp = new;
 -              prevp = &new->child;
 -
 -              new += 2;
 -      }
 -      *prevp = table;
 -      header->ctl_table_arg = table;
 -
 -      INIT_LIST_HEAD(&header->ctl_entry);
 -      header->used = 0;
 -      header->unregistering = NULL;
 -      header->root = root;
 -      sysctl_set_parent(NULL, header->ctl_table);
 -      header->count = 1;
 -#ifdef CONFIG_SYSCTL_SYSCALL_CHECK
 -      if (sysctl_check_table(namespaces, header->ctl_table)) {
 -              kfree(header);
 -              return NULL;
 -      }
 -#endif
 -      spin_lock(&sysctl_lock);
 -      header->set = lookup_header_set(root, namespaces);
 -      header->attached_by = header->ctl_table;
 -      header->attached_to = root_table;
 -      header->parent = &root_table_header;
 -      for (set = header->set; set; set = set->parent) {
 -              struct ctl_table_header *p;
 -              list_for_each_entry(p, &set->list, ctl_entry) {
 -                      if (p->unregistering)
 -                              continue;
 -                      try_attach(p, header);
 -              }
 -      }
 -      header->parent->count++;
 -      list_add_tail(&header->ctl_entry, &header->set->list);
 -      spin_unlock(&sysctl_lock);
 -
 -      return header;
 -}
 -
 -/**
 - * register_sysctl_table_path - register a sysctl table hierarchy
 - * @path: The path to the directory the sysctl table is in.
 - * @table: the top-level table structure
 - *
 - * Register a sysctl table hierarchy. @table should be a filled in ctl_table
 - * array. A completely 0 filled entry terminates the table.
 - *
 - * See __register_sysctl_paths for more details.
 - */
 -struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
 -                                              struct ctl_table *table)
 -{
 -      return __register_sysctl_paths(&sysctl_table_root, current->nsproxy,
 -                                      path, table);
 -}
 -
 -/**
 - * register_sysctl_table - register a sysctl table hierarchy
 - * @table: the top-level table structure
 - *
 - * Register a sysctl table hierarchy. @table should be a filled in ctl_table
 - * array. A completely 0 filled entry terminates the table.
 - *
 - * See register_sysctl_paths for more details.
 - */
 -struct ctl_table_header *register_sysctl_table(struct ctl_table *table)
 -{
 -      static const struct ctl_path null_path[] = { {} };
 -
 -      return register_sysctl_paths(null_path, table);
 -}
 -
 -/**
 - * unregister_sysctl_table - unregister a sysctl table hierarchy
 - * @header: the header returned from register_sysctl_table
 - *
 - * Unregisters the sysctl table and all children. proc entries may not
 - * actually be removed until they are no longer used by anyone.
 - */
 -void unregister_sysctl_table(struct ctl_table_header * header)
 -{
 -      might_sleep();
 -
 -      if (header == NULL)
 -              return;
 -
 -      spin_lock(&sysctl_lock);
 -      start_unregistering(header);
 -      if (!--header->parent->count) {
 -              WARN_ON(1);
 -              kfree_rcu(header->parent, rcu);
 -      }
 -      if (!--header->count)
 -              kfree_rcu(header, rcu);
 -      spin_unlock(&sysctl_lock);
 -}
 -
 -int sysctl_is_seen(struct ctl_table_header *p)
 -{
 -      struct ctl_table_set *set = p->set;
 -      int res;
 -      spin_lock(&sysctl_lock);
 -      if (p->unregistering)
 -              res = 0;
 -      else if (!set->is_seen)
 -              res = 1;
 -      else
 -              res = set->is_seen(set);
 -      spin_unlock(&sysctl_lock);
 -      return res;
 -}
 -
 -void setup_sysctl_set(struct ctl_table_set *p,
 -      struct ctl_table_set *parent,
 -      int (*is_seen)(struct ctl_table_set *))
 -{
 -      INIT_LIST_HEAD(&p->list);
 -      p->parent = parent ? parent : &sysctl_table_root.default_set;
 -      p->is_seen = is_seen;
 -}
 -
 -#else /* !CONFIG_SYSCTL */
 -struct ctl_table_header *register_sysctl_table(struct ctl_table * table)
 -{
 -      return NULL;
 -}
 -
 -struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
 -                                                  struct ctl_table *table)
 -{
 -      return NULL;
 -}
 -
 -void unregister_sysctl_table(struct ctl_table_header * table)
 -{
 -}
 -
 -void setup_sysctl_set(struct ctl_table_set *p,
 -      struct ctl_table_set *parent,
 -      int (*is_seen)(struct ctl_table_set *))
 -{
 -}
 -
 -void sysctl_head_put(struct ctl_table_header *head)
 -{
 -}
 -
  #endif /* CONFIG_SYSCTL */
  
  /*
@@@ -2517,3 -3011,6 +2519,3 @@@ EXPORT_SYMBOL(proc_dointvec_ms_jiffies)
  EXPORT_SYMBOL(proc_dostring);
  EXPORT_SYMBOL(proc_doulongvec_minmax);
  EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax);
 -EXPORT_SYMBOL(register_sysctl_table);
 -EXPORT_SYMBOL(register_sysctl_paths);
 -EXPORT_SYMBOL(unregister_sysctl_table);
diff --combined lib/llist.c
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  #include <linux/kernel.h>
 -#include <linux/module.h>
 +#include <linux/export.h>
  #include <linux/interrupt.h>
  #include <linux/llist.h>
  
- #include <asm/system.h>
  
  /**
   * llist_add_batch - add several linked entries in batch
diff --combined net/core/dev.c
@@@ -73,7 -73,6 +73,6 @@@
   */
  
  #include <asm/uaccess.h>
- #include <asm/system.h>
  #include <linux/bitops.h>
  #include <linux/capability.h>
  #include <linux/cpu.h>
@@@ -3560,8 -3559,7 +3559,8 @@@ EXPORT_SYMBOL(napi_gro_receive)
  static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
  {
        __skb_pull(skb, skb_headlen(skb));
 -      skb_reserve(skb, NET_IP_ALIGN - skb_headroom(skb));
 +      /* restore the reserve we had after netdev_alloc_skb_ip_align() */
 +      skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN - skb_headroom(skb));
        skb->vlan_tci = 0;
        skb->dev = napi->dev;
        skb->skb_iif = 0;
diff --combined net/core/skbuff.c
@@@ -66,7 -66,6 +66,6 @@@
  #include <net/xfrm.h>
  
  #include <asm/uaccess.h>
- #include <asm/system.h>
  #include <trace/events/skb.h>
  
  #include "kmap_skb.h"
@@@ -321,12 -320,12 +320,12 @@@ struct sk_buff *__netdev_alloc_skb(stru
  EXPORT_SYMBOL(__netdev_alloc_skb);
  
  void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
 -              int size)
 +                   int size, unsigned int truesize)
  {
        skb_fill_page_desc(skb, i, page, off, size);
        skb->len += size;
        skb->data_len += size;
 -      skb->truesize += size;
 +      skb->truesize += truesize;
  }
  EXPORT_SYMBOL(skb_add_rx_frag);
  
diff --combined net/ipv4/devinet.c
@@@ -27,7 -27,6 +27,6 @@@
  
  
  #include <asm/uaccess.h>
- #include <asm/system.h>
  #include <linux/bitops.h>
  #include <linux/capability.h>
  #include <linux/module.h>
@@@ -1079,7 -1078,6 +1078,7 @@@ __be32 inet_confirm_addr(struct in_devi
  
        return addr;
  }
 +EXPORT_SYMBOL(inet_confirm_addr);
  
  /*
   *    Device notifier
diff --combined net/sunrpc/clnt.c
@@@ -17,7 -17,6 +17,6 @@@
   *  Copyright (C) 1995,1996 Olaf Kirch <okir@monad.swb.de>
   */
  
- #include <asm/system.h>
  
  #include <linux/module.h>
  #include <linux/types.h>
  #include <linux/in.h>
  #include <linux/in6.h>
  #include <linux/un.h>
 +#include <linux/rcupdate.h>
  
  #include <linux/sunrpc/clnt.h>
  #include <linux/sunrpc/rpc_pipe_fs.h>
  #include <linux/sunrpc/metrics.h>
  #include <linux/sunrpc/bc_xprt.h>
 +#include <trace/events/sunrpc.h>
  
  #include "sunrpc.h"
 +#include "netns.h"
  
  #ifdef RPC_DEBUG
  # define RPCDBG_FACILITY      RPCDBG_CALL
@@@ -53,6 -49,8 +52,6 @@@
  /*
   * All RPC clients are linked into this list
   */
 -static LIST_HEAD(all_clients);
 -static DEFINE_SPINLOCK(rpc_client_lock);
  
  static DECLARE_WAIT_QUEUE_HEAD(destroy_wait);
  
@@@ -82,191 -80,82 +81,191 @@@ static int       rpc_ping(struct rpc_clnt *cl
  
  static void rpc_register_client(struct rpc_clnt *clnt)
  {
 -      spin_lock(&rpc_client_lock);
 -      list_add(&clnt->cl_clients, &all_clients);
 -      spin_unlock(&rpc_client_lock);
 +      struct net *net = rpc_net_ns(clnt);
 +      struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
 +
 +      spin_lock(&sn->rpc_client_lock);
 +      list_add(&clnt->cl_clients, &sn->all_clients);
 +      spin_unlock(&sn->rpc_client_lock);
  }
  
  static void rpc_unregister_client(struct rpc_clnt *clnt)
  {
 -      spin_lock(&rpc_client_lock);
 +      struct net *net = rpc_net_ns(clnt);
 +      struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
 +
 +      spin_lock(&sn->rpc_client_lock);
        list_del(&clnt->cl_clients);
 -      spin_unlock(&rpc_client_lock);
 +      spin_unlock(&sn->rpc_client_lock);
  }
  
 -static int
 -rpc_setup_pipedir(struct rpc_clnt *clnt, char *dir_name)
 +static void __rpc_clnt_remove_pipedir(struct rpc_clnt *clnt)
 +{
 +      if (clnt->cl_dentry) {
 +              if (clnt->cl_auth && clnt->cl_auth->au_ops->pipes_destroy)
 +                      clnt->cl_auth->au_ops->pipes_destroy(clnt->cl_auth);
 +              rpc_remove_client_dir(clnt->cl_dentry);
 +      }
 +      clnt->cl_dentry = NULL;
 +}
 +
 +static void rpc_clnt_remove_pipedir(struct rpc_clnt *clnt)
 +{
 +      struct net *net = rpc_net_ns(clnt);
 +      struct super_block *pipefs_sb;
 +
 +      pipefs_sb = rpc_get_sb_net(net);
 +      if (pipefs_sb) {
 +              __rpc_clnt_remove_pipedir(clnt);
 +              rpc_put_sb_net(net);
 +      }
 +}
 +
 +static struct dentry *rpc_setup_pipedir_sb(struct super_block *sb,
 +                                  struct rpc_clnt *clnt,
 +                                  const char *dir_name)
  {
        static uint32_t clntid;
 -      struct path path, dir;
        char name[15];
        struct qstr q = {
                .name = name,
        };
 +      struct dentry *dir, *dentry;
        int error;
  
 -      clnt->cl_path.mnt = ERR_PTR(-ENOENT);
 -      clnt->cl_path.dentry = ERR_PTR(-ENOENT);
 -      if (dir_name == NULL)
 -              return 0;
 -
 -      path.mnt = rpc_get_mount();
 -      if (IS_ERR(path.mnt))
 -              return PTR_ERR(path.mnt);
 -      error = vfs_path_lookup(path.mnt->mnt_root, path.mnt, dir_name, 0, &dir);
 -      if (error)
 -              goto err;
 -
 +      dir = rpc_d_lookup_sb(sb, dir_name);
 +      if (dir == NULL)
 +              return dir;
        for (;;) {
                q.len = snprintf(name, sizeof(name), "clnt%x", (unsigned int)clntid++);
                name[sizeof(name) - 1] = '\0';
                q.hash = full_name_hash(q.name, q.len);
 -              path.dentry = rpc_create_client_dir(dir.dentry, &q, clnt);
 -              if (!IS_ERR(path.dentry))
 +              dentry = rpc_create_client_dir(dir, &q, clnt);
 +              if (!IS_ERR(dentry))
                        break;
 -              error = PTR_ERR(path.dentry);
 +              error = PTR_ERR(dentry);
                if (error != -EEXIST) {
                        printk(KERN_INFO "RPC: Couldn't create pipefs entry"
                                        " %s/%s, error %d\n",
                                        dir_name, name, error);
 -                      goto err_path_put;
 +                      break;
                }
        }
 -      path_put(&dir);
 -      clnt->cl_path = path;
 +      dput(dir);
 +      return dentry;
 +}
 +
 +static int
 +rpc_setup_pipedir(struct rpc_clnt *clnt, const char *dir_name)
 +{
 +      struct net *net = rpc_net_ns(clnt);
 +      struct super_block *pipefs_sb;
 +      struct dentry *dentry;
 +
 +      clnt->cl_dentry = NULL;
 +      if (dir_name == NULL)
 +              return 0;
 +      pipefs_sb = rpc_get_sb_net(net);
 +      if (!pipefs_sb)
 +              return 0;
 +      dentry = rpc_setup_pipedir_sb(pipefs_sb, clnt, dir_name);
 +      rpc_put_sb_net(net);
 +      if (IS_ERR(dentry))
 +              return PTR_ERR(dentry);
 +      clnt->cl_dentry = dentry;
        return 0;
 -err_path_put:
 -      path_put(&dir);
 -err:
 -      rpc_put_mount();
 +}
 +
 +static int __rpc_pipefs_event(struct rpc_clnt *clnt, unsigned long event,
 +                              struct super_block *sb)
 +{
 +      struct dentry *dentry;
 +      int err = 0;
 +
 +      switch (event) {
 +      case RPC_PIPEFS_MOUNT:
 +              if (clnt->cl_program->pipe_dir_name == NULL)
 +                      break;
 +              dentry = rpc_setup_pipedir_sb(sb, clnt,
 +                                            clnt->cl_program->pipe_dir_name);
 +              BUG_ON(dentry == NULL);
 +              if (IS_ERR(dentry))
 +                      return PTR_ERR(dentry);
 +              clnt->cl_dentry = dentry;
 +              if (clnt->cl_auth->au_ops->pipes_create) {
 +                      err = clnt->cl_auth->au_ops->pipes_create(clnt->cl_auth);
 +                      if (err)
 +                              __rpc_clnt_remove_pipedir(clnt);
 +              }
 +              break;
 +      case RPC_PIPEFS_UMOUNT:
 +              __rpc_clnt_remove_pipedir(clnt);
 +              break;
 +      default:
 +              printk(KERN_ERR "%s: unknown event: %ld\n", __func__, event);
 +              return -ENOTSUPP;
 +      }
 +      return err;
 +}
 +
 +static struct rpc_clnt *rpc_get_client_for_event(struct net *net, int event)
 +{
 +      struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
 +      struct rpc_clnt *clnt;
 +
 +      spin_lock(&sn->rpc_client_lock);
 +      list_for_each_entry(clnt, &sn->all_clients, cl_clients) {
 +              if (((event == RPC_PIPEFS_MOUNT) && clnt->cl_dentry) ||
 +                  ((event == RPC_PIPEFS_UMOUNT) && !clnt->cl_dentry))
 +                      continue;
 +              atomic_inc(&clnt->cl_count);
 +              spin_unlock(&sn->rpc_client_lock);
 +              return clnt;
 +      }
 +      spin_unlock(&sn->rpc_client_lock);
 +      return NULL;
 +}
 +
 +static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event,
 +                          void *ptr)
 +{
 +      struct super_block *sb = ptr;
 +      struct rpc_clnt *clnt;
 +      int error = 0;
 +
 +      while ((clnt = rpc_get_client_for_event(sb->s_fs_info, event))) {
 +              error = __rpc_pipefs_event(clnt, event, sb);
 +              rpc_release_client(clnt);
 +              if (error)
 +                      break;
 +      }
        return error;
  }
  
 +static struct notifier_block rpc_clients_block = {
 +      .notifier_call  = rpc_pipefs_event,
 +      .priority       = SUNRPC_PIPEFS_RPC_PRIO,
 +};
 +
 +int rpc_clients_notifier_register(void)
 +{
 +      return rpc_pipefs_notifier_register(&rpc_clients_block);
 +}
 +
 +void rpc_clients_notifier_unregister(void)
 +{
 +      return rpc_pipefs_notifier_unregister(&rpc_clients_block);
 +}
 +
  static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, struct rpc_xprt *xprt)
  {
 -      struct rpc_program      *program = args->program;
 -      struct rpc_version      *version;
 +      const struct rpc_program *program = args->program;
 +      const struct rpc_version *version;
        struct rpc_clnt         *clnt = NULL;
        struct rpc_auth         *auth;
        int err;
 -      size_t len;
  
        /* sanity check the name before trying to print it */
 -      err = -EINVAL;
 -      len = strlen(args->servername);
 -      if (len > RPC_MAXNETNAMELEN)
 -              goto out_no_rpciod;
 -      len++;
 -
        dprintk("RPC:       creating %s client for %s (xprt %p)\n",
                        program->name, args->servername, xprt);
  
                goto out_err;
        clnt->cl_parent = clnt;
  
 -      clnt->cl_server = clnt->cl_inline_name;
 -      if (len > sizeof(clnt->cl_inline_name)) {
 -              char *buf = kmalloc(len, GFP_KERNEL);
 -              if (buf != NULL)
 -                      clnt->cl_server = buf;
 -              else
 -                      len = sizeof(clnt->cl_inline_name);
 -      }
 -      strlcpy(clnt->cl_server, args->servername, len);
 -
 -      clnt->cl_xprt     = xprt;
 +      rcu_assign_pointer(clnt->cl_xprt, xprt);
        clnt->cl_procinfo = version->procs;
        clnt->cl_maxproc  = version->nrprocs;
        clnt->cl_protname = program->name;
        INIT_LIST_HEAD(&clnt->cl_tasks);
        spin_lock_init(&clnt->cl_lock);
  
 -      if (!xprt_bound(clnt->cl_xprt))
 +      if (!xprt_bound(xprt))
                clnt->cl_autobind = 1;
  
        clnt->cl_timeout = xprt->timeout;
        return clnt;
  
  out_no_auth:
 -      if (!IS_ERR(clnt->cl_path.dentry)) {
 -              rpc_remove_client_dir(clnt->cl_path.dentry);
 -              rpc_put_mount();
 -      }
 +      rpc_clnt_remove_pipedir(clnt);
  out_no_path:
        kfree(clnt->cl_principal);
  out_no_principal:
        rpc_free_iostats(clnt->cl_metrics);
  out_no_stats:
 -      if (clnt->cl_server != clnt->cl_inline_name)
 -              kfree(clnt->cl_server);
        kfree(clnt);
  out_err:
        xprt_put(xprt);
@@@ -381,7 -285,6 +380,7 @@@ struct rpc_clnt *rpc_create(struct rpc_
                .srcaddr = args->saddress,
                .dstaddr = args->address,
                .addrlen = args->addrsize,
 +              .servername = args->servername,
                .bc_xprt = args->bc_xprt,
        };
        char servername[48];
         * If the caller chooses not to specify a hostname, whip
         * up a string representation of the passed-in address.
         */
 -      if (args->servername == NULL) {
 +      if (xprtargs.servername == NULL) {
                struct sockaddr_un *sun =
                                (struct sockaddr_un *)args->address;
                struct sockaddr_in *sin =
                         * address family isn't recognized. */
                        return ERR_PTR(-EINVAL);
                }
 -              args->servername = servername;
 +              xprtargs.servername = servername;
        }
  
        xprt = xprt_create_transport(&xprtargs);
@@@ -470,7 -373,6 +469,7 @@@ struct rpc_clnt 
  rpc_clone_client(struct rpc_clnt *clnt)
  {
        struct rpc_clnt *new;
 +      struct rpc_xprt *xprt;
        int err = -ENOMEM;
  
        new = kmemdup(clnt, sizeof(*new), GFP_KERNEL);
                if (new->cl_principal == NULL)
                        goto out_no_principal;
        }
 +      rcu_read_lock();
 +      xprt = xprt_get(rcu_dereference(clnt->cl_xprt));
 +      rcu_read_unlock();
 +      if (xprt == NULL)
 +              goto out_no_transport;
 +      rcu_assign_pointer(new->cl_xprt, xprt);
        atomic_set(&new->cl_count, 1);
        err = rpc_setup_pipedir(new, clnt->cl_program->pipe_dir_name);
        if (err != 0)
                goto out_no_path;
        if (new->cl_auth)
                atomic_inc(&new->cl_auth->au_count);
 -      xprt_get(clnt->cl_xprt);
        atomic_inc(&clnt->cl_count);
        rpc_register_client(new);
        rpciod_up();
        return new;
  out_no_path:
 +      xprt_put(xprt);
 +out_no_transport:
        kfree(new->cl_principal);
  out_no_principal:
        rpc_free_iostats(new->cl_metrics);
@@@ -557,9 -452,8 +556,9 @@@ EXPORT_SYMBOL_GPL(rpc_killall_tasks)
   */
  void rpc_shutdown_client(struct rpc_clnt *clnt)
  {
 -      dprintk("RPC:       shutting down %s client for %s\n",
 -                      clnt->cl_protname, clnt->cl_server);
 +      dprintk_rcu("RPC:       shutting down %s client for %s\n",
 +                      clnt->cl_protname,
 +                      rcu_dereference(clnt->cl_xprt)->servername);
  
        while (!list_empty(&clnt->cl_tasks)) {
                rpc_killall_tasks(clnt);
@@@ -577,17 -471,24 +576,17 @@@ EXPORT_SYMBOL_GPL(rpc_shutdown_client)
  static void
  rpc_free_client(struct rpc_clnt *clnt)
  {
 -      dprintk("RPC:       destroying %s client for %s\n",
 -                      clnt->cl_protname, clnt->cl_server);
 -      if (!IS_ERR(clnt->cl_path.dentry)) {
 -              rpc_remove_client_dir(clnt->cl_path.dentry);
 -              rpc_put_mount();
 -      }
 -      if (clnt->cl_parent != clnt) {
 +      dprintk_rcu("RPC:       destroying %s client for %s\n",
 +                      clnt->cl_protname,
 +                      rcu_dereference(clnt->cl_xprt)->servername);
 +      if (clnt->cl_parent != clnt)
                rpc_release_client(clnt->cl_parent);
 -              goto out_free;
 -      }
 -      if (clnt->cl_server != clnt->cl_inline_name)
 -              kfree(clnt->cl_server);
 -out_free:
        rpc_unregister_client(clnt);
 +      rpc_clnt_remove_pipedir(clnt);
        rpc_free_iostats(clnt->cl_metrics);
        kfree(clnt->cl_principal);
        clnt->cl_metrics = NULL;
 -      xprt_put(clnt->cl_xprt);
 +      xprt_put(rcu_dereference_raw(clnt->cl_xprt));
        rpciod_down();
        kfree(clnt);
  }
@@@ -640,11 -541,11 +639,11 @@@ rpc_release_client(struct rpc_clnt *cln
   * The Sun NFSv2/v3 ACL protocol can do this.
   */
  struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *old,
 -                                    struct rpc_program *program,
 +                                    const struct rpc_program *program,
                                      u32 vers)
  {
        struct rpc_clnt *clnt;
 -      struct rpc_version *version;
 +      const struct rpc_version *version;
        int err;
  
        BUG_ON(vers >= program->nrvers || !program->version[vers]);
@@@ -876,18 -777,13 +875,18 @@@ EXPORT_SYMBOL_GPL(rpc_call_start)
  size_t rpc_peeraddr(struct rpc_clnt *clnt, struct sockaddr *buf, size_t bufsize)
  {
        size_t bytes;
 -      struct rpc_xprt *xprt = clnt->cl_xprt;
 +      struct rpc_xprt *xprt;
  
 -      bytes = sizeof(xprt->addr);
 +      rcu_read_lock();
 +      xprt = rcu_dereference(clnt->cl_xprt);
 +
 +      bytes = xprt->addrlen;
        if (bytes > bufsize)
                bytes = bufsize;
 -      memcpy(buf, &clnt->cl_xprt->addr, bytes);
 -      return xprt->addrlen;
 +      memcpy(buf, &xprt->addr, bytes);
 +      rcu_read_unlock();
 +
 +      return bytes;
  }
  EXPORT_SYMBOL_GPL(rpc_peeraddr);
  
   * @clnt: RPC client structure
   * @format: address format
   *
 + * NB: the lifetime of the memory referenced by the returned pointer is
 + * the same as the rpc_xprt itself.  As long as the caller uses this
 + * pointer, it must hold the RCU read lock.
   */
  const char *rpc_peeraddr2str(struct rpc_clnt *clnt,
                             enum rpc_display_format_t format)
  {
 -      struct rpc_xprt *xprt = clnt->cl_xprt;
 +      struct rpc_xprt *xprt;
 +
 +      xprt = rcu_dereference(clnt->cl_xprt);
  
        if (xprt->address_strings[format] != NULL)
                return xprt->address_strings[format];
  }
  EXPORT_SYMBOL_GPL(rpc_peeraddr2str);
  
 +static const struct sockaddr_in rpc_inaddr_loopback = {
 +      .sin_family             = AF_INET,
 +      .sin_addr.s_addr        = htonl(INADDR_ANY),
 +};
 +
 +static const struct sockaddr_in6 rpc_in6addr_loopback = {
 +      .sin6_family            = AF_INET6,
 +      .sin6_addr              = IN6ADDR_ANY_INIT,
 +};
 +
 +/*
 + * Try a getsockname() on a connected datagram socket.  Using a
 + * connected datagram socket prevents leaving a socket in TIME_WAIT.
 + * This conserves the ephemeral port number space.
 + *
 + * Returns zero and fills in "buf" if successful; otherwise, a
 + * negative errno is returned.
 + */
 +static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen,
 +                      struct sockaddr *buf, int buflen)
 +{
 +      struct socket *sock;
 +      int err;
 +
 +      err = __sock_create(net, sap->sa_family,
 +                              SOCK_DGRAM, IPPROTO_UDP, &sock, 1);
 +      if (err < 0) {
 +              dprintk("RPC:       can't create UDP socket (%d)\n", err);
 +              goto out;
 +      }
 +
 +      switch (sap->sa_family) {
 +      case AF_INET:
 +              err = kernel_bind(sock,
 +                              (struct sockaddr *)&rpc_inaddr_loopback,
 +                              sizeof(rpc_inaddr_loopback));
 +              break;
 +      case AF_INET6:
 +              err = kernel_bind(sock,
 +                              (struct sockaddr *)&rpc_in6addr_loopback,
 +                              sizeof(rpc_in6addr_loopback));
 +              break;
 +      default:
 +              err = -EAFNOSUPPORT;
 +              goto out;
 +      }
 +      if (err < 0) {
 +              dprintk("RPC:       can't bind UDP socket (%d)\n", err);
 +              goto out_release;
 +      }
 +
 +      err = kernel_connect(sock, sap, salen, 0);
 +      if (err < 0) {
 +              dprintk("RPC:       can't connect UDP socket (%d)\n", err);
 +              goto out_release;
 +      }
 +
 +      err = kernel_getsockname(sock, buf, &buflen);
 +      if (err < 0) {
 +              dprintk("RPC:       getsockname failed (%d)\n", err);
 +              goto out_release;
 +      }
 +
 +      err = 0;
 +      if (buf->sa_family == AF_INET6) {
 +              struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)buf;
 +              sin6->sin6_scope_id = 0;
 +      }
 +      dprintk("RPC:       %s succeeded\n", __func__);
 +
 +out_release:
 +      sock_release(sock);
 +out:
 +      return err;
 +}
 +
 +/*
 + * Scraping a connected socket failed, so we don't have a useable
 + * local address.  Fallback: generate an address that will prevent
 + * the server from calling us back.
 + *
 + * Returns zero and fills in "buf" if successful; otherwise, a
 + * negative errno is returned.
 + */
 +static int rpc_anyaddr(int family, struct sockaddr *buf, size_t buflen)
 +{
 +      switch (family) {
 +      case AF_INET:
 +              if (buflen < sizeof(rpc_inaddr_loopback))
 +                      return -EINVAL;
 +              memcpy(buf, &rpc_inaddr_loopback,
 +                              sizeof(rpc_inaddr_loopback));
 +              break;
 +      case AF_INET6:
 +              if (buflen < sizeof(rpc_in6addr_loopback))
 +                      return -EINVAL;
 +              memcpy(buf, &rpc_in6addr_loopback,
 +                              sizeof(rpc_in6addr_loopback));
 +      default:
 +              dprintk("RPC:       %s: address family not supported\n",
 +                      __func__);
 +              return -EAFNOSUPPORT;
 +      }
 +      dprintk("RPC:       %s: succeeded\n", __func__);
 +      return 0;
 +}
 +
 +/**
 + * rpc_localaddr - discover local endpoint address for an RPC client
 + * @clnt: RPC client structure
 + * @buf: target buffer
 + * @buflen: size of target buffer, in bytes
 + *
 + * Returns zero and fills in "buf" and "buflen" if successful;
 + * otherwise, a negative errno is returned.
 + *
 + * This works even if the underlying transport is not currently connected,
 + * or if the upper layer never previously provided a source address.
 + *
 + * The result of this function call is transient: multiple calls in
 + * succession may give different results, depending on how local
 + * networking configuration changes over time.
 + */
 +int rpc_localaddr(struct rpc_clnt *clnt, struct sockaddr *buf, size_t buflen)
 +{
 +      struct sockaddr_storage address;
 +      struct sockaddr *sap = (struct sockaddr *)&address;
 +      struct rpc_xprt *xprt;
 +      struct net *net;
 +      size_t salen;
 +      int err;
 +
 +      rcu_read_lock();
 +      xprt = rcu_dereference(clnt->cl_xprt);
 +      salen = xprt->addrlen;
 +      memcpy(sap, &xprt->addr, salen);
 +      net = get_net(xprt->xprt_net);
 +      rcu_read_unlock();
 +
 +      rpc_set_port(sap, 0);
 +      err = rpc_sockname(net, sap, salen, buf, buflen);
 +      put_net(net);
 +      if (err != 0)
 +              /* Couldn't discover local address, return ANYADDR */
 +              return rpc_anyaddr(sap->sa_family, buf, buflen);
 +      return 0;
 +}
 +EXPORT_SYMBOL_GPL(rpc_localaddr);
 +
  void
  rpc_setbufsize(struct rpc_clnt *clnt, unsigned int sndsize, unsigned int rcvsize)
  {
 -      struct rpc_xprt *xprt = clnt->cl_xprt;
 +      struct rpc_xprt *xprt;
 +
 +      rcu_read_lock();
 +      xprt = rcu_dereference(clnt->cl_xprt);
        if (xprt->ops->set_buffer_size)
                xprt->ops->set_buffer_size(xprt, sndsize, rcvsize);
 +      rcu_read_unlock();
  }
  EXPORT_SYMBOL_GPL(rpc_setbufsize);
  
 -/*
 - * Return size of largest payload RPC client can support, in bytes
 +/**
 + * rpc_protocol - Get transport protocol number for an RPC client
 + * @clnt: RPC client to query
 + *
 + */
 +int rpc_protocol(struct rpc_clnt *clnt)
 +{
 +      int protocol;
 +
 +      rcu_read_lock();
 +      protocol = rcu_dereference(clnt->cl_xprt)->prot;
 +      rcu_read_unlock();
 +      return protocol;
 +}
 +EXPORT_SYMBOL_GPL(rpc_protocol);
 +
 +/**
 + * rpc_net_ns - Get the network namespace for this RPC client
 + * @clnt: RPC client to query
 + *
 + */
 +struct net *rpc_net_ns(struct rpc_clnt *clnt)
 +{
 +      struct net *ret;
 +
 +      rcu_read_lock();
 +      ret = rcu_dereference(clnt->cl_xprt)->xprt_net;
 +      rcu_read_unlock();
 +      return ret;
 +}
 +EXPORT_SYMBOL_GPL(rpc_net_ns);
 +
 +/**
 + * rpc_max_payload - Get maximum payload size for a transport, in bytes
 + * @clnt: RPC client to query
   *
   * For stream transports, this is one RPC record fragment (see RFC
   * 1831), as we don't support multi-record requests yet.  For datagram
   */
  size_t rpc_max_payload(struct rpc_clnt *clnt)
  {
 -      return clnt->cl_xprt->max_payload;
 +      size_t ret;
 +
 +      rcu_read_lock();
 +      ret = rcu_dereference(clnt->cl_xprt)->max_payload;
 +      rcu_read_unlock();
 +      return ret;
  }
  EXPORT_SYMBOL_GPL(rpc_max_payload);
  
   */
  void rpc_force_rebind(struct rpc_clnt *clnt)
  {
 -      if (clnt->cl_autobind)
 -              xprt_clear_bound(clnt->cl_xprt);
 +      if (clnt->cl_autobind) {
 +              rcu_read_lock();
 +              xprt_clear_bound(rcu_dereference(clnt->cl_xprt));
 +              rcu_read_unlock();
 +      }
  }
  EXPORT_SYMBOL_GPL(rpc_force_rebind);
  
@@@ -1465,7 -1162,6 +1464,7 @@@ call_bind_status(struct rpc_task *task
                return;
        }
  
 +      trace_rpc_bind_status(task);
        switch (task->tk_status) {
        case -ENOMEM:
                dprintk("RPC: %5u rpcbind out of memory\n", task->tk_pid);
@@@ -1565,7 -1261,6 +1564,7 @@@ call_connect_status(struct rpc_task *ta
                return;
        }
  
 +      trace_rpc_connect_status(task, status);
        switch (status) {
                /* if soft mounted, test if we've timed out */
        case -ETIMEDOUT:
@@@ -1754,7 -1449,6 +1753,7 @@@ call_status(struct rpc_task *task
                return;
        }
  
 +      trace_rpc_call_status(task);
        task->tk_status = 0;
        switch(status) {
        case -EHOSTDOWN:
@@@ -1818,11 -1512,8 +1817,11 @@@ call_timeout(struct rpc_task *task
        }
        if (RPC_IS_SOFT(task)) {
                if (clnt->cl_chatty)
 +                      rcu_read_lock();
                        printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
 -                              clnt->cl_protname, clnt->cl_server);
 +                              clnt->cl_protname,
 +                              rcu_dereference(clnt->cl_xprt)->servername);
 +                      rcu_read_unlock();
                if (task->tk_flags & RPC_TASK_TIMEOUT)
                        rpc_exit(task, -ETIMEDOUT);
                else
  
        if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) {
                task->tk_flags |= RPC_CALL_MAJORSEEN;
 -              if (clnt->cl_chatty)
 +              if (clnt->cl_chatty) {
 +                      rcu_read_lock();
                        printk(KERN_NOTICE "%s: server %s not responding, still trying\n",
 -                      clnt->cl_protname, clnt->cl_server);
 +                      clnt->cl_protname,
 +                      rcu_dereference(clnt->cl_xprt)->servername);
 +                      rcu_read_unlock();
 +              }
        }
        rpc_force_rebind(clnt);
        /*
@@@ -1867,13 -1554,9 +1866,13 @@@ call_decode(struct rpc_task *task
        dprint_status(task);
  
        if (task->tk_flags & RPC_CALL_MAJORSEEN) {
 -              if (clnt->cl_chatty)
 +              if (clnt->cl_chatty) {
 +                      rcu_read_lock();
                        printk(KERN_NOTICE "%s: server %s OK\n",
 -                              clnt->cl_protname, clnt->cl_server);
 +                              clnt->cl_protname,
 +                              rcu_dereference(clnt->cl_xprt)->servername);
 +                      rcu_read_unlock();
 +              }
                task->tk_flags &= ~RPC_CALL_MAJORSEEN;
        }
  
@@@ -1951,7 -1634,6 +1950,7 @@@ rpc_encode_header(struct rpc_task *task
  static __be32 *
  rpc_verify_header(struct rpc_task *task)
  {
 +      struct rpc_clnt *clnt = task->tk_client;
        struct kvec *iov = &task->tk_rqstp->rq_rcv_buf.head[0];
        int len = task->tk_rqstp->rq_rcv_buf.len >> 2;
        __be32  *p = iov->iov_base;
                        task->tk_action = call_bind;
                        goto out_retry;
                case RPC_AUTH_TOOWEAK:
 +                      rcu_read_lock();
                        printk(KERN_NOTICE "RPC: server %s requires stronger "
 -                             "authentication.\n", task->tk_client->cl_server);
 +                             "authentication.\n",
 +                             rcu_dereference(clnt->cl_xprt)->servername);
 +                      rcu_read_unlock();
                        break;
                default:
                        dprintk("RPC: %5u %s: unknown auth error: %x\n",
        case RPC_SUCCESS:
                return p;
        case RPC_PROG_UNAVAIL:
 -              dprintk("RPC: %5u %s: program %u is unsupported by server %s\n",
 -                              task->tk_pid, __func__,
 -                              (unsigned int)task->tk_client->cl_prog,
 -                              task->tk_client->cl_server);
 +              dprintk_rcu("RPC: %5u %s: program %u is unsupported "
 +                              "by server %s\n", task->tk_pid, __func__,
 +                              (unsigned int)clnt->cl_prog,
 +                              rcu_dereference(clnt->cl_xprt)->servername);
                error = -EPFNOSUPPORT;
                goto out_err;
        case RPC_PROG_MISMATCH:
 -              dprintk("RPC: %5u %s: program %u, version %u unsupported by "
 -                              "server %s\n", task->tk_pid, __func__,
 -                              (unsigned int)task->tk_client->cl_prog,
 -                              (unsigned int)task->tk_client->cl_vers,
 -                              task->tk_client->cl_server);
 +              dprintk_rcu("RPC: %5u %s: program %u, version %u unsupported "
 +                              "by server %s\n", task->tk_pid, __func__,
 +                              (unsigned int)clnt->cl_prog,
 +                              (unsigned int)clnt->cl_vers,
 +                              rcu_dereference(clnt->cl_xprt)->servername);
                error = -EPROTONOSUPPORT;
                goto out_err;
        case RPC_PROC_UNAVAIL:
 -              dprintk("RPC: %5u %s: proc %s unsupported by program %u, "
 +              dprintk_rcu("RPC: %5u %s: proc %s unsupported by program %u, "
                                "version %u on server %s\n",
                                task->tk_pid, __func__,
                                rpc_proc_name(task),
 -                              task->tk_client->cl_prog,
 -                              task->tk_client->cl_vers,
 -                              task->tk_client->cl_server);
 +                              clnt->cl_prog, clnt->cl_vers,
 +                              rcu_dereference(clnt->cl_xprt)->servername);
                error = -EOPNOTSUPP;
                goto out_err;
        case RPC_GARBAGE_ARGS:
        }
  
  out_garbage:
 -      task->tk_client->cl_stats->rpcgarbage++;
 +      clnt->cl_stats->rpcgarbage++;
        if (task->tk_garb_retry) {
                task->tk_garb_retry--;
                dprintk("RPC: %5u %s: retrying\n",
@@@ -2171,15 -1851,14 +2170,15 @@@ static void rpc_show_task(const struct 
                task->tk_action, rpc_waitq);
  }
  
 -void rpc_show_tasks(void)
 +void rpc_show_tasks(struct net *net)
  {
        struct rpc_clnt *clnt;
        struct rpc_task *task;
        int header = 0;
 +      struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
  
 -      spin_lock(&rpc_client_lock);
 -      list_for_each_entry(clnt, &all_clients, cl_clients) {
 +      spin_lock(&sn->rpc_client_lock);
 +      list_for_each_entry(clnt, &sn->all_clients, cl_clients) {
                spin_lock(&clnt->cl_lock);
                list_for_each_entry(task, &clnt->cl_tasks, tk_task) {
                        if (!header) {
                }
                spin_unlock(&clnt->cl_lock);
        }
 -      spin_unlock(&rpc_client_lock);
 +      spin_unlock(&sn->rpc_client_lock);
  }
  #endif