[kernel] r11575 - in dists/trunk/linux-2.6/debian/patches: bugfix/all series

Maximilian Attems maks at alioth.debian.org
Sat Jun 7 23:09:29 UTC 2008


Author: maks
Date: Sat Jun  7 23:09:28 2008
New Revision: 11575

Log:
update to 2.6.25-rc5-git2

- disable conflicting mips patch, needs check
- remove conflicting ip2 Kconfig update


Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.26-rc5-git2
Modified:
   dists/trunk/linux-2.6/debian/patches/series/1~experimental.1

Added: dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.26-rc5-git2
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.26-rc5-git2	Sat Jun  7 23:09:28 2008
@@ -0,0 +1,6766 @@
+diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches
+index 9c93a03..118ca6e 100644
+--- a/Documentation/SubmittingPatches
++++ b/Documentation/SubmittingPatches
+@@ -327,6 +327,52 @@ Some people also put extra tags at the end.  They'll just be ignored for
+ now, but you can do this to mark internal company procedures or just
+ point out some special detail about the sign-off. 
+ 
++If you are a subsystem or branch maintainer, sometimes you need to slightly
++modify patches you receive in order to merge them, because the code is not
++exactly the same in your tree and the submitters'. If you stick strictly to
++rule (c), you should ask the submitter to rediff, but this is a totally
++counter-productive waste of time and energy. Rule (b) allows you to adjust
++the code, but then it is very impolite to change one submitter's code and
++make him endorse your bugs. To solve this problem, it is recommended that
++you add a line between the last Signed-off-by header and yours, indicating
++the nature of your changes. While there is nothing mandatory about this, it
++seems like prepending the description with your mail and/or name, all
++enclosed in square brackets, is noticeable enough to make it obvious that
++you are responsible for last-minute changes. Example :
++
++	Signed-off-by: Random J Developer <random at developer.example.org>
++	[lucky at maintainer.example.org: struct foo moved from foo.c to foo.h]
++	Signed-off-by: Lucky K Maintainer <lucky at maintainer.example.org>
++
++This practise is particularly helpful if you maintain a stable branch and
++want at the same time to credit the author, track changes, merge the fix,
++and protect the submitter from complaints. Note that under no circumstances
++can you change the author's identity (the From header), as it is the one
++which appears in the changelog.
++
++Special note to back-porters: It seems to be a common and useful practise
++to insert an indication of the origin of a patch at the top of the commit
++message (just after the subject line) to facilitate tracking. For instance,
++here's what we see in 2.6-stable :
++
++    Date:   Tue May 13 19:10:30 2008 +0000
++
++        SCSI: libiscsi regression in 2.6.25: fix nop timer handling
++
++        commit 4cf1043593db6a337f10e006c23c69e5fc93e722 upstream
++
++And here's what appears in 2.4 :
++
++    Date:   Tue May 13 22:12:27 2008 +0200
++
++        wireless, airo: waitbusy() won't delay
++
++        [backport of 2.6 commit b7acbdfbd1f277c1eb23f344f899cfa4cd0bf36a]
++
++Whatever the format, this information provides a valuable help to people
++tracking your trees, and to people trying to trouble-shoot bugs in your
++tree.
++
+ 
+ 13) When to use Acked-by: and Cc:
+ 
+diff --git a/Documentation/cpusets.txt b/Documentation/cpusets.txt
+index fb7b361..d803c5c 100644
+--- a/Documentation/cpusets.txt
++++ b/Documentation/cpusets.txt
+@@ -199,7 +199,7 @@ using the sched_setaffinity, mbind and set_mempolicy system calls.
+ The following rules apply to each cpuset:
+ 
+  - Its CPUs and Memory Nodes must be a subset of its parents.
+- - It can only be marked exclusive if its parent is.
++ - It can't be marked exclusive unless its parent is.
+  - If its cpu or memory is exclusive, they may not overlap any sibling.
+ 
+ These rules, and the natural hierarchy of cpusets, enable efficient
+@@ -345,7 +345,7 @@ is modified to perform an inline check for this PF_SPREAD_PAGE task
+ flag, and if set, a call to a new routine cpuset_mem_spread_node()
+ returns the node to prefer for the allocation.
+ 
+-Similarly, setting 'memory_spread_cache' turns on the flag
++Similarly, setting 'memory_spread_slab' turns on the flag
+ PF_SPREAD_SLAB, and appropriately marked slab caches will allocate
+ pages from the node returned by cpuset_mem_spread_node().
+ 
+@@ -709,7 +709,10 @@ Now you want to do something with this cpuset.
+ 
+ In this directory you can find several files:
+ # ls
+-cpus  cpu_exclusive  mems  mem_exclusive mem_hardwall  tasks
++cpu_exclusive  memory_migrate      mems                      tasks
++cpus           memory_pressure     notify_on_release
++mem_exclusive  memory_spread_page  sched_load_balance
++mem_hardwall   memory_spread_slab  sched_relax_domain_level
+ 
+ Reading them will give you information about the state of this cpuset:
+ the CPUs and Memory Nodes it can use, the processes that are using
+diff --git a/Documentation/kernel-doc-nano-HOWTO.txt b/Documentation/kernel-doc-nano-HOWTO.txt
+index 2075c06..0bd3274 100644
+--- a/Documentation/kernel-doc-nano-HOWTO.txt
++++ b/Documentation/kernel-doc-nano-HOWTO.txt
+@@ -1,6 +1,105 @@
+ kernel-doc nano-HOWTO
+ =====================
+ 
++How to format kernel-doc comments
++---------------------------------
++
++In order to provide embedded, 'C' friendly, easy to maintain,
++but consistent and extractable documentation of the functions and
++data structures in the Linux kernel, the Linux kernel has adopted
++a consistent style for documenting functions and their parameters,
++and structures and their members.
++
++The format for this documentation is called the kernel-doc format.
++It is documented in this Documentation/kernel-doc-nano-HOWTO.txt file.
++
++This style embeds the documentation within the source files, using
++a few simple conventions.  The scripts/kernel-doc perl script, some
++SGML templates in Documentation/DocBook, and other tools understand
++these conventions, and are used to extract this embedded documentation
++into various documents.
++
++In order to provide good documentation of kernel functions and data
++structures, please use the following conventions to format your
++kernel-doc comments in Linux kernel source.
++
++We definitely need kernel-doc formatted documentation for functions
++that are exported to loadable modules using EXPORT_SYMBOL.
++
++We also look to provide kernel-doc formatted documentation for
++functions externally visible to other kernel files (not marked
++"static").
++
++We also recommend providing kernel-doc formatted documentation
++for private (file "static") routines, for consistency of kernel
++source code layout.  But this is lower priority and at the
++discretion of the MAINTAINER of that kernel source file.
++
++Data structures visible in kernel include files should also be
++documented using kernel-doc formatted comments.
++
++The opening comment mark "/**" is reserved for kernel-doc comments.
++Only comments so marked will be considered by the kernel-doc scripts,
++and any comment so marked must be in kernel-doc format.  Do not use
++"/**" to be begin a comment block unless the comment block contains
++kernel-doc formatted comments.  The closing comment marker for
++kernel-doc comments can be either "*/" or "**/".
++
++Kernel-doc comments should be placed just before the function
++or data structure being described.
++
++Example kernel-doc function comment:
++
++/**
++ * foobar() - short function description of foobar
++ * @arg1:	Describe the first argument to foobar.
++ * @arg2:	Describe the second argument to foobar.
++ *		One can provide multiple line descriptions
++ *		for arguments.
++ *
++ * A longer description, with more discussion of the function foobar()
++ * that might be useful to those using or modifying it.  Begins with
++ * empty comment line, and may include additional embedded empty
++ * comment lines.
++ *
++ * The longer description can have multiple paragraphs.
++ **/
++
++The first line, with the short description, must be on a single line.
++
++The @argument descriptions must begin on the very next line following
++this opening short function description line, with no intervening
++empty comment lines.
++
++Example kernel-doc data structure comment.
++
++/**
++ * struct blah - the basic blah structure
++ * @mem1:	describe the first member of struct blah
++ * @mem2:	describe the second member of struct blah,
++ *		perhaps with more lines and words.
++ *
++ * Longer description of this structure.
++ **/
++
++The kernel-doc function comments describe each parameter to the
++function, in order, with the @name lines.
++
++The kernel-doc data structure comments describe each structure member
++in the data structure, with the @name lines.
++
++The longer description formatting is "reflowed", losing your line
++breaks.  So presenting carefully formatted lists within these
++descriptions won't work so well; derived documentation will lose
++the formatting.
++
++See the section below "How to add extractable documentation to your
++source files" for more details and notes on how to format kernel-doc
++comments.
++
++Components of the kernel-doc system
++-----------------------------------
++
+ Many places in the source tree have extractable documentation in the
+ form of block comments above functions.  The components of this system
+ are:
+diff --git a/Documentation/kernel-docs.txt b/Documentation/kernel-docs.txt
+index 5a4ef48..28cdc2a 100644
+--- a/Documentation/kernel-docs.txt
++++ b/Documentation/kernel-docs.txt
+@@ -715,14 +715,14 @@
+ 
+      * Name: "Gary's Encyclopedia - The Linux Kernel"
+        Author: Gary (I suppose...).
+-       URL: http://www.lisoleg.net/cgi-bin/lisoleg.pl?view=kernel.htm
+-       Keywords: links, not found here?.
++       URL: http://slencyclopedia.berlios.de/index.html
++       Keywords: linux, community, everything!
+        Description: Gary's Encyclopedia exists to allow the rapid finding
+        of documentation and other information of interest to GNU/Linux
+        users. It has about 4000 links to external pages in 150 major
+        categories. This link is for kernel-specific links, documents,
+-       sites... Look there if you could not find here what you were
+-       looking for.
++       sites...  This list is now hosted by developer.Berlios.de,
++       but seems not to have been updated since sometime in 1999.
+ 
+      * Name: "The home page of Linux-MM"
+        Author: The Linux-MM team.
+diff --git a/Documentation/networking/arcnet.txt b/Documentation/networking/arcnet.txt
+index 770fc41..7960125 100644
+--- a/Documentation/networking/arcnet.txt
++++ b/Documentation/networking/arcnet.txt
+@@ -46,7 +46,7 @@ These are the ARCnet drivers for Linux.
+ 
+ 
+ This new release (2.91) has been put together by David Woodhouse 
+-<dwmw2 at cam.ac.uk>, in an attempt to tidy up the driver after adding support 
++<dwmw2 at infradead.org>, in an attempt to tidy up the driver after adding support
+ for yet another chipset. Now the generic support has been separated from the
+ individual chipset drivers, and the source files aren't quite so packed with
+ #ifdefs! I've changed this file a bit, but kept it in the first person from
+diff --git a/Documentation/video4linux/CARDLIST.cx88 b/Documentation/video4linux/CARDLIST.cx88
+index 5439573..7cf5685 100644
+--- a/Documentation/video4linux/CARDLIST.cx88
++++ b/Documentation/video4linux/CARDLIST.cx88
+@@ -60,7 +60,7 @@
+  59 -> DViCO FusionHDTV 5 PCI nano                         [18ac:d530]
+  60 -> Pinnacle Hybrid PCTV                                [12ab:1788]
+  61 -> Winfast TV2000 XP Global                            [107d:6f18]
+- 62 -> PowerColor Real Angel 330                           [14f1:ea3d]
++ 62 -> PowerColor RA330                                    [14f1:ea3d]
+  63 -> Geniatech X8000-MT DVBT                             [14f1:8852]
+  64 -> DViCO FusionHDTV DVB-T PRO                          [18ac:db30]
+  65 -> DViCO FusionHDTV 7 Gold                             [18ac:d610]
+diff --git a/Documentation/video4linux/cx18.txt b/Documentation/video4linux/cx18.txt
+index 077d56e..6842c26 100644
+--- a/Documentation/video4linux/cx18.txt
++++ b/Documentation/video4linux/cx18.txt
+@@ -1,7 +1,9 @@
+ Some notes regarding the cx18 driver for the Conexant CX23418 MPEG
+ encoder chip:
+ 
+-1) The only hardware currently supported is the Hauppauge HVR-1600.
++1) The only hardware currently supported is the Hauppauge HVR-1600
++   card and the Compro VideoMate H900 (note that this card only
++   supports analog input, it has no digital tuner!).
+ 
+ 2) Some people have problems getting the i2c bus to work. Cause unknown.
+    The symptom is that the eeprom cannot be read and the card is
+diff --git a/Documentation/vm/pagemap.txt b/Documentation/vm/pagemap.txt
+new file mode 100644
+index 0000000..ce72c0f
+--- /dev/null
++++ b/Documentation/vm/pagemap.txt
+@@ -0,0 +1,77 @@
++pagemap, from the userspace perspective
++---------------------------------------
++
++pagemap is a new (as of 2.6.25) set of interfaces in the kernel that allow
++userspace programs to examine the page tables and related information by
++reading files in /proc.
++
++There are three components to pagemap:
++
++ * /proc/pid/pagemap.  This file lets a userspace process find out which
++   physical frame each virtual page is mapped to.  It contains one 64-bit
++   value for each virtual page, containing the following data (from
++   fs/proc/task_mmu.c, above pagemap_read):
++
++    * Bits 0-55  page frame number (PFN) if present
++    * Bits 0-4   swap type if swapped
++    * Bits 5-55  swap offset if swapped
++    * Bits 55-60 page shift (page size = 1<<page shift)
++    * Bit  61    reserved for future use
++    * Bit  62    page swapped
++    * Bit  63    page present
++
++   If the page is not present but in swap, then the PFN contains an
++   encoding of the swap file number and the page's offset into the
++   swap. Unmapped pages return a null PFN. This allows determining
++   precisely which pages are mapped (or in swap) and comparing mapped
++   pages between processes.
++
++   Efficient users of this interface will use /proc/pid/maps to
++   determine which areas of memory are actually mapped and llseek to
++   skip over unmapped regions.
++
++ * /proc/kpagecount.  This file contains a 64-bit count of the number of
++   times each page is mapped, indexed by PFN.
++
++ * /proc/kpageflags.  This file contains a 64-bit set of flags for each
++   page, indexed by PFN.
++
++   The flags are (from fs/proc/proc_misc, above kpageflags_read):
++
++     0. LOCKED
++     1. ERROR
++     2. REFERENCED
++     3. UPTODATE
++     4. DIRTY
++     5. LRU
++     6. ACTIVE
++     7. SLAB
++     8. WRITEBACK
++     9. RECLAIM
++    10. BUDDY
++
++Using pagemap to do something useful:
++
++The general procedure for using pagemap to find out about a process' memory
++usage goes like this:
++
++ 1. Read /proc/pid/maps to determine which parts of the memory space are
++    mapped to what.
++ 2. Select the maps you are interested in -- all of them, or a particular
++    library, or the stack or the heap, etc.
++ 3. Open /proc/pid/pagemap and seek to the pages you would like to examine.
++ 4. Read a u64 for each page from pagemap.
++ 5. Open /proc/kpagecount and/or /proc/kpageflags.  For each PFN you just
++    read, seek to that entry in the file, and read the data you want.
++
++For example, to find the "unique set size" (USS), which is the amount of
++memory that a process is using that is not shared with any other process,
++you can go through every map in the process, find the PFNs, look those up
++in kpagecount, and tally up the number of pages that are only referenced
++once.
++
++Other notes:
++
++Reading from any of the files will return -EINVAL if you are not starting
++the read on an 8-byte boundary (e.g., if you seeked an odd number of bytes
++into the file), or if the size of the read is not a multiple of 8 bytes.
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 46fa179..99f5665 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -2565,7 +2565,6 @@ LINUX SECURITY MODULE (LSM) FRAMEWORK
+ P:	Chris Wright
+ M:	chrisw at sous-sol.org
+ L:	linux-security-module at vger.kernel.org
+-W:	http://lsm.immunix.org
+ T:	git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
+ S:	Supported
+ 
+@@ -2866,8 +2865,8 @@ S:	Maintained
+ NETEFFECT IWARP RNIC DRIVER (IW_NES)
+ P:	Faisal Latif
+ M:	flatif at neteffect.com
+-P:	Nishi Gupta
+-M:	ngupta at neteffect.com
++P:	Chien Tung
++M:	ctung at neteffect.com
+ P:	Glenn Streiff
+ M:	gstreiff at neteffect.com
+ L:	general at lists.openfabrics.org
+@@ -3439,10 +3438,7 @@ L:	rtc-linux at googlegroups.com
+ S:	Maintained
+ 
+ REISERFS FILE SYSTEM
+-P:	Hans Reiser
+-M:	reiserfs-dev at namesys.com
+ L:	reiserfs-devel at vger.kernel.org
+-W:	http://www.namesys.com
+ S:	Supported
+ 
+ RFKILL
+diff --git a/arch/arm/boot/compressed/head-xscale.S b/arch/arm/boot/compressed/head-xscale.S
+index 67ea99e..dd3fbd6 100644
+--- a/arch/arm/boot/compressed/head-xscale.S
++++ b/arch/arm/boot/compressed/head-xscale.S
+@@ -33,10 +33,6 @@ __XScale_start:
+ 		bic	r0, r0, #0x1000		@ clear Icache
+ 		mcr	p15, 0, r0, c1, c0, 0
+ 
+-#ifdef CONFIG_ARCH_COTULLA_IDP
+-		mov	r7, #MACH_TYPE_COTULLA_IDP
+-#endif
+-
+ #ifdef CONFIG_ARCH_IXP2000
+ 		mov	r1, #-1
+ 		mov	r0, #0xd6000000
+diff --git a/arch/arm/mach-pxa/cm-x270.c b/arch/arm/mach-pxa/cm-x270.c
+index 6d4416a..f5851d1 100644
+--- a/arch/arm/mach-pxa/cm-x270.c
++++ b/arch/arm/mach-pxa/cm-x270.c
+@@ -59,7 +59,7 @@ static struct resource cmx270_dm9k_resource[] = {
+ 	[2] = {
+ 		.start = CMX270_ETHIRQ,
+ 		.end   = CMX270_ETHIRQ,
+-		.flags = IORESOURCE_IRQ,
++		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
+ 	}
+ };
+ 
+diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
+index edc4f07..9c57700 100644
+--- a/arch/arm/mach-pxa/em-x270.c
++++ b/arch/arm/mach-pxa/em-x270.c
+@@ -50,7 +50,7 @@ static struct resource em_x270_dm9k_resource[] = {
+ 	[2] = {
+ 		.start = EM_X270_ETHIRQ,
+ 		.end   = EM_X270_ETHIRQ,
+-		.flags = IORESOURCE_IRQ,
++		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
+ 	}
+ };
+ 
+diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
+index c2cbd66..ab4a9f5 100644
+--- a/arch/arm/mach-pxa/tosa.c
++++ b/arch/arm/mach-pxa/tosa.c
+@@ -467,8 +467,8 @@ static struct platform_device *devices[] __initdata = {
+ 
+ static void tosa_poweroff(void)
+ {
+-	pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_OUT);
+-	GPSR(TOSA_GPIO_ON_RESET) = GPIO_bit(TOSA_GPIO_ON_RESET);
++	gpio_direction_output(TOSA_GPIO_ON_RESET, 0);
++	gpio_set_value(TOSA_GPIO_ON_RESET, 1);
+ 
+ 	mdelay(1000);
+ 	arm_machine_restart('h');
+diff --git a/arch/frv/kernel/cmode.S b/arch/frv/kernel/cmode.S
+index 81ba28a..53deeb5 100644
+--- a/arch/frv/kernel/cmode.S
++++ b/arch/frv/kernel/cmode.S
+@@ -1,7 +1,7 @@
+ /* cmode.S: clock mode management
+  *
+  * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
+- * Written by David Woodhouse (dwmw2 at redhat.com)
++ * Written by David Woodhouse (dwmw2 at infradead.org)
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+diff --git a/arch/frv/kernel/sleep.S b/arch/frv/kernel/sleep.S
+index c9b2d51..f67bf73 100644
+--- a/arch/frv/kernel/sleep.S
++++ b/arch/frv/kernel/sleep.S
+@@ -1,7 +1,7 @@
+ /* sleep.S: power saving mode entry
+  *
+  * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
+- * Written by David Woodhouse (dwmw2 at redhat.com)
++ * Written by David Woodhouse (dwmw2 at infradead.org)
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+diff --git a/arch/frv/mb93090-mb00/pci-dma-nommu.c b/arch/frv/mb93090-mb00/pci-dma-nommu.c
+index 4985466..64ee58d 100644
+--- a/arch/frv/mb93090-mb00/pci-dma-nommu.c
++++ b/arch/frv/mb93090-mb00/pci-dma-nommu.c
+@@ -1,7 +1,7 @@
+ /* pci-dma-nommu.c: Dynamic DMA mapping support for the FRV
+  *
+  * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
+- * Written by David Woodhouse (dwmw2 at redhat.com)
++ * Written by David Woodhouse (dwmw2 at infradead.org)
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+diff --git a/arch/m68k/configs/amiga_defconfig b/arch/m68k/configs/amiga_defconfig
+index dca50da..8e2a0f5 100644
+--- a/arch/m68k/configs/amiga_defconfig
++++ b/arch/m68k/configs/amiga_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:41 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/apollo_defconfig b/arch/m68k/configs/apollo_defconfig
+index c3cd5b7..e2d511e 100644
+--- a/arch/m68k/configs/apollo_defconfig
++++ b/arch/m68k/configs/apollo_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:42 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/atari_defconfig b/arch/m68k/configs/atari_defconfig
+index 073ae4b..6e20d65 100644
+--- a/arch/m68k/configs/atari_defconfig
++++ b/arch/m68k/configs/atari_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:43 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/bvme6000_defconfig b/arch/m68k/configs/bvme6000_defconfig
+index 0789ede..a0a9b30 100644
+--- a/arch/m68k/configs/bvme6000_defconfig
++++ b/arch/m68k/configs/bvme6000_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:45 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/hp300_defconfig b/arch/m68k/configs/hp300_defconfig
+index 3e140bf..6778041 100644
+--- a/arch/m68k/configs/hp300_defconfig
++++ b/arch/m68k/configs/hp300_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:46 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/mac_defconfig b/arch/m68k/configs/mac_defconfig
+index ba3a917..7cd3757 100644
+--- a/arch/m68k/configs/mac_defconfig
++++ b/arch/m68k/configs/mac_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:47 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/multi_defconfig b/arch/m68k/configs/multi_defconfig
+index 4d23f99..0747fa3 100644
+--- a/arch/m68k/configs/multi_defconfig
++++ b/arch/m68k/configs/multi_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:42:31 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/mvme147_defconfig b/arch/m68k/configs/mvme147_defconfig
+index 188847f..e7a8246 100644
+--- a/arch/m68k/configs/mvme147_defconfig
++++ b/arch/m68k/configs/mvme147_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:49 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/mvme16x_defconfig b/arch/m68k/configs/mvme16x_defconfig
+index 983e53d..ab536eb 100644
+--- a/arch/m68k/configs/mvme16x_defconfig
++++ b/arch/m68k/configs/mvme16x_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:50 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/q40_defconfig b/arch/m68k/configs/q40_defconfig
+index 7707f3f..e05be68 100644
+--- a/arch/m68k/configs/q40_defconfig
++++ b/arch/m68k/configs/q40_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:51 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/sun3_defconfig b/arch/m68k/configs/sun3_defconfig
+index a765f6f..296340d 100644
+--- a/arch/m68k/configs/sun3_defconfig
++++ b/arch/m68k/configs/sun3_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:53 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/m68k/configs/sun3x_defconfig b/arch/m68k/configs/sun3x_defconfig
+index 4315139..8d3a416 100644
+--- a/arch/m68k/configs/sun3x_defconfig
++++ b/arch/m68k/configs/sun3x_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.26-rc2
+-# Sun May 18 14:44:54 2008
++# Linux kernel version: 2.6.26-rc4
++# Wed May 28 22:47:35 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
+-# CONFIG_COMPAT_BRK is not set
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+diff --git a/arch/mips/au1000/common/clocks.c b/arch/mips/au1000/common/clocks.c
+index 46f8ee0..043429d 100644
+--- a/arch/mips/au1000/common/clocks.c
++++ b/arch/mips/au1000/common/clocks.c
+@@ -45,6 +45,7 @@ unsigned int get_au1x00_speed(void)
+ {
+ 	return au1x00_clock;
+ }
++EXPORT_SYMBOL(get_au1x00_speed);
+ 
+ /*
+  * The UART baud base is not known at compile time ... if
+diff --git a/arch/mips/au1000/common/dbdma.c b/arch/mips/au1000/common/dbdma.c
+index 42d5552..601ee91 100644
+--- a/arch/mips/au1000/common/dbdma.c
++++ b/arch/mips/au1000/common/dbdma.c
+@@ -216,6 +216,17 @@ u32 au1xxx_ddma_add_device(dbdev_tab_t *dev)
+ }
+ EXPORT_SYMBOL(au1xxx_ddma_add_device);
+ 
++void au1xxx_ddma_del_device(u32 devid)
++{
++	dbdev_tab_t *p = find_dbdev_id(devid);
++
++	if (p != NULL) {
++		memset(p, 0, sizeof(dbdev_tab_t));
++		p->dev_id = ~0;
++	}
++}
++EXPORT_SYMBOL(au1xxx_ddma_del_device);
++
+ /* Allocate a channel and return a non-zero descriptor if successful. */
+ u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
+        void (*callback)(int, void *), void *callparam)
+diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile
+index cc02440..65e46a6 100644
+--- a/arch/mips/kernel/Makefile
++++ b/arch/mips/kernel/Makefile
+@@ -30,7 +30,6 @@ obj-$(CONFIG_CPU_LOONGSON2)	+= r4k_fpu.o r4k_switch.o
+ obj-$(CONFIG_CPU_MIPS32)	+= r4k_fpu.o r4k_switch.o
+ obj-$(CONFIG_CPU_MIPS64)	+= r4k_fpu.o r4k_switch.o
+ obj-$(CONFIG_CPU_R3000)		+= r2300_fpu.o r2300_switch.o
+-obj-$(CONFIG_CPU_R4000)		+= r4k_fpu.o r4k_switch.o
+ obj-$(CONFIG_CPU_R4300)		+= r4k_fpu.o r4k_switch.o
+ obj-$(CONFIG_CPU_R4X00)		+= r4k_fpu.o r4k_switch.o
+ obj-$(CONFIG_CPU_R5000)		+= r4k_fpu.o r4k_switch.o
+diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
+index cb8b0e2..f9165d1 100644
+--- a/arch/mips/kernel/traps.c
++++ b/arch/mips/kernel/traps.c
+@@ -88,15 +88,17 @@ static void show_raw_backtrace(unsigned long reg29)
+ #ifdef CONFIG_KALLSYMS
+ 	printk("\n");
+ #endif
+-#define IS_KVA01(a) ((((unsigned int)a) & 0xc0000000) == 0x80000000)
+-	if (IS_KVA01(sp)) {
+-		while (!kstack_end(sp)) {
+-			addr = *sp++;
+-			if (__kernel_text_address(addr))
+-				print_ip_sym(addr);
++	while (!kstack_end(sp)) {
++		unsigned long __user *p =
++			(unsigned long __user *)(unsigned long)sp++;
++		if (__get_user(addr, p)) {
++			printk(" (Bad stack address)");
++			break;
+ 		}
+-		printk("\n");
++		if (__kernel_text_address(addr))
++			print_ip_sym(addr);
+ 	}
++	printk("\n");
+ }
+ 
+ #ifdef CONFIG_KALLSYMS
+diff --git a/arch/mips/mips-boards/generic/time.c b/arch/mips/mips-boards/generic/time.c
+index 008fd82..fe2cac1 100644
+--- a/arch/mips/mips-boards/generic/time.c
++++ b/arch/mips/mips-boards/generic/time.c
+@@ -58,27 +58,8 @@ static int mips_cpu_timer_irq;
+ static int mips_cpu_perf_irq;
+ extern int cp0_perfcount_irq;
+ 
+-DEFINE_PER_CPU(unsigned int, tickcount);
+-#define tickcount_this_cpu __get_cpu_var(tickcount)
+-static unsigned long ledbitmask;
+-
+ static void mips_timer_dispatch(void)
+ {
+-#if defined(CONFIG_MIPS_MALTA) || defined(CONFIG_MIPS_ATLAS)
+-	/*
+-	 * Yes, this is very tacky, won't work as expected with SMTC and
+-	 * dyntick will break it,
+-	 * but it gives me a nice warm feeling during debug
+-	 */
+-#define LEDBAR 0xbf000408
+-	if (tickcount_this_cpu++ >= HZ) {
+-		tickcount_this_cpu = 0;
+-		change_bit(smp_processor_id(), &ledbitmask);
+-		smp_wmb(); /* Make sure every one else sees the change */
+-		/* This will pick up any recent changes made by other CPU's */
+-		*(unsigned int *)LEDBAR = ledbitmask;
+-	}
+-#endif
+ 	do_IRQ(mips_cpu_timer_irq);
+ }
+ 
+diff --git a/arch/mips/mm/page.c b/arch/mips/mm/page.c
+index d827d61..cab81f4 100644
+--- a/arch/mips/mm/page.c
++++ b/arch/mips/mm/page.c
+@@ -310,8 +310,8 @@ void __cpuinit build_clear_page(void)
+ 	if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x())
+ 		uasm_i_lui(&buf, AT, 0xa000);
+ 
+-	off = min(8, pref_bias_clear_store / cache_line_size) *
+-	      cache_line_size;
++	off = cache_line_size ? min(8, pref_bias_clear_store / cache_line_size)
++	                        * cache_line_size : 0;
+ 	while (off) {
+ 		build_clear_pref(&buf, -off);
+ 		off -= cache_line_size;
+@@ -454,12 +454,14 @@ void __cpuinit build_copy_page(void)
+ 	if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x())
+ 		uasm_i_lui(&buf, AT, 0xa000);
+ 
+-	off = min(8, pref_bias_copy_load / cache_line_size) * cache_line_size;
++	off = cache_line_size ? min(8, pref_bias_copy_load / cache_line_size) *
++	                        cache_line_size : 0;
+ 	while (off) {
+ 		build_copy_load_pref(&buf, -off);
+ 		off -= cache_line_size;
+ 	}
+-	off = min(8, pref_bias_copy_store / cache_line_size) * cache_line_size;
++	off = cache_line_size ? min(8, pref_bias_copy_load / cache_line_size) *
++	                        cache_line_size : 0;
+ 	while (off) {
+ 		build_copy_store_pref(&buf, -off);
+ 		off -= cache_line_size;
+diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
+index 382738c..76da73a 100644
+--- a/arch/mips/mm/tlbex.c
++++ b/arch/mips/mm/tlbex.c
+@@ -224,8 +224,9 @@ static u32 final_handler[64] __cpuinitdata;
+ static void __cpuinit __maybe_unused build_tlb_probe_entry(u32 **p)
+ {
+ 	switch (current_cpu_type()) {
+-	/* Found by experiment: R4600 v2.0 needs this, too.  */
++	/* Found by experiment: R4600 v2.0/R4700 needs this, too.  */
+ 	case CPU_R4600:
++	case CPU_R4700:
+ 	case CPU_R5000:
+ 	case CPU_R5000A:
+ 	case CPU_NEVADA:
+diff --git a/arch/mips/pci/ops-bridge.c b/arch/mips/pci/ops-bridge.c
+index 1fa0992..b46b3e2 100644
+--- a/arch/mips/pci/ops-bridge.c
++++ b/arch/mips/pci/ops-bridge.c
+@@ -14,6 +14,22 @@
+ #include <asm/sn/sn0/hub.h>
+ 
+ /*
++ * Most of the IOC3 PCI config register aren't present
++ * we emulate what is needed for a normal PCI enumeration
++ */
++static u32 emulate_ioc3_cfg(int where, int size)
++{
++	if (size == 1 && where == 0x3d)
++		return 0x01;
++	else if (size == 2 && where == 0x3c)
++		return 0x0100;
++	else if (size == 4 && where == 0x3c)
++		return 0x00000100;
++
++	return 0;
++}
++
++/*
+  * The Bridge ASIC supports both type 0 and type 1 access.  Type 1 is
+  * not really documented, so right now I can't write code which uses it.
+  * Therefore we use type 0 accesses for now even though they won't work
+@@ -64,7 +80,7 @@ oh_my_gawd:
+ 	 * generic PCI code a chance to look at the wrong register.
+ 	 */
+ 	if ((where >= 0x14 && where < 0x40) || (where >= 0x48)) {
+-		*value = 0;
++		*value = emulate_ioc3_cfg(where, size);
+ 		return PCIBIOS_SUCCESSFUL;
+ 	}
+ 
+@@ -127,7 +143,7 @@ oh_my_gawd:
+ 	 * generic PCI code a chance to look at the wrong register.
+ 	 */
+ 	if ((where >= 0x14 && where < 0x40) || (where >= 0x48)) {
+-		*value = 0;
++		*value = emulate_ioc3_cfg(where, size);
+ 		return PCIBIOS_SUCCESSFUL;
+ 	}
+ 
+diff --git a/arch/mips/pci/pci-ip27.c b/arch/mips/pci/pci-ip27.c
+index bb64828..a185169 100644
+--- a/arch/mips/pci/pci-ip27.c
++++ b/arch/mips/pci/pci-ip27.c
+@@ -47,6 +47,9 @@ int __cpuinit bridge_probe(nasid_t nasid, int widget_id, int masterwid)
+ 	static int num_bridges = 0;
+ 	bridge_t *bridge;
+ 	int slot;
++	extern int pci_probe_only;
++
++	pci_probe_only = 1;
+ 
+ 	printk("a bridge\n");
+ 
+@@ -100,6 +103,11 @@ int __cpuinit bridge_probe(nasid_t nasid, int widget_id, int masterwid)
+ 	 */
+ 	bridge->b_wid_control |= BRIDGE_CTRL_IO_SWAP |
+ 	                         BRIDGE_CTRL_MEM_SWAP;
++#ifdef CONFIG_PAGE_SIZE_4KB
++	bridge->b_wid_control &= ~BRIDGE_CTRL_PAGE_SIZE;
++#else /* 16kB or larger */
++	bridge->b_wid_control |= BRIDGE_CTRL_PAGE_SIZE;
++#endif
+ 
+ 	/*
+ 	 * Hmm...  IRIX sets additional bits in the address which
+diff --git a/arch/mips/sgi-ip27/ip27-init.c b/arch/mips/sgi-ip27/ip27-init.c
+index 7093e7c..4a500e8 100644
+--- a/arch/mips/sgi-ip27/ip27-init.c
++++ b/arch/mips/sgi-ip27/ip27-init.c
+@@ -161,27 +161,6 @@ cnodeid_t get_compact_nodeid(void)
+ 	return NASID_TO_COMPACT_NODEID(get_nasid());
+ }
+ 
+-/* Extracted from the IOC3 meta driver.  FIXME.  */
+-static inline void ioc3_sio_init(void)
+-{
+-	struct ioc3 *ioc3;
+-	nasid_t nid;
+-	long loops;
+-
+-	nid = get_nasid();
+-	ioc3 = (struct ioc3 *) KL_CONFIG_CH_CONS_INFO(nid)->memory_base;
+-
+-	ioc3->sscr_a = 0;			/* PIO mode for uarta.  */
+-	ioc3->sscr_b = 0;			/* PIO mode for uartb.  */
+-	ioc3->sio_iec = ~0;
+-	ioc3->sio_ies = (SIO_IR_SA_INT | SIO_IR_SB_INT);
+-
+-	loops=1000000; while(loops--);
+-	ioc3->sregs.uarta.iu_fcr = 0;
+-	ioc3->sregs.uartb.iu_fcr = 0;
+-	loops=1000000; while(loops--);
+-}
+-
+ static inline void ioc3_eth_init(void)
+ {
+ 	struct ioc3 *ioc3;
+@@ -234,7 +213,6 @@ void __init plat_mem_setup(void)
+ 		panic("Kernel compiled for N mode.");
+ #endif
+ 
+-	ioc3_sio_init();
+ 	ioc3_eth_init();
+ 	per_cpu_init();
+ 
+diff --git a/arch/mips/sgi-ip27/ip27-memory.c b/arch/mips/sgi-ip27/ip27-memory.c
+index bf438d0..42cd109 100644
+--- a/arch/mips/sgi-ip27/ip27-memory.c
++++ b/arch/mips/sgi-ip27/ip27-memory.c
+@@ -33,10 +33,6 @@
+ #define SLOT_PFNSHIFT           (SLOT_SHIFT - PAGE_SHIFT)
+ #define PFN_NASIDSHFT           (NASID_SHFT - PAGE_SHIFT)
+ 
+-#define SLOT_IGNORED		0xffff
+-
+-static short __initdata slot_lastfilled_cache[MAX_COMPACT_NODES];
+-static unsigned short __initdata slot_psize_cache[MAX_COMPACT_NODES][MAX_MEM_SLOTS];
+ static struct bootmem_data __initdata plat_node_bdata[MAX_COMPACT_NODES];
+ 
+ struct node_data *__node_data[MAX_COMPACT_NODES];
+@@ -267,51 +263,6 @@ static pfn_t __init slot_getbasepfn(cnodeid_t cnode, int slot)
+ 	return ((pfn_t)nasid << PFN_NASIDSHFT) | (slot << SLOT_PFNSHIFT);
+ }
+ 
+-/*
+- * Return the number of pages of memory provided by the given slot
+- * on the specified node.
+- */
+-static pfn_t __init slot_getsize(cnodeid_t node, int slot)
+-{
+-	return (pfn_t) slot_psize_cache[node][slot];
+-}
+-
+-/*
+- * Return highest slot filled
+- */
+-static int __init node_getlastslot(cnodeid_t node)
+-{
+-	return (int) slot_lastfilled_cache[node];
+-}
+-
+-/*
+- * Return the pfn of the last free page of memory on a node.
+- */
+-static pfn_t __init node_getmaxclick(cnodeid_t node)
+-{
+-	pfn_t	slot_psize;
+-	int	slot;
+-
+-	/*
+-	 * Start at the top slot. When we find a slot with memory in it,
+-	 * that's the winner.
+-	 */
+-	for (slot = (MAX_MEM_SLOTS - 1); slot >= 0; slot--) {
+-		if ((slot_psize = slot_getsize(node, slot))) {
+-			if (slot_psize == SLOT_IGNORED)
+-				continue;
+-			/* Return the basepfn + the slot size, minus 1. */
+-			return slot_getbasepfn(node, slot) + slot_psize - 1;
+-		}
+-	}
+-
+-	/*
+-	 * If there's no memory on the node, return 0. This is likely
+-	 * to cause problems.
+-	 */
+-	return 0;
+-}
+-
+ static pfn_t __init slot_psize_compute(cnodeid_t node, int slot)
+ {
+ 	nasid_t nasid;
+@@ -404,13 +355,13 @@ static void __init mlreset(void)
+ static void __init szmem(void)
+ {
+ 	pfn_t slot_psize, slot0sz = 0, nodebytes;	/* Hack to detect problem configs */
+-	int slot, ignore;
++	int slot;
+ 	cnodeid_t node;
+ 
+ 	num_physpages = 0;
+ 
+ 	for_each_online_node(node) {
+-		ignore = nodebytes = 0;
++		nodebytes = 0;
+ 		for (slot = 0; slot < MAX_MEM_SLOTS; slot++) {
+ 			slot_psize = slot_psize_compute(node, slot);
+ 			if (slot == 0)
+@@ -420,21 +371,20 @@ static void __init szmem(void)
+ 			 * kernel text.
+ 			 */
+ 			nodebytes += (1LL << SLOT_SHIFT);
++
++			if (!slot_psize)
++				continue;
++
+ 			if ((nodebytes >> PAGE_SHIFT) * (sizeof(struct page)) >
+-						(slot0sz << PAGE_SHIFT))
+-				ignore = 1;
+-			if (ignore && slot_psize) {
++						(slot0sz << PAGE_SHIFT)) {
+ 				printk("Ignoring slot %d onwards on node %d\n",
+ 								slot, node);
+-				slot_psize_cache[node][slot] = SLOT_IGNORED;
+ 				slot = MAX_MEM_SLOTS;
+ 				continue;
+ 			}
+ 			num_physpages += slot_psize;
+-			slot_psize_cache[node][slot] =
+-					(unsigned short) slot_psize;
+-			if (slot_psize)
+-				slot_lastfilled_cache[node] = slot;
++			add_active_range(node, slot_getbasepfn(node, slot),
++					 slot_getbasepfn(node, slot) + slot_psize);
+ 		}
+ 	}
+ }
+@@ -442,18 +392,20 @@ static void __init szmem(void)
+ static void __init node_mem_init(cnodeid_t node)
+ {
+ 	pfn_t slot_firstpfn = slot_getbasepfn(node, 0);
+-	pfn_t slot_lastpfn = slot_firstpfn + slot_getsize(node, 0);
+ 	pfn_t slot_freepfn = node_getfirstfree(node);
+-	struct pglist_data *pd;
+ 	unsigned long bootmap_size;
++	pfn_t start_pfn, end_pfn;
++
++	get_pfn_range_for_nid(node, &start_pfn, &end_pfn);
+ 
+ 	/*
+ 	 * Allocate the node data structures on the node first.
+ 	 */
+ 	__node_data[node] = __va(slot_freepfn << PAGE_SHIFT);
+ 
+-	pd = NODE_DATA(node);
+-	pd->bdata = &plat_node_bdata[node];
++	NODE_DATA(node)->bdata = &plat_node_bdata[node];
++	NODE_DATA(node)->node_start_pfn = start_pfn;
++	NODE_DATA(node)->node_spanned_pages = end_pfn - start_pfn;
+ 
+ 	cpus_clear(hub_data(node)->h_cpus);
+ 
+@@ -461,12 +413,12 @@ static void __init node_mem_init(cnodeid_t node)
+ 			       sizeof(struct hub_data));
+ 
+   	bootmap_size = init_bootmem_node(NODE_DATA(node), slot_freepfn,
+-					slot_firstpfn, slot_lastpfn);
+-	free_bootmem_node(NODE_DATA(node), slot_firstpfn << PAGE_SHIFT,
+-			(slot_lastpfn - slot_firstpfn) << PAGE_SHIFT);
++					start_pfn, end_pfn);
++	free_bootmem_with_active_regions(node, end_pfn);
+ 	reserve_bootmem_node(NODE_DATA(node), slot_firstpfn << PAGE_SHIFT,
+ 		((slot_freepfn - slot_firstpfn) << PAGE_SHIFT) + bootmap_size,
+ 		BOOTMEM_DEFAULT);
++	sparse_memory_present_with_active_regions(node);
+ }
+ 
+ /*
+@@ -515,16 +467,15 @@ void __init paging_init(void)
+ 	pagetable_init();
+ 
+ 	for_each_online_node(node) {
+-		pfn_t start_pfn = slot_getbasepfn(node, 0);
+-		pfn_t end_pfn = node_getmaxclick(node) + 1;
++		pfn_t start_pfn, end_pfn;
+ 
+-		zones_size[ZONE_NORMAL] = end_pfn - start_pfn;
+-		free_area_init_node(node, NODE_DATA(node),
+-				zones_size, start_pfn, NULL);
++		get_pfn_range_for_nid(node, &start_pfn, &end_pfn);
+ 
+ 		if (end_pfn > max_low_pfn)
+ 			max_low_pfn = end_pfn;
+ 	}
++	zones_size[ZONE_NORMAL] = max_low_pfn;
++	free_area_init_nodes(zones_size);
+ }
+ 
+ void __init mem_init(void)
+@@ -535,34 +486,10 @@ void __init mem_init(void)
+ 	high_memory = (void *) __va(num_physpages << PAGE_SHIFT);
+ 
+ 	for_each_online_node(node) {
+-		unsigned slot, numslots;
+-		struct page *end, *p;
+-
+ 		/*
+ 		 * This will free up the bootmem, ie, slot 0 memory.
+ 		 */
+ 		totalram_pages += free_all_bootmem_node(NODE_DATA(node));
+-
+-		/*
+-		 * We need to manually do the other slots.
+-		 */
+-		numslots = node_getlastslot(node);
+-		for (slot = 1; slot <= numslots; slot++) {
+-			p = nid_page_nr(node, slot_getbasepfn(node, slot) -
+-					      slot_getbasepfn(node, 0));
+-
+-			/*
+-			 * Free valid memory in current slot.
+-			 */
+-			for (end = p + slot_getsize(node, slot); p < end; p++) {
+-				/* if (!page_is_ram(pgnr)) continue; */
+-				/* commented out until page_is_ram works */
+-				ClearPageReserved(p);
+-				init_page_count(p);
+-				__free_page(p);
+-				totalram_pages++;
+-			}
+-		}
+ 	}
+ 
+ 	totalram_pages -= setup_zero_pages();	/* This comes from node 0 */
+diff --git a/arch/mips/sgi-ip27/ip27-smp.c b/arch/mips/sgi-ip27/ip27-smp.c
+index f15fc93..ba5cdeb 100644
+--- a/arch/mips/sgi-ip27/ip27-smp.c
++++ b/arch/mips/sgi-ip27/ip27-smp.c
+@@ -176,11 +176,14 @@ static void ip27_send_ipi_mask(cpumask_t mask, unsigned int action)
+ static void __cpuinit ip27_init_secondary(void)
+ {
+ 	per_cpu_init();
+-	local_irq_enable();
+ }
+ 
+ static void __cpuinit ip27_smp_finish(void)
+ {
++	extern void hub_rt_clock_event_init(void);
++
++	hub_rt_clock_event_init();
++	local_irq_enable();
+ }
+ 
+ static void __init ip27_cpus_done(void)
+diff --git a/arch/mips/sgi-ip27/ip27-timer.c b/arch/mips/sgi-ip27/ip27-timer.c
+index 9cebc9e..8b4e854 100644
+--- a/arch/mips/sgi-ip27/ip27-timer.c
++++ b/arch/mips/sgi-ip27/ip27-timer.c
+@@ -160,10 +160,13 @@ static void rt_set_mode(enum clock_event_mode mode,
+ 
+ int rt_timer_irq;
+ 
++static DEFINE_PER_CPU(struct clock_event_device, hub_rt_clockevent);
++static DEFINE_PER_CPU(char [11], hub_rt_name);
++
+ static irqreturn_t hub_rt_counter_handler(int irq, void *dev_id)
+ {
+-	struct clock_event_device *cd = dev_id;
+ 	unsigned int cpu = smp_processor_id();
++	struct clock_event_device *cd = &per_cpu(hub_rt_clockevent, cpu);
+ 	int slice = cputoslice(cpu);
+ 
+ 	/*
+@@ -192,10 +195,7 @@ struct irqaction hub_rt_irqaction = {
+ #define NSEC_PER_CYCLE		800
+ #define CYCLES_PER_SEC		(NSEC_PER_SEC / NSEC_PER_CYCLE)
+ 
+-static DEFINE_PER_CPU(struct clock_event_device, hub_rt_clockevent);
+-static DEFINE_PER_CPU(char [11], hub_rt_name);
+-
+-static void __cpuinit hub_rt_clock_event_init(void)
++void __cpuinit hub_rt_clock_event_init(void)
+ {
+ 	unsigned int cpu = smp_processor_id();
+ 	struct clock_event_device *cd = &per_cpu(hub_rt_clockevent, cpu);
+@@ -203,17 +203,16 @@ static void __cpuinit hub_rt_clock_event_init(void)
+ 	int irq = rt_timer_irq;
+ 
+ 	sprintf(name, "hub-rt %d", cpu);
+-	cd->name		= "HUB-RT",
+-	cd->features		= CLOCK_EVT_FEAT_ONESHOT,
++	cd->name		= name;
++	cd->features		= CLOCK_EVT_FEAT_ONESHOT;
+ 	clockevent_set_clock(cd, CYCLES_PER_SEC);
+ 	cd->max_delta_ns        = clockevent_delta2ns(0xfffffffffffff, cd);
+ 	cd->min_delta_ns        = clockevent_delta2ns(0x300, cd);
+-	cd->rating		= 200,
+-	cd->irq			= irq,
+-	cd->cpumask		= cpumask_of_cpu(cpu),
+-	cd->rating		= 300,
+-	cd->set_next_event	= rt_next_event,
+-	cd->set_mode		= rt_set_mode,
++	cd->rating		= 200;
++	cd->irq			= irq;
++	cd->cpumask		= cpumask_of_cpu(cpu);
++	cd->set_next_event	= rt_next_event;
++	cd->set_mode		= rt_set_mode;
+ 	clockevents_register_device(cd);
+ }
+ 
+@@ -261,6 +260,7 @@ void __init plat_time_init(void)
+ {
+ 	hub_rt_clocksource_init();
+ 	hub_rt_clock_event_global_init();
++	hub_rt_clock_event_init();
+ }
+ 
+ void __cpuinit cpu_time_init(void)
+@@ -281,7 +281,6 @@ void __cpuinit cpu_time_init(void)
+ 
+ 	printk("CPU %d clock is %dMHz.\n", smp_processor_id(), cpu->cpu_speed);
+ 
+-	hub_rt_clock_event_init();
+ 	set_c0_status(SRB_TIMOCLK);
+ }
+ 
+diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c
+index 3a7054e..019657c 100644
+--- a/arch/powerpc/sysdev/fsl_soc.c
++++ b/arch/powerpc/sysdev/fsl_soc.c
+@@ -432,7 +432,7 @@ static struct i2c_driver_device i2c_devices[] __initdata = {
+ 	{"dallas,ds1339",  "ds1339"},
+ 	{"dallas,ds1340",  "ds1340"},
+ 	{"stm,m41t00",     "m41t00"},
+-	{"dallas,ds1374",  "rtc-ds1374"},
++	{"dallas,ds1374",  "ds1374"},
+ };
+ 
+ static int __init of_find_i2c_driver(struct device_node *node,
+diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
+index 44ad160..b58fb89 100644
+--- a/arch/um/drivers/ubd_kern.c
++++ b/arch/um/drivers/ubd_kern.c
+@@ -49,7 +49,6 @@
+ #include "irq_user.h"
+ #include "irq_kern.h"
+ #include "ubd_user.h"
+-#include "kern_util.h"
+ #include "os.h"
+ #include "mem.h"
+ #include "mem_kern.h"
+diff --git a/arch/um/include/os.h b/arch/um/include/os.h
+index e2716ac..db5be46 100644
+--- a/arch/um/include/os.h
++++ b/arch/um/include/os.h
+@@ -299,6 +299,6 @@ extern int os_arch_prctl(int pid, int code, unsigned long *addr);
+ extern int get_pty(void);
+ 
+ /* sys-$ARCH/task_size.c */
+-extern unsigned long os_get_task_size(void);
++extern unsigned long os_get_top_address(void);
+ 
+ #endif
+diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c
+index 9db85b2..8d84250 100644
+--- a/arch/um/kernel/um_arch.c
++++ b/arch/um/kernel/um_arch.c
+@@ -274,7 +274,7 @@ int __init linux_main(int argc, char **argv)
+ 	if (have_root == 0)
+ 		add_arg(DEFAULT_COMMAND_LINE);
+ 
+-	host_task_size = os_get_task_size();
++	host_task_size = os_get_top_address();
+ 	/*
+ 	 * TASK_SIZE needs to be PGDIR_SIZE aligned or else exit_mmap craps
+ 	 * out
+diff --git a/arch/um/os-Linux/helper.c b/arch/um/os-Linux/helper.c
+index 74ca7aa..30860b8 100644
+--- a/arch/um/os-Linux/helper.c
++++ b/arch/um/os-Linux/helper.c
+@@ -7,6 +7,7 @@
+ #include <unistd.h>
+ #include <errno.h>
+ #include <sched.h>
++#include <linux/limits.h>
+ #include <sys/socket.h>
+ #include <sys/wait.h>
+ #include "kern_constants.h"
+diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
+index 6be028c..172ad8f 100644
+--- a/arch/um/os-Linux/skas/process.c
++++ b/arch/um/os-Linux/skas/process.c
+@@ -55,7 +55,7 @@ static int ptrace_dump_regs(int pid)
+  * Signals that are OK to receive in the stub - we'll just continue it.
+  * SIGWINCH will happen when UML is inside a detached screen.
+  */
+-#define STUB_SIG_MASK (1 << SIGVTALRM)
++#define STUB_SIG_MASK ((1 << SIGVTALRM) | (1 << SIGWINCH))
+ 
+ /* Signals that the stub will finish with - anything else is an error */
+ #define STUB_DONE_MASK (1 << SIGTRAP)
+diff --git a/arch/um/os-Linux/sys-i386/task_size.c b/arch/um/os-Linux/sys-i386/task_size.c
+index ccb49b0..be04c1e 100644
+--- a/arch/um/os-Linux/sys-i386/task_size.c
++++ b/arch/um/os-Linux/sys-i386/task_size.c
+@@ -63,7 +63,7 @@ static int page_ok(unsigned long page)
+ 	return ok;
+ }
+ 
+-unsigned long os_get_task_size(void)
++unsigned long os_get_top_address(void)
+ {
+ 	struct sigaction sa, old;
+ 	unsigned long bottom = 0;
+@@ -76,9 +76,9 @@ unsigned long os_get_task_size(void)
+ 	 * hosts, but shouldn't hurt otherwise.
+ 	 */
+ 	unsigned long top = 0xffffd000 >> UM_KERN_PAGE_SHIFT;
+-	unsigned long test;
++	unsigned long test, original;
+ 
+-	printf("Locating the top of the address space ... ");
++	printf("Locating the bottom of the address space ... ");
+ 	fflush(stdout);
+ 
+ 	/*
+@@ -89,16 +89,31 @@ unsigned long os_get_task_size(void)
+ 	sigemptyset(&sa.sa_mask);
+ 	sa.sa_flags = SA_NODEFER;
+ 	if (sigaction(SIGSEGV, &sa, &old)) {
+-		perror("os_get_task_size");
++		perror("os_get_top_address");
+ 		exit(1);
+ 	}
+ 
+-	if (!page_ok(bottom)) {
+-		fprintf(stderr, "Address 0x%x no good?\n",
+-			bottom << UM_KERN_PAGE_SHIFT);
++	/* Manually scan the address space, bottom-up, until we find
++	 * the first valid page (or run out of them).
++	 */
++	for (bottom = 0; bottom < top; bottom++) {
++		if (page_ok(bottom))
++			break;
++	}
++
++	/* If we've got this far, we ran out of pages. */
++	if (bottom == top) {
++		fprintf(stderr, "Unable to determine bottom of address "
++			"space.\n");
+ 		exit(1);
+ 	}
+ 
++	printf("0x%x\n", bottom << UM_KERN_PAGE_SHIFT);
++	printf("Locating the top of the address space ... ");
++	fflush(stdout);
++
++	original = bottom;
++
+ 	/* This could happen with a 4G/4G split */
+ 	if (page_ok(top))
+ 		goto out;
+@@ -114,7 +129,7 @@ unsigned long os_get_task_size(void)
+ out:
+ 	/* Restore the old SIGSEGV handling */
+ 	if (sigaction(SIGSEGV, &old, NULL)) {
+-		perror("os_get_task_size");
++		perror("os_get_top_address");
+ 		exit(1);
+ 	}
+ 	top <<= UM_KERN_PAGE_SHIFT;
+diff --git a/arch/um/os-Linux/sys-x86_64/task_size.c b/arch/um/os-Linux/sys-x86_64/task_size.c
+index fad6f57..26a0dd1 100644
+--- a/arch/um/os-Linux/sys-x86_64/task_size.c
++++ b/arch/um/os-Linux/sys-x86_64/task_size.c
+@@ -1,4 +1,4 @@
+-unsigned long os_get_task_size(unsigned long shift)
++unsigned long os_get_top_address(unsigned long shift)
+ {
+ 	/* The old value of CONFIG_TOP_ADDR */
+ 	return 0x7fc0000000;
+diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c
+index bee98f4..dec5678 100644
+--- a/arch/um/os-Linux/time.c
++++ b/arch/um/os-Linux/time.c
+@@ -106,6 +106,10 @@ static void deliver_alarm(void)
+ 	unsigned long long this_tick = os_nsecs();
+ 	int one_tick = UM_NSEC_PER_SEC / UM_HZ;
+ 
++	/* Protection against the host's time going backwards */
++	if ((last_tick != 0) && (this_tick < last_tick))
++		this_tick = last_tick;
++
+ 	if (last_tick == 0)
+ 		last_tick = this_tick - one_tick;
+ 
+@@ -148,6 +152,9 @@ static int after_sleep_interval(struct timespec *ts)
+ 		start_usecs = usec;
+ 
+ 	start_usecs -= skew / UM_NSEC_PER_USEC;
++	if (start_usecs < 0)
++		start_usecs = 0;
++
+ 	tv = ((struct timeval) { .tv_sec  = start_usecs / UM_USEC_PER_SEC,
+ 				 .tv_usec = start_usecs % UM_USEC_PER_SEC });
+ 	interval = ((struct itimerval) { { 0, usec }, tv });
+diff --git a/arch/um/sys-x86_64/ksyms.c b/arch/um/sys-x86_64/ksyms.c
+index 6604673..1db2fce 100644
+--- a/arch/um/sys-x86_64/ksyms.c
++++ b/arch/um/sys-x86_64/ksyms.c
+@@ -3,5 +3,9 @@
+ #include <asm/checksum.h>
+ 
+ /*XXX: we need them because they would be exported by x86_64 */
++#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4
++EXPORT_SYMBOL(memcpy);
++#else
+ EXPORT_SYMBOL(__memcpy);
++#endif
+ EXPORT_SYMBOL(csum_partial);
+diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
+index dcbec34..52e18e6 100644
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -1508,13 +1508,13 @@ config PCI_GOMMCONFIG
+ config PCI_GODIRECT
+ 	bool "Direct"
+ 
+-config PCI_GOANY
+-	bool "Any"
+-
+ config PCI_GOOLPC
+ 	bool "OLPC"
+ 	depends on OLPC
+ 
++config PCI_GOANY
++	bool "Any"
++
+ endchoice
+ 
+ config PCI_BIOS
+@@ -1531,9 +1531,8 @@ config PCI_MMCONFIG
+ 	depends on X86_32 && PCI && ACPI && (PCI_GOMMCONFIG || PCI_GOANY)
+ 
+ config PCI_OLPC
+-	bool
+-	depends on PCI && PCI_GOOLPC
+-	default y
++	def_bool y
++	depends on PCI && OLPC && (PCI_GOOLPC || PCI_GOANY)
+ 
+ config PCI_DOMAINS
+ 	def_bool y
+diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
+index ac1e31b..1836337 100644
+--- a/arch/x86/Kconfig.debug
++++ b/arch/x86/Kconfig.debug
+@@ -6,15 +6,19 @@ config TRACE_IRQFLAGS_SUPPORT
+ source "lib/Kconfig.debug"
+ 
+ config NONPROMISC_DEVMEM
+-	bool "Disable promiscuous /dev/mem"
++	bool "Filter access to /dev/mem"
+ 	help
+-	  The /dev/mem file by default only allows userspace access to PCI
+-	  space and the BIOS code and data regions. This is sufficient for
+-	  dosemu and X and all common users of /dev/mem. With this config
+-	  option, you allow userspace access to all of memory, including
+-	  kernel and userspace memory. Accidental access to this is
+-	  obviously disasterous, but specific access can be used by people
+-	  debugging the kernel.
++	  If this option is left off, you allow userspace access to all
++	  of memory, including kernel and userspace memory. Accidental
++	  access to this is obviously disastrous, but specific access can
++	  be used by people debugging the kernel.
++
++	  If this option is switched on, the /dev/mem file only allows
++	  userspace access to PCI space and the BIOS code and data regions.
++	  This is sufficient for dosemu and X and all common users of
++	  /dev/mem.
++
++	  If in doubt, say Y.
+ 
+ config EARLY_PRINTK
+ 	bool "Early printk" if EMBEDDED
+diff --git a/arch/x86/pci/init.c b/arch/x86/pci/init.c
+index e70b9c5..b821f44 100644
+--- a/arch/x86/pci/init.c
++++ b/arch/x86/pci/init.c
+@@ -15,7 +15,8 @@ static __init int pci_access_init(void)
+ 	pci_mmcfg_early_init();
+ 
+ #ifdef CONFIG_PCI_OLPC
+-	pci_olpc_init();
++	if (!pci_olpc_init())
++		return 0;	/* skip additional checks if it's an XO */
+ #endif
+ #ifdef CONFIG_PCI_BIOS
+ 	pci_pcbios_init();
+diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
+index 0908fca..ca8df9c 100644
+--- a/arch/x86/pci/irq.c
++++ b/arch/x86/pci/irq.c
+@@ -621,6 +621,13 @@ static __init int via_router_probe(struct irq_router *r,
+ 			 */
+ 			device = PCI_DEVICE_ID_VIA_8235;
+ 			break;
++		case PCI_DEVICE_ID_VIA_8237:
++			/**
++			 * Asus a7v600 bios wrongly reports 8237
++			 * as 586-compatible
++			 */
++			device = PCI_DEVICE_ID_VIA_8237;
++			break;
+ 		}
+ 	}
+ 
+diff --git a/arch/x86/pci/olpc.c b/arch/x86/pci/olpc.c
+index 5e76365..e11e9e8 100644
+--- a/arch/x86/pci/olpc.c
++++ b/arch/x86/pci/olpc.c
+@@ -302,12 +302,13 @@ static struct pci_raw_ops pci_olpc_conf = {
+ 	.write = pci_olpc_write,
+ };
+ 
+-void __init pci_olpc_init(void)
++int __init pci_olpc_init(void)
+ {
+ 	if (!machine_is_olpc() || olpc_has_vsa())
+-		return;
++		return -ENODEV;
+ 
+ 	printk(KERN_INFO "PCI: Using configuration type OLPC\n");
+ 	raw_pci_ops = &pci_olpc_conf;
+ 	is_lx = is_geode_lx();
++	return 0;
+ }
+diff --git a/arch/x86/pci/pci.h b/arch/x86/pci/pci.h
+index f3972b1..720c4c5 100644
+--- a/arch/x86/pci/pci.h
++++ b/arch/x86/pci/pci.h
+@@ -101,7 +101,7 @@ extern struct pci_raw_ops pci_direct_conf1;
+ extern int pci_direct_probe(void);
+ extern void pci_direct_init(int type);
+ extern void pci_pcbios_init(void);
+-extern void pci_olpc_init(void);
++extern int pci_olpc_init(void);
+ 
+ /* pci-mmconfig.c */
+ 
+diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
+index 90d20c6..215d186 100644
+--- a/drivers/ata/libata-sff.c
++++ b/drivers/ata/libata-sff.c
+@@ -278,7 +278,7 @@ static u8 ata_sff_irq_status(struct ata_port *ap)
+ 		    	return status;
+ 	}
+ 	/* Clear INTRQ latch */
+-	status = ata_sff_check_status(ap);
++	status = ap->ops->sff_check_status(ap);
+ 	return status;
+ }
+ 
+diff --git a/drivers/block/brd.c b/drivers/block/brd.c
+index 680cdfc..24b97b0 100644
+--- a/drivers/block/brd.c
++++ b/drivers/block/brd.c
+@@ -397,6 +397,7 @@ module_param(max_part, int, 0);
+ MODULE_PARM_DESC(max_part, "Maximum number of partitions per RAM disk");
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS_BLOCKDEV_MAJOR(RAMDISK_MAJOR);
++MODULE_ALIAS("rd");
+ 
+ #ifndef MODULE
+ /* Legacy boot options - nonmodular */
+diff --git a/drivers/char/pcmcia/ipwireless/hardware.c b/drivers/char/pcmcia/ipwireless/hardware.c
+index fa9d3c9..ba6340a 100644
+--- a/drivers/char/pcmcia/ipwireless/hardware.c
++++ b/drivers/char/pcmcia/ipwireless/hardware.c
+@@ -251,10 +251,11 @@ struct ipw_hardware {
+ 	int init_loops;
+ 	struct timer_list setup_timer;
+ 
++	/* Flag if hw is ready to send next packet */
+ 	int tx_ready;
+-	struct list_head tx_queue[NL_NUM_OF_PRIORITIES];
+-	/* True if any packets are queued for transmission */
++	/* Count of pending packets to be sent */
+ 	int tx_queued;
++	struct list_head tx_queue[NL_NUM_OF_PRIORITIES];
+ 
+ 	int rx_bytes_queued;
+ 	struct list_head rx_queue;
+@@ -404,6 +405,8 @@ static int do_send_fragment(struct ipw_hardware *hw, const unsigned char *data,
+ 
+ 	spin_lock_irqsave(&hw->spinlock, flags);
+ 
++	hw->tx_ready = 0;
++
+ 	if (hw->hw_version == HW_VERSION_1) {
+ 		outw((unsigned short) length, hw->base_port + IODWR);
+ 
+@@ -492,6 +495,7 @@ static int do_send_packet(struct ipw_hardware *hw, struct ipw_tx_packet *packet)
+ 
+ 		spin_lock_irqsave(&hw->spinlock, flags);
+ 		list_add(&packet->queue, &hw->tx_queue[0]);
++		hw->tx_queued++;
+ 		spin_unlock_irqrestore(&hw->spinlock, flags);
+ 	} else {
+ 		if (packet->packet_callback)
+@@ -949,12 +953,10 @@ static int send_pending_packet(struct ipw_hardware *hw, int priority_limit)
+ 	unsigned long flags;
+ 
+ 	spin_lock_irqsave(&hw->spinlock, flags);
+-	if (hw->tx_queued && hw->tx_ready != 0) {
++	if (hw->tx_queued && hw->tx_ready) {
+ 		int priority;
+ 		struct ipw_tx_packet *packet = NULL;
+ 
+-		hw->tx_ready--;
+-
+ 		/* Pick a packet */
+ 		for (priority = 0; priority < priority_limit; priority++) {
+ 			if (!list_empty(&hw->tx_queue[priority])) {
+@@ -963,6 +965,7 @@ static int send_pending_packet(struct ipw_hardware *hw, int priority_limit)
+ 						struct ipw_tx_packet,
+ 						queue);
+ 
++				hw->tx_queued--;
+ 				list_del(&packet->queue);
+ 
+ 				break;
+@@ -973,6 +976,7 @@ static int send_pending_packet(struct ipw_hardware *hw, int priority_limit)
+ 			spin_unlock_irqrestore(&hw->spinlock, flags);
+ 			return 0;
+ 		}
++
+ 		spin_unlock_irqrestore(&hw->spinlock, flags);
+ 
+ 		/* Send */
+@@ -1063,7 +1067,7 @@ static irqreturn_t ipwireless_handle_v1_interrupt(int irq,
+ 		if (irqn & IR_TXINTR) {
+ 			ack |= IR_TXINTR;
+ 			spin_lock_irqsave(&hw->spinlock, flags);
+-			hw->tx_ready++;
++			hw->tx_ready = 1;
+ 			spin_unlock_irqrestore(&hw->spinlock, flags);
+ 		}
+ 		/* Received data */
+@@ -1170,7 +1174,7 @@ static irqreturn_t ipwireless_handle_v2_v3_interrupt(int irq,
+ 	if (memrxdone & MEMRX_RX_DONE) {
+ 		writew(0, &hw->memory_info_regs->memreg_rx_done);
+ 		spin_lock_irqsave(&hw->spinlock, flags);
+-		hw->tx_ready++;
++		hw->tx_ready = 1;
+ 		spin_unlock_irqrestore(&hw->spinlock, flags);
+ 		tx = 1;
+ 	}
+@@ -1234,7 +1238,7 @@ static void send_packet(struct ipw_hardware *hw, int priority,
+ 
+ 	spin_lock_irqsave(&hw->spinlock, flags);
+ 	list_add_tail(&packet->queue, &hw->tx_queue[priority]);
+-	hw->tx_queued = 1;
++	hw->tx_queued++;
+ 	spin_unlock_irqrestore(&hw->spinlock, flags);
+ 
+ 	flush_packets_to_hw(hw);
+diff --git a/drivers/char/vt.c b/drivers/char/vt.c
+index fa1ffbf..935f1c2 100644
+--- a/drivers/char/vt.c
++++ b/drivers/char/vt.c
+@@ -434,7 +434,7 @@ static void update_attr(struct vc_data *vc)
+ 	              vc->vc_blink, vc->vc_underline,
+ 	              vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic);
+ 	vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' ';
+-	vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, false, false) << 8) | ' ';
++	vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, vc->vc_decscnm, false) << 8) | ' ';
+ }
+ 
+ /* Note: inverting the screen twice should revert to the original state */
+@@ -909,7 +909,7 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
+ 
+ 	if (vc->vc_tty) {
+ 		struct winsize ws, *cws = &vc->vc_tty->winsize;
+-		unsigned long flags;
++		struct pid *pgrp = NULL;
+ 
+ 		memset(&ws, 0, sizeof(ws));
+ 		ws.ws_row = vc->vc_rows;
+@@ -917,11 +917,14 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
+ 		ws.ws_ypixel = vc->vc_scan_lines;
+ 
+ 		mutex_lock(&vc->vc_tty->termios_mutex);
+-		spin_lock_irqsave(&vc->vc_tty->ctrl_lock, flags);
+-		if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) &&
+-		    vc->vc_tty->pgrp)
++		spin_lock_irq(&vc->vc_tty->ctrl_lock);
++		if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col))
++			pgrp = get_pid(vc->vc_tty->pgrp);
++		spin_unlock_irq(&vc->vc_tty->ctrl_lock);
++		if (pgrp) {
+ 			kill_pgrp(vc->vc_tty->pgrp, SIGWINCH, 1);
+-		spin_unlock_irqrestore(&vc->vc_tty->ctrl_lock, flags);
++			put_pid(pgrp);
++		}
+ 		*cws = ws;
+ 		mutex_unlock(&vc->vc_tty->termios_mutex);
+ 	}
+diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
+index 86f0a24..4e07d1f 100644
+--- a/drivers/cpufreq/cpufreq.c
++++ b/drivers/cpufreq/cpufreq.c
+@@ -625,7 +625,7 @@ static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy,
+ 	unsigned int freq = 0;
+ 	unsigned int ret;
+ 
+-	if (!policy->governor->store_setspeed)
++	if (!policy->governor || !policy->governor->store_setspeed)
+ 		return -EINVAL;
+ 
+ 	ret = sscanf(buf, "%u", &freq);
+@@ -639,7 +639,7 @@ static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy,
+ 
+ static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf)
+ {
+-	if (!policy->governor->show_setspeed)
++	if (!policy->governor || !policy->governor->show_setspeed)
+ 		return sprintf(buf, "<unsupported>\n");
+ 
+ 	return policy->governor->show_setspeed(policy, buf);
+diff --git a/drivers/firmware/edd.c b/drivers/firmware/edd.c
+index 7440119..9e4f59d 100644
+--- a/drivers/firmware/edd.c
++++ b/drivers/firmware/edd.c
+@@ -753,7 +753,7 @@ edd_init(void)
+ 
+ 	if (!edd_num_devices()) {
+ 		printk(KERN_INFO "EDD information not available.\n");
+-		return 1;
++		return -ENODEV;
+ 	}
+ 
+ 	edd_kset = kset_create_and_add("edd", NULL, firmware_kobj);
+diff --git a/drivers/hwmon/hdaps.c b/drivers/hwmon/hdaps.c
+index 88e8965..26df06f 100644
+--- a/drivers/hwmon/hdaps.c
++++ b/drivers/hwmon/hdaps.c
+@@ -522,6 +522,7 @@ static struct dmi_system_id __initdata hdaps_whitelist[] = {
+ 	HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"),
+ 	HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"),
+ 	HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60"),
++	HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61"),
+ 	HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"),
+ 	HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X41"),
+ 	HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60"),
+diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c
+index bbe0436..f093b00 100644
+--- a/drivers/infiniband/hw/ehca/ehca_reqs.c
++++ b/drivers/infiniband/hw/ehca/ehca_reqs.c
+@@ -421,8 +421,10 @@ int ehca_post_send(struct ib_qp *qp,
+ 	int ret = 0;
+ 	unsigned long flags;
+ 
+-	if (unlikely(my_qp->state != IB_QPS_RTS)) {
+-		ehca_err(qp->device, "QP not in RTS state  qpn=%x", qp->qp_num);
++	/* Reject WR if QP is in RESET, INIT or RTR state */
++	if (unlikely(my_qp->state < IB_QPS_RTS)) {
++		ehca_err(qp->device, "Invalid QP state  qp_state=%d qpn=%x",
++			 my_qp->state, qp->qp_num);
+ 		return -EINVAL;
+ 	}
+ 
+diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h
+index 59a8b25..0bd8bcb 100644
+--- a/drivers/infiniband/hw/ipath/ipath_kernel.h
++++ b/drivers/infiniband/hw/ipath/ipath_kernel.h
+@@ -232,6 +232,11 @@ struct ipath_sdma_desc {
+ #define IPATH_SDMA_TXREQ_S_ABORTED   2
+ #define IPATH_SDMA_TXREQ_S_SHUTDOWN  3
+ 
++#define IPATH_SDMA_STATUS_SCORE_BOARD_DRAIN_IN_PROG	(1ull << 63)
++#define IPATH_SDMA_STATUS_ABORT_IN_PROG			(1ull << 62)
++#define IPATH_SDMA_STATUS_INTERNAL_SDMA_ENABLE		(1ull << 61)
++#define IPATH_SDMA_STATUS_SCB_EMPTY			(1ull << 30)
++
+ /* max dwords in small buffer packet */
+ #define IPATH_SMALLBUF_DWORDS (dd->ipath_piosize2k >> 2)
+ 
+diff --git a/drivers/infiniband/hw/ipath/ipath_mad.c b/drivers/infiniband/hw/ipath/ipath_mad.c
+index 1ff46ae..5f9315d 100644
+--- a/drivers/infiniband/hw/ipath/ipath_mad.c
++++ b/drivers/infiniband/hw/ipath/ipath_mad.c
+@@ -1492,6 +1492,10 @@ static int process_subn(struct ib_device *ibdev, int mad_flags,
+ 			goto bail;
+ 		}
+ 
++	case IB_MGMT_METHOD_TRAP:
++	case IB_MGMT_METHOD_REPORT:
++	case IB_MGMT_METHOD_REPORT_RESP:
++	case IB_MGMT_METHOD_TRAP_REPRESS:
+ 	case IB_MGMT_METHOD_GET_RESP:
+ 		/*
+ 		 * The ib_mad module will call us to process responses
+diff --git a/drivers/infiniband/hw/ipath/ipath_sdma.c b/drivers/infiniband/hw/ipath/ipath_sdma.c
+index 0a8c1b8..eaba032 100644
+--- a/drivers/infiniband/hw/ipath/ipath_sdma.c
++++ b/drivers/infiniband/hw/ipath/ipath_sdma.c
+@@ -263,14 +263,10 @@ static void sdma_abort_task(unsigned long opaque)
+ 		hwstatus = ipath_read_kreg64(dd,
+ 				dd->ipath_kregs->kr_senddmastatus);
+ 
+-		if (/* ScoreBoardDrainInProg */
+-		    test_bit(63, &hwstatus) ||
+-		    /* AbortInProg */
+-		    test_bit(62, &hwstatus) ||
+-		    /* InternalSDmaEnable */
+-		    test_bit(61, &hwstatus) ||
+-		    /* ScbEmpty */
+-		    !test_bit(30, &hwstatus)) {
++		if ((hwstatus & (IPATH_SDMA_STATUS_SCORE_BOARD_DRAIN_IN_PROG |
++				 IPATH_SDMA_STATUS_ABORT_IN_PROG	     |
++				 IPATH_SDMA_STATUS_INTERNAL_SDMA_ENABLE)) ||
++		    !(hwstatus & IPATH_SDMA_STATUS_SCB_EMPTY)) {
+ 			if (dd->ipath_sdma_reset_wait > 0) {
+ 				/* not done shutting down sdma */
+ 				--dd->ipath_sdma_reset_wait;
+diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c
+index e0ec540..7779165 100644
+--- a/drivers/infiniband/hw/ipath/ipath_verbs.c
++++ b/drivers/infiniband/hw/ipath/ipath_verbs.c
+@@ -1494,7 +1494,8 @@ static int ipath_query_device(struct ib_device *ibdev,
+ 
+ 	props->device_cap_flags = IB_DEVICE_BAD_PKEY_CNTR |
+ 		IB_DEVICE_BAD_QKEY_CNTR | IB_DEVICE_SHUTDOWN_PORT |
+-		IB_DEVICE_SYS_IMAGE_GUID;
++		IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_RC_RNR_NAK_GEN |
++		IB_DEVICE_PORT_ACTIVE_EVENT | IB_DEVICE_SRQ_RESIZE;
+ 	props->page_size_cap = PAGE_SIZE;
+ 	props->vendor_id = dev->dd->ipath_vendorid;
+ 	props->vendor_part_id = dev->dd->ipath_deviceid;
+diff --git a/drivers/md/md.c b/drivers/md/md.c
+index 51c19f8..7cf512a 100644
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -276,6 +276,7 @@ static mddev_t * mddev_find(dev_t unit)
+ 	atomic_set(&new->active, 1);
+ 	spin_lock_init(&new->write_lock);
+ 	init_waitqueue_head(&new->sb_wait);
++	init_waitqueue_head(&new->recovery_wait);
+ 	new->reshape_position = MaxSector;
+ 	new->resync_max = MaxSector;
+ 	new->level = LEVEL_NONE;
+@@ -5665,7 +5666,6 @@ void md_do_sync(mddev_t *mddev)
+ 		window/2,(unsigned long long) max_sectors/2);
+ 
+ 	atomic_set(&mddev->recovery_active, 0);
+-	init_waitqueue_head(&mddev->recovery_wait);
+ 	last_check = 0;
+ 
+ 	if (j>2) {
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index 425958a..c37e256 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -2002,6 +2002,7 @@ static int __handle_issuing_new_read_requests5(struct stripe_head *sh,
+ 		 * have quiesced.
+ 		 */
+ 		if ((s->uptodate == disks - 1) &&
++		    (s->failed && disk_idx == s->failed_num) &&
+ 		    !test_bit(STRIPE_OP_CHECK, &sh->ops.pending)) {
+ 			set_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending);
+ 			set_bit(R5_Wantcompute, &dev->flags);
+@@ -2087,7 +2088,9 @@ static void handle_issuing_new_read_requests6(struct stripe_head *sh,
+ 			/* we would like to get this block, possibly
+ 			 * by computing it, but we might not be able to
+ 			 */
+-			if (s->uptodate == disks-1) {
++			if ((s->uptodate == disks - 1) &&
++			    (s->failed && (i == r6s->failed_num[0] ||
++					   i == r6s->failed_num[1]))) {
+ 				pr_debug("Computing stripe %llu block %d\n",
+ 				       (unsigned long long)sh->sector, i);
+ 				compute_block_1(sh, i, 0);
+@@ -2645,6 +2648,7 @@ static void handle_stripe5(struct stripe_head *sh)
+ 	struct r5dev *dev;
+ 	unsigned long pending = 0;
+ 	mdk_rdev_t *blocked_rdev = NULL;
++	int prexor;
+ 
+ 	memset(&s, 0, sizeof(s));
+ 	pr_debug("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d "
+@@ -2774,9 +2778,11 @@ static void handle_stripe5(struct stripe_head *sh)
+ 	/* leave prexor set until postxor is done, allows us to distinguish
+ 	 * a rmw from a rcw during biodrain
+ 	 */
++	prexor = 0;
+ 	if (test_bit(STRIPE_OP_PREXOR, &sh->ops.complete) &&
+ 		test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete)) {
+ 
++		prexor = 1;
+ 		clear_bit(STRIPE_OP_PREXOR, &sh->ops.complete);
+ 		clear_bit(STRIPE_OP_PREXOR, &sh->ops.ack);
+ 		clear_bit(STRIPE_OP_PREXOR, &sh->ops.pending);
+@@ -2810,6 +2816,8 @@ static void handle_stripe5(struct stripe_head *sh)
+ 				if (!test_and_set_bit(
+ 				    STRIPE_OP_IO, &sh->ops.pending))
+ 					sh->ops.count++;
++				if (prexor)
++					continue;
+ 				if (!test_bit(R5_Insync, &dev->flags) ||
+ 				    (i == sh->pd_idx && s.failed == 0))
+ 					set_bit(STRIPE_INSYNC, &sh->state);
+diff --git a/drivers/media/Makefile b/drivers/media/Makefile
+index cc11c4c..09a829d 100644
+--- a/drivers/media/Makefile
++++ b/drivers/media/Makefile
+@@ -2,12 +2,7 @@
+ # Makefile for the kernel multimedia device drivers.
+ #
+ 
+-obj-y := common/
+-
+-obj-$(CONFIG_VIDEO_MEDIA) += common/
+-
+-# Since hybrid devices are here, should be compiled if DVB and/or V4L
+-obj-$(CONFIG_VIDEO_MEDIA) += video/
++obj-y += common/ video/
+ 
+ obj-$(CONFIG_VIDEO_DEV) += radio/
+ obj-$(CONFIG_DVB_CORE)  += dvb/
+diff --git a/drivers/media/common/tuners/Kconfig b/drivers/media/common/tuners/Kconfig
+index d620654..8548296 100644
+--- a/drivers/media/common/tuners/Kconfig
++++ b/drivers/media/common/tuners/Kconfig
+@@ -21,6 +21,7 @@ config MEDIA_TUNER
+ 	tristate
+ 	default VIDEO_MEDIA && I2C
+ 	depends on VIDEO_MEDIA && I2C
++	select FW_LOADER if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG
+ 	select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG
+ 	select MEDIA_TUNER_XC5000 if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG
+ 	select MEDIA_TUNER_MT20XX if !MEDIA_TUNER_CUSTOMIZE
+diff --git a/drivers/media/common/tuners/mxl5005s.c b/drivers/media/common/tuners/mxl5005s.c
+index 5d05b53..0dc2bef 100644
+--- a/drivers/media/common/tuners/mxl5005s.c
++++ b/drivers/media/common/tuners/mxl5005s.c
+@@ -101,7 +101,7 @@ enum {
+ 	MXL_QAM,
+ 	MXL_ANALOG_CABLE,
+ 	MXL_ANALOG_OTA
+-} tuner_modu_type;
++};
+ 
+ /* MXL5005 Tuner Register Struct */
+ struct TunerReg {
+@@ -194,7 +194,7 @@ enum {
+ 	RFSYN_DIVM,                /* 88 */
+ 	DN_BYPASS_AGC_I2C          /* 89 */
+ #endif
+-} MXL5005_ControlName;
++};
+ 
+ /*
+  * The following context is source code provided by MaxLinear.
+diff --git a/drivers/media/common/tuners/tda18271-common.c b/drivers/media/common/tuners/tda18271-common.c
+index 42b5f5d..f1894fe 100644
+--- a/drivers/media/common/tuners/tda18271-common.c
++++ b/drivers/media/common/tuners/tda18271-common.c
+@@ -648,11 +648,11 @@ int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq)
+ 	unsigned char *regs = priv->tda18271_regs;
+ 	u8 val;
+ 
+-	tda18271_lookup_map(fe, RF_CAL, freq, &val);
++	int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val);
+ 
+ 	regs[R_EB14] = val;
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ /*
+diff --git a/drivers/media/common/tuners/tda827x.c b/drivers/media/common/tuners/tda827x.c
+index d30d2c9..8555d9c 100644
+--- a/drivers/media/common/tuners/tda827x.c
++++ b/drivers/media/common/tuners/tda827x.c
+@@ -418,13 +418,13 @@ static void tda827xa_lna_gain(struct dvb_frontend *fe, int high,
+ 	unsigned char buf[] = {0x22, 0x01};
+ 	int arg;
+ 	int gp_func;
+-	struct i2c_msg msg = { .addr = priv->cfg->switch_addr, .flags = 0,
+-			       .buf = buf, .len = sizeof(buf) };
++	struct i2c_msg msg = { .flags = 0, .buf = buf, .len = sizeof(buf) };
+ 
+ 	if (NULL == priv->cfg) {
+ 		dprintk("tda827x_config not defined, cannot set LNA gain!\n");
+ 		return;
+ 	}
++	msg.addr = priv->cfg->switch_addr;
+ 	if (priv->cfg->config) {
+ 		if (high)
+ 			dprintk("setting LNA to high gain\n");
+diff --git a/drivers/media/common/tuners/tea5761.c b/drivers/media/common/tuners/tea5761.c
+index b93cdef..b23dade 100644
+--- a/drivers/media/common/tuners/tea5761.c
++++ b/drivers/media/common/tuners/tea5761.c
+@@ -295,7 +295,7 @@ struct dvb_frontend *tea5761_attach(struct dvb_frontend *fe,
+ {
+ 	struct tea5761_priv *priv = NULL;
+ 
+-	if (tea5761_autodetection(i2c_adap, i2c_addr) == EINVAL)
++	if (tea5761_autodetection(i2c_adap, i2c_addr) != 0)
+ 		return NULL;
+ 
+ 	priv = kzalloc(sizeof(struct tea5761_priv), GFP_KERNEL);
+diff --git a/drivers/media/common/tuners/tuner-i2c.h b/drivers/media/common/tuners/tuner-i2c.h
+index 3ad6c8e..cb1c714 100644
+--- a/drivers/media/common/tuners/tuner-i2c.h
++++ b/drivers/media/common/tuners/tuner-i2c.h
+@@ -170,4 +170,12 @@ __fail:									\
+ 	__ret;								\
+ })
+ 
++#define hybrid_tuner_report_instance_count(state)			\
++({									\
++	int __ret = 0;							\
++	if (state)							\
++		__ret = state->i2c_props.count;				\
++	__ret;								\
++})
++
+ #endif /* __TUNER_I2C_H__ */
+diff --git a/drivers/media/common/tuners/tuner-simple.c b/drivers/media/common/tuners/tuner-simple.c
+index be8d903..266c255 100644
+--- a/drivers/media/common/tuners/tuner-simple.c
++++ b/drivers/media/common/tuners/tuner-simple.c
+@@ -1018,8 +1018,10 @@ struct dvb_frontend *simple_tuner_attach(struct dvb_frontend *fe,
+ 			fe->ops.i2c_gate_ctrl(fe, 1);
+ 
+ 		if (1 != i2c_transfer(i2c_adap, &msg, 1))
+-			tuner_warn("unable to probe %s, proceeding anyway.",
+-				   tuners[type].name);
++			printk(KERN_WARNING "tuner-simple %d-%04x: "
++			       "unable to probe %s, proceeding anyway.",
++			       i2c_adapter_id(i2c_adap), i2c_addr,
++			       tuners[type].name);
+ 
+ 		if (fe->ops.i2c_gate_ctrl)
+ 			fe->ops.i2c_gate_ctrl(fe, 0);
+diff --git a/drivers/media/common/tuners/tuner-xc2028.c b/drivers/media/common/tuners/tuner-xc2028.c
+index 9e9003c..0cbde17 100644
+--- a/drivers/media/common/tuners/tuner-xc2028.c
++++ b/drivers/media/common/tuners/tuner-xc2028.c
+@@ -46,7 +46,7 @@ module_param_string(firmware_name, firmware_name, sizeof(firmware_name), 0);
+ MODULE_PARM_DESC(firmware_name, "Firmware file name. Allows overriding the "
+ 				"default firmware name\n");
+ 
+-static LIST_HEAD(xc2028_list);
++static LIST_HEAD(hybrid_tuner_instance_list);
+ static DEFINE_MUTEX(xc2028_list_mutex);
+ 
+ /* struct for storing firmware table */
+@@ -68,12 +68,11 @@ struct firmware_properties {
+ };
+ 
+ struct xc2028_data {
+-	struct list_head        xc2028_list;
++	struct list_head        hybrid_tuner_instance_list;
+ 	struct tuner_i2c_props  i2c_props;
+ 	int                     (*tuner_callback) (void *dev,
+ 						   int command, int arg);
+ 	void			*video_dev;
+-	int			count;
+ 	__u32			frequency;
+ 
+ 	struct firmware_description *firm;
+@@ -1072,20 +1071,19 @@ static int xc2028_dvb_release(struct dvb_frontend *fe)
+ 
+ 	mutex_lock(&xc2028_list_mutex);
+ 
+-	priv->count--;
+-
+-	if (!priv->count) {
+-		list_del(&priv->xc2028_list);
+-
++	/* only perform final cleanup if this is the last instance */
++	if (hybrid_tuner_report_instance_count(priv) == 1) {
+ 		kfree(priv->ctrl.fname);
+-
+ 		free_firmware(priv);
+-		kfree(priv);
+-		fe->tuner_priv = NULL;
+ 	}
+ 
++	if (priv)
++		hybrid_tuner_release_state(priv);
++
+ 	mutex_unlock(&xc2028_list_mutex);
+ 
++	fe->tuner_priv = NULL;
++
+ 	return 0;
+ }
+ 
+@@ -1150,7 +1148,7 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe,
+ 				   struct xc2028_config *cfg)
+ {
+ 	struct xc2028_data *priv;
+-	void               *video_dev;
++	int instance;
+ 
+ 	if (debug)
+ 		printk(KERN_DEBUG "xc2028: Xcv2028/3028 init called!\n");
+@@ -1163,48 +1161,40 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe,
+ 		return NULL;
+ 	}
+ 
+-	video_dev = cfg->i2c_adap->algo_data;
+-
+-	if (debug)
+-		printk(KERN_DEBUG "xc2028: video_dev =%p\n", video_dev);
+-
+ 	mutex_lock(&xc2028_list_mutex);
+ 
+-	list_for_each_entry(priv, &xc2028_list, xc2028_list) {
+-		if (&priv->i2c_props.adap->dev == &cfg->i2c_adap->dev) {
+-			video_dev = NULL;
+-			if (debug)
+-				printk(KERN_DEBUG "xc2028: reusing device\n");
+-
+-			break;
+-		}
+-	}
+-
+-	if (video_dev) {
+-		priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+-		if (priv == NULL) {
+-			mutex_unlock(&xc2028_list_mutex);
+-			return NULL;
+-		}
+-
+-		priv->i2c_props.addr = cfg->i2c_addr;
+-		priv->i2c_props.adap = cfg->i2c_adap;
+-		priv->i2c_props.name = "xc2028";
+-
+-		priv->video_dev = video_dev;
++	instance = hybrid_tuner_request_state(struct xc2028_data, priv,
++					      hybrid_tuner_instance_list,
++					      cfg->i2c_adap, cfg->i2c_addr,
++					      "xc2028");
++	switch (instance) {
++	case 0:
++		/* memory allocation failure */
++		goto fail;
++		break;
++	case 1:
++		/* new tuner instance */
+ 		priv->tuner_callback = cfg->callback;
+ 		priv->ctrl.max_len = 13;
+ 
+ 		mutex_init(&priv->lock);
+ 
+-		list_add_tail(&priv->xc2028_list, &xc2028_list);
+-	}
+-
+-	fe->tuner_priv = priv;
+-	priv->count++;
++		/* analog side (tuner-core) uses i2c_adap->algo_data.
++		 * digital side is not guaranteed to have algo_data defined.
++		 *
++		 * digital side will always have fe->dvb defined.
++		 * analog side (tuner-core) doesn't (yet) define fe->dvb.
++		 */
++		priv->video_dev = ((fe->dvb) && (fe->dvb->priv)) ?
++				   fe->dvb->priv : cfg->i2c_adap->algo_data;
+ 
+-	if (debug)
+-		printk(KERN_DEBUG "xc2028: usage count is %i\n", priv->count);
++		fe->tuner_priv = priv;
++		break;
++	case 2:
++		/* existing tuner instance */
++		fe->tuner_priv = priv;
++		break;
++	}
+ 
+ 	memcpy(&fe->ops.tuner_ops, &xc2028_dvb_tuner_ops,
+ 	       sizeof(xc2028_dvb_tuner_ops));
+@@ -1217,6 +1207,11 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe,
+ 	mutex_unlock(&xc2028_list_mutex);
+ 
+ 	return fe;
++fail:
++	mutex_unlock(&xc2028_list_mutex);
++
++	xc2028_dvb_release(fe);
++	return NULL;
+ }
+ 
+ EXPORT_SYMBOL(xc2028_attach);
+diff --git a/drivers/media/dvb/b2c2/flexcop-usb.c b/drivers/media/dvb/b2c2/flexcop-usb.c
+index 449fb5c..ae0d76a 100644
+--- a/drivers/media/dvb/b2c2/flexcop-usb.c
++++ b/drivers/media/dvb/b2c2/flexcop-usb.c
+@@ -379,7 +379,7 @@ static void flexcop_usb_transfer_exit(struct flexcop_usb *fc_usb)
+ 
+ static int flexcop_usb_transfer_init(struct flexcop_usb *fc_usb)
+ {
+-	u16 frame_size = fc_usb->uintf->cur_altsetting->endpoint[0].desc.wMaxPacketSize;
++	u16 frame_size = le16_to_cpu(fc_usb->uintf->cur_altsetting->endpoint[0].desc.wMaxPacketSize);
+ 	int bufsize = B2C2_USB_NUM_ISO_URB * B2C2_USB_FRAMES_PER_ISO * frame_size,i,j,ret;
+ 	int buffer_offset = 0;
+ 
+diff --git a/drivers/media/dvb/cinergyT2/cinergyT2.c b/drivers/media/dvb/cinergyT2/cinergyT2.c
+index f5010e8..a824f37 100644
+--- a/drivers/media/dvb/cinergyT2/cinergyT2.c
++++ b/drivers/media/dvb/cinergyT2/cinergyT2.c
+@@ -82,22 +82,22 @@ enum cinergyt2_ep1_cmd {
+ 
+ struct dvbt_set_parameters_msg {
+ 	uint8_t cmd;
+-	uint32_t freq;
++	__le32 freq;
+ 	uint8_t bandwidth;
+-	uint16_t tps;
++	__le16 tps;
+ 	uint8_t flags;
+ } __attribute__((packed));
+ 
+ struct dvbt_get_status_msg {
+-	uint32_t freq;
++	__le32 freq;
+ 	uint8_t bandwidth;
+-	uint16_t tps;
++	__le16 tps;
+ 	uint8_t flags;
+-	uint16_t gain;
++	__le16 gain;
+ 	uint8_t snr;
+-	uint32_t viterbi_error_rate;
+-	uint32_t rs_error_rate;
+-	uint32_t uncorrected_block_count;
++	__le32 viterbi_error_rate;
++	__le32 rs_error_rate;
++	__le32 uncorrected_block_count;
+ 	uint8_t lock_bits;
+ 	uint8_t prev_lock_bits;
+ } __attribute__((packed));
+@@ -136,6 +136,7 @@ struct cinergyt2 {
+ 	wait_queue_head_t poll_wq;
+ 	int pending_fe_events;
+ 	int disconnect_pending;
++	unsigned int uncorrected_block_count;
+ 	atomic_t inuse;
+ 
+ 	void *streambuf;
+@@ -147,7 +148,7 @@ struct cinergyt2 {
+ 	char phys[64];
+ 	struct delayed_work rc_query_work;
+ 	int rc_input_event;
+-	u32 rc_last_code;
++	__le32 rc_last_code;
+ 	unsigned long last_event_jiffies;
+ #endif
+ };
+@@ -160,7 +161,7 @@ enum {
+ 
+ struct cinergyt2_rc_event {
+ 	char type;
+-	uint32_t value;
++	__le32 value;
+ } __attribute__((packed));
+ 
+ static const uint32_t rc_keys[] = {
+@@ -619,8 +620,11 @@ static int cinergyt2_ioctl (struct inode *inode, struct file *file,
+ 	{
+ 		uint32_t unc_count;
+ 
+-		unc_count = stat->uncorrected_block_count;
+-		stat->uncorrected_block_count = 0;
++		if (mutex_lock_interruptible(&cinergyt2->sem))
++			return -ERESTARTSYS;
++		unc_count = cinergyt2->uncorrected_block_count;
++		cinergyt2->uncorrected_block_count = 0;
++		mutex_unlock(&cinergyt2->sem);
+ 
+ 		/* UNC are already converted to host byte order... */
+ 		return put_user(unc_count,(__u32 __user *) arg);
+@@ -769,7 +773,7 @@ static void cinergyt2_query_rc (struct work_struct *work)
+ 				input_sync(cinergyt2->rc_input_dev);
+ 				cinergyt2->rc_input_event = KEY_MAX;
+ 			}
+-			cinergyt2->rc_last_code = ~0;
++			cinergyt2->rc_last_code = cpu_to_le32(~0);
+ 		}
+ 		goto out;
+ 	}
+@@ -780,7 +784,7 @@ static void cinergyt2_query_rc (struct work_struct *work)
+ 			n, le32_to_cpu(rc_events[n].value), rc_events[n].type);
+ 
+ 		if (rc_events[n].type == CINERGYT2_RC_EVENT_TYPE_NEC &&
+-		    rc_events[n].value == ~0) {
++		    rc_events[n].value == cpu_to_le32(~0)) {
+ 			/* keyrepeat bit -> just repeat last rc_input_event */
+ 		} else {
+ 			cinergyt2->rc_input_event = KEY_MAX;
+@@ -795,7 +799,7 @@ static void cinergyt2_query_rc (struct work_struct *work)
+ 
+ 		if (cinergyt2->rc_input_event != KEY_MAX) {
+ 			if (rc_events[n].value == cinergyt2->rc_last_code &&
+-			    cinergyt2->rc_last_code != ~0) {
++			    cinergyt2->rc_last_code != cpu_to_le32(~0)) {
+ 				/* emit a key-up so the double event is recognized */
+ 				dprintk(1, "rc_input_event=%d UP\n", cinergyt2->rc_input_event);
+ 				input_report_key(cinergyt2->rc_input_dev,
+@@ -829,7 +833,7 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
+ 	usb_make_path(cinergyt2->udev, cinergyt2->phys, sizeof(cinergyt2->phys));
+ 	strlcat(cinergyt2->phys, "/input0", sizeof(cinergyt2->phys));
+ 	cinergyt2->rc_input_event = KEY_MAX;
+-	cinergyt2->rc_last_code = ~0;
++	cinergyt2->rc_last_code = cpu_to_le32(~0);
+ 	INIT_DELAYED_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc);
+ 
+ 	input_dev->name = DRIVER_NAME " remote control";
+@@ -840,8 +844,8 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
+ 	input_dev->keycodesize = 0;
+ 	input_dev->keycodemax = 0;
+ 	input_dev->id.bustype = BUS_USB;
+-	input_dev->id.vendor = cinergyt2->udev->descriptor.idVendor;
+-	input_dev->id.product = cinergyt2->udev->descriptor.idProduct;
++	input_dev->id.vendor = le16_to_cpu(cinergyt2->udev->descriptor.idVendor);
++	input_dev->id.product = le16_to_cpu(cinergyt2->udev->descriptor.idProduct);
+ 	input_dev->id.version = 1;
+ 	input_dev->dev.parent = &cinergyt2->udev->dev;
+ 
+@@ -889,18 +893,16 @@ static void cinergyt2_query (struct work_struct *work)
+ 	char cmd [] = { CINERGYT2_EP1_GET_TUNER_STATUS };
+ 	struct dvbt_get_status_msg *s = &cinergyt2->status;
+ 	uint8_t lock_bits;
+-	uint32_t unc;
+ 
+ 	if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem))
+ 		return;
+ 
+-	unc = s->uncorrected_block_count;
+ 	lock_bits = s->lock_bits;
+ 
+ 	cinergyt2_command(cinergyt2, cmd, sizeof(cmd), (char *) s, sizeof(*s));
+ 
+-	unc += le32_to_cpu(s->uncorrected_block_count);
+-	s->uncorrected_block_count = unc;
++	cinergyt2->uncorrected_block_count +=
++		le32_to_cpu(s->uncorrected_block_count);
+ 
+ 	if (lock_bits != s->lock_bits) {
+ 		wake_up_interruptible(&cinergyt2->poll_wq);
+diff --git a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c
+index 56d871c..c2334ae 100644
+--- a/drivers/media/dvb/dvb-core/dvb_net.c
++++ b/drivers/media/dvb/dvb-core/dvb_net.c
+@@ -168,7 +168,7 @@ struct dvb_net_priv {
+  *  stolen from eth.c out of the linux kernel, hacked for dvb-device
+  *  by Michael Holzt <kju at debian.org>
+  */
+-static unsigned short dvb_net_eth_type_trans(struct sk_buff *skb,
++static __be16 dvb_net_eth_type_trans(struct sk_buff *skb,
+ 				      struct net_device *dev)
+ {
+ 	struct ethhdr *eth;
+@@ -277,10 +277,10 @@ static int handle_one_ule_extension( struct dvb_net_priv *p )
+ 			if(ext_len >= 0) {
+ 				p->ule_next_hdr += ext_len;
+ 				if (!p->ule_bridged) {
+-					p->ule_sndu_type = ntohs(*(unsigned short *)p->ule_next_hdr);
++					p->ule_sndu_type = ntohs(*(__be16 *)p->ule_next_hdr);
+ 					p->ule_next_hdr += 2;
+ 				} else {
+-					p->ule_sndu_type = ntohs(*(unsigned short *)(p->ule_next_hdr + ((p->ule_dbit ? 2 : 3) * ETH_ALEN)));
++					p->ule_sndu_type = ntohs(*(__be16 *)(p->ule_next_hdr + ((p->ule_dbit ? 2 : 3) * ETH_ALEN)));
+ 					/* This assures the extension handling loop will terminate. */
+ 				}
+ 			}
+@@ -294,7 +294,7 @@ static int handle_one_ule_extension( struct dvb_net_priv *p )
+ 		if (ule_optional_ext_handlers[htype])
+ 			(void)ule_optional_ext_handlers[htype]( p );
+ 		p->ule_next_hdr += ext_len;
+-		p->ule_sndu_type = ntohs( *(unsigned short *)(p->ule_next_hdr-2) );
++		p->ule_sndu_type = ntohs( *(__be16 *)(p->ule_next_hdr-2) );
+ 		/*
+ 		 * note: the length of the next header type is included in the
+ 		 * length of THIS optional extension header
+@@ -594,8 +594,8 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len )
+ 		/* Check for complete payload. */
+ 		if (priv->ule_sndu_remain <= 0) {
+ 			/* Check CRC32, we've got it in our skb already. */
+-			unsigned short ulen = htons(priv->ule_sndu_len);
+-			unsigned short utype = htons(priv->ule_sndu_type);
++			__be16 ulen = htons(priv->ule_sndu_len);
++			__be16 utype = htons(priv->ule_sndu_type);
+ 			const u8 *tail;
+ 			struct kvec iov[3] = {
+ 				{ &ulen, sizeof ulen },
+diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
+index cf4584e..f00a0eb 100644
+--- a/drivers/media/dvb/dvb-usb/Kconfig
++++ b/drivers/media/dvb/dvb-usb/Kconfig
+@@ -1,6 +1,6 @@
+ config DVB_USB
+ 	tristate "Support for various USB DVB devices"
+-	depends on DVB_CORE && USB && I2C
++	depends on DVB_CORE && USB && I2C && INPUT
+ 	depends on HOTPLUG	# due to FW_LOADER
+ 	select FW_LOADER
+ 	help
+diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c
+index 3462238..c4d40fe 100644
+--- a/drivers/media/dvb/dvb-usb/dib0700_devices.c
++++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c
+@@ -111,8 +111,8 @@ static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
+ 	struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
+ 	s8 a;
+ 	int if1=1220;
+-	if (adap->dev->udev->descriptor.idVendor  == USB_VID_HAUPPAUGE &&
+-		adap->dev->udev->descriptor.idProduct == USB_PID_HAUPPAUGE_NOVA_T_500_2) {
++	if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&
++		adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
+ 		if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
+ 	}
+ 	return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id],
+@@ -402,8 +402,8 @@ static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
+ {
+ 	struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
+ 
+-	if (desc->idVendor  == USB_VID_PINNACLE &&
+-	    desc->idProduct == USB_PID_PINNACLE_EXPRESSCARD_320CX)
++	if (desc->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
++	    desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
+ 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
+ 	else
+ 	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
+@@ -845,8 +845,8 @@ static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
+ 	struct i2c_adapter *tun_i2c;
+ 	s8 a;
+ 	int if1=1220;
+-	if (adap->dev->udev->descriptor.idVendor  == USB_VID_HAUPPAUGE &&
+-		adap->dev->udev->descriptor.idProduct == USB_PID_HAUPPAUGE_NOVA_T_STICK) {
++	if (adap->dev->udev->descriptor.idVendor  == cpu_to_le16(USB_VID_HAUPPAUGE) &&
++		adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
+ 		if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
+ 	}
+ 	if (st->is_dib7000pc)
+@@ -990,11 +990,12 @@ static struct dib7000p_config dib7070p_dib7000p_config = {
+ /* STK7070P */
+ static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
+ {
+-	if (adap->dev->udev->descriptor.idVendor  == USB_VID_PINNACLE &&
+-	adap->dev->udev->descriptor.idProduct == USB_PID_PINNACLE_PCTV72E)
+-	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
++	struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
++	if (p->idVendor  == cpu_to_le16(USB_VID_PINNACLE) &&
++	    p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
++		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
+ 	else
+-	dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
++		dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
+ 	msleep(10);
+ 	dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
+ 	dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
+diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c b/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c
+index e1112e3..733a7ff 100644
+--- a/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c
++++ b/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c
+@@ -127,7 +127,7 @@ int dvb_usb_get_hexline(const struct firmware *fw, struct hexline *hx,
+ 	if ((*pos + hx->len + 4) >= fw->size)
+ 		return -EINVAL;
+ 
+-	hx->addr = le16_to_cpu( *((u16 *) &b[1]) );
++	hx->addr = b[1] | (b[2] << 8);
+ 	hx->type = b[3];
+ 
+ 	if (hx->type == 0x04) {
+diff --git a/drivers/media/dvb/dvb-usb/gp8psk.c b/drivers/media/dvb/dvb-usb/gp8psk.c
+index 9a942af..2653120 100644
+--- a/drivers/media/dvb/dvb-usb/gp8psk.c
++++ b/drivers/media/dvb/dvb-usb/gp8psk.c
+@@ -146,24 +146,24 @@ static int gp8psk_power_ctrl(struct dvb_usb_device *d, int onoff)
+ 		if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM)
+ 			if (! (status & bm8pskFW_Loaded)) /* BCM4500 firmware loaded */
+ 				if(gp8psk_load_bcm4500fw(d))
+-					return EINVAL;
++					return -EINVAL;
+ 
+ 		if (! (status & bmIntersilOn)) /* LNB Power */
+ 			if (gp8psk_usb_in_op(d, START_INTERSIL, 1, 0,
+ 					&buf, 1))
+-				return EINVAL;
++				return -EINVAL;
+ 
+ 		/* Set DVB mode to 1 */
+ 		if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM)
+ 			if (gp8psk_usb_out_op(d, SET_DVB_MODE, 1, 0, NULL, 0))
+-				return EINVAL;
++				return -EINVAL;
+ 		/* Abort possible TS (if previous tune crashed) */
+ 		if (gp8psk_usb_out_op(d, ARM_TRANSFER, 0, 0, NULL, 0))
+-			return EINVAL;
++			return -EINVAL;
+ 	} else {
+ 		/* Turn off LNB power */
+ 		if (gp8psk_usb_in_op(d, START_INTERSIL, 0, 0, &buf, 1))
+-			return EINVAL;
++			return -EINVAL;
+ 		/* Turn off 8psk power */
+ 		if (gp8psk_usb_in_op(d, BOOT_8PSK, 0, 0, &buf, 1))
+ 			return -EINVAL;
+diff --git a/drivers/media/dvb/dvb-usb/m920x.c b/drivers/media/dvb/dvb-usb/m920x.c
+index a12e6f7..54626a0 100644
+--- a/drivers/media/dvb/dvb-usb/m920x.c
++++ b/drivers/media/dvb/dvb-usb/m920x.c
+@@ -16,6 +16,7 @@
+ #include "qt1010.h"
+ #include "tda1004x.h"
+ #include "tda827x.h"
++#include <asm/unaligned.h>
+ 
+ /* debug */
+ static int dvb_usb_m920x_debug;
+@@ -347,13 +348,13 @@ static int m920x_firmware_download(struct usb_device *udev, const struct firmwar
+ 
+ 	for (pass = 0; pass < 2; pass++) {
+ 		for (i = 0; i + (sizeof(u16) * 3) < fw->size;) {
+-			value = le16_to_cpu(*(u16 *)(fw->data + i));
++			value = get_unaligned_le16(fw->data + i);
+ 			i += sizeof(u16);
+ 
+-			index = le16_to_cpu(*(u16 *)(fw->data + i));
++			index = get_unaligned_le16(fw->data + i);
+ 			i += sizeof(u16);
+ 
+-			size = le16_to_cpu(*(u16 *)(fw->data + i));
++			size = get_unaligned_le16(fw->data + i);
+ 			i += sizeof(u16);
+ 
+ 			if (pass == 1) {
+diff --git a/drivers/media/dvb/frontends/dib0070.h b/drivers/media/dvb/frontends/dib0070.h
+index 786e37d..3eedfdf 100644
+--- a/drivers/media/dvb/frontends/dib0070.h
++++ b/drivers/media/dvb/frontends/dib0070.h
+@@ -37,7 +37,20 @@ struct dib0070_config {
+ 	u8 flip_chip;
+ };
+ 
+-extern struct dvb_frontend * dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg);
++#if defined(CONFIG_DVB_TUNER_DIB0070) || (defined(CONFIG_DVB_TUNER_DIB0070_MODULE) && defined(MODULE))
++extern struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe,
++					   struct i2c_adapter *i2c,
++					   struct dib0070_config *cfg);
++#else
++static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe,
++						  struct i2c_adapter *i2c,
++						  struct dib0070_config *cfg)
++{
++	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
++	return NULL;
++}
++#endif
++
+ extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, uint8_t open);
+ extern u16 dib0070_wbd_offset(struct dvb_frontend *);
+ 
+diff --git a/drivers/media/dvb/frontends/dib7000p.h b/drivers/media/dvb/frontends/dib7000p.h
+index 081bd81..07c4d12 100644
+--- a/drivers/media/dvb/frontends/dib7000p.h
++++ b/drivers/media/dvb/frontends/dib7000p.h
+@@ -37,7 +37,20 @@ struct dib7000p_config {
+ 
+ #define DEFAULT_DIB7000P_I2C_ADDRESS 18
+ 
+-extern struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000p_config *cfg);
++#if defined(CONFIG_DVB_DIB7000P) || (defined(CONFIG_DVB_DIB7000P_MODULE) && defined(MODULE))
++extern struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap,
++					    u8 i2c_addr,
++					    struct dib7000p_config *cfg);
++#else
++static inline struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap,
++						   u8 i2c_addr,
++						   struct dib7000p_config *cfg)
++{
++	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
++	return NULL;
++}
++#endif
++
+ extern int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[]);
+ 
+ extern struct i2c_adapter * dib7000p_get_i2c_master(struct dvb_frontend *, enum dibx000_i2c_interface, int);
+diff --git a/drivers/media/dvb/frontends/or51132.c b/drivers/media/dvb/frontends/or51132.c
+index c7b5785..5ed3254 100644
+--- a/drivers/media/dvb/frontends/or51132.c
++++ b/drivers/media/dvb/frontends/or51132.c
+@@ -126,7 +126,7 @@ static int or51132_readreg(struct or51132_state *state, u8 reg)
+ 		       reg, err);
+ 		return -EREMOTEIO;
+ 	}
+-	return le16_to_cpup((u16*)buf);
++	return buf[0] | (buf[1] << 8);
+ }
+ 
+ static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware *fw)
+@@ -140,9 +140,9 @@ static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware
+ 	dprintk("Firmware is %Zd bytes\n",fw->size);
+ 
+ 	/* Get size of firmware A and B */
+-	firmwareAsize = le32_to_cpu(*((u32*)fw->data));
++	firmwareAsize = le32_to_cpu(*((__le32*)fw->data));
+ 	dprintk("FirmwareA is %i bytes\n",firmwareAsize);
+-	firmwareBsize = le32_to_cpu(*((u32*)(fw->data+4)));
++	firmwareBsize = le32_to_cpu(*((__le32*)(fw->data+4)));
+ 	dprintk("FirmwareB is %i bytes\n",firmwareBsize);
+ 
+ 	/* Upload firmware */
+diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c
+index 747e7f1..f05d43d 100644
+--- a/drivers/media/dvb/ttpci/av7110.c
++++ b/drivers/media/dvb/ttpci/av7110.c
+@@ -51,6 +51,7 @@
+ #include <linux/crc32.h>
+ #include <linux/i2c.h>
+ #include <linux/kthread.h>
++#include <asm/unaligned.h>
+ 
+ #include <asm/system.h>
+ 
+@@ -1461,9 +1462,9 @@ static int check_firmware(struct av7110* av7110)
+ 	ptr += 4;
+ 
+ 	/* check dpram file */
+-	crc = ntohl(*(u32*) ptr);
++	crc = get_unaligned_be32(ptr);
+ 	ptr += 4;
+-	len = ntohl(*(u32*) ptr);
++	len = get_unaligned_be32(ptr);
+ 	ptr += 4;
+ 	if (len >= 512) {
+ 		printk("dvb-ttpci: dpram file is way too big.\n");
+@@ -1478,9 +1479,9 @@ static int check_firmware(struct av7110* av7110)
+ 	ptr += len;
+ 
+ 	/* check root file */
+-	crc = ntohl(*(u32*) ptr);
++	crc = get_unaligned_be32(ptr);
+ 	ptr += 4;
+-	len = ntohl(*(u32*) ptr);
++	len = get_unaligned_be32(ptr);
+ 	ptr += 4;
+ 
+ 	if (len <= 200000 || len >= 300000 ||
+diff --git a/drivers/media/dvb/ttpci/av7110_av.c b/drivers/media/dvb/ttpci/av7110_av.c
+index 3e6b650..ec55a96 100644
+--- a/drivers/media/dvb/ttpci/av7110_av.c
++++ b/drivers/media/dvb/ttpci/av7110_av.c
+@@ -965,8 +965,9 @@ static u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x
+ 
+ static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len, int nonblock)
+ {
+-	int i, n;
++	unsigned i, n;
+ 	int progressive = 0;
++	int match = 0;
+ 
+ 	dprintk(2, "av7110:%p, \n", av7110);
+ 
+@@ -975,12 +976,31 @@ static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len
+ 			return -EBUSY;
+ 	}
+ 
+-	for (i = 0; i < len - 5; i++) {
+-		/* get progressive flag from picture extension */
+-		if (buf[i] == 0x00 && buf[i+1] == 0x00 &&
+-		    buf[i+2] == 0x01 && (unsigned char)buf[i+3] == 0xb5 &&
+-		    (buf[i+4] & 0xf0) == 0x10)
+-			progressive = buf[i+5] & 0x08;
++	/* search in buf for instances of 00 00 01 b5 1? */
++	for (i = 0; i < len; i++) {
++		unsigned char c;
++		if (get_user(c, buf + i))
++			return -EFAULT;
++		if (match == 5) {
++			progressive = c & 0x08;
++			match = 0;
++		}
++		if (c == 0x00) {
++			match = (match == 1 || match == 2) ? 2 : 1;
++			continue;
++		}
++		switch (match++) {
++		case 2: if (c == 0x01)
++				continue;
++			break;
++		case 3: if (c == 0xb5)
++				continue;
++			break;
++		case 4: if ((c & 0xf0) == 0x10)
++				continue;
++			break;
++		}
++		match = 0;
+ 	}
+ 
+ 	/* setting n always > 1, fixes problems when playing stillframes
+diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+index 732ce4d..5d2d81a 100644
+--- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
++++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+@@ -552,7 +552,7 @@ static void ttusb_process_muxpack(struct ttusb *ttusb, const u8 * muxpack,
+ 	u16 csum = 0, cc;
+ 	int i;
+ 	for (i = 0; i < len; i += 2)
+-		csum ^= le16_to_cpup((u16 *) (muxpack + i));
++		csum ^= le16_to_cpup((__le16 *) (muxpack + i));
+ 	if (csum) {
+ 		printk("%s: muxpack with incorrect checksum, ignoring\n",
+ 		       __func__);
+diff --git a/drivers/media/dvb/ttusb-dec/Kconfig b/drivers/media/dvb/ttusb-dec/Kconfig
+index 0712899..a23cc0a 100644
+--- a/drivers/media/dvb/ttusb-dec/Kconfig
++++ b/drivers/media/dvb/ttusb-dec/Kconfig
+@@ -1,6 +1,6 @@
+ config DVB_TTUSB_DEC
+ 	tristate "Technotrend/Hauppauge USB DEC devices"
+-	depends on DVB_CORE && USB
++	depends on DVB_CORE && USB && INPUT
+ 	depends on HOTPLUG	# due to FW_LOADER
+ 	select FW_LOADER
+ 	select CRC32
+diff --git a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c
+index 42eee04..fefdc05 100644
+--- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c
++++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c
+@@ -343,7 +343,7 @@ static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode,
+ 	u8 c[COMMAND_PACKET_SIZE];
+ 	int c_length;
+ 	int result;
+-	unsigned int tmp;
++	__be32 tmp;
+ 
+ 	dprintk("%s\n", __func__);
+ 
+@@ -398,9 +398,9 @@ static void ttusb_dec_set_pids(struct ttusb_dec *dec)
+ 		   0x00, 0x00, 0xff, 0xff,
+ 		   0xff, 0xff, 0xff, 0xff };
+ 
+-	u16 pcr = htons(dec->pid[DMX_PES_PCR]);
+-	u16 audio = htons(dec->pid[DMX_PES_AUDIO]);
+-	u16 video = htons(dec->pid[DMX_PES_VIDEO]);
++	__be16 pcr = htons(dec->pid[DMX_PES_PCR]);
++	__be16 audio = htons(dec->pid[DMX_PES_AUDIO]);
++	__be16 video = htons(dec->pid[DMX_PES_VIDEO]);
+ 
+ 	dprintk("%s\n", __func__);
+ 
+@@ -435,7 +435,7 @@ static void ttusb_dec_process_pva(struct ttusb_dec *dec, u8 *pva, int length)
+ 	case 0x01: {		/* VideoStream */
+ 		int prebytes = pva[5] & 0x03;
+ 		int postbytes = (pva[5] & 0x0c) >> 2;
+-		u16 v_pes_payload_length;
++		__be16 v_pes_payload_length;
+ 
+ 		if (output_pva) {
+ 			dec->video_filter->feed->cb.ts(pva, length, NULL, 0,
+@@ -1006,7 +1006,7 @@ static int ttusb_dec_start_sec_feed(struct dvb_demux_feed *dvbdmxfeed)
+ 		    0x00, 0x00, 0x00, 0x00,
+ 		    0x00, 0x00, 0x00, 0x00,
+ 		    0x00 };
+-	u16 pid;
++	__be16 pid;
+ 	u8 c[COMMAND_PACKET_SIZE];
+ 	int c_length;
+ 	int result;
+@@ -1278,9 +1278,10 @@ static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
+ 	u8 *firmware = NULL;
+ 	size_t firmware_size = 0;
+ 	u16 firmware_csum = 0;
+-	u16 firmware_csum_ns;
+-	u32 firmware_size_nl;
+-	u32 crc32_csum, crc32_check, tmp;
++	__be16 firmware_csum_ns;
++	__be32 firmware_size_nl;
++	u32 crc32_csum, crc32_check;
++	__be32 tmp;
+ 	const struct firmware *fw_entry = NULL;
+ 
+ 	dprintk("%s\n", __func__);
+@@ -1306,7 +1307,7 @@ static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
+ 	   valid. */
+ 	crc32_csum = crc32(~0L, firmware, 56) ^ ~0L;
+ 	memcpy(&tmp, &firmware[56], 4);
+-	crc32_check = htonl(tmp);
++	crc32_check = ntohl(tmp);
+ 	if (crc32_csum != crc32_check) {
+ 		printk("%s: crc32 check of DSP code failed (calculated "
+ 		       "0x%08x != 0x%08x in file), file invalid.\n",
+@@ -1627,7 +1628,7 @@ static int ttusb_dec_probe(struct usb_interface *intf,
+ 
+ 	usb_set_intfdata(intf, (void *)dec);
+ 
+-	switch (le16_to_cpu(id->idProduct)) {
++	switch (id->idProduct) {
+ 	case 0x1006:
+ 		ttusb_dec_set_model(dec, TTUSB_DEC3000S);
+ 		break;
+@@ -1652,7 +1653,7 @@ static int ttusb_dec_probe(struct usb_interface *intf,
+ 	ttusb_dec_init_dvb(dec);
+ 
+ 	dec->adapter.priv = dec;
+-	switch (le16_to_cpu(id->idProduct)) {
++	switch (id->idProduct) {
+ 	case 0x1006:
+ 		dec->fe = ttusbdecfe_dvbs_attach(&fe_config);
+ 		break;
+diff --git a/drivers/media/dvb/ttusb-dec/ttusbdecfe.c b/drivers/media/dvb/ttusb-dec/ttusbdecfe.c
+index eb5eaec..443af24 100644
+--- a/drivers/media/dvb/ttusb-dec/ttusbdecfe.c
++++ b/drivers/media/dvb/ttusb-dec/ttusbdecfe.c
+@@ -86,7 +86,7 @@ static int ttusbdecfe_dvbt_set_frontend(struct dvb_frontend* fe, struct dvb_fron
+ 		   0x00, 0x00, 0x00, 0xff,
+ 		   0x00, 0x00, 0x00, 0xff };
+ 
+-	u32 freq = htonl(p->frequency / 1000);
++	__be32 freq = htonl(p->frequency / 1000);
+ 	memcpy(&b[4], &freq, sizeof (u32));
+ 	state->config->send_command(fe, 0x71, sizeof(b), b, NULL, NULL);
+ 
+@@ -117,10 +117,10 @@ static int ttusbdecfe_dvbs_set_frontend(struct dvb_frontend* fe, struct dvb_fron
+ 		   0x00, 0x00, 0x00, 0x00,
+ 		   0x00, 0x00, 0x00, 0x00,
+ 		   0x00, 0x00, 0x00, 0x00 };
+-	u32 freq;
+-	u32 sym_rate;
+-	u32 band;
+-	u32 lnb_voltage;
++	__be32 freq;
++	__be32 sym_rate;
++	__be32 band;
++	__be32 lnb_voltage;
+ 
+ 	freq = htonl(p->frequency +
+ 	       (state->hi_band ? LOF_HI : LOF_LO));
+diff --git a/drivers/media/video/au0828/Kconfig b/drivers/media/video/au0828/Kconfig
+index def10d0..52b2491 100644
+--- a/drivers/media/video/au0828/Kconfig
++++ b/drivers/media/video/au0828/Kconfig
+@@ -1,7 +1,7 @@
+ 
+ config VIDEO_AU0828
+ 	tristate "Auvitek AU0828 support"
+-	depends on VIDEO_DEV && I2C && INPUT && DVB_CORE && USB
++	depends on I2C && INPUT && DVB_CORE && USB
+ 	select I2C_ALGOBIT
+ 	select VIDEO_TVEEPROM
+ 	select DVB_AU8522 if !DVB_FE_CUSTOMIZE
+diff --git a/drivers/media/video/au0828/au0828-dvb.c b/drivers/media/video/au0828/au0828-dvb.c
+index c86a5f1..c6d4705 100644
+--- a/drivers/media/video/au0828/au0828-dvb.c
++++ b/drivers/media/video/au0828/au0828-dvb.c
+@@ -353,12 +353,6 @@ int au0828_dvb_register(struct au0828_dev *dev)
+ 		return -1;
+ 	}
+ 
+-	/* Put the analog decoder in standby to keep it quiet */
+-	au0828_call_i2c_clients(dev, TUNER_SET_STANDBY, NULL);
+-
+-	if (dvb->frontend->ops.analog_ops.standby)
+-		dvb->frontend->ops.analog_ops.standby(dvb->frontend);
+-
+ 	/* register everything */
+ 	ret = dvb_register(dev);
+ 	if (ret < 0) {
+diff --git a/drivers/media/video/bt8xx/bttv-cards.c b/drivers/media/video/bt8xx/bttv-cards.c
+index f20a01c..8ef0424 100644
+--- a/drivers/media/video/bt8xx/bttv-cards.c
++++ b/drivers/media/video/bt8xx/bttv-cards.c
+@@ -34,6 +34,7 @@
+ #include <linux/firmware.h>
+ #include <net/checksum.h>
+ 
++#include <asm/unaligned.h>
+ #include <asm/io.h>
+ 
+ #include "bttvp.h"
+@@ -3858,7 +3859,7 @@ static void __devinit osprey_eeprom(struct bttv *btv, const u8 ee[256])
+ 		ee += i;
+ 
+ 		/* found a valid descriptor */
+-		type = be16_to_cpup((u16*)(ee+4));
++		type = get_unaligned_be16((__be16 *)(ee+4));
+ 
+ 		switch(type) {
+ 		/* 848 based */
+@@ -3918,7 +3919,7 @@ static void __devinit osprey_eeprom(struct bttv *btv, const u8 ee[256])
+ 			       btv->c.nr, type);
+ 			break;
+ 		}
+-		serial = be32_to_cpup((u32*)(ee+6));
++		serial = get_unaligned_be32((__be32 *)(ee+6));
+ 	}
+ 
+ 	printk(KERN_INFO "bttv%d: osprey eeprom: card=%d '%s' serial=%u\n",
+diff --git a/drivers/media/video/bt8xx/bttv-risc.c b/drivers/media/video/bt8xx/bttv-risc.c
+index e5979f7..0af5868 100644
+--- a/drivers/media/video/bt8xx/bttv-risc.c
++++ b/drivers/media/video/bt8xx/bttv-risc.c
+@@ -48,7 +48,7 @@ bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc,
+ {
+ 	u32 instructions,line,todo;
+ 	struct scatterlist *sg;
+-	u32 *rp;
++	__le32 *rp;
+ 	int rc;
+ 
+ 	/* estimate risc mem: worst case is one write per page border +
+@@ -128,7 +128,8 @@ bttv_risc_planar(struct bttv *btv, struct btcx_riscmem *risc,
+ 		 unsigned int cpadding)
+ {
+ 	unsigned int instructions,line,todo,ylen,chroma;
+-	u32 *rp,ri;
++	__le32 *rp;
++	u32 ri;
+ 	struct scatterlist *ysg;
+ 	struct scatterlist *usg;
+ 	struct scatterlist *vsg;
+@@ -244,7 +245,8 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
+ {
+ 	int dwords,rc,line,maxy,start,end,skip,nskips;
+ 	struct btcx_skiplist *skips;
+-	u32 *rp,ri,ra;
++	__le32 *rp;
++	u32 ri,ra;
+ 	u32 addr;
+ 
+ 	/* skip list for window clipping */
+diff --git a/drivers/media/video/btcx-risc.c b/drivers/media/video/btcx-risc.c
+index ce0840c..f42701f 100644
+--- a/drivers/media/video/btcx-risc.c
++++ b/drivers/media/video/btcx-risc.c
+@@ -63,7 +63,7 @@ int btcx_riscmem_alloc(struct pci_dev *pci,
+ 		       struct btcx_riscmem *risc,
+ 		       unsigned int size)
+ {
+-	u32 *cpu;
++	__le32 *cpu;
+ 	dma_addr_t dma;
+ 
+ 	if (NULL != risc->cpu && risc->size < size)
+diff --git a/drivers/media/video/btcx-risc.h b/drivers/media/video/btcx-risc.h
+index 503e6c6..861bc81 100644
+--- a/drivers/media/video/btcx-risc.h
++++ b/drivers/media/video/btcx-risc.h
+@@ -2,8 +2,8 @@
+  */
+ struct btcx_riscmem {
+ 	unsigned int   size;
+-	u32            *cpu;
+-	u32            *jmp;
++	__le32         *cpu;
++	__le32         *jmp;
+ 	dma_addr_t     dma;
+ };
+ 
+diff --git a/drivers/media/video/cx18/cx18-av-core.c b/drivers/media/video/cx18/cx18-av-core.c
+index 6686490..9a26751 100644
+--- a/drivers/media/video/cx18/cx18-av-core.c
++++ b/drivers/media/video/cx18/cx18-av-core.c
+@@ -182,14 +182,16 @@ static void input_change(struct cx18 *cx)
+ 		if (std == V4L2_STD_NTSC_M_JP) {
+ 			/* Japan uses EIAJ audio standard */
+ 			cx18_av_write(cx, 0x808, 0xf7);
++			cx18_av_write(cx, 0x80b, 0x02);
+ 		} else if (std == V4L2_STD_NTSC_M_KR) {
+ 			/* South Korea uses A2 audio standard */
+ 			cx18_av_write(cx, 0x808, 0xf8);
++			cx18_av_write(cx, 0x80b, 0x03);
+ 		} else {
+ 			/* Others use the BTSC audio standard */
+ 			cx18_av_write(cx, 0x808, 0xf6);
++			cx18_av_write(cx, 0x80b, 0x01);
+ 		}
+-		cx18_av_write(cx, 0x80b, 0x00);
+ 	} else if (std & V4L2_STD_PAL) {
+ 		/* Follow tuner change procedure for PAL */
+ 		cx18_av_write(cx, 0x808, 0xff);
+@@ -741,8 +743,8 @@ static void log_audio_status(struct cx18 *cx)
+ {
+ 	struct cx18_av_state *state = &cx->av_state;
+ 	u8 download_ctl = cx18_av_read(cx, 0x803);
+-	u8 mod_det_stat0 = cx18_av_read(cx, 0x805);
+-	u8 mod_det_stat1 = cx18_av_read(cx, 0x804);
++	u8 mod_det_stat0 = cx18_av_read(cx, 0x804);
++	u8 mod_det_stat1 = cx18_av_read(cx, 0x805);
+ 	u8 audio_config = cx18_av_read(cx, 0x808);
+ 	u8 pref_mode = cx18_av_read(cx, 0x809);
+ 	u8 afc0 = cx18_av_read(cx, 0x80b);
+@@ -760,12 +762,12 @@ static void log_audio_status(struct cx18 *cx)
+ 	case 0x12: p = "dual with SAP"; break;
+ 	case 0x14: p = "tri with SAP"; break;
+ 	case 0xfe: p = "forced mode"; break;
+-	default: p = "not defined";
++	default: p = "not defined"; break;
+ 	}
+ 	CX18_INFO("Detected audio mode:       %s\n", p);
+ 
+ 	switch (mod_det_stat1) {
+-	case 0x00: p = "BTSC"; break;
++	case 0x00: p = "not defined"; break;
+ 	case 0x01: p = "EIAJ"; break;
+ 	case 0x02: p = "A2-M"; break;
+ 	case 0x03: p = "A2-BG"; break;
+@@ -779,8 +781,13 @@ static void log_audio_status(struct cx18 *cx)
+ 	case 0x0b: p = "NICAM-I"; break;
+ 	case 0x0c: p = "NICAM-L"; break;
+ 	case 0x0d: p = "BTSC/EIAJ/A2-M Mono (4.5 MHz FMMono)"; break;
++	case 0x0e: p = "IF FM Radio"; break;
++	case 0x0f: p = "BTSC"; break;
++	case 0x10: p = "detected chrominance"; break;
++	case 0xfd: p = "unknown audio standard"; break;
++	case 0xfe: p = "forced audio standard"; break;
+ 	case 0xff: p = "no detected audio standard"; break;
+-	default: p = "not defined";
++	default: p = "not defined"; break;
+ 	}
+ 	CX18_INFO("Detected audio standard:   %s\n", p);
+ 	CX18_INFO("Audio muted:               %s\n",
+@@ -789,22 +796,23 @@ static void log_audio_status(struct cx18 *cx)
+ 		    (download_ctl & 0x10) ? "running" : "stopped");
+ 
+ 	switch (audio_config >> 4) {
+-	case 0x00: p = "BTSC"; break;
+-	case 0x01: p = "EIAJ"; break;
+-	case 0x02: p = "A2-M"; break;
+-	case 0x03: p = "A2-BG"; break;
+-	case 0x04: p = "A2-DK1"; break;
+-	case 0x05: p = "A2-DK2"; break;
+-	case 0x06: p = "A2-DK3"; break;
+-	case 0x07: p = "A1 (6.0 MHz FM Mono)"; break;
+-	case 0x08: p = "AM-L"; break;
+-	case 0x09: p = "NICAM-BG"; break;
+-	case 0x0a: p = "NICAM-DK"; break;
+-	case 0x0b: p = "NICAM-I"; break;
+-	case 0x0c: p = "NICAM-L"; break;
+-	case 0x0d: p = "FM radio"; break;
++	case 0x00: p = "undefined"; break;
++	case 0x01: p = "BTSC"; break;
++	case 0x02: p = "EIAJ"; break;
++	case 0x03: p = "A2-M"; break;
++	case 0x04: p = "A2-BG"; break;
++	case 0x05: p = "A2-DK1"; break;
++	case 0x06: p = "A2-DK2"; break;
++	case 0x07: p = "A2-DK3"; break;
++	case 0x08: p = "A1 (6.0 MHz FM Mono)"; break;
++	case 0x09: p = "AM-L"; break;
++	case 0x0a: p = "NICAM-BG"; break;
++	case 0x0b: p = "NICAM-DK"; break;
++	case 0x0c: p = "NICAM-I"; break;
++	case 0x0d: p = "NICAM-L"; break;
++	case 0x0e: p = "FM radio"; break;
+ 	case 0x0f: p = "automatic detection"; break;
+-	default: p = "undefined";
++	default: p = "undefined"; break;
+ 	}
+ 	CX18_INFO("Configured audio standard: %s\n", p);
+ 
+@@ -815,12 +823,9 @@ static void log_audio_status(struct cx18 *cx)
+ 		case 0x02: p = "MONO3 (STEREO forced MONO)"; break;
+ 		case 0x03: p = "MONO4 (NICAM ANALOG-Language C/Analog Fallback)"; break;
+ 		case 0x04: p = "STEREO"; break;
+-		case 0x05: p = "DUAL1 (AB)"; break;
+-		case 0x06: p = "DUAL2 (AC) (FM)"; break;
+-		case 0x07: p = "DUAL3 (BC) (FM)"; break;
+-		case 0x08: p = "DUAL4 (AC) (AM)"; break;
+-		case 0x09: p = "DUAL5 (BC) (AM)"; break;
+-		case 0x0a: p = "SAP"; break;
++		case 0x05: p = "DUAL1 (AC)"; break;
++		case 0x06: p = "DUAL2 (BC)"; break;
++		case 0x07: p = "DUAL3 (AB)"; break;
+ 		default: p = "undefined";
+ 		}
+ 		CX18_INFO("Configured audio mode:     %s\n", p);
+@@ -835,9 +840,11 @@ static void log_audio_status(struct cx18 *cx)
+ 		case 0x06: p = "BTSC"; break;
+ 		case 0x07: p = "EIAJ"; break;
+ 		case 0x08: p = "A2-M"; break;
+-		case 0x09: p = "FM Radio"; break;
++		case 0x09: p = "FM Radio (4.5 MHz)"; break;
++		case 0x0a: p = "FM Radio (5.5 MHz)"; break;
++		case 0x0b: p = "S-Video"; break;
+ 		case 0x0f: p = "automatic standard and mode detection"; break;
+-		default: p = "undefined";
++		default: p = "undefined"; break;
+ 		}
+ 		CX18_INFO("Configured audio system:   %s\n", p);
+ 	}
+@@ -857,22 +864,24 @@ static void log_audio_status(struct cx18 *cx)
+ 	case 5: p = "language AC"; break;
+ 	case 6: p = "language BC"; break;
+ 	case 7: p = "language AB"; break;
+-	default: p = "undefined";
++	default: p = "undefined"; break;
+ 	}
+ 	CX18_INFO("Preferred audio mode:      %s\n", p);
+ 
+ 	if ((audio_config & 0xf) == 0xf) {
+-		switch ((afc0 >> 2) & 0x1) {
++		switch ((afc0 >> 3) & 0x1) {
+ 		case 0: p = "system DK"; break;
+ 		case 1: p = "system L"; break;
+ 		}
+ 		CX18_INFO("Selected 65 MHz format:    %s\n", p);
+ 
+-		switch (afc0 & 0x3) {
+-		case 0: p = "BTSC"; break;
+-		case 1: p = "EIAJ"; break;
+-		case 2: p = "A2-M"; break;
+-		default: p = "undefined";
++		switch (afc0 & 0x7) {
++		case 0: p = "Chroma"; break;
++		case 1: p = "BTSC"; break;
++		case 2: p = "EIAJ"; break;
++		case 3: p = "A2-M"; break;
++		case 4: p = "autodetect"; break;
++		default: p = "undefined"; break;
+ 		}
+ 		CX18_INFO("Selected 45 MHz format:    %s\n", p);
+ 	}
+diff --git a/drivers/media/video/cx18/cx18-cards.c b/drivers/media/video/cx18/cx18-cards.c
+index 553adbf..baccd07 100644
+--- a/drivers/media/video/cx18/cx18-cards.c
++++ b/drivers/media/video/cx18/cx18-cards.c
+@@ -126,7 +126,7 @@ static const struct cx18_card cx18_card_hvr1600_samsung = {
+ 
+ /* ------------------------------------------------------------------------- */
+ 
+-/* Compro VideoMate H900: not working at the moment! */
++/* Compro VideoMate H900: note that this card is analog only! */
+ 
+ static const struct cx18_card_pci_info cx18_pci_h900[] = {
+ 	{ PCI_DEVICE_ID_CX23418, CX18_PCI_ID_COMPRO, 0xe100 },
+@@ -136,7 +136,7 @@ static const struct cx18_card_pci_info cx18_pci_h900[] = {
+ static const struct cx18_card cx18_card_h900 = {
+ 	.type = CX18_CARD_COMPRO_H900,
+ 	.name = "Compro VideoMate H900",
+-	.comment = "DVB & VBI are not yet supported\n",
++	.comment = "VBI is not yet supported\n",
+ 	.v4l2_capabilities = CX18_CAP_ENCODER,
+ 	.hw_audio_ctrl = CX18_HW_CX23418,
+ 	.hw_all = CX18_HW_TUNER,
+diff --git a/drivers/media/video/cx18/cx18-controls.c b/drivers/media/video/cx18/cx18-controls.c
+index 2bdac5e..87cf410 100644
+--- a/drivers/media/video/cx18/cx18-controls.c
++++ b/drivers/media/video/cx18/cx18-controls.c
+@@ -159,7 +159,7 @@ static int cx18_setup_vbi_fmt(struct cx18 *cx, enum v4l2_mpeg_stream_vbi_fmt fmt
+ {
+ 	if (!(cx->v4l2_cap & V4L2_CAP_SLICED_VBI_CAPTURE))
+ 		return -EINVAL;
+-	if (atomic_read(&cx->capturing) > 0)
++	if (atomic_read(&cx->ana_capturing) > 0)
+ 		return -EBUSY;
+ 
+ 	/* First try to allocate sliced VBI buffers if needed. */
+@@ -235,7 +235,7 @@ int cx18_control_ioctls(struct cx18 *cx, unsigned int cmd, void *arg)
+ 		CX18_DEBUG_IOCTL("VIDIOC_S_EXT_CTRLS\n");
+ 		if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
+ 			struct cx2341x_mpeg_params p = cx->params;
+-			int err = cx2341x_ext_ctrls(&p, atomic_read(&cx->capturing), arg, cmd);
++			int err = cx2341x_ext_ctrls(&p, atomic_read(&cx->ana_capturing), arg, cmd);
+ 
+ 			if (err)
+ 				return err;
+@@ -295,7 +295,7 @@ int cx18_control_ioctls(struct cx18 *cx, unsigned int cmd, void *arg)
+ 		CX18_DEBUG_IOCTL("VIDIOC_TRY_EXT_CTRLS\n");
+ 		if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG)
+ 			return cx2341x_ext_ctrls(&cx->params,
+-					atomic_read(&cx->capturing), arg, cmd);
++					atomic_read(&cx->ana_capturing), arg, cmd);
+ 		return -EINVAL;
+ 	}
+ 
+diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c
+index 0dd4e05..2b810bb 100644
+--- a/drivers/media/video/cx18/cx18-driver.c
++++ b/drivers/media/video/cx18/cx18-driver.c
+@@ -670,7 +670,7 @@ static int __devinit cx18_probe(struct pci_dev *dev,
+ 	cx18_init_power(cx, 1);
+ 	cx18_init_memory(cx);
+ 
+-	cx->scb = (struct cx18_scb *)(cx->enc_mem + SCB_OFFSET);
++	cx->scb = (struct cx18_scb __iomem *)(cx->enc_mem + SCB_OFFSET);
+ 	cx18_init_scb(cx);
+ 
+ 	cx18_gpio_init(cx);
+@@ -751,17 +751,6 @@ static int __devinit cx18_probe(struct pci_dev *dev,
+ 	if (cx->options.radio > 0)
+ 		cx->v4l2_cap |= V4L2_CAP_RADIO;
+ 
+-	retval = cx18_streams_setup(cx);
+-	if (retval) {
+-		CX18_ERR("Error %d setting up streams\n", retval);
+-		goto free_irq;
+-	}
+-	retval = cx18_streams_register(cx);
+-	if (retval) {
+-		CX18_ERR("Error %d registering devices\n", retval);
+-		goto free_streams;
+-	}
+-
+ 	if (cx->options.tuner > -1) {
+ 		struct tuner_setup setup;
+ 
+@@ -788,7 +777,16 @@ static int __devinit cx18_probe(struct pci_dev *dev,
+ 	   are not. */
+ 	cx->tuner_std = cx->std;
+ 
+-	cx18_init_on_first_open(cx);
++	retval = cx18_streams_setup(cx);
++	if (retval) {
++		CX18_ERR("Error %d setting up streams\n", retval);
++		goto free_irq;
++	}
++	retval = cx18_streams_register(cx);
++	if (retval) {
++		CX18_ERR("Error %d registering devices\n", retval);
++		goto free_streams;
++	}
+ 
+ 	CX18_INFO("Initialized card #%d: %s\n", cx->num, cx->card_name);
+ 
+@@ -889,7 +887,7 @@ static void cx18_remove(struct pci_dev *pci_dev)
+ 
+ 	/* Stop all captures */
+ 	CX18_DEBUG_INFO("Stopping all streams\n");
+-	if (atomic_read(&cx->capturing) > 0)
++	if (atomic_read(&cx->tot_capturing) > 0)
+ 		cx18_stop_all_captures(cx);
+ 
+ 	/* Interrupts */
+diff --git a/drivers/media/video/cx18/cx18-driver.h b/drivers/media/video/cx18/cx18-driver.h
+index a2a6c58..de14ab5 100644
+--- a/drivers/media/video/cx18/cx18-driver.h
++++ b/drivers/media/video/cx18/cx18-driver.h
+@@ -358,7 +358,7 @@ struct cx18 {
+ 	u32 v4l2_cap;		/* V4L2 capabilities of card */
+ 	u32 hw_flags; 		/* Hardware description of the board */
+ 	unsigned mdl_offset;
+-	struct cx18_scb *scb;   /* pointer to SCB */
++	struct cx18_scb __iomem *scb;   /* pointer to SCB */
+ 
+ 	struct cx18_av_state av_state;
+ 
+@@ -380,7 +380,8 @@ struct cx18 {
+ 	int stream_buf_size[CX18_MAX_STREAMS]; /* Stream buffer size */
+ 	struct cx18_stream streams[CX18_MAX_STREAMS]; 	/* Stream data */
+ 	unsigned long i_flags;  /* global cx18 flags */
+-	atomic_t capturing;	/* count number of active capture streams */
++	atomic_t ana_capturing;	/* count number of active analog capture streams */
++	atomic_t tot_capturing;	/* total count number of active capture streams */
+ 	spinlock_t lock;        /* lock access to this struct */
+ 	int search_pack_header;
+ 
+@@ -423,6 +424,10 @@ struct cx18 {
+ 	struct mutex i2c_bus_lock[2];
+ 	struct i2c_client *i2c_clients[I2C_CLIENTS_MAX];
+ 
++	/* gpio */
++	u32 gpio_dir;
++	u32 gpio_val;
++
+ 	/* v4l2 and User settings */
+ 
+ 	/* codec settings */
+diff --git a/drivers/media/video/cx18/cx18-fileops.c b/drivers/media/video/cx18/cx18-fileops.c
+index 0b3141d..1e537fe 100644
+--- a/drivers/media/video/cx18/cx18-fileops.c
++++ b/drivers/media/video/cx18/cx18-fileops.c
+@@ -318,7 +318,7 @@ static ssize_t cx18_read(struct cx18_stream *s, char __user *ubuf,
+ 	size_t tot_written = 0;
+ 	int single_frame = 0;
+ 
+-	if (atomic_read(&cx->capturing) == 0 && s->id == -1) {
++	if (atomic_read(&cx->ana_capturing) == 0 && s->id == -1) {
+ 		/* shouldn't happen */
+ 		CX18_DEBUG_WARN("Stream %s not initialized before read\n",
+ 				s->name);
+@@ -361,7 +361,8 @@ static ssize_t cx18_read(struct cx18_stream *s, char __user *ubuf,
+ 				cx18_enqueue(s, buf, &s->q_free);
+ 				cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5,
+ 					s->handle,
+-					(void *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem,
++					(void __iomem *)&cx->scb->cpu_mdl[buf->id] -
++					  cx->enc_mem,
+ 					1, buf->id, s->buf_size);
+ 			} else
+ 				cx18_enqueue(s, buf, &s->q_io);
+@@ -581,7 +582,7 @@ int cx18_v4l2_close(struct inode *inode, struct file *filp)
+ 		cx18_call_i2c_clients(cx, VIDIOC_S_STD, &cx->std);
+ 		/* Select correct audio input (i.e. TV tuner or Line in) */
+ 		cx18_audio_set_io(cx);
+-		if (atomic_read(&cx->capturing) > 0) {
++		if (atomic_read(&cx->ana_capturing) > 0) {
+ 			/* Undo video mute */
+ 			cx18_vapi(cx, CX18_CPU_SET_VIDEO_MUTE, 2, s->handle,
+ 				cx->params.video_mute |
+@@ -627,7 +628,7 @@ static int cx18_serialized_open(struct cx18_stream *s, struct file *filp)
+ 		}
+ 
+ 		if (!test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) {
+-			if (atomic_read(&cx->capturing) > 0) {
++			if (atomic_read(&cx->ana_capturing) > 0) {
+ 				/* switching to radio while capture is
+ 				   in progress is not polite */
+ 				cx18_release_stream(s);
+@@ -694,7 +695,7 @@ int cx18_v4l2_open(struct inode *inode, struct file *filp)
+ 
+ void cx18_mute(struct cx18 *cx)
+ {
+-	if (atomic_read(&cx->capturing))
++	if (atomic_read(&cx->ana_capturing))
+ 		cx18_vapi(cx, CX18_CPU_SET_AUDIO_MUTE, 2,
+ 				cx18_find_handle(cx), 1);
+ 	CX18_DEBUG_INFO("Mute\n");
+@@ -702,7 +703,7 @@ void cx18_mute(struct cx18 *cx)
+ 
+ void cx18_unmute(struct cx18 *cx)
+ {
+-	if (atomic_read(&cx->capturing)) {
++	if (atomic_read(&cx->ana_capturing)) {
+ 		cx18_msleep_timeout(100, 0);
+ 		cx18_vapi(cx, CX18_CPU_SET_MISC_PARAMETERS, 2,
+ 				cx18_find_handle(cx), 12);
+diff --git a/drivers/media/video/cx18/cx18-gpio.c b/drivers/media/video/cx18/cx18-gpio.c
+index bb8bc86..ceb6365 100644
+--- a/drivers/media/video/cx18/cx18-gpio.c
++++ b/drivers/media/video/cx18/cx18-gpio.c
+@@ -35,9 +35,6 @@
+ #define CX18_REG_GPIO_OUT2   0xc78104
+ #define CX18_REG_GPIO_DIR2   0xc7810c
+ 
+-static u32 gpio_dir;
+-static u32 gpio_val;
+-
+ /*
+  * HVR-1600 GPIO pins, courtesy of Hauppauge:
+  *
+@@ -49,24 +46,29 @@ static u32 gpio_val;
+ 
+ static void gpio_write(struct cx18 *cx)
+ {
+-	write_reg((gpio_dir & 0xffff) << 16, CX18_REG_GPIO_DIR1);
+-	write_reg(((gpio_dir & 0xffff) << 16) | (gpio_val & 0xffff),
++	u32 dir = cx->gpio_dir;
++	u32 val = cx->gpio_val;
++
++	write_reg((dir & 0xffff) << 16, CX18_REG_GPIO_DIR1);
++	write_reg(((dir & 0xffff) << 16) | (val & 0xffff),
+ 			CX18_REG_GPIO_OUT1);
+-	write_reg(gpio_dir & 0xffff0000, CX18_REG_GPIO_DIR2);
+-	write_reg((gpio_dir & 0xffff0000) | ((gpio_val & 0xffff0000) >> 16),
++	write_reg(dir & 0xffff0000, CX18_REG_GPIO_DIR2);
++	write_reg((dir & 0xffff0000) | ((val & 0xffff0000) >> 16),
+ 			CX18_REG_GPIO_OUT2);
+ }
+ 
+ void cx18_gpio_init(struct cx18 *cx)
+ {
+-	gpio_dir = cx->card->gpio_init.direction;
+-	gpio_val = cx->card->gpio_init.initial_value;
++	cx->gpio_dir = cx->card->gpio_init.direction;
++	cx->gpio_val = cx->card->gpio_init.initial_value;
+ 
+-	if (gpio_dir == 0)
+-		return;
++	if (cx->card->tuners[0].tuner == TUNER_XC2028) {
++		cx->gpio_dir |= 1 << cx->card->xceive_pin;
++		cx->gpio_val |= 1 << cx->card->xceive_pin;
++	}
+ 
+-	gpio_dir |= 1 << cx->card->xceive_pin;
+-	gpio_val |= 1 << cx->card->xceive_pin;
++	if (cx->gpio_dir == 0)
++		return;
+ 
+ 	CX18_DEBUG_INFO("GPIO initial dir: %08x/%08x out: %08x/%08x\n",
+ 		   read_reg(CX18_REG_GPIO_DIR1), read_reg(CX18_REG_GPIO_DIR2),
+@@ -86,13 +88,12 @@ int cx18_reset_tuner_gpio(void *dev, int cmd, int value)
+ 		return 0;
+ 	CX18_DEBUG_INFO("Resetting tuner\n");
+ 
+-	gpio_dir |= 1 << cx->card->xceive_pin;
+-	gpio_val &= ~(1 << cx->card->xceive_pin);
++	cx->gpio_val &= ~(1 << cx->card->xceive_pin);
+ 
+ 	gpio_write(cx);
+ 	schedule_timeout_interruptible(msecs_to_jiffies(1));
+ 
+-	gpio_val |= 1 << cx->card->xceive_pin;
++	cx->gpio_val |= 1 << cx->card->xceive_pin;
+ 	gpio_write(cx);
+ 	schedule_timeout_interruptible(msecs_to_jiffies(1));
+ 	return 0;
+diff --git a/drivers/media/video/cx18/cx18-ioctl.c b/drivers/media/video/cx18/cx18-ioctl.c
+index dbdcb86..4151f1e 100644
+--- a/drivers/media/video/cx18/cx18-ioctl.c
++++ b/drivers/media/video/cx18/cx18-ioctl.c
+@@ -247,7 +247,7 @@ static int cx18_try_or_set_fmt(struct cx18 *cx, int streamtype,
+ 
+ 		if (!set_fmt || (cx->params.width == w && cx->params.height == h))
+ 			return 0;
+-		if (atomic_read(&cx->capturing) > 0)
++		if (atomic_read(&cx->ana_capturing) > 0)
+ 			return -EBUSY;
+ 
+ 		cx->params.width = w;
+@@ -264,7 +264,7 @@ static int cx18_try_or_set_fmt(struct cx18 *cx, int streamtype,
+ 	if (fmt->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
+ 		if (set_fmt && streamtype == CX18_ENC_STREAM_TYPE_VBI &&
+ 		    cx->vbi.sliced_in->service_set &&
+-		    atomic_read(&cx->capturing) > 0)
++		    atomic_read(&cx->ana_capturing) > 0)
+ 			return -EBUSY;
+ 		if (set_fmt) {
+ 			cx->vbi.sliced_in->service_set = 0;
+@@ -293,7 +293,7 @@ static int cx18_try_or_set_fmt(struct cx18 *cx, int streamtype,
+ 		return 0;
+ 	if (set == 0)
+ 		return -EINVAL;
+-	if (atomic_read(&cx->capturing) > 0 && cx->vbi.sliced_in->service_set == 0)
++	if (atomic_read(&cx->ana_capturing) > 0 && cx->vbi.sliced_in->service_set == 0)
+ 		return -EBUSY;
+ 	cx18_av_cmd(cx, VIDIOC_S_FMT, fmt);
+ 	memcpy(cx->vbi.sliced_in, vbifmt, sizeof(*cx->vbi.sliced_in));
+@@ -581,7 +581,7 @@ int cx18_v4l2_ioctls(struct cx18 *cx, struct file *filp, unsigned cmd, void *arg
+ 			break;
+ 
+ 		if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags) ||
+-		    atomic_read(&cx->capturing) > 0) {
++		    atomic_read(&cx->ana_capturing) > 0) {
+ 			/* Switching standard would turn off the radio or mess
+ 			   with already running streams, prevent that by
+ 			   returning EBUSY. */
+@@ -677,7 +677,7 @@ int cx18_v4l2_ioctls(struct cx18 *cx, struct file *filp, unsigned cmd, void *arg
+ 			enc->flags = 0;
+ 			if (try)
+ 				return 0;
+-			if (!atomic_read(&cx->capturing))
++			if (!atomic_read(&cx->ana_capturing))
+ 				return -EPERM;
+ 			if (test_and_set_bit(CX18_F_I_ENC_PAUSED, &cx->i_flags))
+ 				return 0;
+@@ -689,7 +689,7 @@ int cx18_v4l2_ioctls(struct cx18 *cx, struct file *filp, unsigned cmd, void *arg
+ 			enc->flags = 0;
+ 			if (try)
+ 				return 0;
+-			if (!atomic_read(&cx->capturing))
++			if (!atomic_read(&cx->ana_capturing))
+ 				return -EPERM;
+ 			if (!test_and_clear_bit(CX18_F_I_ENC_PAUSED, &cx->i_flags))
+ 				return 0;
+diff --git a/drivers/media/video/cx18/cx18-irq.c b/drivers/media/video/cx18/cx18-irq.c
+index 6e14f8b..25114a5 100644
+--- a/drivers/media/video/cx18/cx18-irq.c
++++ b/drivers/media/video/cx18/cx18-irq.c
+@@ -75,7 +75,7 @@ static void epu_dma_done(struct cx18 *cx, struct cx18_mailbox *mb)
+ 
+ 			cx18_buf_sync_for_device(s, buf);
+ 			cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, s->handle,
+-			    (void *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem,
++			    (void __iomem *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem,
+ 			    1, buf->id, s->buf_size);
+ 		} else
+ 			set_bit(CX18_F_B_NEED_BUF_SWAP, &buf->b_flags);
+@@ -161,13 +161,15 @@ irqreturn_t cx18_irq_handler(int irq, void *dev_id)
+ 	*/
+ 
+ 	if (sw2) {
+-		if (sw2 & (cx->scb->cpu2hpu_irq_ack | cx->scb->cpu2epu_irq_ack))
++		if (sw2 & (readl(&cx->scb->cpu2hpu_irq_ack) |
++			   readl(&cx->scb->cpu2epu_irq_ack)))
+ 			wake_up(&cx->mb_cpu_waitq);
+-		if (sw2 & (cx->scb->apu2hpu_irq_ack | cx->scb->apu2epu_irq_ack))
++		if (sw2 & (readl(&cx->scb->apu2hpu_irq_ack) |
++			   readl(&cx->scb->apu2epu_irq_ack)))
+ 			wake_up(&cx->mb_apu_waitq);
+-		if (sw2 & cx->scb->epu2hpu_irq_ack)
++		if (sw2 & readl(&cx->scb->epu2hpu_irq_ack))
+ 			wake_up(&cx->mb_epu_waitq);
+-		if (sw2 & cx->scb->hpu2epu_irq_ack)
++		if (sw2 & readl(&cx->scb->hpu2epu_irq_ack))
+ 			wake_up(&cx->mb_hpu_waitq);
+ 	}
+ 
+diff --git a/drivers/media/video/cx18/cx18-mailbox.c b/drivers/media/video/cx18/cx18-mailbox.c
+index 0c5f328..2a5ccef 100644
+--- a/drivers/media/video/cx18/cx18-mailbox.c
++++ b/drivers/media/video/cx18/cx18-mailbox.c
+@@ -94,10 +94,10 @@ static const struct cx18_api_info *find_api_info(u32 cmd)
+ 	return NULL;
+ }
+ 
+-static struct cx18_mailbox *cx18_mb_is_complete(struct cx18 *cx, int rpu,
++static struct cx18_mailbox __iomem *cx18_mb_is_complete(struct cx18 *cx, int rpu,
+ 		u32 *state, u32 *irq, u32 *req)
+ {
+-	struct cx18_mailbox *mb = NULL;
++	struct cx18_mailbox __iomem *mb = NULL;
+ 	int wait_count = 0;
+ 	u32 ack;
+ 
+@@ -142,7 +142,7 @@ static struct cx18_mailbox *cx18_mb_is_complete(struct cx18 *cx, int rpu,
+ long cx18_mb_ack(struct cx18 *cx, const struct cx18_mailbox *mb)
+ {
+ 	const struct cx18_api_info *info = find_api_info(mb->cmd);
+-	struct cx18_mailbox *ack_mb;
++	struct cx18_mailbox __iomem *ack_mb;
+ 	u32 ack_irq;
+ 	u8 rpu = CPU;
+ 
+@@ -182,7 +182,7 @@ static int cx18_api_call(struct cx18 *cx, u32 cmd, int args, u32 data[])
+ {
+ 	const struct cx18_api_info *info = find_api_info(cmd);
+ 	u32 state = 0, irq = 0, req, oldreq, err;
+-	struct cx18_mailbox *mb;
++	struct cx18_mailbox __iomem *mb;
+ 	wait_queue_head_t *waitq;
+ 	int timeout = 100;
+ 	int cnt = 0;
+diff --git a/drivers/media/video/cx18/cx18-streams.c b/drivers/media/video/cx18/cx18-streams.c
+index 4ca9d84..1b921a3 100644
+--- a/drivers/media/video/cx18/cx18-streams.c
++++ b/drivers/media/video/cx18/cx18-streams.c
+@@ -36,12 +36,13 @@
+ #define CX18_DSP0_INTERRUPT_MASK     	0xd0004C
+ 
+ static struct file_operations cx18_v4l2_enc_fops = {
+-      .owner = THIS_MODULE,
+-      .read = cx18_v4l2_read,
+-      .open = cx18_v4l2_open,
+-      .ioctl = cx18_v4l2_ioctl,
+-      .release = cx18_v4l2_close,
+-      .poll = cx18_v4l2_enc_poll,
++	.owner = THIS_MODULE,
++	.read = cx18_v4l2_read,
++	.open = cx18_v4l2_open,
++	.ioctl = cx18_v4l2_ioctl,
++	.compat_ioctl = v4l_compat_ioctl32,
++	.release = cx18_v4l2_close,
++	.poll = cx18_v4l2_enc_poll,
+ };
+ 
+ /* offset from 0 to register ts v4l2 minors on */
+@@ -443,7 +444,7 @@ int cx18_start_v4l2_encode_stream(struct cx18_stream *s)
+ 	s->handle = data[0];
+ 	cx18_vapi(cx, CX18_CPU_SET_CHANNEL_TYPE, 2, s->handle, captype);
+ 
+-	if (atomic_read(&cx->capturing) == 0 && !ts) {
++	if (atomic_read(&cx->ana_capturing) == 0 && !ts) {
+ 		/* Stuff from Windows, we don't know what it is */
+ 		cx18_vapi(cx, CX18_CPU_SET_VER_CROP_LINE, 2, s->handle, 0);
+ 		cx18_vapi(cx, CX18_CPU_SET_MISC_PARAMETERS, 3, s->handle, 3, 1);
+@@ -466,14 +467,14 @@ int cx18_start_v4l2_encode_stream(struct cx18_stream *s)
+ 		cx2341x_update(cx, cx18_api_func, NULL, &cx->params);
+ 	}
+ 
+-	if (atomic_read(&cx->capturing) == 0) {
++	if (atomic_read(&cx->tot_capturing) == 0) {
+ 		clear_bit(CX18_F_I_EOS, &cx->i_flags);
+ 		write_reg(7, CX18_DSP0_INTERRUPT_MASK);
+ 	}
+ 
+ 	cx18_vapi(cx, CX18_CPU_DE_SET_MDL_ACK, 3, s->handle,
+-		(void *)&cx->scb->cpu_mdl_ack[s->type][0] - cx->enc_mem,
+-		(void *)&cx->scb->cpu_mdl_ack[s->type][1] - cx->enc_mem);
++		(void __iomem *)&cx->scb->cpu_mdl_ack[s->type][0] - cx->enc_mem,
++		(void __iomem *)&cx->scb->cpu_mdl_ack[s->type][1] - cx->enc_mem);
+ 
+ 	list_for_each(p, &s->q_free.list) {
+ 		struct cx18_buffer *buf = list_entry(p, struct cx18_buffer, list);
+@@ -481,8 +482,8 @@ int cx18_start_v4l2_encode_stream(struct cx18_stream *s)
+ 		writel(buf->dma_handle, &cx->scb->cpu_mdl[buf->id].paddr);
+ 		writel(s->buf_size, &cx->scb->cpu_mdl[buf->id].length);
+ 		cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, s->handle,
+-			(void *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem, 1,
+-			buf->id, s->buf_size);
++			(void __iomem *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem,
++			1, buf->id, s->buf_size);
+ 	}
+ 	/* begin_capture */
+ 	if (cx18_vapi(cx, CX18_CPU_CAPTURE_START, 1, s->handle)) {
+@@ -492,7 +493,9 @@ int cx18_start_v4l2_encode_stream(struct cx18_stream *s)
+ 	}
+ 
+ 	/* you're live! sit back and await interrupts :) */
+-	atomic_inc(&cx->capturing);
++	if (!ts)
++		atomic_inc(&cx->ana_capturing);
++	atomic_inc(&cx->tot_capturing);
+ 	return 0;
+ }
+ 
+@@ -523,7 +526,7 @@ int cx18_stop_v4l2_encode_stream(struct cx18_stream *s, int gop_end)
+ 
+ 	CX18_DEBUG_INFO("Stop Capture\n");
+ 
+-	if (atomic_read(&cx->capturing) == 0)
++	if (atomic_read(&cx->tot_capturing) == 0)
+ 		return 0;
+ 
+ 	if (s->type == CX18_ENC_STREAM_TYPE_MPG)
+@@ -537,7 +540,9 @@ int cx18_stop_v4l2_encode_stream(struct cx18_stream *s, int gop_end)
+ 		CX18_INFO("ignoring gop_end: not (yet?) supported by the firmware\n");
+ 	}
+ 
+-	atomic_dec(&cx->capturing);
++	if (s->type != CX18_ENC_STREAM_TYPE_TS)
++		atomic_dec(&cx->ana_capturing);
++	atomic_dec(&cx->tot_capturing);
+ 
+ 	/* Clear capture and no-read bits */
+ 	clear_bit(CX18_F_S_STREAMING, &s->s_flags);
+@@ -545,7 +550,7 @@ int cx18_stop_v4l2_encode_stream(struct cx18_stream *s, int gop_end)
+ 	cx18_vapi(cx, CX18_DESTROY_TASK, 1, s->handle);
+ 	s->handle = 0xffffffff;
+ 
+-	if (atomic_read(&cx->capturing) > 0)
++	if (atomic_read(&cx->tot_capturing) > 0)
+ 		return 0;
+ 
+ 	write_reg(5, CX18_DSP0_INTERRUPT_MASK);
+diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c
+index f24abcd..c4cc2f3 100644
+--- a/drivers/media/video/cx23885/cx23885-core.c
++++ b/drivers/media/video/cx23885/cx23885-core.c
+@@ -823,7 +823,7 @@ static void cx23885_dev_unregister(struct cx23885_dev *dev)
+ 	iounmap(dev->lmmio);
+ }
+ 
+-static u32* cx23885_risc_field(u32 *rp, struct scatterlist *sglist,
++static __le32* cx23885_risc_field(__le32 *rp, struct scatterlist *sglist,
+ 			       unsigned int offset, u32 sync_line,
+ 			       unsigned int bpl, unsigned int padding,
+ 			       unsigned int lines)
+@@ -883,7 +883,7 @@ int cx23885_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
+ 			unsigned int padding, unsigned int lines)
+ {
+ 	u32 instructions, fields;
+-	u32 *rp;
++	__le32 *rp;
+ 	int rc;
+ 
+ 	fields = 0;
+@@ -924,7 +924,7 @@ static int cx23885_risc_databuffer(struct pci_dev *pci,
+ 				   unsigned int lines)
+ {
+ 	u32 instructions;
+-	u32 *rp;
++	__le32 *rp;
+ 	int rc;
+ 
+ 	/* estimate risc mem: worst case is one write per page border +
+@@ -951,7 +951,7 @@ static int cx23885_risc_databuffer(struct pci_dev *pci,
+ int cx23885_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
+ 				u32 reg, u32 mask, u32 value)
+ {
+-	u32 *rp;
++	__le32 *rp;
+ 	int rc;
+ 
+ 	if ((rc = btcx_riscmem_alloc(pci, risc, 4*16)) < 0)
+diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c
+index aeba26d..fa6d398 100644
+--- a/drivers/media/video/cx88/cx88-cards.c
++++ b/drivers/media/video/cx88/cx88-cards.c
+@@ -1493,10 +1493,16 @@ static const struct cx88_board cx88_boards[] = {
+ 		},
+ 	},
+ 	[CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
+-		.name           = "PowerColor Real Angel 330",
++		.name           = "PowerColor RA330",	/* Long names may confuse LIRC. */
+ 		.tuner_type     = TUNER_XC2028,
+ 		.tuner_addr     = 0x61,
+ 		.input          = { {
++			.type   = CX88_VMUX_DEBUG,
++			.vmux   = 3,		/* Due to the way the cx88 driver is written,	*/
++			.gpio0 = 0x00ff,	/* there is no way to deactivate audio pass-	*/
++			.gpio1 = 0xf39d,	/* through without this entry. Furthermore, if	*/
++			.gpio3 = 0x0000,	/* the TV mux entry is first, you get audio	*/
++		}, {				/* from the tuner on boot for a little while.	*/
+ 			.type   = CX88_VMUX_TELEVISION,
+ 			.vmux   = 0,
+ 			.gpio0 = 0x00ff,
+@@ -2424,8 +2430,9 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
+ 
+ 	switch (core->boardnr) {
+ 	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
+-		/* Doesn't work with firmware version 2.7 */
+-		ctl->fname = "xc3028-v25.fw";
++		/* Now works with firmware version 2.7 */
++		if (core->i2c_algo.udelay < 16)
++			core->i2c_algo.udelay = 16;
+ 		break;
+ 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
+ 		ctl->scode_table = XC3028_FE_ZARLINK456;
+diff --git a/drivers/media/video/cx88/cx88-core.c b/drivers/media/video/cx88/cx88-core.c
+index c4d1aff..60eeda3 100644
+--- a/drivers/media/video/cx88/cx88-core.c
++++ b/drivers/media/video/cx88/cx88-core.c
+@@ -70,7 +70,7 @@ static DEFINE_MUTEX(devlist);
+ 
+ /* @lpi: lines per IRQ, or 0 to not generate irqs. Note: IRQ to be
+ 	 generated _after_ lpi lines are transferred. */
+-static u32* cx88_risc_field(u32 *rp, struct scatterlist *sglist,
++static __le32* cx88_risc_field(__le32 *rp, struct scatterlist *sglist,
+ 			    unsigned int offset, u32 sync_line,
+ 			    unsigned int bpl, unsigned int padding,
+ 			    unsigned int lines, unsigned int lpi)
+@@ -130,7 +130,7 @@ int cx88_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
+ 		     unsigned int bpl, unsigned int padding, unsigned int lines)
+ {
+ 	u32 instructions,fields;
+-	u32 *rp;
++	__le32 *rp;
+ 	int rc;
+ 
+ 	fields = 0;
+@@ -168,7 +168,7 @@ int cx88_risc_databuffer(struct pci_dev *pci, struct btcx_riscmem *risc,
+ 			 unsigned int lines, unsigned int lpi)
+ {
+ 	u32 instructions;
+-	u32 *rp;
++	__le32 *rp;
+ 	int rc;
+ 
+ 	/* estimate risc mem: worst case is one write per page border +
+@@ -193,7 +193,7 @@ int cx88_risc_databuffer(struct pci_dev *pci, struct btcx_riscmem *risc,
+ int cx88_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,
+ 		      u32 reg, u32 mask, u32 value)
+ {
+-	u32 *rp;
++	__le32 *rp;
+ 	int rc;
+ 
+ 	if ((rc = btcx_riscmem_alloc(pci, risc, 4*16)) < 0)
+diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c
+index 8996175..fb163ec 100644
+--- a/drivers/media/video/em28xx/em28xx-video.c
++++ b/drivers/media/video/em28xx/em28xx-video.c
+@@ -1166,13 +1166,13 @@ static int vidioc_g_register(struct file *file, void *priv,
+ 
+ 		reg->val = ret;
+ 	} else {
+-		u64 val = 0;
++		__le64 val = 0;
+ 		ret = em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS,
+ 						   reg->reg, (char *)&val, 2);
+ 		if (ret < 0)
+ 			return ret;
+ 
+-		reg->val = cpu_to_le64((__u64)val);
++		reg->val = le64_to_cpu(val);
+ 	}
+ 
+ 	return 0;
+@@ -1183,9 +1183,9 @@ static int vidioc_s_register(struct file *file, void *priv,
+ {
+ 	struct em28xx_fh      *fh  = priv;
+ 	struct em28xx         *dev = fh->dev;
+-	u64 buf;
++	__le64 buf;
+ 
+-	buf = le64_to_cpu((__u64)reg->val);
++	buf = cpu_to_le64(reg->val);
+ 
+ 	return em28xx_write_regs(dev, reg->reg, (char *)&buf,
+ 				 em28xx_reg_len(reg->reg));
+diff --git a/drivers/media/video/ivtv/ivtv-driver.h b/drivers/media/video/ivtv/ivtv-driver.h
+index ba06e81..9d23b1e 100644
+--- a/drivers/media/video/ivtv/ivtv-driver.h
++++ b/drivers/media/video/ivtv/ivtv-driver.h
+@@ -259,6 +259,12 @@ struct ivtv_mailbox_data {
+ 
+ /* Scatter-Gather array element, used in DMA transfers */
+ struct ivtv_sg_element {
++	__le32 src;
++	__le32 dst;
++	__le32 size;
++};
++
++struct ivtv_sg_host_element {
+ 	u32 src;
+ 	u32 dst;
+ 	u32 size;
+@@ -349,8 +355,8 @@ struct ivtv_stream {
+ 	u16 dma_xfer_cnt;
+ 
+ 	/* Base Dev SG Array for cx23415/6 */
+-	struct ivtv_sg_element *sg_pending;
+-	struct ivtv_sg_element *sg_processing;
++	struct ivtv_sg_host_element *sg_pending;
++	struct ivtv_sg_host_element *sg_processing;
+ 	struct ivtv_sg_element *sg_dma;
+ 	dma_addr_t sg_handle;
+ 	int sg_pending_size;
+diff --git a/drivers/media/video/ivtv/ivtv-fileops.c b/drivers/media/video/ivtv/ivtv-fileops.c
+index f2fa434..db813e0 100644
+--- a/drivers/media/video/ivtv/ivtv-fileops.c
++++ b/drivers/media/video/ivtv/ivtv-fileops.c
+@@ -587,7 +587,7 @@ retry:
+ 	since we may get here before the stream has been fully set-up */
+ 	if (mode == OUT_YUV && s->q_full.length == 0 && itv->dma_data_req_size) {
+ 		while (count >= itv->dma_data_req_size) {
+-			if (!ivtv_yuv_udma_stream_frame (itv, (void *)user_buf)) {
++			if (!ivtv_yuv_udma_stream_frame (itv, (void __user *)user_buf)) {
+ 				bytes_written += itv->dma_data_req_size;
+ 				user_buf += itv->dma_data_req_size;
+ 				count -= itv->dma_data_req_size;
+diff --git a/drivers/media/video/ivtv/ivtv-irq.c b/drivers/media/video/ivtv/ivtv-irq.c
+index d8ba3a4..fba150a 100644
+--- a/drivers/media/video/ivtv/ivtv-irq.c
++++ b/drivers/media/video/ivtv/ivtv-irq.c
+@@ -231,14 +231,14 @@ static void dma_post(struct ivtv_stream *s)
+ 	struct ivtv_buffer *buf = NULL;
+ 	struct list_head *p;
+ 	u32 offset;
+-	u32 *u32buf;
++	__le32 *u32buf;
+ 	int x = 0;
+ 
+ 	IVTV_DEBUG_HI_DMA("%s %s completed (%x)\n", ivtv_use_pio(s) ? "PIO" : "DMA",
+ 			s->name, s->dma_offset);
+ 	list_for_each(p, &s->q_dma.list) {
+ 		buf = list_entry(p, struct ivtv_buffer, list);
+-		u32buf = (u32 *)buf->buf;
++		u32buf = (__le32 *)buf->buf;
+ 
+ 		/* Sync Buffer */
+ 		ivtv_buf_sync_for_cpu(s, buf);
+@@ -444,7 +444,7 @@ static void ivtv_dma_enc_start(struct ivtv_stream *s)
+ 	}
+ 
+ 	s->dma_xfer_cnt++;
+-	memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_element) * s->sg_pending_size);
++	memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size);
+ 	s->sg_processing_size = s->sg_pending_size;
+ 	s->sg_pending_size = 0;
+ 	s->sg_processed = 0;
+@@ -473,7 +473,7 @@ static void ivtv_dma_dec_start(struct ivtv_stream *s)
+ 	if (s->q_predma.bytesused)
+ 		ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused);
+ 	s->dma_xfer_cnt++;
+-	memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_element) * s->sg_pending_size);
++	memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size);
+ 	s->sg_processing_size = s->sg_pending_size;
+ 	s->sg_pending_size = 0;
+ 	s->sg_processed = 0;
+diff --git a/drivers/media/video/ivtv/ivtv-queue.c b/drivers/media/video/ivtv/ivtv-queue.c
+index fc8b1ea..71bd13e 100644
+--- a/drivers/media/video/ivtv/ivtv-queue.c
++++ b/drivers/media/video/ivtv/ivtv-queue.c
+@@ -193,7 +193,7 @@ void ivtv_flush_queues(struct ivtv_stream *s)
+ int ivtv_stream_alloc(struct ivtv_stream *s)
+ {
+ 	struct ivtv *itv = s->itv;
+-	int SGsize = sizeof(struct ivtv_sg_element) * s->buffers;
++	int SGsize = sizeof(struct ivtv_sg_host_element) * s->buffers;
+ 	int i;
+ 
+ 	if (s->buffers == 0)
+diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c
+index c47c2b9..c854285 100644
+--- a/drivers/media/video/ivtv/ivtv-streams.c
++++ b/drivers/media/video/ivtv/ivtv-streams.c
+@@ -44,23 +44,25 @@
+ #include "ivtv-streams.h"
+ 
+ static const struct file_operations ivtv_v4l2_enc_fops = {
+-      .owner = THIS_MODULE,
+-      .read = ivtv_v4l2_read,
+-      .write = ivtv_v4l2_write,
+-      .open = ivtv_v4l2_open,
+-      .ioctl = ivtv_v4l2_ioctl,
+-      .release = ivtv_v4l2_close,
+-      .poll = ivtv_v4l2_enc_poll,
++	.owner = THIS_MODULE,
++	.read = ivtv_v4l2_read,
++	.write = ivtv_v4l2_write,
++	.open = ivtv_v4l2_open,
++	.ioctl = ivtv_v4l2_ioctl,
++	.compat_ioctl = v4l_compat_ioctl32,
++	.release = ivtv_v4l2_close,
++	.poll = ivtv_v4l2_enc_poll,
+ };
+ 
+ static const struct file_operations ivtv_v4l2_dec_fops = {
+-      .owner = THIS_MODULE,
+-      .read = ivtv_v4l2_read,
+-      .write = ivtv_v4l2_write,
+-      .open = ivtv_v4l2_open,
+-      .ioctl = ivtv_v4l2_ioctl,
+-      .release = ivtv_v4l2_close,
+-      .poll = ivtv_v4l2_dec_poll,
++	.owner = THIS_MODULE,
++	.read = ivtv_v4l2_read,
++	.write = ivtv_v4l2_write,
++	.open = ivtv_v4l2_open,
++	.ioctl = ivtv_v4l2_ioctl,
++	.compat_ioctl = v4l_compat_ioctl32,
++	.release = ivtv_v4l2_close,
++	.poll = ivtv_v4l2_dec_poll,
+ };
+ 
+ #define IVTV_V4L2_DEC_MPG_OFFSET  16	/* offset from 0 to register decoder mpg v4l2 minors on */
+diff --git a/drivers/media/video/ivtv/ivtv-version.h b/drivers/media/video/ivtv/ivtv-version.h
+index 02c5ab0..442f43f 100644
+--- a/drivers/media/video/ivtv/ivtv-version.h
++++ b/drivers/media/video/ivtv/ivtv-version.h
+@@ -22,8 +22,8 @@
+ 
+ #define IVTV_DRIVER_NAME "ivtv"
+ #define IVTV_DRIVER_VERSION_MAJOR 1
+-#define IVTV_DRIVER_VERSION_MINOR 2
+-#define IVTV_DRIVER_VERSION_PATCHLEVEL 1
++#define IVTV_DRIVER_VERSION_MINOR 3
++#define IVTV_DRIVER_VERSION_PATCHLEVEL 0
+ 
+ #define IVTV_VERSION __stringify(IVTV_DRIVER_VERSION_MAJOR) "." __stringify(IVTV_DRIVER_VERSION_MINOR) "." __stringify(IVTV_DRIVER_VERSION_PATCHLEVEL)
+ #define IVTV_DRIVER_VERSION KERNEL_VERSION(IVTV_DRIVER_VERSION_MAJOR,IVTV_DRIVER_VERSION_MINOR,IVTV_DRIVER_VERSION_PATCHLEVEL)
+diff --git a/drivers/media/video/ivtv/ivtv-yuv.c b/drivers/media/video/ivtv/ivtv-yuv.c
+index a9417f6..3092ff1 100644
+--- a/drivers/media/video/ivtv/ivtv-yuv.c
++++ b/drivers/media/video/ivtv/ivtv-yuv.c
+@@ -1116,7 +1116,7 @@ void ivtv_yuv_setup_stream_frame(struct ivtv *itv)
+ }
+ 
+ /* Attempt to dma a frame from a user buffer */
+-int ivtv_yuv_udma_stream_frame(struct ivtv *itv, void *src)
++int ivtv_yuv_udma_stream_frame(struct ivtv *itv, void __user *src)
+ {
+ 	struct yuv_playback_info *yi = &itv->yuv_info;
+ 	struct ivtv_dma_frame dma_args;
+diff --git a/drivers/media/video/ivtv/ivtv-yuv.h b/drivers/media/video/ivtv/ivtv-yuv.h
+index 2fe5f12..ca5173f 100644
+--- a/drivers/media/video/ivtv/ivtv-yuv.h
++++ b/drivers/media/video/ivtv/ivtv-yuv.h
+@@ -35,7 +35,7 @@ extern const u32 yuv_offset[IVTV_YUV_BUFFERS];
+ 
+ int ivtv_yuv_filter_check(struct ivtv *itv);
+ void ivtv_yuv_setup_stream_frame(struct ivtv *itv);
+-int ivtv_yuv_udma_stream_frame(struct ivtv *itv, void *src);
++int ivtv_yuv_udma_stream_frame(struct ivtv *itv, void __user *src);
+ void ivtv_yuv_frame_complete(struct ivtv *itv);
+ int ivtv_yuv_prep_frame(struct ivtv *itv, struct ivtv_dma_frame *args);
+ void ivtv_yuv_close(struct ivtv *itv);
+diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c
+index 1314522..81431ee 100644
+--- a/drivers/media/video/saa7134/saa7134-empress.c
++++ b/drivers/media/video/saa7134/saa7134-empress.c
+@@ -163,8 +163,7 @@ ts_mmap(struct file *file, struct vm_area_struct * vma)
+ static int empress_querycap(struct file *file, void  *priv,
+ 					struct v4l2_capability *cap)
+ {
+-	struct saa7134_fh *fh = priv;
+-	struct saa7134_dev *dev = fh->dev;
++	struct saa7134_dev *dev = file->private_data;
+ 
+ 	strcpy(cap->driver, "saa7134");
+ 	strlcpy(cap->card, saa7134_boards[dev->board].name,
+diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c
+index a0f7bc1..0d12ace 100644
+--- a/drivers/media/video/tuner-core.c
++++ b/drivers/media/video/tuner-core.c
+@@ -536,7 +536,7 @@ static void set_addr(struct i2c_client *c, struct tuner_setup *tun_setup)
+ static inline int check_mode(struct tuner *t, char *cmd)
+ {
+ 	if ((1 << t->mode & t->mode_mask) == 0) {
+-		return EINVAL;
++		return -EINVAL;
+ 	}
+ 
+ 	switch (t->mode) {
+@@ -730,11 +730,11 @@ static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode,
+ 
+ 	t->mode = mode;
+ 
+-	if (check_mode(t, cmd) == EINVAL) {
++	if (check_mode(t, cmd) == -EINVAL) {
+ 		t->mode = T_STANDBY;
+ 		if (analog_ops->standby)
+ 			analog_ops->standby(&t->fe);
+-		return EINVAL;
++		return -EINVAL;
+ 	}
+ 	return 0;
+ }
+@@ -776,13 +776,13 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 		break;
+ 	case AUDC_SET_RADIO:
+ 		if (set_mode(client, t, V4L2_TUNER_RADIO, "AUDC_SET_RADIO")
+-				== EINVAL)
++				== -EINVAL)
+ 			return 0;
+ 		if (t->radio_freq)
+ 			set_freq(client, t->radio_freq);
+ 		break;
+ 	case TUNER_SET_STANDBY:
+-		if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL)
++		if (check_mode(t, "TUNER_SET_STANDBY") == -EINVAL)
+ 			return 0;
+ 		t->mode = T_STANDBY;
+ 		if (analog_ops->standby)
+@@ -790,9 +790,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 		break;
+ #ifdef CONFIG_VIDEO_ALLOW_V4L1
+ 	case VIDIOCSAUDIO:
+-		if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
++		if (check_mode(t, "VIDIOCSAUDIO") == -EINVAL)
+ 			return 0;
+-		if (check_v4l2(t) == EINVAL)
++		if (check_v4l2(t) == -EINVAL)
+ 			return 0;
+ 
+ 		/* Should be implemented, since bttv calls it */
+@@ -810,10 +810,10 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 			};
+ 			struct video_channel *vc = arg;
+ 
+-			if (check_v4l2(t) == EINVAL)
++			if (check_v4l2(t) == -EINVAL)
+ 				return 0;
+ 
+-			if (set_mode(client,t,V4L2_TUNER_ANALOG_TV, "VIDIOCSCHAN")==EINVAL)
++			if (set_mode(client,t,V4L2_TUNER_ANALOG_TV, "VIDIOCSCHAN")==-EINVAL)
+ 				return 0;
+ 
+ 			if (vc->norm < ARRAY_SIZE(map))
+@@ -827,9 +827,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 		{
+ 			unsigned long *v = arg;
+ 
+-			if (check_mode(t, "VIDIOCSFREQ") == EINVAL)
++			if (check_mode(t, "VIDIOCSFREQ") == -EINVAL)
+ 				return 0;
+-			if (check_v4l2(t) == EINVAL)
++			if (check_v4l2(t) == -EINVAL)
+ 				return 0;
+ 
+ 			set_freq(client, *v);
+@@ -839,9 +839,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 		{
+ 			struct video_tuner *vt = arg;
+ 
+-			if (check_mode(t, "VIDIOCGTUNER") == EINVAL)
++			if (check_mode(t, "VIDIOCGTUNER") == -EINVAL)
+ 				return 0;
+-			if (check_v4l2(t) == EINVAL)
++			if (check_v4l2(t) == -EINVAL)
+ 				return 0;
+ 
+ 			if (V4L2_TUNER_RADIO == t->mode) {
+@@ -883,9 +883,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 		{
+ 			struct video_audio *va = arg;
+ 
+-			if (check_mode(t, "VIDIOCGAUDIO") == EINVAL)
++			if (check_mode(t, "VIDIOCGAUDIO") == -EINVAL)
+ 				return 0;
+-			if (check_v4l2(t) == EINVAL)
++			if (check_v4l2(t) == -EINVAL)
+ 				return 0;
+ 
+ 			if (V4L2_TUNER_RADIO == t->mode) {
+@@ -925,7 +925,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 			v4l2_std_id *id = arg;
+ 
+ 			if (set_mode (client, t, V4L2_TUNER_ANALOG_TV, "VIDIOC_S_STD")
+-					== EINVAL)
++					== -EINVAL)
+ 				return 0;
+ 
+ 			switch_v4l2();
+@@ -941,7 +941,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 			struct v4l2_frequency *f = arg;
+ 
+ 			if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY")
+-					== EINVAL)
++					== -EINVAL)
+ 				return 0;
+ 			switch_v4l2();
+ 			set_freq(client,f->frequency);
+@@ -952,7 +952,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 		{
+ 			struct v4l2_frequency *f = arg;
+ 
+-			if (check_mode(t, "VIDIOC_G_FREQUENCY") == EINVAL)
++			if (check_mode(t, "VIDIOC_G_FREQUENCY") == -EINVAL)
+ 				return 0;
+ 			switch_v4l2();
+ 			f->type = t->mode;
+@@ -973,7 +973,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 		{
+ 			struct v4l2_tuner *tuner = arg;
+ 
+-			if (check_mode(t, "VIDIOC_G_TUNER") == EINVAL)
++			if (check_mode(t, "VIDIOC_G_TUNER") == -EINVAL)
+ 				return 0;
+ 			switch_v4l2();
+ 
+@@ -1020,7 +1020,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
+ 		{
+ 			struct v4l2_tuner *tuner = arg;
+ 
+-			if (check_mode(t, "VIDIOC_S_TUNER") == EINVAL)
++			if (check_mode(t, "VIDIOC_S_TUNER") == -EINVAL)
+ 				return 0;
+ 
+ 			switch_v4l2();
+diff --git a/drivers/media/video/usbvideo/quickcam_messenger.c b/drivers/media/video/usbvideo/quickcam_messenger.c
+index 32e536e..3d26a30 100644
+--- a/drivers/media/video/usbvideo/quickcam_messenger.c
++++ b/drivers/media/video/usbvideo/quickcam_messenger.c
+@@ -210,7 +210,7 @@ static int qcm_stv_setb(struct usb_device *dev, u16 reg, u8 val)
+ 	return ret;
+ }
+ 
+-static int qcm_stv_setw(struct usb_device *dev, u16 reg, u16 val)
++static int qcm_stv_setw(struct usb_device *dev, u16 reg, __le16 val)
+ {
+ 	int ret;
+ 
+diff --git a/drivers/media/video/zoran.h b/drivers/media/video/zoran.h
+index 81cc3b0..46b7ad4 100644
+--- a/drivers/media/video/zoran.h
++++ b/drivers/media/video/zoran.h
+@@ -285,7 +285,7 @@ struct zoran_mapping {
+ 
+ struct zoran_jpg_buffer {
+ 	struct zoran_mapping *map;
+-	u32 *frag_tab;		/* addresses of frag table */
++	__le32 *frag_tab;		/* addresses of frag table */
+ 	u32 frag_tab_bus;	/* same value cached to save time in ISR */
+ 	enum zoran_buffer_state state;	/* non-zero if corresponding buffer is in use in grab queue */
+ 	struct zoran_sync bs;	/* DONE: info to return to application */
+@@ -450,7 +450,7 @@ struct zoran {
+ 	unsigned long jpg_queued_num;	/* count of frames queued since grab/play started */
+ 
+ 	/* zr36057's code buffer table */
+-	u32 *stat_com;		/* stat_com[i] is indexed by dma_head/tail & BUZ_MASK_STAT_COM */
++	__le32 *stat_com;		/* stat_com[i] is indexed by dma_head/tail & BUZ_MASK_STAT_COM */
+ 
+ 	/* (value & BUZ_MASK_FRAME) corresponds to index in pend[] queue */
+ 	int jpg_pend[BUZ_MAX_FRAME];
+diff --git a/drivers/media/video/zoran_device.c b/drivers/media/video/zoran_device.c
+index 37629ff..88d3697 100644
+--- a/drivers/media/video/zoran_device.c
++++ b/drivers/media/video/zoran_device.c
+@@ -1320,7 +1320,7 @@ error_handler (struct zoran *zr,
+ 			if (i) {
+ 				/* Rotate stat_comm entries to make current entry first */
+ 				int j;
+-				u32 bus_addr[BUZ_NUM_STAT_COM];
++				__le32 bus_addr[BUZ_NUM_STAT_COM];
+ 
+ 				/* Here we are copying the stat_com array, which
+ 				 * is already in little endian format, so
+diff --git a/drivers/media/video/zoran_driver.c b/drivers/media/video/zoran_driver.c
+index 345c77e..5394d7a 100644
+--- a/drivers/media/video/zoran_driver.c
++++ b/drivers/media/video/zoran_driver.c
+@@ -495,7 +495,7 @@ jpg_fbuffer_alloc (struct file *file)
+ 			jpg_fbuffer_free(file);
+ 			return -ENOBUFS;
+ 		}
+-		fh->jpg_buffers.buffer[i].frag_tab = (u32 *) mem;
++		fh->jpg_buffers.buffer[i].frag_tab = (__le32 *) mem;
+ 		fh->jpg_buffers.buffer[i].frag_tab_bus =
+ 		    virt_to_bus((void *) mem);
+ 
+@@ -1167,7 +1167,7 @@ zoran_close_end_session (struct file *file)
+ 
+ 	/* v4l capture */
+ 	if (fh->v4l_buffers.active != ZORAN_FREE) {
+-		long flags;
++		unsigned long flags;
+ 
+ 		spin_lock_irqsave(&zr->spinlock, flags);
+ 		zr36057_set_memgrab(zr, 0);
+@@ -3436,7 +3436,7 @@ zoran_do_ioctl (struct inode *inode,
+ 
+ 			/* unload capture */
+ 			if (zr->v4l_memgrab_active) {
+-				long flags;
++				unsigned long flags;
+ 
+ 				spin_lock_irqsave(&zr->spinlock, flags);
+ 				zr36057_set_memgrab(zr, 0);
+@@ -4375,7 +4375,7 @@ zoran_vm_close (struct vm_area_struct *vma)
+ 				mutex_lock(&zr->resource_lock);
+ 
+ 				if (fh->v4l_buffers.active != ZORAN_FREE) {
+-					long flags;
++					unsigned long flags;
+ 
+ 					spin_lock_irqsave(&zr->spinlock, flags);
+ 					zr36057_set_memgrab(zr, 0);
+@@ -4506,7 +4506,7 @@ zoran_mmap (struct file           *file,
+ 				if (todo > fraglen)
+ 					todo = fraglen;
+ 				pos =
+-				    le32_to_cpu((unsigned long) fh->jpg_buffers.
++				    le32_to_cpu(fh->jpg_buffers.
+ 				    buffer[i].frag_tab[2 * j]);
+ 				/* should just be pos on i386 */
+ 				page = virt_to_phys(bus_to_virt(pos))
+diff --git a/drivers/misc/fujitsu-laptop.c b/drivers/misc/fujitsu-laptop.c
+index e2e7c05..6d14e8f 100644
+--- a/drivers/misc/fujitsu-laptop.c
++++ b/drivers/misc/fujitsu-laptop.c
+@@ -352,3 +352,9 @@ MODULE_AUTHOR("Jonathan Woithe");
+ MODULE_DESCRIPTION("Fujitsu laptop extras support");
+ MODULE_VERSION(FUJITSU_DRIVER_VERSION);
+ MODULE_LICENSE("GPL");
++
++static struct pnp_device_id pnp_ids[] = {
++	{ .id = "FUJ02bf" },
++	{ .id = "" }
++};
++MODULE_DEVICE_TABLE(pnp, pnp_ids);
+diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
+index 91ded3e..f9ad960 100644
+--- a/drivers/mmc/card/block.c
++++ b/drivers/mmc/card/block.c
+@@ -46,7 +46,7 @@
+ #define MMC_SHIFT	3
+ #define MMC_NUM_MINORS	(256 >> MMC_SHIFT)
+ 
+-static unsigned long dev_use[MMC_NUM_MINORS/(8*sizeof(unsigned long))];
++static DECLARE_BITMAP(dev_use, MMC_NUM_MINORS);
+ 
+ /*
+  * There is one mmc_blk_data per slot.
+diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c
+index 25efd33..b402269 100644
+--- a/drivers/mtd/devices/m25p80.c
++++ b/drivers/mtd/devices/m25p80.c
+@@ -346,8 +346,10 @@ static int m25p80_write(struct mtd_info *mtd, loff_t to, size_t len,
+ 	mutex_lock(&flash->lock);
+ 
+ 	/* Wait until finished previous write command. */
+-	if (wait_till_ready(flash))
++	if (wait_till_ready(flash)) {
++		mutex_unlock(&flash->lock);
+ 		return 1;
++	}
+ 
+ 	write_enable(flash);
+ 
+diff --git a/drivers/mtd/maps/omap_nor.c b/drivers/mtd/maps/omap_nor.c
+index 240b0e2..c12d805 100644
+--- a/drivers/mtd/maps/omap_nor.c
++++ b/drivers/mtd/maps/omap_nor.c
+@@ -110,7 +110,7 @@ static int __init omapflash_probe(struct platform_device *pdev)
+ 	err = parse_mtd_partitions(info->mtd, part_probes, &info->parts, 0);
+ 	if (err > 0)
+ 		add_mtd_partitions(info->mtd, info->parts, err);
+-	else if (err < 0 && pdata->parts)
++	else if (err <= 0 && pdata->parts)
+ 		add_mtd_partitions(info->mtd, pdata->parts, pdata->nr_parts);
+ 	else
+ #endif
+diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
+index fceb468..fe2bc7e 100644
+--- a/drivers/mtd/nand/pxa3xx_nand.c
++++ b/drivers/mtd/nand/pxa3xx_nand.c
+@@ -1216,7 +1216,7 @@ static int pxa3xx_nand_resume(struct platform_device *pdev)
+ 
+ 	clk_enable(info->clk);
+ 
+-	return pxa3xx_nand_config_flash(info);
++	return pxa3xx_nand_config_flash(info, info->flash_info);
+ }
+ #else
+ #define pxa3xx_nand_suspend	NULL
+diff --git a/drivers/mtd/onenand/generic.c b/drivers/mtd/onenand/generic.c
+index 3d44d04..ad81ab8 100644
+--- a/drivers/mtd/onenand/generic.c
++++ b/drivers/mtd/onenand/generic.c
+@@ -76,7 +76,7 @@ static int __devinit generic_onenand_probe(struct device *dev)
+ 	err = parse_mtd_partitions(&info->mtd, part_probes, &info->parts, 0);
+ 	if (err > 0)
+ 		add_mtd_partitions(&info->mtd, info->parts, err);
+-	else if (err < 0 && pdata->parts)
++	else if (err <= 0 && pdata->parts)
+ 		add_mtd_partitions(&info->mtd, pdata->parts, pdata->nr_parts);
+ 	else
+ #endif
+diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c
+index 4747490..c5030f9 100644
+--- a/drivers/mtd/redboot.c
++++ b/drivers/mtd/redboot.c
+@@ -295,5 +295,5 @@ module_init(redboot_parser_init);
+ module_exit(redboot_parser_exit);
+ 
+ MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("Red Hat, Inc. - David Woodhouse <dwmw2 at cambridge.redhat.com>");
++MODULE_AUTHOR("David Woodhouse <dwmw2 at infradead.org>");
+ MODULE_DESCRIPTION("Parsing code for RedBoot Flash Image System (FIS) tables");
+diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c
+index 715a444..b2ccdcb 100644
+--- a/drivers/of/of_i2c.c
++++ b/drivers/of/of_i2c.c
+@@ -21,7 +21,6 @@ struct i2c_driver_device {
+ };
+ 
+ static struct i2c_driver_device i2c_devices[] = {
+-	{ "dallas,ds1374", "rtc-ds1374" },
+ };
+ 
+ static int of_find_i2c_driver(struct device_node *node,
+diff --git a/drivers/pnp/system.c b/drivers/pnp/system.c
+index 8f0a570..cf4e07b 100644
+--- a/drivers/pnp/system.c
++++ b/drivers/pnp/system.c
+@@ -81,7 +81,7 @@ static void reserve_resources_of_dev(struct pnp_dev *dev)
+ 	}
+ 
+ 	for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) {
+-		if (res->flags & IORESOURCE_DISABLED)
++		if (res->flags & (IORESOURCE_UNSET | IORESOURCE_DISABLED))
+ 			continue;
+ 
+ 		reserve_range(dev, res->start, res->end, 0);
+diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
+index 6cc2c03..60f8afc 100644
+--- a/drivers/rtc/Kconfig
++++ b/drivers/rtc/Kconfig
+@@ -534,4 +534,12 @@ config RTC_DRV_RS5C313
+ 	help
+ 	  If you say yes here you get support for the Ricoh RS5C313 RTC chips.
+ 
++config RTC_DRV_PPC
++       tristate "PowerPC machine dependent RTC support"
++       depends on PPC_MERGE
++       help
++	 The PowerPC kernel has machine-specific functions for accessing
++	 the RTC. This exposes that functionality through the generic RTC
++	 class.
++
+ endif # RTC_CLASS
+diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
+index 872f121..ebe871c 100644
+--- a/drivers/rtc/Makefile
++++ b/drivers/rtc/Makefile
+@@ -54,3 +54,4 @@ obj-$(CONFIG_RTC_DRV_TEST)	+= rtc-test.o
+ obj-$(CONFIG_RTC_DRV_V3020)	+= rtc-v3020.o
+ obj-$(CONFIG_RTC_DRV_VR41XX)	+= rtc-vr41xx.o
+ obj-$(CONFIG_RTC_DRV_X1205)	+= rtc-x1205.o
++obj-$(CONFIG_RTC_DRV_PPC)	+= rtc-ppc.o
+diff --git a/drivers/rtc/rtc-ds1374.c b/drivers/rtc/rtc-ds1374.c
+index fa2d2f8..640acd2 100644
+--- a/drivers/rtc/rtc-ds1374.c
++++ b/drivers/rtc/rtc-ds1374.c
+@@ -42,7 +42,7 @@
+ #define DS1374_REG_TCR		0x09 /* Trickle Charge */
+ 
+ static const struct i2c_device_id ds1374_id[] = {
+-	{ "rtc-ds1374", 0 },
++	{ "ds1374", 0 },
+ 	{ }
+ };
+ MODULE_DEVICE_TABLE(i2c, ds1374_id);
+diff --git a/drivers/rtc/rtc-ppc.c b/drivers/rtc/rtc-ppc.c
+new file mode 100644
+index 0000000..c8e97e2
+--- /dev/null
++++ b/drivers/rtc/rtc-ppc.c
+@@ -0,0 +1,69 @@
++/*
++ * RTC driver for ppc_md RTC functions
++ *
++ * © 2007 Red Hat, Inc.
++ *
++ * Author: David Woodhouse <dwmw2 at infradead.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++
++#include <linux/module.h>
++#include <linux/err.h>
++#include <linux/rtc.h>
++#include <linux/platform_device.h>
++#include <asm/machdep.h>
++
++static int ppc_rtc_read_time(struct device *dev, struct rtc_time *tm)
++{
++	ppc_md.get_rtc_time(tm);
++	return 0;
++}
++
++static int ppc_rtc_set_time(struct device *dev, struct rtc_time *tm)
++{
++	return ppc_md.set_rtc_time(tm);
++}
++
++static const struct rtc_class_ops ppc_rtc_ops = {
++	.set_time = ppc_rtc_set_time,
++	.read_time = ppc_rtc_read_time,
++};
++
++static struct rtc_device *rtc;
++static struct platform_device *ppc_rtc_pdev;
++
++static int __init ppc_rtc_init(void)
++{
++	if (!ppc_md.get_rtc_time || !ppc_md.set_rtc_time)
++		return -ENODEV;
++
++	ppc_rtc_pdev = platform_device_register_simple("ppc-rtc", 0, NULL, 0);
++	if (IS_ERR(ppc_rtc_pdev))
++		return PTR_ERR(ppc_rtc_pdev);
++
++	rtc = rtc_device_register("ppc_md", &ppc_rtc_pdev->dev,
++				  &ppc_rtc_ops, THIS_MODULE);
++	if (IS_ERR(rtc)) {
++		platform_device_unregister(ppc_rtc_pdev);
++		return PTR_ERR(rtc);
++	}
++
++	return 0;
++}
++
++static void __exit ppc_rtc_exit(void)
++{
++	rtc_device_unregister(rtc);
++	platform_device_unregister(ppc_rtc_pdev);
++}
++
++module_init(ppc_rtc_init);
++module_exit(ppc_rtc_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("David Woodhouse <dwmw2 at infradead.org>");
++MODULE_DESCRIPTION("Generic RTC class driver for PowerPC");
+diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c
+index c065a70..42be8b0 100644
+--- a/drivers/serial/atmel_serial.c
++++ b/drivers/serial/atmel_serial.c
+@@ -1318,7 +1318,7 @@ static void __init atmel_console_get_options(struct uart_port *port, int *baud,
+ 	 * If the baud rate generator isn't running, the port wasn't
+ 	 * initialized by the boot loader.
+ 	 */
+-	quot = UART_GET_BRGR(port);
++	quot = UART_GET_BRGR(port) & ATMEL_US_CD;
+ 	if (!quot)
+ 		return;
+ 
+diff --git a/drivers/serial/sb1250-duart.c b/drivers/serial/sb1250-duart.c
+index 2d6c08b..f8e1447 100644
+--- a/drivers/serial/sb1250-duart.c
++++ b/drivers/serial/sb1250-duart.c
+@@ -924,7 +924,7 @@ console_initcall(sbd_serial_console_init);
+ 
+ static struct uart_driver sbd_reg = {
+ 	.owner		= THIS_MODULE,
+-	.driver_name	= "serial",
++	.driver_name	= "sb1250_duart",
+ 	.dev_name	= "duart",
+ 	.major		= TTY_MAJOR,
+ 	.minor		= SB1250_DUART_MINOR_BASE,
+diff --git a/drivers/serial/ucc_uart.c b/drivers/serial/ucc_uart.c
+index 01917c4..566a8b4 100644
+--- a/drivers/serial/ucc_uart.c
++++ b/drivers/serial/ucc_uart.c
+@@ -195,7 +195,7 @@ struct uart_qe_port {
+ 
+ static struct uart_driver ucc_uart_driver = {
+ 	.owner  	= THIS_MODULE,
+-	.driver_name    = "serial",
++	.driver_name    = "ucc_uart",
+ 	.dev_name       = "ttyQE",
+ 	.major  	= SERIAL_QE_MAJOR,
+ 	.minor  	= SERIAL_QE_MINOR,
+diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
+index 41620c0..799337f 100644
+--- a/drivers/spi/spidev.c
++++ b/drivers/spi/spidev.c
+@@ -25,6 +25,7 @@
+ #include <linux/ioctl.h>
+ #include <linux/fs.h>
+ #include <linux/device.h>
++#include <linux/err.h>
+ #include <linux/list.h>
+ #include <linux/errno.h>
+ #include <linux/mutex.h>
+@@ -67,11 +68,12 @@ static unsigned long	minors[N_SPI_MINORS / BITS_PER_LONG];
+ 				| SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP)
+ 
+ struct spidev_data {
+-	struct device		dev;
++	dev_t			devt;
+ 	spinlock_t		spi_lock;
+ 	struct spi_device	*spi;
+ 	struct list_head	device_entry;
+ 
++	/* buffer is NULL unless this device is open (users > 0) */
+ 	struct mutex		buf_lock;
+ 	unsigned		users;
+ 	u8			*buffer;
+@@ -467,7 +469,7 @@ static int spidev_open(struct inode *inode, struct file *filp)
+ 	mutex_lock(&device_list_lock);
+ 
+ 	list_for_each_entry(spidev, &device_list, device_entry) {
+-		if (spidev->dev.devt == inode->i_rdev) {
++		if (spidev->devt == inode->i_rdev) {
+ 			status = 0;
+ 			break;
+ 		}
+@@ -500,10 +502,22 @@ static int spidev_release(struct inode *inode, struct file *filp)
+ 	mutex_lock(&device_list_lock);
+ 	spidev = filp->private_data;
+ 	filp->private_data = NULL;
++
++	/* last close? */
+ 	spidev->users--;
+ 	if (!spidev->users) {
++		int		dofree;
++
+ 		kfree(spidev->buffer);
+ 		spidev->buffer = NULL;
++
++		/* ... after we unbound from the underlying device? */
++		spin_lock_irq(&spidev->spi_lock);
++		dofree = (spidev->spi == NULL);
++		spin_unlock_irq(&spidev->spi_lock);
++
++		if (dofree)
++			kfree(spidev);
+ 	}
+ 	mutex_unlock(&device_list_lock);
+ 
+@@ -530,19 +544,7 @@ static struct file_operations spidev_fops = {
+  * It also simplifies memory management.
+  */
+ 
+-static void spidev_classdev_release(struct device *dev)
+-{
+-	struct spidev_data	*spidev;
+-
+-	spidev = container_of(dev, struct spidev_data, dev);
+-	kfree(spidev);
+-}
+-
+-static struct class spidev_class = {
+-	.name		= "spidev",
+-	.owner		= THIS_MODULE,
+-	.dev_release	= spidev_classdev_release,
+-};
++static struct class *spidev_class;
+ 
+ /*-------------------------------------------------------------------------*/
+ 
+@@ -570,20 +572,20 @@ static int spidev_probe(struct spi_device *spi)
+ 	mutex_lock(&device_list_lock);
+ 	minor = find_first_zero_bit(minors, N_SPI_MINORS);
+ 	if (minor < N_SPI_MINORS) {
+-		spidev->dev.parent = &spi->dev;
+-		spidev->dev.class = &spidev_class;
+-		spidev->dev.devt = MKDEV(SPIDEV_MAJOR, minor);
+-		snprintf(spidev->dev.bus_id, sizeof spidev->dev.bus_id,
++		struct device *dev;
++
++		spidev->devt = MKDEV(SPIDEV_MAJOR, minor);
++		dev = device_create(spidev_class, &spi->dev, spidev->devt,
+ 				"spidev%d.%d",
+ 				spi->master->bus_num, spi->chip_select);
+-		status = device_register(&spidev->dev);
++		status = IS_ERR(dev) ? PTR_ERR(dev) : 0;
+ 	} else {
+ 		dev_dbg(&spi->dev, "no minor number available!\n");
+ 		status = -ENODEV;
+ 	}
+ 	if (status == 0) {
+ 		set_bit(minor, minors);
+-		dev_set_drvdata(&spi->dev, spidev);
++		spi_set_drvdata(spi, spidev);
+ 		list_add(&spidev->device_entry, &device_list);
+ 	}
+ 	mutex_unlock(&device_list_lock);
+@@ -596,19 +598,21 @@ static int spidev_probe(struct spi_device *spi)
+ 
+ static int spidev_remove(struct spi_device *spi)
+ {
+-	struct spidev_data	*spidev = dev_get_drvdata(&spi->dev);
++	struct spidev_data	*spidev = spi_get_drvdata(spi);
+ 
+ 	/* make sure ops on existing fds can abort cleanly */
+ 	spin_lock_irq(&spidev->spi_lock);
+ 	spidev->spi = NULL;
++	spi_set_drvdata(spi, NULL);
+ 	spin_unlock_irq(&spidev->spi_lock);
+ 
+ 	/* prevent new opens */
+ 	mutex_lock(&device_list_lock);
+ 	list_del(&spidev->device_entry);
+-	dev_set_drvdata(&spi->dev, NULL);
+-	clear_bit(MINOR(spidev->dev.devt), minors);
+-	device_unregister(&spidev->dev);
++	device_destroy(spidev_class, spidev->devt);
++	clear_bit(MINOR(spidev->devt), minors);
++	if (spidev->users == 0)
++		kfree(spidev);
+ 	mutex_unlock(&device_list_lock);
+ 
+ 	return 0;
+@@ -644,15 +648,15 @@ static int __init spidev_init(void)
+ 	if (status < 0)
+ 		return status;
+ 
+-	status = class_register(&spidev_class);
+-	if (status < 0) {
++	spidev_class = class_create(THIS_MODULE, "spidev");
++	if (IS_ERR(spidev_class)) {
+ 		unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name);
+-		return status;
++		return PTR_ERR(spidev_class);
+ 	}
+ 
+ 	status = spi_register_driver(&spidev_spi);
+ 	if (status < 0) {
+-		class_unregister(&spidev_class);
++		class_destroy(spidev_class);
+ 		unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name);
+ 	}
+ 	return status;
+@@ -662,7 +666,7 @@ module_init(spidev_init);
+ static void __exit spidev_exit(void)
+ {
+ 	spi_unregister_driver(&spidev_spi);
+-	class_unregister(&spidev_class);
++	class_destroy(spidev_class);
+ 	unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name);
+ }
+ module_exit(spidev_exit);
+diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
+index 5fa8b76..97aff8d 100644
+--- a/drivers/video/console/fbcon.c
++++ b/drivers/video/console/fbcon.c
+@@ -2275,9 +2275,7 @@ static int fbcon_switch(struct vc_data *vc)
+ 	 * in fb_set_var()
+ 	 */
+ 	info->var.activate = var.activate;
+-	var.yoffset = info->var.yoffset;
+-	var.xoffset = info->var.xoffset;
+-	var.vmode = info->var.vmode;
++	var.vmode |= info->var.vmode & ~FB_VMODE_MASK;
+ 	fb_set_var(info, &var);
+ 	ops->var = info->var;
+ 
+diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
+index 4735621..d3c3af5 100644
+--- a/drivers/video/modedb.c
++++ b/drivers/video/modedb.c
+@@ -28,6 +28,7 @@
+ #endif
+ 
+ const char *fb_mode_option;
++EXPORT_SYMBOL_GPL(fb_mode_option);
+ 
+     /*
+      *  Standard video mode definitions (taken from XFree86)
+@@ -590,6 +591,7 @@ done:
+ 		    "", (margins) ? " with margins" : "", (interlace) ?
+ 		    " interlaced" : "");
+ 
++	    memset(&cvt_mode, 0, sizeof(cvt_mode));
+ 	    cvt_mode.xres = xres;
+ 	    cvt_mode.yres = yres;
+ 	    cvt_mode.refresh = (refresh) ? refresh : 60;
+diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
+index 55e8ee1..3263084 100644
+--- a/fs/Kconfig.binfmt
++++ b/fs/Kconfig.binfmt
+@@ -42,7 +42,7 @@ config BINFMT_ELF_FDPIC
+ 
+ config BINFMT_FLAT
+ 	bool "Kernel support for flat binaries"
+-	depends on !MMU
++	depends on !MMU && (!FRV || BROKEN)
+ 	help
+ 	  Support uClinux FLAT format binaries.
+ 
+diff --git a/fs/afs/callback.c b/fs/afs/callback.c
+index a78d5b2..587ef51 100644
+--- a/fs/afs/callback.c
++++ b/fs/afs/callback.c
+@@ -8,7 +8,7 @@
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  *
+- * Authors: David Woodhouse <dwmw2 at cambridge.redhat.com>
++ * Authors: David Woodhouse <dwmw2 at infradead.org>
+  *          David Howells <dhowells at redhat.com>
+  *
+  */
+diff --git a/fs/afs/inode.c b/fs/afs/inode.c
+index 08db82e..bb47217 100644
+--- a/fs/afs/inode.c
++++ b/fs/afs/inode.c
+@@ -8,7 +8,7 @@
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  *
+- * Authors: David Woodhouse <dwmw2 at cambridge.redhat.com>
++ * Authors: David Woodhouse <dwmw2 at infradead.org>
+  *          David Howells <dhowells at redhat.com>
+  *
+  */
+diff --git a/fs/afs/super.c b/fs/afs/super.c
+index 4b572b8..7e3faee 100644
+--- a/fs/afs/super.c
++++ b/fs/afs/super.c
+@@ -10,7 +10,7 @@
+  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  *
+  * Authors: David Howells <dhowells at redhat.com>
+- *          David Woodhouse <dwmw2 at redhat.com>
++ *          David Woodhouse <dwmw2 at infradead.org>
+  *
+  */
+ 
+diff --git a/fs/aio.c b/fs/aio.c
+index b5253e7..0fb3117 100644
+--- a/fs/aio.c
++++ b/fs/aio.c
+@@ -591,10 +591,6 @@ static void use_mm(struct mm_struct *mm)
+ 	atomic_inc(&mm->mm_count);
+ 	tsk->mm = mm;
+ 	tsk->active_mm = mm;
+-	/*
+-	 * Note that on UML this *requires* PF_BORROWED_MM to be set, otherwise
+-	 * it won't work. Update it accordingly if you change it here
+-	 */
+ 	switch_mm(active_mm, mm, tsk);
+ 	task_unlock(tsk);
+ 
+diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
+index ddd35d8..d051a32 100644
+--- a/fs/binfmt_elf_fdpic.c
++++ b/fs/binfmt_elf_fdpic.c
+@@ -390,7 +390,7 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm,
+ 	}
+ 
+ 	/* expand the stack mapping to use up the entire allocation granule */
+-	fullsize = ksize((char *) current->mm->start_brk);
++	fullsize = kobjsize((char *) current->mm->start_brk);
+ 	if (!IS_ERR_VALUE(do_mremap(current->mm->start_brk, stack_size,
+ 				    fullsize, 0, 0)))
+ 		stack_size = fullsize;
+diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
+index 3b40d45..2cb1acd 100644
+--- a/fs/binfmt_flat.c
++++ b/fs/binfmt_flat.c
+@@ -548,7 +548,7 @@ static int load_flat_file(struct linux_binprm * bprm,
+ 			PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0);
+ 		/* Remap to use all availabe slack region space */
+ 		if (realdatastart && (realdatastart < (unsigned long)-4096)) {
+-			reallen = ksize((void *)realdatastart);
++			reallen = kobjsize((void *)realdatastart);
+ 			if (reallen > len) {
+ 				realdatastart = do_mremap(realdatastart, len,
+ 					reallen, MREMAP_FIXED, realdatastart);
+@@ -600,7 +600,7 @@ static int load_flat_file(struct linux_binprm * bprm,
+ 			PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0);
+ 		/* Remap to use all availabe slack region space */
+ 		if (textpos && (textpos < (unsigned long) -4096)) {
+-			reallen = ksize((void *)textpos);
++			reallen = kobjsize((void *)textpos);
+ 			if (reallen > len) {
+ 				textpos = do_mremap(textpos, len, reallen,
+ 					MREMAP_FIXED, textpos);
+@@ -683,7 +683,7 @@ static int load_flat_file(struct linux_binprm * bprm,
+ 		 */
+ 		current->mm->start_brk = datapos + data_len + bss_len;
+ 		current->mm->brk = (current->mm->start_brk + 3) & ~3;
+-		current->mm->context.end_brk = memp + ksize((void *) memp) - stack_len;
++		current->mm->context.end_brk = memp + kobjsize((void *) memp) - stack_len;
+ 	}
+ 
+ 	if (flags & FLAT_FLAG_KTRACE)
+@@ -790,7 +790,7 @@ static int load_flat_file(struct linux_binprm * bprm,
+ 
+ 	/* zero the BSS,  BRK and stack areas */
+ 	memset((void*)(datapos + data_len), 0, bss_len + 
+-			(memp + ksize((void *) memp) - stack_len -	/* end brk */
++			(memp + kobjsize((void *) memp) - stack_len -	/* end brk */
+ 			libinfo->lib_list[id].start_brk) +		/* start brk */
+ 			stack_len);
+ 
+diff --git a/fs/block_dev.c b/fs/block_dev.c
+index 7d822fa..470c10c 100644
+--- a/fs/block_dev.c
++++ b/fs/block_dev.c
+@@ -12,6 +12,7 @@
+ #include <linux/kmod.h>
+ #include <linux/major.h>
+ #include <linux/smp_lock.h>
++#include <linux/device_cgroup.h>
+ #include <linux/highmem.h>
+ #include <linux/blkdev.h>
+ #include <linux/module.h>
+@@ -928,9 +929,14 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
+ {
+ 	struct module *owner = NULL;
+ 	struct gendisk *disk;
+-	int ret = -ENXIO;
++	int ret;
+ 	int part;
+ 
++	ret = devcgroup_inode_permission(bdev->bd_inode, file->f_mode);
++	if (ret != 0)
++		return ret;
++
++	ret = -ENXIO;
+ 	file->f_mapping = bdev->bd_inode->i_mapping;
+ 	lock_kernel();
+ 	disk = get_gendisk(bdev->bd_dev, &part);
+diff --git a/fs/cifs/asn1.c b/fs/cifs/asn1.c
+index cb52cbb..f58e41d 100644
+--- a/fs/cifs/asn1.c
++++ b/fs/cifs/asn1.c
+@@ -186,6 +186,11 @@ asn1_length_decode(struct asn1_ctx *ctx, unsigned int *def, unsigned int *len)
+ 			}
+ 		}
+ 	}
++
++	/* don't trust len bigger than ctx buffer */
++	if (*len > ctx->end - ctx->pointer)
++		return 0;
++
+ 	return 1;
+ }
+ 
+@@ -203,6 +208,10 @@ asn1_header_decode(struct asn1_ctx *ctx,
+ 	if (!asn1_length_decode(ctx, &def, &len))
+ 		return 0;
+ 
++	/* primitive shall be definite, indefinite shall be constructed */
++	if (*con == ASN1_PRI && !def)
++		return 0;
++
+ 	if (def)
+ 		*eoc = ctx->pointer + len;
+ 	else
+@@ -389,6 +398,11 @@ asn1_oid_decode(struct asn1_ctx *ctx,
+ 	unsigned long *optr;
+ 
+ 	size = eoc - ctx->pointer + 1;
++
++	/* first subid actually encodes first two subids */
++	if (size < 2 || size > ULONG_MAX/sizeof(unsigned long))
++		return 0;
++
+ 	*oid = kmalloc(size * sizeof(unsigned long), GFP_ATOMIC);
+ 	if (*oid == NULL)
+ 		return 0;
+diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h
+index 951ee33..c15c257 100644
+--- a/fs/ecryptfs/ecryptfs_kernel.h
++++ b/fs/ecryptfs/ecryptfs_kernel.h
+@@ -660,8 +660,6 @@ int ecryptfs_get_tfm_and_mutex_for_cipher_name(struct crypto_blkcipher **tfm,
+ int ecryptfs_keyring_auth_tok_for_sig(struct key **auth_tok_key,
+ 				      struct ecryptfs_auth_tok **auth_tok,
+ 				      char *sig);
+-int ecryptfs_write_zeros(struct file *file, pgoff_t index, int start,
+-			 int num_zeros);
+ int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,
+ 			 loff_t offset, size_t size);
+ int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode,
+diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c
+index ebf5515..75c2ea9 100644
+--- a/fs/ecryptfs/read_write.c
++++ b/fs/ecryptfs/read_write.c
+@@ -157,20 +157,6 @@ int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset,
+ 			       ecryptfs_page_idx, rc);
+ 			goto out;
+ 		}
+-		if (start_offset_in_page) {
+-			/* Read in the page from the lower
+-			 * into the eCryptfs inode page cache,
+-			 * decrypting */
+-			rc = ecryptfs_decrypt_page(ecryptfs_page);
+-			if (rc) {
+-				printk(KERN_ERR "%s: Error decrypting "
+-				       "page; rc = [%d]\n",
+-				       __func__, rc);
+-				ClearPageUptodate(ecryptfs_page);
+-				page_cache_release(ecryptfs_page);
+-				goto out;
+-			}
+-		}
+ 		ecryptfs_page_virt = kmap_atomic(ecryptfs_page, KM_USER0);
+ 
+ 		/*
+@@ -349,14 +335,6 @@ int ecryptfs_read(char *data, loff_t offset, size_t size,
+ 			       ecryptfs_page_idx, rc);
+ 			goto out;
+ 		}
+-		rc = ecryptfs_decrypt_page(ecryptfs_page);
+-		if (rc) {
+-			printk(KERN_ERR "%s: Error decrypting "
+-			       "page; rc = [%d]\n", __func__, rc);
+-			ClearPageUptodate(ecryptfs_page);
+-			page_cache_release(ecryptfs_page);
+-			goto out;
+-		}
+ 		ecryptfs_page_virt = kmap_atomic(ecryptfs_page, KM_USER0);
+ 		memcpy((data + data_offset),
+ 		       ((char *)ecryptfs_page_virt + start_offset_in_page),
+diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c
+index 28cfd0b..77278e9 100644
+--- a/fs/ext3/resize.c
++++ b/fs/ext3/resize.c
+@@ -580,7 +580,8 @@ static int reserve_backup_gdb(handle_t *handle, struct inode *inode,
+ 	}
+ 
+ 	blk = EXT3_SB(sb)->s_sbh->b_blocknr + 1 + EXT3_SB(sb)->s_gdb_count;
+-	data = (__le32 *)dind->b_data + EXT3_SB(sb)->s_gdb_count;
++	data = (__le32 *)dind->b_data + (EXT3_SB(sb)->s_gdb_count %
++					 EXT3_ADDR_PER_BLOCK(sb));
+ 	end = (__le32 *)dind->b_data + EXT3_ADDR_PER_BLOCK(sb);
+ 
+ 	/* Get each reserved primary GDT block and verify it holds backups */
+diff --git a/fs/libfs.c b/fs/libfs.c
+index b004dfa..892d41c 100644
+--- a/fs/libfs.c
++++ b/fs/libfs.c
+@@ -528,6 +528,23 @@ ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos,
+ 	return count;
+ }
+ 
++ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
++				const void *from, size_t available)
++{
++	loff_t pos = *ppos;
++
++	if (pos < 0)
++		return -EINVAL;
++	if (pos >= available)
++		return 0;
++	if (count > available - pos)
++		count = available - pos;
++	memcpy(to, from + pos, count);
++	*ppos = pos + count;
++
++	return count;
++}
++
+ /*
+  * Transaction based IO.
+  * The file expects a single write which triggers the transaction, and then
+@@ -800,6 +817,7 @@ EXPORT_SYMBOL(simple_statfs);
+ EXPORT_SYMBOL(simple_sync_file);
+ EXPORT_SYMBOL(simple_unlink);
+ EXPORT_SYMBOL(simple_read_from_buffer);
++EXPORT_SYMBOL(memory_read_from_buffer);
+ EXPORT_SYMBOL(simple_transaction_get);
+ EXPORT_SYMBOL(simple_transaction_read);
+ EXPORT_SYMBOL(simple_transaction_release);
+diff --git a/fs/proc/array.c b/fs/proc/array.c
+index 9e3b8c3..797d775 100644
+--- a/fs/proc/array.c
++++ b/fs/proc/array.c
+@@ -288,7 +288,7 @@ static void render_cap_t(struct seq_file *m, const char *header,
+ 	seq_printf(m, "%s", header);
+ 	CAP_FOR_EACH_U32(__capi) {
+ 		seq_printf(m, "%08x",
+-			   a->cap[(_LINUX_CAPABILITY_U32S-1) - __capi]);
++			   a->cap[(_KERNEL_CAPABILITY_U32S-1) - __capi]);
+ 	}
+ 	seq_printf(m, "\n");
+ }
+diff --git a/fs/proc/base.c b/fs/proc/base.c
+index c447e07..3b45537 100644
+--- a/fs/proc/base.c
++++ b/fs/proc/base.c
+@@ -127,6 +127,25 @@ struct pid_entry {
+ 		NULL, &proc_single_file_operations,	\
+ 		{ .proc_show = &proc_##OTYPE } )
+ 
++/*
++ * Count the number of hardlinks for the pid_entry table, excluding the .
++ * and .. links.
++ */
++static unsigned int pid_entry_count_dirs(const struct pid_entry *entries,
++	unsigned int n)
++{
++	unsigned int i;
++	unsigned int count;
++
++	count = 0;
++	for (i = 0; i < n; ++i) {
++		if (S_ISDIR(entries[i].mode))
++			++count;
++	}
++
++	return count;
++}
++
+ int maps_protect;
+ EXPORT_SYMBOL(maps_protect);
+ 
+@@ -2585,10 +2604,9 @@ static struct dentry *proc_pid_instantiate(struct inode *dir,
+ 	inode->i_op = &proc_tgid_base_inode_operations;
+ 	inode->i_fop = &proc_tgid_base_operations;
+ 	inode->i_flags|=S_IMMUTABLE;
+-	inode->i_nlink = 5;
+-#ifdef CONFIG_SECURITY
+-	inode->i_nlink += 1;
+-#endif
++
++	inode->i_nlink = 2 + pid_entry_count_dirs(tgid_base_stuff,
++		ARRAY_SIZE(tgid_base_stuff));
+ 
+ 	dentry->d_op = &pid_dentry_operations;
+ 
+@@ -2816,10 +2834,9 @@ static struct dentry *proc_task_instantiate(struct inode *dir,
+ 	inode->i_op = &proc_tid_base_inode_operations;
+ 	inode->i_fop = &proc_tid_base_operations;
+ 	inode->i_flags|=S_IMMUTABLE;
+-	inode->i_nlink = 4;
+-#ifdef CONFIG_SECURITY
+-	inode->i_nlink += 1;
+-#endif
++
++	inode->i_nlink = 2 + pid_entry_count_dirs(tid_base_stuff,
++		ARRAY_SIZE(tid_base_stuff));
+ 
+ 	dentry->d_op = &pid_dentry_operations;
+ 
+diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
+index 32dc14c..7e277f2 100644
+--- a/fs/proc/proc_misc.c
++++ b/fs/proc/proc_misc.c
+@@ -716,7 +716,7 @@ static ssize_t kpagecount_read(struct file *file, char __user *buf,
+ 	pfn = src / KPMSIZE;
+ 	count = min_t(size_t, count, (max_pfn * KPMSIZE) - src);
+ 	if (src & KPMMASK || count & KPMMASK)
+-		return -EIO;
++		return -EINVAL;
+ 
+ 	while (count > 0) {
+ 		ppage = NULL;
+@@ -726,7 +726,7 @@ static ssize_t kpagecount_read(struct file *file, char __user *buf,
+ 		if (!ppage)
+ 			pcount = 0;
+ 		else
+-			pcount = atomic_read(&ppage->_count);
++			pcount = page_mapcount(ppage);
+ 
+ 		if (put_user(pcount, out++)) {
+ 			ret = -EFAULT;
+@@ -782,7 +782,7 @@ static ssize_t kpageflags_read(struct file *file, char __user *buf,
+ 	pfn = src / KPMSIZE;
+ 	count = min_t(unsigned long, count, (max_pfn * KPMSIZE) - src);
+ 	if (src & KPMMASK || count & KPMMASK)
+-		return -EIO;
++		return -EINVAL;
+ 
+ 	while (count > 0) {
+ 		ppage = NULL;
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index 88717c0..1740362 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -496,7 +496,7 @@ const struct file_operations proc_clear_refs_operations = {
+ };
+ 
+ struct pagemapread {
+-	char __user *out, *end;
++	u64 __user *out, *end;
+ };
+ 
+ #define PM_ENTRY_BYTES      sizeof(u64)
+@@ -519,21 +519,11 @@ struct pagemapread {
+ static int add_to_pagemap(unsigned long addr, u64 pfn,
+ 			  struct pagemapread *pm)
+ {
+-	/*
+-	 * Make sure there's room in the buffer for an
+-	 * entire entry.  Otherwise, only copy part of
+-	 * the pfn.
+-	 */
+-	if (pm->out + PM_ENTRY_BYTES >= pm->end) {
+-		if (copy_to_user(pm->out, &pfn, pm->end - pm->out))
+-			return -EFAULT;
+-		pm->out = pm->end;
+-		return PM_END_OF_BUFFER;
+-	}
+-
+ 	if (put_user(pfn, pm->out))
+ 		return -EFAULT;
+-	pm->out += PM_ENTRY_BYTES;
++	pm->out++;
++	if (pm->out >= pm->end)
++		return PM_END_OF_BUFFER;
+ 	return 0;
+ }
+ 
+@@ -634,7 +624,7 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
+ 
+ 	ret = -EINVAL;
+ 	/* file position must be aligned */
+-	if (*ppos % PM_ENTRY_BYTES)
++	if ((*ppos % PM_ENTRY_BYTES) || (count % PM_ENTRY_BYTES))
+ 		goto out_task;
+ 
+ 	ret = 0;
+@@ -664,8 +654,8 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
+ 		goto out_pages;
+ 	}
+ 
+-	pm.out = buf;
+-	pm.end = buf + count;
++	pm.out = (u64 *)buf;
++	pm.end = (u64 *)(buf + count);
+ 
+ 	if (!ptrace_may_attach(task)) {
+ 		ret = -EIO;
+@@ -690,9 +680,9 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
+ 		if (ret == PM_END_OF_BUFFER)
+ 			ret = 0;
+ 		/* don't need mmap_sem for these, but this looks cleaner */
+-		*ppos += pm.out - buf;
++		*ppos += (char *)pm.out - buf;
+ 		if (!ret)
+-			ret = pm.out - buf;
++			ret = (char *)pm.out - buf;
+ 	}
+ 
+ out_pages:
+diff --git a/include/asm-arm/arch-at91/io.h b/include/asm-arm/arch-at91/io.h
+index 80073fd..f8beaa2 100644
+--- a/include/asm-arm/arch-at91/io.h
++++ b/include/asm-arm/arch-at91/io.h
+@@ -21,8 +21,6 @@
+ #ifndef __ASM_ARCH_IO_H
+ #define __ASM_ARCH_IO_H
+ 
+-#include <asm/io.h>
+-
+ #define IO_SPACE_LIMIT		0xFFFFFFFF
+ 
+ #define __io(a)			((void __iomem *)(a))
+diff --git a/include/asm-arm/arch-pxa/mfp-pxa27x.h b/include/asm-arm/arch-pxa/mfp-pxa27x.h
+index eb6eaa1..bc73ab8 100644
+--- a/include/asm-arm/arch-pxa/mfp-pxa27x.h
++++ b/include/asm-arm/arch-pxa/mfp-pxa27x.h
+@@ -112,6 +112,7 @@
+ #define GPIO57_nIOIS16		MFP_CFG_IN(GPIO57, AF1)
+ #define GPIO56_nPWAIT		MFP_CFG_IN(GPIO56, AF1)
+ #define GPIO79_PSKTSEL		MFP_CFG_OUT(GPIO79, AF1, DRIVE_HIGH)
++#define GPIO104_PSKTSEL		MFP_CFG_OUT(GPIO104, AF1, DRIVE_HIGH)
+ 
+ /* I2C */
+ #define GPIO117_I2C_SCL		MFP_CFG_IN(GPIO117, AF1)
+diff --git a/include/asm-arm/arch-pxa/pxa2xx-gpio.h b/include/asm-arm/arch-pxa/pxa2xx-gpio.h
+index 763313c..b81cd63 100644
+--- a/include/asm-arm/arch-pxa/pxa2xx-gpio.h
++++ b/include/asm-arm/arch-pxa/pxa2xx-gpio.h
+@@ -134,7 +134,11 @@
+ #define GPIO93_CIF_DD_6		93	/* Camera data pin 6 */
+ #define GPIO94_CIF_DD_5		94	/* Camera data pin 5 */
+ #define GPIO95_CIF_DD_4		95	/* Camera data pin 4 */
++#define GPIO96_FFRXD		96	/* FFUART recieve */
++#define GPIO98_FFRTS		98	/* FFUART request to send */
+ #define GPIO98_CIF_DD_0		98	/* Camera data pin 0 */
++#define GPIO99_FFTXD		99	/* FFUART transmit data */
++#define GPIO100_FFCTS		100	/* FFUART Clear to send */
+ #define GPIO102_nPCE_1		102	/* PCMCIA (PXA27x) */
+ #define GPIO103_CIF_DD_3	103	/* Camera data pin 3 */
+ #define GPIO104_CIF_DD_2	104	/* Camera data pin 2 */
+@@ -316,6 +320,8 @@
+ #define GPIO85_nPCE_1_MD	(85 | GPIO_ALT_FN_1_OUT)
+ #define GPIO85_CIF_LV_MD	(85 | GPIO_ALT_FN_3_IN)
+ #define GPIO86_nPCE_1_MD	(86 | GPIO_ALT_FN_1_OUT)
++#define GPIO88_USBH1_PWR_MD	(88 | GPIO_ALT_FN_1_IN)
++#define GPIO89_USBH1_PEN_MD	(89 | GPIO_ALT_FN_2_OUT)
+ #define GPIO90_CIF_DD_4_MD	(90 | GPIO_ALT_FN_3_IN)
+ #define GPIO91_CIF_DD_5_MD	(91 | GPIO_ALT_FN_3_IN)
+ #define GPIO92_MMCDAT0_MD	(92 | GPIO_ALT_FN_1_OUT)
+@@ -324,8 +330,11 @@
+ #define GPIO95_CIF_DD_4_MD	(95 | GPIO_ALT_FN_2_IN)
+ #define GPIO95_KP_MKIN6_MD	(95 | GPIO_ALT_FN_3_IN)
+ #define GPIO96_KP_DKIN3_MD	(96 | GPIO_ALT_FN_1_IN)
++#define GPIO96_FFRXD_MD		(96 | GPIO_ALT_FN_3_IN)
+ #define GPIO97_KP_MKIN3_MD	(97 | GPIO_ALT_FN_3_IN)
+ #define GPIO98_CIF_DD_0_MD	(98 | GPIO_ALT_FN_2_IN)
++#define GPIO98_FFRTS_MD		(98 | GPIO_ALT_FN_3_OUT)
++#define GPIO99_FFTXD_MD		(99 | GPIO_ALT_FN_3_OUT)
+ #define GPIO100_KP_MKIN0_MD	(100 | GPIO_ALT_FN_1_IN)
+ #define GPIO101_KP_MKIN1_MD	(101 | GPIO_ALT_FN_1_IN)
+ #define GPIO102_nPCE_1_MD	(102 | GPIO_ALT_FN_1_OUT)
+diff --git a/include/asm-arm/pgtable-nommu.h b/include/asm-arm/pgtable-nommu.h
+index 2e5868b..386fcc1 100644
+--- a/include/asm-arm/pgtable-nommu.h
++++ b/include/asm-arm/pgtable-nommu.h
+@@ -16,7 +16,6 @@
+ #include <linux/slab.h>
+ #include <asm/processor.h>
+ #include <asm/page.h>
+-#include <asm/io.h>
+ 
+ /*
+  * Trivial page table functions.
+diff --git a/include/asm-arm/spinlock.h b/include/asm-arm/spinlock.h
+index 800ba52..2b41ebb 100644
+--- a/include/asm-arm/spinlock.h
++++ b/include/asm-arm/spinlock.h
+@@ -142,7 +142,7 @@ static inline void __raw_write_unlock(raw_rwlock_t *rw)
+ }
+ 
+ /* write_can_lock - would write_trylock() succeed? */
+-#define __raw_write_can_lock(x)		((x)->lock == 0x80000000)
++#define __raw_write_can_lock(x)		((x)->lock == 0)
+ 
+ /*
+  * Read locks are a bit more hairy:
+diff --git a/include/asm-frv/checksum.h b/include/asm-frv/checksum.h
+index 9b16898..269da09 100644
+--- a/include/asm-frv/checksum.h
++++ b/include/asm-frv/checksum.h
+@@ -75,7 +75,7 @@ __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
+ 	    : "=r" (sum), "=r" (iph), "=r" (ihl), "=r" (inc), "=&r"(tmp)
+ 	    : "0" (sum), "1" (iph), "2" (ihl), "3" (4),
+ 	    "m"(*(volatile struct { int _[100]; } *)iph)
+-	    : "icc0", "icc1"
++	    : "icc0", "icc1", "memory"
+ 	    );
+ 
+ 	return (__force __sum16)~sum;
+diff --git a/include/asm-h8300/cacheflush.h b/include/asm-h8300/cacheflush.h
+index 71210d1..5ffdca2 100644
+--- a/include/asm-h8300/cacheflush.h
++++ b/include/asm-h8300/cacheflush.h
+@@ -3,7 +3,7 @@
+  */
+ 
+ #ifndef _ASM_H8300_CACHEFLUSH_H
+-#define _AMS_H8300_CACHEFLUSH_H
++#define _ASM_H8300_CACHEFLUSH_H
+ 
+ /*
+  * Cache handling functions
+diff --git a/include/asm-m32r/uaccess.h b/include/asm-m32r/uaccess.h
+index bd8c837..1c7047b 100644
+--- a/include/asm-m32r/uaccess.h
++++ b/include/asm-m32r/uaccess.h
+@@ -14,6 +14,7 @@
+ #include <linux/errno.h>
+ #include <linux/thread_info.h>
+ #include <asm/page.h>
++#include <asm/setup.h>
+ 
+ #define VERIFY_READ 0
+ #define VERIFY_WRITE 1
+@@ -106,7 +107,6 @@ static inline void set_fs(mm_segment_t s)
+ #else
+ static inline int access_ok(int type, const void *addr, unsigned long size)
+ {
+-	extern unsigned long memory_start, memory_end;
+ 	unsigned long val = (unsigned long)addr;
+ 
+ 	return ((val >= memory_start) && ((val + size) < memory_end));
+diff --git a/include/asm-mips/mach-au1x00/au1xxx_dbdma.h b/include/asm-mips/mach-au1x00/au1xxx_dbdma.h
+index ad17d7c..44a67bf 100644
+--- a/include/asm-mips/mach-au1x00/au1xxx_dbdma.h
++++ b/include/asm-mips/mach-au1x00/au1xxx_dbdma.h
+@@ -355,6 +355,7 @@ void au1xxx_dbdma_dump(u32 chanid);
+ u32 au1xxx_dbdma_put_dscr(u32 chanid, au1x_ddma_desc_t *dscr);
+ 
+ u32 au1xxx_ddma_add_device(dbdev_tab_t *dev);
++extern void au1xxx_ddma_del_device(u32 devid);
+ void *au1xxx_ddma_get_nextptr_virt(au1x_ddma_desc_t *dp);
+ 
+ /*
+diff --git a/include/asm-mips/mipsregs.h b/include/asm-mips/mipsregs.h
+index aa17f65..a46f8e2 100644
+--- a/include/asm-mips/mipsregs.h
++++ b/include/asm-mips/mipsregs.h
+@@ -765,6 +765,9 @@ do {									\
+ #define read_c0_index()		__read_32bit_c0_register($0, 0)
+ #define write_c0_index(val)	__write_32bit_c0_register($0, 0, val)
+ 
++#define read_c0_random()	__read_32bit_c0_register($1, 0)
++#define write_c0_random(val)	__write_32bit_c0_register($1, 0, val)
++
+ #define read_c0_entrylo0()	__read_ulong_c0_register($2, 0)
+ #define write_c0_entrylo0(val)	__write_ulong_c0_register($2, 0, val)
+ 
+diff --git a/include/asm-mips/pgtable.h b/include/asm-mips/pgtable.h
+index 2f597ee..6a0edf7 100644
+--- a/include/asm-mips/pgtable.h
++++ b/include/asm-mips/pgtable.h
+@@ -239,9 +239,10 @@ static inline pte_t pte_mkdirty(pte_t pte)
+ static inline pte_t pte_mkyoung(pte_t pte)
+ {
+ 	pte.pte_low |= _PAGE_ACCESSED;
+-	if (pte.pte_low & _PAGE_READ)
++	if (pte.pte_low & _PAGE_READ) {
+ 		pte.pte_low  |= _PAGE_SILENT_READ;
+ 		pte.pte_high |= _PAGE_SILENT_READ;
++	}
+ 	return pte;
+ }
+ #else
+diff --git a/include/asm-mips/rtlx.h b/include/asm-mips/rtlx.h
+index 20b6660..4ca3063 100644
+--- a/include/asm-mips/rtlx.h
++++ b/include/asm-mips/rtlx.h
+@@ -3,7 +3,7 @@
+  *
+  */
+ 
+-#ifndef __ASM_RTLX_H
++#ifndef __ASM_RTLX_H_
+ #define __ASM_RTLX_H_
+ 
+ #include <irq.h>
+diff --git a/include/asm-um/mmu_context.h b/include/asm-um/mmu_context.h
+index 6686fc5..54f42e8 100644
+--- a/include/asm-um/mmu_context.h
++++ b/include/asm-um/mmu_context.h
+@@ -22,16 +22,10 @@ extern void force_flush_all(void);
+ static inline void activate_mm(struct mm_struct *old, struct mm_struct *new)
+ {
+ 	/*
+-	 * This is called by fs/exec.c and fs/aio.c. In the first case, for an
+-	 * exec, we don't need to do anything as we're called from userspace
+-	 * and thus going to use a new host PID. In the second, we're called
+-	 * from a kernel thread, and thus need to go doing the mmap's on the
+-	 * host. Since they're very expensive, we want to avoid that as far as
+-	 * possible.
++	 * This is called by fs/exec.c and sys_unshare()
++	 * when the new ->mm is used for the first time.
+ 	 */
+-	if (old != new && (current->flags & PF_BORROWED_MM))
+-		__switch_mm(&new->context.id);
+-
++	__switch_mm(&new->context.id);
+ 	arch_dup_mmap(old, new);
+ }
+ 
+diff --git a/include/asm-v850/clinkage.h b/include/asm-v850/clinkage.h
+index 2b622ad..c389691 100644
+--- a/include/asm-v850/clinkage.h
++++ b/include/asm-v850/clinkage.h
+@@ -11,7 +11,7 @@
+  * Written by Miles Bader <miles at gnu.org>
+  */
+ 
+-#ifndef __CLINKAGE_H__
++#ifndef __V850_CLINKAGE_H__
+ #define __V850_CLINKAGE_H__
+ 
+ #include <asm/macrology.h>
+diff --git a/include/linux/bitrev.h b/include/linux/bitrev.h
+index 05e540d..7ffe03f 100644
+--- a/include/linux/bitrev.h
++++ b/include/linux/bitrev.h
+@@ -10,6 +10,7 @@ static inline u8 bitrev8(u8 byte)
+ 	return byte_rev_table[byte];
+ }
+ 
++extern u16 bitrev16(u16 in);
+ extern u32 bitrev32(u32 in);
+ 
+ #endif /* _LINUX_BITREV_H */
+diff --git a/include/linux/capability.h b/include/linux/capability.h
+index f4ea0dd..fa830f8 100644
+--- a/include/linux/capability.h
++++ b/include/linux/capability.h
+@@ -31,11 +31,11 @@ struct task_struct;
+ #define _LINUX_CAPABILITY_VERSION_1  0x19980330
+ #define _LINUX_CAPABILITY_U32S_1     1
+ 
+-#define _LINUX_CAPABILITY_VERSION_2  0x20071026
++#define _LINUX_CAPABILITY_VERSION_2  0x20071026  /* deprecated - use v3 */
+ #define _LINUX_CAPABILITY_U32S_2     2
+ 
+-#define _LINUX_CAPABILITY_VERSION    _LINUX_CAPABILITY_VERSION_2
+-#define _LINUX_CAPABILITY_U32S       _LINUX_CAPABILITY_U32S_2
++#define _LINUX_CAPABILITY_VERSION_3  0x20080522
++#define _LINUX_CAPABILITY_U32S_3     2
+ 
+ typedef struct __user_cap_header_struct {
+ 	__u32 version;
+@@ -77,10 +77,23 @@ struct vfs_cap_data {
+ 	} data[VFS_CAP_U32];
+ };
+ 
+-#ifdef __KERNEL__
++#ifndef __KERNEL__
++
++/*
++ * Backwardly compatible definition for source code - trapped in a
++ * 32-bit world. If you find you need this, please consider using
++ * libcap to untrap yourself...
++ */
++#define _LINUX_CAPABILITY_VERSION  _LINUX_CAPABILITY_VERSION_1
++#define _LINUX_CAPABILITY_U32S     _LINUX_CAPABILITY_U32S_1
++
++#else
++
++#define _KERNEL_CAPABILITY_VERSION _LINUX_CAPABILITY_VERSION_3
++#define _KERNEL_CAPABILITY_U32S    _LINUX_CAPABILITY_U32S_3
+ 
+ typedef struct kernel_cap_struct {
+-	__u32 cap[_LINUX_CAPABILITY_U32S];
++	__u32 cap[_KERNEL_CAPABILITY_U32S];
+ } kernel_cap_t;
+ 
+ #define _USER_CAP_HEADER_SIZE  (sizeof(struct __user_cap_header_struct))
+@@ -351,7 +364,7 @@ typedef struct kernel_cap_struct {
+  */
+ 
+ #define CAP_FOR_EACH_U32(__capi)  \
+-	for (__capi = 0; __capi < _LINUX_CAPABILITY_U32S; ++__capi)
++	for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi)
+ 
+ # define CAP_FS_MASK_B0     (CAP_TO_MASK(CAP_CHOWN)		\
+ 			    | CAP_TO_MASK(CAP_DAC_OVERRIDE)	\
+@@ -361,7 +374,7 @@ typedef struct kernel_cap_struct {
+ 
+ # define CAP_FS_MASK_B1     (CAP_TO_MASK(CAP_MAC_OVERRIDE))
+ 
+-#if _LINUX_CAPABILITY_U32S != 2
++#if _KERNEL_CAPABILITY_U32S != 2
+ # error Fix up hand-coded capability macro initializers
+ #else /* HAND-CODED capability initializers */
+ 
+@@ -372,7 +385,7 @@ typedef struct kernel_cap_struct {
+ # define CAP_NFSD_SET     ((kernel_cap_t){{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \
+ 					CAP_FS_MASK_B1 } })
+ 
+-#endif /* _LINUX_CAPABILITY_U32S != 2 */
++#endif /* _KERNEL_CAPABILITY_U32S != 2 */
+ 
+ #define CAP_INIT_INH_SET    CAP_EMPTY_SET
+ 
+diff --git a/include/linux/fs.h b/include/linux/fs.h
+index f413085..d490779 100644
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -2000,7 +2000,10 @@ extern int simple_fill_super(struct super_block *, int, struct tree_descr *);
+ extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count);
+ extern void simple_release_fs(struct vfsmount **mount, int *count);
+ 
+-extern ssize_t simple_read_from_buffer(void __user *, size_t, loff_t *, const void *, size_t);
++extern ssize_t simple_read_from_buffer(void __user *to, size_t count,
++			loff_t *ppos, const void *from, size_t available);
++extern ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
++			const void *from, size_t available);
+ 
+ #ifdef CONFIG_MIGRATION
+ extern int buffer_migrate_page(struct address_space *,
+diff --git a/include/linux/msg.h b/include/linux/msg.h
+index 6f3b8e7..56abf15 100644
+--- a/include/linux/msg.h
++++ b/include/linux/msg.h
+@@ -64,11 +64,11 @@ struct msginfo {
+ #define MSGMNB 16384   /* <= INT_MAX */   /* default max size of a message queue */
+ 
+ /* unused */
+-#define MSGPOOL (MSGMNI * MSGMNB) /* size in bytes of message pool */
++#define MSGPOOL (MSGMNI * MSGMNB / 1024) /* size in kbytes of message pool */
+ #define MSGTQL  MSGMNB            /* number of system message headers */
+ #define MSGMAP  MSGMNB            /* number of entries in message map */
+ #define MSGSSZ  16                /* message segment size */
+-#define __MSGSEG (MSGPOOL / MSGSSZ) /* max no. of segments */
++#define __MSGSEG ((MSGPOOL * 1024) / MSGSSZ) /* max no. of segments */
+ #define MSGSEG (__MSGSEG <= 0xffff ? __MSGSEG : 0xffff)
+ 
+ #ifdef __KERNEL__
+diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
+index c42bc7f..53ea3dc 100644
+--- a/include/linux/mtd/nand.h
++++ b/include/linux/mtd/nand.h
+@@ -1,7 +1,7 @@
+ /*
+  *  linux/include/linux/mtd/nand.h
+  *
+- *  Copyright (c) 2000 David Woodhouse <dwmw2 at mvhi.com>
++ *  Copyright (c) 2000 David Woodhouse <dwmw2 at infradead.org>
+  *                     Steven J. Hill <sjhill at realitydiluted.com>
+  *		       Thomas Gleixner <tglx at linutronix.de>
+  *
+diff --git a/include/linux/slab.h b/include/linux/slab.h
+index 805ed4b..c2ad350 100644
+--- a/include/linux/slab.h
++++ b/include/linux/slab.h
+@@ -276,6 +276,17 @@ static inline void *kzalloc(size_t size, gfp_t flags)
+ 	return kmalloc(size, flags | __GFP_ZERO);
+ }
+ 
++/**
++ * kzalloc_node - allocate zeroed memory from a particular memory node.
++ * @size: how many bytes of memory are required.
++ * @flags: the type of memory to allocate (see kmalloc).
++ * @node: memory node from which to allocate
++ */
++static inline void *kzalloc_node(size_t size, gfp_t flags, int node)
++{
++	return kmalloc_node(size, flags | __GFP_ZERO, node);
++}
++
+ #ifdef CONFIG_SLABINFO
+ extern const struct seq_operations slabinfo_op;
+ ssize_t slabinfo_write(struct file *, const char __user *, size_t, loff_t *);
+diff --git a/include/linux/tty.h b/include/linux/tty.h
+index 7f7121f..324a3b2 100644
+--- a/include/linux/tty.h
++++ b/include/linux/tty.h
+@@ -36,7 +36,7 @@
+ #define N_6PACK		7
+ #define N_MASC		8	/* Reserved for Mobitex module <kaz at cafe.net> */
+ #define N_R3964		9	/* Reserved for Simatic R3964 module */
+-#define N_PROFIBUS_FDL	10	/* Reserved for Profibus <Dave at mvhi.com> */
++#define N_PROFIBUS_FDL	10	/* Reserved for Profibus */
+ #define N_IRDA		11	/* Linux IrDa - http://irda.sourceforge.net/ */
+ #define N_SMSBLOCK	12	/* SMS block mode - for talking to GSM data */
+ 				/* cards about SMS messages */
+diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
+index c141118..4a535ea 100644
+--- a/include/linux/videodev2.h
++++ b/include/linux/videodev2.h
+@@ -865,9 +865,9 @@ struct v4l2_querymenu
+ #define V4L2_CID_HFLIP			(V4L2_CID_BASE+20)
+ #define V4L2_CID_VFLIP			(V4L2_CID_BASE+21)
+ 
+-/* Deprecated, use V4L2_CID_PAN_RESET and V4L2_CID_TILT_RESET */
+-#define V4L2_CID_HCENTER_DEPRECATED	(V4L2_CID_BASE+22)
+-#define V4L2_CID_VCENTER_DEPRECATED	(V4L2_CID_BASE+23)
++/* Deprecated; use V4L2_CID_PAN_RESET and V4L2_CID_TILT_RESET */
++#define V4L2_CID_HCENTER		(V4L2_CID_BASE+22)
++#define V4L2_CID_VCENTER		(V4L2_CID_BASE+23)
+ 
+ #define V4L2_CID_POWER_LINE_FREQUENCY	(V4L2_CID_BASE+24)
+ enum v4l2_power_line_frequency {
+diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h
+index a807d2f..33f01ae 100644
+--- a/include/media/v4l2-dev.h
++++ b/include/media/v4l2-dev.h
+@@ -40,7 +40,6 @@
+ #define VFL_TYPE_VTX		3
+ 
+ /*  Video standard functions  */
+-extern unsigned int v4l2_video_std_fps(struct v4l2_standard *vs);
+ extern char *v4l2_norm_to_name(v4l2_std_id id);
+ extern int v4l2_video_std_construct(struct v4l2_standard *vs,
+ 				    int id, char *name);
+diff --git a/ipc/msg.c b/ipc/msg.c
+index 32494e8..b4eee1c 100644
+--- a/ipc/msg.c
++++ b/ipc/msg.c
+@@ -98,20 +98,15 @@ void recompute_msgmni(struct ipc_namespace *ns)
+ 
+ 	if (allowed < MSGMNI) {
+ 		ns->msg_ctlmni = MSGMNI;
+-		goto out_callback;
++		return;
+ 	}
+ 
+ 	if (allowed > IPCMNI / nb_ns) {
+ 		ns->msg_ctlmni = IPCMNI / nb_ns;
+-		goto out_callback;
++		return;
+ 	}
+ 
+ 	ns->msg_ctlmni = allowed;
+-
+-out_callback:
+-
+-	printk(KERN_INFO "msgmni has been set to %d for ipc namespace %p\n",
+-		ns->msg_ctlmni, ns);
+ }
+ 
+ void msg_init_ns(struct ipc_namespace *ns)
+@@ -136,6 +131,10 @@ void msg_exit_ns(struct ipc_namespace *ns)
+ void __init msg_init(void)
+ {
+ 	msg_init_ns(&init_ipc_ns);
++
++	printk(KERN_INFO "msgmni has been set to %d\n",
++		init_ipc_ns.msg_ctlmni);
++
+ 	ipc_init_proc_interface("sysvipc/msg",
+ 				"       key      msqid perms      cbytes       qnum lspid lrpid   uid   gid  cuid  cgid      stime      rtime      ctime\n",
+ 				IPC_MSG_IDS, sysvipc_msg_proc_show);
+diff --git a/kernel/capability.c b/kernel/capability.c
+index 39e8193..cfbe442 100644
+--- a/kernel/capability.c
++++ b/kernel/capability.c
+@@ -53,6 +53,69 @@ static void warn_legacy_capability_use(void)
+ }
+ 
+ /*
++ * Version 2 capabilities worked fine, but the linux/capability.h file
++ * that accompanied their introduction encouraged their use without
++ * the necessary user-space source code changes. As such, we have
++ * created a version 3 with equivalent functionality to version 2, but
++ * with a header change to protect legacy source code from using
++ * version 2 when it wanted to use version 1. If your system has code
++ * that trips the following warning, it is using version 2 specific
++ * capabilities and may be doing so insecurely.
++ *
++ * The remedy is to either upgrade your version of libcap (to 2.10+,
++ * if the application is linked against it), or recompile your
++ * application with modern kernel headers and this warning will go
++ * away.
++ */
++
++static void warn_deprecated_v2(void)
++{
++	static int warned;
++
++	if (!warned) {
++		char name[sizeof(current->comm)];
++
++		printk(KERN_INFO "warning: `%s' uses deprecated v2"
++		       " capabilities in a way that may be insecure.\n",
++		       get_task_comm(name, current));
++		warned = 1;
++	}
++}
++
++/*
++ * Version check. Return the number of u32s in each capability flag
++ * array, or a negative value on error.
++ */
++static int cap_validate_magic(cap_user_header_t header, unsigned *tocopy)
++{
++	__u32 version;
++
++	if (get_user(version, &header->version))
++		return -EFAULT;
++
++	switch (version) {
++	case _LINUX_CAPABILITY_VERSION_1:
++		warn_legacy_capability_use();
++		*tocopy = _LINUX_CAPABILITY_U32S_1;
++		break;
++	case _LINUX_CAPABILITY_VERSION_2:
++		warn_deprecated_v2();
++		/*
++		 * fall through - v3 is otherwise equivalent to v2.
++		 */
++	case _LINUX_CAPABILITY_VERSION_3:
++		*tocopy = _LINUX_CAPABILITY_U32S_3;
++		break;
++	default:
++		if (put_user((u32)_KERNEL_CAPABILITY_VERSION, &header->version))
++			return -EFAULT;
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++/*
+  * For sys_getproccap() and sys_setproccap(), any of the three
+  * capability set pointers may be NULL -- indicating that that set is
+  * uninteresting and/or not to be changed.
+@@ -71,27 +134,13 @@ asmlinkage long sys_capget(cap_user_header_t header, cap_user_data_t dataptr)
+ {
+ 	int ret = 0;
+ 	pid_t pid;
+-	__u32 version;
+ 	struct task_struct *target;
+ 	unsigned tocopy;
+ 	kernel_cap_t pE, pI, pP;
+ 
+-	if (get_user(version, &header->version))
+-		return -EFAULT;
+-
+-	switch (version) {
+-	case _LINUX_CAPABILITY_VERSION_1:
+-		warn_legacy_capability_use();
+-		tocopy = _LINUX_CAPABILITY_U32S_1;
+-		break;
+-	case _LINUX_CAPABILITY_VERSION_2:
+-		tocopy = _LINUX_CAPABILITY_U32S_2;
+-		break;
+-	default:
+-		if (put_user(_LINUX_CAPABILITY_VERSION, &header->version))
+-			return -EFAULT;
+-		return -EINVAL;
+-	}
++	ret = cap_validate_magic(header, &tocopy);
++	if (ret != 0)
++		return ret;
+ 
+ 	if (get_user(pid, &header->pid))
+ 		return -EFAULT;
+@@ -118,7 +167,7 @@ out:
+ 	spin_unlock(&task_capability_lock);
+ 
+ 	if (!ret) {
+-		struct __user_cap_data_struct kdata[_LINUX_CAPABILITY_U32S];
++		struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S];
+ 		unsigned i;
+ 
+ 		for (i = 0; i < tocopy; i++) {
+@@ -128,7 +177,7 @@ out:
+ 		}
+ 
+ 		/*
+-		 * Note, in the case, tocopy < _LINUX_CAPABILITY_U32S,
++		 * Note, in the case, tocopy < _KERNEL_CAPABILITY_U32S,
+ 		 * we silently drop the upper capabilities here. This
+ 		 * has the effect of making older libcap
+ 		 * implementations implicitly drop upper capability
+@@ -240,30 +289,16 @@ static inline int cap_set_all(kernel_cap_t *effective,
+  */
+ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data)
+ {
+-	struct __user_cap_data_struct kdata[_LINUX_CAPABILITY_U32S];
++	struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S];
+ 	unsigned i, tocopy;
+ 	kernel_cap_t inheritable, permitted, effective;
+-	__u32 version;
+ 	struct task_struct *target;
+ 	int ret;
+ 	pid_t pid;
+ 
+-	if (get_user(version, &header->version))
+-		return -EFAULT;
+-
+-	switch (version) {
+-	case _LINUX_CAPABILITY_VERSION_1:
+-		warn_legacy_capability_use();
+-		tocopy = _LINUX_CAPABILITY_U32S_1;
+-		break;
+-	case _LINUX_CAPABILITY_VERSION_2:
+-		tocopy = _LINUX_CAPABILITY_U32S_2;
+-		break;
+-	default:
+-		if (put_user(_LINUX_CAPABILITY_VERSION, &header->version))
+-			return -EFAULT;
+-		return -EINVAL;
+-	}
++	ret = cap_validate_magic(header, &tocopy);
++	if (ret != 0)
++		return ret;
+ 
+ 	if (get_user(pid, &header->pid))
+ 		return -EFAULT;
+@@ -281,7 +316,7 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data)
+ 		permitted.cap[i] = kdata[i].permitted;
+ 		inheritable.cap[i] = kdata[i].inheritable;
+ 	}
+-	while (i < _LINUX_CAPABILITY_U32S) {
++	while (i < _KERNEL_CAPABILITY_U32S) {
+ 		effective.cap[i] = 0;
+ 		permitted.cap[i] = 0;
+ 		inheritable.cap[i] = 0;
+diff --git a/kernel/cpuset.c b/kernel/cpuset.c
+index 86ea9e3..039baa4 100644
+--- a/kernel/cpuset.c
++++ b/kernel/cpuset.c
+@@ -797,8 +797,10 @@ static int update_cpumask(struct cpuset *cs, char *buf)
+ 		retval = cpulist_parse(buf, trialcs.cpus_allowed);
+ 		if (retval < 0)
+ 			return retval;
++
++		if (!cpus_subset(trialcs.cpus_allowed, cpu_online_map))
++			return -EINVAL;
+ 	}
+-	cpus_and(trialcs.cpus_allowed, trialcs.cpus_allowed, cpu_online_map);
+ 	retval = validate_change(cs, &trialcs);
+ 	if (retval < 0)
+ 		return retval;
+@@ -932,9 +934,11 @@ static int update_nodemask(struct cpuset *cs, char *buf)
+ 		retval = nodelist_parse(buf, trialcs.mems_allowed);
+ 		if (retval < 0)
+ 			goto done;
++
++		if (!nodes_subset(trialcs.mems_allowed,
++				node_states[N_HIGH_MEMORY]))
++			return -EINVAL;
+ 	}
+-	nodes_and(trialcs.mems_allowed, trialcs.mems_allowed,
+-						node_states[N_HIGH_MEMORY]);
+ 	oldmem = cs->mems_allowed;
+ 	if (nodes_equal(oldmem, trialcs.mems_allowed)) {
+ 		retval = 0;		/* Too easy - nothing to do */
+diff --git a/lib/bitrev.c b/lib/bitrev.c
+index 989aff7..3956203 100644
+--- a/lib/bitrev.c
++++ b/lib/bitrev.c
+@@ -42,10 +42,11 @@ const u8 byte_rev_table[256] = {
+ };
+ EXPORT_SYMBOL_GPL(byte_rev_table);
+ 
+-static __always_inline u16 bitrev16(u16 x)
++u16 bitrev16(u16 x)
+ {
+ 	return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8);
+ }
++EXPORT_SYMBOL(bitrev16);
+ 
+ /**
+  * bitrev32 - reverse the order of bits in a u32 value
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index bbf953e..ab17127 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -785,7 +785,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
+ 			continue;
+ 
+ 		spin_lock(&dst->page_table_lock);
+-		spin_lock(&src->page_table_lock);
++		spin_lock_nested(&src->page_table_lock, SINGLE_DEPTH_NESTING);
+ 		if (!huge_pte_none(huge_ptep_get(src_pte))) {
+ 			if (cow)
+ 				huge_ptep_set_wrprotect(src, addr, src_pte);
+diff --git a/mm/mmap.c b/mm/mmap.c
+index 669499e..3354fdd 100644
+--- a/mm/mmap.c
++++ b/mm/mmap.c
+@@ -245,10 +245,16 @@ asmlinkage unsigned long sys_brk(unsigned long brk)
+ 	unsigned long rlim, retval;
+ 	unsigned long newbrk, oldbrk;
+ 	struct mm_struct *mm = current->mm;
++	unsigned long min_brk;
+ 
+ 	down_write(&mm->mmap_sem);
+ 
+-	if (brk < mm->start_brk)
++#ifdef CONFIG_COMPAT_BRK
++	min_brk = mm->end_code;
++#else
++	min_brk = mm->start_brk;
++#endif
++	if (brk < min_brk)
+ 		goto out;
+ 
+ 	/*
+diff --git a/mm/nommu.c b/mm/nommu.c
+index dca93fc..3abd084 100644
+--- a/mm/nommu.c
++++ b/mm/nommu.c
+@@ -104,21 +104,43 @@ EXPORT_SYMBOL(vmtruncate);
+ unsigned int kobjsize(const void *objp)
+ {
+ 	struct page *page;
++	int order = 0;
+ 
+ 	/*
+ 	 * If the object we have should not have ksize performed on it,
+ 	 * return size of 0
+ 	 */
+-	if (!objp || (unsigned long)objp >= memory_end || !((page = virt_to_page(objp))))
++	if (!objp)
+ 		return 0;
+ 
++	if ((unsigned long)objp >= memory_end)
++		return 0;
++
++	page = virt_to_head_page(objp);
++	if (!page)
++		return 0;
++
++	/*
++	 * If the allocator sets PageSlab, we know the pointer came from
++	 * kmalloc().
++	 */
+ 	if (PageSlab(page))
+ 		return ksize(objp);
+ 
+-	BUG_ON(page->index < 0);
+-	BUG_ON(page->index >= MAX_ORDER);
++	/*
++	 * The ksize() function is only guaranteed to work for pointers
++	 * returned by kmalloc(). So handle arbitrary pointers, that we expect
++	 * always to be compound pages, here.
++	 */
++	if (PageCompound(page))
++		order = compound_order(page);
+ 
+-	return (PAGE_SIZE << page->index);
++	/*
++	 * Finally, handle arbitrary pointers that don't set PageSlab.
++	 * Default to 0-order in the case when we're unable to ksize()
++	 * the object.
++	 */
++	return PAGE_SIZE << order;
+ }
+ 
+ /*
+diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c b/net/ipv4/netfilter/nf_nat_snmp_basic.c
+index 5daefad..7750c97 100644
+--- a/net/ipv4/netfilter/nf_nat_snmp_basic.c
++++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c
+@@ -232,6 +232,11 @@ static unsigned char asn1_length_decode(struct asn1_ctx *ctx,
+ 			}
+ 		}
+ 	}
++
++	/* don't trust len bigger than ctx buffer */
++	if (*len > ctx->end - ctx->pointer)
++		return 0;
++
+ 	return 1;
+ }
+ 
+@@ -250,6 +255,10 @@ static unsigned char asn1_header_decode(struct asn1_ctx *ctx,
+ 	if (!asn1_length_decode(ctx, &def, &len))
+ 		return 0;
+ 
++	/* primitive shall be definite, indefinite shall be constructed */
++	if (*con == ASN1_PRI && !def)
++		return 0;
++
+ 	if (def)
+ 		*eoc = ctx->pointer + len;
+ 	else
+@@ -434,6 +443,11 @@ static unsigned char asn1_oid_decode(struct asn1_ctx *ctx,
+ 	unsigned long *optr;
+ 
+ 	size = eoc - ctx->pointer + 1;
++
++	/* first subid actually encodes first two subids */
++	if (size < 2 || size > ULONG_MAX/sizeof(unsigned long))
++		return 0;
++
+ 	*oid = kmalloc(size * sizeof(unsigned long), GFP_ATOMIC);
+ 	if (*oid == NULL) {
+ 		if (net_ratelimit())
+diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
+index b6bbbcd..6971bf0 100755
+--- a/scripts/checkpatch.pl
++++ b/scripts/checkpatch.pl
+@@ -9,7 +9,7 @@ use strict;
+ my $P = $0;
+ $P =~ s at .*/@@g;
+ 
+-my $V = '0.18';
++my $V = '0.19';
+ 
+ use Getopt::Long qw(:config no_auto_abbrev);
+ 
+@@ -115,6 +115,7 @@ our $Attribute	= qr{
+ 			__kprobes|
+ 			__(?:mem|cpu|dev|)(?:initdata|init)
+ 		  }x;
++our $Modifier;
+ our $Inline	= qr{inline|__always_inline|noinline};
+ our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
+ our $Lval	= qr{$Ident(?:$Member)*};
+@@ -144,17 +145,17 @@ our $UTF8	= qr {
+ 
+ our @typeList = (
+ 	qr{void},
+-	qr{char},
+-	qr{short},
+-	qr{int},
+-	qr{long},
++	qr{(?:unsigned\s+)?char},
++	qr{(?:unsigned\s+)?short},
++	qr{(?:unsigned\s+)?int},
++	qr{(?:unsigned\s+)?long},
++	qr{(?:unsigned\s+)?long\s+int},
++	qr{(?:unsigned\s+)?long\s+long},
++	qr{(?:unsigned\s+)?long\s+long\s+int},
+ 	qr{unsigned},
+ 	qr{float},
+ 	qr{double},
+ 	qr{bool},
+-	qr{long\s+int},
+-	qr{long\s+long},
+-	qr{long\s+long\s+int},
+ 	qr{(?:__)?(?:u|s|be|le)(?:8|16|32|64)},
+ 	qr{struct\s+$Ident},
+ 	qr{union\s+$Ident},
+@@ -163,26 +164,29 @@ our @typeList = (
+ 	qr{${Ident}_handler},
+ 	qr{${Ident}_handler_fn},
+ );
++our @modifierList = (
++	qr{fastcall},
++);
+ 
+ sub build_types {
++	my $mods = "(?:  \n" . join("|\n  ", @modifierList) . "\n)";
+ 	my $all = "(?:  \n" . join("|\n  ", @typeList) . "\n)";
+ 	$NonptrType	= qr{
+-			\b
+ 			(?:const\s+)?
+-			(?:unsigned\s+)?
++			(?:$mods\s+)?
+ 			(?:
+-				$all|
+-				(?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)
++				(?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)|
++				(?:${all}\b)
+ 			)
+ 			(?:\s+$Sparse|\s+const)*
+-			\b
+ 		  }x;
+ 	$Type	= qr{
+-			\b$NonptrType\b
++			$NonptrType
+ 			(?:\s*\*+\s*const|\s*\*+|(?:\s*\[\s*\])+)?
+-			(?:\s+$Inline|\s+$Sparse|\s+$Attribute)*
++			(?:\s+$Inline|\s+$Sparse|\s+$Attribute|\s+$mods)*
+ 		  }x;
+ 	$Declare	= qr{(?:$Storage\s+)?$Type};
++	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
+ }
+ build_types();
+ 
+@@ -329,7 +333,7 @@ sub sanitise_line {
+ 			$off++;
+ 			next;
+ 		}
+-		if (substr($line, $off, 2) eq $sanitise_quote) {
++		if (substr($line, $off, 2) eq '*/') {
+ 			$sanitise_quote = '';
+ 			substr($res, $off, 2, "$;$;");
+ 			$off++;
+@@ -366,14 +370,14 @@ sub sanitise_line {
+ 	}
+ 
+ 	# The pathname on a #include may be surrounded by '<' and '>'.
+-	if ($res =~ /^.#\s*include\s+\<(.*)\>/) {
++	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
+ 		my $clean = 'X' x length($1);
+ 		$res =~ s@\<.*\>@<$clean>@;
+ 
+ 	# The whole of a #error is a string.
+-	} elsif ($res =~ /^.#\s*(?:error|warning)\s+(.*)\b/) {
++	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
+ 		my $clean = 'X' x length($1);
+-		$res =~ s@(#\s*(?:error|warning)\s+).*@$1$clean@;
++		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
+ 	}
+ 
+ 	return $res;
+@@ -715,7 +719,7 @@ sub annotate_values {
+ 			print "DECLARE($1)\n" if ($dbg_values > 1);
+ 			$type = 'T';
+ 
+-		} elsif ($cur =~ /^(#\s*define\s*$Ident)(\(?)/o) {
++		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
+ 			print "DEFINE($1,$2)\n" if ($dbg_values > 1);
+ 			$av_preprocessor = 1;
+ 			push(@av_paren_type, $type);
+@@ -724,12 +728,12 @@ sub annotate_values {
+ 			}
+ 			$type = 'E';
+ 
+-		} elsif ($cur =~ /^(#\s*undef\s*$Ident)/o) {
++		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
+ 			print "UNDEF($1)\n" if ($dbg_values > 1);
+ 			$av_preprocessor = 1;
+ 			push(@av_paren_type, $type);
+ 
+-		} elsif ($cur =~ /^(#\s*(?:ifdef|ifndef|if))/o) {
++		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
+ 			print "PRE_START($1)\n" if ($dbg_values > 1);
+ 			$av_preprocessor = 1;
+ 
+@@ -737,7 +741,7 @@ sub annotate_values {
+ 			push(@av_paren_type, $type);
+ 			$type = 'E';
+ 
+-		} elsif ($cur =~ /^(#\s*(?:else|elif))/o) {
++		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
+ 			print "PRE_RESTART($1)\n" if ($dbg_values > 1);
+ 			$av_preprocessor = 1;
+ 
+@@ -745,7 +749,7 @@ sub annotate_values {
+ 
+ 			$type = 'E';
+ 
+-		} elsif ($cur =~ /^(#\s*(?:endif))/o) {
++		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
+ 			print "PRE_END($1)\n" if ($dbg_values > 1);
+ 
+ 			$av_preprocessor = 1;
+@@ -837,14 +841,26 @@ sub annotate_values {
+ sub possible {
+ 	my ($possible, $line) = @_;
+ 
+-	#print "CHECK<$possible>\n";
++	print "CHECK<$possible> ($line)\n" if ($dbg_possible > 1);
+ 	if ($possible !~ /^(?:$Storage|$Type|DEFINE_\S+)$/ &&
+ 	    $possible ne 'goto' && $possible ne 'return' &&
+-	    $possible ne 'struct' && $possible ne 'enum' &&
+ 	    $possible ne 'case' && $possible ne 'else' &&
+-	    $possible ne 'typedef') {
+-		warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
+-		push(@typeList, $possible);
++	    $possible ne 'asm' &&
++	    $possible !~ /^(typedef|struct|enum)\b/) {
++		# Check for modifiers.
++		$possible =~ s/\s*$Storage\s*//g;
++		$possible =~ s/\s*$Sparse\s*//g;
++		if ($possible =~ /^\s*$/) {
++
++		} elsif ($possible =~ /\s/) {
++			$possible =~ s/\s*$Type\s*//g;
++			warn "MODIFIER: $possible ($line)\n" if ($dbg_possible);
++			push(@modifierList, $possible);
++
++		} else {
++			warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
++			push(@typeList, $possible);
++		}
+ 		build_types();
+ 	}
+ }
+@@ -949,6 +965,7 @@ sub process {
+ 			} else {
+ 				$realcnt=1+1;
+ 			}
++			$in_comment = 0;
+ 
+ 			# Guestimate if this is a continuing comment.  Run
+ 			# the context looking for a comment "edge".  If this
+@@ -1117,7 +1134,9 @@ sub process {
+ 			ERROR("trailing whitespace\n" . $herevet);
+ 		}
+ #80 column limit
+-		if ($line =~ /^\+/ && !($prevrawline=~/\/\*\*/) && $length > 80) {
++		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
++		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ && $length > 80)
++		{
+ 			WARN("line over 80 characters\n" . $herecurr);
+ 		}
+ 
+@@ -1159,18 +1178,20 @@ sub process {
+ 			# Ignore functions being called
+ 			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
+ 
++			# declarations always start with types
++			} elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))\s*(?:;|=|,|\()/s) {
++				my $type = $1;
++				$type =~ s/\s+/ /g;
++				possible($type, "A:" . $s);
++
+ 			# definitions in global scope can only start with types
+ 			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b/s) {
+-				possible($1, $s);
+-
+-			# declarations always start with types
+-			} elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:const\s+)?($Ident)\b(:?\s+$Sparse)?\s*\**\s*$Ident\s*(?:;|=|,)/s) {
+-				possible($1, $s);
++				possible($1, "B:" . $s);
+ 			}
+ 
+ 			# any (foo ... *) is a pointer cast, and foo is a type
+ 			while ($s =~ /\(($Ident)(?:\s+$Sparse)*\s*\*+\s*\)/sg) {
+-				possible($1, $s);
++				possible($1, "C:" . $s);
+ 			}
+ 
+ 			# Check for any sort of function declaration.
+@@ -1184,9 +1205,9 @@ sub process {
+ 				$ctx =~ s/\)[^\)]*$//;
+ 
+ 				for my $arg (split(/\s*,\s*/, $ctx)) {
+-					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/ || $arg =~ /^($Ident)$/) {
++					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
+ 
+-						possible($1, $s);
++						possible($1, "D:" . $s);
+ 					}
+ 				}
+ 			}
+@@ -1221,7 +1242,7 @@ sub process {
+ 
+ # if/while/etc brace do not go on next line, unless defining a do while loop,
+ # or if that brace on the next line is for something else
+-		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) {
++		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
+ 			my $pre_ctx = "$1$2";
+ 
+ 			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
+@@ -1239,7 +1260,7 @@ sub process {
+ 
+ 			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
+ 				ERROR("that open brace { should be on the previous line\n" .
+-					"$here\n$ctx\n$lines[$ctx_ln - 1]");
++					"$here\n$ctx\n$lines[$ctx_ln - 1]\n");
+ 			}
+ 			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
+ 			    $ctx =~ /\)\s*\;\s*$/ &&
+@@ -1248,7 +1269,7 @@ sub process {
+ 				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
+ 				if ($nindent > $indent) {
+ 					WARN("trailing semicolon indicates no statements, indent implies otherwise\n" .
+-						"$here\n$ctx\n$lines[$ctx_ln - 1]");
++						"$here\n$ctx\n$lines[$ctx_ln - 1]\n");
+ 				}
+ 			}
+ 		}
+@@ -1284,7 +1305,7 @@ sub process {
+ #
+ 
+ # check for malformed paths in #include statements (uses RAW line)
+-		if ($rawline =~ m{^.#\s*include\s+[<"](.*)[">]}) {
++		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
+ 			my $path = $1;
+ 			if ($path =~ m{//}) {
+ 				ERROR("malformed #include filename\n" .
+@@ -1316,7 +1337,7 @@ sub process {
+ 		}
+ 
+ # check for external initialisers.
+-		if ($line =~ /^.$Type\s*$Ident\s*=\s*(0|NULL|false)\s*;/) {
++		if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
+ 			ERROR("do not initialise externals to 0 or NULL\n" .
+ 				$herecurr);
+ 		}
+@@ -1330,6 +1351,7 @@ sub process {
+ # make sense.
+ 		if ($line =~ /\btypedef\s/ &&
+ 		    $line !~ /\btypedef\s+$Type\s+\(\s*\*?$Ident\s*\)\s*\(/ &&
++		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
+ 		    $line !~ /\b__bitwise(?:__|)\b/) {
+ 			WARN("do not add new typedefs\n" . $herecurr);
+ 		}
+@@ -1388,8 +1410,8 @@ sub process {
+ 
+ # function brace can't be on same line, except for #defines of do while,
+ # or if closed on same line
+-		if (($line=~/$Type\s*[A-Za-z\d_]+\(.*\).*\s{/) and
+-		    !($line=~/\#define.*do\s{/) and !($line=~/}/)) {
++		if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
++		    !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
+ 			ERROR("open brace '{' following function declarations go on the next line\n" . $herecurr);
+ 		}
+ 
+@@ -1416,10 +1438,10 @@ sub process {
+ 			# cpp #define statements have non-optional spaces, ie
+ 			# if there is a space between the name and the open
+ 			# parenthesis it is simply not a parameter group.
+-			} elsif ($ctx_before =~ /^.\#\s*define\s*$/) {
++			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
+ 
+ 			# cpp #elif statement condition may start with a (
+-			} elsif ($ctx =~ /^.\#\s*elif\s*$/) {
++			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
+ 
+ 			# If this whole things ends with a type its most
+ 			# likely a typedef for a function.
+@@ -1625,13 +1647,14 @@ sub process {
+ 			ERROR("space prohibited before that close square bracket ']'\n" . $herecurr);
+ 		}
+ 
+-# check spacing on paretheses
++# check spacing on parentheses
+ 		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
+ 		    $line !~ /for\s*\(\s+;/) {
+ 			ERROR("space prohibited after that open parenthesis '('\n" . $herecurr);
+ 		}
+ 		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
+-		    $line !~ /for\s*\(.*;\s+\)/) {
++		    $line !~ /for\s*\(.*;\s+\)/ &&
++		    $line !~ /:\s+\)/) {
+ 			ERROR("space prohibited before that close parenthesis ')'\n" . $herecurr);
+ 		}
+ 
+@@ -1641,6 +1664,23 @@ sub process {
+ 			WARN("labels should not be indented\n" . $herecurr);
+ 		}
+ 
++# Return is not a function.
++		if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {
++			my $spacing = $1;
++			my $value = $2;
++
++			# Flatten any parentheses and braces
++			while ($value =~ s/\([^\(\)]*\)/1/) {
++			}
++
++			if ($value =~ /^(?:$Ident|-?$Constant)$/) {
++				ERROR("return is not a function, parentheses are not required\n" . $herecurr);
++
++			} elsif ($spacing !~ /\s+/) {
++				ERROR("space required before the open parenthesis '('\n" . $herecurr);
++			}
++		}
++
+ # Need a space before open parenthesis after if, while etc
+ 		if ($line=~/\b(if|while|for|switch)\(/) {
+ 			ERROR("space required before the open parenthesis '('\n" . $herecurr);
+@@ -1660,7 +1700,7 @@ sub process {
+ 			$s =~ s/\n.*//g;
+ 			$s =~ s/$;//g; 	# Remove any comments
+ 			if (length($c) && $s !~ /^\s*({|;|)\s*\\*\s*$/ &&
+-			    $c !~ /^.\#\s*if/)
++			    $c !~ /^.\s*\#\s*if/)
+ 			{
+ 				ERROR("trailing statements should be on next line\n" . $herecurr);
+ 			}
+@@ -1719,14 +1759,16 @@ sub process {
+ #		}
+ 
+ #no spaces allowed after \ in define
+-		if ($line=~/\#define.*\\\s$/) {
++		if ($line=~/\#\s*define.*\\\s$/) {
+ 			WARN("Whitepspace after \\ makes next lines useless\n" . $herecurr);
+ 		}
+ 
+ #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
+-		if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) {
+-			my $checkfile = "$root/include/linux/$1.h";
+-			if (-f $checkfile && $1 ne 'irq') {
++		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
++			my $checkfile = "include/linux/$1.h";
++			if (-f "$root/$checkfile" && $realfile ne $checkfile &&
++			    $1 ne 'irq')
++			{
+ 				WARN("Use #include <linux/$1.h> instead of <asm/$1.h>\n" .
+ 					$herecurr);
+ 			}
+@@ -1735,45 +1777,87 @@ sub process {
+ # multi-statement macros should be enclosed in a do while loop, grab the
+ # first statement and ensure its the whole macro if its not enclosed
+ # in a known good container
+-		if ($prevline =~ /\#define.*\\/ &&
+-		   $prevline !~/(?:do\s+{|\(\{|\{)/ &&
+-		   $line !~ /(?:do\s+{|\(\{|\{)/ &&
+-		   $line !~ /^.\s*$Declare\s/) {
+-			# Grab the first statement, if that is the entire macro
+-			# its ok.  This may start either on the #define line
+-			# or the one below.
++		if ($line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
+ 			my $ln = $linenr;
+ 			my $cnt = $realcnt;
+-			my $off = 0;
++			my ($off, $dstat, $dcond, $rest);
++			my $ctx = '';
+ 
+-			# If the macro starts on the define line start
+-			# grabbing the statement after the identifier
+-			$prevline =~ m{^(.#\s*define\s*$Ident(?:\([^\)]*\))?\s*)(.*)\\\s*$};
+-			##print "1<$1> 2<$2>\n";
+-			if (defined $2 && $2 ne '') {
+-				$off = length($1);
+-				$ln--;
+-				$cnt++;
+-				while ($lines[$ln - 1] =~ /^-/) {
+-					$ln--;
+-					$cnt++;
+-				}
++			my $args = defined($1);
++
++			# Find the end of the macro and limit our statement
++			# search to that.
++			while ($cnt > 0 && defined $lines[$ln - 1] &&
++				$lines[$ln - 1] =~ /^(?:-|..*\\$)/)
++			{
++				$ctx .= $rawlines[$ln - 1] . "\n";
++				$ln++;
++				$cnt--;
++			}
++			$ctx .= $rawlines[$ln - 1];
++
++			($dstat, $dcond, $ln, $cnt, $off) =
++				ctx_statement_block($linenr, $ln - $linenr + 1, 0);
++			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
++			#print "LINE<$lines[$ln]> len<" . length($lines[$ln]) . "\n";
++
++			# Extract the remainder of the define (if any) and
++			# rip off surrounding spaces, and trailing \'s.
++			$rest = '';
++			if (defined $lines[$ln - 1] &&
++			    $off > length($lines[$ln - 1]))
++			{
++				$ln++;
++				$cnt--;
++				$off = 0;
++			}
++			while ($cnt > 0) {
++				$rest .= substr($lines[$ln - 1], $off) . "\n";
++				$ln++;
++				$cnt--;
++				$off = 0;
++			}
++			$rest =~ s/\\\n.//g;
++			$rest =~ s/^\s*//s;
++			$rest =~ s/\s*$//s;
++
++			# Clean up the original statement.
++			if ($args) {
++				substr($dstat, 0, length($dcond), '');
++			} else {
++				$dstat =~ s/^.\s*\#\s*define\s+$Ident\s*//;
+ 			}
+-			my @ctx = ctx_statement($ln, $cnt, $off);
+-			my $ctx_ln = $ln + $#ctx + 1;
+-			my $ctx = join("\n", @ctx);
++			$dstat =~ s/\\\n.//g;
++			$dstat =~ s/^\s*//s;
++			$dstat =~ s/\s*$//s;
+ 
+-			# Pull in any empty extension lines.
+-			while ($ctx =~ /\\$/ &&
+-			       $lines[$ctx_ln - 1] =~ /^.\s*(?:\\)?$/) {
+-				$ctx .= $lines[$ctx_ln - 1];
+-				$ctx_ln++;
++			# Flatten any parentheses and braces
++			while ($dstat =~ s/\([^\(\)]*\)/1/) {
++			}
++			while ($dstat =~ s/\{[^\{\}]*\}/1/) {
+ 			}
+ 
+-			if ($ctx =~ /\\$/) {
+-				if ($ctx =~ /;/) {
++			my $exceptions = qr{
++				$Declare|
++				module_param_named|
++				MODULE_PARAM_DESC|
++				DECLARE_PER_CPU|
++				DEFINE_PER_CPU|
++				__typeof__\(
++			}x;
++			if ($rest ne '') {
++				if ($rest !~ /while\s*\(/ &&
++				    $dstat !~ /$exceptions/)
++				{
+ 					ERROR("Macros with multiple statements should be enclosed in a do - while loop\n" . "$here\n$ctx\n");
+-				} else {
++				}
++
++			} elsif ($ctx !~ /;/) {
++				if ($dstat ne '' &&
++				    $dstat !~ /^(?:$Ident|-?$Constant)$/ &&
++				    $dstat !~ /$exceptions/ &&
++				    $dstat =~ /$Operators/)
++				{
+ 					ERROR("Macros with complex values should be enclosed in parenthesis\n" . "$here\n$ctx\n");
+ 				}
+ 			}
+@@ -1884,7 +1968,7 @@ sub process {
+ 
+ # don't include deprecated include files (uses RAW line)
+ 		for my $inc (@dep_includes) {
+-			if ($rawline =~ m@\#\s*include\s*\<$inc>@) {
++			if ($rawline =~ m@^.\s*\#\s*include\s*\<$inc>@) {
+ 				ERROR("Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n" . $herecurr);
+ 			}
+ 		}
+@@ -1908,7 +1992,7 @@ sub process {
+ 		}
+ 
+ # warn about #if 0
+-		if ($line =~ /^.#\s*if\s+0\b/) {
++		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
+ 			CHK("if this code is redundant consider removing it\n" .
+ 				$herecurr);
+ 		}
+@@ -1920,23 +2004,16 @@ sub process {
+ 				WARN("kfree(NULL) is safe this check is probabally not required\n" . $hereprev);
+ 			}
+ 		}
+-# check for needless usb_free_urb() checks
+-		if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
+-			my $expr = $1;
+-			if ($line =~ /\busb_free_urb\(\Q$expr\E\);/) {
+-				WARN("usb_free_urb(NULL) is safe this check is probabally not required\n" . $hereprev);
+-			}
+-		}
+ 
+ # warn about #ifdefs in C files
+-#		if ($line =~ /^.#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
++#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
+ #			print "#ifdef in C files should be avoided\n";
+ #			print "$herecurr";
+ #			$clean = 0;
+ #		}
+ 
+ # warn about spacing in #ifdefs
+-		if ($line =~ /^.#\s*(ifdef|ifndef|elif)\s\s+/) {
++		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
+ 			ERROR("exactly one space required after that #$1\n" . $herecurr);
+ 		}
+ 
+@@ -1955,7 +2032,7 @@ sub process {
+ 			}
+ 		}
+ # check of hardware specific defines
+-		if ($line =~ m@^.#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m at include/asm-@) {
++		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m at include/asm-@) {
+ 			CHK("architecture specific defines should be avoided\n" .  $herecurr);
+ 		}
+ 
+@@ -1973,15 +2050,18 @@ sub process {
+ 
+ # check for new externs in .c files.
+ 		if ($realfile =~ /\.c$/ && defined $stat &&
+-		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+$Ident(\s*)\(/s)
++		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
+ 		{
+-			my $paren_space = $1;
++			my $function_name = $1;
++			my $paren_space = $2;
+ 
+ 			my $s = $stat;
+ 			if (defined $cond) {
+ 				substr($s, 0, length($cond), '');
+ 			}
+-			if ($s =~ /^\s*;/) {
++			if ($s =~ /^\s*;/ &&
++			    $function_name ne 'uninitialized_var')
++			{
+ 				WARN("externs should be avoided in .c files\n" .  $herecurr);
+ 			}
+ 
+@@ -2030,8 +2110,8 @@ sub process {
+ # use of NR_CPUS is usually wrong
+ # ignore definitions of NR_CPUS and usage to define arrays as likely right
+ 		if ($line =~ /\bNR_CPUS\b/ &&
+-		    $line !~ /^.#\s*if\b.*\bNR_CPUS\b/ &&
+-		    $line !~ /^.#\s*define\b.*\bNR_CPUS\b/ &&
++		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
++		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
+ 		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
+ 		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
+ 		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
+diff --git a/security/device_cgroup.c b/security/device_cgroup.c
+index 4ea5836..baf3488 100644
+--- a/security/device_cgroup.c
++++ b/security/device_cgroup.c
+@@ -49,10 +49,14 @@ struct dev_cgroup {
+ 	spinlock_t lock;
+ };
+ 
++static inline struct dev_cgroup *css_to_devcgroup(struct cgroup_subsys_state *s)
++{
++	return container_of(s, struct dev_cgroup, css);
++}
++
+ static inline struct dev_cgroup *cgroup_to_devcgroup(struct cgroup *cgroup)
+ {
+-	return container_of(cgroup_subsys_state(cgroup, devices_subsys_id),
+-			    struct dev_cgroup, css);
++	return css_to_devcgroup(cgroup_subsys_state(cgroup, devices_subsys_id));
+ }
+ 
+ struct cgroup_subsys devices_subsys;
+@@ -102,7 +106,7 @@ free_and_exit:
+ static int dev_whitelist_add(struct dev_cgroup *dev_cgroup,
+ 			struct dev_whitelist_item *wh)
+ {
+-	struct dev_whitelist_item *whcopy;
++	struct dev_whitelist_item *whcopy, *walk;
+ 
+ 	whcopy = kmalloc(sizeof(*whcopy), GFP_KERNEL);
+ 	if (!whcopy)
+@@ -110,7 +114,21 @@ static int dev_whitelist_add(struct dev_cgroup *dev_cgroup,
+ 
+ 	memcpy(whcopy, wh, sizeof(*whcopy));
+ 	spin_lock(&dev_cgroup->lock);
+-	list_add_tail(&whcopy->list, &dev_cgroup->whitelist);
++	list_for_each_entry(walk, &dev_cgroup->whitelist, list) {
++		if (walk->type != wh->type)
++			continue;
++		if (walk->major != wh->major)
++			continue;
++		if (walk->minor != wh->minor)
++			continue;
++
++		walk->access |= wh->access;
++		kfree(whcopy);
++		whcopy = NULL;
++	}
++
++	if (whcopy != NULL)
++		list_add_tail(&whcopy->list, &dev_cgroup->whitelist);
+ 	spin_unlock(&dev_cgroup->lock);
+ 	return 0;
+ }
+@@ -502,7 +520,6 @@ struct cgroup_subsys devices_subsys = {
+ 
+ int devcgroup_inode_permission(struct inode *inode, int mask)
+ {
+-	struct cgroup *cgroup;
+ 	struct dev_cgroup *dev_cgroup;
+ 	struct dev_whitelist_item *wh;
+ 
+@@ -511,8 +528,8 @@ int devcgroup_inode_permission(struct inode *inode, int mask)
+ 		return 0;
+ 	if (!S_ISBLK(inode->i_mode) && !S_ISCHR(inode->i_mode))
+ 		return 0;
+-	cgroup = task_cgroup(current, devices_subsys.subsys_id);
+-	dev_cgroup = cgroup_to_devcgroup(cgroup);
++	dev_cgroup = css_to_devcgroup(task_subsys_state(current,
++				devices_subsys_id));
+ 	if (!dev_cgroup)
+ 		return 0;
+ 
+@@ -543,12 +560,11 @@ acc_check:
+ 
+ int devcgroup_inode_mknod(int mode, dev_t dev)
+ {
+-	struct cgroup *cgroup;
+ 	struct dev_cgroup *dev_cgroup;
+ 	struct dev_whitelist_item *wh;
+ 
+-	cgroup = task_cgroup(current, devices_subsys.subsys_id);
+-	dev_cgroup = cgroup_to_devcgroup(cgroup);
++	dev_cgroup = css_to_devcgroup(task_subsys_state(current,
++				devices_subsys_id));
+ 	if (!dev_cgroup)
+ 		return 0;
+ 
+diff --git a/security/keys/internal.h b/security/keys/internal.h
+index 8c05587..b39f5c2 100644
+--- a/security/keys/internal.h
++++ b/security/keys/internal.h
+@@ -78,7 +78,6 @@ extern unsigned key_quota_maxbytes;
+ 
+ extern struct rb_root key_serial_tree;
+ extern spinlock_t key_serial_lock;
+-extern struct semaphore key_alloc_sem;
+ extern struct mutex key_construction_mutex;
+ extern wait_queue_head_t request_key_conswq;
+ 
+diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
+index abde5b9..548c9cc 100644
+--- a/sound/pci/emu10k1/emu10k1_main.c
++++ b/sound/pci/emu10k1/emu10k1_main.c
+@@ -1818,13 +1818,6 @@ int __devinit snd_emu10k1_create(struct snd_card *card,
+ 	}
+ 	emu->port = pci_resource_start(pci, 0);
+ 
+-	if (request_irq(pci->irq, snd_emu10k1_interrupt, IRQF_SHARED,
+-			"EMU10K1", emu)) {
+-		err = -EBUSY;
+-		goto error;
+-	}
+-	emu->irq = pci->irq;
+-
+ 	emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
+ 	if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
+ 				32 * 1024, &emu->ptb_pages) < 0) {
+@@ -1887,6 +1880,14 @@ int __devinit snd_emu10k1_create(struct snd_card *card,
+ 	emu->fx8010.etram_pages.area = NULL;
+ 	emu->fx8010.etram_pages.bytes = 0;
+ 
++	/* irq handler must be registered after I/O ports are activated */
++	if (request_irq(pci->irq, snd_emu10k1_interrupt, IRQF_SHARED,
++			"EMU10K1", emu)) {
++		err = -EBUSY;
++		goto error;
++	}
++	emu->irq = pci->irq;
++
+ 	/*
+ 	 *  Init to 0x02109204 :
+ 	 *  Clock accuracy    = 0     (1000ppm)

Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	Sat Jun  7 23:09:28 2008
@@ -1,4 +1,4 @@
-#+ bugfix/all/patch-2.6.26-rc4-git4
++ bugfix/all/patch-2.6.26-rc5-git2
 + debian/version.patch
 + debian/kernelvariables.patch
 + debian/doc-build-parallel.patch
@@ -39,4 +39,4 @@
 + features/all/0001-iwlwifi-Set-monitor-mode-for-3945.patch
 + bugfix/mips/ext4-build-fix.patch
 + bugfix/mips/malta-build-fix.patch
-+ bugfix/mips/traps-build-fix.patch
+#+ bugfix/mips/traps-build-fix.patch



More information about the Kernel-svn-changes mailing list