]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
authorLinus Torvalds <torvalds@g5.osdl.org>
Sun, 2 Jul 2006 22:04:12 +0000 (15:04 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 2 Jul 2006 22:04:12 +0000 (15:04 -0700)
* 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm: (44 commits)
  [ARM] 3541/2: workaround for PXA27x erratum E7
  [ARM] nommu: provide a way for correct control register value selection
  [ARM] 3705/1: add supersection support to ioremap()
  [ARM] 3707/1: iwmmxt: use the generic thread notifier infrastructure
  [ARM] 3706/2: ep93xx: add cirrus logic edb9315a support
  [ARM] 3704/1: format IOP Kconfig with tabs, create more consistency
  [ARM] 3703/1: Add help description for ARCH_EP80219
  [ARM] 3678/1: MMC: Make OMAP MMC work
  [ARM] 3677/1: OMAP: Update H2 defconfig
  [ARM] 3676/1: ARM: OMAP: Fix dmtimers and timer32k to compile on OMAP1
  [ARM] Add section support to ioremap
  [ARM] Fix sa11x0 SDRAM selection
  [ARM] Set bit 4 on section mappings correctly depending on CPU
  [ARM] 3666/1: TRIZEPS4 [1/5] core
  ARM: OMAP: Multiplexing for 24xx GPMC wait pin monitoring
  ARM: OMAP: Fix SRAM to use MT_MEMORY instead of MT_DEVICE
  ARM: OMAP: Update dmtimers
  ARM: OMAP: Make clock variables static
  ARM: OMAP: Fix GPMC compilation when DEBUG is defined
  ARM: OMAP: Mux updates for external DMA and GPIO
  ...

29 files changed:
1  2 
arch/arm/boot/compressed/head.S
arch/arm/kernel/entry-armv.S
arch/arm/kernel/head.S
arch/arm/kernel/process.c
arch/arm/kernel/setup.c
arch/arm/mach-at91rm9200/at91rm9200.c
arch/arm/mach-at91rm9200/at91rm9200_time.c
arch/arm/mach-omap1/time.c
arch/arm/mach-omap2/clock.c
arch/arm/mach-omap2/devices.c
arch/arm/mach-omap2/io.c
arch/arm/mach-omap2/mux.c
arch/arm/mm/mm-armv.c
arch/arm/mm/proc-arm1020.S
arch/arm/mm/proc-arm1020e.S
arch/arm/mm/proc-arm1022.S
arch/arm/mm/proc-arm1026.S
arch/arm/mm/proc-arm920.S
arch/arm/mm/proc-arm922.S
arch/arm/mm/proc-arm925.S
arch/arm/mm/proc-arm926.S
arch/arm/plat-omap/clock.c
arch/arm/plat-omap/devices.c
arch/arm/plat-omap/gpio.c
arch/arm/plat-omap/sram.c
arch/arm/plat-omap/timer32k.c
drivers/mmc/omap.c
drivers/usb/gadget/omap_udc.c
include/asm-arm/thread_info.h

index f7b5c6db30f52a5846769e70a827f5dadc3e89d9,9b42b88bfba0d3ad5a71aa38bcd668e59d4620f0..14a9ff9c68df4bfcdbca3fe97dcea28f702588a0
@@@ -8,6 -8,7 +8,6 @@@
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
 -#include <linux/config.h>
  #include <linux/linkage.h>
  
  /*
@@@ -447,8 -448,11 +447,11 @@@ __common_mmu_cache_on
                mov     r1, #-1
                mcr     p15, 0, r3, c2, c0, 0   @ load page table pointer
                mcr     p15, 0, r1, c3, c0, 0   @ load domain access control
-               mcr     p15, 0, r0, c1, c0, 0   @ load control register
-               mov     pc, lr
+               b       1f
+               .align  5                       @ cache line aligned
+ 1:            mcr     p15, 0, r0, c1, c0, 0   @ load control register
+               mrc     p15, 0, r0, c1, c0, 0   @ and read it back to
+               sub     pc, lr, r0, lsr #32     @ properly flush pipeline
  
  /*
   * All code following this line is relocatable.  It is relocated by
index 26f197afd2040b28b52e7a0c0f1f6cfc99d051e2,0e8aeaf9ff1dd1626bbfb273e485227e564a13e8..7ea5f01dfc7bebfb1417834ce1be2c74330b86f4
@@@ -14,6 -14,7 +14,6 @@@
   *  Note:  there is a StrongARM bug in the STMIA rn, {regs}^ instruction that causes
   *  it to save wrong values...  Be aware!
   */
 -#include <linux/config.h>
  
  #include <asm/memory.h>
  #include <asm/glue.h>
@@@ -589,9 -590,7 +589,7 @@@ ENTRY(__switch_to
  #ifdef CONFIG_MMU
        mcr     p15, 0, r6, c3, c0, 0           @ Set domain register
  #endif
- #if defined(CONFIG_IWMMXT)
-       bl      iwmmxt_task_switch
- #elif defined(CONFIG_CPU_XSCALE)
+ #if defined(CONFIG_CPU_XSCALE) && !defined(CONFIG_IWMMXT)
        add     r4, r2, #TI_CPU_DOMAIN + 40     @ cpu_context_save->extra
        ldmib   r4, {r4, r5}
        mar     acc0, r4, r5
diff --combined arch/arm/kernel/head.S
index 518b80cd87de313817cc5f943a27448e545db0b8,81cb902c487c299e3ccd92c17ad055370767c642..2242f5f7cb7ddf5f8dc02c3c78e02617e5ad3b5e
@@@ -11,6 -11,7 +11,6 @@@
   *
   *  Kernel startup code for all 32-bit CPUs
   */
 -#include <linux/config.h>
  #include <linux/linkage.h>
  #include <linux/init.h>
  
@@@ -220,7 -221,7 +220,7 @@@ __create_page_tables
        teq     r0, r6
        bne     1b
  
-       ldr     r7, [r10, #PROCINFO_MMUFLAGS]   @ mmuflags
+       ldr     r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags
  
        /*
         * Create identity mapping for first MB of kernel to
  #endif
  
  #ifdef CONFIG_DEBUG_LL
-       bic     r7, r7, #0x0c                   @ turn off cacheable
-                                               @ and bufferable bits
+       ldr     r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags
        /*
         * Map in IO space for serial debugging.
         * This allows debug messages to be output
index c3258b763c5d87438464126a775572dce33bf046,b5773a2549ee44182d64b2b76d3a02e1d5c0cd6e..3079535afccd4be9daf1219c101ac8bc0959e7c7
@@@ -10,6 -10,7 +10,6 @@@
   */
  #include <stdarg.h>
  
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/sched.h>
  #include <linux/kernel.h>
@@@ -352,9 -353,6 +352,6 @@@ void flush_thread(void
        memset(&thread->fpstate, 0, sizeof(union fp_state));
  
        thread_notify(THREAD_NOTIFY_FLUSH, thread);
- #if defined(CONFIG_IWMMXT)
-       iwmmxt_task_release(thread);
- #endif
  }
  
  void release_thread(struct task_struct *dead_task)
        struct thread_info *thread = task_thread_info(dead_task);
  
        thread_notify(THREAD_NOTIFY_RELEASE, thread);
- #if defined(CONFIG_IWMMXT)
-       iwmmxt_task_release(thread);
- #endif
  }
  
  asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
diff --combined arch/arm/kernel/setup.c
index 7447a1987322973801fd4789adea5fd86a5fa6ed,7d02f96eeb9d2493a103b1ac4f6f46625827a811..7d6a516c0b9f4db182cc1a7d6b1df57b90331758
@@@ -7,6 -7,7 +7,6 @@@
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/stddef.h>
@@@ -118,24 -119,9 +118,24 @@@ DEFINE_PER_CPU(struct cpuinfo_arm, cpu_
   * Standard memory resources
   */
  static struct resource mem_res[] = {
 -      { "Video RAM",   0,     0,     IORESOURCE_MEM                   },
 -      { "Kernel text", 0,     0,     IORESOURCE_MEM                   },
 -      { "Kernel data", 0,     0,     IORESOURCE_MEM                   }
 +      {
 +              .name = "Video RAM",
 +              .start = 0,
 +              .end = 0,
 +              .flags = IORESOURCE_MEM
 +      },
 +      {
 +              .name = "Kernel text",
 +              .start = 0,
 +              .end = 0,
 +              .flags = IORESOURCE_MEM
 +      },
 +      {
 +              .name = "Kernel data",
 +              .start = 0,
 +              .end = 0,
 +              .flags = IORESOURCE_MEM
 +      }
  };
  
  #define video_ram   mem_res[0]
  #define kernel_data mem_res[2]
  
  static struct resource io_res[] = {
 -      { "reserved",    0x3bc, 0x3be, IORESOURCE_IO | IORESOURCE_BUSY },
 -      { "reserved",    0x378, 0x37f, IORESOURCE_IO | IORESOURCE_BUSY },
 -      { "reserved",    0x278, 0x27f, IORESOURCE_IO | IORESOURCE_BUSY }
 +      {
 +              .name = "reserved",
 +              .start = 0x3bc,
 +              .end = 0x3be,
 +              .flags = IORESOURCE_IO | IORESOURCE_BUSY
 +      },
 +      {
 +              .name = "reserved",
 +              .start = 0x378,
 +              .end = 0x37f,
 +              .flags = IORESOURCE_IO | IORESOURCE_BUSY
 +      },
 +      {
 +              .name = "reserved",
 +              .start = 0x278,
 +              .end = 0x27f,
 +              .flags = IORESOURCE_IO | IORESOURCE_BUSY
 +      }
  };
  
  #define lp0 io_res[0]
@@@ -344,9 -315,9 +344,9 @@@ static void __init setup_processor(void
        cpu_cache = *list->cache;
  #endif
  
-       printk("CPU: %s [%08x] revision %d (ARMv%s)\n",
+       printk("CPU: %s [%08x] revision %d (ARMv%s), cr=%08x\n",
               cpu_name, processor_id, (int)processor_id & 15,
-              proc_arch[cpu_architecture()]);
+              proc_arch[cpu_architecture()], cr_alignment);
  
        sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS);
        sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
index cc55f4c28d956ecd0a4db8c246d977ee156d0828,90f08d38388970142ecd1dd48f7cd6fc1ade0a5e..7e1d072bdd802180808020e51dcfc771a04ca683
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * arch/arm/mach-at91rm9200/common.c
+  * arch/arm/mach-at91rm9200/at91rm9200.c
   *
   *  Copyright (C) 2005 SAN People
   *
@@@ -10,6 -10,7 +10,6 @@@
   *
   */
  
 -#include <linux/config.h>
  #include <linux/module.h>
  
  #include <asm/mach/arch.h>
index f2f080350ccb6d45a7db45dcda1d19e0c64121fc,1077fb85c41157c139cd49d8c026757ca55e7c9e..dc38e06ada6376d67952f3e8b97848338701acf7
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * linux/arch/arm/mach-at91rm9200/time.c
+  * linux/arch/arm/mach-at91rm9200/at91rm9200_time.c
   *
   *  Copyright (C) 2003 SAN People
   *  Copyright (C) 2003 ATMEL
@@@ -19,6 -19,7 +19,6 @@@
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <linux/interrupt.h>
  #include <linux/kernel.h>
index c2d3205bc592160a71658fa52156f1f517619492,64c2d69c615c0648428828b00da7eb03ea37b37f..a01f0efdae142f0327f1a1c0b5a5b9045892909e
@@@ -33,6 -33,7 +33,6 @@@
   * 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
 -#include <linux/config.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/delay.h>
@@@ -93,7 -94,7 +93,7 @@@ static inline unsigned long long cycles
   * will break. On P2, the timer count rate is 6.5 MHz after programming PTV
   * with 0. This divides the 13MHz input by 2, and is undocumented.
   */
- #ifdef CONFIG_MACH_OMAP_PERSEUS2
+ #if defined(CONFIG_MACH_OMAP_PERSEUS2) || defined(CONFIG_MACH_OMAP_FSAMPLE)
  /* REVISIT: This ifdef construct should be replaced by a query to clock
   * framework to see if timer base frequency is 12.0, 13.0 or 19.2 MHz.
   */
index 7edf0f69da1e0c36bc62781991344a5b7613ec7f,6789dd4029a1acb71efb63d83704ca149001d92d..d1b648a4efbfde4ad325e1f136fab6d226fb2789
@@@ -15,6 -15,7 +15,6 @@@
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/device.h>
@@@ -659,26 -660,35 +659,35 @@@ static int omap2_clk_set_rate(struct cl
  
                /* Isolate control register */
                div_sel = (SRC_RATE_SEL_MASK & clk->flags);
-               div_off = clk->src_offset;
+               div_off = clk->rate_offset;
  
                validrate = omap2_clksel_round_rate(clk, rate, &new_div);
-               if(validrate != rate)
+               if (validrate != rate)
                        return(ret);
  
                field_val = omap2_get_clksel(&div_sel, &field_mask, clk);
                if (div_sel == 0)
                        return ret;
  
-               if(clk->flags & CM_SYSCLKOUT_SEL1){
-                       switch(new_div){
-                       case 16: field_val = 4; break;
-                       case 8:  field_val = 3; break;
-                       case 4:  field_val = 2; break;
-                       case 2:  field_val = 1; break;
-                       case 1:  field_val = 0; break;
+               if (clk->flags & CM_SYSCLKOUT_SEL1) {
+                       switch (new_div) {
+                       case 16:
+                               field_val = 4;
+                               break;
+                       case 8:
+                               field_val = 3;
+                               break;
+                       case 4:
+                               field_val = 2;
+                               break;
+                       case 2:
+                               field_val = 1;
+                               break;
+                       case 1:
+                               field_val = 0;
+                               break;
                        }
-               }
-               else
+               } else
                        field_val = new_div;
  
                reg = (void __iomem *)div_sel;
@@@ -743,7 -753,7 +752,7 @@@ static u32 omap2_get_src_field(u32 *typ
                        val = 0x2;
                break;
        case CM_WKUP_SEL1:
-               src_reg_addr = (u32)&CM_CLKSEL2_CORE;
+               src_reg_addr = (u32)&CM_CLKSEL_WKUP;
                mask = 0x3;
                if (src_clk == &func_32k_ck)
                        val = 0x0;
                        val = 0;
                if (src_clk == &sys_ck)
                        val = 1;
-               if (src_clk == &func_54m_ck)
-                       val = 2;
                if (src_clk == &func_96m_ck)
+                       val = 2;
+               if (src_clk == &func_54m_ck)
                        val = 3;
                break;
        }
index 4842ffe26705ee9c761f91c05872073d64825207,5139677e426621bf55fad5a7d19c652f471d3249..aa4322451e8b5dbe10cfd76cf58fff09b9384abf
@@@ -9,6 -9,7 +9,6 @@@
   * (at your option) any later version.
   */
  
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
@@@ -104,6 -105,51 +104,51 @@@ static inline void omap_init_sti(void
  static inline void omap_init_sti(void) {}
  #endif
  
+ #if defined(CONFIG_SPI_OMAP24XX)
+ #include <asm/arch/mcspi.h>
+ #define OMAP2_MCSPI1_BASE             0x48098000
+ #define OMAP2_MCSPI2_BASE             0x4809a000
+ /* FIXME: use resources instead */
+ static struct omap2_mcspi_platform_config omap2_mcspi1_config = {
+       .base           = io_p2v(OMAP2_MCSPI1_BASE),
+       .num_cs         = 4,
+ };
+ struct platform_device omap2_mcspi1 = {
+       .name           = "omap2_mcspi",
+       .id             = 1,
+       .dev            = {
+               .platform_data = &omap2_mcspi1_config,
+       },
+ };
+ static struct omap2_mcspi_platform_config omap2_mcspi2_config = {
+       .base           = io_p2v(OMAP2_MCSPI2_BASE),
+       .num_cs         = 2,
+ };
+ struct platform_device omap2_mcspi2 = {
+       .name           = "omap2_mcspi",
+       .id             = 2,
+       .dev            = {
+               .platform_data = &omap2_mcspi2_config,
+       },
+ };
+ static void omap_init_mcspi(void)
+ {
+       platform_device_register(&omap2_mcspi1);
+       platform_device_register(&omap2_mcspi2);
+ }
+ #else
+ static inline void omap_init_mcspi(void) {}
+ #endif
  /*-------------------------------------------------------------------------*/
  
  static int __init omap2_init_devices(void)
         * in alphabetical order so they're easier to sort through.
         */
        omap_init_i2c();
+       omap_init_mcspi();
        omap_init_sti();
  
        return 0;
diff --combined arch/arm/mach-omap2/io.c
index 20dd6e74e91d64c486fc8e3c886caa71a111a9f2,68456b79a0a872787b7ef7068747bf52e08dc762..a0728c33e5d9e60de43b6f867b1efcfd61c1561f
@@@ -11,6 -11,7 +11,6 @@@
   * published by the Free Software Foundation.
   */
  
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
@@@ -26,6 -27,7 +26,7 @@@
  extern void omap_sram_init(void);
  extern int omap2_clk_init(void);
  extern void omap2_check_revision(void);
+ extern void gpmc_init(void);
  
  /*
   * The machine specific code may provide the extra mapping besides the
@@@ -66,4 -68,5 +67,5 @@@ void __init omap2_init_common_hw(void
  {
        omap2_mux_init();
        omap2_clk_init();
+       gpmc_init();
  }
index 4c5f2c04883ee0f7904b0ec7572fe113e9cd5aef,c2c482cd1cb72aaaeeca9353360e1091253570c3..60ef084faffd04e8102ac9c3dbbc94d58b0cef2c
@@@ -22,6 -22,7 +22,6 @@@
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
   *
   */
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/init.h>
  #include <asm/system.h>
@@@ -52,6 -53,12 +52,12 @@@ MUX_CFG_24XX("W19_24XX_SYS_NIRQ",   0x12c
  /* 24xx clocks */
  MUX_CFG_24XX("W14_24XX_SYS_CLKOUT",   0x137,  0,      1,      1,      1)
  
+ /* 24xx GPMC wait pin monitoring */
+ MUX_CFG_24XX("L3_GPMC_WAIT0",         0x09a,  0,      1,      1,      1)
+ MUX_CFG_24XX("N7_GPMC_WAIT1",         0x09b,  0,      1,      1,      1)
+ MUX_CFG_24XX("M1_GPMC_WAIT2",         0x09c,  0,      1,      1,      1)
+ MUX_CFG_24XX("P1_GPMC_WAIT3",         0x09d,  0,      1,      1,      1)
  /* 24xx McBSP */
  MUX_CFG_24XX("Y15_24XX_MCBSP2_CLKX",  0x124,  1,      1,      0,      1)
  MUX_CFG_24XX("R14_24XX_MCBSP2_FSX",   0x125,  1,      1,      0,      1)
@@@ -59,18 -66,38 +65,38 @@@ MUX_CFG_24XX("W15_24XX_MCBSP2_DR", 0x12
  MUX_CFG_24XX("V15_24XX_MCBSP2_DX",    0x127,  1,      1,      0,      1)
  
  /* 24xx GPIO */
- MUX_CFG_24XX("M21_242X_GPIO11",        0x0c9,  3,      1,      1,      1)
+ MUX_CFG_24XX("M21_242X_GPIO11",               0x0c9,  3,      1,      1,      1)
  MUX_CFG_24XX("AA10_242X_GPIO13",      0x0e5,  3,      0,      0,      1)
- MUX_CFG_24XX("AA6_242X_GPIO14",        0x0e6,  3,      0,      0,      1)
- MUX_CFG_24XX("AA4_242X_GPIO15",        0x0e7,  3,      0,      0,      1)
- MUX_CFG_24XX("Y11_242X_GPIO16",        0x0e8,  3,      0,      0,      1)
+ MUX_CFG_24XX("AA6_242X_GPIO14",               0x0e6,  3,      0,      0,      1)
+ MUX_CFG_24XX("AA4_242X_GPIO15",               0x0e7,  3,      0,      0,      1)
+ MUX_CFG_24XX("Y11_242X_GPIO16",               0x0e8,  3,      0,      0,      1)
  MUX_CFG_24XX("AA12_242X_GPIO17",      0x0e9,  3,      0,      0,      1)
- MUX_CFG_24XX("AA8_242X_GPIO58",        0x0ea,  3,      0,      0,      1)
+ MUX_CFG_24XX("AA8_242X_GPIO58",               0x0ea,  3,      0,      0,      1)
  MUX_CFG_24XX("Y20_24XX_GPIO60",               0x12c,  3,      0,      0,      1)
- MUX_CFG_24XX("W4__24XX_GPIO74",        0x0f2,  3,      0,      0,      1)
+ MUX_CFG_24XX("W4__24XX_GPIO74",               0x0f2,  3,      0,      0,      1)
  MUX_CFG_24XX("M15_24XX_GPIO92",               0x10a,  3,      0,      0,      1)
  MUX_CFG_24XX("V14_24XX_GPIO117",      0x128,  3,      1,      0,      1)
  
+ /* 242x DBG GPIO */
+ MUX_CFG_24XX("V4_242X_GPIO49",                0xd3,   3,      0,      0,      1)
+ MUX_CFG_24XX("W2_242X_GPIO50",                0xd4,   3,      0,      0,      1)
+ MUX_CFG_24XX("U4_242X_GPIO51",                0xd5,   3,      0,      0,      1)
+ MUX_CFG_24XX("V3_242X_GPIO52",                0xd6,   3,      0,      0,      1)
+ MUX_CFG_24XX("V2_242X_GPIO53",                0xd7,   3,      0,      0,      1)
+ MUX_CFG_24XX("V6_242X_GPIO53",                0xcf,   3,      0,      0,      1)
+ MUX_CFG_24XX("T4_242X_GPIO54",                0xd8,   3,      0,      0,      1)
+ MUX_CFG_24XX("Y4_242X_GPIO54",                0xd0,   3,      0,      0,      1)
+ MUX_CFG_24XX("T3_242X_GPIO55",                0xd9,   3,      0,      0,      1)
+ MUX_CFG_24XX("U2_242X_GPIO56",                0xda,   3,      0,      0,      1)
+ /* 24xx external DMA requests */
+ MUX_CFG_24XX("AA10_242X_DMAREQ0",     0x0e5,  2,      0,      0,      1)
+ MUX_CFG_24XX("AA6_242X_DMAREQ1",      0x0e6,  2,      0,      0,      1)
+ MUX_CFG_24XX("E4_242X_DMAREQ2",               0x074,  2,      0,      0,      1)
+ MUX_CFG_24XX("G4_242X_DMAREQ3",               0x073,  2,      0,      0,      1)
+ MUX_CFG_24XX("D3_242X_DMAREQ4",               0x072,  2,      0,      0,      1)
+ MUX_CFG_24XX("E3_242X_DMAREQ5",               0x071,  2,      0,      0,      1)
  /* TSC IRQ */
  MUX_CFG_24XX("P20_24XX_TSC_IRQ",      0x108,  0,      0,      0,      1)
  
diff --combined arch/arm/mm/mm-armv.c
index b0242c6ea066a8850eb80e04cd72bc43ce150cbf,d06440cc4e8f90e3c0f9ddb55e417808840f6318..38769f5862bc4f0d414287bfdec754fdd431d2c7
@@@ -9,6 -9,7 +9,6 @@@
   *
   *  Page table sludge for ARM v3 and v4 processor architectures.
   */
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/mm.h>
  #include <linux/init.h>
@@@ -226,7 -227,7 +226,7 @@@ void free_pgd_slow(pgd_t *pgd
  
        pte = pmd_page(*pmd);
        pmd_clear(pmd);
 -      dec_page_state(nr_page_table_pages);
 +      dec_zone_page_state(virt_to_page((unsigned long *)pgd), NR_PAGETABLE);
        pte_lock_deinit(pte);
        pte_free(pte);
        pmd_free(pmd);
@@@ -302,16 -303,16 +302,16 @@@ static struct mem_types mem_types[] __i
                .prot_pte  = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
                                L_PTE_WRITE,
                .prot_l1   = PMD_TYPE_TABLE,
-               .prot_sect = PMD_TYPE_SECT | PMD_SECT_UNCACHED |
+               .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_UNCACHED |
                                PMD_SECT_AP_WRITE,
                .domain    = DOMAIN_IO,
        },
        [MT_CACHECLEAN] = {
-               .prot_sect = PMD_TYPE_SECT,
+               .prot_sect = PMD_TYPE_SECT | PMD_BIT4,
                .domain    = DOMAIN_KERNEL,
        },
        [MT_MINICLEAN] = {
-               .prot_sect = PMD_TYPE_SECT | PMD_SECT_MINICACHE,
+               .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_MINICACHE,
                .domain    = DOMAIN_KERNEL,
        },
        [MT_LOW_VECTORS] = {
                .domain    = DOMAIN_USER,
        },
        [MT_MEMORY] = {
-               .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
+               .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_AP_WRITE,
                .domain    = DOMAIN_KERNEL,
        },
        [MT_ROM] = {
-               .prot_sect = PMD_TYPE_SECT,
+               .prot_sect = PMD_TYPE_SECT | PMD_BIT4,
                .domain    = DOMAIN_KERNEL,
        },
        [MT_IXP2000_DEVICE] = { /* IXP2400 requires XCB=101 for on-chip I/O */
                .prot_pte  = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
                                L_PTE_WRITE,
                .prot_l1   = PMD_TYPE_TABLE,
-               .prot_sect = PMD_TYPE_SECT | PMD_SECT_UNCACHED |
+               .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_UNCACHED |
                                PMD_SECT_AP_WRITE | PMD_SECT_BUFFERABLE |
                                PMD_SECT_TEX(1),
                .domain    = DOMAIN_IO,
        },
        [MT_NONSHARED_DEVICE] = {
                .prot_l1   = PMD_TYPE_TABLE,
-               .prot_sect = PMD_TYPE_SECT | PMD_SECT_NONSHARED_DEV |
+               .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_NONSHARED_DEV |
                                PMD_SECT_AP_WRITE,
                .domain    = DOMAIN_IO,
        }
@@@ -375,14 -376,21 +375,21 @@@ void __init build_mem_type_table(void
                ecc_mask = 0;
        }
  
-       if (cpu_arch <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) {
-               for (i = 0; i < ARRAY_SIZE(mem_types); i++) {
+       /*
+        * Xscale must not have PMD bit 4 set for section mappings.
+        */
+       if (cpu_is_xscale())
+               for (i = 0; i < ARRAY_SIZE(mem_types); i++)
+                       mem_types[i].prot_sect &= ~PMD_BIT4;
+       /*
+        * ARMv5 and lower, excluding Xscale, bit 4 must be set for
+        * page tables.
+        */
+       if (cpu_arch < CPU_ARCH_ARMv6 && !cpu_is_xscale())
+               for (i = 0; i < ARRAY_SIZE(mem_types); i++)
                        if (mem_types[i].prot_l1)
                                mem_types[i].prot_l1 |= PMD_BIT4;
-                       if (mem_types[i].prot_sect)
-                               mem_types[i].prot_sect |= PMD_BIT4;
-               }
-       }
  
        cp = &cache_policies[cachepolicy];
        kern_pgprot = user_pgprot = cp->pte;
                 * bit 4 becomes XN which we must clear for the
                 * kernel memory mapping.
                 */
-               mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4;
-               mem_types[MT_ROM].prot_sect &= ~PMD_BIT4;
+               mem_types[MT_MEMORY].prot_sect &= ~PMD_SECT_XN;
+               mem_types[MT_ROM].prot_sect &= ~PMD_SECT_XN;
  
                /*
                 * Mark cache clean areas and XIP ROM read only
index cc609666df059ed88b38035e8d0ff7af90e4410c,6c731a4f70c9d80af519a9dae8a45473e7060642..700297ae4a55c460f871be3389da3ec3ee52f651
@@@ -26,6 -26,7 +26,6 @@@
   *  CONFIG_CPU_ARM1020_CPU_IDLE -> nohlt
   */
  #include <linux/linkage.h>
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <asm/assembler.h>
  #include <asm/asm-offsets.h>
@@@ -439,11 -440,12 +439,12 @@@ __arm1020_setup
  #ifdef CONFIG_MMU
        mcr     p15, 0, r0, c8, c7              @ invalidate I,D TLBs on v4
  #endif
+       adr     r5, arm1020_crval
+       ldmia   r5, {r5, r6}
        mrc     p15, 0, r0, c1, c0              @ get control register v4
-       ldr     r5, arm1020_cr1_clear
        bic     r0, r0, r5
-       ldr     r5, arm1020_cr1_set
-       orr     r0, r0, r5
+       orr     r0, r0, r6
  #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
        orr     r0, r0, #0x4000                 @ .R.. .... .... ....
  #endif
         * .RVI ZFRS BLDP WCAM
         * .011 1001 ..11 0101
         */
-       .type   arm1020_cr1_clear, #object
-       .type   arm1020_cr1_set, #object
- arm1020_cr1_clear:
-       .word   0x593f
- arm1020_cr1_set:
-       .word   0x3935
+       .type   arm1020_crval, #object
+ arm1020_crval:
+       crval   clear=0x0000593f, mmuset=0x00003935, ucset=0x00001930
  
        __INITDATA
  
@@@ -523,6 -522,9 +521,9 @@@ cpu_arm1020_name
  __arm1020_proc_info:
        .long   0x4104a200                      @ ARM 1020T (Architecture v5T)
        .long   0xff0ffff0
+       .long   PMD_TYPE_SECT | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
        .long   PMD_TYPE_SECT | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
index 117a946c28c8b1bb87593795b83e90b2dbf0cb76,269f485d092d47a8b0e7c04d40732f8758b7259a..0c33a5ed5a613adf7253badcf8b331f945ca34c1
@@@ -26,6 -26,7 +26,6 @@@
   *  CONFIG_CPU_ARM1020_CPU_IDLE -> nohlt
   */
  #include <linux/linkage.h>
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <asm/assembler.h>
  #include <asm/asm-offsets.h>
@@@ -421,11 -422,11 +421,11 @@@ __arm1020e_setup
  #ifdef CONFIG_MMU
        mcr     p15, 0, r0, c8, c7              @ invalidate I,D TLBs on v4
  #endif
+       adr     r5, arm1020e_crval
+       ldmia   r5, {r5, r6}
        mrc     p15, 0, r0, c1, c0              @ get control register v4
-       ldr     r5, arm1020e_cr1_clear
        bic     r0, r0, r5
-       ldr     r5, arm1020e_cr1_set
-       orr     r0, r0, r5
+       orr     r0, r0, r6
  #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
        orr     r0, r0, #0x4000                 @ .R.. .... .... ....
  #endif
         * .RVI ZFRS BLDP WCAM
         * .011 1001 ..11 0101
         */
-       .type   arm1020e_cr1_clear, #object
-       .type   arm1020e_cr1_set, #object
- arm1020e_cr1_clear:
-       .word   0x5f3f
- arm1020e_cr1_set:
-       .word   0x3935
+       .type   arm1020e_crval, #object
+ arm1020e_crval:
+       crval   clear=0x00007f3f, mmuset=0x00003935, ucset=0x00001930
  
        __INITDATA
  
@@@ -476,25 -474,7 +473,7 @@@ cpu_elf_name
  
        .type   cpu_arm1020e_name, #object
  cpu_arm1020e_name:
-       .ascii  "ARM1020E"
- #ifndef CONFIG_CPU_ICACHE_DISABLE
-       .ascii  "i"
- #endif
- #ifndef CONFIG_CPU_DCACHE_DISABLE
-       .ascii  "d"
- #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
-       .ascii  "(wt)"
- #else
-       .ascii  "(wb)"
- #endif
- #endif
- #ifndef CONFIG_CPU_BPREDICT_DISABLE
-       .ascii  "B"
- #endif
- #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
-       .ascii  "RR"
- #endif
-       .ascii  "\0"
+       .asciz  "ARM1020E"
        .size   cpu_arm1020e_name, . - cpu_arm1020e_name
  
        .align
  __arm1020e_proc_info:
        .long   0x4105a200                      @ ARM 1020TE (Architecture v5TE)
        .long   0xff0ffff0
+       .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
        .long   PMD_TYPE_SECT | \
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
index 39b7c102180aac397d7810d4da70b1f117e02970,0643bd46496936e55ad5af9ce2f006db0488d200..566a5565307241313e4b244bc133df0c7755b4da
@@@ -15,6 -15,7 +15,6 @@@
   * functions on the ARM1022E.
   */
  #include <linux/linkage.h>
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <asm/assembler.h>
  #include <asm/asm-offsets.h>
@@@ -403,11 -404,11 +403,11 @@@ __arm1022_setup
  #ifdef CONFIG_MMU
        mcr     p15, 0, r0, c8, c7              @ invalidate I,D TLBs on v4
  #endif
+       adr     r5, arm1022_crval
+       ldmia   r5, {r5, r6}
        mrc     p15, 0, r0, c1, c0              @ get control register v4
-       ldr     r5, arm1022_cr1_clear
        bic     r0, r0, r5
-       ldr     r5, arm1022_cr1_set
-       orr     r0, r0, r5
+       orr     r0, r0, r6
  #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
        orr     r0, r0, #0x4000                 @ .R..............
  #endif
         * .011 1001 ..11 0101
         * 
         */
-       .type   arm1022_cr1_clear, #object
-       .type   arm1022_cr1_set, #object
- arm1022_cr1_clear:
-       .word   0x7f3f
- arm1022_cr1_set:
-       .word   0x3935
+       .type   arm1022_crval, #object
+ arm1022_crval:
+       crval   clear=0x00007f3f, mmuset=0x00003935, ucset=0x00001930
  
        __INITDATA
  
@@@ -459,25 -457,7 +456,7 @@@ cpu_elf_name
  
        .type   cpu_arm1022_name, #object
  cpu_arm1022_name:
-       .ascii  "arm1022"
- #ifndef CONFIG_CPU_ICACHE_DISABLE
-       .ascii  "i"
- #endif
- #ifndef CONFIG_CPU_DCACHE_DISABLE
-       .ascii  "d"
- #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
-       .ascii  "(wt)"
- #else
-       .ascii  "(wb)"
- #endif
- #endif
- #ifndef CONFIG_CPU_BPREDICT_DISABLE
-       .ascii  "B"
- #endif
- #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
-       .ascii  "RR"
- #endif
-       .ascii  "\0"
+       .asciz  "ARM1022"
        .size   cpu_arm1022_name, . - cpu_arm1022_name
  
        .align
  __arm1022_proc_info:
        .long   0x4105a220                      @ ARM 1022E (v5TE)
        .long   0xff0ffff0
+       .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
        .long   PMD_TYPE_SECT | \
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
index 33e1ab8eb1d6eec93fe74451c06ba6534ee5284c,0668bfbac67b01e6b0b37b812bb74fecbdb63881..6ea76321d0df429741b8e968041303c58a58adfa
@@@ -15,6 -15,7 +15,6 @@@
   * functions on the ARM1026EJ-S.
   */
  #include <linux/linkage.h>
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <asm/assembler.h>
  #include <asm/asm-offsets.h>
@@@ -398,11 -399,11 +398,11 @@@ __arm1026_setup
        mov     r0, #4                          @ explicitly disable writeback
        mcr     p15, 7, r0, c15, c0, 0
  #endif
+       adr     r5, arm1026_crval
+       ldmia   r5, {r5, r6}
        mrc     p15, 0, r0, c1, c0              @ get control register v4
-       ldr     r5, arm1026_cr1_clear
        bic     r0, r0, r5
-       ldr     r5, arm1026_cr1_set
-       orr     r0, r0, r5
+       orr     r0, r0, r6
  #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
        orr     r0, r0, #0x4000                 @ .R.. .... .... ....
  #endif
         * .011 1001 ..11 0101
         * 
         */
-       .type   arm1026_cr1_clear, #object
-       .type   arm1026_cr1_set, #object
- arm1026_cr1_clear:
-       .word   0x7f3f
- arm1026_cr1_set:
-       .word   0x3935
+       .type   arm1026_crval, #object
+ arm1026_crval:
+       crval   clear=0x00007f3f, mmuset=0x00003935, ucset=0x00001934
  
        __INITDATA
  
@@@ -455,25 -453,7 +452,7 @@@ cpu_elf_name
  
        .type   cpu_arm1026_name, #object
  cpu_arm1026_name:
-       .ascii  "ARM1026EJ-S"
- #ifndef CONFIG_CPU_ICACHE_DISABLE
-       .ascii  "i"
- #endif
- #ifndef CONFIG_CPU_DCACHE_DISABLE
-       .ascii  "d"
- #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
-       .ascii  "(wt)"
- #else
-       .ascii  "(wb)"
- #endif
- #endif
- #ifndef CONFIG_CPU_BPREDICT_DISABLE
-       .ascii  "B"
- #endif
- #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
-       .ascii  "RR"
- #endif
-       .ascii  "\0"
+       .asciz  "ARM1026EJ-S"
        .size   cpu_arm1026_name, . - cpu_arm1026_name
  
        .align
  __arm1026_proc_info:
        .long   0x4106a260                      @ ARM 1026EJ-S (v5TEJ)
        .long   0xff0ffff0
+       .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
        .long   PMD_TYPE_SECT | \
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
index 6f0db29ab842867f78918609f280da3f8b61f413,45292f46c3b229590be0a7eb3af670e7319b79df..4adb46b3a4e0d4f68b33c4c1f6979e4e59ae0d51
@@@ -26,6 -26,7 +26,6 @@@
   *  CONFIG_CPU_ARM920_CPU_IDLE -> nohlt
   */
  #include <linux/linkage.h>
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <asm/assembler.h>
  #include <asm/pgtable-hwdef.h>
@@@ -390,11 -391,11 +390,11 @@@ __arm920_setup
  #ifdef CONFIG_MMU
        mcr     p15, 0, r0, c8, c7              @ invalidate I,D TLBs on v4
  #endif
+       adr     r5, arm920_crval
+       ldmia   r5, {r5, r6}
        mrc     p15, 0, r0, c1, c0              @ get control register v4
-       ldr     r5, arm920_cr1_clear
        bic     r0, r0, r5
-       ldr     r5, arm920_cr1_set
-       orr     r0, r0, r5
+       orr     r0, r0, r6
        mov     pc, lr
        .size   __arm920_setup, . - __arm920_setup
  
         * ..11 0001 ..11 0101
         * 
         */
-       .type   arm920_cr1_clear, #object
-       .type   arm920_cr1_set, #object
- arm920_cr1_clear:
-       .word   0x3f3f
- arm920_cr1_set:
-       .word   0x3135
+       .type   arm920_crval, #object
+ arm920_crval:
+       crval   clear=0x00003f3f, mmuset=0x00003135, ucset=0x00001130
  
        __INITDATA
  
@@@ -443,19 -441,7 +440,7 @@@ cpu_elf_name
  
        .type   cpu_arm920_name, #object
  cpu_arm920_name:
-       .ascii  "ARM920T"
- #ifndef CONFIG_CPU_ICACHE_DISABLE
-       .ascii  "i"
- #endif
- #ifndef CONFIG_CPU_DCACHE_DISABLE
-       .ascii  "d"
- #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
-       .ascii  "(wt)"
- #else
-       .ascii  "(wb)"
- #endif
- #endif
-       .ascii  "\0"
+       .asciz  "ARM920T"
        .size   cpu_arm920_name, . - cpu_arm920_name
  
        .align
@@@ -472,6 -458,10 +457,10 @@@ __arm920_proc_info
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
+       .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
        b       __arm920_setup
        .long   cpu_arch_name
        .long   cpu_elf_name
index 1ad464cc7bcb6a1ca7ad9c850193e7e2df922231,3c57519494d7368b771ae6afd9215a3fd646775d..571f082f0247e5c14b1201a695fdffe63ba8b7ba
@@@ -27,6 -27,7 +27,6 @@@
   *  CONFIG_CPU_ARM922_CPU_IDLE -> nohlt
   */
  #include <linux/linkage.h>
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <asm/assembler.h>
  #include <asm/pgtable-hwdef.h>
@@@ -394,11 -395,11 +394,11 @@@ __arm922_setup
  #ifdef CONFIG_MMU
        mcr     p15, 0, r0, c8, c7              @ invalidate I,D TLBs on v4
  #endif
+       adr     r5, arm922_crval
+       ldmia   r5, {r5, r6}
        mrc     p15, 0, r0, c1, c0              @ get control register v4
-       ldr     r5, arm922_cr1_clear
        bic     r0, r0, r5
-       ldr     r5, arm922_cr1_set
-       orr     r0, r0, r5
+       orr     r0, r0, r6
        mov     pc, lr
        .size   __arm922_setup, . - __arm922_setup
  
         * ..11 0001 ..11 0101
         * 
         */
-       .type   arm922_cr1_clear, #object
-       .type   arm922_cr1_set, #object
- arm922_cr1_clear:
-       .word   0x3f3f
- arm922_cr1_set:
-       .word   0x3135
+       .type   arm922_crval, #object
+ arm922_crval:
+       crval   clear=0x00003f3f, mmuset=0x00003135, ucset=0x00001130
  
        __INITDATA
  
@@@ -447,19 -445,7 +444,7 @@@ cpu_elf_name
  
        .type   cpu_arm922_name, #object
  cpu_arm922_name:
-       .ascii  "ARM922T"
- #ifndef CONFIG_CPU_ICACHE_DISABLE
-       .ascii  "i"
- #endif
- #ifndef CONFIG_CPU_DCACHE_DISABLE
-       .ascii  "d"
- #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
-       .ascii  "(wt)"
- #else
-       .ascii  "(wb)"
- #endif
- #endif
-       .ascii  "\0"
+       .asciz  "ARM922T"
        .size   cpu_arm922_name, . - cpu_arm922_name
  
        .align
@@@ -476,6 -462,10 +461,10 @@@ __arm922_proc_info
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
+       .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
        b       __arm922_setup
        .long   cpu_arch_name
        .long   cpu_elf_name
index a55d56ce2264aa9c531b4c8a8f2684a97547bd6c,66d5a32ba0f5419e8398de7d3a1652ca8718b8c2..ad15f8503d51b9610bc7575b6254fc5f43f57f76
@@@ -50,6 -50,7 +50,6 @@@
   */
  
  #include <linux/linkage.h>
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <asm/assembler.h>
  #include <asm/pgtable-hwdef.h>
@@@ -454,11 -455,10 +454,10 @@@ __arm925_setup
        mcr     p15, 7, r0, c15, c0, 0
  #endif
  
+       adr     r5, {r5, r6}
        mrc     p15, 0, r0, c1, c0              @ get control register v4
-       ldr     r5, arm925_cr1_clear
        bic     r0, r0, r5
-       ldr     r5, arm925_cr1_set
-       orr     r0, r0, r5
+       orr     r0, r0, r6
  #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
        orr     r0, r0, #0x4000                 @ .1.. .... .... ....
  #endif
         * .011 0001 ..11 1101
         * 
         */
-       .type   arm925_cr1_clear, #object
-       .type   arm925_cr1_set, #object
- arm925_cr1_clear:
-       .word   0x7f3f
- arm925_cr1_set:
-       .word   0x313d
+       .type   arm925_crval, #object
+ arm925_crval:
+       crval   clear=0x00007f3f, mmuset=0x0000313d, ucset=0x00001130
  
        __INITDATA
  
@@@ -510,22 -507,7 +506,7 @@@ cpu_elf_name
  
        .type   cpu_arm925_name, #object
  cpu_arm925_name:
-       .ascii  "ARM925T"
- #ifndef CONFIG_CPU_ICACHE_DISABLE
-       .ascii  "i"
- #endif
- #ifndef CONFIG_CPU_DCACHE_DISABLE
-       .ascii  "d"
- #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
-       .ascii  "(wt)"
- #else
-       .ascii  "(wb)"
- #endif
- #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
-       .ascii  "RR"
- #endif
- #endif
-       .ascii  "\0"
+       .asciz  "ARM925T"
        .size   cpu_arm925_name, . - cpu_arm925_name
  
        .align
  __arm925_proc_info:
        .long   0x54029250
        .long   0xfffffff0
+       .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
        .long   PMD_TYPE_SECT | \
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
  __arm915_proc_info:
        .long   0x54029150
        .long   0xfffffff0
+       .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
        .long   PMD_TYPE_SECT | \
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
index 20275967663d36e01ee74a60bd7f998812f08ee5,189820e25184de78d9f174860fc492857f664c47..1e89d40804743d16ca41a3788ad99bc242e6d20b
@@@ -26,6 -26,7 +26,6 @@@
   *  CONFIG_CPU_ARM926_CPU_IDLE -> nohlt
   */
  #include <linux/linkage.h>
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <asm/assembler.h>
  #include <asm/pgtable-hwdef.h>
@@@ -403,11 -404,11 +403,11 @@@ __arm926_setup
        mcr     p15, 7, r0, c15, c0, 0
  #endif 
  
+       adr     r5, arm926_crval
+       ldmia   r5, {r5, r6}
        mrc     p15, 0, r0, c1, c0              @ get control register v4
-       ldr     r5, arm926_cr1_clear
        bic     r0, r0, r5
-       ldr     r5, arm926_cr1_set
-       orr     r0, r0, r5
+       orr     r0, r0, r6
  #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
        orr     r0, r0, #0x4000                 @ .1.. .... .... ....
  #endif
         * .011 0001 ..11 0101
         * 
         */
-       .type   arm926_cr1_clear, #object
-       .type   arm926_cr1_set, #object
- arm926_cr1_clear:
-       .word   0x7f3f
- arm926_cr1_set:
-       .word   0x3135
+       .type   arm926_crval, #object
+ arm926_crval:
+       crval   clear=0x00007f3f, mmuset=0x00003135, ucset=0x00001134
  
        __INITDATA
  
@@@ -459,22 -457,7 +456,7 @@@ cpu_elf_name
  
        .type   cpu_arm926_name, #object
  cpu_arm926_name:
-       .ascii  "ARM926EJ-S"
- #ifndef CONFIG_CPU_ICACHE_DISABLE
-       .ascii  "i"
- #endif
- #ifndef CONFIG_CPU_DCACHE_DISABLE
-       .ascii  "d"
- #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
-       .ascii  "(wt)"
- #else
-       .ascii  "(wb)"
- #endif
- #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
-       .ascii  "RR"
- #endif
- #endif
-       .ascii  "\0"
+       .asciz  "ARM926EJ-S"
        .size   cpu_arm926_name, . - cpu_arm926_name
  
        .align
@@@ -491,6 -474,10 +473,10 @@@ __arm926_proc_info
                PMD_BIT4 | \
                PMD_SECT_AP_WRITE | \
                PMD_SECT_AP_READ
+       .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
        b       __arm926_setup
        .long   cpu_arch_name
        .long   cpu_elf_name
index c520e9dcdd8a43e9d283f89c9b3aacde26707fda,dcd9d81201fa3d7e7ce692473066e686f30fa5fd..7f45c7c3e673d1898902fbac743de5e7cb655fd8
@@@ -11,6 -11,7 +11,6 @@@
   * published by the Free Software Foundation.
   */
  #include <linux/version.h>
 -#include <linux/config.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/module.h>
@@@ -27,9 -28,9 +27,9 @@@
  
  #include <asm/arch/clock.h>
  
- LIST_HEAD(clocks);
static LIST_HEAD(clocks);
  static DEFINE_MUTEX(clocks_mutex);
- DEFINE_SPINLOCK(clockfw_lock);
static DEFINE_SPINLOCK(clockfw_lock);
  
  static struct clk_functions *arch_clock;
  
index ca486c9f36b508cf763765006486f8b9ac3bdac1,8bff5667383118ffe5f706a5855b440cb8c3043c..1812f237d12f9f0327531d73db6b302356847339
@@@ -9,6 -9,7 +9,6 @@@
   * (at your option) any later version.
   */
  
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
@@@ -104,7 -105,7 +104,7 @@@ static void omap_init_kp(void
                omap_cfg_reg(E20_1610_KBR3);
                omap_cfg_reg(E19_1610_KBR4);
                omap_cfg_reg(N19_1610_KBR5);
-       } else if (machine_is_omap_perseus2()) {
+       } else if (machine_is_omap_perseus2() || machine_is_omap_fsample()) {
                omap_cfg_reg(E2_730_KBR0);
                omap_cfg_reg(J7_730_KBR1);
                omap_cfg_reg(E1_730_KBR2);
@@@ -161,8 -162,8 +161,8 @@@ static u64 mmc1_dmamask = 0xffffffff
  
  static struct resource mmc1_resources[] = {
        {
-               .start          = IO_ADDRESS(OMAP_MMC1_BASE),
-               .end            = IO_ADDRESS(OMAP_MMC1_BASE) + 0x7f,
+               .start          = OMAP_MMC1_BASE,
+               .end            = OMAP_MMC1_BASE + 0x7f,
                .flags          = IORESOURCE_MEM,
        },
        {
@@@ -190,8 -191,8 +190,8 @@@ static u64 mmc2_dmamask = 0xffffffff
  
  static struct resource mmc2_resources[] = {
        {
-               .start          = IO_ADDRESS(OMAP_MMC2_BASE),
-               .end            = IO_ADDRESS(OMAP_MMC2_BASE) + 0x7f,
+               .start          = OMAP_MMC2_BASE,
+               .end            = OMAP_MMC2_BASE + 0x7f,
                .flags          = IORESOURCE_MEM,
        },
        {
index 418b88fbea8e387d170b6e4e6e43e55f9a1dd625,e75a2ca70ba1c37a44077c604525cea20d68e6b0..ae08eeec7aad0ace52c250c7f688788471c40131
@@@ -11,6 -11,7 +11,6 @@@
   * published by the Free Software Foundation.
   */
  
 -#include <linux/config.h>
  #include <linux/init.h>
  #include <linux/module.h>
  #include <linux/sched.h>
@@@ -536,6 -537,49 +536,49 @@@ static inline void _clear_gpio_irqstatu
        _clear_gpio_irqbank(bank, 1 << get_gpio_index(gpio));
  }
  
+ static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
+ {
+       void __iomem *reg = bank->base;
+       int inv = 0;
+       u32 l;
+       u32 mask;
+       switch (bank->method) {
+       case METHOD_MPUIO:
+               reg += OMAP_MPUIO_GPIO_MASKIT;
+               mask = 0xffff;
+               inv = 1;
+               break;
+       case METHOD_GPIO_1510:
+               reg += OMAP1510_GPIO_INT_MASK;
+               mask = 0xffff;
+               inv = 1;
+               break;
+       case METHOD_GPIO_1610:
+               reg += OMAP1610_GPIO_IRQENABLE1;
+               mask = 0xffff;
+               break;
+       case METHOD_GPIO_730:
+               reg += OMAP730_GPIO_INT_MASK;
+               mask = 0xffffffff;
+               inv = 1;
+               break;
+       case METHOD_GPIO_24XX:
+               reg += OMAP24XX_GPIO_IRQENABLE1;
+               mask = 0xffffffff;
+               break;
+       default:
+               BUG();
+               return 0;
+       }
+       l = __raw_readl(reg);
+       if (inv)
+               l = ~l;
+       l &= mask;
+       return l;
+ }
  static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable)
  {
        void __iomem *reg = bank->base;
@@@ -735,6 -779,8 +778,8 @@@ static void gpio_irq_handler(unsigned i
        u32 isr;
        unsigned int gpio_irq;
        struct gpio_bank *bank;
+       u32 retrigger = 0;
+       int unmasked = 0;
  
        desc->chip->ack(irq);
  
  #endif
        while(1) {
                u32 isr_saved, level_mask = 0;
+               u32 enabled;
  
-               isr_saved = isr = __raw_readl(isr_reg);
+               enabled = _get_gpio_irqbank_mask(bank);
+               isr_saved = isr = __raw_readl(isr_reg) & enabled;
  
                if (cpu_is_omap15xx() && (bank->method == METHOD_MPUIO))
                        isr &= 0x0000ffff;
  
-               if (cpu_is_omap24xx())
+               if (cpu_is_omap24xx()) {
                        level_mask =
                                __raw_readl(bank->base +
                                        OMAP24XX_GPIO_LEVELDETECT0) |
                                __raw_readl(bank->base +
                                        OMAP24XX_GPIO_LEVELDETECT1);
+                       level_mask &= enabled;
+               }
  
                /* clear edge sensitive interrupts before handler(s) are
                called so that we don't miss any interrupt occurred while
  
                /* if there is only edge sensitive GPIO pin interrupts
                configured, we could unmask GPIO bank interrupt immediately */
-               if (!level_mask)
+               if (!level_mask && !unmasked) {
+                       unmasked = 1;
                        desc->chip->unmask(irq);
+               }
  
+               isr |= retrigger;
+               retrigger = 0;
                if (!isr)
                        break;
  
                gpio_irq = bank->virtual_irq_start;
                for (; isr != 0; isr >>= 1, gpio_irq++) {
                        struct irqdesc *d;
+                       int irq_mask;
                        if (!(isr & 1))
                                continue;
                        d = irq_desc + gpio_irq;
+                       /* Don't run the handler if it's already running
+                        * or was disabled lazely.
+                        */
+                       if (unlikely((d->disable_depth || d->running))) {
+                               irq_mask = 1 <<
+                                       (gpio_irq - bank->virtual_irq_start);
+                               /* The unmasking will be done by
+                                * enable_irq in case it is disabled or
+                                * after returning from the handler if
+                                * it's already running.
+                                */
+                               _enable_gpio_irqbank(bank, irq_mask, 0);
+                               if (!d->disable_depth) {
+                                       /* Level triggered interrupts
+                                        * won't ever be reentered
+                                        */
+                                       BUG_ON(level_mask & irq_mask);
+                                       d->pending = 1;
+                               }
+                               continue;
+                       }
+                       d->running = 1;
                        desc_handle_irq(gpio_irq, d, regs);
+                       d->running = 0;
+                       if (unlikely(d->pending && !d->disable_depth)) {
+                               irq_mask = 1 <<
+                                       (gpio_irq - bank->virtual_irq_start);
+                               d->pending = 0;
+                               _enable_gpio_irqbank(bank, irq_mask, 1);
+                               retrigger |= irq_mask;
+                       }
                }
  
                if (cpu_is_omap24xx()) {
                        _enable_gpio_irqbank(bank, isr_saved & level_mask, 1);
                }
  
-               /* if bank has any level sensitive GPIO pin interrupt
-               configured, we must unmask the bank interrupt only after
-               handler(s) are executed in order to avoid spurious bank
-               interrupt */
-               if (level_mask)
-                       desc->chip->unmask(irq);
        }
+       /* if bank has any level sensitive GPIO pin interrupt
+       configured, we must unmask the bank interrupt only after
+       handler(s) are executed in order to avoid spurious bank
+       interrupt */
+       if (!unmasked)
+               desc->chip->unmask(irq);
  }
  
  static void gpio_ack_irq(unsigned int irq)
index 72ce52ce815b4e64862f399dec841799dc8355cb,aebd06faf2cfd4c6c59c622b538e04696aa058d2..e75718301b0f460bc59ea9912905a5c0a34c6dc8
@@@ -11,6 -11,7 +11,6 @@@
   * published by the Free Software Foundation.
   */
  
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
@@@ -157,14 -158,12 +157,12 @@@ static struct map_desc omap_sram_io_des
        {       /* .length gets filled in at runtime */
                .virtual        = OMAP1_SRAM_VA,
                .pfn            = __phys_to_pfn(OMAP1_SRAM_PA),
-               .type           = MT_DEVICE
+               .type           = MT_MEMORY
        }
  };
  
  /*
-  * In order to use last 2kB of SRAM on 1611b, we must round the size
-  * up to multiple of PAGE_SIZE. We cannot use ioremap for SRAM, as
-  * clock init needs SRAM early.
+  * Note that we cannot use ioremap for SRAM, as clock init needs SRAM early.
   */
  void __init omap_map_sram(void)
  {
                omap_sram_io_desc[0].pfn = __phys_to_pfn(base);
        }
  
-       omap_sram_io_desc[0].length = (omap_sram_size + PAGE_SIZE-1)/PAGE_SIZE;
-       omap_sram_io_desc[0].length *= PAGE_SIZE;
+       omap_sram_io_desc[0].length = 1024 * 1024;      /* Use section desc */
        iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc));
  
        printk(KERN_INFO "SRAM: Mapped pa 0x%08lx to va 0x%08lx size: 0x%lx\n",
index 053c18132ef44bc0b91d5340d37e4efa5e594798,ea9f3732630bd066daf1bc7ed1f98393b0a68453..ddf4360dea72ebf9ac0523791e1978bf0d4afaf8
@@@ -7,6 -7,7 +7,7 @@@
   * Partial timer rewrite and additional dynamic tick timer support by
   * Tony Lindgen <tony@atomide.com> and
   * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
+  * OMAP Dual-mode timer framework support by Timo Teras
   *
   * MPU timer code based on the older MPU timer code for OMAP
   * Copyright (C) 2000 RidgeRun, Inc.
@@@ -33,6 -34,7 +34,6 @@@
   * 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
 -#include <linux/config.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/delay.h>
@@@ -49,6 -51,7 +50,7 @@@
  #include <asm/irq.h>
  #include <asm/mach/irq.h>
  #include <asm/mach/time.h>
+ #include <asm/arch/dmtimer.h>
  
  struct sys_timer omap_timer;
  
  #define OMAP1_32K_TIMER_TVR           0x00
  #define OMAP1_32K_TIMER_TCR           0x04
  
- /* 24xx specific defines */
- #define OMAP2_GP_TIMER_BASE           0x48028000
- #define CM_CLKSEL_WKUP                        0x48008440
- #define GP_TIMER_TIDR                 0x00
- #define GP_TIMER_TISR                 0x18
- #define GP_TIMER_TIER                 0x1c
- #define GP_TIMER_TCLR                 0x24
- #define GP_TIMER_TCRR                 0x28
- #define GP_TIMER_TLDR                 0x2c
- #define GP_TIMER_TTGR                 0x30
- #define GP_TIMER_TSICR                        0x40
  #define OMAP_32K_TICKS_PER_HZ         (32768 / HZ)
  
  /*
  #define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate)                   \
                                (((nr_jiffies) * (clock_rate)) / HZ)
  
+ #if defined(CONFIG_ARCH_OMAP1)
  static inline void omap_32k_timer_write(int val, int reg)
  {
-       if (cpu_class_is_omap1())
-               omap_writew(val, OMAP1_32K_TIMER_BASE + reg);
-       if (cpu_is_omap24xx())
-               omap_writel(val, OMAP2_GP_TIMER_BASE + reg);
+       omap_writew(val, OMAP1_32K_TIMER_BASE + reg);
  }
  
  static inline unsigned long omap_32k_timer_read(int reg)
  {
-       if (cpu_class_is_omap1())
-               return omap_readl(OMAP1_32K_TIMER_BASE + reg) & 0xffffff;
+       return omap_readl(OMAP1_32K_TIMER_BASE + reg) & 0xffffff;
+ }
  
-       if (cpu_is_omap24xx())
-               return omap_readl(OMAP2_GP_TIMER_BASE + reg);
+ static inline void omap_32k_timer_start(unsigned long load_val)
+ {
+       omap_32k_timer_write(load_val, OMAP1_32K_TIMER_TVR);
+       omap_32k_timer_write(0x0f, OMAP1_32K_TIMER_CR);
  }
  
- /*
-  * The 32KHz synchronized timer is an additional timer on 16xx.
-  * It is always running.
-  */
- static inline unsigned long omap_32k_sync_timer_read(void)
+ static inline void omap_32k_timer_stop(void)
  {
-       return omap_readl(TIMER_32K_SYNCHRONIZED);
+       omap_32k_timer_write(0x0, OMAP1_32K_TIMER_CR);
  }
  
+ #define omap_32k_timer_ack_irq()
+ #elif defined(CONFIG_ARCH_OMAP2)
+ static struct omap_dm_timer *gptimer;
  static inline void omap_32k_timer_start(unsigned long load_val)
  {
-       if (cpu_class_is_omap1()) {
-               omap_32k_timer_write(load_val, OMAP1_32K_TIMER_TVR);
-               omap_32k_timer_write(0x0f, OMAP1_32K_TIMER_CR);
-       }
-       if (cpu_is_omap24xx()) {
-               omap_32k_timer_write(0xffffffff - load_val, GP_TIMER_TCRR);
-               omap_32k_timer_write((1 << 1), GP_TIMER_TIER);
-               omap_32k_timer_write((1 << 1) | 1, GP_TIMER_TCLR);
-       }
+       omap_dm_timer_set_load(gptimer, 1, 0xffffffff - load_val);
+       omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
+       omap_dm_timer_start(gptimer);
  }
  
  static inline void omap_32k_timer_stop(void)
  {
-       if (cpu_class_is_omap1())
-               omap_32k_timer_write(0x0, OMAP1_32K_TIMER_CR);
+       omap_dm_timer_stop(gptimer);
+ }
  
-       if (cpu_is_omap24xx())
-               omap_32k_timer_write(0x0, GP_TIMER_TCLR);
+ static inline void omap_32k_timer_ack_irq(void)
+ {
+       u32 status = omap_dm_timer_read_status(gptimer);
+       omap_dm_timer_write_status(gptimer, status);
+ }
+ #endif
+ /*
+  * The 32KHz synchronized timer is an additional timer on 16xx.
+  * It is always running.
+  */
+ static inline unsigned long omap_32k_sync_timer_read(void)
+ {
+       return omap_readl(TIMER_32K_SYNCHRONIZED);
  }
  
  /*
@@@ -202,11 -201,7 +200,7 @@@ static irqreturn_t omap_32k_timer_inter
  
        write_seqlock_irqsave(&xtime_lock, flags);
  
-       if (cpu_is_omap24xx()) {
-               u32 status = omap_32k_timer_read(GP_TIMER_TISR);
-               omap_32k_timer_write(status, GP_TIMER_TISR);
-       }
+       omap_32k_timer_ack_irq();
        now = omap_32k_sync_timer_read();
  
        while ((signed long)(now - omap_32k_last_tick)
@@@ -268,9 -263,6 +262,6 @@@ static struct irqaction omap_32k_timer_
        .handler        = omap_32k_timer_interrupt,
  };
  
- static struct clk * gpt1_ick;
- static struct clk * gpt1_fck;
  static __init void omap_init_32k_timer(void)
  {
  #ifdef CONFIG_NO_IDLE_HZ
  
        if (cpu_class_is_omap1())
                setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
-       if (cpu_is_omap24xx())
-               setup_irq(37, &omap_32k_timer_irq);
        omap_timer.offset  = omap_32k_timer_gettimeoffset;
        omap_32k_last_tick = omap_32k_sync_timer_read();
  
+ #ifdef CONFIG_ARCH_OMAP2
        /* REVISIT: Check 24xx TIOCP_CFG settings after idle works */
        if (cpu_is_omap24xx()) {
-               omap_32k_timer_write(0, GP_TIMER_TCLR);
-               omap_writel(0, CM_CLKSEL_WKUP);         /* 32KHz clock source */
-               gpt1_ick = clk_get(NULL, "gpt1_ick");
-               if (IS_ERR(gpt1_ick))
-                       printk(KERN_ERR "Could not get gpt1_ick\n");
-               else
-                       clk_enable(gpt1_ick);
-               gpt1_fck = clk_get(NULL, "gpt1_fck");
-               if (IS_ERR(gpt1_fck))
-                       printk(KERN_ERR "Could not get gpt1_fck\n");
-               else
-                       clk_enable(gpt1_fck);
-               mdelay(100);            /* Wait for clocks to stabilize */
-               omap_32k_timer_write(0x7, GP_TIMER_TISR);
+               gptimer = omap_dm_timer_request_specific(1);
+               BUG_ON(gptimer == NULL);
+               omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);
+               setup_irq(omap_dm_timer_get_irq(gptimer), &omap_32k_timer_irq);
+               omap_dm_timer_set_int_enable(gptimer,
+                       OMAP_TIMER_INT_CAPTURE | OMAP_TIMER_INT_OVERFLOW |
+                       OMAP_TIMER_INT_MATCH);
        }
+ #endif
  
        omap_32k_timer_start(OMAP_32K_TIMER_TICK_PERIOD);
  }
   */
  static void __init omap_timer_init(void)
  {
+ #ifdef CONFIG_OMAP_DM_TIMER
+       omap_dm_timer_init();
+ #endif
        omap_init_32k_timer();
  }
  
diff --combined drivers/mmc/omap.c
index e0e14b3423c62288722caa5a79cf30cac0fe2886,2b7996da875b0be7a4144bfae345c1aaa40363d7..ddf06b32c159912f6b4213364c4f0bc294fd49d4
@@@ -11,6 -11,7 +11,6 @@@
   * published by the Free Software Foundation.
   */
  
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/init.h>
@@@ -60,6 -61,7 +60,7 @@@ struct mmc_omap_host 
        unsigned char           id; /* 16xx chips have 2 MMC blocks */
        struct clk *            iclk;
        struct clk *            fclk;
+       struct resource         *res;
        void __iomem            *base;
        int                     irq;
        unsigned char           bus_mode;
@@@ -339,8 -341,6 +340,6 @@@ static voi
  mmc_omap_xfer_data(struct mmc_omap_host *host, int write)
  {
        int n;
-       void __iomem *reg;
-       u16 *p;
  
        if (host->buffer_bytes_left == 0) {
                host->sg_idx++;
@@@ -657,12 -657,12 +656,12 @@@ static void mmc_omap_dma_cb(int lch, u1
        struct mmc_data *mmcdat = host->data;
  
        if (unlikely(host->dma_ch < 0)) {
-               dev_err(mmc_dev(host->mmc), "DMA callback while DMA not
-                               enabled\n");
+               dev_err(mmc_dev(host->mmc),
+                       "DMA callback while DMA not enabled\n");
                return;
        }
        /* FIXME: We really should do something to _handle_ the errors */
-       if (ch_status & OMAP_DMA_TOUT_IRQ) {
+       if (ch_status & OMAP1_DMA_TOUT_IRQ) {
                dev_err(mmc_dev(host->mmc),"DMA timeout\n");
                return;
        }
@@@ -972,20 -972,20 +971,20 @@@ static int __init mmc_omap_probe(struc
        struct omap_mmc_conf *minfo = pdev->dev.platform_data;
        struct mmc_host *mmc;
        struct mmc_omap_host *host = NULL;
+       struct resource *r;
        int ret = 0;
+       int irq;
        
-       if (platform_get_resource(pdev, IORESOURCE_MEM, 0) ||
-                       platform_get_irq(pdev, IORESOURCE_IRQ, 0)) {
-               dev_err(&pdev->dev, "mmc_omap_probe: invalid resource type\n");
-               return -ENODEV;
-       }
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       irq = platform_get_irq(pdev, 0);
+       if (!r || irq < 0)
+               return -ENXIO;
  
-       if (!request_mem_region(pdev->resource[0].start,
+       r = request_mem_region(pdev->resource[0].start,
                                pdev->resource[0].end - pdev->resource[0].start + 1,
-                               pdev->name)) {
-               dev_dbg(&pdev->dev, "request_mem_region failed\n");
+                              pdev->name);
+       if (!r)
                return -EBUSY;
-       }
  
        mmc = mmc_alloc_host(sizeof(struct mmc_omap_host), &pdev->dev);
        if (!mmc) {
        host->dma_timer.data = (unsigned long) host;
  
        host->id = pdev->id;
+       host->res = r;
+       host->irq = irq;
  
        if (cpu_is_omap24xx()) {
                host->iclk = clk_get(&pdev->dev, "mmc_ick");
        host->dma_ch = -1;
  
        host->irq = pdev->resource[1].start;
-       host->base = ioremap(pdev->res.start, SZ_4K);
-       if (!host->base) {
-               ret = -ENOMEM;
-               goto out;
-       }
+       host->base = (void __iomem*)IO_ADDRESS(r->start);
  
-        if (minfo->wire4)
+       if (minfo->wire4)
                 mmc->caps |= MMC_CAP_4_BIT_DATA;
  
        mmc->ops = &mmc_omap_ops;
  
        if (host->power_pin >= 0) {
                if ((ret = omap_request_gpio(host->power_pin)) != 0) {
-                       dev_err(mmc_dev(host->mmc), "Unable to get GPIO
-                                       pin for MMC power\n");
+                       dev_err(mmc_dev(host->mmc),
+                               "Unable to get GPIO pin for MMC power\n");
                        goto out;
                }
                omap_set_gpio_direction(host->power_pin, 0);
  
                omap_set_gpio_direction(host->switch_pin, 1);
                ret = request_irq(OMAP_GPIO_IRQ(host->switch_pin),
 -                                mmc_omap_switch_irq, SA_TRIGGER_RISING, DRIVER_NAME, host);
 +                                mmc_omap_switch_irq, IRQF_TRIGGER_RISING, DRIVER_NAME, host);
                if (ret) {
                        dev_warn(mmc_dev(host->mmc), "Unable to get IRQ for MMC cover switch\n");
                        omap_free_gpio(host->switch_pin);
                                device_remove_file(&pdev->dev, &dev_attr_cover_switch);
                }
                if (ret) {
-                       dev_wan(mmc_dev(host->mmc), "Unable to create sysfs attributes\n");
+                       dev_warn(mmc_dev(host->mmc), "Unable to create sysfs attributes\n");
                        free_irq(OMAP_GPIO_IRQ(host->switch_pin), host);
                        omap_free_gpio(host->switch_pin);
                        host->switch_pin = -1;
index f28ebbc048d53ebc31174bd7d4477bcda0d6960e,36336486c883b5144c3851cc2fa9559bdb6cb62f..2de9748ee6734c7763a2e4618f9769c91d36bce2
@@@ -22,6 -22,7 +22,6 @@@
  #undef        DEBUG
  #undef        VERBOSE
  
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/ioport.h>
@@@ -772,7 -773,7 +772,7 @@@ static void dma_error(int lch, u16 ch_s
        struct omap_ep  *ep = data;
  
        /* if ch_status & OMAP_DMA_DROP_IRQ ... */
-       /* if ch_status & OMAP_DMA_TOUT_IRQ ... */
+       /* if ch_status & OMAP1_DMA_TOUT_IRQ ... */
        ERR("%s dma error, lch %d status %02x\n", ep->ep.name, lch, ch_status);
  
        /* complete current transfer ... */
@@@ -2818,7 -2819,7 +2818,7 @@@ bad_on_1710
  
        /* USB general purpose IRQ:  ep0, state changes, dma, etc */
        status = request_irq(pdev->resource[1].start, omap_udc_irq,
 -                      SA_SAMPLE_RANDOM, driver_name, udc);
 +                      IRQF_SAMPLE_RANDOM, driver_name, udc);
        if (status != 0) {
                ERR( "can't get irq %ld, err %d\n",
                        pdev->resource[1].start, status);
  
        /* USB "non-iso" IRQ (PIO for all but ep0) */
        status = request_irq(pdev->resource[2].start, omap_udc_pio_irq,
 -                      SA_SAMPLE_RANDOM, "omap_udc pio", udc);
 +                      IRQF_SAMPLE_RANDOM, "omap_udc pio", udc);
        if (status != 0) {
                ERR( "can't get irq %ld, err %d\n",
                        pdev->resource[2].start, status);
        }
  #ifdef        USE_ISO
        status = request_irq(pdev->resource[3].start, omap_udc_iso_irq,
 -                      SA_INTERRUPT, "omap_udc iso", udc);
 +                      IRQF_DISABLED, "omap_udc iso", udc);
        if (status != 0) {
                ERR("can't get irq %ld, err %d\n",
                        pdev->resource[3].start, status);
index 8a7554f0398447af954cfb49049f96ac60d89b10,c52e0bf75353c7029040c7c3cc9511552de0c24b..f28b236139ed4000ed907015601629bf99b26808
@@@ -111,12 -111,13 +111,13 @@@ extern void iwmmxt_task_disable(struct 
  extern void iwmmxt_task_copy(struct thread_info *, void *);
  extern void iwmmxt_task_restore(struct thread_info *, void *);
  extern void iwmmxt_task_release(struct thread_info *);
+ extern void iwmmxt_task_switch(struct thread_info *);
  
  #endif
  
  /*
   * We use bit 30 of the preempt_count to indicate that kernel
 - * preemption is occuring.  See include/asm-arm/hardirq.h.
 + * preemption is occurring.  See include/asm-arm/hardirq.h.
   */
  #define PREEMPT_ACTIVE        0x40000000