Browse Source

Merge branch 'for-2.6.25' of master.kernel.org:/pub/scm/linux/kernel/git/arnd/cell-2.6 into merge

Paul Mackerras 17 years ago
parent
commit
3cecdda3f1
100 changed files with 598 additions and 772 deletions
  1. 9 8
      Documentation/debugging-via-ohci1394.txt
  2. 22 0
      Documentation/feature-removal-schedule.txt
  3. 2 1
      Documentation/i2c/busses/i2c-i801
  4. 0 49
      Documentation/ide.txt
  5. 17 6
      MAINTAINERS
  6. 1 1
      Makefile
  7. 2 1
      arch/arm/Kconfig
  8. 2 0
      arch/arm/mach-omap1/board-sx1.c
  9. 1 1
      arch/arm/mach-pxa/cpu-pxa.c
  10. 0 8
      arch/arm/mach-pxa/pxa3xx.c
  11. 1 1
      arch/arm/mach-pxa/zylonite.c
  12. 2 0
      arch/arm/mm/mmap.c
  13. 1 1
      arch/avr32/boards/atstk1000/atstk1004.c
  14. 4 0
      arch/avr32/kernel/process.c
  15. 2 0
      arch/avr32/mm/fault.c
  16. 4 1
      arch/blackfin/Makefile
  17. 8 10
      arch/blackfin/configs/BF527-EZKIT_defconfig
  18. 2 4
      arch/blackfin/configs/BF533-EZKIT_defconfig
  19. 2 4
      arch/blackfin/configs/BF533-STAMP_defconfig
  20. 3 3
      arch/blackfin/configs/BF537-STAMP_defconfig
  21. 2 0
      arch/blackfin/configs/BF548-EZKIT_defconfig
  22. 1 0
      arch/blackfin/configs/BF561-EZKIT_defconfig
  23. 8 7
      arch/blackfin/kernel/bfin_dma_5xx.c
  24. 4 4
      arch/blackfin/kernel/gptimers.c
  25. 4 1
      arch/blackfin/kernel/setup.c
  26. 27 7
      arch/blackfin/kernel/vmlinux.lds.S
  27. 31 29
      arch/blackfin/mach-bf527/boards/ezkit.c
  28. 18 3
      arch/blackfin/mach-bf533/boards/ezkit.c
  29. 20 23
      arch/blackfin/mach-bf533/boards/stamp.c
  30. 0 18
      arch/blackfin/mach-bf537/boards/generic_board.c
  31. 21 24
      arch/blackfin/mach-bf537/boards/stamp.c
  32. 20 5
      arch/blackfin/mach-bf548/boards/ezkit.c
  33. 2 0
      arch/blackfin/mach-bf548/dma.c
  34. 7 2
      arch/blackfin/mach-bf548/head.S
  35. 15 1
      arch/blackfin/mach-bf561/boards/ezkit.c
  36. 2 135
      arch/blackfin/mach-common/dpmc.S
  37. 64 110
      arch/blackfin/mach-common/ints-priority.c
  38. 2 2
      arch/blackfin/mm/init.c
  39. 1 1
      arch/powerpc/oprofile/op_model_cell.c
  40. 88 63
      arch/powerpc/platforms/cell/iommu.c
  41. 7 0
      arch/powerpc/platforms/cell/setup.c
  42. 0 3
      arch/powerpc/platforms/celleb/beat.h
  43. 1 0
      arch/sh/Kconfig
  44. 1 1
      arch/sh/drivers/dma/dma-sh.c
  45. 1 1
      arch/sh/drivers/heartbeat.c
  46. 22 22
      arch/sh/drivers/pci/ops-dreamcast.c
  47. 1 1
      arch/sh/kernel/cpu/sh2/setup-sh7619.c
  48. 2 2
      arch/sh/kernel/cpu/sh2a/clock-sh7203.c
  49. 1 1
      arch/sh/kernel/cpu/sh2a/setup-sh7203.c
  50. 1 1
      arch/sh/kernel/cpu/sh2a/setup-sh7206.c
  51. 2 2
      arch/sh/kernel/cpu/sh3/probe.c
  52. 1 1
      arch/sh/kernel/cpu/sh3/setup-sh7705.c
  53. 4 4
      arch/sh/kernel/cpu/sh3/setup-sh770x.c
  54. 1 1
      arch/sh/kernel/cpu/sh3/setup-sh7710.c
  55. 1 1
      arch/sh/kernel/cpu/sh3/setup-sh7720.c
  56. 1 1
      arch/sh/kernel/cpu/sh4/setup-sh4-202.c
  57. 1 1
      arch/sh/kernel/cpu/sh4/setup-sh7750.c
  58. 1 1
      arch/sh/kernel/cpu/sh4/setup-sh7760.c
  59. 1 1
      arch/sh/kernel/cpu/sh4a/setup-sh7343.c
  60. 1 1
      arch/sh/kernel/cpu/sh4a/setup-sh7366.c
  61. 1 1
      arch/sh/kernel/cpu/sh4a/setup-sh7722.c
  62. 1 1
      arch/sh/kernel/cpu/sh4a/setup-sh7763.c
  63. 1 1
      arch/sh/kernel/cpu/sh4a/setup-sh7770.c
  64. 1 1
      arch/sh/kernel/cpu/sh4a/setup-sh7780.c
  65. 1 1
      arch/sh/kernel/cpu/sh4a/setup-sh7785.c
  66. 1 1
      arch/sh/kernel/cpu/sh4a/setup-shx3.c
  67. 3 0
      arch/sparc/kernel/led.c
  68. 7 7
      arch/sparc64/kernel/ds.c
  69. 3 1
      arch/sparc64/kernel/hvtramp.S
  70. 2 1
      arch/sparc64/kernel/iommu.c
  71. 0 2
      arch/sparc64/kernel/kprobes.c
  72. 1 1
      arch/sparc64/kernel/mdesc.c
  73. 1 2
      arch/sparc64/kernel/power.c
  74. 3 74
      arch/sparc64/kernel/process.c
  75. 1 1
      arch/sparc64/kernel/smp.c
  76. 3 1
      arch/sparc64/kernel/trampoline.S
  77. 0 2
      arch/sparc64/kernel/traps.c
  78. 3 11
      arch/sparc64/mm/fault.c
  79. 2 1
      arch/sparc64/mm/init.c
  80. 0 2
      arch/um/kernel/process.c
  81. 14 0
      arch/x86/Kconfig.cpu
  82. 6 3
      arch/x86/boot/memory.c
  83. 1 3
      arch/x86/kernel/asm-offsets_32.c
  84. 1 1
      arch/x86/kernel/cpu/common.c
  85. 7 2
      arch/x86/kernel/cpu/mtrr/main.c
  86. 0 7
      arch/x86/kernel/cpu/transmeta.c
  87. 4 2
      arch/x86/kernel/entry_64.S
  88. 1 1
      arch/x86/kernel/head_32.S
  89. 14 8
      arch/x86/kernel/head_64.S
  90. 2 2
      arch/x86/kernel/hpet.c
  91. 1 0
      arch/x86/kernel/init_task.c
  92. 2 0
      arch/x86/kernel/process_32.c
  93. 5 3
      arch/x86/kernel/process_64.c
  94. 12 0
      arch/x86/kernel/ptrace.c
  95. 1 1
      arch/x86/kernel/setup_64.c
  96. 1 1
      arch/x86/kernel/smpboot_64.c
  97. 4 0
      arch/x86/kernel/stacktrace.c
  98. 6 2
      arch/x86/kernel/tls.c
  99. 2 1
      arch/x86/kernel/tsc_32.c
  100. 6 43
      arch/x86/kernel/vsyscall_64.c

+ 9 - 8
Documentation/debugging-via-ohci1394.txt

@@ -36,14 +36,15 @@ available (notebooks) or too slow for extensive debug information (like ACPI).
 Drivers
 Drivers
 -------
 -------
 
 
