Merge branch 'x86/apic' into x86/irq
Reason: Update to latest genirq code conflicts with pending apic changes Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
				commit
				
					
						cfe08bba1e
					
				
			
		
					 135 changed files with 1637 additions and 1255 deletions
				
			
		| 
						 | 
					@ -82,6 +82,11 @@
 | 
				
			||||||
     </sect1>
 | 
					     </sect1>
 | 
				
			||||||
  </chapter>
 | 
					  </chapter>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <chapter id="fs_events">
 | 
				
			||||||
 | 
					     <title>Events based on file descriptors</title>
 | 
				
			||||||
 | 
					!Efs/eventfd.c
 | 
				
			||||||
 | 
					  </chapter>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <chapter id="sysfs">
 | 
					  <chapter id="sysfs">
 | 
				
			||||||
     <title>The Filesystem for Exporting Kernel Objects</title>
 | 
					     <title>The Filesystem for Exporting Kernel Objects</title>
 | 
				
			||||||
!Efs/sysfs/file.c
 | 
					!Efs/sysfs/file.c
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,8 @@ Supported chips:
 | 
				
			||||||
  * JEDEC JC 42.4 compliant temperature sensor chips
 | 
					  * JEDEC JC 42.4 compliant temperature sensor chips
 | 
				
			||||||
    Prefix: 'jc42'
 | 
					    Prefix: 'jc42'
 | 
				
			||||||
    Addresses scanned: I2C 0x18 - 0x1f
 | 
					    Addresses scanned: I2C 0x18 - 0x1f
 | 
				
			||||||
    Datasheet: -
 | 
					    Datasheet:
 | 
				
			||||||
 | 
						http://www.jedec.org/sites/default/files/docs/4_01_04R19.pdf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Author:
 | 
					Author:
 | 
				
			||||||
	Guenter Roeck <guenter.roeck@ericsson.com>
 | 
						Guenter Roeck <guenter.roeck@ericsson.com>
 | 
				
			||||||
| 
						 | 
					@ -60,7 +61,11 @@ Author:
 | 
				
			||||||
Description
 | 
					Description
 | 
				
			||||||
-----------
 | 
					-----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This driver implements support for JEDEC JC 42.4 compliant temperature sensors.
 | 
					This driver implements support for JEDEC JC 42.4 compliant temperature sensors,
 | 
				
			||||||
 | 
					which are used on many DDR3 memory modules for mobile devices and servers. Some
 | 
				
			||||||
 | 
					systems use the sensor to prevent memory overheating by automatically throttling
 | 
				
			||||||
 | 
					the memory controller.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The driver auto-detects the chips listed above, but can be manually instantiated
 | 
					The driver auto-detects the chips listed above, but can be manually instantiated
 | 
				
			||||||
to support other JC 42.4 compliant chips.
 | 
					to support other JC 42.4 compliant chips.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,15 +86,19 @@ limits. The chip supports only a single register to configure the hysteresis,
 | 
				
			||||||
which applies to all limits. This register can be written by writing into
 | 
					which applies to all limits. This register can be written by writing into
 | 
				
			||||||
temp1_crit_hyst. Other hysteresis attributes are read-only.
 | 
					temp1_crit_hyst. Other hysteresis attributes are read-only.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If the BIOS has configured the sensor for automatic temperature management, it
 | 
				
			||||||
 | 
					is likely that it has locked the registers, i.e., that the temperature limits
 | 
				
			||||||
 | 
					cannot be changed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Sysfs entries
 | 
					Sysfs entries
 | 
				
			||||||
-------------
 | 
					-------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
temp1_input		Temperature (RO)
 | 
					temp1_input		Temperature (RO)
 | 
				
			||||||
temp1_min		Minimum temperature (RW)
 | 
					temp1_min		Minimum temperature (RO or RW)
 | 
				
			||||||
temp1_max		Maximum temperature (RW)
 | 
					temp1_max		Maximum temperature (RO or RW)
 | 
				
			||||||
temp1_crit		Critical high temperature (RW)
 | 
					temp1_crit		Critical high temperature (RO or RW)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
temp1_crit_hyst		Critical hysteresis temperature (RW)
 | 
					temp1_crit_hyst		Critical hysteresis temperature (RO or RW)
 | 
				
			||||||
temp1_max_hyst		Maximum hysteresis temperature (RO)
 | 
					temp1_max_hyst		Maximum hysteresis temperature (RO)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
temp1_min_alarm		Temperature low alarm
 | 
					temp1_min_alarm		Temperature low alarm
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,8 @@ Supported chips:
 | 
				
			||||||
  Socket S1G3: Athlon II, Sempron, Turion II
 | 
					  Socket S1G3: Athlon II, Sempron, Turion II
 | 
				
			||||||
* AMD Family 11h processors:
 | 
					* AMD Family 11h processors:
 | 
				
			||||||
  Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra)
 | 
					  Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra)
 | 
				
			||||||
 | 
					* AMD Family 12h processors: "Llano"
 | 
				
			||||||
 | 
					* AMD Family 14h processors: "Brazos" (C/E/G-Series)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Prefix: 'k10temp'
 | 
					  Prefix: 'k10temp'
 | 
				
			||||||
  Addresses scanned: PCI space
 | 
					  Addresses scanned: PCI space
 | 
				
			||||||
| 
						 | 
					@ -17,10 +19,14 @@ Supported chips:
 | 
				
			||||||
    http://support.amd.com/us/Processor_TechDocs/31116.pdf
 | 
					    http://support.amd.com/us/Processor_TechDocs/31116.pdf
 | 
				
			||||||
  BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors:
 | 
					  BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors:
 | 
				
			||||||
    http://support.amd.com/us/Processor_TechDocs/41256.pdf
 | 
					    http://support.amd.com/us/Processor_TechDocs/41256.pdf
 | 
				
			||||||
 | 
					  BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors:
 | 
				
			||||||
 | 
					    http://support.amd.com/us/Processor_TechDocs/43170.pdf
 | 
				
			||||||
  Revision Guide for AMD Family 10h Processors:
 | 
					  Revision Guide for AMD Family 10h Processors:
 | 
				
			||||||
    http://support.amd.com/us/Processor_TechDocs/41322.pdf
 | 
					    http://support.amd.com/us/Processor_TechDocs/41322.pdf
 | 
				
			||||||
  Revision Guide for AMD Family 11h Processors:
 | 
					  Revision Guide for AMD Family 11h Processors:
 | 
				
			||||||
    http://support.amd.com/us/Processor_TechDocs/41788.pdf
 | 
					    http://support.amd.com/us/Processor_TechDocs/41788.pdf
 | 
				
			||||||
 | 
					  Revision Guide for AMD Family 14h Models 00h-0Fh Processors:
 | 
				
			||||||
 | 
					    http://support.amd.com/us/Processor_TechDocs/47534.pdf
 | 
				
			||||||
  AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks:
 | 
					  AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks:
 | 
				
			||||||
    http://support.amd.com/us/Processor_TechDocs/43373.pdf
 | 
					    http://support.amd.com/us/Processor_TechDocs/43373.pdf
 | 
				
			||||||
  AMD Family 10h Server and Workstation Processor Power and Thermal Data Sheet:
 | 
					  AMD Family 10h Server and Workstation Processor Power and Thermal Data Sheet:
 | 
				
			||||||
| 
						 | 
					@ -34,7 +40,7 @@ Description
 | 
				
			||||||
-----------
 | 
					-----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This driver permits reading of the internal temperature sensor of AMD
 | 
					This driver permits reading of the internal temperature sensor of AMD
 | 
				
			||||||
Family 10h and 11h processors.
 | 
					Family 10h/11h/12h/14h processors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
All these processors have a sensor, but on those for Socket F or AM2+,
 | 
					All these processors have a sensor, but on those for Socket F or AM2+,
 | 
				
			||||||
the sensor may return inconsistent values (erratum 319).  The driver
 | 
					the sensor may return inconsistent values (erratum 319).  The driver
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -144,6 +144,11 @@ a fixed number of characters. This limit depends on the architecture
 | 
				
			||||||
and is between 256 and 4096 characters. It is defined in the file
 | 
					and is between 256 and 4096 characters. It is defined in the file
 | 
				
			||||||
./include/asm/setup.h as COMMAND_LINE_SIZE.
 | 
					./include/asm/setup.h as COMMAND_LINE_SIZE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Finally, the [KMG] suffix is commonly described after a number of kernel
 | 
				
			||||||
 | 
					parameter values. These 'K', 'M', and 'G' letters represent the _binary_
 | 
				
			||||||
 | 
					multipliers 'Kilo', 'Mega', and 'Giga', equalling 2^10, 2^20, and 2^30
 | 
				
			||||||
 | 
					bytes respectively. Such letter suffixes can also be entirely omitted.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	acpi=		[HW,ACPI,X86]
 | 
						acpi=		[HW,ACPI,X86]
 | 
				
			||||||
			Advanced Configuration and Power Interface
 | 
								Advanced Configuration and Power Interface
 | 
				
			||||||
| 
						 | 
					@ -545,16 +550,20 @@ and is between 256 and 4096 characters. It is defined in the file
 | 
				
			||||||
			Format:
 | 
								Format:
 | 
				
			||||||
			<first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
 | 
								<first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	crashkernel=nn[KMG]@ss[KMG]
 | 
						crashkernel=size[KMG][@offset[KMG]]
 | 
				
			||||||
			[KNL] Reserve a chunk of physical memory to
 | 
								[KNL] Using kexec, Linux can switch to a 'crash kernel'
 | 
				
			||||||
			hold a kernel to switch to with kexec on panic.
 | 
								upon panic. This parameter reserves the physical
 | 
				
			||||||
 | 
								memory region [offset, offset + size] for that kernel
 | 
				
			||||||
 | 
								image. If '@offset' is omitted, then a suitable offset
 | 
				
			||||||
 | 
								is selected automatically. Check
 | 
				
			||||||
 | 
								Documentation/kdump/kdump.txt for further details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	crashkernel=range1:size1[,range2:size2,...][@offset]
 | 
						crashkernel=range1:size1[,range2:size2,...][@offset]
 | 
				
			||||||
			[KNL] Same as above, but depends on the memory
 | 
								[KNL] Same as above, but depends on the memory
 | 
				
			||||||
			in the running system. The syntax of range is
 | 
								in the running system. The syntax of range is
 | 
				
			||||||
			start-[end] where start and end are both
 | 
								start-[end] where start and end are both
 | 
				
			||||||
			a memory unit (amount[KMG]). See also
 | 
								a memory unit (amount[KMG]). See also
 | 
				
			||||||
			Documentation/kdump/kdump.txt for a example.
 | 
								Documentation/kdump/kdump.txt for an example.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cs89x0_dma=	[HW,NET]
 | 
						cs89x0_dma=	[HW,NET]
 | 
				
			||||||
			Format: <dma>
 | 
								Format: <dma>
 | 
				
			||||||
| 
						 | 
					@ -1262,10 +1271,9 @@ and is between 256 and 4096 characters. It is defined in the file
 | 
				
			||||||
			6 (KERN_INFO)		informational
 | 
								6 (KERN_INFO)		informational
 | 
				
			||||||
			7 (KERN_DEBUG)		debug-level messages
 | 
								7 (KERN_DEBUG)		debug-level messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log_buf_len=n	Sets the size of the printk ring buffer, in bytes.
 | 
						log_buf_len=n[KMG]	Sets the size of the printk ring buffer,
 | 
				
			||||||
			Format: { n | nk | nM }
 | 
								in bytes.  n must be a power of two.  The default
 | 
				
			||||||
			n must be a power of two.  The default size
 | 
								size is set in the kernel config file.
 | 
				
			||||||
			is set in the kernel config file.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logo.nologo	[FB] Disables display of the built-in Linux logo.
 | 
						logo.nologo	[FB] Disables display of the built-in Linux logo.
 | 
				
			||||||
			This may be used to provide more screen space for
 | 
								This may be used to provide more screen space for
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,8 @@ obj- := dummy.o
 | 
				
			||||||
# List of programs to build
 | 
					# List of programs to build
 | 
				
			||||||
hostprogs-y := ifenslave
 | 
					hostprogs-y := ifenslave
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HOSTCFLAGS_ifenslave.o += -I$(objtree)/usr/include
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Tell kbuild to always build the programs
 | 
					# Tell kbuild to always build the programs
 | 
				
			||||||
always := $(hostprogs-y)
 | 
					always := $(hostprogs-y)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -190,9 +190,9 @@ resources, scheduled and executed.
 | 
				
			||||||
	* Long running CPU intensive workloads which can be better
 | 
						* Long running CPU intensive workloads which can be better
 | 
				
			||||||
	  managed by the system scheduler.
 | 
						  managed by the system scheduler.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  WQ_FREEZEABLE
 | 
					  WQ_FREEZABLE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	A freezeable wq participates in the freeze phase of the system
 | 
						A freezable wq participates in the freeze phase of the system
 | 
				
			||||||
	suspend operations.  Work items on the wq are drained and no
 | 
						suspend operations.  Work items on the wq are drained and no
 | 
				
			||||||
	new work item starts execution until thawed.
 | 
						new work item starts execution until thawed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -885,7 +885,7 @@ S:	Supported
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ARM/QUALCOMM MSM MACHINE SUPPORT
 | 
					ARM/QUALCOMM MSM MACHINE SUPPORT
 | 
				
			||||||
M:	David Brown <davidb@codeaurora.org>
 | 
					M:	David Brown <davidb@codeaurora.org>
 | 
				
			||||||
M:	Daniel Walker <dwalker@codeaurora.org>
 | 
					M:	Daniel Walker <dwalker@fifo99.com>
 | 
				
			||||||
M:	Bryan Huntsman <bryanh@codeaurora.org>
 | 
					M:	Bryan Huntsman <bryanh@codeaurora.org>
 | 
				
			||||||
L:	linux-arm-msm@vger.kernel.org
 | 
					L:	linux-arm-msm@vger.kernel.org
 | 
				
			||||||
F:	arch/arm/mach-msm/
 | 
					F:	arch/arm/mach-msm/
 | 
				
			||||||
| 
						 | 
					@ -2873,7 +2873,6 @@ M:	Guenter Roeck <guenter.roeck@ericsson.com>
 | 
				
			||||||
L:	lm-sensors@lm-sensors.org
 | 
					L:	lm-sensors@lm-sensors.org
 | 
				
			||||||
W:	http://www.lm-sensors.org/
 | 
					W:	http://www.lm-sensors.org/
 | 
				
			||||||
T:	quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/
 | 
					T:	quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/
 | 
				
			||||||
T:	quilt kernel.org/pub/linux/kernel/people/groeck/linux-staging/
 | 
					 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	Documentation/hwmon/
 | 
					F:	Documentation/hwmon/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
VERSION = 2
 | 
					VERSION = 2
 | 
				
			||||||
PATCHLEVEL = 6
 | 
					PATCHLEVEL = 6
 | 
				
			||||||
SUBLEVEL = 38
 | 
					SUBLEVEL = 38
 | 
				
			||||||
EXTRAVERSION = -rc5
 | 
					EXTRAVERSION = -rc6
 | 
				
			||||||