-The OHCI-1394 drivers in drivers/firewire and drivers/ieee1394 initialize
-the OHCI-1394 controllers to a working state and can be used to enable
-physical DMA. By default you only have to load the driver, and physical
-DMA access will be granted to all remote nodes, but it can be turned off
-when using the ohci1394 driver.
-
-Because these drivers depend on the PCI enumeration to be completed, an
-initialization routine which can runs pretty early (long before console_init(),
+The ohci1394 driver in drivers/ieee1394 initializes the OHCI-1394 controllers
+to a working state and enables physical DMA by default for all remote nodes.
+This can be turned off by ohci1394's module parameter phys_dma=0.
+
+The alternative firewire-ohci driver in drivers/firewire uses filtered physical
+DMA, hence is not yet suitable for remote debugging.
+
+Because ohci1394 depends on the PCI enumeration to be completed, an
+initialization routine which runs pretty early (long before console_init()
 which makes the printk buffer appear on the console can be called) was written.
 which makes the printk buffer appear on the console can be called) was written.
 
 
 To activate it, enable CONFIG_PROVIDE_OHCI1394_DMA_INIT (Kernel hacking menu:
 To activate it, enable CONFIG_PROVIDE_OHCI1394_DMA_INIT (Kernel hacking menu:

+ 22 - 0
Documentation/feature-removal-schedule.txt

@@ -172,6 +172,16 @@ Who:	Len Brown <len.brown@intel.com>
 
 
 ---------------------------
 ---------------------------
 
 
+What:	ide-tape driver
+When:	July 2008
+Files:	drivers/ide/ide-tape.c
+Why:	This driver might not have any users anymore and maintaining it for no
+	reason is an effort no one wants to make.
+Who:	Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>, Borislav Petkov
+	<petkovbb@googlemail.com>
+
+---------------------------
+
 What: libata spindown skipping and warning
 What: libata spindown skipping and warning
 When: Dec 2008
 When: Dec 2008
 Why:  Some halt(8) implementations synchronize caches for and spin
 Why:  Some halt(8) implementations synchronize caches for and spin
@@ -306,3 +316,15 @@ Why:	Largely unmaintained and almost entirely unused.  File system
 	is largely pointless as without a lot of work only the most
 	is largely pointless as without a lot of work only the most
 	trivial of Solaris binaries can work with the emulation code.
 	trivial of Solaris binaries can work with the emulation code.
 Who:	David S. Miller <davem@davemloft.net>
 Who:	David S. Miller <davem@davemloft.net>
+
+---------------------------
+
+What:	init_mm export
+When:	2.6.26
+Why:	Not used in-tree. The current out-of-tree users used it to
+	work around problems in the CPA code which should be resolved
+	by now. One usecase was described to provide verification code
+	of the CPA operation. That's a good idea in general, but such
+	code / infrastructure should be in the kernel and not in some
+	out-of-tree driver.
+Who:	Thomas Gleixner <tglx@linutronix.de>

+ 2 - 1
Documentation/i2c/busses/i2c-i801

@@ -12,8 +12,9 @@ Supported adapters:
   * Intel 82801G (ICH7)
   * Intel 82801G (ICH7)
   * Intel 631xESB/632xESB (ESB2)
   * Intel 631xESB/632xESB (ESB2)
   * Intel 82801H (ICH8)
   * Intel 82801H (ICH8)
-  * Intel ICH9
+  * Intel 82801I (ICH9)
   * Intel Tolapai
   * Intel Tolapai
+  * Intel ICH10
    Datasheets: Publicly available at the Intel website
    Datasheets: Publicly available at the Intel website
 
 
 Authors: 
 Authors: 

+ 0 - 49
Documentation/ide.txt

@@ -258,8 +258,6 @@ Summary of ide driver parameters for kernel command line
 			  As for VLB, it is safest to not specify it.
 			  As for VLB, it is safest to not specify it.
 			  Bigger values are safer than smaller ones.
 			  Bigger values are safer than smaller ones.
 
 
- "idex=noprobe"		: do not attempt to access/use this interface
- 
  "idex=base"		: probe for an interface at the addr specified,
  "idex=base"		: probe for an interface at the addr specified,
 			  where "base" is usually 0x1f0 or 0x170
 			  where "base" is usually 0x1f0 or 0x170
 			  and "ctl" is assumed to be "base"+0x206
 			  and "ctl" is assumed to be "base"+0x206
@@ -307,53 +305,6 @@ Also for legacy CMD640 host driver (cmd640) you need to use "probe_vlb"
 kernel paremeter to enable probing for VLB version of the chipset (PCI ones
 kernel paremeter to enable probing for VLB version of the chipset (PCI ones
 are detected automatically).
 are detected automatically).
 
 
-================================================================================
-
-IDE ATAPI streaming tape driver
--------------------------------
-
-This driver is a part of the Linux ide driver and works in co-operation
-with linux/drivers/block/ide.c.
-
-The driver, in co-operation with ide.c, basically traverses the
-request-list for the block device interface. The character device
-interface, on the other hand, creates new requests, adds them
-to the request-list of the block device, and waits for their completion.
-
-Pipelined operation mode is now supported on both reads and writes.
-
-The block device major and minor numbers are determined from the
-tape's relative position in the ide interfaces, as explained in ide.c.
-
-The character device interface consists of the following devices:
-
- ht0		major 37, minor 0	first  IDE tape, rewind on close.
- ht1		major 37, minor 1	second IDE tape, rewind on close.
- ...
- nht0		major 37, minor 128	first  IDE tape, no rewind on close.
- nht1		major 37, minor 129	second IDE tape, no rewind on close.
- ...
-
-Run /dev/MAKEDEV to create the above entries.
-
-The general magnetic tape commands compatible interface, as defined by
-include/linux/mtio.h, is accessible through the character device.
-
-General ide driver configuration options, such as the interrupt-unmask
-flag, can be configured by issuing an ioctl to the block device interface,
-as any other ide device.
-
-Our own ide-tape ioctl's can be issued to either the block device or
-the character device interface.
-
-Maximal throughput with minimal bus load will usually be achieved in the
-following scenario:
-
-	1.	ide-tape is operating in the pipelined operation mode.
-	2.	No buffering is performed by the user backup program.
-
-
-
 ================================================================================
 ================================================================================
 
 
 Some Terminology
 Some Terminology

+ 17 - 6
MAINTAINERS

@@ -767,14 +767,14 @@ S:	Maintained
 
 
 BLACKFIN ARCHITECTURE
 BLACKFIN ARCHITECTURE
 P:	Bryan Wu
 P:	Bryan Wu
-M:	bryan.wu@analog.com
+M:	cooloney@kernel.org
 L:	uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
 L:	uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
 W:	http://blackfin.uclinux.org
 W:	http://blackfin.uclinux.org
 S:	Supported
 S:	Supported
 
 
 BLACKFIN EMAC DRIVER
 BLACKFIN EMAC DRIVER
 P:	Bryan Wu
 P:	Bryan Wu
-M:	bryan.wu@analog.com
+M:	cooloney@kernel.org
 L:	uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
 L:	uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
 W:	http://blackfin.uclinux.org
 W:	http://blackfin.uclinux.org
 S:	Supported
 S:	Supported
@@ -982,6 +982,12 @@ M:	mchan@broadcom.com
 L:	netdev@vger.kernel.org
 L:	netdev@vger.kernel.org
 S:	Supported
 S:	Supported
 
 
+BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
+P:	Eliezer Tamir
+M:	eliezert@broadcom.com
+L:	netdev@vger.kernel.org
+S:	Supported
+
 BROADCOM TG3 GIGABIT ETHERNET DRIVER
 BROADCOM TG3 GIGABIT ETHERNET DRIVER
 P:	Michael Chan
 P:	Michael Chan
 M:	mchan@broadcom.com
 M:	mchan@broadcom.com
@@ -2744,6 +2750,8 @@ S:	Maintained
 NETEFFECT IWARP RNIC DRIVER (IW_NES)
 NETEFFECT IWARP RNIC DRIVER (IW_NES)
 P:	Faisal Latif
 P:	Faisal Latif
 M:	flatif@neteffect.com
 M:	flatif@neteffect.com
+P:	Nishi Gupta
+M:	ngupta@neteffect.com
 P:	Glenn Streiff
 P:	Glenn Streiff
 M:	gstreiff@neteffect.com
 M:	gstreiff@neteffect.com
 L:	general@lists.openfabrics.org
 L:	general@lists.openfabrics.org
@@ -3884,10 +3892,13 @@ M:	trivial@kernel.org
 L:	linux-kernel@vger.kernel.org
 L:	linux-kernel@vger.kernel.org
 S:	Maintained
 S:	Maintained
 
 
-TULIP NETWORK DRIVER
-L:	tulip-users@lists.sourceforge.net
-W:	http://sourceforge.net/projects/tulip/
-S:	Orphan
+TULIP NETWORK DRIVERS
+P:	Grant Grundler
+M:	grundler@parisc-linux.org
+P:	Kyle McMartin
+M:	kyle@parisc-linux.org
+L:	netdev@vger.kernel.org
+S:	Maintained
 
 
 TUN/TAP driver
 TUN/TAP driver
 P:	Maxim Krasnyansky
 P:	Maxim Krasnyansky

+ 1 - 1
Makefile

@@ -1,7 +1,7 @@
 VERSION = 2
 VERSION = 2
 PATCHLEVEL = 6
 PATCHLEVEL = 6
 SUBLEVEL = 25
 SUBLEVEL = 25
-EXTRAVERSION = -rc2
+EXTRAVERSION = -rc3
 NAME = Funky Weasel is Jiggy wit it
 NAME = Funky Weasel is Jiggy wit it
 
 
 # *DOCUMENTATION*
 # *DOCUMENTATION*

+ 2 - 1
arch/arm/Kconfig

@@ -939,7 +939,8 @@ config KEXEC
 
 
 config ATAGS_PROC
 config ATAGS_PROC
 	bool "Export atags in procfs"
 	bool "Export atags in procfs"
-	default n
+	depends on KEXEC
+	default y
 	help
 	help
 	  Should the atags used to boot the kernel be exported in an "atags"
 	  Should the atags used to boot the kernel be exported in an "atags"
 	  file in procfs. Useful with kexec.
 	  file in procfs. Useful with kexec.

+ 2 - 0
arch/arm/mach-omap1/board-sx1.c

@@ -61,6 +61,7 @@ int sx1_i2c_write_byte(u8 devaddr, u8 regoffset, u8 value)
 	data[0] = regoffset;	/* register num */
 	data[0] = regoffset;	/* register num */
 	data[1] = value;		/* register data */
 	data[1] = value;		/* register data */
 	err = i2c_transfer(adap, msg, 1);
 	err = i2c_transfer(adap, msg, 1);
+	i2c_put_adapter(adap);
 	if (err >= 0)
 	if (err >= 0)
 		return 0;
 		return 0;
 	return err;
 	return err;
@@ -91,6 +92,7 @@ int sx1_i2c_read_byte(u8 devaddr, u8 regoffset, u8 *value)
 	msg->buf = data;
 	msg->buf = data;
 	err = i2c_transfer(adap, msg, 1);
 	err = i2c_transfer(adap, msg, 1);
 	*value = data[0];
 	*value = data[0];
+	i2c_put_adapter(adap);
 
 
 	if (err >= 0)
 	if (err >= 0)
 		return 0;
 		return 0;

+ 1 - 1
arch/arm/mach-pxa/cpu-pxa.c

@@ -43,7 +43,7 @@
 
 
 #ifdef DEBUG
 #ifdef DEBUG
 static unsigned int freq_debug;
 static unsigned int freq_debug;
-MODULE_PARM(freq_debug, "i");
+module_param(freq_debug, uint, 0);
 MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0");
 MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0");
 #else
 #else
 #define freq_debug  0
 #define freq_debug  0

+ 0 - 8
arch/arm/mach-pxa/pxa3xx.c

@@ -129,28 +129,20 @@ static void clk_pxa3xx_cken_enable(struct clk *clk)
 {
 {
 	unsigned long mask = 1ul << (clk->cken & 0x1f);
 	unsigned long mask = 1ul << (clk->cken & 0x1f);
 
 
-	local_irq_disable();
-
 	if (clk->cken < 32)
 	if (clk->cken < 32)
 		CKENA |= mask;
 		CKENA |= mask;
 	else
 	else
 		CKENB |= mask;
 		CKENB |= mask;
-
-	local_irq_enable();
 }
 }
 
 
 static void clk_pxa3xx_cken_disable(struct clk *clk)
 static void clk_pxa3xx_cken_disable(struct clk *clk)
 {
 {
 	unsigned long mask = 1ul << (clk->cken & 0x1f);
 	unsigned long mask = 1ul << (clk->cken & 0x1f);
 
 
-	local_irq_disable();
-
 	if (clk->cken < 32)
 	if (clk->cken < 32)
 		CKENA &= ~mask;
 		CKENA &= ~mask;
 	else
 	else
 		CKENB &= ~mask;
 		CKENB &= ~mask;
-
-	local_irq_enable();
 }
 }
 
 
 static const struct clkops clk_pxa3xx_cken_ops = {
 static const struct clkops clk_pxa3xx_cken_ops = {

+ 1 - 1
arch/arm/mach-pxa/zylonite.c

@@ -58,7 +58,7 @@ static struct platform_device smc91x_device = {
 	.resource	= smc91x_resources,
 	.resource	= smc91x_resources,
 };
 };
 
 
-#if defined(CONFIG_FB_PXA) || (CONFIG_FB_PXA_MODULES)
+#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
 static void zylonite_backlight_power(int on)
 static void zylonite_backlight_power(int on)
 {
 {
 	gpio_set_value(gpio_backlight, on);
 	gpio_set_value(gpio_backlight, on);

+ 2 - 0
arch/arm/mm/mmap.c

@@ -120,6 +120,8 @@ full_search:
  */
  */
 int valid_phys_addr_range(unsigned long addr, size_t size)
 int valid_phys_addr_range(unsigned long addr, size_t size)
 {
 {
+	if (addr < PHYS_OFFSET)
+		return 0;
 	if (addr + size > __pa(high_memory))
 	if (addr + size > __pa(high_memory))
 		return 0;
 		return 0;
 
 

+ 1 - 1
arch/avr32/boards/atstk1000/atstk1004.c

@@ -129,7 +129,7 @@ static int __init atstk1004_init(void)
 #ifdef CONFIG_BOARD_ATSTK100X_SPI1
 #ifdef CONFIG_BOARD_ATSTK100X_SPI1
 	at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
 	at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
 #endif
 #endif
-#ifndef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM
+#ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM
 	at32_add_device_mci(0);
 	at32_add_device_mci(0);
 #endif
 #endif
 	at32_add_device_lcdc(0, &atstk1000_lcdc_data,
 	at32_add_device_lcdc(0, &atstk1000_lcdc_data,

+ 4 - 0
arch/avr32/kernel/process.c

@@ -11,6 +11,7 @@
 #include <linux/fs.h>
 #include <linux/fs.h>
 #include <linux/ptrace.h>
 #include <linux/ptrace.h>
 #include <linux/reboot.h>
 #include <linux/reboot.h>
+#include <linux/tick.h>
 #include <linux/uaccess.h>
 #include <linux/uaccess.h>
 #include <linux/unistd.h>
 #include <linux/unistd.h>
 
 
@@ -30,8 +31,10 @@ void cpu_idle(void)
 {
 {
 	/* endless idle loop with no priority at all */
 	/* endless idle loop with no priority at all */
 	while (1) {
 	while (1) {
+		tick_nohz_stop_sched_tick();
 		while (!need_resched())
 		while (!need_resched())
 			cpu_idle_sleep();
 			cpu_idle_sleep();
+		tick_nohz_restart_sched_tick();
 		preempt_enable_no_resched();
 		preempt_enable_no_resched();
 		schedule();
 		schedule();
 		preempt_disable();
 		preempt_disable();
@@ -345,6 +348,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
 	p->thread.cpu_context.ksp = (unsigned long)childregs;
 	p->thread.cpu_context.ksp = (unsigned long)childregs;
 	p->thread.cpu_context.pc = (unsigned long)ret_from_fork;
 	p->thread.cpu_context.pc = (unsigned long)ret_from_fork;
 
 
+	clear_tsk_thread_flag(p, TIF_DEBUG);
 	if ((clone_flags & CLONE_PTRACE) && test_thread_flag(TIF_DEBUG))
 	if ((clone_flags & CLONE_PTRACE) && test_thread_flag(TIF_DEBUG))
 		ocd_enable(p);
 		ocd_enable(p);
 
 

+ 2 - 0
arch/avr32/mm/fault.c

@@ -189,6 +189,8 @@ no_context:
 
 
 	page = sysreg_read(PTBR);
 	page = sysreg_read(PTBR);
 	printk(KERN_ALERT "ptbr = %08lx", page);
 	printk(KERN_ALERT "ptbr = %08lx", page);
+	if (address >= TASK_SIZE)
+		page = (unsigned long)swapper_pg_dir;
 	if (page) {
 	if (page) {
 		page = ((unsigned long *)page)[address >> 22];
 		page = ((unsigned long *)page)[address >> 22];
 		printk(" pgd = %08lx", page);
 		printk(" pgd = %08lx", page);

+ 4 - 1
arch/blackfin/Makefile

@@ -98,8 +98,11 @@ drivers-$(CONFIG_OPROFILE) += arch/$(ARCH)/oprofile/
 #	them changed.  We use .mach to indicate when they were updated
 #	them changed.  We use .mach to indicate when they were updated
 #	last, otherwise make uses the target directory mtime.
 #	last, otherwise make uses the target directory mtime.
 
 
+       show_mach_symlink = :
+ quiet_show_mach_symlink = echo '  SYMLINK include/asm-$(ARCH)/mach-$(MACHINE) -> include/asm-$(ARCH)/mach'
+silent_show_mach_symlink = :
 include/asm-blackfin/.mach: $(wildcard include/config/arch/*.h) include/config/auto.conf
 include/asm-blackfin/.mach: $(wildcard include/config/arch/*.h) include/config/auto.conf
-	@echo '  SYMLINK include/asm-$(ARCH)/mach-$(MACHINE) -> include/asm-$(ARCH)/mach'
+	@$($(quiet)show_mach_symlink)
 ifneq ($(KBUILD_SRC),)
 ifneq ($(KBUILD_SRC),)
 	$(Q)mkdir -p include/asm-$(ARCH)
 	$(Q)mkdir -p include/asm-$(ARCH)
 	$(Q)ln -fsn $(srctree)/include/asm-$(ARCH)/mach-$(MACHINE) include/asm-$(ARCH)/mach
 	$(Q)ln -fsn $(srctree)/include/asm-$(ARCH)/mach-$(MACHINE) include/asm-$(ARCH)/mach

+ 8 - 10
arch/blackfin/configs/BF527-EZKIT_defconfig

@@ -1,7 +1,6 @@
 #
 #
 # Automatically generated make config: don't edit
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.22.14
-# Thu Nov 29 17:32:47 2007
+# Linux kernel version: 2.6.22.16
 #
 #
 # CONFIG_MMU is not set
 # CONFIG_MMU is not set
 # CONFIG_FPU is not set
 # CONFIG_FPU is not set
@@ -116,7 +115,10 @@ CONFIG_PREEMPT_VOLUNTARY=y
 # Processor and Board Settings
 # Processor and Board Settings
 #
 #
 # CONFIG_BF522 is not set
 # CONFIG_BF522 is not set
+# CONFIG_BF523 is not set
+# CONFIG_BF524 is not set
 # CONFIG_BF525 is not set
 # CONFIG_BF525 is not set
+# CONFIG_BF526 is not set
 CONFIG_BF527=y
 CONFIG_BF527=y
 # CONFIG_BF531 is not set
 # CONFIG_BF531 is not set
 # CONFIG_BF532 is not set
 # CONFIG_BF532 is not set
@@ -306,6 +308,7 @@ CONFIG_BFIN_DCACHE=y
 # CONFIG_BFIN_WB is not set
 # CONFIG_BFIN_WB is not set
 CONFIG_BFIN_WT=y
 CONFIG_BFIN_WT=y
 CONFIG_L1_MAX_PIECE=16
 CONFIG_L1_MAX_PIECE=16
+# CONFIG_MPU is not set
 
 
 #
 #
 # Asynchonous Memory Configuration
 # Asynchonous Memory Configuration
@@ -354,6 +357,7 @@ CONFIG_BINFMT_ZFLAT=y
 # Power management options
 # Power management options
 #
 #
 # CONFIG_PM is not set
 # CONFIG_PM is not set
+# CONFIG_PM_WAKEUP_BY_GPIO is not set
 
 
 #
 #
 # Networking
 # Networking
@@ -496,7 +500,6 @@ CONFIG_MTD_CFI_I2=y
 # CONFIG_MTD_CFI_INTELEXT is not set
 # CONFIG_MTD_CFI_INTELEXT is not set
 # CONFIG_MTD_CFI_AMDSTD is not set
 # CONFIG_MTD_CFI_AMDSTD is not set
 # CONFIG_MTD_CFI_STAA is not set
 # CONFIG_MTD_CFI_STAA is not set
-CONFIG_MTD_MW320D=m
 CONFIG_MTD_RAM=y
 CONFIG_MTD_RAM=y
 CONFIG_MTD_ROM=m
 CONFIG_MTD_ROM=m
 # CONFIG_MTD_ABSENT is not set
 # CONFIG_MTD_ABSENT is not set
@@ -506,9 +509,6 @@ CONFIG_MTD_ROM=m
 #
 #
 CONFIG_MTD_COMPLEX_MAPPINGS=y
 CONFIG_MTD_COMPLEX_MAPPINGS=y
 # CONFIG_MTD_PHYSMAP is not set
 # CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_BF5xx=m
-CONFIG_BFIN_FLASH_SIZE=0x400000
-CONFIG_EBIU_FLASH_BASE=0x20000000
 # CONFIG_MTD_UCLINUX is not set
 # CONFIG_MTD_UCLINUX is not set
 # CONFIG_MTD_PLATRAM is not set
 # CONFIG_MTD_PLATRAM is not set
 
 
@@ -684,7 +684,6 @@ CONFIG_INPUT_MISC=y
 # CONFIG_INPUT_POWERMATE is not set
 # CONFIG_INPUT_POWERMATE is not set
 # CONFIG_INPUT_YEALINK is not set
 # CONFIG_INPUT_YEALINK is not set
 # CONFIG_INPUT_UINPUT is not set
 # CONFIG_INPUT_UINPUT is not set
-# CONFIG_BF53X_PFBUTTONS is not set
 # CONFIG_TWI_KEYPAD is not set
 # CONFIG_TWI_KEYPAD is not set
 
 
 #
 #
@@ -702,12 +701,12 @@ CONFIG_INPUT_MISC=y
 # CONFIG_BF5xx_PPIFCD is not set
 # CONFIG_BF5xx_PPIFCD is not set
 # CONFIG_BFIN_SIMPLE_TIMER is not set
 # CONFIG_BFIN_SIMPLE_TIMER is not set
 # CONFIG_BF5xx_PPI is not set
 # CONFIG_BF5xx_PPI is not set
+CONFIG_BFIN_OTP=y
+# CONFIG_BFIN_OTP_WRITE_ENABLE is not set
 # CONFIG_BFIN_SPORT is not set
 # CONFIG_BFIN_SPORT is not set
 # CONFIG_BFIN_TIMER_LATENCY is not set
 # CONFIG_BFIN_TIMER_LATENCY is not set
 # CONFIG_TWI_LCD is not set
 # CONFIG_TWI_LCD is not set
 # CONFIG_AD5304 is not set
 # CONFIG_AD5304 is not set
-# CONFIG_BF5xx_TEA5764 is not set
-# CONFIG_BF5xx_FBDMA is not set
 # CONFIG_VT is not set
 # CONFIG_VT is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 
 
@@ -772,7 +771,6 @@ CONFIG_I2C_CHARDEV=m
 #
 #
 # I2C Hardware Bus support
 # I2C Hardware Bus support
 #
 #
-# CONFIG_I2C_BLACKFIN_GPIO is not set
 CONFIG_I2C_BLACKFIN_TWI=m
 CONFIG_I2C_BLACKFIN_TWI=m
 CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=50
 CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=50
 # CONFIG_I2C_GPIO is not set
 # CONFIG_I2C_GPIO is not set

+ 2 - 4
arch/blackfin/configs/BF533-EZKIT_defconfig

@@ -322,10 +322,9 @@ CONFIG_PM=y
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_SYSFS_DEPRECATED is not set
 # CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_PM_WAKEUP_GPIO_BY_SIC_IWR=y
+CONFIG_PM_BFIN_SLEEP_DEEPER=y
+# CONFIG_PM_BFIN_SLEEP is not set
 # CONFIG_PM_WAKEUP_BY_GPIO is not set
 # CONFIG_PM_WAKEUP_BY_GPIO is not set
-# CONFIG_PM_WAKEUP_GPIO_API is not set
-CONFIG_PM_WAKEUP_SIC_IWR=0x80
 
 
 #
 #
 # CPU Frequency scaling
 # CPU Frequency scaling
@@ -697,7 +696,6 @@ CONFIG_SERIAL_BFIN_DMA=y
 # CONFIG_SERIAL_BFIN_PIO is not set
 # CONFIG_SERIAL_BFIN_PIO is not set
 CONFIG_SERIAL_BFIN_UART0=y
 CONFIG_SERIAL_BFIN_UART0=y
 # CONFIG_BFIN_UART0_CTSRTS is not set
 # CONFIG_BFIN_UART0_CTSRTS is not set
-# CONFIG_SERIAL_BFIN_UART1 is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_BFIN_SPORT is not set
 # CONFIG_SERIAL_BFIN_SPORT is not set

+ 2 - 4
arch/blackfin/configs/BF533-STAMP_defconfig

@@ -323,10 +323,9 @@ CONFIG_PM=y
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_SYSFS_DEPRECATED is not set
 # CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_PM_WAKEUP_GPIO_BY_SIC_IWR=y
+CONFIG_PM_BFIN_SLEEP_DEEPER=y
+# CONFIG_PM_BFIN_SLEEP is not set
 # CONFIG_PM_WAKEUP_BY_GPIO is not set
 # CONFIG_PM_WAKEUP_BY_GPIO is not set
-# CONFIG_PM_WAKEUP_GPIO_API is not set
-CONFIG_PM_WAKEUP_SIC_IWR=0x80
 
 
 #
 #
 # CPU Frequency scaling
 # CPU Frequency scaling
@@ -714,7 +713,6 @@ CONFIG_SERIAL_BFIN_DMA=y
 # CONFIG_SERIAL_BFIN_PIO is not set
 # CONFIG_SERIAL_BFIN_PIO is not set
 CONFIG_SERIAL_BFIN_UART0=y
 CONFIG_SERIAL_BFIN_UART0=y
 # CONFIG_BFIN_UART0_CTSRTS is not set
 # CONFIG_BFIN_UART0_CTSRTS is not set
-# CONFIG_SERIAL_BFIN_UART1 is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_BFIN_SPORT is not set
 # CONFIG_SERIAL_BFIN_SPORT is not set

+ 3 - 3
arch/blackfin/configs/BF537-STAMP_defconfig

@@ -330,10 +330,9 @@ CONFIG_PM=y
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_SYSFS_DEPRECATED is not set
 # CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_PM_WAKEUP_GPIO_BY_SIC_IWR=y
+CONFIG_PM_BFIN_SLEEP_DEEPER=y
+# CONFIG_PM_BFIN_SLEEP is not set
 # CONFIG_PM_WAKEUP_BY_GPIO is not set
 # CONFIG_PM_WAKEUP_BY_GPIO is not set
-# CONFIG_PM_WAKEUP_GPIO_API is not set
-CONFIG_PM_WAKEUP_SIC_IWR=0x8
 
 
 #
 #
 # CPU Frequency scaling
 # CPU Frequency scaling
@@ -1013,6 +1012,7 @@ CONFIG_SND_BFIN_AD73311_SE=4
 CONFIG_SND_SOC_AC97_BUS=y
 CONFIG_SND_SOC_AC97_BUS=y
 CONFIG_SND_SOC=m
 CONFIG_SND_SOC=m
 CONFIG_SND_BF5XX_SOC=m
 CONFIG_SND_BF5XX_SOC=m
+CONFIG_SND_MMAP_SUPPORT=y
 CONFIG_SND_BF5XX_SOC_AC97=m
 CONFIG_SND_BF5XX_SOC_AC97=m
 # CONFIG_SND_BF5XX_SOC_WM8750 is not set
 # CONFIG_SND_BF5XX_SOC_WM8750 is not set
 # CONFIG_SND_BF5XX_SOC_WM8731 is not set
 # CONFIG_SND_BF5XX_SOC_WM8731 is not set

+ 2 - 0
arch/blackfin/configs/BF548-EZKIT_defconfig

@@ -396,6 +396,7 @@ CONFIG_BINFMT_ZFLAT=y
 # Power management options
 # Power management options
 #
 #
 # CONFIG_PM is not set
 # CONFIG_PM is not set
+# CONFIG_PM_WAKEUP_BY_GPIO is not set
 
 
 #
 #
 # CPU Frequency scaling
 # CPU Frequency scaling
@@ -1075,6 +1076,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
 CONFIG_SND_SOC_AC97_BUS=y
 CONFIG_SND_SOC_AC97_BUS=y
 CONFIG_SND_SOC=y
 CONFIG_SND_SOC=y
 CONFIG_SND_BF5XX_SOC=y
 CONFIG_SND_BF5XX_SOC=y
+CONFIG_SND_MMAP_SUPPORT=y
 CONFIG_SND_BF5XX_SOC_AC97=y
 CONFIG_SND_BF5XX_SOC_AC97=y
 CONFIG_SND_BF5XX_SOC_BF548_EZKIT=y
 CONFIG_SND_BF5XX_SOC_BF548_EZKIT=y
 # CONFIG_SND_BF5XX_SOC_WM8750 is not set
 # CONFIG_SND_BF5XX_SOC_WM8750 is not set

+ 1 - 0
arch/blackfin/configs/BF561-EZKIT_defconfig

@@ -367,6 +367,7 @@ CONFIG_BINFMT_ZFLAT=y
 # Power management options
 # Power management options
 #
 #
 # CONFIG_PM is not set
 # CONFIG_PM is not set
+# CONFIG_PM_WAKEUP_BY_GPIO is not set
 
 
 #
 #
 # Networking
 # Networking

+ 8 - 7
arch/blackfin/kernel/bfin_dma_5xx.c

@@ -105,13 +105,14 @@ int request_dma(unsigned int channel, char *device_id)
 	mutex_unlock(&(dma_ch[channel].dmalock));
 	mutex_unlock(&(dma_ch[channel].dmalock));
 
 
 #ifdef CONFIG_BF54x
 #ifdef CONFIG_BF54x
-	if (channel >= CH_UART2_RX && channel <= CH_UART3_TX &&
-		strncmp(device_id, "BFIN_UART", 9) == 0)
-		dma_ch[channel].regs->peripheral_map |=
-			(channel - CH_UART2_RX + 0xC);
-	else
-		dma_ch[channel].regs->peripheral_map |=
-			(channel - CH_UART2_RX + 0x6);
+	if (channel >= CH_UART2_RX && channel <= CH_UART3_TX) {
+		if (strncmp(device_id, "BFIN_UART", 9) == 0)
+			dma_ch[channel].regs->peripheral_map |=
+				(channel - CH_UART2_RX + 0xC);
+		else
+			dma_ch[channel].regs->peripheral_map |=
+				(channel - CH_UART2_RX + 0x6);
+	}
 #endif
 #endif
 
 
 	dma_ch[channel].device_id = device_id;
 	dma_ch[channel].device_id = device_id;

+ 4 - 4
arch/blackfin/kernel/gptimers.c

@@ -1,9 +1,9 @@
 /*
 /*
- * bfin_gptimers.c - derived from bf53x_timers.c
- *  Driver for General Purpose Timer functions on the Blackfin processor
+ * gptimers.c - Blackfin General Purpose Timer core API
  *
  *
- *  Copyright (C) 2005 John DeHority
- *  Copyright (C) 2006 Hella Aglaia GmbH (awe@aglaia-gmbh.de)
+ * Copyright (c) 2005-2008 Analog Devices Inc.
+ * Copyright (C) 2005 John DeHority
+ * Copyright (C) 2006 Hella Aglaia GmbH (awe@aglaia-gmbh.de)
  *
  *
  * Licensed under the GPLv2.
  * Licensed under the GPLv2.
  */
  */

+ 4 - 1
arch/blackfin/kernel/setup.c

@@ -32,6 +32,7 @@
 static DEFINE_PER_CPU(struct cpu, cpu_devices);
 static DEFINE_PER_CPU(struct cpu, cpu_devices);
 
 
 u16 _bfin_swrst;
 u16 _bfin_swrst;
+EXPORT_SYMBOL(_bfin_swrst);
 
 
 unsigned long memory_start, memory_end, physical_mem_end;
 unsigned long memory_start, memory_end, physical_mem_end;
 unsigned long reserved_mem_dcache_on;
 unsigned long reserved_mem_dcache_on;
@@ -514,6 +515,7 @@ static __init void  memory_setup(void)
 	printk(KERN_INFO "Kernel Managed Memory: %ldMB\n", _ramend >> 20);
 	printk(KERN_INFO "Kernel Managed Memory: %ldMB\n", _ramend >> 20);
 
 
 	printk(KERN_INFO "Memory map:\n"
 	printk(KERN_INFO "Memory map:\n"
+		KERN_INFO "  fixedcode = 0x%p-0x%p\n"
 		KERN_INFO "  text      = 0x%p-0x%p\n"
 		KERN_INFO "  text      = 0x%p-0x%p\n"
 		KERN_INFO "  rodata    = 0x%p-0x%p\n"
 		KERN_INFO "  rodata    = 0x%p-0x%p\n"
 		KERN_INFO "  bss       = 0x%p-0x%p\n"
 		KERN_INFO "  bss       = 0x%p-0x%p\n"
@@ -527,7 +529,8 @@ static __init void  memory_setup(void)
 #if DMA_UNCACHED_REGION > 0
 #if DMA_UNCACHED_REGION > 0
 		KERN_INFO "  DMA Zone  = 0x%p-0x%p\n"
 		KERN_INFO "  DMA Zone  = 0x%p-0x%p\n"
 #endif
 #endif
-		, _stext, _etext,
+		, (void *)FIXED_CODE_START, (void *)FIXED_CODE_END,
+		_stext, _etext,
 		__start_rodata, __end_rodata,
 		__start_rodata, __end_rodata,
 		__bss_start, __bss_stop,
 		__bss_start, __bss_stop,
 		_sdata, _edata,
 		_sdata, _edata,

+ 27 - 7
arch/blackfin/kernel/vmlinux.lds.S

@@ -147,44 +147,64 @@ SECTIONS
 
 
 	__l1_lma_start = .;
 	__l1_lma_start = .;
 
 
+#if L1_CODE_LENGTH
+# define LDS_L1_CODE *(.l1.text)
+#else
+# define LDS_L1_CODE
+#endif
 	.text_l1 L1_CODE_START : AT(LOADADDR(.init.ramfs) + SIZEOF(.init.ramfs))
 	.text_l1 L1_CODE_START : AT(LOADADDR(.init.ramfs) + SIZEOF(.init.ramfs))
 	{
 	{
 		. = ALIGN(4);
 		. = ALIGN(4);
 		__stext_l1 = .;
 		__stext_l1 = .;
-		*(.l1.text)
-
+		LDS_L1_CODE
 		. = ALIGN(4);
 		. = ALIGN(4);
 		__etext_l1 = .;
 		__etext_l1 = .;
 	}
 	}
 
 
+#if L1_DATA_A_LENGTH
+# define LDS_L1_A_DATA  *(.l1.data)
+# define LDS_L1_A_BSS   *(.l1.bss)
+# define LDS_L1_A_CACHE *(.data_l1.cacheline_aligned)
+#else
+# define LDS_L1_A_DATA
+# define LDS_L1_A_BSS
+# define LDS_L1_A_CACHE
+#endif
 	.data_l1 L1_DATA_A_START : AT(LOADADDR(.text_l1) + SIZEOF(.text_l1))
 	.data_l1 L1_DATA_A_START : AT(LOADADDR(.text_l1) + SIZEOF(.text_l1))
 	{
 	{
 		. = ALIGN(4);
 		. = ALIGN(4);
 		__sdata_l1 = .;
 		__sdata_l1 = .;
-		*(.l1.data)
+		LDS_L1_A_DATA
 		__edata_l1 = .;
 		__edata_l1 = .;
 
 
 		. = ALIGN(4);
 		. = ALIGN(4);
 		__sbss_l1 = .;
 		__sbss_l1 = .;
-		*(.l1.bss)
+		LDS_L1_A_BSS
 
 
 		. = ALIGN(32);
 		. = ALIGN(32);
-		*(.data_l1.cacheline_aligned)
+		LDS_L1_A_CACHE
 
 
 		. = ALIGN(4);
 		. = ALIGN(4);
 		__ebss_l1 = .;
 		__ebss_l1 = .;
 	}
 	}
 
 
+#if L1_DATA_B_LENGTH
+# define LDS_L1_B_DATA  *(.l1.data.B)
+# define LDS_L1_B_BSS   *(.l1.bss.B)
+#else
+# define LDS_L1_B_DATA
+# define LDS_L1_B_BSS
+#endif
 	.data_b_l1 L1_DATA_B_START : AT(LOADADDR(.data_l1) + SIZEOF(.data_l1))
 	.data_b_l1 L1_DATA_B_START : AT(LOADADDR(.data_l1) + SIZEOF(.data_l1))
 	{
 	{
 		. = ALIGN(4);
 		. = ALIGN(4);
 		__sdata_b_l1 = .;
 		__sdata_b_l1 = .;
-		*(.l1.data.B)
+		LDS_L1_B_DATA
 		__edata_b_l1 = .;
 		__edata_b_l1 = .;
 
 
 		. = ALIGN(4);
 		. = ALIGN(4);
 		__sbss_b_l1 = .;
 		__sbss_b_l1 = .;
-		*(.l1.bss.B)
+		LDS_L1_B_BSS
 
 
 		. = ALIGN(4);
 		. = ALIGN(4);
 		__ebss_b_l1 = .;
 		__ebss_b_l1 = .;

+ 31 - 29
arch/blackfin/mach-bf527/boards/ezkit.c

@@ -180,8 +180,8 @@ static struct mtd_partition partition_info[] = {
 	},
 	},
 	{
 	{
 		.name = "File System",
 		.name = "File System",
-		.offset = 4 * SIZE_1M,
-		.size = (256 - 4) * SIZE_1M,
+		.offset = MTDPART_OFS_APPEND,
+		.size = MTDPART_SIZ_FULL,
 	},
 	},
 };
 };
 
 
@@ -422,11 +422,11 @@ static struct mtd_partition bfin_spi_flash_partitions[] = {
 	}, {
 	}, {
 		.name = "kernel",
 		.name = "kernel",
 		.size = 0xe0000,
 		.size = 0xe0000,
-		.offset = 0x20000
+		.offset = MTDPART_OFS_APPEND,
 	}, {
 	}, {
 		.name = "file system",
 		.name = "file system",
-		.size = 0x700000,
-		.offset = 0x00100000,
+		.size = MTDPART_SIZ_FULL,
+		.offset = MTDPART_OFS_APPEND,
 	}
 	}
 };
 };
 
 
@@ -484,13 +484,6 @@ static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
 };
 };
 #endif
 #endif
 
 
-#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
-static struct bfin5xx_spi_chip ad5304_chip_info = {
-	.enable_dma = 0,
-	.bits_per_word = 16,
-};
-#endif
-
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
 static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
 	.enable_dma = 0,
 	.enable_dma = 0,
@@ -611,17 +604,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
 		.mode = SPI_MODE_3,
 		.mode = SPI_MODE_3,
 	},
 	},
 #endif
 #endif
-#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
-	{
-		.modalias = "ad5304_spi",
-		.max_speed_hz = 1250000,     /* max spi clock (SCK) speed in HZ */
-		.bus_num = 0,
-		.chip_select = 2,
-		.platform_data = NULL,
-		.controller_data = &ad5304_chip_info,
-		.mode = SPI_MODE_2,
-	},
-#endif
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 	{
 	{
 		.modalias		= "ad7877",
 		.modalias		= "ad7877",
@@ -818,6 +800,19 @@ static struct platform_device bfin_device_gpiokeys = {
 };
 };
 #endif
 #endif
 
 
+static struct resource bfin_gpios_resources = {
+	.start = 0,
+	.end   = MAX_BLACKFIN_GPIOS - 1,
+	.flags = IORESOURCE_IRQ,
+};
+
+static struct platform_device bfin_gpios_device = {
+	.name = "simple-gpio",
+	.id = -1,
+	.num_resources = 1,
+	.resource = &bfin_gpios_resources,
+};
+
 static struct platform_device *stamp_devices[] __initdata = {
 static struct platform_device *stamp_devices[] __initdata = {
 #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
 #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
 	&bf5xx_nand_device,
 	&bf5xx_nand_device,
@@ -895,6 +890,8 @@ static struct platform_device *stamp_devices[] __initdata = {
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 	&bfin_device_gpiokeys,
 	&bfin_device_gpiokeys,
 #endif
 #endif
+
+	&bfin_gpios_device,
 };
 };
 
 
 static int __init stamp_init(void)
 static int __init stamp_init(void)
@@ -921,13 +918,18 @@ void native_machine_restart(char *cmd)
 		bfin_gpio_reset_spi0_ssel1();
 		bfin_gpio_reset_spi0_ssel1();
 }
 }
 
 
-/*
- * Currently the MAC address is saved in Flash by U-Boot
- */
-#define FLASH_MAC	0x203f0000
 void bfin_get_ether_addr(char *addr)
 void bfin_get_ether_addr(char *addr)
 {
 {
-	*(u32 *)(&(addr[0])) = bfin_read32(FLASH_MAC);
-	*(u16 *)(&(addr[4])) = bfin_read16(FLASH_MAC + 4);
+	/* the MAC is stored in OTP memory page 0xDF */
+	u32 ret;
+	u64 otp_mac;
+	u32 (*otp_read)(u32 page, u32 flags, u64 *page_content) = (void *)0xEF00001A;
+
+	ret = otp_read(0xDF, 0x00, &otp_mac);
+	if (!(ret & 0x1)) {
+		char *otp_mac_p = (char *)&otp_mac;
+		for (ret = 0; ret < 6; ++ret)
+			addr[ret] = otp_mac_p[5 - ret];
+	}
 }
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
 EXPORT_SYMBOL(bfin_get_ether_addr);

+ 18 - 3
arch/blackfin/mach-bf533/boards/ezkit.c

@@ -99,11 +99,11 @@ static struct mtd_partition bfin_spi_flash_partitions[] = {
 	}, {
 	}, {
 		.name = "kernel",
 		.name = "kernel",
 		.size = 0xe0000,
 		.size = 0xe0000,
-		.offset = 0x20000
+		.offset = MTDPART_OFS_APPEND,
 	}, {
 	}, {
 		.name = "file system",
 		.name = "file system",
-		.size = 0x700000,
-		.offset = 0x00100000,
+		.size = MTDPART_SIZ_FULL,
+		.offset = MTDPART_OFS_APPEND,
 	}
 	}
 };
 };
 
 
@@ -298,6 +298,19 @@ static struct platform_device bfin_device_gpiokeys = {
 };
 };
 #endif
 #endif
 
 
+static struct resource bfin_gpios_resources = {
+	.start = 0,
+	.end   = MAX_BLACKFIN_GPIOS - 1,
+	.flags = IORESOURCE_IRQ,
+};
+
+static struct platform_device bfin_gpios_device = {
+	.name = "simple-gpio",
+	.id = -1,
+	.num_resources = 1,
+	.resource = &bfin_gpios_resources,
+};
+
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 #include <linux/i2c-gpio.h>
 #include <linux/i2c-gpio.h>
 
 
@@ -350,6 +363,8 @@ static struct platform_device *ezkit_devices[] __initdata = {
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 	&i2c_gpio_device,
 	&i2c_gpio_device,
 #endif
 #endif
+
+	&bfin_gpios_device,
 };
 };
 
 
 static int __init ezkit_init(void)
 static int __init ezkit_init(void)

+ 20 - 23
arch/blackfin/mach-bf533/boards/stamp.c

@@ -112,7 +112,7 @@ static struct platform_device net2272_bfin_device = {
 static struct mtd_partition stamp_partitions[] = {
 static struct mtd_partition stamp_partitions[] = {
 	{
 	{
 		.name   = "Bootloader",
 		.name   = "Bootloader",
-		.size   = 0x20000,
+		.size   = 0x40000,
 		.offset = 0,
 		.offset = 0,
 	}, {
 	}, {
 		.name   = "Kernel",
 		.name   = "Kernel",
@@ -160,17 +160,17 @@ static struct platform_device stamp_flash_device = {
 static struct mtd_partition bfin_spi_flash_partitions[] = {
 static struct mtd_partition bfin_spi_flash_partitions[] = {
 	{
 	{
 		.name = "bootloader",
 		.name = "bootloader",
-		.size = 0x00020000,
+		.size = 0x00040000,
 		.offset = 0,
 		.offset = 0,
 		.mask_flags = MTD_CAP_ROM
 		.mask_flags = MTD_CAP_ROM
 	}, {
 	}, {
 		.name = "kernel",
 		.name = "kernel",
 		.size = 0xe0000,
 		.size = 0xe0000,
-		.offset = 0x20000
+		.offset = MTDPART_OFS_APPEND,
 	}, {
 	}, {
 		.name = "file system",
 		.name = "file system",
-		.size = 0x700000,
-		.offset = 0x00100000,
+		.size = MTDPART_SIZ_FULL,
+		.offset = MTDPART_OFS_APPEND,
 	}
 	}
 };
 };
 
 
@@ -212,13 +212,6 @@ static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
 };
 };
 #endif
 #endif
 
 
-#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
-static struct bfin5xx_spi_chip ad5304_chip_info = {
-	.enable_dma = 0,
-	.bits_per_word = 16,
-};
-#endif
-
 #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
 #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
 static struct bfin5xx_spi_chip spi_mmc_chip_info = {
 static struct bfin5xx_spi_chip spi_mmc_chip_info = {
 	.enable_dma = 1,
 	.enable_dma = 1,
@@ -308,17 +301,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
 	},
 	},
 #endif
 #endif
 
 
-#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
-	{
-		.modalias = "ad5304_spi",
-		.max_speed_hz = 1000000,     /* max spi clock (SCK) speed in HZ */
-		.bus_num = 0,
-		.chip_select = 2,
-		.platform_data = NULL,
-		.controller_data = &ad5304_chip_info,
-		.mode = SPI_MODE_2,
-	},
-#endif
 #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
 #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
 	{
 	{
 		.modalias = "spidev",
 		.modalias = "spidev",
@@ -457,6 +439,19 @@ static struct platform_device bfin_device_gpiokeys = {
 };
 };
 #endif
 #endif
 
 
+static struct resource bfin_gpios_resources = {
+	.start = 0,
+	.end   = MAX_BLACKFIN_GPIOS - 1,
+	.flags = IORESOURCE_IRQ,
+};
+
+static struct platform_device bfin_gpios_device = {
+	.name = "simple-gpio",
+	.id = -1,
+	.num_resources = 1,
+	.resource = &bfin_gpios_resources,
+};
+
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 #include <linux/i2c-gpio.h>
 #include <linux/i2c-gpio.h>
 
 
@@ -518,6 +513,8 @@ static struct platform_device *stamp_devices[] __initdata = {
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 	&i2c_gpio_device,
 	&i2c_gpio_device,
 #endif
 #endif
+
+	&bfin_gpios_device,
 	&stamp_flash_device,
 	&stamp_flash_device,
 };
 };
 
 

+ 0 - 18
arch/blackfin/mach-bf537/boards/generic_board.c

@@ -371,13 +371,6 @@ static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
 };
 };
 #endif
 #endif
 
 
-#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
-static struct bfin5xx_spi_chip ad5304_chip_info = {
-	.enable_dma = 0,
-	.bits_per_word = 16,
-};
-#endif
-
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
 static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
 	.enable_dma = 0,
 	.enable_dma = 0,
@@ -483,17 +476,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
 		.mode = SPI_MODE_3,
 		.mode = SPI_MODE_3,
 	},
 	},
 #endif
 #endif
-#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
-	{
-		.modalias = "ad5304_spi",
-		.max_speed_hz = 1250000,     /* max spi clock (SCK) speed in HZ */
-		.bus_num = 0,
-		.chip_select = 2,
-		.platform_data = NULL,
-		.controller_data = &ad5304_chip_info,
-		.mode = SPI_MODE_2,
-	},
-#endif
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 	{
 	{
 		.modalias		= "ad7877",
 		.modalias		= "ad7877",

+ 21 - 24
arch/blackfin/mach-bf537/boards/stamp.c

@@ -128,6 +128,19 @@ static struct platform_device bfin_device_gpiokeys = {
 };
 };
 #endif
 #endif
 
 
+static struct resource bfin_gpios_resources = {
+	.start = 0,
+	.end   = MAX_BLACKFIN_GPIOS - 1,
+	.flags = IORESOURCE_IRQ,
+};
+
+static struct platform_device bfin_gpios_device = {
+	.name = "simple-gpio",
+	.id = -1,
+	.num_resources = 1,
+	.resource = &bfin_gpios_resources,
+};
+
 #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
 #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
 static struct resource bfin_pcmcia_cf_resources[] = {
 static struct resource bfin_pcmcia_cf_resources[] = {
 	{
 	{
@@ -343,7 +356,7 @@ static struct platform_device net2272_bfin_device = {
 static struct mtd_partition stamp_partitions[] = {
 static struct mtd_partition stamp_partitions[] = {
 	{
 	{
 		.name       = "Bootloader",
 		.name       = "Bootloader",
-		.size       = 0x20000,
+		.size       = 0x40000,
 		.offset     = 0,
 		.offset     = 0,
 	}, {
 	}, {
 		.name       = "Kernel",
 		.name       = "Kernel",
@@ -351,7 +364,7 @@ static struct mtd_partition stamp_partitions[] = {
 		.offset     = MTDPART_OFS_APPEND,
 		.offset     = MTDPART_OFS_APPEND,
 	}, {
 	}, {
 		.name       = "RootFS",
 		.name       = "RootFS",
-		.size       = 0x400000 - 0x20000 - 0xE0000 - 0x10000,
+		.size       = 0x400000 - 0x40000 - 0xE0000 - 0x10000,
 		.offset     = MTDPART_OFS_APPEND,
 		.offset     = MTDPART_OFS_APPEND,
 	}, {
 	}, {
 		.name       = "MAC Address",
 		.name       = "MAC Address",
@@ -391,17 +404,17 @@ static struct platform_device stamp_flash_device = {
 static struct mtd_partition bfin_spi_flash_partitions[] = {
 static struct mtd_partition bfin_spi_flash_partitions[] = {
 	{
 	{
 		.name = "bootloader",
 		.name = "bootloader",
-		.size = 0x00020000,
+		.size = 0x00040000,
 		.offset = 0,
 		.offset = 0,
 		.mask_flags = MTD_CAP_ROM
 		.mask_flags = MTD_CAP_ROM
 	}, {
 	}, {
 		.name = "kernel",
 		.name = "kernel",
 		.size = 0xe0000,
 		.size = 0xe0000,
-		.offset = 0x20000
+		.offset = MTDPART_OFS_APPEND,
 	}, {
 	}, {
 		.name = "file system",
 		.name = "file system",
-		.size = 0x700000,
-		.offset = 0x00100000,
+		.size = MTDPART_SIZ_FULL,
+		.offset = MTDPART_OFS_APPEND,
 	}
 	}
 };
 };
 
 
@@ -459,13 +472,6 @@ static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
 };
 };
 #endif
 #endif
 
 
-#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
-static struct bfin5xx_spi_chip ad5304_chip_info = {
-	.enable_dma = 0,
-	.bits_per_word = 16,
-};
-#endif
-
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
 static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
 	.enable_dma = 0,
 	.enable_dma = 0,
@@ -578,17 +584,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
 		.mode = SPI_MODE_3,
 		.mode = SPI_MODE_3,
 	},
 	},
 #endif
 #endif
-#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
-	{
-		.modalias = "ad5304_spi",
-		.max_speed_hz = 1250000,     /* max spi clock (SCK) speed in HZ */
-		.bus_num = 0,
-		.chip_select = 2,
-		.platform_data = NULL,
-		.controller_data = &ad5304_chip_info,
-		.mode = SPI_MODE_2,
-	},
-#endif
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
 	{
 	{
 		.modalias		= "ad7877",
 		.modalias		= "ad7877",
@@ -821,6 +816,8 @@ static struct platform_device *stamp_devices[] __initdata = {
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 	&bfin_device_gpiokeys,
 	&bfin_device_gpiokeys,
 #endif
 #endif
+
+	&bfin_gpios_device,
 	&stamp_flash_device,
 	&stamp_flash_device,
 };
 };
 
 

+ 20 - 5
arch/blackfin/mach-bf548/boards/ezkit.c

@@ -285,8 +285,8 @@ static struct mtd_partition partition_info[] = {
 	},
 	},
 	{
 	{
 		.name = "File System",
 		.name = "File System",
-		.offset = 4 * SIZE_1M,
-		.size = (256 - 4) * SIZE_1M,
+		.offset = MTDPART_OFS_APPEND,
+		.size = MTDPART_SIZ_FULL,
 	},
 	},
 };
 };
 
 
@@ -333,7 +333,7 @@ static struct platform_device bf54x_sdh_device = {
 static struct mtd_partition ezkit_partitions[] = {
 static struct mtd_partition ezkit_partitions[] = {
 	{
 	{
 		.name       = "Bootloader",
 		.name       = "Bootloader",
-		.size       = 0x20000,
+		.size       = 0x40000,
 		.offset     = 0,
 		.offset     = 0,
 	}, {
 	}, {
 		.name       = "Kernel",
 		.name       = "Kernel",
@@ -381,8 +381,8 @@ static struct mtd_partition bfin_spi_flash_partitions[] = {
 		.mask_flags = MTD_CAP_ROM
 		.mask_flags = MTD_CAP_ROM
 	}, {
 	}, {
 		.name = "linux kernel",
 		.name = "linux kernel",
-		.size = 0x1c0000,
-		.offset = 0x40000
+		.size = MTDPART_SIZ_FULL,
+		.offset = MTDPART_OFS_APPEND,
 	}
 	}
 };
 };
 
 
@@ -594,6 +594,19 @@ static struct platform_device bfin_device_gpiokeys = {
 };
 };
 #endif
 #endif
 
 
+static struct resource bfin_gpios_resources = {
+	.start = 0,
+	.end   = MAX_BLACKFIN_GPIOS - 1,
+	.flags = IORESOURCE_IRQ,
+};
+
+static struct platform_device bfin_gpios_device = {
+	.name = "simple-gpio",
+	.id = -1,
+	.num_resources = 1,
+	.resource = &bfin_gpios_resources,
+};
+
 static struct platform_device *ezkit_devices[] __initdata = {
 static struct platform_device *ezkit_devices[] __initdata = {
 #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
 #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
 	&rtc_device,
 	&rtc_device,
@@ -646,6 +659,8 @@ static struct platform_device *ezkit_devices[] __initdata = {
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 	&bfin_device_gpiokeys,
 	&bfin_device_gpiokeys,
 #endif
 #endif
+
+	&bfin_gpios_device,
 	&ezkit_flash_device,
 	&ezkit_flash_device,
 };
 };
 
 

+ 2 - 0
arch/blackfin/mach-bf548/dma.c

@@ -27,6 +27,8 @@
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
  */
 
 
+#include <linux/module.h>
+
 #include <asm/blackfin.h>
 #include <asm/blackfin.h>
 #include <asm/dma.h>
 #include <asm/dma.h>
 
 

+ 7 - 2
arch/blackfin/mach-bf548/head.S

@@ -28,6 +28,7 @@
  */
  */
 
 
 #include <linux/linkage.h>
 #include <linux/linkage.h>
+#include <linux/init.h>
 #include <asm/blackfin.h>
 #include <asm/blackfin.h>
 #include <asm/trace.h>
 #include <asm/trace.h>
 #if CONFIG_BFIN_KERNEL_CLOCK
 #if CONFIG_BFIN_KERNEL_CLOCK
@@ -44,10 +45,9 @@
 
 
 #define INITIAL_STACK   0xFFB01000
 #define INITIAL_STACK   0xFFB01000
 
 
-.text
+__INIT
 
 
 ENTRY(__start)
 ENTRY(__start)
-ENTRY(__stext)
 	/* R0: argument of command line string, passed from uboot, save it */
 	/* R0: argument of command line string, passed from uboot, save it */
 	R7 = R0;
 	R7 = R0;
 	/* Enable Cycle Counter and Nesting Of Interrupts */
 	/* Enable Cycle Counter and Nesting Of Interrupts */
@@ -213,6 +213,7 @@ ENTRY(__stext)
 
 
 .LWAIT_HERE:
 .LWAIT_HERE:
 	jump .LWAIT_HERE;
 	jump .LWAIT_HERE;
+ENDPROC(__start)
 
 
 ENTRY(_real_start)
 ENTRY(_real_start)
 	[ -- sp ] = reti;
 	[ -- sp ] = reti;
@@ -285,6 +286,9 @@ ENTRY(_real_start)
 	call _start_kernel;
 	call _start_kernel;
 .L_exit:
 .L_exit:
 	jump.s	.L_exit;
 	jump.s	.L_exit;
+ENDPROC(_real_start)
+
+__FINIT
 
 
 .section .l1.text
 .section .l1.text
 #if CONFIG_BFIN_KERNEL_CLOCK
 #if CONFIG_BFIN_KERNEL_CLOCK
@@ -450,6 +454,7 @@ ENTRY(_start_dma_code)
 	SSYNC;
 	SSYNC;
 
 
 	RTS;
 	RTS;
+ENDPROC(_start_dma_code)
 #endif /* CONFIG_BFIN_KERNEL_CLOCK */
 #endif /* CONFIG_BFIN_KERNEL_CLOCK */
 
 
 .data
 .data

+ 15 - 1
arch/blackfin/mach-bf561/boards/ezkit.c

@@ -223,7 +223,7 @@ static struct platform_device bfin_uart_device = {
 static struct mtd_partition ezkit_partitions[] = {
 static struct mtd_partition ezkit_partitions[] = {
 	{
 	{
 		.name       = "Bootloader",
 		.name       = "Bootloader",
-		.size       = 0x20000,
+		.size       = 0x40000,
 		.offset     = 0,
 		.offset     = 0,
 	}, {
 	}, {
 		.name       = "Kernel",
 		.name       = "Kernel",
@@ -389,6 +389,19 @@ static struct platform_device bfin_device_gpiokeys = {
 };
 };
 #endif
 #endif
 
 
+static struct resource bfin_gpios_resources = {
+	.start = 0,
+	.end   = MAX_BLACKFIN_GPIOS - 1,
+	.flags = IORESOURCE_IRQ,
+};
+
+static struct platform_device bfin_gpios_device = {
+	.name = "simple-gpio",
+	.id = -1,
+	.num_resources = 1,
+	.resource = &bfin_gpios_resources,
+};
+
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
 #include <linux/i2c-gpio.h>
 #include <linux/i2c-gpio.h>
 
 
@@ -446,6 +459,7 @@ static struct platform_device *ezkit_devices[] __initdata = {
 	&isp1362_hcd_device,
 	&isp1362_hcd_device,
 #endif
 #endif
 
 
+	&bfin_gpios_device,
 	&ezkit_flash_device,
 	&ezkit_flash_device,
 };
 };
 
 

+ 2 - 135
arch/blackfin/mach-common/dpmc.S

@@ -31,140 +31,6 @@
 #include <asm/blackfin.h>
 #include <asm/blackfin.h>
 #include <asm/mach/irq.h>
 #include <asm/mach/irq.h>
 
 
-.text
-
-ENTRY(_unmask_wdog_wakeup_evt)
-	[--SP] = ( R7:0, P5:0 );
-#if defined(CONFIG_BF561)
-	P0.H = hi(SICA_IWR1);
-	P0.L = lo(SICA_IWR1);
-#elif defined(CONFIG_BF54x) || defined(CONFIG_BF52x)
-	P0.h = HI(SIC_IWR0);
-	P0.l = LO(SIC_IWR0);
-#else
-	P0.h = HI(SIC_IWR);
-	P0.l = LO(SIC_IWR);
-#endif
-	R7 = [P0];
-#if defined(CONFIG_BF561)
-	BITSET(R7, 27);
-#else
-	BITSET(R7,(IRQ_WATCH - IVG7));
-#endif
-	[P0] = R7;
-	SSYNC;
-
-	( R7:0, P5:0 ) = [SP++];
-	RTS;
-
-.LWRITE_TO_STAT:
-	/* When watch dog timer is enabled, a write to STAT will load the
-	 * contents of CNT to STAT
-	 */
-	R7 = 0x0000(z);
-#if defined(CONFIG_BF561)
-	P0.h = HI(WDOGA_STAT);
-	P0.l = LO(WDOGA_STAT);
-#else
-	P0.h = HI(WDOG_STAT);
-	P0.l = LO(WDOG_STAT);
-#endif
-	[P0] = R7;
-	SSYNC;
-	JUMP .LSKIP_WRITE_TO_STAT;
-
-ENTRY(_program_wdog_timer)
-	[--SP] = ( R7:0, P5:0 );
-#if defined(CONFIG_BF561)
-	P0.h = HI(WDOGA_CNT);
-	P0.l = LO(WDOGA_CNT);
-#else
-	P0.h = HI(WDOG_CNT);
-	P0.l = LO(WDOG_CNT);
-#endif
-	[P0] = R0;
-	SSYNC;
-
-#if defined(CONFIG_BF561)
-	P0.h = HI(WDOGA_CTL);
-	P0.l = LO(WDOGA_CTL);
-#else
-	P0.h = HI(WDOG_CTL);
-	P0.l = LO(WDOG_CTL);
-#endif
-	R7 = W[P0](Z);
-	CC = BITTST(R7,1);
-	if !CC JUMP .LWRITE_TO_STAT;
-	CC = BITTST(R7,2);
-	if !CC JUMP .LWRITE_TO_STAT;
-
-.LSKIP_WRITE_TO_STAT:
-#if defined(CONFIG_BF561)
-	P0.h = HI(WDOGA_CTL);
-	P0.l = LO(WDOGA_CTL);
-#else
-	P0.h = HI(WDOG_CTL);
-	P0.l = LO(WDOG_CTL);
-#endif
-	R7 = W[P0](Z);
-	BITCLR(R7,1);   /* Enable GP event */
-	BITSET(R7,2);
-	W[P0] = R7.L;
-	SSYNC;
-	NOP;
-
-	R7 = W[P0](Z);
-	BITCLR(R7,4);   /* Enable the wdog counter */
-	W[P0] = R7.L;
-	SSYNC;
-
-	( R7:0, P5:0 ) = [SP++];
-	RTS;
-
-ENTRY(_clear_wdog_wakeup_evt)
-	[--SP] = ( R7:0, P5:0 );
-
-#if defined(CONFIG_BF561)
-	P0.h = HI(WDOGA_CTL);
-	P0.l = LO(WDOGA_CTL);
-#else
-	P0.h = HI(WDOG_CTL);
-	P0.l = LO(WDOG_CTL);
-#endif
-	R7 = 0x0AD6(Z);
-	W[P0] = R7.L;
-	SSYNC;
-
-	R7 = W[P0](Z);
-	BITSET(R7,15);
-	W[P0] = R7.L;
-	SSYNC;
-
-	R7 = W[P0](Z);
-	BITSET(R7,1);
-	BITSET(R7,2);
-	W[P0] = R7.L;
-	SSYNC;
-
-	( R7:0, P5:0 ) = [SP++];
-	RTS;
-
-ENTRY(_disable_wdog_timer)
-	[--SP] = ( R7:0, P5:0 );
-#if defined(CONFIG_BF561)
-	P0.h = HI(WDOGA_CTL);
-	P0.l = LO(WDOGA_CTL);
-#else
-	P0.h = HI(WDOG_CTL);
-	P0.l = LO(WDOG_CTL);
-#endif
-	R7 = 0xAD6(Z);
-	W[P0] = R7.L;
-	SSYNC;
-	( R7:0, P5:0 ) = [SP++];
-	RTS;
-
-#if !defined(CONFIG_BF561)
 
 
 .section .l1.text
 .section .l1.text
 
 
@@ -459,10 +325,12 @@ ENTRY(_set_sic_iwr)
 	RTS;
 	RTS;
 
 
 ENTRY(_set_rtc_istat)
 ENTRY(_set_rtc_istat)
+#ifndef CONFIG_BF561
 	P0.H = hi(RTC_ISTAT);
 	P0.H = hi(RTC_ISTAT);
 	P0.L = lo(RTC_ISTAT);
 	P0.L = lo(RTC_ISTAT);
 	w[P0] = R0.L;
 	w[P0] = R0.L;
 	SSYNC;
 	SSYNC;
+#endif
 	RTS;
 	RTS;
 
 
 ENTRY(_test_pll_locked)
 ENTRY(_test_pll_locked)
@@ -473,4 +341,3 @@ ENTRY(_test_pll_locked)
 	CC = BITTST(R0,5);
 	CC = BITTST(R0,5);
 	IF !CC JUMP 1b;
 	IF !CC JUMP 1b;
 	RTS;
 	RTS;
-#endif

+ 64 - 110
arch/blackfin/mach-common/ints-priority.c

@@ -74,7 +74,7 @@ unsigned long bfin_sic_iwr[3];	/* Up to 3 SIC_IWRx registers */
 #endif
 #endif
 
 
 struct ivgx {
 struct ivgx {
-	/* irq number for request_irq, available in mach-bf533/irq.h */
+	/* irq number for request_irq, available in mach-bf5xx/irq.h */
 	unsigned int irqno;
 	unsigned int irqno;
 	/* corresponding bit in the SIC_ISR register */
 	/* corresponding bit in the SIC_ISR register */
 	unsigned int isrflag;
 	unsigned int isrflag;
@@ -86,7 +86,6 @@ struct ivg_slice {
 	struct ivgx *istop;
 	struct ivgx *istop;
 } ivg7_13[IVG13 - IVG7 + 1];
 } ivg7_13[IVG13 - IVG7 + 1];
 
 
-static void search_IAR(void);
 
 
 /*
 /*
  * Search SIC_IAR and fill tables with the irqvalues
  * Search SIC_IAR and fill tables with the irqvalues
@@ -120,10 +119,10 @@ static void __init search_IAR(void)
 }
 }
 
 
 /*
 /*
- * This is for BF533 internal IRQs
+ * This is for core internal IRQs
  */
  */
 
 
-static void ack_noop(unsigned int irq)
+static void bfin_ack_noop(unsigned int irq)
 {
 {
 	/* Dummy function.  */
 	/* Dummy function.  */
 }
 }
@@ -156,11 +155,11 @@ static void bfin_internal_mask_irq(unsigned int irq)
 {
 {
 #ifdef CONFIG_BF53x
 #ifdef CONFIG_BF53x
 	bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() &
 	bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() &
-			     ~(1 << (irq - (IRQ_CORETMR + 1))));
+			     ~(1 << SIC_SYSIRQ(irq)));
 #else
 #else
 	unsigned mask_bank, mask_bit;
 	unsigned mask_bank, mask_bit;
-	mask_bank = (irq - (IRQ_CORETMR + 1)) / 32;
-	mask_bit = (irq - (IRQ_CORETMR + 1)) % 32;
+	mask_bank = SIC_SYSIRQ(irq) / 32;
+	mask_bit = SIC_SYSIRQ(irq) % 32;
 	bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) &
 	bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) &
 			     ~(1 << mask_bit));
 			     ~(1 << mask_bit));
 #endif
 #endif
@@ -171,11 +170,11 @@ static void bfin_internal_unmask_irq(unsigned int irq)
 {
 {
 #ifdef CONFIG_BF53x
 #ifdef CONFIG_BF53x
 	bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() |
 	bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() |
-			     (1 << (irq - (IRQ_CORETMR + 1))));
+			     (1 << SIC_SYSIRQ(irq)));
 #else
 #else
 	unsigned mask_bank, mask_bit;
 	unsigned mask_bank, mask_bit;
-	mask_bank = (irq - (IRQ_CORETMR + 1)) / 32;
-	mask_bit = (irq - (IRQ_CORETMR + 1)) % 32;
+	mask_bank = SIC_SYSIRQ(irq) / 32;
+	mask_bit = SIC_SYSIRQ(irq) % 32;
 	bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) |
 	bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) |
 			     (1 << mask_bit));
 			     (1 << mask_bit));
 #endif
 #endif
@@ -187,8 +186,8 @@ int bfin_internal_set_wake(unsigned int irq, unsigned int state)
 {
 {
 	unsigned bank, bit;
 	unsigned bank, bit;
 	unsigned long flags;
 	unsigned long flags;
-	bank = (irq - (IRQ_CORETMR + 1)) / 32;
-	bit = (irq - (IRQ_CORETMR + 1)) % 32;
+	bank = SIC_SYSIRQ(irq) / 32;
+	bit = SIC_SYSIRQ(irq) % 32;
 
 
 	local_irq_save(flags);
 	local_irq_save(flags);
 
 
@@ -204,15 +203,18 @@ int bfin_internal_set_wake(unsigned int irq, unsigned int state)
 #endif
 #endif
 
 
 static struct irq_chip bfin_core_irqchip = {
 static struct irq_chip bfin_core_irqchip = {
-	.ack = ack_noop,
+	.ack = bfin_ack_noop,
 	.mask = bfin_core_mask_irq,
 	.mask = bfin_core_mask_irq,
 	.unmask = bfin_core_unmask_irq,
 	.unmask = bfin_core_unmask_irq,
 };
 };
 
 
 static struct irq_chip bfin_internal_irqchip = {
 static struct irq_chip bfin_internal_irqchip = {
-	.ack = ack_noop,
+	.ack = bfin_ack_noop,
 	.mask = bfin_internal_mask_irq,
 	.mask = bfin_internal_mask_irq,
 	.unmask = bfin_internal_unmask_irq,
 	.unmask = bfin_internal_unmask_irq,
+	.mask_ack = bfin_internal_mask_irq,
+	.disable = bfin_internal_mask_irq,
+	.enable = bfin_internal_unmask_irq,
 #ifdef CONFIG_PM
 #ifdef CONFIG_PM
 	.set_wake = bfin_internal_set_wake,
 	.set_wake = bfin_internal_set_wake,
 #endif
 #endif
@@ -221,38 +223,23 @@ static struct irq_chip bfin_internal_irqchip = {
 #ifdef BF537_GENERIC_ERROR_INT_DEMUX
 #ifdef BF537_GENERIC_ERROR_INT_DEMUX
 static int error_int_mask;
 static int error_int_mask;
 
 
-static void bfin_generic_error_ack_irq(unsigned int irq)
-{
-
-}
-
 static void bfin_generic_error_mask_irq(unsigned int irq)
 static void bfin_generic_error_mask_irq(unsigned int irq)
 {
 {
 	error_int_mask &= ~(1L << (irq - IRQ_PPI_ERROR));
 	error_int_mask &= ~(1L << (irq - IRQ_PPI_ERROR));
 
 
-	if (!error_int_mask) {
-		local_irq_disable();
-		bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() &
-				     ~(1 << (IRQ_GENERIC_ERROR -
-					(IRQ_CORETMR + 1))));
-		SSYNC();
-		local_irq_enable();
-	}
+	if (!error_int_mask)
+		bfin_internal_mask_irq(IRQ_GENERIC_ERROR);
 }
 }
 
 
 static void bfin_generic_error_unmask_irq(unsigned int irq)
 static void bfin_generic_error_unmask_irq(unsigned int irq)
 {
 {
-	local_irq_disable();
-	bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() | 1 <<
-			     (IRQ_GENERIC_ERROR - (IRQ_CORETMR + 1)));
-	SSYNC();
-	local_irq_enable();
-
+	bfin_internal_unmask_irq(IRQ_GENERIC_ERROR);
 	error_int_mask |= 1L << (irq - IRQ_PPI_ERROR);
 	error_int_mask |= 1L << (irq - IRQ_PPI_ERROR);
 }
 }
 
 
 static struct irq_chip bfin_generic_error_irqchip = {
 static struct irq_chip bfin_generic_error_irqchip = {
-	.ack = bfin_generic_error_ack_irq,
+	.ack = bfin_ack_noop,
+	.mask_ack = bfin_generic_error_mask_irq,
 	.mask = bfin_generic_error_mask_irq,
 	.mask = bfin_generic_error_mask_irq,
 	.unmask = bfin_generic_error_unmask_irq,
 	.unmask = bfin_generic_error_unmask_irq,
 };
 };
@@ -608,7 +595,7 @@ static struct pin_int_t *pint[NR_PINT_SYS_IRQS] = {
 	(struct pin_int_t *)PINT3_MASK_SET,
 	(struct pin_int_t *)PINT3_MASK_SET,
 };
 };
 
 
-unsigned short get_irq_base(u8 bank, u8 bmap)
+inline unsigned short get_irq_base(u8 bank, u8 bmap)
 {
 {
 
 
 	u16 irq_base;
 	u16 irq_base;
@@ -969,17 +956,12 @@ int __init init_arch_irq(void)
 #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561)
 #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561)
 	bfin_write_SIC_IMASK0(SIC_UNMASK_ALL);
 	bfin_write_SIC_IMASK0(SIC_UNMASK_ALL);
 	bfin_write_SIC_IMASK1(SIC_UNMASK_ALL);
 	bfin_write_SIC_IMASK1(SIC_UNMASK_ALL);
-	bfin_write_SIC_IWR0(IWR_ENABLE_ALL);
-	bfin_write_SIC_IWR1(IWR_ENABLE_ALL);
 # ifdef CONFIG_BF54x
 # ifdef CONFIG_BF54x
 	bfin_write_SIC_IMASK2(SIC_UNMASK_ALL);
 	bfin_write_SIC_IMASK2(SIC_UNMASK_ALL);
-	bfin_write_SIC_IWR2(IWR_ENABLE_ALL);
 # endif
 # endif
 #else
 #else
 	bfin_write_SIC_IMASK(SIC_UNMASK_ALL);
 	bfin_write_SIC_IMASK(SIC_UNMASK_ALL);
-	bfin_write_SIC_IWR(IWR_ENABLE_ALL);
 #endif
 #endif
-	SSYNC();
 
 
 	local_irq_disable();
 	local_irq_disable();
 
 
@@ -1001,90 +983,53 @@ int __init init_arch_irq(void)
 			set_irq_chip(irq, &bfin_core_irqchip);
 			set_irq_chip(irq, &bfin_core_irqchip);
 		else
 		else
 			set_irq_chip(irq, &bfin_internal_irqchip);
 			set_irq_chip(irq, &bfin_internal_irqchip);
-#ifdef BF537_GENERIC_ERROR_INT_DEMUX
-		if (irq != IRQ_GENERIC_ERROR) {
-#endif
 
 
-			switch (irq) {
+		switch (irq) {
 #if defined(CONFIG_BF53x)
 #if defined(CONFIG_BF53x)
-			case IRQ_PROG_INTA:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
+		case IRQ_PROG_INTA:
 # if defined(BF537_FAMILY) && !(defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE))
 # if defined(BF537_FAMILY) && !(defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE))
-			case IRQ_MAC_RX:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
+		case IRQ_MAC_RX:
 # endif
 # endif
 #elif defined(CONFIG_BF54x)
 #elif defined(CONFIG_BF54x)
-			case IRQ_PINT0:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
-			case IRQ_PINT1:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
-			case IRQ_PINT2:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
-			case IRQ_PINT3:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
+		case IRQ_PINT0:
+		case IRQ_PINT1:
+		case IRQ_PINT2:
+		case IRQ_PINT3:
 #elif defined(CONFIG_BF52x)
 #elif defined(CONFIG_BF52x)
-			case IRQ_PORTF_INTA:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
-			case IRQ_PORTG_INTA:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
-			case IRQ_PORTH_INTA:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
+		case IRQ_PORTF_INTA:
+		case IRQ_PORTG_INTA:
+		case IRQ_PORTH_INTA:
 #elif defined(CONFIG_BF561)
 #elif defined(CONFIG_BF561)
-			case IRQ_PROG0_INTA:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
-			case IRQ_PROG1_INTA:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
-			case IRQ_PROG2_INTA:
-				set_irq_chained_handler(irq,
-							bfin_demux_gpio_irq);
-				break;
+		case IRQ_PROG0_INTA:
+		case IRQ_PROG1_INTA:
+		case IRQ_PROG2_INTA:
 #endif
 #endif
-			default:
-				set_irq_handler(irq, handle_simple_irq);
-				break;
-			}
-
+			set_irq_chained_handler(irq,
+						bfin_demux_gpio_irq);
+			break;
 #ifdef BF537_GENERIC_ERROR_INT_DEMUX
 #ifdef BF537_GENERIC_ERROR_INT_DEMUX
-		} else {
+		case IRQ_GENERIC_ERROR:
 			set_irq_handler(irq, bfin_demux_error_irq);
 			set_irq_handler(irq, bfin_demux_error_irq);
-		}
+
+			break;
 #endif
 #endif
+		default:
+			set_irq_handler(irq, handle_simple_irq);
+			break;
+		}
 	}
 	}
+
 #ifdef BF537_GENERIC_ERROR_INT_DEMUX
 #ifdef BF537_GENERIC_ERROR_INT_DEMUX
-	for (irq = IRQ_PPI_ERROR; irq <= IRQ_UART1_ERROR; irq++) {
-		set_irq_chip(irq, &bfin_generic_error_irqchip);
-		set_irq_handler(irq, handle_level_irq);
-	}
+	for (irq = IRQ_PPI_ERROR; irq <= IRQ_UART1_ERROR; irq++)
+		set_irq_chip_and_handler(irq, &bfin_generic_error_irqchip,
+					 handle_level_irq);
 #endif
 #endif
 
 
-	for (irq = GPIO_IRQ_BASE; irq < NR_IRQS; irq++) {
+	/* if configured as edge, then will be changed to do_edge_IRQ */
+	for (irq = GPIO_IRQ_BASE; irq < NR_IRQS; irq++)
+		set_irq_chip_and_handler(irq, &bfin_gpio_irqchip,
+					 handle_level_irq);
 
 
-		set_irq_chip(irq, &bfin_gpio_irqchip);
-		/* if configured as edge, then will be changed to do_edge_IRQ */
-		set_irq_handler(irq, handle_level_irq);
-	}
 
 
 	bfin_write_IMASK(0);
 	bfin_write_IMASK(0);
 	CSYNC();
 	CSYNC();
@@ -1106,6 +1051,16 @@ int __init init_arch_irq(void)
 	    IMASK_IVG14 | IMASK_IVG13 | IMASK_IVG12 | IMASK_IVG11 |
 	    IMASK_IVG14 | IMASK_IVG13 | IMASK_IVG12 | IMASK_IVG11 |
 	    IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW;
 	    IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW;
 
 
+#if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561)
+	bfin_write_SIC_IWR0(IWR_ENABLE_ALL);
+	bfin_write_SIC_IWR1(IWR_ENABLE_ALL);
+# ifdef CONFIG_BF54x
+	bfin_write_SIC_IWR2(IWR_ENABLE_ALL);
+# endif
+#else
+	bfin_write_SIC_IWR(IWR_ENABLE_ALL);
+#endif
+
 	return 0;
 	return 0;
 }
 }
 
 
@@ -1122,7 +1077,6 @@ void do_irq(int vec, struct pt_regs *fp)
 #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561)
 #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561)
 		unsigned long sic_status[3];
 		unsigned long sic_status[3];
 
 
-		SSYNC();
 		sic_status[0] = bfin_read_SIC_ISR0() & bfin_read_SIC_IMASK0();
 		sic_status[0] = bfin_read_SIC_ISR0() & bfin_read_SIC_IMASK0();
 		sic_status[1] = bfin_read_SIC_ISR1() & bfin_read_SIC_IMASK1();
 		sic_status[1] = bfin_read_SIC_ISR1() & bfin_read_SIC_IMASK1();
 #ifdef CONFIG_BF54x
 #ifdef CONFIG_BF54x
@@ -1138,7 +1092,7 @@ void do_irq(int vec, struct pt_regs *fp)
 		}
 		}
 #else
 #else
 		unsigned long sic_status;
 		unsigned long sic_status;
-		SSYNC();
+
 		sic_status = bfin_read_SIC_IMASK() & bfin_read_SIC_ISR();
 		sic_status = bfin_read_SIC_IMASK() & bfin_read_SIC_ISR();
 
 
 		for (;; ivg++) {
 		for (;; ivg++) {

+ 2 - 2
arch/blackfin/mm/init.c

@@ -181,7 +181,7 @@ void __init mem_init(void)
 	}
 	}
 }
 }
 
 
-static __init void free_init_pages(const char *what, unsigned long begin, unsigned long end)
+static void __init free_init_pages(const char *what, unsigned long begin, unsigned long end)
 {
 {
 	unsigned long addr;
 	unsigned long addr;
 	/* next to check that the page we free is not a partial page */
 	/* next to check that the page we free is not a partial page */
@@ -203,7 +203,7 @@ void __init free_initrd_mem(unsigned long start, unsigned long end)
 }
 }
 #endif
 #endif
 
 
-void __init free_initmem(void)
+void __init_refok free_initmem(void)
 {
 {
 #if defined CONFIG_RAMKERNEL && !defined CONFIG_MPU
 #if defined CONFIG_RAMKERNEL && !defined CONFIG_MPU
 	free_init_pages("unused kernel memory",
 	free_init_pages("unused kernel memory",

+ 1 - 1
arch/powerpc/oprofile/op_model_cell.c

@@ -1151,7 +1151,7 @@ static void cell_handle_interrupt(struct pt_regs *regs,
 		for (i = 0; i < num_counters; ++i) {
 		for (i = 0; i < num_counters; ++i) {
 			if ((interrupt_mask & CBE_PM_CTR_OVERFLOW_INTR(i))
 			if ((interrupt_mask & CBE_PM_CTR_OVERFLOW_INTR(i))
 			    && ctr[i].enabled) {
 			    && ctr[i].enabled) {
-				oprofile_add_pc(pc, is_kernel, i);
+				oprofile_add_ext_sample(pc, regs, i, is_kernel);
 				cbe_write_ctr(cpu, i, reset_value[i]);
 				cbe_write_ctr(cpu, i, reset_value[i]);
 			}
 			}
 		}
 		}

+ 88 - 63
arch/powerpc/platforms/cell/iommu.c

@@ -113,7 +113,7 @@
 
 
 /* IOMMU sizing */
 /* IOMMU sizing */
 #define IO_SEGMENT_SHIFT	28
 #define IO_SEGMENT_SHIFT	28
-#define IO_PAGENO_BITS		(IO_SEGMENT_SHIFT - IOMMU_PAGE_SHIFT)
+#define IO_PAGENO_BITS(shift)	(IO_SEGMENT_SHIFT - (shift))
 
 
 /* The high bit needs to be set on every DMA address */
 /* The high bit needs to be set on every DMA address */
 #define SPIDER_DMA_OFFSET	0x80000000ul
 #define SPIDER_DMA_OFFSET	0x80000000ul
@@ -123,7 +123,6 @@ struct iommu_window {
 	struct cbe_iommu *iommu;
 	struct cbe_iommu *iommu;
 	unsigned long offset;
 	unsigned long offset;
 	unsigned long size;
 	unsigned long size;
-	unsigned long pte_offset;
 	unsigned int ioid;
 	unsigned int ioid;
 	struct iommu_table table;
 	struct iommu_table table;
 };
 };
@@ -200,7 +199,7 @@ static void tce_build_cell(struct iommu_table *tbl, long index, long npages,
 		(window->ioid & IOPTE_IOID_Mask);
 		(window->ioid & IOPTE_IOID_Mask);
 #endif
 #endif
 
 
-	io_pte = (unsigned long *)tbl->it_base + (index - window->pte_offset);
+	io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset);
 
 
 	for (i = 0; i < npages; i++, uaddr += IOMMU_PAGE_SIZE)
 	for (i = 0; i < npages; i++, uaddr += IOMMU_PAGE_SIZE)
 		io_pte[i] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask);
 		io_pte[i] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask);
@@ -232,7 +231,7 @@ static void tce_free_cell(struct iommu_table *tbl, long index, long npages)
 		| (window->ioid & IOPTE_IOID_Mask);
 		| (window->ioid & IOPTE_IOID_Mask);
 #endif
 #endif
 
 
-	io_pte = (unsigned long *)tbl->it_base + (index - window->pte_offset);
+	io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset);
 
 
 	for (i = 0; i < npages; i++)
 	for (i = 0; i < npages; i++)
 		io_pte[i] = pte;
 		io_pte[i] = pte;
@@ -307,76 +306,84 @@ static int cell_iommu_find_ioc(int nid, unsigned long *base)
 	return -ENODEV;
 	return -ENODEV;
 }
 }
 
 
-static void cell_iommu_setup_page_tables(struct cbe_iommu *iommu,
+static void cell_iommu_setup_stab(struct cbe_iommu *iommu,
 				unsigned long dbase, unsigned long dsize,
 				unsigned long dbase, unsigned long dsize,
 				unsigned long fbase, unsigned long fsize)
 				unsigned long fbase, unsigned long fsize)
 {
 {
 	struct page *page;
 	struct page *page;
-	int i;
-	unsigned long reg, segments, pages_per_segment, ptab_size, stab_size,
-		      n_pte_pages, base;
-
-	base = dbase;
-	if (fsize != 0)
-		base = min(fbase, dbase);
+	unsigned long segments, stab_size;
 
 
 	segments = max(dbase + dsize, fbase + fsize) >> IO_SEGMENT_SHIFT;
 	segments = max(dbase + dsize, fbase + fsize) >> IO_SEGMENT_SHIFT;
-	pages_per_segment = 1ull << IO_PAGENO_BITS;
 
 
-	pr_debug("%s: iommu[%d]: segments: %lu, pages per segment: %lu\n",
-			__FUNCTION__, iommu->nid, segments, pages_per_segment);
+	pr_debug("%s: iommu[%d]: segments: %lu\n",
+			__FUNCTION__, iommu->nid, segments);
 
 
 	/* set up the segment table */
 	/* set up the segment table */
 	stab_size = segments * sizeof(unsigned long);
 	stab_size = segments * sizeof(unsigned long);
 	page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(stab_size));
 	page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(stab_size));
 	BUG_ON(!page);
 	BUG_ON(!page);
 	iommu->stab = page_address(page);
 	iommu->stab = page_address(page);
-	clear_page(iommu->stab);
+	memset(iommu->stab, 0, stab_size);
+}
+
+static unsigned long *cell_iommu_alloc_ptab(struct cbe_iommu *iommu,
+		unsigned long base, unsigned long size, unsigned long gap_base,
+		unsigned long gap_size, unsigned long page_shift)
+{
+	struct page *page;
+	int i;
+	unsigned long reg, segments, pages_per_segment, ptab_size,
+		      n_pte_pages, start_seg, *ptab;
+
+	start_seg = base >> IO_SEGMENT_SHIFT;
+	segments  = size >> IO_SEGMENT_SHIFT;
+	pages_per_segment = 1ull << IO_PAGENO_BITS(page_shift);
+	/* PTEs for each segment must start on a 4K bounday */
+	pages_per_segment = max(pages_per_segment,
+				(1 << 12) / sizeof(unsigned long));
 
 
-	/* ... and the page tables. Since these are contiguous, we can treat
-	 * the page tables as one array of ptes, like pSeries does.
-	 */
 	ptab_size = segments * pages_per_segment * sizeof(unsigned long);
 	ptab_size = segments * pages_per_segment * sizeof(unsigned long);
 	pr_debug("%s: iommu[%d]: ptab_size: %lu, order: %d\n", __FUNCTION__,
 	pr_debug("%s: iommu[%d]: ptab_size: %lu, order: %d\n", __FUNCTION__,
 			iommu->nid, ptab_size, get_order(ptab_size));
 			iommu->nid, ptab_size, get_order(ptab_size));
 	page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(ptab_size));
 	page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(ptab_size));
 	BUG_ON(!page);
 	BUG_ON(!page);
 
 
-	iommu->ptab = page_address(page);
-	memset(iommu->ptab, 0, ptab_size);
+	ptab = page_address(page);
+	memset(ptab, 0, ptab_size);
 
 
-	/* allocate a bogus page for the end of each mapping */
-	page = alloc_pages_node(iommu->nid, GFP_KERNEL, 0);
-	BUG_ON(!page);
-	iommu->pad_page = page_address(page);
-	clear_page(iommu->pad_page);
-
-	/* number of pages needed for a page table */
-	n_pte_pages = (pages_per_segment *
-		       sizeof(unsigned long)) >> IOMMU_PAGE_SHIFT;
+	/* number of 4K pages needed for a page table */
+	n_pte_pages = (pages_per_segment * sizeof(unsigned long)) >> 12;
 
 
 	pr_debug("%s: iommu[%d]: stab at %p, ptab at %p, n_pte_pages: %lu\n",
 	pr_debug("%s: iommu[%d]: stab at %p, ptab at %p, n_pte_pages: %lu\n",
-			__FUNCTION__, iommu->nid, iommu->stab, iommu->ptab,
+			__FUNCTION__, iommu->nid, iommu->stab, ptab,
 			n_pte_pages);
 			n_pte_pages);
 
 
 	/* initialise the STEs */
 	/* initialise the STEs */
 	reg = IOSTE_V | ((n_pte_pages - 1) << 5);
 	reg = IOSTE_V | ((n_pte_pages - 1) << 5);
 
 
-	if (IOMMU_PAGE_SIZE == 0x1000)
-		reg |= IOSTE_PS_4K;
-	else if (IOMMU_PAGE_SIZE == 0x10000)
-		reg |= IOSTE_PS_64K;
-	else {
-		extern void __unknown_page_size_error(void);
-		__unknown_page_size_error();
+	switch (page_shift) {
+	case 12: reg |= IOSTE_PS_4K;  break;
+	case 16: reg |= IOSTE_PS_64K; break;
+	case 20: reg |= IOSTE_PS_1M;  break;
+	case 24: reg |= IOSTE_PS_16M; break;
+	default: BUG();
 	}
 	}
 
 
+	gap_base = gap_base >> IO_SEGMENT_SHIFT;
+	gap_size = gap_size >> IO_SEGMENT_SHIFT;
+
 	pr_debug("Setting up IOMMU stab:\n");
 	pr_debug("Setting up IOMMU stab:\n");
-	for (i = base >> IO_SEGMENT_SHIFT; i < segments; i++) {
-		iommu->stab[i] = reg |
-			(__pa(iommu->ptab) + n_pte_pages * IOMMU_PAGE_SIZE * i);
+	for (i = start_seg; i < (start_seg + segments); i++) {
+		if (i >= gap_base && i < (gap_base + gap_size)) {
+			pr_debug("\toverlap at %d, skipping\n", i);
+			continue;
+		}
+		iommu->stab[i] = reg | (__pa(ptab) + (n_pte_pages << 12) *
+					(i - start_seg));
 		pr_debug("\t[%d] 0x%016lx\n", i, iommu->stab[i]);
 		pr_debug("\t[%d] 0x%016lx\n", i, iommu->stab[i]);
 	}
 	}
+
+	return ptab;
 }
 }
 
 
 static void cell_iommu_enable_hardware(struct cbe_iommu *iommu)
 static void cell_iommu_enable_hardware(struct cbe_iommu *iommu)
@@ -423,7 +430,9 @@ static void cell_iommu_enable_hardware(struct cbe_iommu *iommu)
 static void cell_iommu_setup_hardware(struct cbe_iommu *iommu,
 static void cell_iommu_setup_hardware(struct cbe_iommu *iommu,
 	unsigned long base, unsigned long size)
 	unsigned long base, unsigned long size)
 {
 {
-	cell_iommu_setup_page_tables(iommu, base, size, 0, 0);
+	cell_iommu_setup_stab(iommu, base, size, 0, 0);
+	iommu->ptab = cell_iommu_alloc_ptab(iommu, base, size, 0, 0,
+					    IOMMU_PAGE_SHIFT);
 	cell_iommu_enable_hardware(iommu);
 	cell_iommu_enable_hardware(iommu);
 }
 }
 
 
@@ -464,6 +473,7 @@ cell_iommu_setup_window(struct cbe_iommu *iommu, struct device_node *np,
 			unsigned long pte_offset)
 			unsigned long pte_offset)
 {
 {
 	struct iommu_window *window;
 	struct iommu_window *window;
+	struct page *page;
 	u32 ioid;
 	u32 ioid;
 
 
 	ioid = cell_iommu_get_ioid(np);
 	ioid = cell_iommu_get_ioid(np);
@@ -475,13 +485,11 @@ cell_iommu_setup_window(struct cbe_iommu *iommu, struct device_node *np,
 	window->size = size;
 	window->size = size;
 	window->ioid = ioid;
 	window->ioid = ioid;
 	window->iommu = iommu;
 	window->iommu = iommu;
-	window->pte_offset = pte_offset;
 
 
 	window->table.it_blocksize = 16;
 	window->table.it_blocksize = 16;
 	window->table.it_base = (unsigned long)iommu->ptab;
 	window->table.it_base = (unsigned long)iommu->ptab;
 	window->table.it_index = iommu->nid;
 	window->table.it_index = iommu->nid;
-	window->table.it_offset = (offset >> IOMMU_PAGE_SHIFT) +
-		window->pte_offset;
+	window->table.it_offset = (offset >> IOMMU_PAGE_SHIFT) + pte_offset;
 	window->table.it_size = size >> IOMMU_PAGE_SHIFT;
 	window->table.it_size = size >> IOMMU_PAGE_SHIFT;
 
 
 	iommu_init_table(&window->table, iommu->nid);
 	iommu_init_table(&window->table, iommu->nid);
@@ -504,6 +512,11 @@ cell_iommu_setup_window(struct cbe_iommu *iommu, struct device_node *np,
 	 * This code also assumes that we have a window that starts at 0,
 	 * This code also assumes that we have a window that starts at 0,
 	 * which is the case on all spider based blades.
 	 * which is the case on all spider based blades.
 	 */
 	 */
+	page = alloc_pages_node(iommu->nid, GFP_KERNEL, 0);
+	BUG_ON(!page);
+	iommu->pad_page = page_address(page);
+	clear_page(iommu->pad_page);
+
 	__set_bit(0, window->table.it_map);
 	__set_bit(0, window->table.it_map);
 	tce_build_cell(&window->table, window->table.it_offset, 1,
 	tce_build_cell(&window->table, window->table.it_offset, 1,
 		       (unsigned long)iommu->pad_page, DMA_TO_DEVICE);
 		       (unsigned long)iommu->pad_page, DMA_TO_DEVICE);
@@ -549,7 +562,7 @@ static void cell_dma_dev_setup_iommu(struct device *dev)
 	archdata->dma_data = &window->table;
 	archdata->dma_data = &window->table;
 }
 }
 
 
-static void cell_dma_dev_setup_static(struct device *dev);
+static void cell_dma_dev_setup_fixed(struct device *dev);
 
 
 static void cell_dma_dev_setup(struct device *dev)
 static void cell_dma_dev_setup(struct device *dev)
 {
 {
@@ -557,7 +570,7 @@ static void cell_dma_dev_setup(struct device *dev)
 
 
 	/* Order is important here, these are not mutually exclusive */
 	/* Order is important here, these are not mutually exclusive */
 	if (get_dma_ops(dev) == &dma_iommu_fixed_ops)
 	if (get_dma_ops(dev) == &dma_iommu_fixed_ops)
-		cell_dma_dev_setup_static(dev);
+		cell_dma_dev_setup_fixed(dev);
 	else if (get_pci_dma_ops() == &dma_iommu_ops)
 	else if (get_pci_dma_ops() == &dma_iommu_ops)
 		cell_dma_dev_setup_iommu(dev);
 		cell_dma_dev_setup_iommu(dev);
 	else if (get_pci_dma_ops() == &dma_direct_ops)
 	else if (get_pci_dma_ops() == &dma_direct_ops)
@@ -858,7 +871,7 @@ static int dma_set_mask_and_switch(struct device *dev, u64 dma_mask)
 	return 0;
 	return 0;
 }
 }
 
 
-static void cell_dma_dev_setup_static(struct device *dev)
+static void cell_dma_dev_setup_fixed(struct device *dev)
 {
 {
 	struct dev_archdata *archdata = &dev->archdata;
 	struct dev_archdata *archdata = &dev->archdata;
 	u64 addr;
 	u64 addr;
@@ -869,35 +882,45 @@ static void cell_dma_dev_setup_static(struct device *dev)
 	dev_dbg(dev, "iommu: fixed addr = %lx\n", addr);
 	dev_dbg(dev, "iommu: fixed addr = %lx\n", addr);
 }
 }
 
 
+static void insert_16M_pte(unsigned long addr, unsigned long *ptab,
+			   unsigned long base_pte)
+{
+	unsigned long segment, offset;
+
+	segment = addr >> IO_SEGMENT_SHIFT;
+	offset = (addr >> 24) - (segment << IO_PAGENO_BITS(24));
+	ptab = ptab + (segment * (1 << 12) / sizeof(unsigned long));
+
+	pr_debug("iommu: addr %lx ptab %p segment %lx offset %lx\n",
+		  addr, ptab, segment, offset);
+
+	ptab[offset] = base_pte | (__pa(addr) & IOPTE_RPN_Mask);
+}
+
 static void cell_iommu_setup_fixed_ptab(struct cbe_iommu *iommu,
 static void cell_iommu_setup_fixed_ptab(struct cbe_iommu *iommu,
 	struct device_node *np, unsigned long dbase, unsigned long dsize,
 	struct device_node *np, unsigned long dbase, unsigned long dsize,
 	unsigned long fbase, unsigned long fsize)
 	unsigned long fbase, unsigned long fsize)
 {
 {
-	unsigned long base_pte, uaddr, *io_pte;
-	int i;
+	unsigned long base_pte, uaddr, ioaddr, *ptab;
 
 
-	dma_iommu_fixed_base = fbase;
+	ptab = cell_iommu_alloc_ptab(iommu, fbase, fsize, dbase, dsize, 24);
 
 
-	/* convert from bytes into page table indices */
-	dbase = dbase >> IOMMU_PAGE_SHIFT;
-	dsize = dsize >> IOMMU_PAGE_SHIFT;
-	fbase = fbase >> IOMMU_PAGE_SHIFT;
-	fsize = fsize >> IOMMU_PAGE_SHIFT;
+	dma_iommu_fixed_base = fbase;
 
 
 	pr_debug("iommu: mapping 0x%lx pages from 0x%lx\n", fsize, fbase);
 	pr_debug("iommu: mapping 0x%lx pages from 0x%lx\n", fsize, fbase);
 
 
-	io_pte = iommu->ptab;
 	base_pte = IOPTE_PP_W | IOPTE_PP_R | IOPTE_M | IOPTE_SO_RW
 	base_pte = IOPTE_PP_W | IOPTE_PP_R | IOPTE_M | IOPTE_SO_RW
 		    | (cell_iommu_get_ioid(np) & IOPTE_IOID_Mask);
 		    | (cell_iommu_get_ioid(np) & IOPTE_IOID_Mask);
 
 
-	uaddr = 0;
-	for (i = fbase; i < fbase + fsize; i++, uaddr += IOMMU_PAGE_SIZE) {
+	for (uaddr = 0; uaddr < fsize; uaddr += (1 << 24)) {
 		/* Don't touch the dynamic region */
 		/* Don't touch the dynamic region */
-		if (i >= dbase && i < (dbase + dsize)) {
-			pr_debug("iommu: static/dynamic overlap, skipping\n");
+		ioaddr = uaddr + fbase;
+		if (ioaddr >= dbase && ioaddr < (dbase + dsize)) {
+			pr_debug("iommu: fixed/dynamic overlap, skipping\n");
 			continue;
 			continue;
 		}
 		}
-		io_pte[i] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask);
+
+		insert_16M_pte(uaddr, ptab, base_pte);
 	}
 	}
 
 
 	mb();
 	mb();
@@ -995,7 +1018,9 @@ static int __init cell_iommu_fixed_mapping_init(void)
 			"fixed window 0x%lx-0x%lx\n", iommu->nid, dbase,
 			"fixed window 0x%lx-0x%lx\n", iommu->nid, dbase,
 			 dbase + dsize, fbase, fbase + fsize);
 			 dbase + dsize, fbase, fbase + fsize);
 
 
-		cell_iommu_setup_page_tables(iommu, dbase, dsize, fbase, fsize);
+		cell_iommu_setup_stab(iommu, dbase, dsize, fbase, fsize);
+		iommu->ptab = cell_iommu_alloc_ptab(iommu, dbase, dsize, 0, 0,
+						    IOMMU_PAGE_SHIFT);
 		cell_iommu_setup_fixed_ptab(iommu, np, dbase, dsize,
 		cell_iommu_setup_fixed_ptab(iommu, np, dbase, dsize,
 					     fbase, fsize);
 					     fbase, fsize);
 		cell_iommu_enable_hardware(iommu);
 		cell_iommu_enable_hardware(iommu);

+ 7 - 0
arch/powerpc/platforms/cell/setup.c

@@ -149,6 +149,11 @@ static void __init cell_init_irq(void)
 	mpic_init_IRQ();
 	mpic_init_IRQ();
 }
 }
 
 
+static void __init cell_set_dabrx(void)
+{
+	mtspr(SPRN_DABRX, DABRX_KERNEL | DABRX_USER);
+}
+
 static void __init cell_setup_arch(void)
 static void __init cell_setup_arch(void)
 {
 {
 #ifdef CONFIG_SPU_BASE
 #ifdef CONFIG_SPU_BASE
@@ -158,6 +163,8 @@ static void __init cell_setup_arch(void)
 
 
 	cbe_regs_init();
 	cbe_regs_init();
 
 
+	cell_set_dabrx();
+
 #ifdef CONFIG_CBE_RAS
 #ifdef CONFIG_CBE_RAS
 	cbe_ras_init();
 	cbe_ras_init();
 #endif
 #endif

+ 0 - 3
arch/powerpc/platforms/celleb/beat.h

@@ -21,9 +21,6 @@
 #ifndef _CELLEB_BEAT_H
 #ifndef _CELLEB_BEAT_H
 #define _CELLEB_BEAT_H
 #define _CELLEB_BEAT_H
 
 
-#define DABRX_KERNEL		(1UL<<1)
-#define DABRX_USER		(1UL<<0)
-
 int64_t beat_get_term_char(uint64_t,uint64_t*,uint64_t*,uint64_t*);
 int64_t beat_get_term_char(uint64_t,uint64_t*,uint64_t*,uint64_t*);
 int64_t beat_put_term_char(uint64_t,uint64_t,uint64_t,uint64_t);
 int64_t beat_put_term_char(uint64_t,uint64_t,uint64_t,uint64_t);
 int64_t beat_repository_encode(int, const char *, uint64_t[4]);
 int64_t beat_repository_encode(int, const char *, uint64_t[4]);

+ 1 - 0
arch/sh/Kconfig

@@ -330,6 +330,7 @@ config CPU_SUBTYPE_SH5_101
 
 
 config CPU_SUBTYPE_SH5_103
 config CPU_SUBTYPE_SH5_103
 	bool "Support SH5-103 processor"
 	bool "Support SH5-103 processor"
+	select CPU_SH5
 
 
 endchoice
 endchoice
 
 

+ 1 - 1
arch/sh/drivers/dma/dma-sh.c

@@ -90,7 +90,7 @@ static irqreturn_t dma_tei(int irq, void *dev_id)
 
 
 static int sh_dmac_request_dma(struct dma_channel *chan)
 static int sh_dmac_request_dma(struct dma_channel *chan)
 {
 {
-	if (unlikely(!chan->flags & DMA_TEI_CAPABLE))
+	if (unlikely(!(chan->flags & DMA_TEI_CAPABLE)))
 		return 0;
 		return 0;
 
 
 	return request_irq(get_dmte_irq(chan->chan), dma_tei,
 	return request_irq(get_dmte_irq(chan->chan), dma_tei,

+ 1 - 1
arch/sh/drivers/heartbeat.c

@@ -93,7 +93,7 @@ static int heartbeat_drv_probe(struct platform_device *pdev)
 	}
 	}
 
 
 	hd->base = ioremap_nocache(res->start, res->end - res->start + 1);
 	hd->base = ioremap_nocache(res->start, res->end - res->start + 1);
-	if (!unlikely(hd->base)) {
+	if (unlikely(!hd->base)) {
 		dev_err(&pdev->dev, "ioremap failed\n");
 		dev_err(&pdev->dev, "ioremap failed\n");
 
 
 		if (!pdev->dev.platform_data)
 		if (!pdev->dev.platform_data)

+ 22 - 22
arch/sh/drivers/pci/ops-dreamcast.c

@@ -83,9 +83,9 @@ static int gapspci_read(struct pci_bus *bus, unsigned int devfn, int where, int
 		return PCIBIOS_DEVICE_NOT_FOUND;
 		return PCIBIOS_DEVICE_NOT_FOUND;
 
 
 	switch (size) {
 	switch (size) {
-		case 1: *val = ctrl_inb(GAPSPCI_BBA_CONFIG+where); break;
-		case 2: *val = ctrl_inw(GAPSPCI_BBA_CONFIG+where); break;
-		case 4: *val = ctrl_inl(GAPSPCI_BBA_CONFIG+where); break;
+		case 1: *val = inb(GAPSPCI_BBA_CONFIG+where); break;
+		case 2: *val = inw(GAPSPCI_BBA_CONFIG+where); break;
+		case 4: *val = inl(GAPSPCI_BBA_CONFIG+where); break;
 	}	
 	}	
 
 
         return PCIBIOS_SUCCESSFUL;
         return PCIBIOS_SUCCESSFUL;
@@ -97,9 +97,9 @@ static int gapspci_write(struct pci_bus *bus, unsigned int devfn, int where, int
 		return PCIBIOS_DEVICE_NOT_FOUND;
 		return PCIBIOS_DEVICE_NOT_FOUND;
 
 
 	switch (size) {
 	switch (size) {
-		case 1: ctrl_outb(( u8)val, GAPSPCI_BBA_CONFIG+where); break;
-		case 2: ctrl_outw((u16)val, GAPSPCI_BBA_CONFIG+where); break;
-		case 4: ctrl_outl((u32)val, GAPSPCI_BBA_CONFIG+where); break;
+		case 1: outb(( u8)val, GAPSPCI_BBA_CONFIG+where); break;
+		case 2: outw((u16)val, GAPSPCI_BBA_CONFIG+where); break;
+		case 4: outl((u32)val, GAPSPCI_BBA_CONFIG+where); break;
 	}
 	}
 
 
         return PCIBIOS_SUCCESSFUL;
         return PCIBIOS_SUCCESSFUL;
@@ -127,36 +127,36 @@ int __init gapspci_init(void)
 	 */
 	 */
 
 
 	for (i=0; i<16; i++)
 	for (i=0; i<16; i++)
-		idbuf[i] = ctrl_inb(GAPSPCI_REGS+i);
+		idbuf[i] = inb(GAPSPCI_REGS+i);
 
 
 	if (strncmp(idbuf, "GAPSPCI_BRIDGE_2", 16))
 	if (strncmp(idbuf, "GAPSPCI_BRIDGE_2", 16))
 		return -ENODEV;
 		return -ENODEV;
 
 
-	ctrl_outl(0x5a14a501, GAPSPCI_REGS+0x18);
+	outl(0x5a14a501, GAPSPCI_REGS+0x18);
 
 
 	for (i=0; i<1000000; i++)
 	for (i=0; i<1000000; i++)
 		;
 		;
 
 
-	if (ctrl_inl(GAPSPCI_REGS+0x18) != 1)
+	if (inl(GAPSPCI_REGS+0x18) != 1)
 		return -EINVAL;
 		return -EINVAL;
 
 
-	ctrl_outl(0x01000000, GAPSPCI_REGS+0x20);
-	ctrl_outl(0x01000000, GAPSPCI_REGS+0x24);
+	outl(0x01000000, GAPSPCI_REGS+0x20);
+	outl(0x01000000, GAPSPCI_REGS+0x24);
 
 
-	ctrl_outl(GAPSPCI_DMA_BASE, GAPSPCI_REGS+0x28);
-	ctrl_outl(GAPSPCI_DMA_BASE+GAPSPCI_DMA_SIZE, GAPSPCI_REGS+0x2c);
+	outl(GAPSPCI_DMA_BASE, GAPSPCI_REGS+0x28);
+	outl(GAPSPCI_DMA_BASE+GAPSPCI_DMA_SIZE, GAPSPCI_REGS+0x2c);
 
 
-	ctrl_outl(1, GAPSPCI_REGS+0x14);
-	ctrl_outl(1, GAPSPCI_REGS+0x34);
+	outl(1, GAPSPCI_REGS+0x14);
+	outl(1, GAPSPCI_REGS+0x34);
 
 
 	/* Setting Broadband Adapter */
 	/* Setting Broadband Adapter */
-	ctrl_outw(0xf900, GAPSPCI_BBA_CONFIG+0x06);
-	ctrl_outl(0x00000000, GAPSPCI_BBA_CONFIG+0x30);
-	ctrl_outb(0x00, GAPSPCI_BBA_CONFIG+0x3c);
-	ctrl_outb(0xf0, GAPSPCI_BBA_CONFIG+0x0d);
-	ctrl_outw(0x0006, GAPSPCI_BBA_CONFIG+0x04);
-	ctrl_outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10);
-	ctrl_outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14);
+	outw(0xf900, GAPSPCI_BBA_CONFIG+0x06);
+	outl(0x00000000, GAPSPCI_BBA_CONFIG+0x30);
+	outb(0x00, GAPSPCI_BBA_CONFIG+0x3c);
+	outb(0xf0, GAPSPCI_BBA_CONFIG+0x0d);
+	outw(0x0006, GAPSPCI_BBA_CONFIG+0x04);
+	outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10);
+	outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14);
 
 
 	return 0;
 	return 0;
 }
 }

+ 1 - 1
arch/sh/kernel/cpu/sh2/setup-sh7619.c

@@ -10,7 +10,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 enum {
 enum {
 	UNUSED = 0,
 	UNUSED = 0,

+ 2 - 2
arch/sh/kernel/cpu/sh2a/clock-sh7203.c

@@ -21,8 +21,8 @@
 #include <asm/freq.h>
 #include <asm/freq.h>
 #include <asm/io.h>
 #include <asm/io.h>
 
 
-const static int pll1rate[]={8,12,16,0};
-const static int pfc_divisors[]={1,2,3,4,6,8,12};
+static const int pll1rate[]={8,12,16,0};
+static const int pfc_divisors[]={1,2,3,4,6,8,12};
 #define ifc_divisors pfc_divisors
 #define ifc_divisors pfc_divisors
 
 
 #if (CONFIG_SH_CLK_MD == 0)
 #if (CONFIG_SH_CLK_MD == 0)

+ 1 - 1
arch/sh/kernel/cpu/sh2a/setup-sh7203.c

@@ -10,7 +10,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 enum {
 enum {
 	UNUSED = 0,
 	UNUSED = 0,

+ 1 - 1
arch/sh/kernel/cpu/sh2a/setup-sh7206.c

@@ -10,7 +10,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 enum {
 enum {
 	UNUSED = 0,
 	UNUSED = 0,

+ 2 - 2
arch/sh/kernel/cpu/sh3/probe.c

@@ -94,9 +94,9 @@ int __uses_jump_to_uncached detect_cpu_and_cache_system(void)
 		boot_cpu_data.dcache.way_incr	= (1 << 13);
 		boot_cpu_data.dcache.way_incr	= (1 << 13);
 		boot_cpu_data.dcache.entry_mask	= 0x1ff0;
 		boot_cpu_data.dcache.entry_mask	= 0x1ff0;
 		boot_cpu_data.dcache.sets	= 512;
 		boot_cpu_data.dcache.sets	= 512;
-		ctrl_outl(CCR_CACHE_32KB, CCR3);
+		ctrl_outl(CCR_CACHE_32KB, CCR3_REG);
 #else
 #else
-		ctrl_outl(CCR_CACHE_16KB, CCR3);
+		ctrl_outl(CCR_CACHE_16KB, CCR3_REG);
 #endif
 #endif
 #endif
 #endif
 	}
 	}

+ 1 - 1
arch/sh/kernel/cpu/sh3/setup-sh7705.c

@@ -12,7 +12,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/irq.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 #include <asm/rtc.h>
 #include <asm/rtc.h>
 
 
 enum {
 enum {

+ 4 - 4
arch/sh/kernel/cpu/sh3/setup-sh770x.c

@@ -16,7 +16,7 @@
 #include <linux/irq.h>
 #include <linux/irq.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 enum {
 enum {
 	UNUSED = 0,
 	UNUSED = 0,
@@ -123,15 +123,15 @@ static struct resource rtc_resources[] = {
 		.flags  = IORESOURCE_IO,
 		.flags  = IORESOURCE_IO,
 	},
 	},
 	[1] =	{
 	[1] =	{
-		.start  = 20,
+		.start  = 21,
 		.flags	= IORESOURCE_IRQ,
 		.flags	= IORESOURCE_IRQ,
 	},
 	},
 	[2] =	{
 	[2] =	{
-		.start	= 21,
+		.start	= 22,
 		.flags	= IORESOURCE_IRQ,
 		.flags	= IORESOURCE_IRQ,
 	},
 	},
 	[3] =	{
 	[3] =	{
-		.start	= 22,
+		.start	= 20,
 		.flags  = IORESOURCE_IRQ,
 		.flags  = IORESOURCE_IRQ,
 	},
 	},
 };
 };

+ 1 - 1
arch/sh/kernel/cpu/sh3/setup-sh7710.c

@@ -12,7 +12,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/irq.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 #include <asm/rtc.h>
 #include <asm/rtc.h>
 
 
 enum {
 enum {

+ 1 - 1
arch/sh/kernel/cpu/sh3/setup-sh7720.c

@@ -16,7 +16,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
 #include <linux/io.h>
 #include <linux/io.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 #include <asm/rtc.h>
 #include <asm/rtc.h>
 
 
 #define INTC_ICR1	0xA4140010UL
 #define INTC_ICR1	0xA4140010UL

+ 1 - 1
arch/sh/kernel/cpu/sh4/setup-sh4-202.c

@@ -10,7 +10,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 static struct plat_sci_port sci_platform_data[] = {
 static struct plat_sci_port sci_platform_data[] = {
 	{
 	{

+ 1 - 1
arch/sh/kernel/cpu/sh4/setup-sh7750.c

@@ -12,7 +12,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
 #include <linux/io.h>
 #include <linux/io.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 static struct resource rtc_resources[] = {
 static struct resource rtc_resources[] = {
 	[0] = {
 	[0] = {

+ 1 - 1
arch/sh/kernel/cpu/sh4/setup-sh7760.c

@@ -10,7 +10,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 enum {
 enum {
 	UNUSED = 0,
 	UNUSED = 0,

+ 1 - 1
arch/sh/kernel/cpu/sh4a/setup-sh7343.c

@@ -10,7 +10,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 static struct plat_sci_port sci_platform_data[] = {
 static struct plat_sci_port sci_platform_data[] = {
 	{
 	{

+ 1 - 1
arch/sh/kernel/cpu/sh4a/setup-sh7366.c

@@ -12,7 +12,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 static struct plat_sci_port sci_platform_data[] = {
 static struct plat_sci_port sci_platform_data[] = {
 	{
 	{

+ 1 - 1
arch/sh/kernel/cpu/sh4a/setup-sh7722.c

@@ -10,9 +10,9 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
+#include <linux/serial_sci.h>
 #include <linux/mm.h>
 #include <linux/mm.h>
 #include <asm/mmzone.h>
 #include <asm/mmzone.h>
-#include <asm/sci.h>
 
 
 static struct resource usbf_resources[] = {
 static struct resource usbf_resources[] = {
 	[0] = {
 	[0] = {

+ 1 - 1
arch/sh/kernel/cpu/sh4a/setup-sh7763.c

@@ -12,7 +12,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
 #include <linux/io.h>
 #include <linux/io.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 static struct resource rtc_resources[] = {
 static struct resource rtc_resources[] = {
 	[0] = {
 	[0] = {

+ 1 - 1
arch/sh/kernel/cpu/sh4a/setup-sh7770.c

@@ -10,7 +10,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 static struct plat_sci_port sci_platform_data[] = {
 static struct plat_sci_port sci_platform_data[] = {
 	{
 	{

+ 1 - 1
arch/sh/kernel/cpu/sh4a/setup-sh7780.c

@@ -11,7 +11,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
 #include <linux/io.h>
 #include <linux/io.h>
-#include <asm/sci.h>
+#include <linux/serial_sci.h>
 
 
 static struct resource rtc_resources[] = {
 static struct resource rtc_resources[] = {
 	[0] = {
 	[0] = {

+ 1 - 1
arch/sh/kernel/cpu/sh4a/setup-sh7785.c

@@ -10,10 +10,10 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
+#include <linux/serial_sci.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/mm.h>
 #include <linux/mm.h>
 #include <asm/mmzone.h>
 #include <asm/mmzone.h>
-#include <asm/sci.h>
 
 
 static struct plat_sci_port sci_platform_data[] = {
 static struct plat_sci_port sci_platform_data[] = {
 	{
 	{

+ 1 - 1
arch/sh/kernel/cpu/sh4a/setup-shx3.c

@@ -10,9 +10,9 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/serial.h>
 #include <linux/serial.h>
+#include <linux/serial_sci.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <asm/mmzone.h>
 #include <asm/mmzone.h>
-#include <asm/sci.h>
 
 
 static struct plat_sci_port sci_platform_data[] = {
 static struct plat_sci_port sci_platform_data[] = {
 	{
 	{

+ 3 - 0
arch/sparc/kernel/led.c

@@ -3,6 +3,9 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/proc_fs.h>
 #include <linux/proc_fs.h>
 #include <linux/string.h>
 #include <linux/string.h>
+#include <linux/jiffies.h>
+#include <linux/timer.h>
+#include <linux/uaccess.h>
 
 
 #include <asm/auxio.h>
 #include <asm/auxio.h>
 
 

+ 7 - 7
arch/sparc64/kernel/ds.c

@@ -525,10 +525,10 @@ static void dr_cpu_mark(struct ds_data *resp, int cpu, int ncpus,
 	}
 	}
 }
 }
 
 
-static int dr_cpu_configure(struct ds_info *dp,
-			    struct ds_cap_state *cp,
-			    u64 req_num,
-			    cpumask_t *mask)
+static int __cpuinit dr_cpu_configure(struct ds_info *dp,
+				      struct ds_cap_state *cp,
+				      u64 req_num,
+				      cpumask_t *mask)
 {
 {
 	struct ds_data *resp;
 	struct ds_data *resp;
 	int resp_len, ncpus, cpu;
 	int resp_len, ncpus, cpu;
@@ -623,9 +623,9 @@ static int dr_cpu_unconfigure(struct ds_info *dp,
 	return 0;
 	return 0;
 }
 }
 
 
-static void dr_cpu_data(struct ds_info *dp,
-			struct ds_cap_state *cp,
-			void *buf, int len)
+static void __cpuinit dr_cpu_data(struct ds_info *dp,
+				  struct ds_cap_state *cp,
+				  void *buf, int len)
 {
 {
 	struct ds_data *data = buf;
 	struct ds_data *data = buf;
 	struct dr_cpu_tag *tag = (struct dr_cpu_tag *) (data + 1);
 	struct dr_cpu_tag *tag = (struct dr_cpu_tag *) (data + 1);

+ 3 - 1
arch/sparc64/kernel/hvtramp.S

@@ -3,6 +3,8 @@
  * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
  * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
  */
  */
 
 
+#include <linux/init.h>
+
 #include <asm/thread_info.h>
 #include <asm/thread_info.h>
 #include <asm/hypervisor.h>
 #include <asm/hypervisor.h>
 #include <asm/scratchpad.h>
 #include <asm/scratchpad.h>
@@ -13,7 +15,7 @@
 #include <asm/head.h>
 #include <asm/head.h>
 #include <asm/asi.h>
 #include <asm/asi.h>
 
 
-	.text
+	__CPUINIT
 	.align		8
 	.align		8
 	.globl		hv_cpu_startup, hv_cpu_startup_end
 	.globl		hv_cpu_startup, hv_cpu_startup_end
 
 

+ 2 - 1
arch/sparc64/kernel/iommu.c

@@ -134,7 +134,8 @@ unsigned long iommu_range_alloc(struct device *dev,
 	else
 	else
 		boundary_size = ALIGN(1UL << 32, 1 << IO_PAGE_SHIFT);
 		boundary_size = ALIGN(1UL << 32, 1 << IO_PAGE_SHIFT);
 
 
-	n = iommu_area_alloc(arena->map, limit, start, npages, 0,
+	n = iommu_area_alloc(arena->map, limit, start, npages,
+			     iommu->page_table_map_base >> IO_PAGE_SHIFT,
 			     boundary_size >> IO_PAGE_SHIFT, 0);
 			     boundary_size >> IO_PAGE_SHIFT, 0);
 	if (n == -1) {
 	if (n == -1) {
 		if (likely(pass < 1)) {
 		if (likely(pass < 1)) {

+ 0 - 2
arch/sparc64/kernel/kprobes.c

@@ -465,8 +465,6 @@ void __kprobes jprobe_return(void)
 
 
 extern void jprobe_return_trap_instruction(void);
 extern void jprobe_return_trap_instruction(void);
 
 
-extern void __show_regs(struct pt_regs * regs);
-
 int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
 int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
 {
 {
 	u32 *addr = (u32 *) regs->tpc;
 	u32 *addr = (u32 *) regs->tpc;

+ 1 - 1
arch/sparc64/kernel/mdesc.c

@@ -758,7 +758,7 @@ static void __devinit get_mondo_data(struct mdesc_handle *hp, u64 mp,
 	get_one_mondo_bits(val, &tb->nonresum_qmask, 2);
 	get_one_mondo_bits(val, &tb->nonresum_qmask, 2);
 }
 }
 
 
-void __devinit mdesc_fill_in_cpu_data(cpumask_t mask)
+void __cpuinit mdesc_fill_in_cpu_data(cpumask_t mask)
 {
 {
 	struct mdesc_handle *hp = mdesc_grab();
 	struct mdesc_handle *hp = mdesc_grab();
 	u64 mp;
 	u64 mp;

+ 1 - 2
arch/sparc64/kernel/power.c

@@ -20,6 +20,7 @@
 #include <asm/of_device.h>
 #include <asm/of_device.h>
 #include <asm/io.h>
 #include <asm/io.h>
 #include <asm/sstate.h>
 #include <asm/sstate.h>
+#include <asm/reboot.h>
 
 
 #include <linux/unistd.h>
 #include <linux/unistd.h>
 
 
@@ -39,8 +40,6 @@ static irqreturn_t power_handler(int irq, void *dev_id)
 	return IRQ_HANDLED;
 	return IRQ_HANDLED;
 }
 }
 
 
-extern void machine_halt(void);
-extern void machine_alt_power_off(void);
 static void (*poweroff_method)(void) = machine_alt_power_off;
 static void (*poweroff_method)(void) = machine_alt_power_off;
 
 
 void machine_power_off(void)
 void machine_power_off(void)

+ 3 - 74
arch/sparc64/kernel/process.c

@@ -30,6 +30,7 @@
 #include <linux/tick.h>
 #include <linux/tick.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/cpu.h>
 #include <linux/cpu.h>
+#include <linux/elfcore.h>
 
 
 #include <asm/oplib.h>
 #include <asm/oplib.h>
 #include <asm/uaccess.h>
 #include <asm/uaccess.h>
@@ -47,6 +48,8 @@
 #include <asm/unistd.h>
 #include <asm/unistd.h>
 #include <asm/hypervisor.h>
 #include <asm/hypervisor.h>
 #include <asm/sstate.h>
 #include <asm/sstate.h>
+#include <asm/reboot.h>
+#include <asm/syscalls.h>
 
 
 /* #define VERBOSE_SHOWREGS */
 /* #define VERBOSE_SHOWREGS */
 
 
@@ -211,62 +214,6 @@ static void show_regwindow(struct pt_regs *regs)
 		print_symbol("I7: <%s>\n", rwk->ins[7]);
 		print_symbol("I7: <%s>\n", rwk->ins[7]);
 }
 }
 
 
-void show_stackframe(struct sparc_stackf *sf)
-{
-	unsigned long size;
-	unsigned long *stk;
-	int i;
-
-	printk("l0: %016lx l1: %016lx l2: %016lx l3: %016lx\n"
-	       "l4: %016lx l5: %016lx l6: %016lx l7: %016lx\n",
-	       sf->locals[0], sf->locals[1], sf->locals[2], sf->locals[3],
-	       sf->locals[4], sf->locals[5], sf->locals[6], sf->locals[7]);
-	printk("i0: %016lx i1: %016lx i2: %016lx i3: %016lx\n"
-	       "i4: %016lx i5: %016lx fp: %016lx ret_pc: %016lx\n",
-	       sf->ins[0], sf->ins[1], sf->ins[2], sf->ins[3],
-	       sf->ins[4], sf->ins[5], (unsigned long)sf->fp, sf->callers_pc);
-	printk("sp: %016lx x0: %016lx x1: %016lx x2: %016lx\n"
-	       "x3: %016lx x4: %016lx x5: %016lx xx: %016lx\n",
-	       (unsigned long)sf->structptr, sf->xargs[0], sf->xargs[1],
-	       sf->xargs[2], sf->xargs[3], sf->xargs[4], sf->xargs[5],
-	       sf->xxargs[0]);
-	size = ((unsigned long)sf->fp) - ((unsigned long)sf);
-	size -= STACKFRAME_SZ;
-	stk = (unsigned long *)((unsigned long)sf + STACKFRAME_SZ);
-	i = 0;
-	do {
-		printk("s%d: %016lx\n", i++, *stk++);
-	} while ((size -= sizeof(unsigned long)));
-}
-
-void show_stackframe32(struct sparc_stackf32 *sf)
-{
-	unsigned long size;
-	unsigned *stk;
-	int i;
-
-	printk("l0: %08x l1: %08x l2: %08x l3: %08x\n",
-	       sf->locals[0], sf->locals[1], sf->locals[2], sf->locals[3]);
-	printk("l4: %08x l5: %08x l6: %08x l7: %08x\n",
-	       sf->locals[4], sf->locals[5], sf->locals[6], sf->locals[7]);
-	printk("i0: %08x i1: %08x i2: %08x i3: %08x\n",
-	       sf->ins[0], sf->ins[1], sf->ins[2], sf->ins[3]);
-	printk("i4: %08x i5: %08x fp: %08x ret_pc: %08x\n",
-	       sf->ins[4], sf->ins[5], sf->fp, sf->callers_pc);
-	printk("sp: %08x x0: %08x x1: %08x x2: %08x\n"
-	       "x3: %08x x4: %08x x5: %08x xx: %08x\n",
-	       sf->structptr, sf->xargs[0], sf->xargs[1],
-	       sf->xargs[2], sf->xargs[3], sf->xargs[4], sf->xargs[5],
-	       sf->xxargs[0]);
-	size = ((unsigned long)sf->fp) - ((unsigned long)sf);
-	size -= STACKFRAME32_SZ;
-	stk = (unsigned *)((unsigned long)sf + STACKFRAME32_SZ);
-	i = 0;
-	do {
-		printk("s%d: %08x\n", i++, *stk++);
-	} while ((size -= sizeof(unsigned)));
-}
-
 #ifdef CONFIG_SMP
 #ifdef CONFIG_SMP
 static DEFINE_SPINLOCK(regdump_lock);
 static DEFINE_SPINLOCK(regdump_lock);
 #endif
 #endif
@@ -354,24 +301,6 @@ void show_regs(struct pt_regs *regs)
 #endif
 #endif
 }
 }
 
 
-void show_regs32(struct pt_regs32 *regs)
-{
-	printk("PSR: %08x PC: %08x NPC: %08x Y: %08x    %s\n", regs->psr,
-	       regs->pc, regs->npc, regs->y, print_tainted());
-	printk("g0: %08x g1: %08x g2: %08x g3: %08x ",
-	       regs->u_regs[0], regs->u_regs[1], regs->u_regs[2],
-	       regs->u_regs[3]);
-	printk("g4: %08x g5: %08x g6: %08x g7: %08x\n",
-	       regs->u_regs[4], regs->u_regs[5], regs->u_regs[6],
-	       regs->u_regs[7]);
-	printk("o0: %08x o1: %08x o2: %08x o3: %08x ",
-	       regs->u_regs[8], regs->u_regs[9], regs->u_regs[10],
-	       regs->u_regs[11]);
-	printk("o4: %08x o5: %08x sp: %08x ret_pc: %08x\n",
-	       regs->u_regs[12], regs->u_regs[13], regs->u_regs[14],
-	       regs->u_regs[15]);
-}
-
 unsigned long thread_saved_pc(struct task_struct *tsk)
 unsigned long thread_saved_pc(struct task_struct *tsk)
 {
 {
 	struct thread_info *ti = task_thread_info(tsk);
 	struct thread_info *ti = task_thread_info(tsk);

+ 1 - 1
arch/sparc64/kernel/smp.c

@@ -86,7 +86,7 @@ extern void setup_sparc64_timer(void);
 
 
 static volatile unsigned long callin_flag = 0;
 static volatile unsigned long callin_flag = 0;
 
 
-void __devinit smp_callin(void)
+void __cpuinit smp_callin(void)
 {
 {
 	int cpuid = hard_smp_processor_id();
 	int cpuid = hard_smp_processor_id();
 
 

+ 3 - 1
arch/sparc64/kernel/trampoline.S

@@ -4,6 +4,8 @@
  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
  */
  */
 
 
+#include <linux/init.h>
+
 #include <asm/head.h>
 #include <asm/head.h>
 #include <asm/asi.h>
 #include <asm/asi.h>
 #include <asm/lsu.h>
 #include <asm/lsu.h>
@@ -36,7 +38,7 @@ dtlb_load:
 tramp_stack:
 tramp_stack:
 	.skip	TRAMP_STACK_SIZE
 	.skip	TRAMP_STACK_SIZE
 
 
-	.text
+	__CPUINIT
 	.align		8
 	.align		8
 	.globl		sparc64_cpu_startup, sparc64_cpu_startup_end
 	.globl		sparc64_cpu_startup, sparc64_cpu_startup_end
 sparc64_cpu_startup:
 sparc64_cpu_startup:

+ 0 - 2
arch/sparc64/kernel/traps.c

@@ -1791,8 +1791,6 @@ static const char *sun4v_err_type_to_str(u32 type)
 	};
 	};
 }
 }
 
 
-extern void __show_regs(struct pt_regs * regs);
-
 static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, int cpu, const char *pfx, atomic_t *ocnt)
 static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, int cpu, const char *pfx, atomic_t *ocnt)
 {
 {
 	int cnt;
 	int cnt;

+ 3 - 11
arch/sparc64/mm/fault.c

@@ -244,16 +244,8 @@ static void do_kernel_fault(struct pt_regs *regs, int si_code, int fault_code,
 	if (regs->tstate & TSTATE_PRIV) {
 	if (regs->tstate & TSTATE_PRIV) {
 		const struct exception_table_entry *entry;
 		const struct exception_table_entry *entry;
 
 
-		if (asi == ASI_P && (insn & 0xc0800000) == 0xc0800000) {
-			if (insn & 0x2000)
-				asi = (regs->tstate >> 24);
-			else
-				asi = (insn >> 5);
-		}
-	
-		/* Look in asi.h: All _S asis have LS bit set */
-		if ((asi & 0x1) &&
-		    (entry = search_exception_tables(regs->tpc))) {
+		entry = search_exception_tables(regs->tpc);
+		if (entry) {
 			regs->tpc = entry->fixup;
 			regs->tpc = entry->fixup;
 			regs->tnpc = regs->tpc + 4;
 			regs->tnpc = regs->tpc + 4;
 			return;
 			return;
@@ -294,7 +286,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
 		unsigned long tpc = regs->tpc;
 		unsigned long tpc = regs->tpc;
 
 
 		/* Sanity check the PC. */
 		/* Sanity check the PC. */
-		if ((tpc >= KERNBASE && tpc < (unsigned long) _etext) ||
+		if ((tpc >= KERNBASE && tpc < (unsigned long) __init_end) ||
 		    (tpc >= MODULES_VADDR && tpc < MODULES_END)) {
 		    (tpc >= MODULES_VADDR && tpc < MODULES_END)) {
 			/* Valid, no problems... */
 			/* Valid, no problems... */
 		} else {
 		} else {

+ 2 - 1
arch/sparc64/mm/init.c

@@ -1010,7 +1010,8 @@ static struct linux_prom64_registers pall[MAX_BANKS] __initdata;
 static int pall_ents __initdata;
 static int pall_ents __initdata;
 
 
 #ifdef CONFIG_DEBUG_PAGEALLOC
 #ifdef CONFIG_DEBUG_PAGEALLOC
-static unsigned long kernel_map_range(unsigned long pstart, unsigned long pend, pgprot_t prot)
+static unsigned long __ref kernel_map_range(unsigned long pstart,
+					    unsigned long pend, pgprot_t prot)
 {
 {
 	unsigned long vstart = PAGE_OFFSET + pstart;
 	unsigned long vstart = PAGE_OFFSET + pstart;
 	unsigned long vend = PAGE_OFFSET + pend;
 	unsigned long vend = PAGE_OFFSET + pend;

+ 0 - 2
arch/um/kernel/process.c

@@ -128,8 +128,6 @@ void *get_current(void)
 	return current;
 	return current;
 }
 }
 
 
-extern void schedule_tail(struct task_struct *prev);
-
 /*
 /*
  * This is called magically, by its address being stuffed in a jmp_buf
  * This is called magically, by its address being stuffed in a jmp_buf
  * and being longjmp-d to.
  * and being longjmp-d to.

+ 14 - 0
arch/x86/Kconfig.cpu

@@ -377,6 +377,19 @@ config X86_OOSTORE
 	def_bool y
 	def_bool y
 	depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR
 	depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR
 
 
+#
+# P6_NOPs are a relatively minor optimization that require a family >=
+# 6 processor, except that it is broken on certain VIA chips.
+# Furthermore, AMD chips prefer a totally different sequence of NOPs
+# (which work on all CPUs).  As a result, disallow these if we're
+# compiling X86_GENERIC but not X86_64 (these NOPs do work on all
+# x86-64 capable chips); the list of processors in the right-hand clause
+# are the cores that benefit from this optimization.
+#
+config X86_P6_NOP
+	def_bool y
+	depends on (X86_64 || !X86_GENERIC) && (M686 || MPENTIUMII || MPENTIUMIII || MPENTIUMM || MCORE2 || PENTIUM4)
+
 config X86_TSC
 config X86_TSC
 	def_bool y
 	def_bool y
 	depends on ((MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2) && !X86_NUMAQ) || X86_64
 	depends on ((MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2) && !X86_NUMAQ) || X86_64
@@ -390,6 +403,7 @@ config X86_CMOV
 config X86_MINIMUM_CPU_FAMILY
 config X86_MINIMUM_CPU_FAMILY
 	int
 	int
 	default "64" if X86_64
 	default "64" if X86_64
+	default "6" if X86_32 && X86_P6_NOP
 	default "4" if X86_32 && (X86_XADD || X86_CMPXCHG || X86_BSWAP || X86_WP_WORKS_OK)
 	default "4" if X86_32 && (X86_XADD || X86_CMPXCHG || X86_BSWAP || X86_WP_WORKS_OK)
 	default "3"
 	default "3"
 
 

+ 6 - 3
arch/x86/boot/memory.c

@@ -37,6 +37,12 @@ static int detect_memory_e820(void)
 		      "=m" (*desc)
 		      "=m" (*desc)
 		    : "D" (desc), "d" (SMAP), "a" (0xe820));
 		    : "D" (desc), "d" (SMAP), "a" (0xe820));
 
 
+		/* BIOSes which terminate the chain with CF = 1 as opposed
+		   to %ebx = 0 don't always report the SMAP signature on
+		   the final, failing, probe. */
+		if (err)
+			break;
+
 		/* Some BIOSes stop returning SMAP in the middle of
 		/* Some BIOSes stop returning SMAP in the middle of
 		   the search loop.  We don't know exactly how the BIOS
 		   the search loop.  We don't know exactly how the BIOS
 		   screwed up the map at that point, we might have a
 		   screwed up the map at that point, we might have a
@@ -47,9 +53,6 @@ static int detect_memory_e820(void)
 			break;
 			break;
 		}
 		}
 
 
-		if (err)
-			break;
-
 		count++;
 		count++;
 		desc++;
 		desc++;
 	} while (next && count < E820MAX);
 	} while (next && count < E820MAX);

+ 1 - 3
arch/x86/kernel/asm-offsets_32.c

@@ -128,13 +128,11 @@ void foo(void)
 	OFFSET(XEN_vcpu_info_pending, vcpu_info, evtchn_upcall_pending);
 	OFFSET(XEN_vcpu_info_pending, vcpu_info, evtchn_upcall_pending);
 #endif
 #endif
 
 
-#ifdef CONFIG_LGUEST_GUEST
+#if defined(CONFIG_LGUEST) || defined(CONFIG_LGUEST_GUEST) || defined(CONFIG_LGUEST_MODULE)
 	BLANK();
 	BLANK();
 	OFFSET(LGUEST_DATA_irq_enabled, lguest_data, irq_enabled);
 	OFFSET(LGUEST_DATA_irq_enabled, lguest_data, irq_enabled);
 	OFFSET(LGUEST_DATA_pgdir, lguest_data, pgdir);
 	OFFSET(LGUEST_DATA_pgdir, lguest_data, pgdir);
-#endif
 
 
-#ifdef CONFIG_LGUEST
 	BLANK();
 	BLANK();
 	OFFSET(LGUEST_PAGES_host_gdt_desc, lguest_pages, state.host_gdt_desc);
 	OFFSET(LGUEST_PAGES_host_gdt_desc, lguest_pages, state.host_gdt_desc);
 	OFFSET(LGUEST_PAGES_host_idt_desc, lguest_pages, state.host_idt_desc);
 	OFFSET(LGUEST_PAGES_host_idt_desc, lguest_pages, state.host_idt_desc);

+ 1 - 1
arch/x86/kernel/cpu/common.c

@@ -504,7 +504,7 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
 
 
 	/* Clear all flags overriden by options */
 	/* Clear all flags overriden by options */
 	for (i = 0; i < NCAPINTS; i++)
 	for (i = 0; i < NCAPINTS; i++)
-		c->x86_capability[i] ^= cleared_cpu_caps[i];
+		c->x86_capability[i] &= ~cleared_cpu_caps[i];
 
 
 	/* Init Machine Check Exception if available. */
 	/* Init Machine Check Exception if available. */
 	mcheck_init(c);
 	mcheck_init(c);

+ 7 - 2
arch/x86/kernel/cpu/mtrr/main.c

@@ -43,6 +43,7 @@
 #include <asm/uaccess.h>
 #include <asm/uaccess.h>
 #include <asm/processor.h>
 #include <asm/processor.h>
 #include <asm/msr.h>
 #include <asm/msr.h>
+#include <asm/kvm_para.h>
 #include "mtrr.h"
 #include "mtrr.h"
 
 
 u32 num_var_ranges = 0;
 u32 num_var_ranges = 0;
@@ -649,6 +650,7 @@ static __init int amd_special_default_mtrr(void)
 
 
 /**
 /**
  * mtrr_trim_uncached_memory - trim RAM not covered by MTRRs
  * mtrr_trim_uncached_memory - trim RAM not covered by MTRRs
+ * @end_pfn: ending page frame number
  *
  *
  * Some buggy BIOSes don't setup the MTRRs properly for systems with certain
  * Some buggy BIOSes don't setup the MTRRs properly for systems with certain
  * memory configurations.  This routine checks that the highest MTRR matches
  * memory configurations.  This routine checks that the highest MTRR matches
@@ -688,8 +690,11 @@ int __init mtrr_trim_uncached_memory(unsigned long end_pfn)
 
 
 	/* kvm/qemu doesn't have mtrr set right, don't trim them all */
 	/* kvm/qemu doesn't have mtrr set right, don't trim them all */
 	if (!highest_pfn) {
 	if (!highest_pfn) {
-		printk(KERN_WARNING "WARNING: strange, CPU MTRRs all blank?\n");
-		WARN_ON(1);
+		if (!kvm_para_available()) {
+			printk(KERN_WARNING
+				"WARNING: strange, CPU MTRRs all blank?\n");
+			WARN_ON(1);
+		}
 		return 0;
 		return 0;
 	}
 	}
 
 

+ 0 - 7
arch/x86/kernel/cpu/transmeta.c

@@ -76,13 +76,6 @@ static void __cpuinit init_transmeta(struct cpuinfo_x86 *c)
 	/* All Transmeta CPUs have a constant TSC */
 	/* All Transmeta CPUs have a constant TSC */
 	set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
 	set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
 	
 	
-	/* If we can run i686 user-space code, call us an i686 */
-#define USER686 ((1 << X86_FEATURE_TSC)|\
-		 (1 << X86_FEATURE_CX8)|\
-		 (1 << X86_FEATURE_CMOV))
-        if (c->x86 == 5 && (c->x86_capability[0] & USER686) == USER686)
-		c->x86 = 6;
-
 #ifdef CONFIG_SYSCTL
 #ifdef CONFIG_SYSCTL
 	/* randomize_va_space slows us down enormously;
 	/* randomize_va_space slows us down enormously;
 	   it probably triggers retranslation of x86->native bytecode */
 	   it probably triggers retranslation of x86->native bytecode */

+ 4 - 2
arch/x86/kernel/entry_64.S

@@ -453,6 +453,7 @@ ENTRY(stub_execve)
 	CFI_REGISTER rip, r11
 	CFI_REGISTER rip, r11
 	SAVE_REST
 	SAVE_REST
 	FIXUP_TOP_OF_STACK %r11
 	FIXUP_TOP_OF_STACK %r11
+	movq %rsp, %rcx
 	call sys_execve
 	call sys_execve
 	RESTORE_TOP_OF_STACK %r11
 	RESTORE_TOP_OF_STACK %r11
 	movq %rax,RAX(%rsp)
 	movq %rax,RAX(%rsp)
@@ -1036,15 +1037,16 @@ ENDPROC(child_rip)
  *	rdi: name, rsi: argv, rdx: envp
  *	rdi: name, rsi: argv, rdx: envp
  *
  *
  * We want to fallback into:
  * We want to fallback into:
- *	extern long sys_execve(char *name, char **argv,char **envp, struct pt_regs regs)
+ *	extern long sys_execve(char *name, char **argv,char **envp, struct pt_regs *regs)
  *
  *
  * do_sys_execve asm fallback arguments:
  * do_sys_execve asm fallback arguments:
- *	rdi: name, rsi: argv, rdx: envp, fake frame on the stack
+ *	rdi: name, rsi: argv, rdx: envp, rcx: fake frame on the stack
  */
  */
 ENTRY(kernel_execve)
 ENTRY(kernel_execve)
 	CFI_STARTPROC
 	CFI_STARTPROC
 	FAKE_STACK_FRAME $0
 	FAKE_STACK_FRAME $0
 	SAVE_ALL	
 	SAVE_ALL	
+	movq %rsp,%rcx
 	call sys_execve
 	call sys_execve
 	movq %rax, RAX(%rsp)	
 	movq %rax, RAX(%rsp)	
 	RESTORE_REST
 	RESTORE_REST

+ 1 - 1
arch/x86/kernel/head_32.S

@@ -606,7 +606,7 @@ ENTRY(_stext)
 .section ".bss.page_aligned","wa"
 .section ".bss.page_aligned","wa"
 	.align PAGE_SIZE_asm
 	.align PAGE_SIZE_asm
 #ifdef CONFIG_X86_PAE
 #ifdef CONFIG_X86_PAE
-ENTRY(swapper_pg_pmd)
+swapper_pg_pmd:
 	.fill 1024*KPMDS,4,0
 	.fill 1024*KPMDS,4,0
 #else
 #else
 ENTRY(swapper_pg_dir)
 ENTRY(swapper_pg_dir)

+ 14 - 8
arch/x86/kernel/head_64.S

@@ -379,18 +379,24 @@ NEXT_PAGE(level2_ident_pgt)
 	/* Since I easily can, map the first 1G.
 	/* Since I easily can, map the first 1G.
 	 * Don't set NX because code runs from these pages.
 	 * Don't set NX because code runs from these pages.
 	 */
 	 */
-	PMDS(0x0000000000000000, __PAGE_KERNEL_LARGE_EXEC, PTRS_PER_PMD)
+	PMDS(0, __PAGE_KERNEL_LARGE_EXEC, PTRS_PER_PMD)
 
 
 NEXT_PAGE(level2_kernel_pgt)
 NEXT_PAGE(level2_kernel_pgt)
-	/* 40MB kernel mapping. The kernel code cannot be bigger than that.
-	   When you change this change KERNEL_TEXT_SIZE in page.h too. */
-	/* (2^48-(2*1024*1024*1024)-((2^39)*511)-((2^30)*510)) = 0 */
-	PMDS(0x0000000000000000, __PAGE_KERNEL_LARGE_EXEC|_PAGE_GLOBAL, KERNEL_TEXT_SIZE/PMD_SIZE)
-	/* Module mapping starts here */
-	.fill	(PTRS_PER_PMD - (KERNEL_TEXT_SIZE/PMD_SIZE)),8,0
+	/*
+	 * 128 MB kernel mapping. We spend a full page on this pagetable
+	 * anyway.
+	 *
+	 * The kernel code+data+bss must not be bigger than that.
+	 *
+	 * (NOTE: at +128MB starts the module area, see MODULES_VADDR.
+	 *  If you want to increase this then increase MODULES_VADDR
+	 *  too.)
+	 */
+	PMDS(0, __PAGE_KERNEL_LARGE_EXEC|_PAGE_GLOBAL,
+		KERNEL_IMAGE_SIZE/PMD_SIZE)
 
 
 NEXT_PAGE(level2_spare_pgt)
 NEXT_PAGE(level2_spare_pgt)
-	.fill   512,8,0
+	.fill   512, 8, 0
 
 
 #undef PMDS
 #undef PMDS
 #undef NEXT_PAGE
 #undef NEXT_PAGE

+ 2 - 2
arch/x86/kernel/hpet.c

@@ -368,8 +368,8 @@ static int hpet_clocksource_register(void)
 	return 0;
 	return 0;
 }
 }
 
 
-/*
- * Try to setup the HPET timer
+/**
+ * hpet_enable - Try to setup the HPET timer. Returns 1 on success.
  */
  */
 int __init hpet_enable(void)
 int __init hpet_enable(void)
 {
 {

+ 1 - 0
arch/x86/kernel/init_task.c

@@ -15,6 +15,7 @@ static struct files_struct init_files = INIT_FILES;
 static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
 static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
 static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
 static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
 struct mm_struct init_mm = INIT_MM(init_mm);
 struct mm_struct init_mm = INIT_MM(init_mm);
+EXPORT_UNUSED_SYMBOL(init_mm); /* will be removed in 2.6.26 */
 
 
 /*
 /*
  * Initial thread structure.
  * Initial thread structure.

+ 2 - 0
arch/x86/kernel/process_32.c

@@ -603,11 +603,13 @@ __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
 	}
 	}
 #endif
 #endif
 
 
+#ifdef X86_BTS
 	if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS))
 	if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS))
 		ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS);
 		ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS);
 
 
 	if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS))
 	if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS))
 		ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES);
 		ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES);
+#endif
 
 
 
 
 	if (!test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) {
 	if (!test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) {

+ 5 - 3
arch/x86/kernel/process_64.c

@@ -604,11 +604,13 @@ static inline void __switch_to_xtra(struct task_struct *prev_p,
 		memset(tss->io_bitmap, 0xff, prev->io_bitmap_max);
 		memset(tss->io_bitmap, 0xff, prev->io_bitmap_max);
 	}
 	}
 
 
+#ifdef X86_BTS
 	if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS))
 	if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS))
 		ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS);
 		ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS);
 
 
 	if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS))
 	if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS))
 		ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES);
 		ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES);
+#endif
 }
 }
 
 
 /*
 /*
@@ -730,16 +732,16 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
  */
  */
 asmlinkage
 asmlinkage
 long sys_execve(char __user *name, char __user * __user *argv,
 long sys_execve(char __user *name, char __user * __user *argv,
-		char __user * __user *envp, struct pt_regs regs)
+		char __user * __user *envp, struct pt_regs *regs)
 {
 {
 	long error;
 	long error;
 	char * filename;
 	char * filename;
 
 
 	filename = getname(name);
 	filename = getname(name);
 	error = PTR_ERR(filename);
 	error = PTR_ERR(filename);
-	if (IS_ERR(filename)) 
+	if (IS_ERR(filename))
 		return error;
 		return error;
-	error = do_execve(filename, argv, envp, &regs); 
+	error = do_execve(filename, argv, envp, regs);
 	putname(filename);
 	putname(filename);
 	return error;
 	return error;
 }
 }

+ 12 - 0
arch/x86/kernel/ptrace.c

@@ -544,6 +544,8 @@ static int ptrace_set_debugreg(struct task_struct *child,
 	return 0;
 	return 0;
 }
 }
 
 
+#ifdef X86_BTS
+
 static int ptrace_bts_get_size(struct task_struct *child)
 static int ptrace_bts_get_size(struct task_struct *child)
 {
 {
 	if (!child->thread.ds_area_msr)
 	if (!child->thread.ds_area_msr)
@@ -826,6 +828,7 @@ void ptrace_bts_take_timestamp(struct task_struct *tsk,
 
 
 	ptrace_bts_write_record(tsk, &rec);
 	ptrace_bts_write_record(tsk, &rec);
 }
 }
+#endif /* X86_BTS */
 
 
 /*
 /*
  * Called by kernel/ptrace.c when detaching..
  * Called by kernel/ptrace.c when detaching..
@@ -839,7 +842,9 @@ void ptrace_disable(struct task_struct *child)
 	clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
 	clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
 #endif
 #endif
 	if (child->thread.ds_area_msr) {
 	if (child->thread.ds_area_msr) {
+#ifdef X86_BTS
 		ptrace_bts_realloc(child, 0, 0);
 		ptrace_bts_realloc(child, 0, 0);
+#endif
 		child->thread.debugctlmsr &= ~ds_debugctl_mask();
 		child->thread.debugctlmsr &= ~ds_debugctl_mask();
 		if (!child->thread.debugctlmsr)
 		if (!child->thread.debugctlmsr)
 			clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR);
 			clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR);
@@ -961,6 +966,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
 		break;
 		break;
 #endif
 #endif
 
 
+	/*
+	 * These bits need more cooking - not enabled yet:
+	 */
+#ifdef X86_BTS
 	case PTRACE_BTS_CONFIG:
 	case PTRACE_BTS_CONFIG:
 		ret = ptrace_bts_config
 		ret = ptrace_bts_config
 			(child, data, (struct ptrace_bts_config __user *)addr);
 			(child, data, (struct ptrace_bts_config __user *)addr);
@@ -988,6 +997,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
 		ret = ptrace_bts_drain
 		ret = ptrace_bts_drain
 			(child, data, (struct bts_struct __user *) addr);
 			(child, data, (struct bts_struct __user *) addr);
 		break;
 		break;
+#endif
 
 
 	default:
 	default:
 		ret = ptrace_request(child, request, addr, data);
 		ret = ptrace_request(child, request, addr, data);
@@ -1226,12 +1236,14 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
 	case PTRACE_SETOPTIONS:
 	case PTRACE_SETOPTIONS:
 	case PTRACE_SET_THREAD_AREA:
 	case PTRACE_SET_THREAD_AREA:
 	case PTRACE_GET_THREAD_AREA:
 	case PTRACE_GET_THREAD_AREA:
+#ifdef X86_BTS
 	case PTRACE_BTS_CONFIG:
 	case PTRACE_BTS_CONFIG:
 	case PTRACE_BTS_STATUS:
 	case PTRACE_BTS_STATUS:
 	case PTRACE_BTS_SIZE:
 	case PTRACE_BTS_SIZE:
 	case PTRACE_BTS_GET:
 	case PTRACE_BTS_GET:
 	case PTRACE_BTS_CLEAR:
 	case PTRACE_BTS_CLEAR:
 	case PTRACE_BTS_DRAIN:
 	case PTRACE_BTS_DRAIN:
+#endif
 		return sys_ptrace(request, pid, addr, data);
 		return sys_ptrace(request, pid, addr, data);
 
 
 	default:
 	default:

+ 1 - 1
arch/x86/kernel/setup_64.c

@@ -1021,7 +1021,7 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
 
 
 	/* Clear all flags overriden by options */
 	/* Clear all flags overriden by options */
 	for (i = 0; i < NCAPINTS; i++)
 	for (i = 0; i < NCAPINTS; i++)
-		c->x86_capability[i] ^= cleared_cpu_caps[i];
+		c->x86_capability[i] &= ~cleared_cpu_caps[i];
 
 
 #ifdef CONFIG_X86_MCE
 #ifdef CONFIG_X86_MCE
 	mcheck_init(c);
 	mcheck_init(c);

+ 1 - 1
arch/x86/kernel/smpboot_64.c

@@ -554,10 +554,10 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid)
 	int timeout;
 	int timeout;
 	unsigned long start_rip;
 	unsigned long start_rip;
 	struct create_idle c_idle = {
 	struct create_idle c_idle = {
-		.work = __WORK_INITIALIZER(c_idle.work, do_fork_idle),
 		.cpu = cpu,
 		.cpu = cpu,
 		.done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done),
 		.done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done),
 	};
 	};
+	INIT_WORK(&c_idle.work, do_fork_idle);
 
 
 	/* allocate memory for gdts of secondary cpus. Hotplug is considered */
 	/* allocate memory for gdts of secondary cpus. Hotplug is considered */
 	if (!cpu_gdt_descr[cpu].address &&
 	if (!cpu_gdt_descr[cpu].address &&

+ 4 - 0
arch/x86/kernel/stacktrace.c

@@ -25,6 +25,8 @@ static int save_stack_stack(void *data, char *name)
 static void save_stack_address(void *data, unsigned long addr, int reliable)
 static void save_stack_address(void *data, unsigned long addr, int reliable)
 {
 {
 	struct stack_trace *trace = data;
 	struct stack_trace *trace = data;
+	if (!reliable)
+		return;
 	if (trace->skip > 0) {
 	if (trace->skip > 0) {
 		trace->skip--;
 		trace->skip--;
 		return;
 		return;
@@ -37,6 +39,8 @@ static void
 save_stack_address_nosched(void *data, unsigned long addr, int reliable)
 save_stack_address_nosched(void *data, unsigned long addr, int reliable)
 {
 {
 	struct stack_trace *trace = (struct stack_trace *)data;
 	struct stack_trace *trace = (struct stack_trace *)data;
+	if (!reliable)
+		return;
 	if (in_sched_functions(addr))
 	if (in_sched_functions(addr))
 		return;
 		return;
 	if (trace->skip > 0) {
 	if (trace->skip > 0) {

+ 6 - 2
arch/x86/kernel/tls.c

@@ -91,7 +91,9 @@ int do_set_thread_area(struct task_struct *p, int idx,
 
 
 asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
 asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
 {
 {
-	return do_set_thread_area(current, -1, u_info, 1);
+	int ret = do_set_thread_area(current, -1, u_info, 1);
+	prevent_tail_call(ret);
+	return ret;
 }
 }
 
 
 
 
@@ -139,7 +141,9 @@ int do_get_thread_area(struct task_struct *p, int idx,
 
 
 asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
 asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
 {
 {
-	return do_get_thread_area(current, -1, u_info);
+	int ret = do_get_thread_area(current, -1, u_info);
+	prevent_tail_call(ret);
+	return ret;
 }
 }
 
 
 int regset_tls_active(struct task_struct *target,
 int regset_tls_active(struct task_struct *target,

+ 2 - 1
arch/x86/kernel/tsc_32.c

@@ -28,7 +28,8 @@ EXPORT_SYMBOL_GPL(tsc_khz);
 static int __init tsc_setup(char *str)
 static int __init tsc_setup(char *str)
 {
 {
 	printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, "
 	printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, "
-				"cannot disable TSC.\n");
+				"cannot disable TSC completely.\n");
+	mark_tsc_unstable("user disabled TSC");
 	return 1;
 	return 1;
 }
 }
 #else
 #else

+ 6 - 43
arch/x86/kernel/vsyscall_64.c

@@ -44,11 +44,6 @@
 
 
 #define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr)))
 #define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr)))
 #define __syscall_clobber "r11","cx","memory"
 #define __syscall_clobber "r11","cx","memory"
-#define __pa_vsymbol(x)			\
-	({unsigned long v;  		\
-	extern char __vsyscall_0; 	\
-	  asm("" : "=r" (v) : "0" (x)); \
-	  ((v - VSYSCALL_START) + __pa_symbol(&__vsyscall_0)); })
 
 
 /*
 /*
  * vsyscall_gtod_data contains data that is :
  * vsyscall_gtod_data contains data that is :
@@ -102,7 +97,7 @@ static __always_inline void do_get_tz(struct timezone * tz)
 static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz)
 static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz)
 {
 {
 	int ret;
 	int ret;
-	asm volatile("vsysc2: syscall"
+	asm volatile("syscall"
 		: "=a" (ret)
 		: "=a" (ret)
 		: "0" (__NR_gettimeofday),"D" (tv),"S" (tz)
 		: "0" (__NR_gettimeofday),"D" (tv),"S" (tz)
 		: __syscall_clobber );
 		: __syscall_clobber );
@@ -112,7 +107,7 @@ static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz)
 static __always_inline long time_syscall(long *t)
 static __always_inline long time_syscall(long *t)
 {
 {
 	long secs;
 	long secs;
-	asm volatile("vsysc1: syscall"
+	asm volatile("syscall"
 		: "=a" (secs)
 		: "=a" (secs)
 		: "0" (__NR_time),"D" (t) : __syscall_clobber);
 		: "0" (__NR_time),"D" (t) : __syscall_clobber);
 	return secs;
 	return secs;
@@ -228,42 +223,11 @@ long __vsyscall(3) venosys_1(void)
 
 
 #ifdef CONFIG_SYSCTL
 #ifdef CONFIG_SYSCTL
 
 
-#define SYSCALL 0x050f
-#define NOP2    0x9090
-
-/*
- * NOP out syscall in vsyscall page when not needed.
- */
-static int vsyscall_sysctl_change(ctl_table *ctl, int write, struct file * filp,
-                        void __user *buffer, size_t *lenp, loff_t *ppos)
+static int
+vsyscall_sysctl_change(ctl_table *ctl, int write, struct file * filp,
+		       void __user *buffer, size_t *lenp, loff_t *ppos)
 {
 {
-	extern u16 vsysc1, vsysc2;
-	u16 __iomem *map1;
-	u16 __iomem *map2;
-	int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
-	if (!write)
-		return ret;
-	/* gcc has some trouble with __va(__pa()), so just do it this
-	   way. */
-	map1 = ioremap(__pa_vsymbol(&vsysc1), 2);
-	if (!map1)
-		return -ENOMEM;
-	map2 = ioremap(__pa_vsymbol(&vsysc2), 2);
-	if (!map2) {
-		ret = -ENOMEM;
-		goto out;
-	}
-	if (!vsyscall_gtod_data.sysctl_enabled) {
-		writew(SYSCALL, map1);
-		writew(SYSCALL, map2);
-	} else {
-		writew(NOP2, map1);
-		writew(NOP2, map2);
-	}
-	iounmap(map2);
-out:
-	iounmap(map1);
-	return ret;
+	return proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
 }
 }
 
 
 static ctl_table kernel_table2[] = {
 static ctl_table kernel_table2[] = {
@@ -279,7 +243,6 @@ static ctl_table kernel_root_table2[] = {
 	  .child = kernel_table2 },
 	  .child = kernel_table2 },
 	{}
 	{}
 };
 };
-
 #endif
 #endif
 
 
 /* Assume __initcall executes before all user space. Hopefully kmod
 /* Assume __initcall executes before all user space. Hopefully kmod

Some files were not shown because too many files changed in this diff