NAME = Flesh-Eating Bats with Fangs
 | 
					NAME = Flesh-Eating Bats with Fangs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# *DOCUMENTATION*
 | 
					# *DOCUMENTATION*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1177,6 +1177,31 @@ config ARM_ERRATA_743622
 | 
				
			||||||
	  visible impact on the overall performance or power consumption of the
 | 
						  visible impact on the overall performance or power consumption of the
 | 
				
			||||||
	  processor.
 | 
						  processor.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config ARM_ERRATA_751472
 | 
				
			||||||
 | 
						bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation"
 | 
				
			||||||
 | 
						depends on CPU_V7 && SMP
 | 
				
			||||||
 | 
						help
 | 
				
			||||||
 | 
						  This option enables the workaround for the 751472 Cortex-A9 (prior
 | 
				
			||||||
 | 
						  to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the
 | 
				
			||||||
 | 
						  completion of a following broadcasted operation if the second
 | 
				
			||||||
 | 
						  operation is received by a CPU before the ICIALLUIS has completed,
 | 
				
			||||||
 | 
						  potentially leading to corrupted entries in the cache or TLB.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config ARM_ERRATA_753970
 | 
				
			||||||
 | 
						bool "ARM errata: cache sync operation may be faulty"
 | 
				
			||||||
 | 
						depends on CACHE_PL310
 | 
				
			||||||
 | 
						help
 | 
				
			||||||
 | 
						  This option enables the workaround for the 753970 PL310 (r3p0) erratum.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  Under some condition the effect of cache sync operation on
 | 
				
			||||||
 | 
						  the store buffer still remains when the operation completes.
 | 
				
			||||||
 | 
						  This means that the store buffer is always asked to drain and
 | 
				
			||||||
 | 
						  this prevents it from merging any further writes. The workaround
 | 
				
			||||||
 | 
						  is to replace the normal offset of cache sync operation (0x730)
 | 
				
			||||||
 | 
						  by another offset targeting an unmapped PL310 register 0x740.
 | 
				
			||||||
 | 
						  This has the same effect as the cache sync operation: store buffer
 | 
				
			||||||
 | 
						  drain and waiting for all buffers empty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
endmenu
 | 
					endmenu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source "arch/arm/common/Kconfig"
 | 
					source "arch/arm/common/Kconfig"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,7 @@ ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
 | 
				
			||||||
LDFLAGS_vmlinux	+= --be8
 | 
					LDFLAGS_vmlinux	+= --be8
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OBJCOPYFLAGS	:=-O binary -R .note -R .note.gnu.build-id -R .comment -S
 | 
					OBJCOPYFLAGS	:=-O binary -R .comment -S
 | 
				
			||||||
GZFLAGS		:=-9
 | 
					GZFLAGS		:=-9
 | 
				
			||||||
#KBUILD_CFLAGS	+=-pipe
 | 
					#KBUILD_CFLAGS	+=-pipe
 | 
				
			||||||
# Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb:
 | 
					# Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								arch/arm/boot/compressed/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								arch/arm/boot/compressed/.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,3 +1,7 @@
 | 
				
			||||||
font.c
 | 
					font.c
 | 
				
			||||||
piggy.gz
 | 
					lib1funcs.S
 | 
				
			||||||
 | 
					piggy.gzip
 | 
				
			||||||
 | 
					piggy.lzo
 | 
				
			||||||
 | 
					piggy.lzma
 | 
				
			||||||
 | 
					vmlinux
 | 
				
			||||||
vmlinux.lds
 | 
					vmlinux.lds
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,6 +36,7 @@
 | 
				
			||||||
#define L2X0_RAW_INTR_STAT		0x21C
 | 
					#define L2X0_RAW_INTR_STAT		0x21C
 | 
				
			||||||
#define L2X0_INTR_CLEAR			0x220
 | 
					#define L2X0_INTR_CLEAR			0x220
 | 
				
			||||||
#define L2X0_CACHE_SYNC			0x730
 | 
					#define L2X0_CACHE_SYNC			0x730
 | 
				
			||||||
 | 
					#define L2X0_DUMMY_REG			0x740
 | 
				
			||||||
#define L2X0_INV_LINE_PA		0x770
 | 
					#define L2X0_INV_LINE_PA		0x770
 | 
				
			||||||
#define L2X0_INV_WAY			0x77C
 | 
					#define L2X0_INV_WAY			0x77C
 | 
				
			||||||
#define L2X0_CLEAN_LINE_PA		0x7B0
 | 
					#define L2X0_CLEAN_LINE_PA		0x7B0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,6 +58,9 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void sysctl_soft_reset(void __iomem *base)
 | 
					static inline void sysctl_soft_reset(void __iomem *base)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						/* switch to slow mode */
 | 
				
			||||||
 | 
						writel(0x2, base + SCCTRL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* writing any value to SCSYSSTAT reg will reset system */
 | 
						/* writing any value to SCSYSSTAT reg will reset system */
 | 
				
			||||||
	writel(0, base + SCSYSSTAT);
 | 
						writel(0, base + SCSYSSTAT);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,16 +18,34 @@
 | 
				
			||||||
#define __ASMARM_TLB_H
 | 
					#define __ASMARM_TLB_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <asm/cacheflush.h>
 | 
					#include <asm/cacheflush.h>
 | 
				
			||||||
#include <asm/tlbflush.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CONFIG_MMU
 | 
					#ifndef CONFIG_MMU
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <linux/pagemap.h>
 | 
					#include <linux/pagemap.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define tlb_flush(tlb)	((void) tlb)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <asm-generic/tlb.h>
 | 
					#include <asm-generic/tlb.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else /* !CONFIG_MMU */
 | 
					#else /* !CONFIG_MMU */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/swap.h>
 | 
				
			||||||
#include <asm/pgalloc.h>
 | 
					#include <asm/pgalloc.h>
 | 
				
			||||||
 | 
					#include <asm/tlbflush.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * We need to delay page freeing for SMP as other CPUs can access pages
 | 
				
			||||||
 | 
					 * which have been removed but not yet had their TLB entries invalidated.
 | 
				
			||||||
 | 
					 * Also, as ARMv7 speculative prefetch can drag new entries into the TLB,
 | 
				
			||||||
 | 
					 * we need to apply this same delaying tactic to ensure correct operation.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7)
 | 
				
			||||||
 | 
					#define tlb_fast_mode(tlb)	0
 | 
				
			||||||
 | 
					#define FREE_PTE_NR		500
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define tlb_fast_mode(tlb)	1
 | 
				
			||||||
 | 
					#define FREE_PTE_NR		0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * TLB handling.  This allows us to remove pages from the page
 | 
					 * TLB handling.  This allows us to remove pages from the page
 | 
				
			||||||
| 
						 | 
					@ -36,12 +54,58 @@
 | 
				
			||||||
struct mmu_gather {
 | 
					struct mmu_gather {
 | 
				
			||||||
	struct mm_struct	*mm;
 | 
						struct mm_struct	*mm;
 | 
				
			||||||
	unsigned int		fullmm;
 | 
						unsigned int		fullmm;
 | 
				
			||||||
 | 
						struct vm_area_struct	*vma;
 | 
				
			||||||
	unsigned long		range_start;
 | 
						unsigned long		range_start;
 | 
				
			||||||
	unsigned long		range_end;
 | 
						unsigned long		range_end;
 | 
				
			||||||
 | 
						unsigned int		nr;
 | 
				
			||||||
 | 
						struct page		*pages[FREE_PTE_NR];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DECLARE_PER_CPU(struct mmu_gather, mmu_gathers);
 | 
					DECLARE_PER_CPU(struct mmu_gather, mmu_gathers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This is unnecessarily complex.  There's three ways the TLB shootdown
 | 
				
			||||||
 | 
					 * code is used:
 | 
				
			||||||
 | 
					 *  1. Unmapping a range of vmas.  See zap_page_range(), unmap_region().
 | 
				
			||||||
 | 
					 *     tlb->fullmm = 0, and tlb_start_vma/tlb_end_vma will be called.
 | 
				
			||||||
 | 
					 *     tlb->vma will be non-NULL.
 | 
				
			||||||
 | 
					 *  2. Unmapping all vmas.  See exit_mmap().
 | 
				
			||||||
 | 
					 *     tlb->fullmm = 1, and tlb_start_vma/tlb_end_vma will be called.
 | 
				
			||||||
 | 
					 *     tlb->vma will be non-NULL.  Additionally, page tables will be freed.
 | 
				
			||||||
 | 
					 *  3. Unmapping argument pages.  See shift_arg_pages().
 | 
				
			||||||
 | 
					 *     tlb->fullmm = 0, but tlb_start_vma/tlb_end_vma will not be called.
 | 
				
			||||||
 | 
					 *     tlb->vma will be NULL.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void tlb_flush(struct mmu_gather *tlb)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (tlb->fullmm || !tlb->vma)
 | 
				
			||||||
 | 
							flush_tlb_mm(tlb->mm);
 | 
				
			||||||
 | 
						else if (tlb->range_end > 0) {
 | 
				
			||||||
 | 
							flush_tlb_range(tlb->vma, tlb->range_start, tlb->range_end);
 | 
				
			||||||
 | 
							tlb->range_start = TASK_SIZE;
 | 
				
			||||||
 | 
							tlb->range_end = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void tlb_add_flush(struct mmu_gather *tlb, unsigned long addr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!tlb->fullmm) {
 | 
				
			||||||
 | 
							if (addr < tlb->range_start)
 | 
				
			||||||
 | 
								tlb->range_start = addr;
 | 
				
			||||||
 | 
							if (addr + PAGE_SIZE > tlb->range_end)
 | 
				
			||||||
 | 
								tlb->range_end = addr + PAGE_SIZE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void tlb_flush_mmu(struct mmu_gather *tlb)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						tlb_flush(tlb);
 | 
				
			||||||
 | 
						if (!tlb_fast_mode(tlb)) {
 | 
				
			||||||
 | 
							free_pages_and_swap_cache(tlb->pages, tlb->nr);
 | 
				
			||||||
 | 
							tlb->nr = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline struct mmu_gather *
 | 
					static inline struct mmu_gather *
 | 
				
			||||||
tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
 | 
					tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -49,6 +113,8 @@ tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tlb->mm = mm;
 | 
						tlb->mm = mm;
 | 
				
			||||||
	tlb->fullmm = full_mm_flush;
 | 
						tlb->fullmm = full_mm_flush;
 | 
				
			||||||
 | 
						tlb->vma = NULL;
 | 
				
			||||||
 | 
						tlb->nr = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return tlb;
 | 
						return tlb;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -56,8 +122,7 @@ tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
 | 
				
			||||||
static inline void
 | 
					static inline void
 | 
				
			||||||
tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
 | 
					tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (tlb->fullmm)
 | 
						tlb_flush_mmu(tlb);
 | 
				
			||||||
		flush_tlb_mm(tlb->mm);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* keep the page table cache within bounds */
 | 
						/* keep the page table cache within bounds */
 | 
				
			||||||
	check_pgt_cache();
 | 
						check_pgt_cache();
 | 
				
			||||||
| 
						 | 
					@ -71,12 +136,7 @@ tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
 | 
				
			||||||
static inline void
 | 
					static inline void
 | 
				
			||||||
tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long addr)
 | 
					tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long addr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!tlb->fullmm) {
 | 
						tlb_add_flush(tlb, addr);
 | 
				
			||||||
		if (addr < tlb->range_start)
 | 
					 | 
				
			||||||
			tlb->range_start = addr;
 | 
					 | 
				
			||||||
		if (addr + PAGE_SIZE > tlb->range_end)
 | 
					 | 
				
			||||||
			tlb->range_end = addr + PAGE_SIZE;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -89,6 +149,7 @@ tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!tlb->fullmm) {
 | 
						if (!tlb->fullmm) {
 | 
				
			||||||
		flush_cache_range(vma, vma->vm_start, vma->vm_end);
 | 
							flush_cache_range(vma, vma->vm_start, vma->vm_end);
 | 
				
			||||||
 | 
							tlb->vma = vma;
 | 
				
			||||||
		tlb->range_start = TASK_SIZE;
 | 
							tlb->range_start = TASK_SIZE;
 | 
				
			||||||
		tlb->range_end = 0;
 | 
							tlb->range_end = 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -97,12 +158,30 @@ tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
 | 
				
			||||||
static inline void
 | 
					static inline void
 | 
				
			||||||
tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
 | 
					tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!tlb->fullmm && tlb->range_end > 0)
 | 
						if (!tlb->fullmm)
 | 
				
			||||||
		flush_tlb_range(vma, tlb->range_start, tlb->range_end);
 | 
							tlb_flush(tlb);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define tlb_remove_page(tlb,page)	free_page_and_swap_cache(page)
 | 
					static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
 | 
				
			||||||
#define pte_free_tlb(tlb, ptep, addr)	pte_free((tlb)->mm, ptep)
 | 
					{
 | 
				
			||||||
 | 
						if (tlb_fast_mode(tlb)) {
 | 
				
			||||||
 | 
							free_page_and_swap_cache(page);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							tlb->pages[tlb->nr++] = page;
 | 
				
			||||||
 | 
							if (tlb->nr >= FREE_PTE_NR)
 | 
				
			||||||
 | 
								tlb_flush_mmu(tlb);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
 | 
				
			||||||
 | 
						unsigned long addr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						pgtable_page_dtor(pte);
 | 
				
			||||||
 | 
						tlb_add_flush(tlb, addr);
 | 
				
			||||||
 | 
						tlb_remove_page(tlb, pte);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define pte_free_tlb(tlb, ptep, addr)	__pte_free_tlb(tlb, ptep, addr)
 | 
				
			||||||
#define pmd_free_tlb(tlb, pmdp, addr)	pmd_free((tlb)->mm, pmdp)
 | 
					#define pmd_free_tlb(tlb, pmdp, addr)	pmd_free((tlb)->mm, pmdp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define tlb_migrate_finish(mm)		do { } while (0)
 | 
					#define tlb_migrate_finish(mm)		do { } while (0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,12 +10,7 @@
 | 
				
			||||||
#ifndef _ASMARM_TLBFLUSH_H
 | 
					#ifndef _ASMARM_TLBFLUSH_H
 | 
				
			||||||
#define _ASMARM_TLBFLUSH_H
 | 
					#define _ASMARM_TLBFLUSH_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_MMU
 | 
				
			||||||
#ifndef CONFIG_MMU
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define tlb_flush(tlb)	((void) tlb)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#else /* CONFIG_MMU */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <asm/glue.h>
 | 
					#include <asm/glue.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1437,7 +1437,7 @@ arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return space_cccc_1100_010x(insn, asi);
 | 
							return space_cccc_1100_010x(insn, asi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else if ((insn & 0x0e000000) == 0x0c400000) {
 | 
						} else if ((insn & 0x0e000000) == 0x0c000000) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return space_cccc_110x(insn, asi);
 | 
							return space_cccc_110x(insn, asi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,28 +97,34 @@ set_irq_affinity(int irq,
 | 
				
			||||||
			   irq, cpu);
 | 
								   irq, cpu);
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	return 0;
 | 
						return -EINVAL;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
init_cpu_pmu(void)
 | 
					init_cpu_pmu(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, err = 0;
 | 
						int i, irqs, err = 0;
 | 
				
			||||||
	struct platform_device *pdev = pmu_devices[ARM_PMU_DEVICE_CPU];
 | 
						struct platform_device *pdev = pmu_devices[ARM_PMU_DEVICE_CPU];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!pdev) {
 | 
						if (!pdev)
 | 
				
			||||||
		err = -ENODEV;
 | 
							return -ENODEV;
 | 
				
			||||||
		goto out;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < pdev->num_resources; ++i) {
 | 
						irqs = pdev->num_resources;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * If we have a single PMU interrupt that we can't shift, assume that
 | 
				
			||||||
 | 
						 * we're running on a uniprocessor machine and continue.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (irqs == 1 && !irq_can_set_affinity(platform_get_irq(pdev, 0)))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < irqs; ++i) {
 | 
				
			||||||
		err = set_irq_affinity(platform_get_irq(pdev, i), i);
 | 
							err = set_irq_affinity(platform_get_irq(pdev, i), i);
 | 
				
			||||||
		if (err)
 | 
							if (err)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -226,8 +226,8 @@ int cpu_architecture(void)
 | 
				
			||||||
		 * Register 0 and check for VMSAv7 or PMSAv7 */
 | 
							 * Register 0 and check for VMSAv7 or PMSAv7 */
 | 
				
			||||||
		asm("mrc	p15, 0, %0, c0, c1, 4"
 | 
							asm("mrc	p15, 0, %0, c0, c1, 4"
 | 
				
			||||||
		    : "=r" (mmfr0));
 | 
							    : "=r" (mmfr0));
 | 
				
			||||||
		if ((mmfr0 & 0x0000000f) == 0x00000003 ||
 | 
							if ((mmfr0 & 0x0000000f) >= 0x00000003 ||
 | 
				
			||||||
		    (mmfr0 & 0x000000f0) == 0x00000030)
 | 
							    (mmfr0 & 0x000000f0) >= 0x00000030)
 | 
				
			||||||
			cpu_arch = CPU_ARCH_ARMv7;
 | 
								cpu_arch = CPU_ARCH_ARMv7;
 | 
				
			||||||
		else if ((mmfr0 & 0x0000000f) == 0x00000002 ||
 | 
							else if ((mmfr0 & 0x0000000f) == 0x00000002 ||
 | 
				
			||||||
			 (mmfr0 & 0x000000f0) == 0x00000020)
 | 
								 (mmfr0 & 0x000000f0) == 0x00000020)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -474,7 +474,9 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
 | 
				
			||||||
	unsigned long handler = (unsigned long)ka->sa.sa_handler;
 | 
						unsigned long handler = (unsigned long)ka->sa.sa_handler;
 | 
				
			||||||
	unsigned long retcode;
 | 
						unsigned long retcode;
 | 
				
			||||||
	int thumb = 0;
 | 
						int thumb = 0;
 | 
				
			||||||
	unsigned long cpsr = regs->ARM_cpsr & ~PSR_f;
 | 
						unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cpsr |= PSR_ENDSTATE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Maybe we need to deliver a 32-bit signal to a 26-bit task.
 | 
						 * Maybe we need to deliver a 32-bit signal to a 26-bit task.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,12 @@
 | 
				
			||||||
#define ARM_CPU_KEEP(x)
 | 
					#define ARM_CPU_KEEP(x)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)
 | 
				
			||||||
 | 
					#define ARM_EXIT_KEEP(x)	x
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define ARM_EXIT_KEEP(x)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OUTPUT_ARCH(arm)
 | 
					OUTPUT_ARCH(arm)
 | 
				
			||||||
ENTRY(stext)
 | 
					ENTRY(stext)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,6 +49,7 @@ SECTIONS
 | 
				
			||||||
		_sinittext = .;
 | 
							_sinittext = .;
 | 
				
			||||||
			HEAD_TEXT
 | 
								HEAD_TEXT
 | 
				
			||||||
			INIT_TEXT
 | 
								INIT_TEXT
 | 
				
			||||||
 | 
								ARM_EXIT_KEEP(EXIT_TEXT)
 | 
				
			||||||
		_einittext = .;
 | 
							_einittext = .;
 | 
				
			||||||
		ARM_CPU_DISCARD(PROC_INFO)
 | 
							ARM_CPU_DISCARD(PROC_INFO)
 | 
				
			||||||
		__arch_info_begin = .;
 | 
							__arch_info_begin = .;
 | 
				
			||||||
| 
						 | 
					@ -67,6 +74,7 @@ SECTIONS
 | 
				
			||||||
#ifndef CONFIG_XIP_KERNEL
 | 
					#ifndef CONFIG_XIP_KERNEL
 | 
				
			||||||
		__init_begin = _stext;
 | 
							__init_begin = _stext;
 | 
				
			||||||
		INIT_DATA
 | 
							INIT_DATA
 | 
				
			||||||
 | 
							ARM_EXIT_KEEP(EXIT_DATA)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -162,6 +170,7 @@ SECTIONS
 | 
				
			||||||
		. = ALIGN(PAGE_SIZE);
 | 
							. = ALIGN(PAGE_SIZE);
 | 
				
			||||||
		__init_begin = .;
 | 
							__init_begin = .;
 | 
				
			||||||
		INIT_DATA
 | 
							INIT_DATA
 | 
				
			||||||
 | 
							ARM_EXIT_KEEP(EXIT_DATA)
 | 
				
			||||||
		. = ALIGN(PAGE_SIZE);
 | 
							. = ALIGN(PAGE_SIZE);
 | 
				
			||||||
		__init_end = .;
 | 
							__init_end = .;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -247,6 +256,8 @@ SECTIONS
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						NOTES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BSS_SECTION(0, 0, 0)
 | 
						BSS_SECTION(0, 0, 0)
 | 
				
			||||||
	_end = .;
 | 
						_end = .;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
/* linux/arch/arm/mach-s5p6442/include/mach/map.h
 | 
					/* linux/arch/arm/mach-s5p6442/include/mach/map.h
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
 | 
					 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
 | 
				
			||||||
 *		http://www.samsung.com/
 | 
					 *		http://www.samsung.com/
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * S5P6442 - Memory map definitions
 | 
					 * S5P6442 - Memory map definitions
 | 
				
			||||||
| 
						 | 
					@ -16,56 +16,61 @@
 | 
				
			||||||
#include <plat/map-base.h>
 | 
					#include <plat/map-base.h>
 | 
				
			||||||
#include <plat/map-s5p.h>
 | 
					#include <plat/map-s5p.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_CHIPID	(0xE0000000)
 | 
					#define S5P6442_PA_SDRAM	0x20000000
 | 
				
			||||||
#define S5P_PA_CHIPID		S5P6442_PA_CHIPID
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_SYSCON	(0xE0100000)
 | 
					#define S5P6442_PA_I2S0		0xC0B00000
 | 
				
			||||||
#define S5P_PA_SYSCON		S5P6442_PA_SYSCON
 | 
					#define S5P6442_PA_I2S1		0xF2200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_GPIO		(0xE0200000)
 | 
					#define S5P6442_PA_CHIPID	0xE0000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_VIC0		(0xE4000000)
 | 
					#define S5P6442_PA_SYSCON	0xE0100000
 | 
				
			||||||
#define S5P6442_PA_VIC1		(0xE4100000)
 | 
					 | 
				
			||||||
#define S5P6442_PA_VIC2		(0xE4200000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_SROMC	(0xE7000000)
 | 
					#define S5P6442_PA_GPIO		0xE0200000
 | 
				
			||||||
#define S5P_PA_SROMC		S5P6442_PA_SROMC
 | 
					
 | 
				
			||||||
 | 
					#define S5P6442_PA_VIC0		0xE4000000
 | 
				
			||||||
 | 
					#define S5P6442_PA_VIC1		0xE4100000
 | 
				
			||||||
 | 
					#define S5P6442_PA_VIC2		0xE4200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P6442_PA_SROMC	0xE7000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_MDMA		0xE8000000
 | 
					#define S5P6442_PA_MDMA		0xE8000000
 | 
				
			||||||
#define S5P6442_PA_PDMA		0xE9000000
 | 
					#define S5P6442_PA_PDMA		0xE9000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_TIMER	(0xEA000000)
 | 
					#define S5P6442_PA_TIMER	0xEA000000
 | 
				
			||||||
#define S5P_PA_TIMER		S5P6442_PA_TIMER
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_SYSTIMER   	(0xEA100000)
 | 
					#define S5P6442_PA_SYSTIMER	0xEA100000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_WATCHDOG	(0xEA200000)
 | 
					#define S5P6442_PA_WATCHDOG	0xEA200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_UART		(0xEC000000)
 | 
					#define S5P6442_PA_UART		0xEC000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P_PA_UART0		(S5P6442_PA_UART + 0x0)
 | 
					#define S5P6442_PA_IIC0		0xEC100000
 | 
				
			||||||
#define S5P_PA_UART1		(S5P6442_PA_UART + 0x400)
 | 
					 | 
				
			||||||
#define S5P_PA_UART2		(S5P6442_PA_UART + 0x800)
 | 
					 | 
				
			||||||
#define S5P_SZ_UART		SZ_256
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P6442_PA_IIC0		(0xEC100000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P6442_PA_SDRAM	(0x20000000)
 | 
					 | 
				
			||||||
#define S5P_PA_SDRAM		S5P6442_PA_SDRAM
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6442_PA_SPI		0xEC300000
 | 
					#define S5P6442_PA_SPI		0xEC300000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* I2S */
 | 
					 | 
				
			||||||
#define S5P6442_PA_I2S0		0xC0B00000
 | 
					 | 
				
			||||||
#define S5P6442_PA_I2S1		0xF2200000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* PCM */
 | 
					 | 
				
			||||||
#define S5P6442_PA_PCM0		0xF2400000
 | 
					#define S5P6442_PA_PCM0		0xF2400000
 | 
				
			||||||
#define S5P6442_PA_PCM1		0xF2500000
 | 
					#define S5P6442_PA_PCM1		0xF2500000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* compatibiltiy defines. */
 | 
					/* Compatibiltiy Defines */
 | 
				
			||||||
#define S3C_PA_WDT		S5P6442_PA_WATCHDOG
 | 
					
 | 
				
			||||||
#define S3C_PA_UART		S5P6442_PA_UART
 | 
					 | 
				
			||||||
#define S3C_PA_IIC		S5P6442_PA_IIC0
 | 
					#define S3C_PA_IIC		S5P6442_PA_IIC0
 | 
				
			||||||
 | 
					#define S3C_PA_WDT		S5P6442_PA_WATCHDOG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P_PA_CHIPID		S5P6442_PA_CHIPID
 | 
				
			||||||
 | 
					#define S5P_PA_SDRAM		S5P6442_PA_SDRAM
 | 
				
			||||||
 | 
					#define S5P_PA_SROMC		S5P6442_PA_SROMC
 | 
				
			||||||
 | 
					#define S5P_PA_SYSCON		S5P6442_PA_SYSCON
 | 
				
			||||||
 | 
					#define S5P_PA_TIMER		S5P6442_PA_TIMER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* UART */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S3C_PA_UART		S5P6442_PA_UART
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P_PA_UART(x)		(S3C_PA_UART + ((x) * S3C_UART_OFFSET))
 | 
				
			||||||
 | 
					#define S5P_PA_UART0		S5P_PA_UART(0)
 | 
				
			||||||
 | 
					#define S5P_PA_UART1		S5P_PA_UART(1)
 | 
				
			||||||
 | 
					#define S5P_PA_UART2		S5P_PA_UART(2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P_SZ_UART		SZ_256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __ASM_ARCH_MAP_H */
 | 
					#endif /* __ASM_ARCH_MAP_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
/* linux/arch/arm/mach-s5p64x0/include/mach/map.h
 | 
					/* linux/arch/arm/mach-s5p64x0/include/mach/map.h
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
 | 
					 * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd.
 | 
				
			||||||
 *		http://www.samsung.com
 | 
					 *		http://www.samsung.com
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * S5P64X0 - Memory map definitions
 | 
					 * S5P64X0 - Memory map definitions
 | 
				
			||||||
| 
						 | 
					@ -16,30 +16,63 @@
 | 
				
			||||||
#include <plat/map-base.h>
 | 
					#include <plat/map-base.h>
 | 
				
			||||||
#include <plat/map-s5p.h>
 | 
					#include <plat/map-s5p.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P64X0_PA_SDRAM	(0x20000000)
 | 
					#define S5P64X0_PA_SDRAM	0x20000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_CHIPID	0xE0000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_SYSCON	0xE0100000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_GPIO		0xE0308000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_VIC0		0xE4000000
 | 
				
			||||||
 | 
					#define S5P64X0_PA_VIC1		0xE4100000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_SROMC	0xE7000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_PDMA		0xE9000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_TIMER	0xEA000000
 | 
				
			||||||
 | 
					#define S5P64X0_PA_RTC		0xEA100000
 | 
				
			||||||
 | 
					#define S5P64X0_PA_WDT		0xEA200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P6440_PA_IIC0		0xEC104000
 | 
				
			||||||
 | 
					#define S5P6440_PA_IIC1		0xEC20F000
 | 
				
			||||||
 | 
					#define S5P6450_PA_IIC0		0xEC100000
 | 
				
			||||||
 | 
					#define S5P6450_PA_IIC1		0xEC200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_SPI0		0xEC400000
 | 
				
			||||||
 | 
					#define S5P64X0_PA_SPI1		0xEC500000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_HSOTG	0xED100000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_HSMMC(x)	(0xED800000 + ((x) * 0x100000))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_I2S		0xF2000000
 | 
				
			||||||
 | 
					#define S5P6450_PA_I2S1		0xF2800000
 | 
				
			||||||
 | 
					#define S5P6450_PA_I2S2		0xF2900000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_PCM		0xF2100000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P64X0_PA_ADC		0xF3000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Compatibiltiy Defines */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S3C_PA_HSMMC0		S5P64X0_PA_HSMMC(0)
 | 
				
			||||||
 | 
					#define S3C_PA_HSMMC1		S5P64X0_PA_HSMMC(1)
 | 
				
			||||||
 | 
					#define S3C_PA_HSMMC2		S5P64X0_PA_HSMMC(2)
 | 
				
			||||||
 | 
					#define S3C_PA_IIC		S5P6440_PA_IIC0
 | 
				
			||||||
 | 
					#define S3C_PA_IIC1		S5P6440_PA_IIC1
 | 
				
			||||||
 | 
					#define S3C_PA_RTC		S5P64X0_PA_RTC
 | 
				
			||||||
 | 
					#define S3C_PA_WDT		S5P64X0_PA_WDT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P64X0_PA_CHIPID	(0xE0000000)
 | 
					 | 
				
			||||||
#define S5P_PA_CHIPID		S5P64X0_PA_CHIPID
 | 
					#define S5P_PA_CHIPID		S5P64X0_PA_CHIPID
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_SYSCON	(0xE0100000)
 | 
					 | 
				
			||||||
#define S5P_PA_SYSCON		S5P64X0_PA_SYSCON
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_GPIO		(0xE0308000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_VIC0		(0xE4000000)
 | 
					 | 
				
			||||||
#define S5P64X0_PA_VIC1		(0xE4100000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_SROMC	(0xE7000000)
 | 
					 | 
				
			||||||
#define S5P_PA_SROMC		S5P64X0_PA_SROMC
 | 
					#define S5P_PA_SROMC		S5P64X0_PA_SROMC
 | 
				
			||||||
 | 
					#define S5P_PA_SYSCON		S5P64X0_PA_SYSCON
 | 
				
			||||||
#define S5P64X0_PA_PDMA		(0xE9000000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_TIMER	(0xEA000000)
 | 
					 | 
				
			||||||
#define S5P_PA_TIMER		S5P64X0_PA_TIMER
 | 
					#define S5P_PA_TIMER		S5P64X0_PA_TIMER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P64X0_PA_RTC		(0xEA100000)
 | 
					#define SAMSUNG_PA_ADC		S5P64X0_PA_ADC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P64X0_PA_WDT		(0xEA200000)
 | 
					/* UART */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6440_PA_UART(x)	(0xEC000000 + ((x) * S3C_UART_OFFSET))
 | 
					#define S5P6440_PA_UART(x)	(0xEC000000 + ((x) * S3C_UART_OFFSET))
 | 
				
			||||||
#define S5P6450_PA_UART(x)	((x < 5) ? (0xEC800000 + ((x) * S3C_UART_OFFSET)) : (0xEC000000))
 | 
					#define S5P6450_PA_UART(x)	((x < 5) ? (0xEC800000 + ((x) * S3C_UART_OFFSET)) : (0xEC000000))
 | 
				
			||||||
| 
						 | 
					@ -53,36 +86,4 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P_SZ_UART		SZ_256
 | 
					#define S5P_SZ_UART		SZ_256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P6440_PA_IIC0		(0xEC104000)
 | 
					 | 
				
			||||||
#define S5P6440_PA_IIC1		(0xEC20F000)
 | 
					 | 
				
			||||||
#define S5P6450_PA_IIC0		(0xEC100000)
 | 
					 | 
				
			||||||
#define S5P6450_PA_IIC1		(0xEC200000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_SPI0		(0xEC400000)
 | 
					 | 
				
			||||||
#define S5P64X0_PA_SPI1		(0xEC500000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_HSOTG	(0xED100000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_HSMMC(x)	(0xED800000 + ((x) * 0x100000))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_I2S		(0xF2000000)
 | 
					 | 
				
			||||||
#define S5P6450_PA_I2S1		0xF2800000
 | 
					 | 
				
			||||||
#define S5P6450_PA_I2S2		0xF2900000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_PCM		(0xF2100000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P64X0_PA_ADC		(0xF3000000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* compatibiltiy defines. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC0		S5P64X0_PA_HSMMC(0)
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC1		S5P64X0_PA_HSMMC(1)
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC2		S5P64X0_PA_HSMMC(2)
 | 
					 | 
				
			||||||
#define S3C_PA_IIC		S5P6440_PA_IIC0
 | 
					 | 
				
			||||||
#define S3C_PA_IIC1		S5P6440_PA_IIC1
 | 
					 | 
				
			||||||
#define S3C_PA_RTC		S5P64X0_PA_RTC
 | 
					 | 
				
			||||||
#define S3C_PA_WDT		S5P64X0_PA_WDT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SAMSUNG_PA_ADC		S5P64X0_PA_ADC
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* __ASM_ARCH_MAP_H */
 | 
					#endif /* __ASM_ARCH_MAP_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,7 @@
 | 
				
			||||||
/* linux/arch/arm/mach-s5pc100/include/mach/map.h
 | 
					/* linux/arch/arm/mach-s5pc100/include/mach/map.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
 | 
				
			||||||
 | 
					 *		http://www.samsung.com/
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Copyright 2009 Samsung Electronics Co.
 | 
					 * Copyright 2009 Samsung Electronics Co.
 | 
				
			||||||
 *	Byungho Min <bhmin@samsung.com>
 | 
					 *	Byungho Min <bhmin@samsung.com>
 | 
				
			||||||
| 
						 | 
					@ -16,145 +19,115 @@
 | 
				
			||||||
#include <plat/map-base.h>
 | 
					#include <plat/map-base.h>
 | 
				
			||||||
#include <plat/map-s5p.h>
 | 
					#include <plat/map-s5p.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					#define S5PC100_PA_SDRAM		0x20000000
 | 
				
			||||||
 * map-base.h has already defined virtual memory address
 | 
					 | 
				
			||||||
 * S3C_VA_IRQ		S3C_ADDR(0x00000000)	irq controller(s)
 | 
					 | 
				
			||||||
 * S3C_VA_SYS		S3C_ADDR(0x00100000)	system control
 | 
					 | 
				
			||||||
 * S3C_VA_MEM		S3C_ADDR(0x00200000)	system control (not used)
 | 
					 | 
				
			||||||
 * S3C_VA_TIMER		S3C_ADDR(0x00300000)	timer block
 | 
					 | 
				
			||||||
 * S3C_VA_WATCHDOG	S3C_ADDR(0x00400000)	watchdog
 | 
					 | 
				
			||||||
 * S3C_VA_UART		S3C_ADDR(0x01000000)	UART
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * S5PC100 specific virtual memory address can be defined here
 | 
					 | 
				
			||||||
 * S5PC1XX_VA_GPIO	S3C_ADDR(0x00500000)	GPIO
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_ONENAND_BUF	(0xB0000000)
 | 
					#define S5PC100_PA_ONENAND		0xE7100000
 | 
				
			||||||
#define S5PC100_SZ_ONENAND_BUF	(SZ_256M - SZ_32M)
 | 
					#define S5PC100_PA_ONENAND_BUF		0xB0000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Chip ID */
 | 
					#define S5PC100_PA_CHIPID		0xE0000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_CHIPID	(0xE0000000)
 | 
					#define S5PC100_PA_SYSCON		0xE0100000
 | 
				
			||||||
#define S5P_PA_CHIPID		S5PC100_PA_CHIPID
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_SYSCON	(0xE0100000)
 | 
					#define S5PC100_PA_OTHERS		0xE0200000
 | 
				
			||||||
#define S5P_PA_SYSCON		S5PC100_PA_SYSCON
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_OTHERS	(0xE0200000)
 | 
					#define S5PC100_PA_GPIO			0xE0300000
 | 
				
			||||||
#define S5PC100_VA_OTHERS	(S3C_VA_SYS + 0x10000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_GPIO		(0xE0300000)
 | 
					#define S5PC100_PA_VIC0			0xE4000000
 | 
				
			||||||
#define S5PC1XX_VA_GPIO		S3C_ADDR(0x00500000)
 | 
					#define S5PC100_PA_VIC1			0xE4100000
 | 
				
			||||||
 | 
					#define S5PC100_PA_VIC2			0xE4200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Interrupt */
 | 
					#define S5PC100_PA_SROMC		0xE7000000
 | 
				
			||||||
#define S5PC100_PA_VIC0		(0xE4000000)
 | 
					 | 
				
			||||||
#define S5PC100_PA_VIC1		(0xE4100000)
 | 
					 | 
				
			||||||
#define S5PC100_PA_VIC2		(0xE4200000)
 | 
					 | 
				
			||||||
#define S5PC100_VA_VIC		S3C_VA_IRQ
 | 
					 | 
				
			||||||
#define S5PC100_VA_VIC_OFFSET	0x10000
 | 
					 | 
				
			||||||
#define S5PC1XX_VA_VIC(x)	(S5PC100_VA_VIC + ((x) * S5PC100_VA_VIC_OFFSET))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_SROMC	(0xE7000000)
 | 
					#define S5PC100_PA_CFCON		0xE7800000
 | 
				
			||||||
#define S5P_PA_SROMC		S5PC100_PA_SROMC
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_ONENAND	(0xE7100000)
 | 
					#define S5PC100_PA_MDMA			0xE8100000
 | 
				
			||||||
 | 
					#define S5PC100_PA_PDMA0		0xE9000000
 | 
				
			||||||
 | 
					#define S5PC100_PA_PDMA1		0xE9200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_CFCON	(0xE7800000)
 | 
					#define S5PC100_PA_TIMER		0xEA000000
 | 
				
			||||||
 | 
					#define S5PC100_PA_SYSTIMER		0xEA100000
 | 
				
			||||||
 | 
					#define S5PC100_PA_WATCHDOG		0xEA200000
 | 
				
			||||||
 | 
					#define S5PC100_PA_RTC			0xEA300000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* DMA */
 | 
					#define S5PC100_PA_UART			0xEC000000
 | 
				
			||||||
#define S5PC100_PA_MDMA		(0xE8100000)
 | 
					 | 
				
			||||||
#define S5PC100_PA_PDMA0	(0xE9000000)
 | 
					 | 
				
			||||||
#define S5PC100_PA_PDMA1	(0xE9200000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Timer */
 | 
					#define S5PC100_PA_IIC0			0xEC100000
 | 
				
			||||||
#define S5PC100_PA_TIMER	(0xEA000000)
 | 
					#define S5PC100_PA_IIC1			0xEC200000
 | 
				
			||||||
#define S5P_PA_TIMER		S5PC100_PA_TIMER
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_SYSTIMER	(0xEA100000)
 | 
					#define S5PC100_PA_SPI0			0xEC300000
 | 
				
			||||||
 | 
					#define S5PC100_PA_SPI1			0xEC400000
 | 
				
			||||||
 | 
					#define S5PC100_PA_SPI2			0xEC500000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_WATCHDOG	(0xEA200000)
 | 
					#define S5PC100_PA_USB_HSOTG		0xED200000
 | 
				
			||||||
#define S5PC100_PA_RTC		(0xEA300000)
 | 
					#define S5PC100_PA_USB_HSPHY		0xED300000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_UART		(0xEC000000)
 | 
					#define S5PC100_PA_HSMMC(x)		(0xED800000 + ((x) * 0x100000))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P_PA_UART0		(S5PC100_PA_UART + 0x0)
 | 
					#define S5PC100_PA_FB			0xEE000000
 | 
				
			||||||
#define S5P_PA_UART1		(S5PC100_PA_UART + 0x400)
 | 
					 | 
				
			||||||
#define S5P_PA_UART2		(S5PC100_PA_UART + 0x800)
 | 
					 | 
				
			||||||
#define S5P_PA_UART3		(S5PC100_PA_UART + 0xC00)
 | 
					 | 
				
			||||||
#define S5P_SZ_UART		SZ_256
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_IIC0		(0xEC100000)
 | 
					#define S5PC100_PA_FIMC0		0xEE200000
 | 
				
			||||||
#define S5PC100_PA_IIC1		(0xEC200000)
 | 
					#define S5PC100_PA_FIMC1		0xEE300000
 | 
				
			||||||
 | 
					#define S5PC100_PA_FIMC2		0xEE400000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* SPI */
 | 
					#define S5PC100_PA_I2S0			0xF2000000
 | 
				
			||||||
#define S5PC100_PA_SPI0		0xEC300000
 | 
					#define S5PC100_PA_I2S1			0xF2100000
 | 
				
			||||||
#define S5PC100_PA_SPI1		0xEC400000
 | 
					#define S5PC100_PA_I2S2			0xF2200000
 | 
				
			||||||
#define S5PC100_PA_SPI2		0xEC500000
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* USB HS OTG */
 | 
					#define S5PC100_PA_AC97			0xF2300000
 | 
				
			||||||
#define S5PC100_PA_USB_HSOTG	(0xED200000)
 | 
					 | 
				
			||||||
#define S5PC100_PA_USB_HSPHY	(0xED300000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_FB		(0xEE000000)
 | 
					#define S5PC100_PA_PCM0			0xF2400000
 | 
				
			||||||
 | 
					#define S5PC100_PA_PCM1			0xF2500000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_FIMC0	(0xEE200000)
 | 
					#define S5PC100_PA_SPDIF		0xF2600000
 | 
				
			||||||
#define S5PC100_PA_FIMC1	(0xEE300000)
 | 
					 | 
				
			||||||
#define S5PC100_PA_FIMC2	(0xEE400000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_I2S0		(0xF2000000)
 | 
					#define S5PC100_PA_TSADC		0xF3000000
 | 
				
			||||||
#define S5PC100_PA_I2S1		(0xF2100000)
 | 
					 | 
				
			||||||
#define S5PC100_PA_I2S2		(0xF2200000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_AC97		0xF2300000
 | 
					#define S5PC100_PA_KEYPAD		0xF3100000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PCM */
 | 
					/* Compatibiltiy Defines */
 | 
				
			||||||
#define S5PC100_PA_PCM0		0xF2400000
 | 
					 | 
				
			||||||
#define S5PC100_PA_PCM1		0xF2500000
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_SPDIF	0xF2600000
 | 
					#define S3C_PA_FB			S5PC100_PA_FB
 | 
				
			||||||
 | 
					#define S3C_PA_HSMMC0			S5PC100_PA_HSMMC(0)
 | 
				
			||||||
 | 
					#define S3C_PA_HSMMC1			S5PC100_PA_HSMMC(1)
 | 
				
			||||||
 | 
					#define S3C_PA_HSMMC2			S5PC100_PA_HSMMC(2)
 | 
				
			||||||
 | 
					#define S3C_PA_IIC			S5PC100_PA_IIC0
 | 
				
			||||||
 | 
					#define S3C_PA_IIC1			S5PC100_PA_IIC1
 | 
				
			||||||
 | 
					#define S3C_PA_KEYPAD			S5PC100_PA_KEYPAD
 | 
				
			||||||
 | 
					#define S3C_PA_ONENAND			S5PC100_PA_ONENAND
 | 
				
			||||||
 | 
					#define S3C_PA_ONENAND_BUF		S5PC100_PA_ONENAND_BUF
 | 
				
			||||||
 | 
					#define S3C_PA_RTC			S5PC100_PA_RTC
 | 
				
			||||||
 | 
					#define S3C_PA_TSADC			S5PC100_PA_TSADC
 | 
				
			||||||
 | 
					#define S3C_PA_USB_HSOTG		S5PC100_PA_USB_HSOTG
 | 
				
			||||||
 | 
					#define S3C_PA_USB_HSPHY		S5PC100_PA_USB_HSPHY
 | 
				
			||||||
 | 
					#define S3C_PA_WDT			S5PC100_PA_WATCHDOG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_TSADC	(0xF3000000)
 | 
					#define S5P_PA_CHIPID			S5PC100_PA_CHIPID
 | 
				
			||||||
 | 
					#define S5P_PA_FIMC0			S5PC100_PA_FIMC0
 | 
				
			||||||
 | 
					#define S5P_PA_FIMC1			S5PC100_PA_FIMC1
 | 
				
			||||||
 | 
					#define S5P_PA_FIMC2			S5PC100_PA_FIMC2
 | 
				
			||||||
 | 
					#define S5P_PA_SDRAM			S5PC100_PA_SDRAM
 | 
				
			||||||
 | 
					#define S5P_PA_SROMC			S5PC100_PA_SROMC
 | 
				
			||||||
 | 
					#define S5P_PA_SYSCON			S5PC100_PA_SYSCON
 | 
				
			||||||
 | 
					#define S5P_PA_TIMER			S5PC100_PA_TIMER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* KEYPAD */
 | 
					#define SAMSUNG_PA_ADC			S5PC100_PA_TSADC
 | 
				
			||||||
#define S5PC100_PA_KEYPAD	(0xF3100000)
 | 
					#define SAMSUNG_PA_CFCON		S5PC100_PA_CFCON
 | 
				
			||||||
 | 
					#define SAMSUNG_PA_KEYPAD		S5PC100_PA_KEYPAD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_HSMMC(x)	(0xED800000 + ((x) * 0x100000))
 | 
					#define S5PC100_VA_OTHERS		(S3C_VA_SYS + 0x10000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC100_PA_SDRAM	(0x20000000)
 | 
					#define S3C_SZ_ONENAND_BUF		(SZ_256M - SZ_32M)
 | 
				
			||||||
#define S5P_PA_SDRAM		S5PC100_PA_SDRAM
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* compatibiltiy defines. */
 | 
					/* UART */
 | 
				
			||||||
#define S3C_PA_UART		S5PC100_PA_UART
 | 
					 | 
				
			||||||
#define S3C_PA_IIC		S5PC100_PA_IIC0
 | 
					 | 
				
			||||||
#define S3C_PA_IIC1		S5PC100_PA_IIC1
 | 
					 | 
				
			||||||
#define S3C_PA_FB		S5PC100_PA_FB
 | 
					 | 
				
			||||||
#define S3C_PA_G2D		S5PC100_PA_G2D
 | 
					 | 
				
			||||||
#define S3C_PA_G3D		S5PC100_PA_G3D
 | 
					 | 
				
			||||||
#define S3C_PA_JPEG		S5PC100_PA_JPEG
 | 
					 | 
				
			||||||
#define S3C_PA_ROTATOR		S5PC100_PA_ROTATOR
 | 
					 | 
				
			||||||
#define S5P_VA_VIC0		S5PC1XX_VA_VIC(0)
 | 
					 | 
				
			||||||
#define S5P_VA_VIC1		S5PC1XX_VA_VIC(1)
 | 
					 | 
				
			||||||
#define S5P_VA_VIC2		S5PC1XX_VA_VIC(2)
 | 
					 | 
				
			||||||
#define S3C_PA_USB_HSOTG	S5PC100_PA_USB_HSOTG
 | 
					 | 
				
			||||||
#define S3C_PA_USB_HSPHY	S5PC100_PA_USB_HSPHY
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC0		S5PC100_PA_HSMMC(0)
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC1		S5PC100_PA_HSMMC(1)
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC2		S5PC100_PA_HSMMC(2)
 | 
					 | 
				
			||||||
#define S3C_PA_KEYPAD		S5PC100_PA_KEYPAD
 | 
					 | 
				
			||||||
#define S3C_PA_WDT		S5PC100_PA_WATCHDOG
 | 
					 | 
				
			||||||
#define S3C_PA_TSADC		S5PC100_PA_TSADC
 | 
					 | 
				
			||||||
#define S3C_PA_ONENAND		S5PC100_PA_ONENAND
 | 
					 | 
				
			||||||
#define S3C_PA_ONENAND_BUF	S5PC100_PA_ONENAND_BUF
 | 
					 | 
				
			||||||
#define S3C_SZ_ONENAND_BUF	S5PC100_SZ_ONENAND_BUF
 | 
					 | 
				
			||||||
#define S3C_PA_RTC		S5PC100_PA_RTC
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SAMSUNG_PA_ADC		S5PC100_PA_TSADC
 | 
					#define S3C_PA_UART			S5PC100_PA_UART
 | 
				
			||||||
#define SAMSUNG_PA_CFCON	S5PC100_PA_CFCON
 | 
					 | 
				
			||||||
#define SAMSUNG_PA_KEYPAD	S5PC100_PA_KEYPAD
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P_PA_FIMC0		S5PC100_PA_FIMC0
 | 
					#define S5P_PA_UART(x)			(S3C_PA_UART + ((x) * S3C_UART_OFFSET))
 | 
				
			||||||
#define S5P_PA_FIMC1		S5PC100_PA_FIMC1
 | 
					#define S5P_PA_UART0			S5P_PA_UART(0)
 | 
				
			||||||
#define S5P_PA_FIMC2		S5PC100_PA_FIMC2
 | 
					#define S5P_PA_UART1			S5P_PA_UART(1)
 | 
				
			||||||
 | 
					#define S5P_PA_UART2			S5P_PA_UART(2)
 | 
				
			||||||
 | 
					#define S5P_PA_UART3			S5P_PA_UART(3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __ASM_ARCH_C100_MAP_H */
 | 
					#define S5P_SZ_UART			SZ_256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __ASM_ARCH_MAP_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
/* linux/arch/arm/mach-s5pv210/include/mach/map.h
 | 
					/* linux/arch/arm/mach-s5pv210/include/mach/map.h
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
 | 
					 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
 | 
				
			||||||
 *		http://www.samsung.com/
 | 
					 *		http://www.samsung.com/
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * S5PV210 - Memory map definitions
 | 
					 * S5PV210 - Memory map definitions
 | 
				
			||||||
| 
						 | 
					@ -16,122 +16,120 @@
 | 
				
			||||||
#include <plat/map-base.h>
 | 
					#include <plat/map-base.h>
 | 
				
			||||||
#include <plat/map-s5p.h>
 | 
					#include <plat/map-s5p.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_SROM_BANK5	(0xA8000000)
 | 
					#define S5PV210_PA_SDRAM		0x20000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC110_PA_ONENAND	(0xB0000000)
 | 
					#define S5PV210_PA_SROM_BANK5		0xA8000000
 | 
				
			||||||
#define S5P_PA_ONENAND		S5PC110_PA_ONENAND
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC110_PA_ONENAND_DMA	(0xB0600000)
 | 
					#define S5PC110_PA_ONENAND		0xB0000000
 | 
				
			||||||
#define S5P_PA_ONENAND_DMA	S5PC110_PA_ONENAND_DMA
 | 
					#define S5PC110_PA_ONENAND_DMA		0xB0600000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_CHIPID	(0xE0000000)
 | 
					#define S5PV210_PA_CHIPID		0xE0000000
 | 
				
			||||||
#define S5P_PA_CHIPID		S5PV210_PA_CHIPID
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_SYSCON	(0xE0100000)
 | 
					#define S5PV210_PA_SYSCON		0xE0100000
 | 
				
			||||||
#define S5P_PA_SYSCON		S5PV210_PA_SYSCON
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_GPIO		(0xE0200000)
 | 
					#define S5PV210_PA_GPIO			0xE0200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* SPI */
 | 
					#define S5PV210_PA_SPDIF		0xE1100000
 | 
				
			||||||
#define S5PV210_PA_SPI0		0xE1300000
 | 
					 | 
				
			||||||
#define S5PV210_PA_SPI1		0xE1400000
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_KEYPAD	(0xE1600000)
 | 
					#define S5PV210_PA_SPI0			0xE1300000
 | 
				
			||||||
 | 
					#define S5PV210_PA_SPI1			0xE1400000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_IIC0		(0xE1800000)
 | 
					#define S5PV210_PA_KEYPAD		0xE1600000
 | 
				
			||||||
#define S5PV210_PA_IIC1		(0xFAB00000)
 | 
					 | 
				
			||||||
#define S5PV210_PA_IIC2		(0xE1A00000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_TIMER	(0xE2500000)
 | 
					#define S5PV210_PA_ADC			0xE1700000
 | 
				
			||||||
#define S5P_PA_TIMER		S5PV210_PA_TIMER
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_SYSTIMER	(0xE2600000)
 | 
					#define S5PV210_PA_IIC0			0xE1800000
 | 
				
			||||||
 | 
					#define S5PV210_PA_IIC1			0xFAB00000
 | 
				
			||||||
 | 
					#define S5PV210_PA_IIC2			0xE1A00000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_WATCHDOG	(0xE2700000)
 | 
					#define S5PV210_PA_AC97			0xE2200000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_RTC		(0xE2800000)
 | 
					#define S5PV210_PA_PCM0			0xE2300000
 | 
				
			||||||
#define S5PV210_PA_UART		(0xE2900000)
 | 
					#define S5PV210_PA_PCM1			0xE1200000
 | 
				
			||||||
 | 
					#define S5PV210_PA_PCM2			0xE2B00000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P_PA_UART0		(S5PV210_PA_UART + 0x0)
 | 
					#define S5PV210_PA_TIMER		0xE2500000
 | 
				
			||||||
#define S5P_PA_UART1		(S5PV210_PA_UART + 0x400)
 | 
					#define S5PV210_PA_SYSTIMER		0xE2600000
 | 
				
			||||||
#define S5P_PA_UART2		(S5PV210_PA_UART + 0x800)
 | 
					#define S5PV210_PA_WATCHDOG		0xE2700000
 | 
				
			||||||
#define S5P_PA_UART3		(S5PV210_PA_UART + 0xC00)
 | 
					#define S5PV210_PA_RTC			0xE2800000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5P_SZ_UART		SZ_256
 | 
					#define S5PV210_PA_UART			0xE2900000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S3C_VA_UARTx(x)		(S3C_VA_UART + ((x) * S3C_UART_OFFSET))
 | 
					#define S5PV210_PA_SROMC		0xE8000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_SROMC	(0xE8000000)
 | 
					#define S5PV210_PA_CFCON		0xE8200000
 | 
				
			||||||
#define S5P_PA_SROMC		S5PV210_PA_SROMC
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_CFCON	(0xE8200000)
 | 
					#define S5PV210_PA_HSMMC(x)		(0xEB000000 + ((x) * 0x100000))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_MDMA		0xFA200000
 | 
					#define S5PV210_PA_HSOTG		0xEC000000
 | 
				
			||||||
#define S5PV210_PA_PDMA0	0xE0900000
 | 
					#define S5PV210_PA_HSPHY		0xEC100000
 | 
				
			||||||
#define S5PV210_PA_PDMA1	0xE0A00000
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_FB		(0xF8000000)
 | 
					#define S5PV210_PA_IIS0			0xEEE30000
 | 
				
			||||||
 | 
					#define S5PV210_PA_IIS1			0xE2100000
 | 
				
			||||||
 | 
					#define S5PV210_PA_IIS2			0xE2A00000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_FIMC0	(0xFB200000)
 | 
					#define S5PV210_PA_DMC0			0xF0000000
 | 
				
			||||||
#define S5PV210_PA_FIMC1	(0xFB300000)
 | 
					#define S5PV210_PA_DMC1			0xF1400000
 | 
				
			||||||
#define S5PV210_PA_FIMC2	(0xFB400000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_HSMMC(x)	(0xEB000000 + ((x) * 0x100000))
 | 
					#define S5PV210_PA_VIC0			0xF2000000
 | 
				
			||||||
 | 
					#define S5PV210_PA_VIC1			0xF2100000
 | 
				
			||||||
 | 
					#define S5PV210_PA_VIC2			0xF2200000
 | 
				
			||||||
 | 
					#define S5PV210_PA_VIC3			0xF2300000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_HSOTG	(0xEC000000)
 | 
					#define S5PV210_PA_FB			0xF8000000
 | 
				
			||||||
#define S5PV210_PA_HSPHY	(0xEC100000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_VIC0		(0xF2000000)
 | 
					#define S5PV210_PA_MDMA			0xFA200000
 | 
				
			||||||
#define S5PV210_PA_VIC1		(0xF2100000)
 | 
					#define S5PV210_PA_PDMA0		0xE0900000
 | 
				
			||||||
#define S5PV210_PA_VIC2		(0xF2200000)
 | 
					#define S5PV210_PA_PDMA1		0xE0A00000
 | 
				
			||||||
#define S5PV210_PA_VIC3		(0xF2300000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_SDRAM	(0x20000000)
 | 
					#define S5PV210_PA_MIPI_CSIS		0xFA600000
 | 
				
			||||||
#define S5P_PA_SDRAM		S5PV210_PA_SDRAM
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* S/PDIF */
 | 
					#define S5PV210_PA_FIMC0		0xFB200000
 | 
				
			||||||
#define S5PV210_PA_SPDIF	0xE1100000
 | 
					#define S5PV210_PA_FIMC1		0xFB300000
 | 
				
			||||||
 | 
					#define S5PV210_PA_FIMC2		0xFB400000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* I2S */
 | 
					/* Compatibiltiy Defines */
 | 
				
			||||||
#define S5PV210_PA_IIS0		0xEEE30000
 | 
					 | 
				
			||||||
#define S5PV210_PA_IIS1		0xE2100000
 | 
					 | 
				
			||||||
#define S5PV210_PA_IIS2		0xE2A00000
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PCM */
 | 
					#define S3C_PA_FB			S5PV210_PA_FB
 | 
				
			||||||
#define S5PV210_PA_PCM0		0xE2300000
 | 
					#define S3C_PA_HSMMC0			S5PV210_PA_HSMMC(0)
 | 
				
			||||||
#define S5PV210_PA_PCM1		0xE1200000
 | 
					#define S3C_PA_HSMMC1			S5PV210_PA_HSMMC(1)
 | 
				
			||||||
#define S5PV210_PA_PCM2		0xE2B00000
 | 
					#define S3C_PA_HSMMC2			S5PV210_PA_HSMMC(2)
 | 
				
			||||||
 | 
					#define S3C_PA_HSMMC3			S5PV210_PA_HSMMC(3)
 | 
				
			||||||
 | 
					#define S3C_PA_IIC			S5PV210_PA_IIC0
 | 
				
			||||||
 | 
					#define S3C_PA_IIC1			S5PV210_PA_IIC1
 | 
				
			||||||
 | 
					#define S3C_PA_IIC2			S5PV210_PA_IIC2
 | 
				
			||||||
 | 
					#define S3C_PA_RTC			S5PV210_PA_RTC
 | 
				
			||||||
 | 
					#define S3C_PA_USB_HSOTG		S5PV210_PA_HSOTG
 | 
				
			||||||
 | 
					#define S3C_PA_WDT			S5PV210_PA_WATCHDOG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* AC97 */
 | 
					#define S5P_PA_CHIPID			S5PV210_PA_CHIPID
 | 
				
			||||||
#define S5PV210_PA_AC97		0xE2200000
 | 
					#define S5P_PA_FIMC0			S5PV210_PA_FIMC0
 | 
				
			||||||
 | 
					#define S5P_PA_FIMC1			S5PV210_PA_FIMC1
 | 
				
			||||||
 | 
					#define S5P_PA_FIMC2			S5PV210_PA_FIMC2
 | 
				
			||||||
 | 
					#define S5P_PA_MIPI_CSIS0		S5PV210_PA_MIPI_CSIS
 | 
				
			||||||
 | 
					#define S5P_PA_ONENAND			S5PC110_PA_ONENAND
 | 
				
			||||||
 | 
					#define S5P_PA_ONENAND_DMA		S5PC110_PA_ONENAND_DMA
 | 
				
			||||||
 | 
					#define S5P_PA_SDRAM			S5PV210_PA_SDRAM
 | 
				
			||||||
 | 
					#define S5P_PA_SROMC			S5PV210_PA_SROMC
 | 
				
			||||||
 | 
					#define S5P_PA_SYSCON			S5PV210_PA_SYSCON
 | 
				
			||||||
 | 
					#define S5P_PA_TIMER			S5PV210_PA_TIMER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_ADC		(0xE1700000)
 | 
					#define SAMSUNG_PA_ADC			S5PV210_PA_ADC
 | 
				
			||||||
 | 
					#define SAMSUNG_PA_CFCON		S5PV210_PA_CFCON
 | 
				
			||||||
 | 
					#define SAMSUNG_PA_KEYPAD		S5PV210_PA_KEYPAD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_DMC0		(0xF0000000)
 | 
					/* UART */
 | 
				
			||||||
#define S5PV210_PA_DMC1		(0xF1400000)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV210_PA_MIPI_CSIS	0xFA600000
 | 
					#define S3C_VA_UARTx(x)			(S3C_VA_UART + ((x) * S3C_UART_OFFSET))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* compatibiltiy defines. */
 | 
					#define S3C_PA_UART			S5PV210_PA_UART
 | 
				
			||||||
#define S3C_PA_UART		S5PV210_PA_UART
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC0		S5PV210_PA_HSMMC(0)
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC1		S5PV210_PA_HSMMC(1)
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC2		S5PV210_PA_HSMMC(2)
 | 
					 | 
				
			||||||
#define S3C_PA_HSMMC3		S5PV210_PA_HSMMC(3)
 | 
					 | 
				
			||||||
#define S3C_PA_IIC		S5PV210_PA_IIC0
 | 
					 | 
				
			||||||
#define S3C_PA_IIC1		S5PV210_PA_IIC1
 | 
					 | 
				
			||||||
#define S3C_PA_IIC2		S5PV210_PA_IIC2
 | 
					 | 
				
			||||||
#define S3C_PA_FB		S5PV210_PA_FB
 | 
					 | 
				
			||||||
#define S3C_PA_RTC		S5PV210_PA_RTC
 | 
					 | 
				
			||||||
#define S3C_PA_WDT		S5PV210_PA_WATCHDOG
 | 
					 | 
				
			||||||
#define S3C_PA_USB_HSOTG	S5PV210_PA_HSOTG
 | 
					 | 
				
			||||||
#define S5P_PA_FIMC0		S5PV210_PA_FIMC0
 | 
					 | 
				
			||||||
#define S5P_PA_FIMC1		S5PV210_PA_FIMC1
 | 
					 | 
				
			||||||
#define S5P_PA_FIMC2		S5PV210_PA_FIMC2
 | 
					 | 
				
			||||||
#define S5P_PA_MIPI_CSIS0	S5PV210_PA_MIPI_CSIS
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SAMSUNG_PA_ADC		S5PV210_PA_ADC
 | 
					#define S5P_PA_UART(x)			(S3C_PA_UART + ((x) * S3C_UART_OFFSET))
 | 
				
			||||||
#define SAMSUNG_PA_CFCON	S5PV210_PA_CFCON
 | 
					#define S5P_PA_UART0			S5P_PA_UART(0)
 | 
				
			||||||
#define SAMSUNG_PA_KEYPAD	S5PV210_PA_KEYPAD
 | 
					#define S5P_PA_UART1			S5P_PA_UART(1)
 | 
				
			||||||
 | 
					#define S5P_PA_UART2			S5P_PA_UART(2)
 | 
				
			||||||
 | 
					#define S5P_PA_UART3			S5P_PA_UART(3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P_SZ_UART			SZ_256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __ASM_ARCH_MAP_H */
 | 
					#endif /* __ASM_ARCH_MAP_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -149,7 +149,7 @@ static struct regulator_init_data aquila_ldo2_data = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct regulator_init_data aquila_ldo3_data = {
 | 
					static struct regulator_init_data aquila_ldo3_data = {
 | 
				
			||||||
	.constraints	= {
 | 
						.constraints	= {
 | 
				
			||||||
		.name		= "VUSB/MIPI_1.1V",
 | 
							.name		= "VUSB+MIPI_1.1V",
 | 
				
			||||||
		.min_uV		= 1100000,
 | 
							.min_uV		= 1100000,
 | 
				
			||||||
		.max_uV		= 1100000,
 | 
							.max_uV		= 1100000,
 | 
				
			||||||
		.apply_uV	= 1,
 | 
							.apply_uV	= 1,
 | 
				
			||||||
| 
						 | 
					@ -197,7 +197,7 @@ static struct regulator_init_data aquila_ldo7_data = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct regulator_init_data aquila_ldo8_data = {
 | 
					static struct regulator_init_data aquila_ldo8_data = {
 | 
				
			||||||
	.constraints	= {
 | 
						.constraints	= {
 | 
				
			||||||
		.name		= "VUSB/VADC_3.3V",
 | 
							.name		= "VUSB+VADC_3.3V",
 | 
				
			||||||
		.min_uV		= 3300000,
 | 
							.min_uV		= 3300000,
 | 
				
			||||||
		.max_uV		= 3300000,
 | 
							.max_uV		= 3300000,
 | 
				
			||||||
		.apply_uV	= 1,
 | 
							.apply_uV	= 1,
 | 
				
			||||||
| 
						 | 
					@ -207,7 +207,7 @@ static struct regulator_init_data aquila_ldo8_data = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct regulator_init_data aquila_ldo9_data = {
 | 
					static struct regulator_init_data aquila_ldo9_data = {
 | 
				
			||||||
	.constraints	= {
 | 
						.constraints	= {
 | 
				
			||||||
		.name		= "VCC/VCAM_2.8V",
 | 
							.name		= "VCC+VCAM_2.8V",
 | 
				
			||||||
		.min_uV		= 2800000,
 | 
							.min_uV		= 2800000,
 | 
				
			||||||
		.max_uV		= 2800000,
 | 
							.max_uV		= 2800000,
 | 
				
			||||||
		.apply_uV	= 1,
 | 
							.apply_uV	= 1,
 | 
				
			||||||
| 
						 | 
					@ -381,9 +381,12 @@ static struct max8998_platform_data aquila_max8998_pdata = {
 | 
				
			||||||
	.buck1_set1	= S5PV210_GPH0(3),
 | 
						.buck1_set1	= S5PV210_GPH0(3),
 | 
				
			||||||
	.buck1_set2	= S5PV210_GPH0(4),
 | 
						.buck1_set2	= S5PV210_GPH0(4),
 | 
				
			||||||
	.buck2_set3	= S5PV210_GPH0(5),
 | 
						.buck2_set3	= S5PV210_GPH0(5),
 | 
				
			||||||
	.buck1_max_voltage1 = 1200000,
 | 
						.buck1_voltage1	= 1200000,
 | 
				
			||||||
	.buck1_max_voltage2 = 1200000,
 | 
						.buck1_voltage2	= 1200000,
 | 
				
			||||||
	.buck2_max_voltage = 1200000,
 | 
						.buck1_voltage3	= 1200000,
 | 
				
			||||||
 | 
						.buck1_voltage4	= 1200000,
 | 
				
			||||||
 | 
						.buck2_voltage1	= 1200000,
 | 
				
			||||||
 | 
						.buck2_voltage2	= 1200000,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -288,7 +288,7 @@ static struct regulator_init_data goni_ldo2_data = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct regulator_init_data goni_ldo3_data = {
 | 
					static struct regulator_init_data goni_ldo3_data = {
 | 
				
			||||||
	.constraints	= {
 | 
						.constraints	= {
 | 
				
			||||||
		.name		= "VUSB/MIPI_1.1V",
 | 
							.name		= "VUSB+MIPI_1.1V",
 | 
				
			||||||
		.min_uV		= 1100000,
 | 
							.min_uV		= 1100000,
 | 
				
			||||||
		.max_uV		= 1100000,
 | 
							.max_uV		= 1100000,
 | 
				
			||||||
		.apply_uV	= 1,
 | 
							.apply_uV	= 1,
 | 
				
			||||||
| 
						 | 
					@ -337,7 +337,7 @@ static struct regulator_init_data goni_ldo7_data = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct regulator_init_data goni_ldo8_data = {
 | 
					static struct regulator_init_data goni_ldo8_data = {
 | 
				
			||||||
	.constraints	= {
 | 
						.constraints	= {
 | 
				
			||||||
		.name		= "VUSB/VADC_3.3V",
 | 
							.name		= "VUSB+VADC_3.3V",
 | 
				
			||||||
		.min_uV		= 3300000,
 | 
							.min_uV		= 3300000,
 | 
				
			||||||
		.max_uV		= 3300000,
 | 
							.max_uV		= 3300000,
 | 
				
			||||||
		.apply_uV	= 1,
 | 
							.apply_uV	= 1,
 | 
				
			||||||
| 
						 | 
					@ -347,7 +347,7 @@ static struct regulator_init_data goni_ldo8_data = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct regulator_init_data goni_ldo9_data = {
 | 
					static struct regulator_init_data goni_ldo9_data = {
 | 
				
			||||||
	.constraints	= {
 | 
						.constraints	= {
 | 
				
			||||||
		.name		= "VCC/VCAM_2.8V",
 | 
							.name		= "VCC+VCAM_2.8V",
 | 
				
			||||||
		.min_uV		= 2800000,
 | 
							.min_uV		= 2800000,
 | 
				
			||||||
		.max_uV		= 2800000,
 | 
							.max_uV		= 2800000,
 | 
				
			||||||
		.apply_uV	= 1,
 | 
							.apply_uV	= 1,
 | 
				
			||||||
| 
						 | 
					@ -521,9 +521,12 @@ static struct max8998_platform_data goni_max8998_pdata = {
 | 
				
			||||||
	.buck1_set1	= S5PV210_GPH0(3),
 | 
						.buck1_set1	= S5PV210_GPH0(3),
 | 
				
			||||||
	.buck1_set2	= S5PV210_GPH0(4),
 | 
						.buck1_set2	= S5PV210_GPH0(4),
 | 
				
			||||||
	.buck2_set3	= S5PV210_GPH0(5),
 | 
						.buck2_set3	= S5PV210_GPH0(5),
 | 
				
			||||||
	.buck1_max_voltage1 = 1200000,
 | 
						.buck1_voltage1	= 1200000,
 | 
				
			||||||
	.buck1_max_voltage2 = 1200000,
 | 
						.buck1_voltage2	= 1200000,
 | 
				
			||||||
	.buck2_max_voltage = 1200000,
 | 
						.buck1_voltage3	= 1200000,
 | 
				
			||||||
 | 
						.buck1_voltage4	= 1200000,
 | 
				
			||||||
 | 
						.buck2_voltage1	= 1200000,
 | 
				
			||||||
 | 
						.buck2_voltage2	= 1200000,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
/* linux/arch/arm/mach-s5pv310/include/mach/map.h
 | 
					/* linux/arch/arm/mach-s5pv310/include/mach/map.h
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
 | 
					 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
 | 
				
			||||||
 *		http://www.samsung.com/
 | 
					 *		http://www.samsung.com/
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * S5PV310 - Memory map definitions
 | 
					 * S5PV310 - Memory map definitions
 | 
				
			||||||
| 
						 | 
					@ -23,90 +23,43 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <plat/map-s5p.h>
 | 
					#include <plat/map-s5p.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV310_PA_SYSRAM		(0x02025000)
 | 
					#define S5PV310_PA_SYSRAM		0x02025000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_I2S0			0x03830000
 | 
				
			||||||
 | 
					#define S5PV310_PA_I2S1			0xE3100000
 | 
				
			||||||
 | 
					#define S5PV310_PA_I2S2			0xE2A00000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_PCM0			0x03840000
 | 
				
			||||||
 | 
					#define S5PV310_PA_PCM1			0x13980000
 | 
				
			||||||
 | 
					#define S5PV310_PA_PCM2			0x13990000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV310_PA_SROM_BANK(x)		(0x04000000 + ((x) * 0x01000000))
 | 
					#define S5PV310_PA_SROM_BANK(x)		(0x04000000 + ((x) * 0x01000000))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC210_PA_ONENAND		(0x0C000000)
 | 
					#define S5PC210_PA_ONENAND		0x0C000000
 | 
				
			||||||
#define S5P_PA_ONENAND			S5PC210_PA_ONENAND
 | 
					#define S5PC210_PA_ONENAND_DMA		0x0C600000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PC210_PA_ONENAND_DMA		(0x0C600000)
 | 
					#define S5PV310_PA_CHIPID		0x10000000
 | 
				
			||||||
#define S5P_PA_ONENAND_DMA		S5PC210_PA_ONENAND_DMA
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV310_PA_CHIPID		(0x10000000)
 | 
					#define S5PV310_PA_SYSCON		0x10010000
 | 
				
			||||||
#define S5P_PA_CHIPID			S5PV310_PA_CHIPID
 | 
					#define S5PV310_PA_PMU			0x10020000
 | 
				
			||||||
 | 
					#define S5PV310_PA_CMU			0x10030000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV310_PA_SYSCON		(0x10010000)
 | 
					#define S5PV310_PA_WATCHDOG		0x10060000
 | 
				
			||||||
#define S5P_PA_SYSCON			S5PV310_PA_SYSCON
 | 
					#define S5PV310_PA_RTC			0x10070000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV310_PA_PMU			(0x10020000)
 | 
					#define S5PV310_PA_DMC0			0x10400000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV310_PA_CMU			(0x10030000)
 | 
					#define S5PV310_PA_COMBINER		0x10448000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV310_PA_WATCHDOG		(0x10060000)
 | 
					#define S5PV310_PA_COREPERI		0x10500000
 | 
				
			||||||
#define S5PV310_PA_RTC			(0x10070000)
 | 
					#define S5PV310_PA_GIC_CPU		0x10500100
 | 
				
			||||||
 | 
					#define S5PV310_PA_TWD			0x10500600
 | 
				
			||||||
 | 
					#define S5PV310_PA_GIC_DIST		0x10501000
 | 
				
			||||||
 | 
					#define S5PV310_PA_L2CC			0x10502000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV310_PA_DMC0			(0x10400000)
 | 
					#define S5PV310_PA_MDMA			0x10810000
 | 
				
			||||||
 | 
					#define S5PV310_PA_PDMA0		0x12680000
 | 
				
			||||||
#define S5PV310_PA_COMBINER		(0x10448000)
 | 
					#define S5PV310_PA_PDMA1		0x12690000
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5PV310_PA_COREPERI		(0x10500000)
 | 
					 | 
				
			||||||
#define S5PV310_PA_GIC_CPU		(0x10500100)
 | 
					 | 
				
			||||||
#define S5PV310_PA_TWD			(0x10500600)
 | 
					 | 
				
			||||||
#define S5PV310_PA_GIC_DIST		(0x10501000)
 | 
					 | 
				
			||||||
#define S5PV310_PA_L2CC			(0x10502000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* DMA */
 | 
					 | 
				
			||||||
#define S5PV310_PA_MDMA		0x10810000
 | 
					 | 
				
			||||||
#define S5PV310_PA_PDMA0	0x12680000
 | 
					 | 
				
			||||||
#define S5PV310_PA_PDMA1	0x12690000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5PV310_PA_GPIO1		(0x11400000)
 | 
					 | 
				
			||||||
#define S5PV310_PA_GPIO2		(0x11000000)
 | 
					 | 
				
			||||||
#define S5PV310_PA_GPIO3		(0x03860000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5PV310_PA_MIPI_CSIS0		0x11880000
 | 
					 | 
				
			||||||
#define S5PV310_PA_MIPI_CSIS1		0x11890000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5PV310_PA_HSMMC(x)		(0x12510000 + ((x) * 0x10000))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5PV310_PA_SROMC		(0x12570000)
 | 
					 | 
				
			||||||
#define S5P_PA_SROMC			S5PV310_PA_SROMC
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* S/PDIF */
 | 
					 | 
				
			||||||
#define S5PV310_PA_SPDIF	0xE1100000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* I2S */
 | 
					 | 
				
			||||||
#define S5PV310_PA_I2S0		0x03830000
 | 
					 | 
				
			||||||
#define S5PV310_PA_I2S1		0xE3100000
 | 
					 | 
				
			||||||
#define S5PV310_PA_I2S2		0xE2A00000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* PCM */
 | 
					 | 
				
			||||||
#define S5PV310_PA_PCM0		0x03840000
 | 
					 | 
				
			||||||
#define S5PV310_PA_PCM1		0x13980000
 | 
					 | 
				
			||||||
#define S5PV310_PA_PCM2		0x13990000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* AC97 */
 | 
					 | 
				
			||||||
#define S5PV310_PA_AC97		0x139A0000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5PV310_PA_UART			(0x13800000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P_PA_UART(x)			(S5PV310_PA_UART + ((x) * S3C_UART_OFFSET))
 | 
					 | 
				
			||||||
#define S5P_PA_UART0			S5P_PA_UART(0)
 | 
					 | 
				
			||||||
#define S5P_PA_UART1			S5P_PA_UART(1)
 | 
					 | 
				
			||||||
#define S5P_PA_UART2			S5P_PA_UART(2)
 | 
					 | 
				
			||||||
#define S5P_PA_UART3			S5P_PA_UART(3)
 | 
					 | 
				
			||||||
#define S5P_PA_UART4			S5P_PA_UART(4)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5P_SZ_UART			SZ_256
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5PV310_PA_IIC(x)		(0x13860000 + ((x) * 0x10000))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5PV310_PA_TIMER		(0x139D0000)
 | 
					 | 
				
			||||||
#define S5P_PA_TIMER			S5PV310_PA_TIMER
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define S5PV310_PA_SDRAM		(0x40000000)
 | 
					 | 
				
			||||||
#define S5P_PA_SDRAM			S5PV310_PA_SDRAM
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S5PV310_PA_SYSMMU_MDMA		0x10A40000
 | 
					#define S5PV310_PA_SYSMMU_MDMA		0x10A40000
 | 
				
			||||||
#define S5PV310_PA_SYSMMU_SSS		0x10A50000
 | 
					#define S5PV310_PA_SYSMMU_SSS		0x10A50000
 | 
				
			||||||
| 
						 | 
					@ -125,8 +78,31 @@
 | 
				
			||||||
#define S5PV310_PA_SYSMMU_MFC_L		0x13620000
 | 
					#define S5PV310_PA_SYSMMU_MFC_L		0x13620000
 | 
				
			||||||
#define S5PV310_PA_SYSMMU_MFC_R		0x13630000
 | 
					#define S5PV310_PA_SYSMMU_MFC_R		0x13630000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* compatibiltiy defines. */
 | 
					#define S5PV310_PA_GPIO1		0x11400000
 | 
				
			||||||
#define S3C_PA_UART			S5PV310_PA_UART
 | 
					#define S5PV310_PA_GPIO2		0x11000000
 | 
				
			||||||
 | 
					#define S5PV310_PA_GPIO3		0x03860000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_MIPI_CSIS0		0x11880000
 | 
				
			||||||
 | 
					#define S5PV310_PA_MIPI_CSIS1		0x11890000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_HSMMC(x)		(0x12510000 + ((x) * 0x10000))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_SROMC		0x12570000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_UART			0x13800000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_IIC(x)		(0x13860000 + ((x) * 0x10000))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_AC97			0x139A0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_TIMER		0x139D0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_SDRAM		0x40000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5PV310_PA_SPDIF		0xE1100000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Compatibiltiy Defines */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S3C_PA_HSMMC0			S5PV310_PA_HSMMC(0)
 | 
					#define S3C_PA_HSMMC0			S5PV310_PA_HSMMC(0)
 | 
				
			||||||
#define S3C_PA_HSMMC1			S5PV310_PA_HSMMC(1)
 | 
					#define S3C_PA_HSMMC1			S5PV310_PA_HSMMC(1)
 | 
				
			||||||
#define S3C_PA_HSMMC2			S5PV310_PA_HSMMC(2)
 | 
					#define S3C_PA_HSMMC2			S5PV310_PA_HSMMC(2)
 | 
				
			||||||
| 
						 | 
					@ -141,7 +117,28 @@
 | 
				
			||||||
#define S3C_PA_IIC7			S5PV310_PA_IIC(7)
 | 
					#define S3C_PA_IIC7			S5PV310_PA_IIC(7)
 | 
				
			||||||
#define S3C_PA_RTC			S5PV310_PA_RTC
 | 
					#define S3C_PA_RTC			S5PV310_PA_RTC
 | 
				
			||||||
#define S3C_PA_WDT			S5PV310_PA_WATCHDOG
 | 
					#define S3C_PA_WDT			S5PV310_PA_WATCHDOG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P_PA_CHIPID			S5PV310_PA_CHIPID
 | 
				
			||||||
#define S5P_PA_MIPI_CSIS0		S5PV310_PA_MIPI_CSIS0
 | 
					#define S5P_PA_MIPI_CSIS0		S5PV310_PA_MIPI_CSIS0
 | 
				
			||||||
#define S5P_PA_MIPI_CSIS1		S5PV310_PA_MIPI_CSIS1
 | 
					#define S5P_PA_MIPI_CSIS1		S5PV310_PA_MIPI_CSIS1
 | 
				
			||||||
 | 
					#define S5P_PA_ONENAND			S5PC210_PA_ONENAND
 | 
				
			||||||
 | 
					#define S5P_PA_ONENAND_DMA		S5PC210_PA_ONENAND_DMA
 | 
				
			||||||
 | 
					#define S5P_PA_SDRAM			S5PV310_PA_SDRAM
 | 
				
			||||||
 | 
					#define S5P_PA_SROMC			S5PV310_PA_SROMC
 | 
				
			||||||
 | 
					#define S5P_PA_SYSCON			S5PV310_PA_SYSCON
 | 
				
			||||||
 | 
					#define S5P_PA_TIMER			S5PV310_PA_TIMER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* UART */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S3C_PA_UART			S5PV310_PA_UART
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P_PA_UART(x)			(S3C_PA_UART + ((x) * S3C_UART_OFFSET))
 | 
				
			||||||
 | 
					#define S5P_PA_UART0			S5P_PA_UART(0)
 | 
				
			||||||
 | 
					#define S5P_PA_UART1			S5P_PA_UART(1)
 | 
				
			||||||
 | 
					#define S5P_PA_UART2			S5P_PA_UART(2)
 | 
				
			||||||
 | 
					#define S5P_PA_UART3			S5P_PA_UART(3)
 | 
				
			||||||
 | 
					#define S5P_PA_UART4			S5P_PA_UART(4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define S5P_SZ_UART			SZ_256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __ASM_ARCH_MAP_H */
 | 
					#endif /* __ASM_ARCH_MAP_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,7 +62,7 @@
 | 
				
			||||||
#define SPEAR320_SMII1_BASE		0xAB000000
 | 
					#define SPEAR320_SMII1_BASE		0xAB000000
 | 
				
			||||||
#define SPEAR320_SMII1_SIZE		0x01000000
 | 
					#define SPEAR320_SMII1_SIZE		0x01000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPEAR320_SOC_CONFIG_BASE	0xB4000000
 | 
					#define SPEAR320_SOC_CONFIG_BASE	0xB3000000
 | 
				
			||||||
#define SPEAR320_SOC_CONFIG_SIZE	0x00000070
 | 
					#define SPEAR320_SOC_CONFIG_SIZE	0x00000070
 | 
				
			||||||
/* Interrupt registers offsets and masks */
 | 
					/* Interrupt registers offsets and masks */
 | 
				
			||||||
#define INT_STS_MASK_REG		0x04
 | 
					#define INT_STS_MASK_REG		0x04
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,7 +49,13 @@ static inline void cache_wait(void __iomem *reg, unsigned long mask)
 | 
				
			||||||
static inline void cache_sync(void)
 | 
					static inline void cache_sync(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	void __iomem *base = l2x0_base;
 | 
						void __iomem *base = l2x0_base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_ARM_ERRATA_753970
 | 
				
			||||||
 | 
						/* write to an unmmapped register */
 | 
				
			||||||
 | 
						writel_relaxed(0, base + L2X0_DUMMY_REG);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
	writel_relaxed(0, base + L2X0_CACHE_SYNC);
 | 
						writel_relaxed(0, base + L2X0_CACHE_SYNC);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	cache_wait(base + L2X0_CACHE_SYNC, 1);
 | 
						cache_wait(base + L2X0_CACHE_SYNC, 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -264,6 +264,12 @@ __v7_setup:
 | 
				
			||||||
	orreq	r10, r10, #1 << 6		@ set bit #6
 | 
						orreq	r10, r10, #1 << 6		@ set bit #6
 | 
				
			||||||
	mcreq	p15, 0, r10, c15, c0, 1		@ write diagnostic register
 | 
						mcreq	p15, 0, r10, c15, c0, 1		@ write diagnostic register
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef CONFIG_ARM_ERRATA_751472
 | 
				
			||||||
 | 
						cmp	r6, #0x30			@ present prior to r3p0
 | 
				
			||||||
 | 
						mrclt	p15, 0, r10, c15, c0, 1		@ read diagnostic register
 | 
				
			||||||
 | 
						orrlt	r10, r10, #1 << 11		@ set bit #11
 | 
				
			||||||
 | 
						mcrlt	p15, 0, r10, c15, c0, 1		@ write diagnostic register
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
3:	mov	r10, #0
 | 
					3:	mov	r10, #0
 | 
				
			||||||
#ifdef HARVARD_CACHE
 | 
					#ifdef HARVARD_CACHE
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@
 | 
				
			||||||
static struct resource s5p_uart0_resource[] = {
 | 
					static struct resource s5p_uart0_resource[] = {
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.start	= S5P_PA_UART0,
 | 
							.start	= S5P_PA_UART0,
 | 
				
			||||||
		.end	= S5P_PA_UART0 + S5P_SZ_UART,
 | 
							.end	= S5P_PA_UART0 + S5P_SZ_UART - 1,
 | 
				
			||||||
		.flags	= IORESOURCE_MEM,
 | 
							.flags	= IORESOURCE_MEM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	[1] = {
 | 
						[1] = {
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ static struct resource s5p_uart0_resource[] = {
 | 
				
			||||||
static struct resource s5p_uart1_resource[] = {
 | 
					static struct resource s5p_uart1_resource[] = {
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.start	= S5P_PA_UART1,
 | 
							.start	= S5P_PA_UART1,
 | 
				
			||||||
		.end	= S5P_PA_UART1 + S5P_SZ_UART,
 | 
							.end	= S5P_PA_UART1 + S5P_SZ_UART - 1,
 | 
				
			||||||
		.flags	= IORESOURCE_MEM,
 | 
							.flags	= IORESOURCE_MEM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	[1] = {
 | 
						[1] = {
 | 
				
			||||||
| 
						 | 
					@ -74,7 +74,7 @@ static struct resource s5p_uart1_resource[] = {
 | 
				
			||||||
static struct resource s5p_uart2_resource[] = {
 | 
					static struct resource s5p_uart2_resource[] = {
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.start	= S5P_PA_UART2,
 | 
							.start	= S5P_PA_UART2,
 | 
				
			||||||
		.end	= S5P_PA_UART2 + S5P_SZ_UART,
 | 
							.end	= S5P_PA_UART2 + S5P_SZ_UART - 1,
 | 
				
			||||||
		.flags	= IORESOURCE_MEM,
 | 
							.flags	= IORESOURCE_MEM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	[1] = {
 | 
						[1] = {
 | 
				
			||||||
| 
						 | 
					@ -98,7 +98,7 @@ static struct resource s5p_uart3_resource[] = {
 | 
				
			||||||
#if CONFIG_SERIAL_SAMSUNG_UARTS > 3
 | 
					#if CONFIG_SERIAL_SAMSUNG_UARTS > 3
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.start	= S5P_PA_UART3,
 | 
							.start	= S5P_PA_UART3,
 | 
				
			||||||
		.end	= S5P_PA_UART3 + S5P_SZ_UART,
 | 
							.end	= S5P_PA_UART3 + S5P_SZ_UART - 1,
 | 
				
			||||||
		.flags	= IORESOURCE_MEM,
 | 
							.flags	= IORESOURCE_MEM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	[1] = {
 | 
						[1] = {
 | 
				
			||||||
| 
						 | 
					@ -123,7 +123,7 @@ static struct resource s5p_uart4_resource[] = {
 | 
				
			||||||
#if CONFIG_SERIAL_SAMSUNG_UARTS > 4
 | 
					#if CONFIG_SERIAL_SAMSUNG_UARTS > 4
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.start	= S5P_PA_UART4,
 | 
							.start	= S5P_PA_UART4,
 | 
				
			||||||
		.end	= S5P_PA_UART4 + S5P_SZ_UART,
 | 
							.end	= S5P_PA_UART4 + S5P_SZ_UART - 1,
 | 
				
			||||||
		.flags	= IORESOURCE_MEM,
 | 
							.flags	= IORESOURCE_MEM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	[1] = {
 | 
						[1] = {
 | 
				
			||||||
| 
						 | 
					@ -148,7 +148,7 @@ static struct resource s5p_uart5_resource[] = {
 | 
				
			||||||
#if CONFIG_SERIAL_SAMSUNG_UARTS > 5
 | 
					#if CONFIG_SERIAL_SAMSUNG_UARTS > 5
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.start	= S5P_PA_UART5,
 | 
							.start	= S5P_PA_UART5,
 | 
				
			||||||
		.end	= S5P_PA_UART5 + S5P_SZ_UART,
 | 
							.end	= S5P_PA_UART5 + S5P_SZ_UART - 1,
 | 
				
			||||||
		.flags	= IORESOURCE_MEM,
 | 
							.flags	= IORESOURCE_MEM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	[1] = {
 | 
						[1] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,4 +58,3 @@ void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	s3c_device_ts.dev.platform_data = npd;
 | 
						s3c_device_ts.dev.platform_data = npd;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(s3c24xx_ts_set_platdata);
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,10 +24,10 @@ static inline void putc(int c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	void __iomem *base = (void __iomem *)SPEAR_DBG_UART_BASE;
 | 
						void __iomem *base = (void __iomem *)SPEAR_DBG_UART_BASE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (readl(base + UART01x_FR) & UART01x_FR_TXFF)
 | 
						while (readl_relaxed(base + UART01x_FR) & UART01x_FR_TXFF)
 | 
				
			||||||
		barrier();
 | 
							barrier();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	writel(c, base + UART01x_DR);
 | 
						writel_relaxed(c, base + UART01x_DR);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void flush(void)
 | 
					static inline void flush(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,6 @@
 | 
				
			||||||
#ifndef __PLAT_VMALLOC_H
 | 
					#ifndef __PLAT_VMALLOC_H
 | 
				
			||||||
#define __PLAT_VMALLOC_H
 | 
					#define __PLAT_VMALLOC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VMALLOC_END		0xF0000000
 | 
					#define VMALLOC_END		0xF0000000UL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __PLAT_VMALLOC_H */
 | 
					#endif /* __PLAT_VMALLOC_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,11 +133,12 @@ unsigned long decompress_kernel(void)
 | 
				
			||||||
	unsigned long output_addr;
 | 
						unsigned long output_addr;
 | 
				
			||||||
	unsigned char *output;
 | 
						unsigned char *output;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	check_ipl_parmblock((void *) 0, (unsigned long) output + SZ__bss_start);
 | 
						output_addr = ((unsigned long) &_end + HEAP_SIZE + 4095UL) & -4096UL;
 | 
				
			||||||
 | 
						check_ipl_parmblock((void *) 0, output_addr + SZ__bss_start);
 | 
				
			||||||
	memset(&_bss, 0, &_ebss - &_bss);
 | 
						memset(&_bss, 0, &_ebss - &_bss);
 | 
				
			||||||
	free_mem_ptr = (unsigned long)&_end;
 | 
						free_mem_ptr = (unsigned long)&_end;
 | 
				
			||||||
	free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
 | 
						free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
 | 
				
			||||||
	output = (unsigned char *) ((free_mem_end_ptr + 4095UL) & -4096UL);
 | 
						output = (unsigned char *) output_addr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_BLK_DEV_INITRD
 | 
					#ifdef CONFIG_BLK_DEV_INITRD
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,14 +36,19 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int atomic_read(const atomic_t *v)
 | 
					static inline int atomic_read(const atomic_t *v)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	barrier();
 | 
						int c;
 | 
				
			||||||
	return v->counter;
 | 
					
 | 
				
			||||||
 | 
						asm volatile(
 | 
				
			||||||
 | 
							"	l	%0,%1\n"
 | 
				
			||||||
 | 
							: "=d" (c) : "Q" (v->counter));
 | 
				
			||||||
 | 
						return c;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void atomic_set(atomic_t *v, int i)
 | 
					static inline void atomic_set(atomic_t *v, int i)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	v->counter = i;
 | 
						asm volatile(
 | 
				
			||||||
	barrier();
 | 
							"	st	%1,%0\n"
 | 
				
			||||||
 | 
							: "=Q" (v->counter) : "d" (i));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int atomic_add_return(int i, atomic_t *v)
 | 
					static inline int atomic_add_return(int i, atomic_t *v)
 | 
				
			||||||
| 
						 | 
					@ -128,14 +133,19 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline long long atomic64_read(const atomic64_t *v)
 | 
					static inline long long atomic64_read(const atomic64_t *v)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	barrier();
 | 
						long long c;
 | 
				
			||||||
	return v->counter;
 | 
					
 | 
				
			||||||
 | 
						asm volatile(
 | 
				
			||||||
 | 
							"	lg	%0,%1\n"
 | 
				
			||||||
 | 
							: "=d" (c) : "Q" (v->counter));
 | 
				
			||||||
 | 
						return c;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void atomic64_set(atomic64_t *v, long long i)
 | 
					static inline void atomic64_set(atomic64_t *v, long long i)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	v->counter = i;
 | 
						asm volatile(
 | 
				
			||||||
	barrier();
 | 
							"	stg	%1,%0\n"
 | 
				
			||||||
 | 
							: "=Q" (v->counter) : "d" (i));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline long long atomic64_add_return(long long i, atomic64_t *v)
 | 
					static inline long long atomic64_add_return(long long i, atomic64_t *v)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define L1_CACHE_BYTES     256
 | 
					#define L1_CACHE_BYTES     256
 | 
				
			||||||
#define L1_CACHE_SHIFT     8
 | 
					#define L1_CACHE_SHIFT     8
 | 
				
			||||||
 | 
					#define NET_SKB_PAD	   32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
 | 
					#define __read_mostly __attribute__((__section__(".data..read_mostly")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -811,7 +811,7 @@ config X86_LOCAL_APIC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config X86_IO_APIC
 | 
					config X86_IO_APIC
 | 
				
			||||||
	def_bool y
 | 
						def_bool y
 | 
				
			||||||
	depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC
 | 
						depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_IOAPIC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config X86_VISWS_APIC
 | 
					config X86_VISWS_APIC
 | 
				
			||||||
	def_bool y
 | 
						def_bool y
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -426,4 +426,16 @@ struct local_apic {
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 #define BAD_APICID 0xFFFFu
 | 
					 #define BAD_APICID 0xFFFFu
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum ioapic_irq_destination_types {
 | 
				
			||||||
 | 
						dest_Fixed		= 0,
 | 
				
			||||||
 | 
						dest_LowestPrio		= 1,
 | 
				
			||||||
 | 
						dest_SMI		= 2,
 | 
				
			||||||
 | 
						dest__reserved_1	= 3,
 | 
				
			||||||
 | 
						dest_NMI		= 4,
 | 
				
			||||||
 | 
						dest_INIT		= 5,
 | 
				
			||||||
 | 
						dest__reserved_2	= 6,
 | 
				
			||||||
 | 
						dest_ExtINT		= 7
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _ASM_X86_APICDEF_H */
 | 
					#endif /* _ASM_X86_APICDEF_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,17 +63,6 @@ union IO_APIC_reg_03 {
 | 
				
			||||||
	} __attribute__ ((packed)) bits;
 | 
						} __attribute__ ((packed)) bits;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum ioapic_irq_destination_types {
 | 
					 | 
				
			||||||
	dest_Fixed = 0,
 | 
					 | 
				
			||||||
	dest_LowestPrio = 1,
 | 
					 | 
				
			||||||
	dest_SMI = 2,
 | 
					 | 
				
			||||||
	dest__reserved_1 = 3,
 | 
					 | 
				
			||||||
	dest_NMI = 4,
 | 
					 | 
				
			||||||
	dest_INIT = 5,
 | 
					 | 
				
			||||||
	dest__reserved_2 = 6,
 | 
					 | 
				
			||||||
	dest_ExtINT = 7
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct IO_APIC_route_entry {
 | 
					struct IO_APIC_route_entry {
 | 
				
			||||||
	__u32	vector		:  8,
 | 
						__u32	vector		:  8,
 | 
				
			||||||
		delivery_mode	:  3,	/* 000: FIXED
 | 
							delivery_mode	:  3,	/* 000: FIXED
 | 
				
			||||||
| 
						 | 
					@ -106,6 +95,10 @@ struct IR_IO_APIC_route_entry {
 | 
				
			||||||
		index		: 15;
 | 
							index		: 15;
 | 
				
			||||||
} __attribute__ ((packed));
 | 
					} __attribute__ ((packed));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define IOAPIC_AUTO     -1
 | 
				
			||||||
 | 
					#define IOAPIC_EDGE     0
 | 
				
			||||||
 | 
					#define IOAPIC_LEVEL    1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_X86_IO_APIC
 | 
					#ifdef CONFIG_X86_IO_APIC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -150,11 +143,6 @@ extern int timer_through_8259;
 | 
				
			||||||
#define io_apic_assign_pci_irqs \
 | 
					#define io_apic_assign_pci_irqs \
 | 
				
			||||||
	(mp_irq_entries && !skip_ioapic_setup && io_apic_irqs)
 | 
						(mp_irq_entries && !skip_ioapic_setup && io_apic_irqs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern u8 io_apic_unique_id(u8 id);
 | 
					 | 
				
			||||||
extern int io_apic_get_unique_id(int ioapic, int apic_id);
 | 
					 | 
				
			||||||
extern int io_apic_get_version(int ioapic);
 | 
					 | 
				
			||||||
extern int io_apic_get_redir_entries(int ioapic);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct io_apic_irq_attr;
 | 
					struct io_apic_irq_attr;
 | 
				
			||||||
extern int io_apic_set_pci_routing(struct device *dev, int irq,
 | 
					extern int io_apic_set_pci_routing(struct device *dev, int irq,
 | 
				
			||||||
		 struct io_apic_irq_attr *irq_attr);
 | 
							 struct io_apic_irq_attr *irq_attr);
 | 
				
			||||||
| 
						 | 
					@ -162,6 +150,8 @@ void setup_IO_APIC_irq_extra(u32 gsi);
 | 
				
			||||||
extern void ioapic_and_gsi_init(void);
 | 
					extern void ioapic_and_gsi_init(void);
 | 
				
			||||||
extern void ioapic_insert_resources(void);
 | 
					extern void ioapic_insert_resources(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct IO_APIC_route_entry **alloc_ioapic_entries(void);
 | 
					extern struct IO_APIC_route_entry **alloc_ioapic_entries(void);
 | 
				
			||||||
extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries);
 | 
					extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries);
 | 
				
			||||||
extern int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries);
 | 
					extern int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries);
 | 
				
			||||||
| 
						 | 
					@ -186,6 +176,8 @@ extern void __init pre_init_apic_IRQ0(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void mp_save_irq(struct mpc_intsrc *m);
 | 
					extern void mp_save_irq(struct mpc_intsrc *m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void disable_ioapic_support(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else  /* !CONFIG_X86_IO_APIC */
 | 
					#else  /* !CONFIG_X86_IO_APIC */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define io_apic_assign_pci_irqs 0
 | 
					#define io_apic_assign_pci_irqs 0
 | 
				
			||||||
| 
						 | 
					@ -199,6 +191,26 @@ static inline int mp_find_ioapic(u32 gsi) { return 0; }
 | 
				
			||||||
struct io_apic_irq_attr;
 | 
					struct io_apic_irq_attr;
 | 
				
			||||||
static inline int io_apic_set_pci_routing(struct device *dev, int irq,
 | 
					static inline int io_apic_set_pci_routing(struct device *dev, int irq,
 | 
				
			||||||
		 struct io_apic_irq_attr *irq_attr) { return 0; }
 | 
							 struct io_apic_irq_attr *irq_attr) { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline struct IO_APIC_route_entry **alloc_ioapic_entries(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void free_ioapic_entries(struct IO_APIC_route_entry **ent) { }
 | 
				
			||||||
 | 
					static inline int save_IO_APIC_setup(struct IO_APIC_route_entry **ent)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return -ENOMEM;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void mask_IO_APIC_setup(struct IO_APIC_route_entry **ent) { }
 | 
				
			||||||
 | 
					static inline int restore_IO_APIC_setup(struct IO_APIC_route_entry **ent)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return -ENOMEM;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void mp_save_irq(struct mpc_intsrc *m) { };
 | 
				
			||||||
 | 
					static inline void disable_ioapic_support(void) { }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _ASM_X86_IO_APIC_H */
 | 
					#endif /* _ASM_X86_IO_APIC_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,6 +43,7 @@
 | 
				
			||||||
#include <asm/i8259.h>
 | 
					#include <asm/i8259.h>
 | 
				
			||||||
#include <asm/proto.h>
 | 
					#include <asm/proto.h>
 | 
				
			||||||
#include <asm/apic.h>
 | 
					#include <asm/apic.h>
 | 
				
			||||||
 | 
					#include <asm/io_apic.h>
 | 
				
			||||||
#include <asm/desc.h>
 | 
					#include <asm/desc.h>
 | 
				
			||||||
#include <asm/hpet.h>
 | 
					#include <asm/hpet.h>
 | 
				
			||||||
#include <asm/idle.h>
 | 
					#include <asm/idle.h>
 | 
				
			||||||
| 
						 | 
					@ -1209,7 +1210,7 @@ void __cpuinit setup_local_APIC(void)
 | 
				
			||||||
		rdtscll(tsc);
 | 
							rdtscll(tsc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (disable_apic) {
 | 
						if (disable_apic) {
 | 
				
			||||||
		arch_disable_smp_support();
 | 
							disable_ioapic_support();
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1448,7 +1449,7 @@ int __init enable_IR(void)
 | 
				
			||||||
void __init enable_IR_x2apic(void)
 | 
					void __init enable_IR_x2apic(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	struct IO_APIC_route_entry **ioapic_entries = NULL;
 | 
						struct IO_APIC_route_entry **ioapic_entries;
 | 
				
			||||||
	int ret, x2apic_enabled = 0;
 | 
						int ret, x2apic_enabled = 0;
 | 
				
			||||||
	int dmar_table_init_ret;
 | 
						int dmar_table_init_ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,10 @@ DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int skip_ioapic_setup;
 | 
					int skip_ioapic_setup;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void arch_disable_smp_support(void)
 | 
					/**
 | 
				
			||||||
 | 
					 * disable_ioapic_support() - disables ioapic support at runtime
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void disable_ioapic_support(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef CONFIG_PCI
 | 
					#ifdef CONFIG_PCI
 | 
				
			||||||
	noioapicquirk = 1;
 | 
						noioapicquirk = 1;
 | 
				
			||||||
| 
						 | 
					@ -120,11 +123,14 @@ void arch_disable_smp_support(void)
 | 
				
			||||||
static int __init parse_noapic(char *str)
 | 
					static int __init parse_noapic(char *str)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* disable IO-APIC */
 | 
						/* disable IO-APIC */
 | 
				
			||||||
	arch_disable_smp_support();
 | 
						disable_ioapic_support();
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
early_param("noapic", parse_noapic);
 | 
					early_param("noapic", parse_noapic);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int io_apic_setup_irq_pin_once(unsigned int irq, int node,
 | 
				
			||||||
 | 
									      struct io_apic_irq_attr *attr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Will be called in mpparse/acpi/sfi codes for saving IRQ info */
 | 
					/* Will be called in mpparse/acpi/sfi codes for saving IRQ info */
 | 
				
			||||||
void mp_save_irq(struct mpc_intsrc *m)
 | 
					void mp_save_irq(struct mpc_intsrc *m)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -818,7 +824,7 @@ static int EISA_ELCR(unsigned int irq)
 | 
				
			||||||
#define default_MCA_trigger(idx)	(1)
 | 
					#define default_MCA_trigger(idx)	(1)
 | 
				
			||||||
#define default_MCA_polarity(idx)	default_ISA_polarity(idx)
 | 
					#define default_MCA_polarity(idx)	default_ISA_polarity(idx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int MPBIOS_polarity(int idx)
 | 
					static int irq_polarity(int idx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int bus = mp_irqs[idx].srcbus;
 | 
						int bus = mp_irqs[idx].srcbus;
 | 
				
			||||||
	int polarity;
 | 
						int polarity;
 | 
				
			||||||
| 
						 | 
					@ -860,7 +866,7 @@ static int MPBIOS_polarity(int idx)
 | 
				
			||||||
	return polarity;
 | 
						return polarity;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int MPBIOS_trigger(int idx)
 | 
					static int irq_trigger(int idx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int bus = mp_irqs[idx].srcbus;
 | 
						int bus = mp_irqs[idx].srcbus;
 | 
				
			||||||
	int trigger;
 | 
						int trigger;
 | 
				
			||||||
| 
						 | 
					@ -932,16 +938,6 @@ static int MPBIOS_trigger(int idx)
 | 
				
			||||||
	return trigger;
 | 
						return trigger;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int irq_polarity(int idx)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return MPBIOS_polarity(idx);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline int irq_trigger(int idx)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return MPBIOS_trigger(idx);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int pin_2_irq(int idx, int apic, int pin)
 | 
					static int pin_2_irq(int idx, int apic, int pin)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int irq;
 | 
						int irq;
 | 
				
			||||||
| 
						 | 
					@ -1220,10 +1216,6 @@ void __setup_vector_irq(int cpu)
 | 
				
			||||||
static struct irq_chip ioapic_chip;
 | 
					static struct irq_chip ioapic_chip;
 | 
				
			||||||
static struct irq_chip ir_ioapic_chip;
 | 
					static struct irq_chip ir_ioapic_chip;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IOAPIC_AUTO     -1
 | 
					 | 
				
			||||||
#define IOAPIC_EDGE     0
 | 
					 | 
				
			||||||
#define IOAPIC_LEVEL    1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef CONFIG_X86_32
 | 
					#ifdef CONFIG_X86_32
 | 
				
			||||||
static inline int IO_APIC_irq_trigger(int irq)
 | 
					static inline int IO_APIC_irq_trigger(int irq)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -1385,33 +1377,26 @@ static struct {
 | 
				
			||||||
	DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1);
 | 
						DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1);
 | 
				
			||||||
} mp_ioapic_routing[MAX_IO_APICS];
 | 
					} mp_ioapic_routing[MAX_IO_APICS];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __init setup_IO_APIC_irqs(void)
 | 
					static bool __init io_apic_pin_not_connected(int idx, int apic_id, int pin)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int apic_id, pin, idx, irq, notcon = 0;
 | 
						if (idx != -1)
 | 
				
			||||||
	int node = cpu_to_node(0);
 | 
							return false;
 | 
				
			||||||
	struct irq_cfg *cfg;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
 | 
						apic_printk(APIC_VERBOSE, KERN_DEBUG " apic %d pin %d not connected\n",
 | 
				
			||||||
 | 
							    mp_ioapics[apic_id].apicid, pin);
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void __init __io_apic_setup_irqs(unsigned int apic_id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int idx, node = cpu_to_node(0);
 | 
				
			||||||
 | 
						struct io_apic_irq_attr attr;
 | 
				
			||||||
 | 
						unsigned int pin, irq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (apic_id = 0; apic_id < nr_ioapics; apic_id++)
 | 
					 | 
				
			||||||
	for (pin = 0; pin < nr_ioapic_registers[apic_id]; pin++) {
 | 
						for (pin = 0; pin < nr_ioapic_registers[apic_id]; pin++) {
 | 
				
			||||||
		idx = find_irq_entry(apic_id, pin, mp_INT);
 | 
							idx = find_irq_entry(apic_id, pin, mp_INT);
 | 
				
			||||||
		if (idx == -1) {
 | 
							if (io_apic_pin_not_connected(idx, apic_id, pin))
 | 
				
			||||||
			if (!notcon) {
 | 
					 | 
				
			||||||
				notcon = 1;
 | 
					 | 
				
			||||||
				apic_printk(APIC_VERBOSE,
 | 
					 | 
				
			||||||
					KERN_DEBUG " %d-%d",
 | 
					 | 
				
			||||||
					mp_ioapics[apic_id].apicid, pin);
 | 
					 | 
				
			||||||
			} else
 | 
					 | 
				
			||||||
				apic_printk(APIC_VERBOSE, " %d-%d",
 | 
					 | 
				
			||||||
					mp_ioapics[apic_id].apicid, pin);
 | 
					 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (notcon) {
 | 
					 | 
				
			||||||
			apic_printk(APIC_VERBOSE,
 | 
					 | 
				
			||||||
				" (apicid-pin) not connected\n");
 | 
					 | 
				
			||||||
			notcon = 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		irq = pin_2_irq(idx, apic_id, pin);
 | 
							irq = pin_2_irq(idx, apic_id, pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1423,25 +1408,24 @@ static void __init setup_IO_APIC_irqs(void)
 | 
				
			||||||
		 * installed and if it returns 1:
 | 
							 * installed and if it returns 1:
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (apic->multi_timer_check &&
 | 
							if (apic->multi_timer_check &&
 | 
				
			||||||
				apic->multi_timer_check(apic_id, irq))
 | 
							    apic->multi_timer_check(apic_id, irq))
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		cfg = alloc_irq_and_cfg_at(irq, node);
 | 
							set_io_apic_irq_attr(&attr, apic_id, pin, irq_trigger(idx),
 | 
				
			||||||
		if (!cfg)
 | 
									     irq_polarity(idx));
 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		add_pin_to_irq_node(cfg, node, apic_id, pin);
 | 
							io_apic_setup_irq_pin(irq, node, &attr);
 | 
				
			||||||
		/*
 | 
					 | 
				
			||||||
		 * don't mark it in pin_programmed, so later acpi could
 | 
					 | 
				
			||||||
		 * set it correctly when irq < 16
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
		setup_ioapic_irq(apic_id, pin, irq, cfg, irq_trigger(idx),
 | 
					 | 
				
			||||||
				  irq_polarity(idx));
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (notcon)
 | 
					static void __init setup_IO_APIC_irqs(void)
 | 
				
			||||||
		apic_printk(APIC_VERBOSE,
 | 
					{
 | 
				
			||||||
			" (apicid-pin) not connected\n");
 | 
						unsigned int apic_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (apic_id = 0; apic_id < nr_ioapics; apic_id++)
 | 
				
			||||||
 | 
							__io_apic_setup_irqs(apic_id);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -1452,7 +1436,7 @@ static void __init setup_IO_APIC_irqs(void)
 | 
				
			||||||
void setup_IO_APIC_irq_extra(u32 gsi)
 | 
					void setup_IO_APIC_irq_extra(u32 gsi)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int apic_id = 0, pin, idx, irq, node = cpu_to_node(0);
 | 
						int apic_id = 0, pin, idx, irq, node = cpu_to_node(0);
 | 
				
			||||||
	struct irq_cfg *cfg;
 | 
						struct io_apic_irq_attr attr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Convert 'gsi' to 'ioapic.pin'.
 | 
						 * Convert 'gsi' to 'ioapic.pin'.
 | 
				
			||||||
| 
						 | 
					@ -1472,21 +1456,10 @@ void setup_IO_APIC_irq_extra(u32 gsi)
 | 
				
			||||||
	if (apic_id == 0 || irq < NR_IRQS_LEGACY)
 | 
						if (apic_id == 0 || irq < NR_IRQS_LEGACY)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cfg = alloc_irq_and_cfg_at(irq, node);
 | 
						set_io_apic_irq_attr(&attr, apic_id, pin, irq_trigger(idx),
 | 
				
			||||||
	if (!cfg)
 | 
								     irq_polarity(idx));
 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	add_pin_to_irq_node(cfg, node, apic_id, pin);
 | 
						io_apic_setup_irq_pin_once(irq, node, &attr);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (test_bit(pin, mp_ioapic_routing[apic_id].pin_programmed)) {
 | 
					 | 
				
			||||||
		pr_debug("Pin %d-%d already programmed\n",
 | 
					 | 
				
			||||||
			 mp_ioapics[apic_id].apicid, pin);
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	set_bit(pin, mp_ioapic_routing[apic_id].pin_programmed);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	setup_ioapic_irq(apic_id, pin, irq, cfg,
 | 
					 | 
				
			||||||
			irq_trigger(idx), irq_polarity(idx));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -3605,7 +3578,40 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif /* CONFIG_HT_IRQ */
 | 
					#endif /* CONFIG_HT_IRQ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int __init io_apic_get_redir_entries (int ioapic)
 | 
					int
 | 
				
			||||||
 | 
					io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct irq_cfg *cfg = alloc_irq_and_cfg_at(irq, node);
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!cfg)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						ret = __add_pin_to_irq_node(cfg, node, attr->ioapic, attr->ioapic_pin);
 | 
				
			||||||
 | 
						if (!ret)
 | 
				
			||||||
 | 
							setup_ioapic_irq(attr->ioapic, attr->ioapic_pin, irq, cfg,
 | 
				
			||||||
 | 
									 attr->trigger, attr->polarity);
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int io_apic_setup_irq_pin_once(unsigned int irq, int node,
 | 
				
			||||||
 | 
									      struct io_apic_irq_attr *attr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned int id = attr->ioapic, pin = attr->ioapic_pin;
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Avoid redundant programming */
 | 
				
			||||||
 | 
						if (test_bit(pin, mp_ioapic_routing[id].pin_programmed)) {
 | 
				
			||||||
 | 
							pr_debug("Pin %d-%d already programmed\n",
 | 
				
			||||||
 | 
								 mp_ioapics[id].apicid, pin);
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ret = io_apic_setup_irq_pin(irq, node, attr);
 | 
				
			||||||
 | 
						if (!ret)
 | 
				
			||||||
 | 
							set_bit(pin, mp_ioapic_routing[id].pin_programmed);
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int __init io_apic_get_redir_entries(int ioapic)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	union IO_APIC_reg_01	reg_01;
 | 
						union IO_APIC_reg_01	reg_01;
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
| 
						 | 
					@ -3659,96 +3665,24 @@ int __init arch_probe_nr_irqs(void)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __io_apic_set_pci_routing(struct device *dev, int irq,
 | 
					int io_apic_set_pci_routing(struct device *dev, int irq,
 | 
				
			||||||
				struct io_apic_irq_attr *irq_attr)
 | 
								    struct io_apic_irq_attr *irq_attr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct irq_cfg *cfg;
 | 
					 | 
				
			||||||
	int node;
 | 
						int node;
 | 
				
			||||||
	int ioapic, pin;
 | 
					 | 
				
			||||||
	int trigger, polarity;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ioapic = irq_attr->ioapic;
 | 
					 | 
				
			||||||
	if (!IO_APIC_IRQ(irq)) {
 | 
						if (!IO_APIC_IRQ(irq)) {
 | 
				
			||||||
		apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
 | 
							apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
 | 
				
			||||||
			ioapic);
 | 
								    irq_attr->ioapic);
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (dev)
 | 
						node = dev ? dev_to_node(dev) : cpu_to_node(0);
 | 
				
			||||||
		node = dev_to_node(dev);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		node = cpu_to_node(0);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cfg = alloc_irq_and_cfg_at(irq, node);
 | 
						return io_apic_setup_irq_pin_once(irq, node, irq_attr);
 | 
				
			||||||
	if (!cfg)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pin = irq_attr->ioapic_pin;
 | 
					 | 
				
			||||||
	trigger = irq_attr->trigger;
 | 
					 | 
				
			||||||
	polarity = irq_attr->polarity;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * IRQs < 16 are already in the irq_2_pin[] map
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	if (irq >= legacy_pic->nr_legacy_irqs) {
 | 
					 | 
				
			||||||
		if (__add_pin_to_irq_node(cfg, node, ioapic, pin)) {
 | 
					 | 
				
			||||||
			printk(KERN_INFO "can not add pin %d for irq %d\n",
 | 
					 | 
				
			||||||
				pin, irq);
 | 
					 | 
				
			||||||
			return 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	setup_ioapic_irq(ioapic, pin, irq, cfg, trigger, polarity);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int io_apic_set_pci_routing(struct device *dev, int irq,
 | 
					 | 
				
			||||||
				struct io_apic_irq_attr *irq_attr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	int ioapic, pin;
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * Avoid pin reprogramming.  PRTs typically include entries
 | 
					 | 
				
			||||||
	 * with redundant pin->gsi mappings (but unique PCI devices);
 | 
					 | 
				
			||||||
	 * we only program the IOAPIC on the first.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	ioapic = irq_attr->ioapic;
 | 
					 | 
				
			||||||
	pin = irq_attr->ioapic_pin;
 | 
					 | 
				
			||||||
	if (test_bit(pin, mp_ioapic_routing[ioapic].pin_programmed)) {
 | 
					 | 
				
			||||||
		pr_debug("Pin %d-%d already programmed\n",
 | 
					 | 
				
			||||||
			 mp_ioapics[ioapic].apicid, pin);
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	set_bit(pin, mp_ioapic_routing[ioapic].pin_programmed);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return __io_apic_set_pci_routing(dev, irq, irq_attr);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
u8 __init io_apic_unique_id(u8 id)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#ifdef CONFIG_X86_32
 | 
					 | 
				
			||||||
	if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
 | 
					 | 
				
			||||||
	    !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
 | 
					 | 
				
			||||||
		return io_apic_get_unique_id(nr_ioapics, id);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		return id;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	int i;
 | 
					 | 
				
			||||||
	DECLARE_BITMAP(used, 256);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	bitmap_zero(used, 256);
 | 
					 | 
				
			||||||
	for (i = 0; i < nr_ioapics; i++) {
 | 
					 | 
				
			||||||
		struct mpc_ioapic *ia = &mp_ioapics[i];
 | 
					 | 
				
			||||||
		__set_bit(ia->apicid, used);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (!test_bit(id, used))
 | 
					 | 
				
			||||||
		return id;
 | 
					 | 
				
			||||||
	return find_first_zero_bit(used, 256);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_X86_32
 | 
					#ifdef CONFIG_X86_32
 | 
				
			||||||
int __init io_apic_get_unique_id(int ioapic, int apic_id)
 | 
					static int __init io_apic_get_unique_id(int ioapic, int apic_id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	union IO_APIC_reg_00 reg_00;
 | 
						union IO_APIC_reg_00 reg_00;
 | 
				
			||||||
	static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
 | 
						static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
 | 
				
			||||||
| 
						 | 
					@ -3821,9 +3755,33 @@ int __init io_apic_get_unique_id(int ioapic, int apic_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return apic_id;
 | 
						return apic_id;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static u8 __init io_apic_unique_id(u8 id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
 | 
				
			||||||
 | 
						    !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
 | 
				
			||||||
 | 
							return io_apic_get_unique_id(nr_ioapics, id);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return id;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					static u8 __init io_apic_unique_id(u8 id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
						DECLARE_BITMAP(used, 256);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bitmap_zero(used, 256);
 | 
				
			||||||
 | 
						for (i = 0; i < nr_ioapics; i++) {
 | 
				
			||||||
 | 
							struct mpc_ioapic *ia = &mp_ioapics[i];
 | 
				
			||||||
 | 
							__set_bit(ia->apicid, used);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (!test_bit(id, used))
 | 
				
			||||||
 | 
							return id;
 | 
				
			||||||
 | 
						return find_first_zero_bit(used, 256);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int __init io_apic_get_version(int ioapic)
 | 
					static int __init io_apic_get_version(int ioapic)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	union IO_APIC_reg_01	reg_01;
 | 
						union IO_APIC_reg_01	reg_01;
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
| 
						 | 
					@ -4026,7 +3984,7 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi)
 | 
				
			||||||
	return gsi - mp_gsi_routing[ioapic].gsi_base;
 | 
						return gsi - mp_gsi_routing[ioapic].gsi_base;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int bad_ioapic(unsigned long address)
 | 
					static __init int bad_ioapic(unsigned long address)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (nr_ioapics >= MAX_IO_APICS) {
 | 
						if (nr_ioapics >= MAX_IO_APICS) {
 | 
				
			||||||
		printk(KERN_WARNING "WARING: Max # of I/O APICs (%d) exceeded "
 | 
							printk(KERN_WARNING "WARING: Max # of I/O APICs (%d) exceeded "
 | 
				
			||||||
| 
						 | 
					@ -4086,20 +4044,15 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
 | 
				
			||||||
/* Enable IOAPIC early just for system timer */
 | 
					/* Enable IOAPIC early just for system timer */
 | 
				
			||||||
void __init pre_init_apic_IRQ0(void)
 | 
					void __init pre_init_apic_IRQ0(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct irq_cfg *cfg;
 | 
						struct io_apic_irq_attr attr = { 0, 0, 0, 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printk(KERN_INFO "Early APIC setup for system timer0\n");
 | 
						printk(KERN_INFO "Early APIC setup for system timer0\n");
 | 
				
			||||||
#ifndef CONFIG_SMP
 | 
					#ifndef CONFIG_SMP
 | 
				
			||||||
	physid_set_mask_of_physid(boot_cpu_physical_apicid,
 | 
						physid_set_mask_of_physid(boot_cpu_physical_apicid,
 | 
				
			||||||
					 &phys_cpu_present_map);
 | 
										 &phys_cpu_present_map);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	/* Make sure the irq descriptor is set up */
 | 
					 | 
				
			||||||
	cfg = alloc_irq_and_cfg_at(0, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	setup_local_APIC();
 | 
						setup_local_APIC();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	add_pin_to_irq_node(cfg, 0, 0, 0);
 | 
						io_apic_setup_irq_pin(0, 0, &attr);
 | 
				
			||||||
	set_irq_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, "edge");
 | 
						set_irq_chip_and_handler_name(0, &ioapic_chip, handle_edge_irq, "edge");
 | 
				
			||||||
 | 
					 | 
				
			||||||
	setup_ioapic_irq(0, 0, 0, cfg, 0, 0);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,6 +64,7 @@
 | 
				
			||||||
#include <asm/mtrr.h>
 | 
					#include <asm/mtrr.h>
 | 
				
			||||||
#include <asm/mwait.h>
 | 
					#include <asm/mwait.h>
 | 
				
			||||||
#include <asm/apic.h>
 | 
					#include <asm/apic.h>
 | 
				
			||||||
 | 
					#include <asm/io_apic.h>
 | 
				
			||||||
#include <asm/setup.h>
 | 
					#include <asm/setup.h>
 | 
				
			||||||
#include <asm/uv/uv.h>
 | 
					#include <asm/uv/uv.h>
 | 
				
			||||||
#include <linux/mc146818rtc.h>
 | 
					#include <linux/mc146818rtc.h>
 | 
				
			||||||
| 
						 | 
					@ -945,6 +946,14 @@ int __cpuinit native_cpu_up(unsigned int cpu)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * arch_disable_smp_support() - disables SMP support for x86 at runtime
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void arch_disable_smp_support(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						disable_ioapic_support();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Fall back to non SMP mode after errors.
 | 
					 * Fall back to non SMP mode after errors.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -1045,7 +1054,7 @@ static int __init smp_sanity_check(unsigned max_cpus)
 | 
				
			||||||
				"(tell your hw vendor)\n");
 | 
									"(tell your hw vendor)\n");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		smpboot_clear_io_apic();
 | 
							smpboot_clear_io_apic();
 | 
				
			||||||
		arch_disable_smp_support();
 | 
							disable_ioapic_support();
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -866,8 +866,9 @@ static int popen(struct atm_vcc *vcc)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
 | 
						skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
 | 
				
			||||||
	if (!skb && net_ratelimit()) {
 | 
						if (!skb) {
 | 
				
			||||||
		dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
 | 
							if (net_ratelimit())
 | 
				
			||||||
 | 
								dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
 | 
				
			||||||
		return -ENOMEM;
 | 
							return -ENOMEM;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	header = (void *)skb_put(skb, sizeof(*header));
 | 
						header = (void *)skb_put(skb, sizeof(*header));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,6 +39,8 @@ static struct usb_device_id ath3k_table[] = {
 | 
				
			||||||
	/* Atheros AR3011 with sflash firmware*/
 | 
						/* Atheros AR3011 with sflash firmware*/
 | 
				
			||||||
	{ USB_DEVICE(0x0CF3, 0x3002) },
 | 
						{ USB_DEVICE(0x0CF3, 0x3002) },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Atheros AR9285 Malbec with sflash firmware */
 | 
				
			||||||
 | 
						{ USB_DEVICE(0x03F0, 0x311D) },
 | 
				
			||||||
	{ }	/* Terminating entry */
 | 
						{ }	/* Terminating entry */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,6 +102,9 @@ static struct usb_device_id blacklist_table[] = {
 | 
				
			||||||
	/* Atheros 3011 with sflash firmware */
 | 
						/* Atheros 3011 with sflash firmware */
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
 | 
						{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Atheros AR9285 Malbec with sflash firmware */
 | 
				
			||||||
 | 
						{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Broadcom BCM2035 */
 | 
						/* Broadcom BCM2035 */
 | 
				
			||||||
	{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
 | 
						{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
 | 
				
			||||||
	{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
 | 
						{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -577,11 +577,9 @@ duration:
 | 
				
			||||||
	if (rc)
 | 
						if (rc)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 ||
 | 
						if (be32_to_cpu(tpm_cmd.header.out.return_code)
 | 
				
			||||||
	    be32_to_cpu(tpm_cmd.header.out.length)
 | 
						    != 3 * sizeof(u32))
 | 
				
			||||||
	    != sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32))
 | 
					 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	duration_cap = &tpm_cmd.params.getcap_out.cap.duration;
 | 
						duration_cap = &tpm_cmd.params.getcap_out.cap.duration;
 | 
				
			||||||
	chip->vendor.duration[TPM_SHORT] =
 | 
						chip->vendor.duration[TPM_SHORT] =
 | 
				
			||||||
	    usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_short));
 | 
						    usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_short));
 | 
				
			||||||
| 
						 | 
					@ -941,18 +939,6 @@ ssize_t tpm_show_caps_1_2(struct device * dev,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(tpm_show_caps_1_2);
 | 
					EXPORT_SYMBOL_GPL(tpm_show_caps_1_2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ssize_t tpm_show_timeouts(struct device *dev, struct device_attribute *attr,
 | 
					 | 
				
			||||||
			  char *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct tpm_chip *chip = dev_get_drvdata(dev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return sprintf(buf, "%d %d %d\n",
 | 
					 | 
				
			||||||
	               jiffies_to_usecs(chip->vendor.duration[TPM_SHORT]),
 | 
					 | 
				
			||||||
	               jiffies_to_usecs(chip->vendor.duration[TPM_MEDIUM]),
 | 
					 | 
				
			||||||
	               jiffies_to_usecs(chip->vendor.duration[TPM_LONG]));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
EXPORT_SYMBOL_GPL(tpm_show_timeouts);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr,
 | 
					ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr,
 | 
				
			||||||
			const char *buf, size_t count)
 | 
								const char *buf, size_t count)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,8 +56,6 @@ extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr,
 | 
				
			||||||
				char *);
 | 
									char *);
 | 
				
			||||||
extern ssize_t tpm_show_temp_deactivated(struct device *,
 | 
					extern ssize_t tpm_show_temp_deactivated(struct device *,
 | 
				
			||||||
					 struct device_attribute *attr, char *);
 | 
										 struct device_attribute *attr, char *);
 | 
				
			||||||
extern ssize_t tpm_show_timeouts(struct device *,
 | 
					 | 
				
			||||||
				 struct device_attribute *attr, char *);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct tpm_chip;
 | 
					struct tpm_chip;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -376,7 +376,6 @@ static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated,
 | 
				
			||||||
		   NULL);
 | 
							   NULL);
 | 
				
			||||||
static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL);
 | 
					static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL);
 | 
				
			||||||
static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel);
 | 
					static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel);
 | 
				
			||||||
static DEVICE_ATTR(timeouts, S_IRUGO, tpm_show_timeouts, NULL);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct attribute *tis_attrs[] = {
 | 
					static struct attribute *tis_attrs[] = {
 | 
				
			||||||
	&dev_attr_pubek.attr,
 | 
						&dev_attr_pubek.attr,
 | 
				
			||||||
| 
						 | 
					@ -386,8 +385,7 @@ static struct attribute *tis_attrs[] = {
 | 
				
			||||||
	&dev_attr_owned.attr,
 | 
						&dev_attr_owned.attr,
 | 
				
			||||||
	&dev_attr_temp_deactivated.attr,
 | 
						&dev_attr_temp_deactivated.attr,
 | 
				
			||||||
	&dev_attr_caps.attr,
 | 
						&dev_attr_caps.attr,
 | 
				
			||||||
	&dev_attr_cancel.attr,
 | 
						&dev_attr_cancel.attr, NULL,
 | 
				
			||||||
	&dev_attr_timeouts.attr, NULL,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct attribute_group tis_attr_grp = {
 | 
					static struct attribute_group tis_attr_grp = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1553,17 +1553,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Backlight control */
 | 
					/* Backlight control */
 | 
				
			||||||
#define BLC_PWM_CTL		0x61254
 | 
					#define BLC_PWM_CTL		0x61254
 | 
				
			||||||
#define   BACKLIGHT_MODULATION_FREQ_SHIFT		(17)
 | 
					 | 
				
			||||||
#define BLC_PWM_CTL2		0x61250 /* 965+ only */
 | 
					#define BLC_PWM_CTL2		0x61250 /* 965+ only */
 | 
				
			||||||
#define   BLM_COMBINATION_MODE (1 << 30)
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * This is the most significant 15 bits of the number of backlight cycles in a
 | 
					 | 
				
			||||||
 * complete cycle of the modulated backlight control.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The actual value is this field multiplied by two.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#define   BACKLIGHT_MODULATION_FREQ_MASK		(0x7fff << 17)
 | 
					 | 
				
			||||||
#define   BLM_LEGACY_MODE				(1 << 16)
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * This is the number of cycles out of the backlight modulation cycle for which
 | 
					 * This is the number of cycles out of the backlight modulation cycle for which
 | 
				
			||||||
 * the backlight is on.
 | 
					 * the backlight is on.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,8 +30,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "intel_drv.h"
 | 
					#include "intel_drv.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
 | 
					intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
 | 
				
			||||||
		       struct drm_display_mode *adjusted_mode)
 | 
							       struct drm_display_mode *adjusted_mode)
 | 
				
			||||||
| 
						 | 
					@ -112,19 +110,6 @@ done:
 | 
				
			||||||
	dev_priv->pch_pf_size = (width << 16) | height;
 | 
						dev_priv->pch_pf_size = (width << 16) | height;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int is_backlight_combination_mode(struct drm_device *dev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct drm_i915_private *dev_priv = dev->dev_private;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (INTEL_INFO(dev)->gen >= 4)
 | 
					 | 
				
			||||||
		return I915_READ(BLC_PWM_CTL2) & BLM_COMBINATION_MODE;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (IS_GEN2(dev))
 | 
					 | 
				
			||||||
		return I915_READ(BLC_PWM_CTL) & BLM_LEGACY_MODE;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv)
 | 
					static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 val;
 | 
						u32 val;
 | 
				
			||||||
| 
						 | 
					@ -181,9 +166,6 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev)
 | 
				
			||||||
			if (INTEL_INFO(dev)->gen < 4)
 | 
								if (INTEL_INFO(dev)->gen < 4)
 | 
				
			||||||
				max &= ~1;
 | 
									max &= ~1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (is_backlight_combination_mode(dev))
 | 
					 | 
				
			||||||
			max *= 0xff;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max);
 | 
						DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max);
 | 
				
			||||||
| 
						 | 
					@ -201,15 +183,6 @@ u32 intel_panel_get_backlight(struct drm_device *dev)
 | 
				
			||||||
		val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
 | 
							val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
 | 
				
			||||||
		if (IS_PINEVIEW(dev))
 | 
							if (IS_PINEVIEW(dev))
 | 
				
			||||||
			val >>= 1;
 | 
								val >>= 1;
 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (is_backlight_combination_mode(dev)){
 | 
					 | 
				
			||||||
			u8 lbpc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			val &= ~1;
 | 
					 | 
				
			||||||
			pci_read_config_byte(dev->pdev, PCI_LBPC, &lbpc);
 | 
					 | 
				
			||||||
			val *= lbpc;
 | 
					 | 
				
			||||||
			val >>= 1;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
 | 
						DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
 | 
				
			||||||
| 
						 | 
					@ -232,16 +205,6 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (HAS_PCH_SPLIT(dev))
 | 
						if (HAS_PCH_SPLIT(dev))
 | 
				
			||||||
		return intel_pch_panel_set_backlight(dev, level);
 | 
							return intel_pch_panel_set_backlight(dev, level);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (is_backlight_combination_mode(dev)){
 | 
					 | 
				
			||||||
		u32 max = intel_panel_get_max_backlight(dev);
 | 
					 | 
				
			||||||
		u8 lpbc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		lpbc = level * 0xfe / max + 1;
 | 
					 | 
				
			||||||
		level /= lpbc;
 | 
					 | 
				
			||||||
		pci_write_config_byte(dev->pdev, PCI_LBPC, lpbc);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	tmp = I915_READ(BLC_PWM_CTL);
 | 
						tmp = I915_READ(BLC_PWM_CTL);
 | 
				
			||||||
	if (IS_PINEVIEW(dev)) {
 | 
						if (IS_PINEVIEW(dev)) {
 | 
				
			||||||
		tmp &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1);
 | 
							tmp &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -238,13 +238,13 @@ config SENSORS_K8TEMP
 | 
				
			||||||
	  will be called k8temp.
 | 
						  will be called k8temp.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config SENSORS_K10TEMP
 | 
					config SENSORS_K10TEMP
 | 
				
			||||||
	tristate "AMD Phenom/Sempron/Turion/Opteron temperature sensor"
 | 
						tristate "AMD Family 10h/11h/12h/14h temperature sensor"
 | 
				
			||||||
	depends on X86 && PCI
 | 
						depends on X86 && PCI
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  If you say yes here you get support for the temperature
 | 
						  If you say yes here you get support for the temperature
 | 
				
			||||||
	  sensor(s) inside your CPU. Supported are later revisions of
 | 
						  sensor(s) inside your CPU. Supported are later revisions of
 | 
				
			||||||
	  the AMD Family 10h and all revisions of the AMD Family 11h
 | 
						  the AMD Family 10h and all revisions of the AMD Family 11h,
 | 
				
			||||||
	  microarchitectures.
 | 
						  12h (Llano), and 14h (Brazos) microarchitectures.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  This driver can also be built as a module.  If so, the module
 | 
						  This driver can also be built as a module.  If so, the module
 | 
				
			||||||
	  will be called k10temp.
 | 
						  will be called k10temp.
 | 
				
			||||||
| 
						 | 
					@ -455,13 +455,14 @@ config SENSORS_JZ4740
 | 
				
			||||||
	  called jz4740-hwmon.
 | 
						  called jz4740-hwmon.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config SENSORS_JC42
 | 
					config SENSORS_JC42
 | 
				
			||||||
	tristate "JEDEC JC42.4 compliant temperature sensors"
 | 
						tristate "JEDEC JC42.4 compliant memory module temperature sensors"
 | 
				
			||||||
	depends on I2C
 | 
						depends on I2C
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  If you say yes here you get support for Jedec JC42.4 compliant
 | 
						  If you say yes here, you get support for JEDEC JC42.4 compliant
 | 
				
			||||||
	  temperature sensors. Support will include, but not be limited to,
 | 
						  temperature sensors, which are used on many DDR3 memory modules for
 | 
				
			||||||
	  ADT7408, CAT34TS02,, CAT6095, MAX6604, MCP9805, MCP98242, MCP98243,
 | 
						  mobile devices and servers.  Support will include, but not be limited
 | 
				
			||||||
	  MCP9843, SE97, SE98, STTS424, TSE2002B3, and TS3000B3.
 | 
						  to, ADT7408, CAT34TS02, CAT6095, MAX6604, MCP9805, MCP98242, MCP98243,
 | 
				
			||||||
 | 
						  MCP9843, SE97, SE98, STTS424(E), TSE2002B3, and TS3000B3.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  This driver can also be built as a module.  If so, the module
 | 
						  This driver can also be built as a module.  If so, the module
 | 
				
			||||||
	  will be called jc42.
 | 
						  will be called jc42.
 | 
				
			||||||
| 
						 | 
					@ -574,7 +575,7 @@ config SENSORS_LM85
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  If you say yes here you get support for National Semiconductor LM85
 | 
						  If you say yes here you get support for National Semiconductor LM85
 | 
				
			||||||
	  sensor chips and clones: ADM1027, ADT7463, ADT7468, EMC6D100,
 | 
						  sensor chips and clones: ADM1027, ADT7463, ADT7468, EMC6D100,
 | 
				
			||||||
	  EMC6D101 and EMC6D102.
 | 
						  EMC6D101, EMC6D102, and EMC6D103.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  This driver can also be built as a module.  If so, the module
 | 
						  This driver can also be built as a module.  If so, the module
 | 
				
			||||||
	  will be called lm85.
 | 
						  will be called lm85.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,8 @@ static const unsigned short normal_i2c[] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Configuration register defines */
 | 
					/* Configuration register defines */
 | 
				
			||||||
#define JC42_CFG_CRIT_ONLY	(1 << 2)
 | 
					#define JC42_CFG_CRIT_ONLY	(1 << 2)
 | 
				
			||||||
 | 
					#define JC42_CFG_TCRIT_LOCK	(1 << 6)
 | 
				
			||||||
 | 
					#define JC42_CFG_EVENT_LOCK	(1 << 7)
 | 
				
			||||||
#define JC42_CFG_SHUTDOWN	(1 << 8)
 | 
					#define JC42_CFG_SHUTDOWN	(1 << 8)
 | 
				
			||||||
#define JC42_CFG_HYST_SHIFT	9
 | 
					#define JC42_CFG_HYST_SHIFT	9
 | 
				
			||||||
#define JC42_CFG_HYST_MASK	0x03
 | 
					#define JC42_CFG_HYST_MASK	0x03
 | 
				
			||||||
| 
						 | 
					@ -332,7 +334,7 @@ static ssize_t set_temp_crit_hyst(struct device *dev,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct i2c_client *client = to_i2c_client(dev);
 | 
						struct i2c_client *client = to_i2c_client(dev);
 | 
				
			||||||
	struct jc42_data *data = i2c_get_clientdata(client);
 | 
						struct jc42_data *data = i2c_get_clientdata(client);
 | 
				
			||||||
	long val;
 | 
						unsigned long val;
 | 
				
			||||||
	int diff, hyst;
 | 
						int diff, hyst;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
	int ret = count;
 | 
						int ret = count;
 | 
				
			||||||
| 
						 | 
					@ -380,14 +382,14 @@ static ssize_t show_alarm(struct device *dev,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static DEVICE_ATTR(temp1_input, S_IRUGO,
 | 
					static DEVICE_ATTR(temp1_input, S_IRUGO,
 | 
				
			||||||
		   show_temp_input, NULL);
 | 
							   show_temp_input, NULL);
 | 
				
			||||||
static DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO,
 | 
					static DEVICE_ATTR(temp1_crit, S_IRUGO,
 | 
				
			||||||
		   show_temp_crit, set_temp_crit);
 | 
							   show_temp_crit, set_temp_crit);
 | 
				
			||||||
static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO,
 | 
					static DEVICE_ATTR(temp1_min, S_IRUGO,
 | 
				
			||||||
		   show_temp_min, set_temp_min);
 | 
							   show_temp_min, set_temp_min);
 | 
				
			||||||
static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO,
 | 
					static DEVICE_ATTR(temp1_max, S_IRUGO,
 | 
				
			||||||
		   show_temp_max, set_temp_max);
 | 
							   show_temp_max, set_temp_max);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO,
 | 
					static DEVICE_ATTR(temp1_crit_hyst, S_IRUGO,
 | 
				
			||||||
		   show_temp_crit_hyst, set_temp_crit_hyst);
 | 
							   show_temp_crit_hyst, set_temp_crit_hyst);
 | 
				
			||||||
static DEVICE_ATTR(temp1_max_hyst, S_IRUGO,
 | 
					static DEVICE_ATTR(temp1_max_hyst, S_IRUGO,
 | 
				
			||||||
		   show_temp_max_hyst, NULL);
 | 
							   show_temp_max_hyst, NULL);
 | 
				
			||||||
| 
						 | 
					@ -412,8 +414,31 @@ static struct attribute *jc42_attributes[] = {
 | 
				
			||||||
	NULL
 | 
						NULL
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static mode_t jc42_attribute_mode(struct kobject *kobj,
 | 
				
			||||||
 | 
									  struct attribute *attr, int index)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct device *dev = container_of(kobj, struct device, kobj);
 | 
				
			||||||
 | 
						struct i2c_client *client = to_i2c_client(dev);
 | 
				
			||||||
 | 
						struct jc42_data *data = i2c_get_clientdata(client);
 | 
				
			||||||
 | 
						unsigned int config = data->config;
 | 
				
			||||||
 | 
						bool readonly;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (attr == &dev_attr_temp1_crit.attr)
 | 
				
			||||||
 | 
							readonly = config & JC42_CFG_TCRIT_LOCK;
 | 
				
			||||||
 | 
						else if (attr == &dev_attr_temp1_min.attr ||
 | 
				
			||||||
 | 
							 attr == &dev_attr_temp1_max.attr)
 | 
				
			||||||
 | 
							readonly = config & JC42_CFG_EVENT_LOCK;
 | 
				
			||||||
 | 
						else if (attr == &dev_attr_temp1_crit_hyst.attr)
 | 
				
			||||||
 | 
							readonly = config & (JC42_CFG_EVENT_LOCK | JC42_CFG_TCRIT_LOCK);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							readonly = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return S_IRUGO | (readonly ? 0 : S_IWUSR);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct attribute_group jc42_group = {
 | 
					static const struct attribute_group jc42_group = {
 | 
				
			||||||
	.attrs = jc42_attributes,
 | 
						.attrs = jc42_attributes,
 | 
				
			||||||
 | 
						.is_visible = jc42_attribute_mode,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Return 0 if detection is successful, -ENODEV otherwise */
 | 
					/* Return 0 if detection is successful, -ENODEV otherwise */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * k10temp.c - AMD Family 10h/11h processor hardware monitoring
 | 
					 * k10temp.c - AMD Family 10h/11h/12h/14h processor hardware monitoring
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Copyright (c) 2009 Clemens Ladisch <clemens@ladisch.de>
 | 
					 * Copyright (c) 2009 Clemens Ladisch <clemens@ladisch.de>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@
 | 
				
			||||||
#include <linux/pci.h>
 | 
					#include <linux/pci.h>
 | 
				
			||||||
#include <asm/processor.h>
 | 
					#include <asm/processor.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MODULE_DESCRIPTION("AMD Family 10h/11h CPU core temperature monitor");
 | 
					MODULE_DESCRIPTION("AMD Family 10h/11h/12h/14h CPU core temperature monitor");
 | 
				
			||||||
MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
 | 
					MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
 | 
				
			||||||
MODULE_LICENSE("GPL");
 | 
					MODULE_LICENSE("GPL");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -208,6 +208,7 @@ static void __devexit k10temp_remove(struct pci_dev *pdev)
 | 
				
			||||||
static const struct pci_device_id k10temp_id_table[] = {
 | 
					static const struct pci_device_id k10temp_id_table[] = {
 | 
				
			||||||
	{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) },
 | 
						{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) },
 | 
				
			||||||
	{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_11H_NB_MISC) },
 | 
						{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_11H_NB_MISC) },
 | 
				
			||||||
 | 
						{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CNB17H_F3) },
 | 
				
			||||||
	{}
 | 
						{}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
MODULE_DEVICE_TABLE(pci, k10temp_id_table);
 | 
					MODULE_DEVICE_TABLE(pci, k10temp_id_table);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,7 @@ static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
 | 
				
			||||||
enum chips {
 | 
					enum chips {
 | 
				
			||||||
	any_chip, lm85b, lm85c,
 | 
						any_chip, lm85b, lm85c,
 | 
				
			||||||
	adm1027, adt7463, adt7468,
 | 
						adm1027, adt7463, adt7468,
 | 
				
			||||||
	emc6d100, emc6d102
 | 
						emc6d100, emc6d102, emc6d103
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* The LM85 registers */
 | 
					/* The LM85 registers */
 | 
				
			||||||
| 
						 | 
					@ -90,6 +90,9 @@ enum chips {
 | 
				
			||||||
#define	LM85_VERSTEP_EMC6D100_A0        0x60
 | 
					#define	LM85_VERSTEP_EMC6D100_A0        0x60
 | 
				
			||||||
#define	LM85_VERSTEP_EMC6D100_A1        0x61
 | 
					#define	LM85_VERSTEP_EMC6D100_A1        0x61
 | 
				
			||||||
#define	LM85_VERSTEP_EMC6D102		0x65
 | 
					#define	LM85_VERSTEP_EMC6D102		0x65
 | 
				
			||||||
 | 
					#define	LM85_VERSTEP_EMC6D103_A0	0x68
 | 
				
			||||||
 | 
					#define	LM85_VERSTEP_EMC6D103_A1	0x69
 | 
				
			||||||
 | 
					#define	LM85_VERSTEP_EMC6D103S		0x6A	/* Also known as EMC6D103:A2 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	LM85_REG_CONFIG			0x40
 | 
					#define	LM85_REG_CONFIG			0x40
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -348,6 +351,7 @@ static const struct i2c_device_id lm85_id[] = {
 | 
				
			||||||
	{ "emc6d100", emc6d100 },
 | 
						{ "emc6d100", emc6d100 },
 | 
				
			||||||
	{ "emc6d101", emc6d100 },
 | 
						{ "emc6d101", emc6d100 },
 | 
				
			||||||
	{ "emc6d102", emc6d102 },
 | 
						{ "emc6d102", emc6d102 },
 | 
				
			||||||
 | 
						{ "emc6d103", emc6d103 },
 | 
				
			||||||
	{ }
 | 
						{ }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
MODULE_DEVICE_TABLE(i2c, lm85_id);
 | 
					MODULE_DEVICE_TABLE(i2c, lm85_id);
 | 
				
			||||||
| 
						 | 
					@ -1250,6 +1254,20 @@ static int lm85_detect(struct i2c_client *client, struct i2c_board_info *info)
 | 
				
			||||||
		case LM85_VERSTEP_EMC6D102:
 | 
							case LM85_VERSTEP_EMC6D102:
 | 
				
			||||||
			type_name = "emc6d102";
 | 
								type_name = "emc6d102";
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case LM85_VERSTEP_EMC6D103_A0:
 | 
				
			||||||
 | 
							case LM85_VERSTEP_EMC6D103_A1:
 | 
				
			||||||
 | 
								type_name = "emc6d103";
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * Registers apparently missing in EMC6D103S/EMC6D103:A2
 | 
				
			||||||
 | 
							 * compared to EMC6D103:A0, EMC6D103:A1, and EMC6D102
 | 
				
			||||||
 | 
							 * (according to the data sheets), but used unconditionally
 | 
				
			||||||
 | 
							 * in the driver: 62[5:7], 6D[0:7], and 6E[0:7].
 | 
				
			||||||
 | 
							 * So skip EMC6D103S for now.
 | 
				
			||||||
 | 
							case LM85_VERSTEP_EMC6D103S:
 | 
				
			||||||
 | 
								type_name = "emc6d103s";
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		dev_dbg(&adapter->dev,
 | 
							dev_dbg(&adapter->dev,
 | 
				
			||||||
| 
						 | 
					@ -1283,6 +1301,7 @@ static int lm85_probe(struct i2c_client *client,
 | 
				
			||||||
	case adt7468:
 | 
						case adt7468:
 | 
				
			||||||
	case emc6d100:
 | 
						case emc6d100:
 | 
				
			||||||
	case emc6d102:
 | 
						case emc6d102:
 | 
				
			||||||
 | 
						case emc6d103:
 | 
				
			||||||
		data->freq_map = adm1027_freq_map;
 | 
							data->freq_map = adm1027_freq_map;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
| 
						 | 
					@ -1468,7 +1487,7 @@ static struct lm85_data *lm85_update_device(struct device *dev)
 | 
				
			||||||
			/* More alarm bits */
 | 
								/* More alarm bits */
 | 
				
			||||||
			data->alarms |= lm85_read_value(client,
 | 
								data->alarms |= lm85_read_value(client,
 | 
				
			||||||
						EMC6D100_REG_ALARM3) << 16;
 | 
											EMC6D100_REG_ALARM3) << 16;
 | 
				
			||||||
		} else if (data->type == emc6d102) {
 | 
							} else if (data->type == emc6d102 || data->type == emc6d103) {
 | 
				
			||||||
			/* Have to read LSB bits after the MSB ones because
 | 
								/* Have to read LSB bits after the MSB ones because
 | 
				
			||||||
			   the reading of the MSB bits has frozen the
 | 
								   the reading of the MSB bits has frozen the
 | 
				
			||||||
			   LSBs (backward from the ADM1027).
 | 
								   LSBs (backward from the ADM1027).
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1247,10 +1247,10 @@ static void
 | 
				
			||||||
l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
 | 
					l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct PStack *st = fi->userdata;
 | 
						struct PStack *st = fi->userdata;
 | 
				
			||||||
	struct sk_buff *skb, *oskb;
 | 
						struct sk_buff *skb;
 | 
				
			||||||
	struct Layer2 *l2 = &st->l2;
 | 
						struct Layer2 *l2 = &st->l2;
 | 
				
			||||||
	u_char header[MAX_HEADER_LEN];
 | 
						u_char header[MAX_HEADER_LEN];
 | 
				
			||||||
	int i;
 | 
						int i, hdr_space_needed;
 | 
				
			||||||
	int unsigned p1;
 | 
						int unsigned p1;
 | 
				
			||||||
	u_long flags;
 | 
						u_long flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1261,6 +1261,16 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
 | 
				
			||||||
	if (!skb)
 | 
						if (!skb)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hdr_space_needed = l2headersize(l2, 0);
 | 
				
			||||||
 | 
						if (hdr_space_needed > skb_headroom(skb)) {
 | 
				
			||||||
 | 
							struct sk_buff *orig_skb = skb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							skb = skb_realloc_headroom(skb, hdr_space_needed);
 | 
				
			||||||
 | 
							if (!skb) {
 | 
				
			||||||
 | 
								dev_kfree_skb(orig_skb);
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	spin_lock_irqsave(&l2->lock, flags);
 | 
						spin_lock_irqsave(&l2->lock, flags);
 | 
				
			||||||
	if(test_bit(FLG_MOD128, &l2->flag))
 | 
						if(test_bit(FLG_MOD128, &l2->flag))
 | 
				
			||||||
		p1 = (l2->vs - l2->va) % 128;
 | 
							p1 = (l2->vs - l2->va) % 128;
 | 
				
			||||||
| 
						 | 
					@ -1285,19 +1295,7 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
 | 
				
			||||||
		l2->vs = (l2->vs + 1) % 8;
 | 
							l2->vs = (l2->vs + 1) % 8;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	spin_unlock_irqrestore(&l2->lock, flags);
 | 
						spin_unlock_irqrestore(&l2->lock, flags);
 | 
				
			||||||
	p1 = skb->data - skb->head;
 | 
						memcpy(skb_push(skb, i), header, i);
 | 
				
			||||||
	if (p1 >= i)
 | 
					 | 
				
			||||||
		memcpy(skb_push(skb, i), header, i);
 | 
					 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		printk(KERN_WARNING
 | 
					 | 
				
			||||||
		"isdl2 pull_iqueue skb header(%d/%d) too short\n", i, p1);
 | 
					 | 
				
			||||||
		oskb = skb;
 | 
					 | 
				
			||||||
		skb = alloc_skb(oskb->len + i, GFP_ATOMIC);
 | 
					 | 
				
			||||||
		memcpy(skb_put(skb, i), header, i);
 | 
					 | 
				
			||||||
		skb_copy_from_linear_data(oskb,
 | 
					 | 
				
			||||||
					  skb_put(skb, oskb->len), oskb->len);
 | 
					 | 
				
			||||||
		dev_kfree_skb(oskb);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	st->l2.l2l1(st, PH_PULL | INDICATION, skb);
 | 
						st->l2.l2l1(st, PH_PULL | INDICATION, skb);
 | 
				
			||||||
	test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
 | 
						test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
 | 
				
			||||||
	if (!test_and_set_bit(FLG_T200_RUN, &st->l2.flag)) {
 | 
						if (!test_and_set_bit(FLG_T200_RUN, &st->l2.flag)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -621,7 +621,7 @@ static int __init memstick_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	workqueue = create_freezeable_workqueue("kmemstick");
 | 
						workqueue = create_freezable_workqueue("kmemstick");
 | 
				
			||||||
	if (!workqueue)
 | 
						if (!workqueue)
 | 
				
			||||||
		return -ENOMEM;
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -329,7 +329,7 @@ static int __init tifm_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	workqueue = create_freezeable_workqueue("tifm");
 | 
						workqueue = create_freezable_workqueue("tifm");
 | 
				
			||||||
	if (!workqueue)
 | 
						if (!workqueue)
 | 
				
			||||||
		return -ENOMEM;
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -785,7 +785,7 @@ static int __init vmballoon_init(void)
 | 
				
			||||||
	if (x86_hyper != &x86_hyper_vmware)
 | 
						if (x86_hyper != &x86_hyper_vmware)
 | 
				
			||||||
		return -ENODEV;
 | 
							return -ENODEV;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	vmballoon_wq = create_freezeable_workqueue("vmmemctl");
 | 
						vmballoon_wq = create_freezable_workqueue("vmmemctl");
 | 
				
			||||||
	if (!vmballoon_wq) {
 | 
						if (!vmballoon_wq) {
 | 
				
			||||||
		pr_err("failed to create workqueue\n");
 | 
							pr_err("failed to create workqueue\n");
 | 
				
			||||||
		return -ENOMEM;
 | 
							return -ENOMEM;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -930,7 +930,7 @@ int  r852_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	init_completion(&dev->dma_done);
 | 
						init_completion(&dev->dma_done);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dev->card_workqueue = create_freezeable_workqueue(DRV_NAME);
 | 
						dev->card_workqueue = create_freezable_workqueue(DRV_NAME);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!dev->card_workqueue)
 | 
						if (!dev->card_workqueue)
 | 
				
			||||||
		goto error9;
 | 
							goto error9;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1258,7 +1258,7 @@ static struct mtd_blktrans_ops sm_ftl_ops = {
 | 
				
			||||||
static __init int sm_module_init(void)
 | 
					static __init int sm_module_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int error = 0;
 | 
						int error = 0;
 | 
				
			||||||
	cache_flush_workqueue = create_freezeable_workqueue("smflush");
 | 
						cache_flush_workqueue = create_freezable_workqueue("smflush");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (IS_ERR(cache_flush_workqueue))
 | 
						if (IS_ERR(cache_flush_workqueue))
 | 
				
			||||||
		return PTR_ERR(cache_flush_workqueue);
 | 
							return PTR_ERR(cache_flush_workqueue);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -940,7 +940,7 @@ static int mcp251x_open(struct net_device *net)
 | 
				
			||||||
		goto open_unlock;
 | 
							goto open_unlock;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	priv->wq = create_freezeable_workqueue("mcp251x_wq");
 | 
						priv->wq = create_freezable_workqueue("mcp251x_wq");
 | 
				
			||||||
	INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler);
 | 
						INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler);
 | 
				
			||||||
	INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler);
 | 
						INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ config CAN_SOFTING
 | 
				
			||||||
config CAN_SOFTING_CS
 | 
					config CAN_SOFTING_CS
 | 
				
			||||||
	tristate "Softing Gmbh CAN pcmcia cards"
 | 
						tristate "Softing Gmbh CAN pcmcia cards"
 | 
				
			||||||
	depends on PCMCIA
 | 
						depends on PCMCIA
 | 
				
			||||||
	select CAN_SOFTING
 | 
						depends on CAN_SOFTING
 | 
				
			||||||
	---help---
 | 
						---help---
 | 
				
			||||||
	  Support for PCMCIA cards from Softing Gmbh & some cards
 | 
						  Support for PCMCIA cards from Softing Gmbh & some cards
 | 
				
			||||||
	  from Vector Gmbh.
 | 
						  from Vector Gmbh.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2040,7 +2040,7 @@ static int __devinit setup_debugfs(struct adapter *adapter)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BUG_ON(adapter->debugfs_root == NULL);
 | 
						BUG_ON(IS_ERR_OR_NULL(adapter->debugfs_root));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Debugfs support is best effort.
 | 
						 * Debugfs support is best effort.
 | 
				
			||||||
| 
						 | 
					@ -2061,7 +2061,7 @@ static int __devinit setup_debugfs(struct adapter *adapter)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void cleanup_debugfs(struct adapter *adapter)
 | 
					static void cleanup_debugfs(struct adapter *adapter)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	BUG_ON(adapter->debugfs_root == NULL);
 | 
						BUG_ON(IS_ERR_OR_NULL(adapter->debugfs_root));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Unlike our sister routine cleanup_proc(), we don't need to remove
 | 
						 * Unlike our sister routine cleanup_proc(), we don't need to remove
 | 
				
			||||||
| 
						 | 
					@ -2488,17 +2488,6 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
 | 
				
			||||||
	struct port_info *pi;
 | 
						struct port_info *pi;
 | 
				
			||||||
	struct net_device *netdev;
 | 
						struct net_device *netdev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * Vet our module parameters.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	if (msi != MSI_MSIX && msi != MSI_MSI) {
 | 
					 | 
				
			||||||
		dev_err(&pdev->dev, "bad module parameter msi=%d; must be %d"
 | 
					 | 
				
			||||||
			" (MSI-X or MSI) or %d (MSI)\n", msi, MSI_MSIX,
 | 
					 | 
				
			||||||
			MSI_MSI);
 | 
					 | 
				
			||||||
		err = -EINVAL;
 | 
					 | 
				
			||||||
		goto err_out;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Print our driver banner the first time we're called to initialize a
 | 
						 * Print our driver banner the first time we're called to initialize a
 | 
				
			||||||
	 * device.
 | 
						 * device.
 | 
				
			||||||
| 
						 | 
					@ -2711,11 +2700,11 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Set up our debugfs entries.
 | 
						 * Set up our debugfs entries.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (cxgb4vf_debugfs_root) {
 | 
						if (!IS_ERR_OR_NULL(cxgb4vf_debugfs_root)) {
 | 
				
			||||||
		adapter->debugfs_root =
 | 
							adapter->debugfs_root =
 | 
				
			||||||
			debugfs_create_dir(pci_name(pdev),
 | 
								debugfs_create_dir(pci_name(pdev),
 | 
				
			||||||
					   cxgb4vf_debugfs_root);
 | 
										   cxgb4vf_debugfs_root);
 | 
				
			||||||
		if (adapter->debugfs_root == NULL)
 | 
							if (IS_ERR_OR_NULL(adapter->debugfs_root))
 | 
				
			||||||
			dev_warn(&pdev->dev, "could not create debugfs"
 | 
								dev_warn(&pdev->dev, "could not create debugfs"
 | 
				
			||||||
				 " directory");
 | 
									 " directory");
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
| 
						 | 
					@ -2770,7 +2759,7 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err_free_debugfs:
 | 
					err_free_debugfs:
 | 
				
			||||||
	if (adapter->debugfs_root) {
 | 
						if (!IS_ERR_OR_NULL(adapter->debugfs_root)) {
 | 
				
			||||||
		cleanup_debugfs(adapter);
 | 
							cleanup_debugfs(adapter);
 | 
				
			||||||
		debugfs_remove_recursive(adapter->debugfs_root);
 | 
							debugfs_remove_recursive(adapter->debugfs_root);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -2802,7 +2791,6 @@ err_release_regions:
 | 
				
			||||||
err_disable_device:
 | 
					err_disable_device:
 | 
				
			||||||
	pci_disable_device(pdev);
 | 
						pci_disable_device(pdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err_out:
 | 
					 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2840,7 +2828,7 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev)
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Tear down our debugfs entries.
 | 
							 * Tear down our debugfs entries.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (adapter->debugfs_root) {
 | 
							if (!IS_ERR_OR_NULL(adapter->debugfs_root)) {
 | 
				
			||||||
			cleanup_debugfs(adapter);
 | 
								cleanup_debugfs(adapter);
 | 
				
			||||||
			debugfs_remove_recursive(adapter->debugfs_root);
 | 
								debugfs_remove_recursive(adapter->debugfs_root);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -2873,6 +2861,46 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev)
 | 
				
			||||||
	pci_release_regions(pdev);
 | 
						pci_release_regions(pdev);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * "Shutdown" quiesce the device, stopping Ingress Packet and Interrupt
 | 
				
			||||||
 | 
					 * delivery.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void __devexit cxgb4vf_pci_shutdown(struct pci_dev *pdev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct adapter *adapter;
 | 
				
			||||||
 | 
						int pidx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						adapter = pci_get_drvdata(pdev);
 | 
				
			||||||
 | 
						if (!adapter)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Disable all Virtual Interfaces.  This will shut down the
 | 
				
			||||||
 | 
						 * delivery of all ingress packets into the chip for these
 | 
				
			||||||
 | 
						 * Virtual Interfaces.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						for_each_port(adapter, pidx) {
 | 
				
			||||||
 | 
							struct net_device *netdev;
 | 
				
			||||||
 | 
							struct port_info *pi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!test_bit(pidx, &adapter->registered_device_map))
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							netdev = adapter->port[pidx];
 | 
				
			||||||
 | 
							if (!netdev)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							pi = netdev_priv(netdev);
 | 
				
			||||||
 | 
							t4vf_enable_vi(adapter, pi->viid, false, false);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Free up all Queues which will prevent further DMA and
 | 
				
			||||||
 | 
						 * Interrupts allowing various internal pathways to drain.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						t4vf_free_sge_resources(adapter);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * PCI Device registration data structures.
 | 
					 * PCI Device registration data structures.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -2906,6 +2934,7 @@ static struct pci_driver cxgb4vf_driver = {
 | 
				
			||||||
	.id_table	= cxgb4vf_pci_tbl,
 | 
						.id_table	= cxgb4vf_pci_tbl,
 | 
				
			||||||
	.probe		= cxgb4vf_pci_probe,
 | 
						.probe		= cxgb4vf_pci_probe,
 | 
				
			||||||
	.remove		= __devexit_p(cxgb4vf_pci_remove),
 | 
						.remove		= __devexit_p(cxgb4vf_pci_remove),
 | 
				
			||||||
 | 
						.shutdown	= __devexit_p(cxgb4vf_pci_shutdown),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -2915,14 +2944,25 @@ static int __init cxgb4vf_module_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Vet our module parameters.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (msi != MSI_MSIX && msi != MSI_MSI) {
 | 
				
			||||||
 | 
							printk(KERN_WARNING KBUILD_MODNAME
 | 
				
			||||||
 | 
							       ": bad module parameter msi=%d; must be %d"
 | 
				
			||||||
 | 
							       " (MSI-X or MSI) or %d (MSI)\n",
 | 
				
			||||||
 | 
							       msi, MSI_MSIX, MSI_MSI);
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Debugfs support is optional, just warn if this fails */
 | 
						/* Debugfs support is optional, just warn if this fails */
 | 
				
			||||||
	cxgb4vf_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL);
 | 
						cxgb4vf_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL);
 | 
				
			||||||
	if (!cxgb4vf_debugfs_root)
 | 
						if (IS_ERR_OR_NULL(cxgb4vf_debugfs_root))
 | 
				
			||||||
		printk(KERN_WARNING KBUILD_MODNAME ": could not create"
 | 
							printk(KERN_WARNING KBUILD_MODNAME ": could not create"
 | 
				
			||||||
		       " debugfs entry, continuing\n");
 | 
							       " debugfs entry, continuing\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = pci_register_driver(&cxgb4vf_driver);
 | 
						ret = pci_register_driver(&cxgb4vf_driver);
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0 && !IS_ERR_OR_NULL(cxgb4vf_debugfs_root))
 | 
				
			||||||
		debugfs_remove(cxgb4vf_debugfs_root);
 | 
							debugfs_remove(cxgb4vf_debugfs_root);
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,7 +171,7 @@ int t4vf_wr_mbox_core(struct adapter *adapter, const void *cmd, int size,
 | 
				
			||||||
	delay_idx = 0;
 | 
						delay_idx = 0;
 | 
				
			||||||
	ms = delay[0];
 | 
						ms = delay[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < 500; i += ms) {
 | 
						for (i = 0; i < FW_CMD_MAX_TIMEOUT; i += ms) {
 | 
				
			||||||
		if (sleep_ok) {
 | 
							if (sleep_ok) {
 | 
				
			||||||
			ms = delay[delay_idx];
 | 
								ms = delay[delay_idx];
 | 
				
			||||||
			if (delay_idx < ARRAY_SIZE(delay) - 1)
 | 
								if (delay_idx < ARRAY_SIZE(delay) - 1)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -937,6 +937,9 @@ static void e1000_print_hw_hang(struct work_struct *work)
 | 
				
			||||||
	u16 phy_status, phy_1000t_status, phy_ext_status;
 | 
						u16 phy_status, phy_1000t_status, phy_ext_status;
 | 
				
			||||||
	u16 pci_status;
 | 
						u16 pci_status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (test_bit(__E1000_DOWN, &adapter->state))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	e1e_rphy(hw, PHY_STATUS, &phy_status);
 | 
						e1e_rphy(hw, PHY_STATUS, &phy_status);
 | 
				
			||||||
	e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
 | 
						e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
 | 
				
			||||||
	e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
 | 
						e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
 | 
				
			||||||
| 
						 | 
					@ -1506,6 +1509,9 @@ static void e1000e_downshift_workaround(struct work_struct *work)
 | 
				
			||||||
	struct e1000_adapter *adapter = container_of(work,
 | 
						struct e1000_adapter *adapter = container_of(work,
 | 
				
			||||||
					struct e1000_adapter, downshift_task);
 | 
										struct e1000_adapter, downshift_task);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (test_bit(__E1000_DOWN, &adapter->state))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
 | 
						e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3338,6 +3344,21 @@ int e1000e_up(struct e1000_adapter *adapter)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct e1000_hw *hw = &adapter->hw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!(adapter->flags2 & FLAG2_DMA_BURST))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* flush pending descriptor writebacks to memory */
 | 
				
			||||||
 | 
						ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
 | 
				
			||||||
 | 
						ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* execute the writes immediately */
 | 
				
			||||||
 | 
						e1e_flush();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void e1000e_down(struct e1000_adapter *adapter)
 | 
					void e1000e_down(struct e1000_adapter *adapter)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct net_device *netdev = adapter->netdev;
 | 
						struct net_device *netdev = adapter->netdev;
 | 
				
			||||||
| 
						 | 
					@ -3377,6 +3398,9 @@ void e1000e_down(struct e1000_adapter *adapter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!pci_channel_offline(adapter->pdev))
 | 
						if (!pci_channel_offline(adapter->pdev))
 | 
				
			||||||
		e1000e_reset(adapter);
 | 
							e1000e_reset(adapter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						e1000e_flush_descriptors(adapter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	e1000_clean_tx_ring(adapter);
 | 
						e1000_clean_tx_ring(adapter);
 | 
				
			||||||
	e1000_clean_rx_ring(adapter);
 | 
						e1000_clean_rx_ring(adapter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3765,6 +3789,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct e1000_adapter *adapter = container_of(work,
 | 
						struct e1000_adapter *adapter = container_of(work,
 | 
				
			||||||
					struct e1000_adapter, update_phy_task);
 | 
										struct e1000_adapter, update_phy_task);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (test_bit(__E1000_DOWN, &adapter->state))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	e1000_get_phy_info(&adapter->hw);
 | 
						e1000_get_phy_info(&adapter->hw);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3775,6 +3803,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
 | 
				
			||||||
static void e1000_update_phy_info(unsigned long data)
 | 
					static void e1000_update_phy_info(unsigned long data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
 | 
						struct e1000_adapter *adapter = (struct e1000_adapter *) data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (test_bit(__E1000_DOWN, &adapter->state))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	schedule_work(&adapter->update_phy_task);
 | 
						schedule_work(&adapter->update_phy_task);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4149,6 +4181,9 @@ static void e1000_watchdog_task(struct work_struct *work)
 | 
				
			||||||
	u32 link, tctl;
 | 
						u32 link, tctl;
 | 
				
			||||||
	int tx_pending = 0;
 | 
						int tx_pending = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (test_bit(__E1000_DOWN, &adapter->state))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	link = e1000e_has_link(adapter);
 | 
						link = e1000e_has_link(adapter);
 | 
				
			||||||
	if ((netif_carrier_ok(netdev)) && link) {
 | 
						if ((netif_carrier_ok(netdev)) && link) {
 | 
				
			||||||
		/* Cancel scheduled suspend requests. */
 | 
							/* Cancel scheduled suspend requests. */
 | 
				
			||||||
| 
						 | 
					@ -4337,19 +4372,12 @@ link_up:
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		ew32(ICS, E1000_ICS_RXDMT0);
 | 
							ew32(ICS, E1000_ICS_RXDMT0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* flush pending descriptors to memory before detecting Tx hang */
 | 
				
			||||||
 | 
						e1000e_flush_descriptors(adapter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Force detection of hung controller every watchdog period */
 | 
						/* Force detection of hung controller every watchdog period */
 | 
				
			||||||
	adapter->detect_tx_hung = 1;
 | 
						adapter->detect_tx_hung = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* flush partial descriptors to memory before detecting Tx hang */
 | 
					 | 
				
			||||||
	if (adapter->flags2 & FLAG2_DMA_BURST) {
 | 
					 | 
				
			||||||
		ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
 | 
					 | 
				
			||||||
		ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
 | 
					 | 
				
			||||||
		/*
 | 
					 | 
				
			||||||
		 * no need to flush the writes because the timeout code does
 | 
					 | 
				
			||||||
		 * an er32 first thing
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * With 82571 controllers, LAA may be overwritten due to controller
 | 
						 * With 82571 controllers, LAA may be overwritten due to controller
 | 
				
			||||||
	 * reset from the other port. Set the appropriate LAA in RAR[0]
 | 
						 * reset from the other port. Set the appropriate LAA in RAR[0]
 | 
				
			||||||
| 
						 | 
					@ -4887,6 +4915,10 @@ static void e1000_reset_task(struct work_struct *work)
 | 
				
			||||||
	struct e1000_adapter *adapter;
 | 
						struct e1000_adapter *adapter;
 | 
				
			||||||
	adapter = container_of(work, struct e1000_adapter, reset_task);
 | 
						adapter = container_of(work, struct e1000_adapter, reset_task);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* don't run the task if already down */
 | 
				
			||||||
 | 
						if (test_bit(__E1000_DOWN, &adapter->state))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
 | 
						if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
 | 
				
			||||||
	      (adapter->flags & FLAG_RX_RESTART_NOW))) {
 | 
						      (adapter->flags & FLAG_RX_RESTART_NOW))) {
 | 
				
			||||||
		e1000e_dump(adapter);
 | 
							e1000e_dump(adapter);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5645,6 +5645,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
 | 
				
			||||||
		goto out_error;
 | 
							goto out_error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						netif_carrier_off(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dev_info(&pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, addr %pM\n",
 | 
						dev_info(&pci_dev->dev, "ifname %s, PHY OUI 0x%x @ %d, addr %pM\n",
 | 
				
			||||||
		 dev->name, np->phy_oui, np->phyaddr, dev->dev_addr);
 | 
							 dev->name, np->phy_oui, np->phyaddr, dev->dev_addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -159,7 +159,7 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
 | 
				
			||||||
	struct scatterlist *sg;
 | 
						struct scatterlist *sg;
 | 
				
			||||||
	unsigned int i, j, dmacount;
 | 
						unsigned int i, j, dmacount;
 | 
				
			||||||
	unsigned int len;
 | 
						unsigned int len;
 | 
				
			||||||
	static const unsigned int bufflen = 4096;
 | 
						static const unsigned int bufflen = IXGBE_FCBUFF_MIN;
 | 
				
			||||||
	unsigned int firstoff = 0;
 | 
						unsigned int firstoff = 0;
 | 
				
			||||||
	unsigned int lastsize;
 | 
						unsigned int lastsize;
 | 
				
			||||||
	unsigned int thisoff = 0;
 | 
						unsigned int thisoff = 0;
 | 
				
			||||||
| 
						 | 
					@ -254,6 +254,24 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
 | 
				
			||||||
	/* only the last buffer may have non-full bufflen */
 | 
						/* only the last buffer may have non-full bufflen */
 | 
				
			||||||
	lastsize = thisoff + thislen;
 | 
						lastsize = thisoff + thislen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * lastsize can not be buffer len.
 | 
				
			||||||
 | 
						 * If it is then adding another buffer with lastsize = 1.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (lastsize == bufflen) {
 | 
				
			||||||
 | 
							if (j >= IXGBE_BUFFCNT_MAX) {
 | 
				
			||||||
 | 
								e_err(drv, "xid=%x:%d,%d,%d:addr=%llx "
 | 
				
			||||||
 | 
									"not enough user buffers. We need an extra "
 | 
				
			||||||
 | 
									"buffer because lastsize is bufflen.\n",
 | 
				
			||||||
 | 
									xid, i, j, dmacount, (u64)addr);
 | 
				
			||||||
 | 
								goto out_noddp_free;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ddp->udl[j] = (u64)(fcoe->extra_ddp_buffer_dma);
 | 
				
			||||||
 | 
							j++;
 | 
				
			||||||
 | 
							lastsize = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fcbuff = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT);
 | 
						fcbuff = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT);
 | 
				
			||||||
	fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT);
 | 
						fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT);
 | 
				
			||||||
	fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT);
 | 
						fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT);
 | 
				
			||||||
| 
						 | 
					@ -532,6 +550,24 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
 | 
				
			||||||
			e_err(drv, "failed to allocated FCoE DDP pool\n");
 | 
								e_err(drv, "failed to allocated FCoE DDP pool\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spin_lock_init(&fcoe->lock);
 | 
							spin_lock_init(&fcoe->lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Extra buffer to be shared by all DDPs for HW work around */
 | 
				
			||||||
 | 
							fcoe->extra_ddp_buffer = kmalloc(IXGBE_FCBUFF_MIN, GFP_ATOMIC);
 | 
				
			||||||
 | 
							if (fcoe->extra_ddp_buffer == NULL) {
 | 
				
			||||||
 | 
								e_err(drv, "failed to allocated extra DDP buffer\n");
 | 
				
			||||||
 | 
								goto out_extra_ddp_buffer_alloc;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fcoe->extra_ddp_buffer_dma =
 | 
				
			||||||
 | 
								dma_map_single(&adapter->pdev->dev,
 | 
				
			||||||
 | 
									       fcoe->extra_ddp_buffer,
 | 
				
			||||||
 | 
									       IXGBE_FCBUFF_MIN,
 | 
				
			||||||
 | 
									       DMA_FROM_DEVICE);
 | 
				
			||||||
 | 
							if (dma_mapping_error(&adapter->pdev->dev,
 | 
				
			||||||
 | 
									      fcoe->extra_ddp_buffer_dma)) {
 | 
				
			||||||
 | 
								e_err(drv, "failed to map extra DDP buffer\n");
 | 
				
			||||||
 | 
								goto out_extra_ddp_buffer_dma;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Enable L2 eth type filter for FCoE */
 | 
						/* Enable L2 eth type filter for FCoE */
 | 
				
			||||||
| 
						 | 
					@ -581,6 +617,14 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out_extra_ddp_buffer_dma:
 | 
				
			||||||
 | 
						kfree(fcoe->extra_ddp_buffer);
 | 
				
			||||||
 | 
					out_extra_ddp_buffer_alloc:
 | 
				
			||||||
 | 
						pci_pool_destroy(fcoe->pool);
 | 
				
			||||||
 | 
						fcoe->pool = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -600,6 +644,11 @@ void ixgbe_cleanup_fcoe(struct ixgbe_adapter *adapter)
 | 
				
			||||||
	if (fcoe->pool) {
 | 
						if (fcoe->pool) {
 | 
				
			||||||
		for (i = 0; i < IXGBE_FCOE_DDP_MAX; i++)
 | 
							for (i = 0; i < IXGBE_FCOE_DDP_MAX; i++)
 | 
				
			||||||
			ixgbe_fcoe_ddp_put(adapter->netdev, i);
 | 
								ixgbe_fcoe_ddp_put(adapter->netdev, i);
 | 
				
			||||||
 | 
							dma_unmap_single(&adapter->pdev->dev,
 | 
				
			||||||
 | 
									 fcoe->extra_ddp_buffer_dma,
 | 
				
			||||||
 | 
									 IXGBE_FCBUFF_MIN,
 | 
				
			||||||
 | 
									 DMA_FROM_DEVICE);
 | 
				
			||||||
 | 
							kfree(fcoe->extra_ddp_buffer);
 | 
				
			||||||
		pci_pool_destroy(fcoe->pool);
 | 
							pci_pool_destroy(fcoe->pool);
 | 
				
			||||||
		fcoe->pool = NULL;
 | 
							fcoe->pool = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,6 +70,8 @@ struct ixgbe_fcoe {
 | 
				
			||||||
	spinlock_t lock;
 | 
						spinlock_t lock;
 | 
				
			||||||
	struct pci_pool *pool;
 | 
						struct pci_pool *pool;
 | 
				
			||||||
	struct ixgbe_fcoe_ddp ddp[IXGBE_FCOE_DDP_MAX];
 | 
						struct ixgbe_fcoe_ddp ddp[IXGBE_FCOE_DDP_MAX];
 | 
				
			||||||
 | 
						unsigned char *extra_ddp_buffer;
 | 
				
			||||||
 | 
						dma_addr_t extra_ddp_buffer_dma;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _IXGBE_FCOE_H */
 | 
					#endif /* _IXGBE_FCOE_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3728,7 +3728,8 @@ static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter)
 | 
				
			||||||
			 * We need to try and force an autonegotiation
 | 
								 * We need to try and force an autonegotiation
 | 
				
			||||||
			 * session, then bring up link.
 | 
								 * session, then bring up link.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			hw->mac.ops.setup_sfp(hw);
 | 
								if (hw->mac.ops.setup_sfp)
 | 
				
			||||||
 | 
									hw->mac.ops.setup_sfp(hw);
 | 
				
			||||||
			if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
 | 
								if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
 | 
				
			||||||
				schedule_work(&adapter->multispeed_fiber_task);
 | 
									schedule_work(&adapter->multispeed_fiber_task);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
| 
						 | 
					@ -5968,7 +5969,8 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work)
 | 
				
			||||||
		unregister_netdev(adapter->netdev);
 | 
							unregister_netdev(adapter->netdev);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	hw->mac.ops.setup_sfp(hw);
 | 
						if (hw->mac.ops.setup_sfp)
 | 
				
			||||||
 | 
							hw->mac.ops.setup_sfp(hw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
 | 
						if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK))
 | 
				
			||||||
		/* This will also work for DA Twinax connections */
 | 
							/* This will also work for DA Twinax connections */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,7 +73,7 @@ struct pch_gbe_regs {
 | 
				
			||||||
	struct pch_gbe_regs_mac_adr mac_adr[16];
 | 
						struct pch_gbe_regs_mac_adr mac_adr[16];
 | 
				
			||||||
	u32 ADDR_MASK;
 | 
						u32 ADDR_MASK;
 | 
				
			||||||
	u32 MIIM;
 | 
						u32 MIIM;
 | 
				
			||||||
	u32 reserve2;
 | 
						u32 MAC_ADDR_LOAD;
 | 
				
			||||||
	u32 RGMII_ST;
 | 
						u32 RGMII_ST;
 | 
				
			||||||
	u32 RGMII_CTRL;
 | 
						u32 RGMII_CTRL;
 | 
				
			||||||
	u32 reserve3[3];
 | 
						u32 reserve3[3];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,6 +29,7 @@ const char pch_driver_version[] = DRV_VERSION;
 | 
				
			||||||
#define PCH_GBE_SHORT_PKT		64
 | 
					#define PCH_GBE_SHORT_PKT		64
 | 
				
			||||||
#define DSC_INIT16			0xC000
 | 
					#define DSC_INIT16			0xC000
 | 
				
			||||||
#define PCH_GBE_DMA_ALIGN		0
 | 
					#define PCH_GBE_DMA_ALIGN		0
 | 
				
			||||||
 | 
					#define PCH_GBE_DMA_PADDING		2
 | 
				
			||||||
#define PCH_GBE_WATCHDOG_PERIOD		(1 * HZ)	/* watchdog time */
 | 
					#define PCH_GBE_WATCHDOG_PERIOD		(1 * HZ)	/* watchdog time */
 | 
				
			||||||
#define PCH_GBE_COPYBREAK_DEFAULT	256
 | 
					#define PCH_GBE_COPYBREAK_DEFAULT	256
 | 
				
			||||||
#define PCH_GBE_PCI_BAR			1
 | 
					#define PCH_GBE_PCI_BAR			1
 | 
				
			||||||
| 
						 | 
					@ -88,6 +89,12 @@ static unsigned int copybreak __read_mostly = PCH_GBE_COPYBREAK_DEFAULT;
 | 
				
			||||||
static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg);
 | 
					static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg);
 | 
				
			||||||
static void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg,
 | 
					static void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg,
 | 
				
			||||||
			       int data);
 | 
								       int data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void pch_gbe_mac_load_mac_addr(struct pch_gbe_hw *hw)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						iowrite32(0x01, &hw->reg->MAC_ADDR_LOAD);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * pch_gbe_mac_read_mac_addr - Read MAC address
 | 
					 * pch_gbe_mac_read_mac_addr - Read MAC address
 | 
				
			||||||
 * @hw:	            Pointer to the HW structure
 | 
					 * @hw:	            Pointer to the HW structure
 | 
				
			||||||
| 
						 | 
					@ -1365,16 +1372,13 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
 | 
				
			||||||
	struct pch_gbe_buffer *buffer_info;
 | 
						struct pch_gbe_buffer *buffer_info;
 | 
				
			||||||
	struct pch_gbe_rx_desc *rx_desc;
 | 
						struct pch_gbe_rx_desc *rx_desc;
 | 
				
			||||||
	u32 length;
 | 
						u32 length;
 | 
				
			||||||
	unsigned char tmp_packet[ETH_HLEN];
 | 
					 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
	unsigned int cleaned_count = 0;
 | 
						unsigned int cleaned_count = 0;
 | 
				
			||||||
	bool cleaned = false;
 | 
						bool cleaned = false;
 | 
				
			||||||
	struct sk_buff *skb;
 | 
						struct sk_buff *skb, *new_skb;
 | 
				
			||||||
	u8 dma_status;
 | 
						u8 dma_status;
 | 
				
			||||||
	u16 gbec_status;
 | 
						u16 gbec_status;
 | 
				
			||||||
	u32 tcp_ip_status;
 | 
						u32 tcp_ip_status;
 | 
				
			||||||
	u8 skb_copy_flag = 0;
 | 
					 | 
				
			||||||
	u8 skb_padding_flag = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	i = rx_ring->next_to_clean;
 | 
						i = rx_ring->next_to_clean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1418,55 +1422,70 @@ pch_gbe_clean_rx(struct pch_gbe_adapter *adapter,
 | 
				
			||||||
			pr_err("Receive CRC Error\n");
 | 
								pr_err("Receive CRC Error\n");
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			/* get receive length */
 | 
								/* get receive length */
 | 
				
			||||||
			/* length convert[-3], padding[-2] */
 | 
								/* length convert[-3] */
 | 
				
			||||||
			length = (rx_desc->rx_words_eob) - 3 - 2;
 | 
								length = (rx_desc->rx_words_eob) - 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* Decide the data conversion method */
 | 
								/* Decide the data conversion method */
 | 
				
			||||||
			if (!adapter->rx_csum) {
 | 
								if (!adapter->rx_csum) {
 | 
				
			||||||
				/* [Header:14][payload] */
 | 
									/* [Header:14][payload] */
 | 
				
			||||||
				skb_padding_flag = 0;
 | 
									if (NET_IP_ALIGN) {
 | 
				
			||||||
				skb_copy_flag = 1;
 | 
										/* Because alignment differs,
 | 
				
			||||||
			} else {
 | 
										 * the new_skb is newly allocated,
 | 
				
			||||||
				/* [Header:14][padding:2][payload] */
 | 
										 * and data is copied to new_skb.*/
 | 
				
			||||||
				skb_padding_flag = 1;
 | 
										new_skb = netdev_alloc_skb(netdev,
 | 
				
			||||||
				if (length < copybreak)
 | 
												 length + NET_IP_ALIGN);
 | 
				
			||||||
					skb_copy_flag = 1;
 | 
										if (!new_skb) {
 | 
				
			||||||
				else
 | 
											/* dorrop error */
 | 
				
			||||||
					skb_copy_flag = 0;
 | 
											pr_err("New skb allocation "
 | 
				
			||||||
			}
 | 
												"Error\n");
 | 
				
			||||||
 | 
											goto dorrop;
 | 
				
			||||||
			/* Data conversion */
 | 
					 | 
				
			||||||
			if (skb_copy_flag) {	/* recycle  skb */
 | 
					 | 
				
			||||||
				struct sk_buff *new_skb;
 | 
					 | 
				
			||||||
				new_skb =
 | 
					 | 
				
			||||||
				    netdev_alloc_skb(netdev,
 | 
					 | 
				
			||||||
						     length + NET_IP_ALIGN);
 | 
					 | 
				
			||||||
				if (new_skb) {
 | 
					 | 
				
			||||||
					if (!skb_padding_flag) {
 | 
					 | 
				
			||||||
						skb_reserve(new_skb,
 | 
					 | 
				
			||||||
								NET_IP_ALIGN);
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
										skb_reserve(new_skb, NET_IP_ALIGN);
 | 
				
			||||||
					memcpy(new_skb->data, skb->data,
 | 
										memcpy(new_skb->data, skb->data,
 | 
				
			||||||
						length);
 | 
										       length);
 | 
				
			||||||
					/* save the skb
 | 
					 | 
				
			||||||
					 * in buffer_info as good */
 | 
					 | 
				
			||||||
					skb = new_skb;
 | 
										skb = new_skb;
 | 
				
			||||||
				} else if (!skb_padding_flag) {
 | 
									} else {
 | 
				
			||||||
					/* dorrop error */
 | 
										/* DMA buffer is used as SKB as it is.*/
 | 
				
			||||||
					pr_err("New skb allocation Error\n");
 | 
										buffer_info->skb = NULL;
 | 
				
			||||||
					goto dorrop;
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				buffer_info->skb = NULL;
 | 
									/* [Header:14][padding:2][payload] */
 | 
				
			||||||
 | 
									/* The length includes padding length */
 | 
				
			||||||
 | 
									length = length - PCH_GBE_DMA_PADDING;
 | 
				
			||||||
 | 
									if ((length < copybreak) ||
 | 
				
			||||||
 | 
									    (NET_IP_ALIGN != PCH_GBE_DMA_PADDING)) {
 | 
				
			||||||
 | 
										/* Because alignment differs,
 | 
				
			||||||
 | 
										 * the new_skb is newly allocated,
 | 
				
			||||||
 | 
										 * and data is copied to new_skb.
 | 
				
			||||||
 | 
										 * Padding data is deleted
 | 
				
			||||||
 | 
										 * at the time of a copy.*/
 | 
				
			||||||
 | 
										new_skb = netdev_alloc_skb(netdev,
 | 
				
			||||||
 | 
												 length + NET_IP_ALIGN);
 | 
				
			||||||
 | 
										if (!new_skb) {
 | 
				
			||||||
 | 
											/* dorrop error */
 | 
				
			||||||
 | 
											pr_err("New skb allocation "
 | 
				
			||||||
 | 
												"Error\n");
 | 
				
			||||||
 | 
											goto dorrop;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										skb_reserve(new_skb, NET_IP_ALIGN);
 | 
				
			||||||
 | 
										memcpy(new_skb->data, skb->data,
 | 
				
			||||||
 | 
										       ETH_HLEN);
 | 
				
			||||||
 | 
										memcpy(&new_skb->data[ETH_HLEN],
 | 
				
			||||||
 | 
										       &skb->data[ETH_HLEN +
 | 
				
			||||||
 | 
										       PCH_GBE_DMA_PADDING],
 | 
				
			||||||
 | 
										       length - ETH_HLEN);
 | 
				
			||||||
 | 
										skb = new_skb;
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										/* Padding data is deleted
 | 
				
			||||||
 | 
										 * by moving header data.*/
 | 
				
			||||||
 | 
										memmove(&skb->data[PCH_GBE_DMA_PADDING],
 | 
				
			||||||
 | 
											&skb->data[0], ETH_HLEN);
 | 
				
			||||||
 | 
										skb_reserve(skb, NET_IP_ALIGN);
 | 
				
			||||||
 | 
										buffer_info->skb = NULL;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (skb_padding_flag) {
 | 
								/* The length includes FCS length */
 | 
				
			||||||
				memcpy(&tmp_packet[0], &skb->data[0], ETH_HLEN);
 | 
								length = length - ETH_FCS_LEN;
 | 
				
			||||||
				memcpy(&skb->data[NET_IP_ALIGN], &tmp_packet[0],
 | 
					 | 
				
			||||||
					ETH_HLEN);
 | 
					 | 
				
			||||||
				skb_reserve(skb, NET_IP_ALIGN);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			/* update status of driver */
 | 
								/* update status of driver */
 | 
				
			||||||
			adapter->stats.rx_bytes += length;
 | 
								adapter->stats.rx_bytes += length;
 | 
				
			||||||
			adapter->stats.rx_packets++;
 | 
								adapter->stats.rx_packets++;
 | 
				
			||||||
| 
						 | 
					@ -2318,6 +2337,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
 | 
				
			||||||
	netdev->features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_GRO;
 | 
						netdev->features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_GRO;
 | 
				
			||||||
	pch_gbe_set_ethtool_ops(netdev);
 | 
						pch_gbe_set_ethtool_ops(netdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pch_gbe_mac_load_mac_addr(&adapter->hw);
 | 
				
			||||||
	pch_gbe_mac_reset_hw(&adapter->hw);
 | 
						pch_gbe_mac_reset_hw(&adapter->hw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* setup the private structure */
 | 
						/* setup the private structure */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3190,6 +3190,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 | 
				
			||||||
	if (pci_dev_run_wake(pdev))
 | 
						if (pci_dev_run_wake(pdev))
 | 
				
			||||||
		pm_runtime_put_noidle(&pdev->dev);
 | 
							pm_runtime_put_noidle(&pdev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						netif_carrier_off(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	return rc;
 | 
						return rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1560,8 +1560,10 @@ static int stmmac_mac_device_setup(struct net_device *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	priv->hw = device;
 | 
						priv->hw = device;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (device_can_wakeup(priv->device))
 | 
						if (device_can_wakeup(priv->device)) {
 | 
				
			||||||
		priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */
 | 
							priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */
 | 
				
			||||||
 | 
							enable_irq_wake(dev->irq);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11158,7 +11158,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 | 
				
			||||||
		if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
 | 
							if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
 | 
				
			||||||
			break;			/* We have no PHY */
 | 
								break;			/* We have no PHY */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)
 | 
							if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) ||
 | 
				
			||||||
 | 
							    ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) &&
 | 
				
			||||||
 | 
							     !netif_running(dev)))
 | 
				
			||||||
			return -EAGAIN;
 | 
								return -EAGAIN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spin_lock_bh(&tp->lock);
 | 
							spin_lock_bh(&tp->lock);
 | 
				
			||||||
| 
						 | 
					@ -11174,7 +11176,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 | 
				
			||||||
		if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
 | 
							if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
 | 
				
			||||||
			break;			/* We have no PHY */
 | 
								break;			/* We have no PHY */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)
 | 
							if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) ||
 | 
				
			||||||
 | 
							    ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) &&
 | 
				
			||||||
 | 
							     !netif_running(dev)))
 | 
				
			||||||
			return -EAGAIN;
 | 
								return -EAGAIN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spin_lock_bh(&tp->lock);
 | 
							spin_lock_bh(&tp->lock);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2628,15 +2628,15 @@ exit:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void hso_free_tiomget(struct hso_serial *serial)
 | 
					static void hso_free_tiomget(struct hso_serial *serial)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct hso_tiocmget *tiocmget = serial->tiocmget;
 | 
						struct hso_tiocmget *tiocmget;
 | 
				
			||||||
 | 
						if (!serial)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						tiocmget = serial->tiocmget;
 | 
				
			||||||
	if (tiocmget) {
 | 
						if (tiocmget) {
 | 
				
			||||||
		if (tiocmget->urb) {
 | 
							usb_free_urb(tiocmget->urb);
 | 
				
			||||||
			usb_free_urb(tiocmget->urb);
 | 
							tiocmget->urb = NULL;
 | 
				
			||||||
			tiocmget->urb = NULL;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		serial->tiocmget = NULL;
 | 
							serial->tiocmget = NULL;
 | 
				
			||||||
		kfree(tiocmget);
 | 
							kfree(tiocmget);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -931,8 +931,10 @@ fail_halt:
 | 
				
			||||||
		if (urb != NULL) {
 | 
							if (urb != NULL) {
 | 
				
			||||||
			clear_bit (EVENT_RX_MEMORY, &dev->flags);
 | 
								clear_bit (EVENT_RX_MEMORY, &dev->flags);
 | 
				
			||||||
			status = usb_autopm_get_interface(dev->intf);
 | 
								status = usb_autopm_get_interface(dev->intf);
 | 
				
			||||||
			if (status < 0)
 | 
								if (status < 0) {
 | 
				
			||||||
 | 
									usb_free_urb(urb);
 | 
				
			||||||
				goto fail_lowmem;
 | 
									goto fail_lowmem;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK)
 | 
								if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK)
 | 
				
			||||||
				resched = 0;
 | 
									resched = 0;
 | 
				
			||||||
			usb_autopm_put_interface(dev->intf);
 | 
								usb_autopm_put_interface(dev->intf);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -402,72 +402,6 @@ static void iwl3945_accumulative_statistics(struct iwl_priv *priv,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * iwl3945_good_plcp_health - checks for plcp error.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * When the plcp error is exceeding the thresholds, reset the radio
 | 
					 | 
				
			||||||
 * to improve the throughput.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static bool iwl3945_good_plcp_health(struct iwl_priv *priv,
 | 
					 | 
				
			||||||
				struct iwl_rx_packet *pkt)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	bool rc = true;
 | 
					 | 
				
			||||||
	struct iwl3945_notif_statistics current_stat;
 | 
					 | 
				
			||||||
	int combined_plcp_delta;
 | 
					 | 
				
			||||||
	unsigned int plcp_msec;
 | 
					 | 
				
			||||||
	unsigned long plcp_received_jiffies;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (priv->cfg->base_params->plcp_delta_threshold ==
 | 
					 | 
				
			||||||
	    IWL_MAX_PLCP_ERR_THRESHOLD_DISABLE) {
 | 
					 | 
				
			||||||
		IWL_DEBUG_RADIO(priv, "plcp_err check disabled\n");
 | 
					 | 
				
			||||||
		return rc;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	memcpy(¤t_stat, pkt->u.raw, sizeof(struct
 | 
					 | 
				
			||||||
			iwl3945_notif_statistics));
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * check for plcp_err and trigger radio reset if it exceeds
 | 
					 | 
				
			||||||
	 * the plcp error threshold plcp_delta.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	plcp_received_jiffies = jiffies;
 | 
					 | 
				
			||||||
	plcp_msec = jiffies_to_msecs((long) plcp_received_jiffies -
 | 
					 | 
				
			||||||
					(long) priv->plcp_jiffies);
 | 
					 | 
				
			||||||
	priv->plcp_jiffies = plcp_received_jiffies;
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * check to make sure plcp_msec is not 0 to prevent division
 | 
					 | 
				
			||||||
	 * by zero.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	if (plcp_msec) {
 | 
					 | 
				
			||||||
		combined_plcp_delta =
 | 
					 | 
				
			||||||
			(le32_to_cpu(current_stat.rx.ofdm.plcp_err) -
 | 
					 | 
				
			||||||
			le32_to_cpu(priv->_3945.statistics.rx.ofdm.plcp_err));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if ((combined_plcp_delta > 0) &&
 | 
					 | 
				
			||||||
			((combined_plcp_delta * 100) / plcp_msec) >
 | 
					 | 
				
			||||||
			priv->cfg->base_params->plcp_delta_threshold) {
 | 
					 | 
				
			||||||
			/*
 | 
					 | 
				
			||||||
			 * if plcp_err exceed the threshold, the following
 | 
					 | 
				
			||||||
			 * data is printed in csv format:
 | 
					 | 
				
			||||||
			 *    Text: plcp_err exceeded %d,
 | 
					 | 
				
			||||||
			 *    Received ofdm.plcp_err,
 | 
					 | 
				
			||||||
			 *    Current ofdm.plcp_err,
 | 
					 | 
				
			||||||
			 *    combined_plcp_delta,
 | 
					 | 
				
			||||||
			 *    plcp_msec
 | 
					 | 
				
			||||||
			 */
 | 
					 | 
				
			||||||
			IWL_DEBUG_RADIO(priv, "plcp_err exceeded %u, "
 | 
					 | 
				
			||||||
				"%u, %d, %u mSecs\n",
 | 
					 | 
				
			||||||
				priv->cfg->base_params->plcp_delta_threshold,
 | 
					 | 
				
			||||||
				le32_to_cpu(current_stat.rx.ofdm.plcp_err),
 | 
					 | 
				
			||||||
				combined_plcp_delta, plcp_msec);
 | 
					 | 
				
			||||||
			/*
 | 
					 | 
				
			||||||
			 * Reset the RF radio due to the high plcp
 | 
					 | 
				
			||||||
			 * error rate
 | 
					 | 
				
			||||||
			 */
 | 
					 | 
				
			||||||
			rc = false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return rc;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
 | 
					void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
 | 
				
			||||||
		struct iwl_rx_mem_buffer *rxb)
 | 
							struct iwl_rx_mem_buffer *rxb)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -2734,7 +2668,6 @@ static struct iwl_lib_ops iwl3945_lib = {
 | 
				
			||||||
	.isr_ops = {
 | 
						.isr_ops = {
 | 
				
			||||||
		.isr = iwl_isr_legacy,
 | 
							.isr = iwl_isr_legacy,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	.check_plcp_health = iwl3945_good_plcp_health,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.debugfs_ops = {
 | 
						.debugfs_ops = {
 | 
				
			||||||
		.rx_stats_read = iwl3945_ucode_rx_stats_read,
 | 
							.rx_stats_read = iwl3945_ucode_rx_stats_read,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -227,7 +227,7 @@ config SONYPI_COMPAT
 | 
				
			||||||
config IDEAPAD_LAPTOP
 | 
					config IDEAPAD_LAPTOP
 | 
				
			||||||
	tristate "Lenovo IdeaPad Laptop Extras"
 | 
						tristate "Lenovo IdeaPad Laptop Extras"
 | 
				
			||||||
	depends on ACPI
 | 
						depends on ACPI
 | 
				
			||||||
	depends on RFKILL
 | 
						depends on RFKILL && INPUT
 | 
				
			||||||
	select INPUT_SPARSEKMAP
 | 
						select INPUT_SPARSEKMAP
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  This is a driver for the rfkill switches on Lenovo IdeaPad netbooks.
 | 
						  This is a driver for the rfkill switches on Lenovo IdeaPad netbooks.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,7 +84,7 @@ MODULE_LICENSE("GPL");
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define AMW0_GUID1		"67C3371D-95A3-4C37-BB61-DD47B491DAAB"
 | 
					#define AMW0_GUID1		"67C3371D-95A3-4C37-BB61-DD47B491DAAB"
 | 
				
			||||||
#define AMW0_GUID2		"431F16ED-0C2B-444C-B267-27DEB140CF9C"
 | 
					#define AMW0_GUID2		"431F16ED-0C2B-444C-B267-27DEB140CF9C"
 | 
				
			||||||
#define WMID_GUID1		"6AF4F258-B401-42fd-BE91-3D4AC2D7C0D3"
 | 
					#define WMID_GUID1		"6AF4F258-B401-42FD-BE91-3D4AC2D7C0D3"
 | 
				
			||||||
#define WMID_GUID2		"95764E09-FB56-4e83-B31A-37761F60994A"
 | 
					#define WMID_GUID2		"95764E09-FB56-4e83-B31A-37761F60994A"
 | 
				
			||||||
#define WMID_GUID3		"61EF69EA-865C-4BC3-A502-A0DEBA0CB531"
 | 
					#define WMID_GUID3		"61EF69EA-865C-4BC3-A502-A0DEBA0CB531"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1280,7 +1280,7 @@ static ssize_t set_bool_threeg(struct device *dev,
 | 
				
			||||||
			return -EINVAL;
 | 
								return -EINVAL;
 | 
				
			||||||
	return count;
 | 
						return count;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static DEVICE_ATTR(threeg, S_IWUGO | S_IRUGO | S_IWUSR, show_bool_threeg,
 | 
					static DEVICE_ATTR(threeg, S_IRUGO | S_IWUSR, show_bool_threeg,
 | 
				
			||||||
	set_bool_threeg);
 | 
						set_bool_threeg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t show_interface(struct device *dev, struct device_attribute *attr,
 | 
					static ssize_t show_interface(struct device *dev, struct device_attribute *attr,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1081,14 +1081,8 @@ static int asus_hotk_add_fs(struct acpi_device *device)
 | 
				
			||||||
	struct proc_dir_entry *proc;
 | 
						struct proc_dir_entry *proc;
 | 
				
			||||||
	mode_t mode;
 | 
						mode_t mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * If parameter uid or gid is not changed, keep the default setting for
 | 
					 | 
				
			||||||
	 * our proc entries (-rw-rw-rw-) else, it means we care about security,
 | 
					 | 
				
			||||||
	 * and then set to -rw-rw----
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ((asus_uid == 0) && (asus_gid == 0)) {
 | 
						if ((asus_uid == 0) && (asus_gid == 0)) {
 | 
				
			||||||
		mode = S_IFREG | S_IRUGO | S_IWUGO;
 | 
							mode = S_IFREG | S_IRUGO | S_IWUSR | S_IWGRP;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP;
 | 
							mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP;
 | 
				
			||||||
		printk(KERN_WARNING "  asus_uid and asus_gid parameters are "
 | 
							printk(KERN_WARNING "  asus_uid and asus_gid parameters are "
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -290,9 +290,12 @@ static int dell_rfkill_set(void *data, bool blocked)
 | 
				
			||||||
	dell_send_request(buffer, 17, 11);
 | 
						dell_send_request(buffer, 17, 11);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* If the hardware switch controls this radio, and the hardware
 | 
						/* If the hardware switch controls this radio, and the hardware
 | 
				
			||||||
	   switch is disabled, don't allow changing the software state */
 | 
						   switch is disabled, don't allow changing the software state.
 | 
				
			||||||
 | 
						   If the hardware switch is reported as not supported, always
 | 
				
			||||||
 | 
						   fire the SMI to toggle the killswitch. */
 | 
				
			||||||
	if ((hwswitch_state & BIT(hwswitch_bit)) &&
 | 
						if ((hwswitch_state & BIT(hwswitch_bit)) &&
 | 
				
			||||||
	    !(buffer->output[1] & BIT(16))) {
 | 
						    !(buffer->output[1] & BIT(16)) &&
 | 
				
			||||||
 | 
						    (buffer->output[1] & BIT(0))) {
 | 
				
			||||||
		ret = -EINVAL;
 | 
							ret = -EINVAL;
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -398,6 +401,23 @@ static const struct file_operations dell_debugfs_fops = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void dell_update_rfkill(struct work_struct *ignored)
 | 
					static void dell_update_rfkill(struct work_struct *ignored)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						int status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						get_buffer();
 | 
				
			||||||
 | 
						dell_send_request(buffer, 17, 11);
 | 
				
			||||||
 | 
						status = buffer->output[1];
 | 
				
			||||||
 | 
						release_buffer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* if hardware rfkill is not supported, set it explicitly */
 | 
				
			||||||
 | 
						if (!(status & BIT(0))) {
 | 
				
			||||||
 | 
							if (wifi_rfkill)
 | 
				
			||||||
 | 
								dell_rfkill_set((void *)1, !((status & BIT(17)) >> 17));
 | 
				
			||||||
 | 
							if (bluetooth_rfkill)
 | 
				
			||||||
 | 
								dell_rfkill_set((void *)2, !((status & BIT(18)) >> 18));
 | 
				
			||||||
 | 
							if (wwan_rfkill)
 | 
				
			||||||
 | 
								dell_rfkill_set((void *)3, !((status & BIT(19)) >> 19));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (wifi_rfkill)
 | 
						if (wifi_rfkill)
 | 
				
			||||||
		dell_rfkill_query(wifi_rfkill, (void *)1);
 | 
							dell_rfkill_query(wifi_rfkill, (void *)1);
 | 
				
			||||||
	if (bluetooth_rfkill)
 | 
						if (bluetooth_rfkill)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,69 +60,20 @@ enum pmic_gpio_register {
 | 
				
			||||||
#define GPOSW_DOU 0x08
 | 
					#define GPOSW_DOU 0x08
 | 
				
			||||||
#define GPOSW_RDRV 0x30
 | 
					#define GPOSW_RDRV 0x30
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GPIO_UPDATE_TYPE	0x80000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NUM_GPIO 24
 | 
					#define NUM_GPIO 24
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct pmic_gpio_irq {
 | 
					 | 
				
			||||||
	spinlock_t lock;
 | 
					 | 
				
			||||||
	u32 trigger[NUM_GPIO];
 | 
					 | 
				
			||||||
	u32 dirty;
 | 
					 | 
				
			||||||
	struct work_struct work;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct pmic_gpio {
 | 
					struct pmic_gpio {
 | 
				
			||||||
 | 
						struct mutex		buslock;
 | 
				
			||||||
	struct gpio_chip	chip;
 | 
						struct gpio_chip	chip;
 | 
				
			||||||
	struct pmic_gpio_irq	irqtypes;
 | 
					 | 
				
			||||||
	void			*gpiointr;
 | 
						void			*gpiointr;
 | 
				
			||||||
	int			irq;
 | 
						int			irq;
 | 
				
			||||||
	unsigned		irq_base;
 | 
						unsigned		irq_base;
 | 
				
			||||||
 | 
						unsigned int		update_type;
 | 
				
			||||||
 | 
						u32			trigger_type;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void pmic_program_irqtype(int gpio, int type)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (type & IRQ_TYPE_EDGE_RISING)
 | 
					 | 
				
			||||||
		intel_scu_ipc_update_register(GPIO0 + gpio, 0x20, 0x20);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		intel_scu_ipc_update_register(GPIO0 + gpio, 0x00, 0x20);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (type & IRQ_TYPE_EDGE_FALLING)
 | 
					 | 
				
			||||||
		intel_scu_ipc_update_register(GPIO0 + gpio, 0x10, 0x10);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		intel_scu_ipc_update_register(GPIO0 + gpio, 0x00, 0x10);
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void pmic_irqtype_work(struct work_struct *work)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct pmic_gpio_irq *t =
 | 
					 | 
				
			||||||
		container_of(work, struct pmic_gpio_irq, work);
 | 
					 | 
				
			||||||
	unsigned long flags;
 | 
					 | 
				
			||||||
	int i;
 | 
					 | 
				
			||||||
	u16 type;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	spin_lock_irqsave(&t->lock, flags);
 | 
					 | 
				
			||||||
	/* As we drop the lock, we may need multiple scans if we race the
 | 
					 | 
				
			||||||
	   pmic_irq_type function */
 | 
					 | 
				
			||||||
	while (t->dirty) {
 | 
					 | 
				
			||||||
		/*
 | 
					 | 
				
			||||||
		 *	For each pin that has the dirty bit set send an IPC
 | 
					 | 
				
			||||||
		 *	message to configure the hardware via the PMIC
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
		for (i = 0; i < NUM_GPIO; i++) {
 | 
					 | 
				
			||||||
			if (!(t->dirty & (1 << i)))
 | 
					 | 
				
			||||||
				continue;
 | 
					 | 
				
			||||||
			t->dirty &= ~(1 << i);
 | 
					 | 
				
			||||||
			/* We can't trust the array entry or dirty
 | 
					 | 
				
			||||||
			   once the lock is dropped */
 | 
					 | 
				
			||||||
			type = t->trigger[i];
 | 
					 | 
				
			||||||
			spin_unlock_irqrestore(&t->lock, flags);
 | 
					 | 
				
			||||||
			pmic_program_irqtype(i, type);
 | 
					 | 
				
			||||||
			spin_lock_irqsave(&t->lock, flags);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	spin_unlock_irqrestore(&t->lock, flags);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 | 
					static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (offset > 8) {
 | 
						if (offset > 8) {
 | 
				
			||||||
| 
						 | 
					@ -190,25 +141,24 @@ static void pmic_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 | 
				
			||||||
			1 << (offset - 16));
 | 
								1 << (offset - 16));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pmic_irq_type(unsigned irq, unsigned type)
 | 
					/*
 | 
				
			||||||
 | 
					 * This is called from genirq with pg->buslock locked and
 | 
				
			||||||
 | 
					 * irq_desc->lock held. We can not access the scu bus here, so we
 | 
				
			||||||
 | 
					 * store the change and update in the bus_sync_unlock() function below
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static int pmic_irq_type(struct irq_data *data, unsigned type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pmic_gpio *pg = get_irq_chip_data(irq);
 | 
						struct pmic_gpio *pg = irq_data_get_irq_chip_data(data);
 | 
				
			||||||
	u32 gpio = irq - pg->irq_base;
 | 
						u32 gpio = data->irq - pg->irq_base;
 | 
				
			||||||
	unsigned long flags;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (gpio >= pg->chip.ngpio)
 | 
						if (gpio >= pg->chip.ngpio)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_lock_irqsave(&pg->irqtypes.lock, flags);
 | 
						pg->trigger_type = type;
 | 
				
			||||||
	pg->irqtypes.trigger[gpio] = type;
 | 
						pg->update_type = gpio | GPIO_UPDATE_TYPE;
 | 
				
			||||||
	pg->irqtypes.dirty |=  (1 << gpio);
 | 
					 | 
				
			||||||
	spin_unlock_irqrestore(&pg->irqtypes.lock, flags);
 | 
					 | 
				
			||||||
	schedule_work(&pg->irqtypes.work);
 | 
					 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 | 
					static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pmic_gpio *pg = container_of(chip, struct pmic_gpio, chip);
 | 
						struct pmic_gpio *pg = container_of(chip, struct pmic_gpio, chip);
 | 
				
			||||||
| 
						 | 
					@ -217,38 +167,32 @@ static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* the gpiointr register is read-clear, so just do nothing. */
 | 
					/* the gpiointr register is read-clear, so just do nothing. */
 | 
				
			||||||
static void pmic_irq_unmask(unsigned irq)
 | 
					static void pmic_irq_unmask(struct irq_data *data) { }
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void pmic_irq_mask(unsigned irq)
 | 
					static void pmic_irq_mask(struct irq_data *data) { }
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct irq_chip pmic_irqchip = {
 | 
					static struct irq_chip pmic_irqchip = {
 | 
				
			||||||
	.name		= "PMIC-GPIO",
 | 
						.name		= "PMIC-GPIO",
 | 
				
			||||||
	.mask		= pmic_irq_mask,
 | 
						.irq_mask	= pmic_irq_mask,
 | 
				
			||||||
	.unmask		= pmic_irq_unmask,
 | 
						.irq_unmask	= pmic_irq_unmask,
 | 
				
			||||||
	.set_type	= pmic_irq_type,
 | 
						.irq_set_type	= pmic_irq_type,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void pmic_irq_handler(unsigned irq, struct irq_desc *desc)
 | 
					static irqreturn_t pmic_irq_handler(int irq, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pmic_gpio *pg = (struct pmic_gpio *)get_irq_data(irq);
 | 
						struct pmic_gpio *pg = data;
 | 
				
			||||||
	u8 intsts = *((u8 *)pg->gpiointr + 4);
 | 
						u8 intsts = *((u8 *)pg->gpiointr + 4);
 | 
				
			||||||
	int gpio;
 | 
						int gpio;
 | 
				
			||||||
 | 
						irqreturn_t ret = IRQ_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (gpio = 0; gpio < 8; gpio++) {
 | 
						for (gpio = 0; gpio < 8; gpio++) {
 | 
				
			||||||
		if (intsts & (1 << gpio)) {
 | 
							if (intsts & (1 << gpio)) {
 | 
				
			||||||
			pr_debug("pmic pin %d triggered\n", gpio);
 | 
								pr_debug("pmic pin %d triggered\n", gpio);
 | 
				
			||||||
			generic_handle_irq(pg->irq_base + gpio);
 | 
								generic_handle_irq(pg->irq_base + gpio);
 | 
				
			||||||
 | 
								ret = IRQ_HANDLED;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
	if (desc->chip->irq_eoi)
 | 
					 | 
				
			||||||
		desc->chip->irq_eoi(irq_get_irq_data(irq));
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		dev_warn(pg->chip.dev, "missing EOI handler for irq %d\n", irq);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __devinit platform_pmic_gpio_probe(struct platform_device *pdev)
 | 
					static int __devinit platform_pmic_gpio_probe(struct platform_device *pdev)
 | 
				
			||||||
| 
						 | 
					@ -297,8 +241,7 @@ static int __devinit platform_pmic_gpio_probe(struct platform_device *pdev)
 | 
				
			||||||
	pg->chip.can_sleep = 1;
 | 
						pg->chip.can_sleep = 1;
 | 
				
			||||||
	pg->chip.dev = dev;
 | 
						pg->chip.dev = dev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	INIT_WORK(&pg->irqtypes.work, pmic_irqtype_work);
 | 
						mutex_init(&pg->buslock);
 | 
				
			||||||
	spin_lock_init(&pg->irqtypes.lock);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pg->chip.dev = dev;
 | 
						pg->chip.dev = dev;
 | 
				
			||||||
	retval = gpiochip_add(&pg->chip);
 | 
						retval = gpiochip_add(&pg->chip);
 | 
				
			||||||
| 
						 | 
					@ -306,8 +249,13 @@ static int __devinit platform_pmic_gpio_probe(struct platform_device *pdev)
 | 
				
			||||||
		printk(KERN_ERR "%s: Can not add pmic gpio chip.\n", __func__);
 | 
							printk(KERN_ERR "%s: Can not add pmic gpio chip.\n", __func__);
 | 
				
			||||||
		goto err;
 | 
							goto err;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	set_irq_data(pg->irq, pg);
 | 
					
 | 
				
			||||||
	set_irq_chained_handler(pg->irq, pmic_irq_handler);
 | 
						retval = request_irq(pg->irq, pmic_irq_handler, 0, "pmic", pg);
 | 
				
			||||||
 | 
						if (retval) {
 | 
				
			||||||
 | 
							printk(KERN_WARNING "pmic: Interrupt request failed\n");
 | 
				
			||||||
 | 
							goto err;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < 8; i++) {
 | 
						for (i = 0; i < 8; i++) {
 | 
				
			||||||
		set_irq_chip_and_handler_name(i + pg->irq_base, &pmic_irqchip,
 | 
							set_irq_chip_and_handler_name(i + pg->irq_base, &pmic_irqchip,
 | 
				
			||||||
					handle_simple_irq, "demux");
 | 
										handle_simple_irq, "demux");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -162,7 +162,7 @@ set_bool_##value(struct device *dev, struct device_attribute *attr, \
 | 
				
			||||||
			return -EINVAL; \
 | 
								return -EINVAL; \
 | 
				
			||||||
	return count; \
 | 
						return count; \
 | 
				
			||||||
} \
 | 
					} \
 | 
				
			||||||
static DEVICE_ATTR(value, S_IWUGO | S_IRUGO | S_IWUSR, \
 | 
					static DEVICE_ATTR(value, S_IRUGO | S_IWUSR, \
 | 
				
			||||||
	show_bool_##value, set_bool_##value);
 | 
						show_bool_##value, set_bool_##value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
show_set_bool(wireless, TC1100_INSTANCE_WIRELESS);
 | 
					show_set_bool(wireless, TC1100_INSTANCE_WIRELESS);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2275,16 +2275,12 @@ static void tpacpi_input_send_key(const unsigned int scancode)
 | 
				
			||||||
	if (keycode != KEY_RESERVED) {
 | 
						if (keycode != KEY_RESERVED) {
 | 
				
			||||||
		mutex_lock(&tpacpi_inputdev_send_mutex);
 | 
							mutex_lock(&tpacpi_inputdev_send_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN, scancode);
 | 
				
			||||||
		input_report_key(tpacpi_inputdev, keycode, 1);
 | 
							input_report_key(tpacpi_inputdev, keycode, 1);
 | 
				
			||||||
		if (keycode == KEY_UNKNOWN)
 | 
					 | 
				
			||||||
			input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN,
 | 
					 | 
				
			||||||
				    scancode);
 | 
					 | 
				
			||||||
		input_sync(tpacpi_inputdev);
 | 
							input_sync(tpacpi_inputdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN, scancode);
 | 
				
			||||||
		input_report_key(tpacpi_inputdev, keycode, 0);
 | 
							input_report_key(tpacpi_inputdev, keycode, 0);
 | 
				
			||||||
		if (keycode == KEY_UNKNOWN)
 | 
					 | 
				
			||||||
			input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN,
 | 
					 | 
				
			||||||
				    scancode);
 | 
					 | 
				
			||||||
		input_sync(tpacpi_inputdev);
 | 
							input_sync(tpacpi_inputdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		mutex_unlock(&tpacpi_inputdev_send_mutex);
 | 
							mutex_unlock(&tpacpi_inputdev_send_mutex);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,6 +97,18 @@ config RTC_INTF_DEV
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  If unsure, say Y.
 | 
						  If unsure, say Y.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config RTC_INTF_DEV_UIE_EMUL
 | 
				
			||||||
 | 
						bool "RTC UIE emulation on dev interface"
 | 
				
			||||||
 | 
						depends on RTC_INTF_DEV
 | 
				
			||||||
 | 
						help
 | 
				
			||||||
 | 
						  Provides an emulation for RTC_UIE if the underlying rtc chip
 | 
				
			||||||
 | 
						  driver does not expose RTC_UIE ioctls. Those requests generate
 | 
				
			||||||
 | 
						  once-per-second update interrupts, used for synchronization.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  The emulation code will read the time from the hardware
 | 
				
			||||||
 | 
						  clock several times per second, please enable this option
 | 
				
			||||||
 | 
						  only if you know that you really need it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config RTC_DRV_TEST
 | 
					config RTC_DRV_TEST
 | 
				
			||||||
	tristate "Test driver/device"
 | 
						tristate "Test driver/device"
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -209,9 +209,8 @@ int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		return err;
 | 
							/* nothing */;
 | 
				
			||||||
 | 
						else if (!rtc->ops)
 | 
				
			||||||
	if (!rtc->ops)
 | 
					 | 
				
			||||||
		err = -ENODEV;
 | 
							err = -ENODEV;
 | 
				
			||||||
	else if (!rtc->ops->alarm_irq_enable)
 | 
						else if (!rtc->ops->alarm_irq_enable)
 | 
				
			||||||
		err = -EINVAL;
 | 
							err = -EINVAL;
 | 
				
			||||||
| 
						 | 
					@ -229,6 +228,12 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		return err;
 | 
							return err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
 | 
				
			||||||
 | 
						if (enabled == 0 && rtc->uie_irq_active) {
 | 
				
			||||||
 | 
							mutex_unlock(&rtc->ops_lock);
 | 
				
			||||||
 | 
							return rtc_dev_update_irq_enable_emul(rtc, 0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	/* make sure we're changing state */
 | 
						/* make sure we're changing state */
 | 
				
			||||||
	if (rtc->uie_rtctimer.enabled == enabled)
 | 
						if (rtc->uie_rtctimer.enabled == enabled)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
| 
						 | 
					@ -248,6 +253,16 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	mutex_unlock(&rtc->ops_lock);
 | 
						mutex_unlock(&rtc->ops_lock);
 | 
				
			||||||
 | 
					#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Enable emulation if the driver did not provide
 | 
				
			||||||
 | 
						 * the update_irq_enable function pointer or if returned
 | 
				
			||||||
 | 
						 * -EINVAL to signal that it has been configured without
 | 
				
			||||||
 | 
						 * interrupts or that are not available at the moment.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (err == -EINVAL)
 | 
				
			||||||
 | 
							err = rtc_dev_update_irq_enable_emul(rtc, enabled);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -263,7 +278,7 @@ EXPORT_SYMBOL_GPL(rtc_update_irq_enable);
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Triggers the registered irq_task function callback.
 | 
					 * Triggers the registered irq_task function callback.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode)
 | 
					void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,6 +46,105 @@ static int rtc_dev_open(struct inode *inode, struct file *file)
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Routine to poll RTC seconds field for change as often as possible,
 | 
				
			||||||
 | 
					 * after first RTC_UIE use timer to reduce polling
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void rtc_uie_task(struct work_struct *work)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct rtc_device *rtc =
 | 
				
			||||||
 | 
							container_of(work, struct rtc_device, uie_task);
 | 
				
			||||||
 | 
						struct rtc_time tm;
 | 
				
			||||||
 | 
						int num = 0;
 | 
				
			||||||
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = rtc_read_time(rtc, &tm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spin_lock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
						if (rtc->stop_uie_polling || err) {
 | 
				
			||||||
 | 
							rtc->uie_task_active = 0;
 | 
				
			||||||
 | 
						} else if (rtc->oldsecs != tm.tm_sec) {
 | 
				
			||||||
 | 
							num = (tm.tm_sec + 60 - rtc->oldsecs) % 60;
 | 
				
			||||||
 | 
							rtc->oldsecs = tm.tm_sec;
 | 
				
			||||||
 | 
							rtc->uie_timer.expires = jiffies + HZ - (HZ/10);
 | 
				
			||||||
 | 
							rtc->uie_timer_active = 1;
 | 
				
			||||||
 | 
							rtc->uie_task_active = 0;
 | 
				
			||||||
 | 
							add_timer(&rtc->uie_timer);
 | 
				
			||||||
 | 
						} else if (schedule_work(&rtc->uie_task) == 0) {
 | 
				
			||||||
 | 
							rtc->uie_task_active = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						spin_unlock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
						if (num)
 | 
				
			||||||
 | 
							rtc_handle_legacy_irq(rtc, num, RTC_UF);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void rtc_uie_timer(unsigned long data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct rtc_device *rtc = (struct rtc_device *)data;
 | 
				
			||||||
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spin_lock_irqsave(&rtc->irq_lock, flags);
 | 
				
			||||||
 | 
						rtc->uie_timer_active = 0;
 | 
				
			||||||
 | 
						rtc->uie_task_active = 1;
 | 
				
			||||||
 | 
						if ((schedule_work(&rtc->uie_task) == 0))
 | 
				
			||||||
 | 
							rtc->uie_task_active = 0;
 | 
				
			||||||
 | 
						spin_unlock_irqrestore(&rtc->irq_lock, flags);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int clear_uie(struct rtc_device *rtc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						spin_lock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
						if (rtc->uie_irq_active) {
 | 
				
			||||||
 | 
							rtc->stop_uie_polling = 1;
 | 
				
			||||||
 | 
							if (rtc->uie_timer_active) {
 | 
				
			||||||
 | 
								spin_unlock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
								del_timer_sync(&rtc->uie_timer);
 | 
				
			||||||
 | 
								spin_lock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
								rtc->uie_timer_active = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (rtc->uie_task_active) {
 | 
				
			||||||
 | 
								spin_unlock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
								flush_scheduled_work();
 | 
				
			||||||
 | 
								spin_lock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							rtc->uie_irq_active = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						spin_unlock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int set_uie(struct rtc_device *rtc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct rtc_time tm;
 | 
				
			||||||
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = rtc_read_time(rtc, &tm);
 | 
				
			||||||
 | 
						if (err)
 | 
				
			||||||
 | 
							return err;
 | 
				
			||||||
 | 
						spin_lock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
						if (!rtc->uie_irq_active) {
 | 
				
			||||||
 | 
							rtc->uie_irq_active = 1;
 | 
				
			||||||
 | 
							rtc->stop_uie_polling = 0;
 | 
				
			||||||
 | 
							rtc->oldsecs = tm.tm_sec;
 | 
				
			||||||
 | 
							rtc->uie_task_active = 1;
 | 
				
			||||||
 | 
							if (schedule_work(&rtc->uie_task) == 0)
 | 
				
			||||||
 | 
								rtc->uie_task_active = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						rtc->irq_data = 0;
 | 
				
			||||||
 | 
						spin_unlock_irq(&rtc->irq_lock);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, unsigned int enabled)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (enabled)
 | 
				
			||||||
 | 
							return set_uie(rtc);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return clear_uie(rtc);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(rtc_dev_update_irq_enable_emul);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* CONFIG_RTC_INTF_DEV_UIE_EMUL */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t
 | 
					static ssize_t
 | 
				
			||||||
rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 | 
					rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 | 
				
			||||||
| 
						 | 
					@ -387,6 +486,11 @@ void rtc_dev_prepare(struct rtc_device *rtc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtc->dev.devt = MKDEV(MAJOR(rtc_devt), rtc->id);
 | 
						rtc->dev.devt = MKDEV(MAJOR(rtc_devt), rtc->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
 | 
				
			||||||
 | 
						INIT_WORK(&rtc->uie_task, rtc_uie_task);
 | 
				
			||||||
 | 
						setup_timer(&rtc->uie_timer, rtc_uie_timer, (unsigned long)rtc);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cdev_init(&rtc->char_dev, &rtc_dev_fops);
 | 
						cdev_init(&rtc->char_dev, &rtc_dev_fops);
 | 
				
			||||||
	rtc->char_dev.owner = rtc->owner;
 | 
						rtc->char_dev.owner = rtc->owner;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,7 @@ static struct dasd_discipline dasd_eckd_discipline;
 | 
				
			||||||
static struct ccw_device_id dasd_eckd_ids[] = {
 | 
					static struct ccw_device_id dasd_eckd_ids[] = {
 | 
				
			||||||
	{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), .driver_info = 0x1},
 | 
						{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), .driver_info = 0x1},
 | 
				
			||||||
	{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), .driver_info = 0x2},
 | 
						{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), .driver_info = 0x2},
 | 
				
			||||||
	{ CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3390, 0), .driver_info = 0x3},
 | 
						{ CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3380, 0), .driver_info = 0x3},
 | 
				
			||||||
	{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), .driver_info = 0x4},
 | 
						{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), .driver_info = 0x4},
 | 
				
			||||||
	{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), .driver_info = 0x5},
 | 
						{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), .driver_info = 0x5},
 | 
				
			||||||
	{ CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), .driver_info = 0x6},
 | 
						{ CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), .driver_info = 0x6},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -601,7 +601,7 @@ static int max3100_startup(struct uart_port *port)
 | 
				
			||||||
	s->rts = 0;
 | 
						s->rts = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(b, "max3100-%d", s->minor);
 | 
						sprintf(b, "max3100-%d", s->minor);
 | 
				
			||||||
	s->workqueue = create_freezeable_workqueue(b);
 | 
						s->workqueue = create_freezable_workqueue(b);
 | 
				
			||||||
	if (!s->workqueue) {
 | 
						if (!s->workqueue) {
 | 
				
			||||||
		dev_warn(&s->spi->dev, "cannot create workqueue\n");
 | 
							dev_warn(&s->spi->dev, "cannot create workqueue\n");
 | 
				
			||||||
		return -EBUSY;
 | 
							return -EBUSY;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -833,7 +833,7 @@ static int max3107_startup(struct uart_port *port)
 | 
				
			||||||
	struct max3107_port *s = container_of(port, struct max3107_port, port);
 | 
						struct max3107_port *s = container_of(port, struct max3107_port, port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Initialize work queue */
 | 
						/* Initialize work queue */
 | 
				
			||||||
	s->workqueue = create_freezeable_workqueue("max3107");
 | 
						s->workqueue = create_freezable_workqueue("max3107");
 | 
				
			||||||
	if (!s->workqueue) {
 | 
						if (!s->workqueue) {
 | 
				
			||||||
		dev_err(&s->spi->dev, "Workqueue creation failed\n");
 | 
							dev_err(&s->spi->dev, "Workqueue creation failed\n");
 | 
				
			||||||
		return -EBUSY;
 | 
							return -EBUSY;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,11 +37,19 @@ static enum shutdown_state shutting_down = SHUTDOWN_INVALID;
 | 
				
			||||||
#ifdef CONFIG_PM_SLEEP
 | 
					#ifdef CONFIG_PM_SLEEP
 | 
				
			||||||
static int xen_hvm_suspend(void *data)
 | 
					static int xen_hvm_suspend(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						int err;
 | 
				
			||||||
	struct sched_shutdown r = { .reason = SHUTDOWN_suspend };
 | 
						struct sched_shutdown r = { .reason = SHUTDOWN_suspend };
 | 
				
			||||||
	int *cancelled = data;
 | 
						int *cancelled = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BUG_ON(!irqs_disabled());
 | 
						BUG_ON(!irqs_disabled());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = sysdev_suspend(PMSG_SUSPEND);
 | 
				
			||||||
 | 
						if (err) {
 | 
				
			||||||
 | 
							printk(KERN_ERR "xen_hvm_suspend: sysdev_suspend failed: %d\n",
 | 
				
			||||||
 | 
							       err);
 | 
				
			||||||
 | 
							return err;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*cancelled = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
 | 
						*cancelled = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xen_hvm_post_suspend(*cancelled);
 | 
						xen_hvm_post_suspend(*cancelled);
 | 
				
			||||||
| 
						 | 
					@ -53,6 +61,8 @@ static int xen_hvm_suspend(void *data)
 | 
				
			||||||
		xen_timer_resume();
 | 
							xen_timer_resume();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sysdev_resume();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,6 +60,7 @@ int ceph_init_dentry(struct dentry *dentry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	di->dentry = dentry;
 | 
						di->dentry = dentry;
 | 
				
			||||||
	di->lease_session = NULL;
 | 
						di->lease_session = NULL;
 | 
				
			||||||
 | 
						di->parent_inode = igrab(dentry->d_parent->d_inode);
 | 
				
			||||||
	dentry->d_fsdata = di;
 | 
						dentry->d_fsdata = di;
 | 
				
			||||||
	dentry->d_time = jiffies;
 | 
						dentry->d_time = jiffies;
 | 
				
			||||||
	ceph_dentry_lru_add(dentry);
 | 
						ceph_dentry_lru_add(dentry);
 | 
				
			||||||
| 
						 | 
					@ -1033,7 +1034,7 @@ static void ceph_dentry_release(struct dentry *dentry)
 | 
				
			||||||
	u64 snapid = CEPH_NOSNAP;
 | 
						u64 snapid = CEPH_NOSNAP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!IS_ROOT(dentry)) {
 | 
						if (!IS_ROOT(dentry)) {
 | 
				
			||||||
		parent_inode = dentry->d_parent->d_inode;
 | 
							parent_inode = di->parent_inode;
 | 
				
			||||||
		if (parent_inode)
 | 
							if (parent_inode)
 | 
				
			||||||
			snapid = ceph_snap(parent_inode);
 | 
								snapid = ceph_snap(parent_inode);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1058,6 +1059,8 @@ static void ceph_dentry_release(struct dentry *dentry)
 | 
				
			||||||
		kmem_cache_free(ceph_dentry_cachep, di);
 | 
							kmem_cache_free(ceph_dentry_cachep, di);
 | 
				
			||||||
		dentry->d_fsdata = NULL;
 | 
							dentry->d_fsdata = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if (parent_inode)
 | 
				
			||||||
 | 
							iput(parent_inode);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int ceph_snapdir_d_revalidate(struct dentry *dentry,
 | 
					static int ceph_snapdir_d_revalidate(struct dentry *dentry,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -584,10 +584,14 @@ static void queue_realm_cap_snaps(struct ceph_snap_realm *realm)
 | 
				
			||||||
	if (lastinode)
 | 
						if (lastinode)
 | 
				
			||||||
		iput(lastinode);
 | 
							iput(lastinode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dout("queue_realm_cap_snaps %p %llx children\n", realm, realm->ino);
 | 
						list_for_each_entry(child, &realm->children, child_item) {
 | 
				
			||||||
	list_for_each_entry(child, &realm->children, child_item)
 | 
							dout("queue_realm_cap_snaps %p %llx queue child %p %llx\n",
 | 
				
			||||||
		queue_realm_cap_snaps(child);
 | 
							     realm, realm->ino, child, child->ino);
 | 
				
			||||||
 | 
							list_del_init(&child->dirty_item);
 | 
				
			||||||
 | 
							list_add(&child->dirty_item, &realm->dirty_item);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						list_del_init(&realm->dirty_item);
 | 
				
			||||||
	dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino);
 | 
						dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -683,7 +687,9 @@ more:
 | 
				
			||||||
	 * queue cap snaps _after_ we've built the new snap contexts,
 | 
						 * queue cap snaps _after_ we've built the new snap contexts,
 | 
				
			||||||
	 * so that i_head_snapc can be set appropriately.
 | 
						 * so that i_head_snapc can be set appropriately.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	list_for_each_entry(realm, &dirty_realms, dirty_item) {
 | 
						while (!list_empty(&dirty_realms)) {
 | 
				
			||||||
 | 
							realm = list_first_entry(&dirty_realms, struct ceph_snap_realm,
 | 
				
			||||||
 | 
										 dirty_item);
 | 
				
			||||||
		queue_realm_cap_snaps(realm);
 | 
							queue_realm_cap_snaps(realm);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -207,6 +207,7 @@ struct ceph_dentry_info {
 | 
				
			||||||
	struct dentry *dentry;
 | 
						struct dentry *dentry;
 | 
				
			||||||
	u64 time;
 | 
						u64 time;
 | 
				
			||||||
	u64 offset;
 | 
						u64 offset;
 | 
				
			||||||
 | 
						struct inode *parent_inode;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ceph_inode_xattrs_info {
 | 
					struct ceph_inode_xattrs_info {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,5 +127,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
 | 
				
			||||||
extern const struct export_operations cifs_export_ops;
 | 
					extern const struct export_operations cifs_export_ops;
 | 
				
			||||||
#endif /* EXPERIMENTAL */
 | 
					#endif /* EXPERIMENTAL */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CIFS_VERSION   "1.70"
 | 
					#define CIFS_VERSION   "1.71"
 | 
				
			||||||
#endif				/* _CIFSFS_H */
 | 
					#endif				/* _CIFSFS_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -170,7 +170,7 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int rc, alen, slen;
 | 
						int rc, alen, slen;
 | 
				
			||||||
	const char *pct;
 | 
						const char *pct;
 | 
				
			||||||
	char *endp, scope_id[13];
 | 
						char scope_id[13];
 | 
				
			||||||
	struct sockaddr_in *s4 = (struct sockaddr_in *) dst;
 | 
						struct sockaddr_in *s4 = (struct sockaddr_in *) dst;
 | 
				
			||||||
	struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) dst;
 | 
						struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) dst;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -197,9 +197,9 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len)
 | 
				
			||||||
		memcpy(scope_id, pct + 1, slen);
 | 
							memcpy(scope_id, pct + 1, slen);
 | 
				
			||||||
		scope_id[slen] = '\0';
 | 
							scope_id[slen] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		s6->sin6_scope_id = (u32) simple_strtoul(pct, &endp, 0);
 | 
							rc = strict_strtoul(scope_id, 0,
 | 
				
			||||||
		if (endp != scope_id + slen)
 | 
										(unsigned long *)&s6->sin6_scope_id);
 | 
				
			||||||
			return 0;
 | 
							rc = (rc == 0) ? 1 : 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return rc;
 | 
						return rc;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -656,13 +656,13 @@ ssetup_ntlmssp_authenticate:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (type == LANMAN) {
 | 
						if (type == LANMAN) {
 | 
				
			||||||
#ifdef CONFIG_CIFS_WEAK_PW_HASH
 | 
					#ifdef CONFIG_CIFS_WEAK_PW_HASH
 | 
				
			||||||
		char lnm_session_key[CIFS_SESS_KEY_SIZE];
 | 
							char lnm_session_key[CIFS_AUTH_RESP_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
 | 
							pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* no capabilities flags in old lanman negotiation */
 | 
							/* no capabilities flags in old lanman negotiation */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE);
 | 
							pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Calculate hash with password and copy into bcc_ptr.
 | 
							/* Calculate hash with password and copy into bcc_ptr.
 | 
				
			||||||
		 * Encryption Key (stored as in cryptkey) gets used if the
 | 
							 * Encryption Key (stored as in cryptkey) gets used if the
 | 
				
			||||||
| 
						 | 
					@ -675,8 +675,8 @@ ssetup_ntlmssp_authenticate:
 | 
				
			||||||
					true : false, lnm_session_key);
 | 
										true : false, lnm_session_key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ses->flags |= CIFS_SES_LANMAN;
 | 
							ses->flags |= CIFS_SES_LANMAN;
 | 
				
			||||||
		memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_SESS_KEY_SIZE);
 | 
							memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_AUTH_RESP_SIZE);
 | 
				
			||||||
		bcc_ptr += CIFS_SESS_KEY_SIZE;
 | 
							bcc_ptr += CIFS_AUTH_RESP_SIZE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* can not sign if LANMAN negotiated so no need
 | 
							/* can not sign if LANMAN negotiated so no need
 | 
				
			||||||
		to calculate signing key? but what if server
 | 
							to calculate signing key? but what if server
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,24 +46,28 @@ static int ecryptfs_d_revalidate(struct dentry *dentry, struct nameidata *nd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct dentry *lower_dentry;
 | 
						struct dentry *lower_dentry;
 | 
				
			||||||
	struct vfsmount *lower_mnt;
 | 
						struct vfsmount *lower_mnt;
 | 
				
			||||||
	struct dentry *dentry_save;
 | 
						struct dentry *dentry_save = NULL;
 | 
				
			||||||
	struct vfsmount *vfsmount_save;
 | 
						struct vfsmount *vfsmount_save = NULL;
 | 
				
			||||||
	int rc = 1;
 | 
						int rc = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (nd->flags & LOOKUP_RCU)
 | 
						if (nd && nd->flags & LOOKUP_RCU)
 | 
				
			||||||
		return -ECHILD;
 | 
							return -ECHILD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lower_dentry = ecryptfs_dentry_to_lower(dentry);
 | 
						lower_dentry = ecryptfs_dentry_to_lower(dentry);
 | 
				
			||||||
	lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
 | 
						lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
 | 
				
			||||||
	if (!lower_dentry->d_op || !lower_dentry->d_op->d_revalidate)
 | 
						if (!lower_dentry->d_op || !lower_dentry->d_op->d_revalidate)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	dentry_save = nd->path.dentry;
 | 
						if (nd) {
 | 
				
			||||||
	vfsmount_save = nd->path.mnt;
 | 
							dentry_save = nd->path.dentry;
 | 
				
			||||||
	nd->path.dentry = lower_dentry;
 | 
							vfsmount_save = nd->path.mnt;
 | 
				
			||||||
	nd->path.mnt = lower_mnt;
 | 
							nd->path.dentry = lower_dentry;
 | 
				
			||||||
 | 
							nd->path.mnt = lower_mnt;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd);
 | 
						rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd);
 | 
				
			||||||
	nd->path.dentry = dentry_save;
 | 
						if (nd) {
 | 
				
			||||||
	nd->path.mnt = vfsmount_save;
 | 
							nd->path.dentry = dentry_save;
 | 
				
			||||||
 | 
							nd->path.mnt = vfsmount_save;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if (dentry->d_inode) {
 | 
						if (dentry->d_inode) {
 | 
				
			||||||
		struct inode *lower_inode =
 | 
							struct inode *lower_inode =
 | 
				
			||||||
			ecryptfs_inode_to_lower(dentry->d_inode);
 | 
								ecryptfs_inode_to_lower(dentry->d_inode);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -632,8 +632,7 @@ int ecryptfs_interpose(struct dentry *hidden_dentry,
 | 
				
			||||||
		       u32 flags);
 | 
							       u32 flags);
 | 
				
			||||||
int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
 | 
					int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
 | 
				
			||||||
					struct dentry *lower_dentry,
 | 
										struct dentry *lower_dentry,
 | 
				
			||||||
					struct inode *ecryptfs_dir_inode,
 | 
										struct inode *ecryptfs_dir_inode);
 | 
				
			||||||
					struct nameidata *ecryptfs_nd);
 | 
					 | 
				
			||||||
int ecryptfs_decode_and_decrypt_filename(char **decrypted_name,
 | 
					int ecryptfs_decode_and_decrypt_filename(char **decrypted_name,
 | 
				
			||||||
					 size_t *decrypted_name_size,
 | 
										 size_t *decrypted_name_size,
 | 
				
			||||||
					 struct dentry *ecryptfs_dentry,
 | 
										 struct dentry *ecryptfs_dentry,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue