diff --git a/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git2.patch b/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git2.patch
new file mode 100644
index 0000000000..cd1d31f7c1
--- /dev/null
+++ b/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git2.patch
@@ -0,0 +1,3469 @@
+diff --git a/Documentation/DocBook/media-entities.tmpl b/Documentation/DocBook/media-entities.tmpl
+index 5d259c6..fea63b4 100644
+--- a/Documentation/DocBook/media-entities.tmpl
++++ b/Documentation/DocBook/media-entities.tmpl
+@@ -294,6 +294,7 @@
+
+
+
++
+
+
+
+diff --git a/Documentation/DocBook/v4l/media-ioc-setup-link.xml b/Documentation/DocBook/v4l/media-ioc-setup-link.xml
+index 2331e76..cec97af 100644
+--- a/Documentation/DocBook/v4l/media-ioc-setup-link.xml
++++ b/Documentation/DocBook/v4l/media-ioc-setup-link.xml
+@@ -34,7 +34,7 @@
+
+ request
+
+- MEDIA_IOC_ENUM_LINKS
++ MEDIA_IOC_SETUP_LINK
+
+
+
+diff --git a/Documentation/DocBook/v4l/pixfmt-y12.xml b/Documentation/DocBook/v4l/pixfmt-y12.xml
+new file mode 100644
+index 0000000..ff417b8
+--- /dev/null
++++ b/Documentation/DocBook/v4l/pixfmt-y12.xml
+@@ -0,0 +1,79 @@
++
++
++ V4L2_PIX_FMT_Y12 ('Y12 ')
++ &manvol;
++
++
++ V4L2_PIX_FMT_Y12
++ Grey-scale image
++
++
++ Description
++
++ This is a grey-scale image with a depth of 12 bits per pixel. Pixels
++are stored in 16-bit words with unused high bits padded with 0. The least
++significant byte is stored at lower memory addresses (little-endian).
++
++
++ V4L2_PIX_FMT_Y12 4 × 4
++pixel image
++
++
++ Byte Order.
++ Each cell is one byte.
++
++
++
++
++
++ start + 0:
++ Y'00low
++ Y'00high
++ Y'01low
++ Y'01high
++ Y'02low
++ Y'02high
++ Y'03low
++ Y'03high
++
++
++ start + 8:
++ Y'10low
++ Y'10high
++ Y'11low
++ Y'11high
++ Y'12low
++ Y'12high
++ Y'13low
++ Y'13high
++
++
++ start + 16:
++ Y'20low
++ Y'20high
++ Y'21low
++ Y'21high
++ Y'22low
++ Y'22high
++ Y'23low
++ Y'23high
++
++
++ start + 24:
++ Y'30low
++ Y'30high
++ Y'31low
++ Y'31high
++ Y'32low
++ Y'32high
++ Y'33low
++ Y'33high
++
++
++
++
++
++
++
++
++
+diff --git a/Documentation/DocBook/v4l/pixfmt.xml b/Documentation/DocBook/v4l/pixfmt.xml
+index c6fdcbb..40af4be 100644
+--- a/Documentation/DocBook/v4l/pixfmt.xml
++++ b/Documentation/DocBook/v4l/pixfmt.xml
+@@ -696,6 +696,7 @@ information.
+ &sub-packed-yuv;
+ &sub-grey;
+ &sub-y10;
++ &sub-y12;
+ &sub-y16;
+ &sub-yuyv;
+ &sub-uyvy;
+diff --git a/Documentation/DocBook/v4l/subdev-formats.xml b/Documentation/DocBook/v4l/subdev-formats.xml
+index 7041127..d7ccd25 100644
+--- a/Documentation/DocBook/v4l/subdev-formats.xml
++++ b/Documentation/DocBook/v4l/subdev-formats.xml
+@@ -456,6 +456,23 @@
+ b1
+ b0
+
++
++ V4L2_MBUS_FMT_SGBRG8_1X8
++ 0x3013
++
++ -
++ -
++ -
++ -
++ g7
++ g6
++ g5
++ g4
++ g3
++ g2
++ g1
++ g0
++
+
+ V4L2_MBUS_FMT_SGRBG8_1X8
+ 0x3002
+@@ -473,6 +490,23 @@
+ g1
+ g0
+
++
++ V4L2_MBUS_FMT_SRGGB8_1X8
++ 0x3014
++
++ -
++ -
++ -
++ -
++ r7
++ r6
++ r5
++ r4
++ r3
++ r2
++ r1
++ r0
++
+
+ V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8
+ 0x300b
+@@ -2159,6 +2193,31 @@
+ u1
+ u0
+
++
++ V4L2_MBUS_FMT_Y12_1X12
++ 0x2013
++
++ -
++ -
++ -
++ -
++ -
++ -
++ -
++ -
++ y11
++ y10
++ y9
++ y8
++ y7
++ y6
++ y5
++ y4
++ y3
++ y2
++ y1
++ y0
++
+
+ V4L2_MBUS_FMT_UYVY8_1X16
+ 0x200f
+diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt
+index b6ed61c..7c16347 100644
+--- a/Documentation/cgroups/memory.txt
++++ b/Documentation/cgroups/memory.txt
+@@ -52,8 +52,10 @@ Brief summary of control files.
+ tasks # attach a task(thread) and show list of threads
+ cgroup.procs # show list of processes
+ cgroup.event_control # an interface for event_fd()
+- memory.usage_in_bytes # show current memory(RSS+Cache) usage.
+- memory.memsw.usage_in_bytes # show current memory+Swap usage
++ memory.usage_in_bytes # show current res_counter usage for memory
++ (See 5.5 for details)
++ memory.memsw.usage_in_bytes # show current res_counter usage for memory+Swap
++ (See 5.5 for details)
+ memory.limit_in_bytes # set/show limit of memory usage
+ memory.memsw.limit_in_bytes # set/show limit of memory+Swap usage
+ memory.failcnt # show the number of memory usage hits limits
+@@ -453,6 +455,15 @@ memory under it will be reclaimed.
+ You can reset failcnt by writing 0 to failcnt file.
+ # echo 0 > .../memory.failcnt
+
++5.5 usage_in_bytes
++
++For efficiency, as other kernel components, memory cgroup uses some optimization
++to avoid unnecessary cacheline false sharing. usage_in_bytes is affected by the
++method and doesn't show 'exact' value of memory(and swap) usage, it's an fuzz
++value for efficient access. (Of course, when necessary, it's synchronized.)
++If you want to know more exact memory usage, you should use RSS+CACHE(+SWAP)
++value in memory.stat(see 5.2).
++
+ 6. Hierarchy support
+
+ The memory controller supports a deep hierarchy and hierarchical accounting.
+diff --git a/Documentation/video4linux/sh_mobile_ceu_camera.txt b/Documentation/video4linux/sh_mobile_ceu_camera.txt
+index cb47e72..1e96ce6 100644
+--- a/Documentation/video4linux/sh_mobile_ceu_camera.txt
++++ b/Documentation/video4linux/sh_mobile_ceu_camera.txt
+@@ -37,7 +37,7 @@ Generic scaling / cropping scheme
+ -1'-
+
+ In the above chart minuses and slashes represent "real" data amounts, points and
+-accents represent "useful" data, basically, CEU scaled amd cropped output,
++accents represent "useful" data, basically, CEU scaled and cropped output,
+ mapped back onto the client's source plane.
+
+ Such a configuration can be produced by user requests:
+@@ -65,7 +65,7 @@ Do not touch input rectangle - it is already optimal.
+
+ 1. Calculate current sensor scales:
+
+- scale_s = ((3') - (3)) / ((2') - (2))
++ scale_s = ((2') - (2)) / ((3') - (3))
+
+ 2. Calculate "effective" input crop (sensor subwindow) - CEU crop scaled back at
+ current sensor scales onto input window - this is user S_CROP:
+@@ -80,7 +80,7 @@ window:
+ 4. Calculate sensor output window by applying combined scales to real input
+ window:
+
+- width_s_out = ((2') - (2)) / scale_comb
++ width_s_out = ((7') - (7)) = ((2') - (2)) / scale_comb
+
+ 5. Apply iterative sensor S_FMT for sensor output window.
+
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 1380312..2199ba1 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -1032,12 +1032,13 @@ W: http://www.fluff.org/ben/linux/
+ S: Maintained
+ F: arch/arm/mach-s3c64xx/
+
+-ARM/S5P ARM ARCHITECTURES
++ARM/S5P EXYNOS ARM ARCHITECTURES
+ M: Kukjin Kim
+ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+ L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
+ S: Maintained
+ F: arch/arm/mach-s5p*/
++F: arch/arm/mach-exynos*/
+
+ ARM/SAMSUNG MOBILE MACHINE SUPPORT
+ M: Kyungmin Park
+@@ -2808,7 +2809,7 @@ GPIO SUBSYSTEM
+ M: Grant Likely
+ S: Maintained
+ T: git git://git.secretlab.ca/git/linux-2.6.git
+-F: Documentation/gpio/gpio.txt
++F: Documentation/gpio.txt
+ F: drivers/gpio/
+ F: include/linux/gpio*
+
+@@ -6921,6 +6922,18 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.
+ S: Maintained
+ F: drivers/platform/x86
+
++XEN HYPERVISOR INTERFACE
++M: Jeremy Fitzhardinge
++M: Konrad Rzeszutek Wilk
++L: xen-devel@lists.xensource.com (moderated for non-subscribers)
++L: virtualization@lists.linux-foundation.org
++S: Supported
++F: arch/x86/xen/
++F: drivers/*/xen-*front.c
++F: drivers/xen/
++F: arch/x86/include/asm/xen/
++F: include/xen/
++
+ XEN NETWORK BACKEND DRIVER
+ M: Ian Campbell
+ L: xen-devel@lists.xensource.com (moderated for non-subscribers)
+@@ -6942,18 +6955,6 @@ S: Supported
+ F: arch/x86/xen/*swiotlb*
+ F: drivers/xen/*swiotlb*
+
+-XEN HYPERVISOR INTERFACE
+-M: Jeremy Fitzhardinge
+-M: Konrad Rzeszutek Wilk
+-L: xen-devel@lists.xensource.com (moderated for non-subscribers)
+-L: virtualization@lists.linux-foundation.org
+-S: Supported
+-F: arch/x86/xen/
+-F: drivers/*/xen-*front.c
+-F: drivers/xen/
+-F: arch/x86/include/asm/xen/
+-F: include/xen/
+-
+ XFS FILESYSTEM
+ P: Silicon Graphics Inc
+ M: Alex Elder
+diff --git a/Makefile b/Makefile
+index 5a7a2e4..87bf242 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 39
+-EXTRAVERSION = -rc5
++EXTRAVERSION = -rc5-git2
+ NAME = Flesh-Eating Bats with Fangs
+
+ # *DOCUMENTATION*
+diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c
+index f680122..a3a94e9 100644
+--- a/arch/arm/mach-davinci/dm355.c
++++ b/arch/arm/mach-davinci/dm355.c
+@@ -314,7 +314,7 @@ static struct clk timer2_clk = {
+ .name = "timer2",
+ .parent = &pll1_aux_clk,
+ .lpsc = DAVINCI_LPSC_TIMER2,
+- .usecount = 1, /* REVISIT: why can't' this be disabled? */
++ .usecount = 1, /* REVISIT: why can't this be disabled? */
+ };
+
+ static struct clk timer3_clk = {
+diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
+index 5f8a654..4c82c27 100644
+--- a/arch/arm/mach-davinci/dm644x.c
++++ b/arch/arm/mach-davinci/dm644x.c
+@@ -274,7 +274,7 @@ static struct clk timer2_clk = {
+ .name = "timer2",
+ .parent = &pll1_aux_clk,
+ .lpsc = DAVINCI_LPSC_TIMER2,
+- .usecount = 1, /* REVISIT: why can't' this be disabled? */
++ .usecount = 1, /* REVISIT: why can't this be disabled? */
+ };
+
+ static struct clk_lookup dm644x_clks[] = {
+diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
+index 02b7a03..8b3db1c 100644
+--- a/arch/m68k/mm/motorola.c
++++ b/arch/m68k/mm/motorola.c
+@@ -300,6 +300,8 @@ void __init paging_init(void)
+ zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT;
+ free_area_init_node(i, zones_size,
+ m68k_memory[i].addr >> PAGE_SHIFT, NULL);
++ if (node_present_pages(i))
++ node_set_state(i, N_NORMAL_MEMORY);
+ }
+ }
+
+diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c
+index b7ed8d7..b1d1262 100644
+--- a/arch/parisc/mm/init.c
++++ b/arch/parisc/mm/init.c
+@@ -266,8 +266,10 @@ static void __init setup_bootmem(void)
+ }
+ memset(pfnnid_map, 0xff, sizeof(pfnnid_map));
+
+- for (i = 0; i < npmem_ranges; i++)
++ for (i = 0; i < npmem_ranges; i++) {
++ node_set_state(i, N_NORMAL_MEMORY);
+ node_set_online(i);
++ }
+ #endif
+
+ /*
+diff --git a/arch/powerpc/include/asm/uninorth.h b/arch/powerpc/include/asm/uninorth.h
+index ae9c899..d12b11d 100644
+--- a/arch/powerpc/include/asm/uninorth.h
++++ b/arch/powerpc/include/asm/uninorth.h
+@@ -60,7 +60,7 @@
+ *
+ * Obviously, the GART is not cache coherent and so any change to it
+ * must be flushed to memory (or maybe just make the GART space non
+- * cachable). AGP memory itself does't seem to be cache coherent neither.
++ * cachable). AGP memory itself doesn't seem to be cache coherent neither.
+ *
+ * In order to invalidate the GART (which is probably necessary to inval
+ * the bridge internal TLBs), the following sequence has to be written,
+diff --git a/arch/um/Kconfig.um b/arch/um/Kconfig.um
+index 90a438a..b5e675e 100644
+--- a/arch/um/Kconfig.um
++++ b/arch/um/Kconfig.um
+@@ -47,7 +47,7 @@ config HOSTFS
+
+ config HPPFS
+ tristate "HoneyPot ProcFS (EXPERIMENTAL)"
+- depends on EXPERIMENTAL
++ depends on EXPERIMENTAL && PROC_FS
+ help
+ hppfs (HoneyPot ProcFS) is a filesystem which allows UML /proc
+ entries to be overridden, removed, or fabricated from the host.
+diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h
+index e2cf786..5bd1bad 100644
+--- a/arch/um/include/asm/thread_info.h
++++ b/arch/um/include/asm/thread_info.h
+@@ -49,7 +49,10 @@ static inline struct thread_info *current_thread_info(void)
+ {
+ struct thread_info *ti;
+ unsigned long mask = THREAD_SIZE - 1;
+- ti = (struct thread_info *) (((unsigned long) &ti) & ~mask);
++ void *p;
++
++ asm volatile ("" : "=r" (p) : "0" (&ti));
++ ti = (struct thread_info *) (((unsigned long)p) & ~mask);
+ return ti;
+ }
+
+diff --git a/arch/um/sys-i386/Makefile b/arch/um/sys-i386/Makefile
+index 804b28d..b1da91c 100644
+--- a/arch/um/sys-i386/Makefile
++++ b/arch/um/sys-i386/Makefile
+@@ -4,7 +4,7 @@
+
+ obj-y = bug.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \
+ ptrace_user.o setjmp.o signal.o stub.o stub_segv.o syscalls.o sysrq.o \
+- sys_call_table.o tls.o
++ sys_call_table.o tls.o atomic64_cx8_32.o
+
+ obj-$(CONFIG_BINFMT_ELF) += elfcore.o
+
+diff --git a/arch/um/sys-i386/atomic64_cx8_32.S b/arch/um/sys-i386/atomic64_cx8_32.S
+new file mode 100644
+index 0000000..1e901d3
+--- /dev/null
++++ b/arch/um/sys-i386/atomic64_cx8_32.S
+@@ -0,0 +1,225 @@
++/*
++ * atomic64_t for 586+
++ *
++ * Copied from arch/x86/lib/atomic64_cx8_32.S
++ *
++ * Copyright © 2010 Luca Barbieri
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ */
++
++#include
++#include
++#include
++
++.macro SAVE reg
++ pushl_cfi %\reg
++ CFI_REL_OFFSET \reg, 0
++.endm
++
++.macro RESTORE reg
++ popl_cfi %\reg
++ CFI_RESTORE \reg
++.endm
++
++.macro read64 reg
++ movl %ebx, %eax
++ movl %ecx, %edx
++/* we need LOCK_PREFIX since otherwise cmpxchg8b always does the write */
++ LOCK_PREFIX
++ cmpxchg8b (\reg)
++.endm
++
++ENTRY(atomic64_read_cx8)
++ CFI_STARTPROC
++
++ read64 %ecx
++ ret
++ CFI_ENDPROC
++ENDPROC(atomic64_read_cx8)
++
++ENTRY(atomic64_set_cx8)
++ CFI_STARTPROC
++
++1:
++/* we don't need LOCK_PREFIX since aligned 64-bit writes
++ * are atomic on 586 and newer */
++ cmpxchg8b (%esi)
++ jne 1b
++
++ ret
++ CFI_ENDPROC
++ENDPROC(atomic64_set_cx8)
++
++ENTRY(atomic64_xchg_cx8)
++ CFI_STARTPROC
++
++ movl %ebx, %eax
++ movl %ecx, %edx
++1:
++ LOCK_PREFIX
++ cmpxchg8b (%esi)
++ jne 1b
++
++ ret
++ CFI_ENDPROC
++ENDPROC(atomic64_xchg_cx8)
++
++.macro addsub_return func ins insc
++ENTRY(atomic64_\func\()_return_cx8)
++ CFI_STARTPROC
++ SAVE ebp
++ SAVE ebx
++ SAVE esi
++ SAVE edi
++
++ movl %eax, %esi
++ movl %edx, %edi
++ movl %ecx, %ebp
++
++ read64 %ebp
++1:
++ movl %eax, %ebx
++ movl %edx, %ecx
++ \ins\()l %esi, %ebx
++ \insc\()l %edi, %ecx
++ LOCK_PREFIX
++ cmpxchg8b (%ebp)
++ jne 1b
++
++10:
++ movl %ebx, %eax
++ movl %ecx, %edx
++ RESTORE edi
++ RESTORE esi
++ RESTORE ebx
++ RESTORE ebp
++ ret
++ CFI_ENDPROC
++ENDPROC(atomic64_\func\()_return_cx8)
++.endm
++
++addsub_return add add adc
++addsub_return sub sub sbb
++
++.macro incdec_return func ins insc
++ENTRY(atomic64_\func\()_return_cx8)
++ CFI_STARTPROC
++ SAVE ebx
++
++ read64 %esi
++1:
++ movl %eax, %ebx
++ movl %edx, %ecx
++ \ins\()l $1, %ebx
++ \insc\()l $0, %ecx
++ LOCK_PREFIX
++ cmpxchg8b (%esi)
++ jne 1b
++
++10:
++ movl %ebx, %eax
++ movl %ecx, %edx
++ RESTORE ebx
++ ret
++ CFI_ENDPROC
++ENDPROC(atomic64_\func\()_return_cx8)
++.endm
++
++incdec_return inc add adc
++incdec_return dec sub sbb
++
++ENTRY(atomic64_dec_if_positive_cx8)
++ CFI_STARTPROC
++ SAVE ebx
++
++ read64 %esi
++1:
++ movl %eax, %ebx
++ movl %edx, %ecx
++ subl $1, %ebx
++ sbb $0, %ecx
++ js 2f
++ LOCK_PREFIX
++ cmpxchg8b (%esi)
++ jne 1b
++
++2:
++ movl %ebx, %eax
++ movl %ecx, %edx
++ RESTORE ebx
++ ret
++ CFI_ENDPROC
++ENDPROC(atomic64_dec_if_positive_cx8)
++
++ENTRY(atomic64_add_unless_cx8)
++ CFI_STARTPROC
++ SAVE ebp
++ SAVE ebx
++/* these just push these two parameters on the stack */
++ SAVE edi
++ SAVE esi
++
++ movl %ecx, %ebp
++ movl %eax, %esi
++ movl %edx, %edi
++
++ read64 %ebp
++1:
++ cmpl %eax, 0(%esp)
++ je 4f
++2:
++ movl %eax, %ebx
++ movl %edx, %ecx
++ addl %esi, %ebx
++ adcl %edi, %ecx
++ LOCK_PREFIX
++ cmpxchg8b (%ebp)
++ jne 1b
++
++ movl $1, %eax
++3:
++ addl $8, %esp
++ CFI_ADJUST_CFA_OFFSET -8
++ RESTORE ebx
++ RESTORE ebp
++ ret
++4:
++ cmpl %edx, 4(%esp)
++ jne 2b
++ xorl %eax, %eax
++ jmp 3b
++ CFI_ENDPROC
++ENDPROC(atomic64_add_unless_cx8)
++
++ENTRY(atomic64_inc_not_zero_cx8)
++ CFI_STARTPROC
++ SAVE ebx
++
++ read64 %esi
++1:
++ testl %eax, %eax
++ je 4f
++2:
++ movl %eax, %ebx
++ movl %edx, %ecx
++ addl $1, %ebx
++ adcl $0, %ecx
++ LOCK_PREFIX
++ cmpxchg8b (%esi)
++ jne 1b
++
++ movl $1, %eax
++3:
++ RESTORE ebx
++ ret
++4:
++ testl %edx, %edx
++ jne 2b
++ jmp 3b
++ CFI_ENDPROC
++ENDPROC(atomic64_inc_not_zero_cx8)
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index b136c9c..449c556 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -943,6 +943,10 @@ static int acpi_bus_get_flags(struct acpi_device *device)
+ if (ACPI_SUCCESS(status))
+ device->flags.lockable = 1;
+
++ /* Power resources cannot be power manageable. */
++ if (device->device_type == ACPI_BUS_TYPE_POWER)
++ return 0;
++
+ /* Presence of _PS0|_PR0 indicates 'power manageable' */
+ status = acpi_get_handle(device->handle, "_PS0", &temp);
+ if (ACPI_FAILURE(status))
+diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
+index fbc5b6e..abe3ab7 100644
+--- a/drivers/base/power/main.c
++++ b/drivers/base/power/main.c
+@@ -63,6 +63,7 @@ void device_pm_init(struct device *dev)
+ dev->power.wakeup = NULL;
+ spin_lock_init(&dev->power.lock);
+ pm_runtime_init(dev);
++ INIT_LIST_HEAD(&dev->power.entry);
+ }
+
+ /**
+diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
+index 4573c83..abbbd33 100644
+--- a/drivers/base/power/wakeup.c
++++ b/drivers/base/power/wakeup.c
+@@ -258,7 +258,7 @@ void device_set_wakeup_capable(struct device *dev, bool capable)
+ if (!!dev->power.can_wakeup == !!capable)
+ return;
+
+- if (device_is_registered(dev)) {
++ if (device_is_registered(dev) && !list_empty(&dev->power.entry)) {
+ if (capable) {
+ if (wakeup_sysfs_add(dev))
+ return;
+diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
+index c58f691..b493663 100644
+--- a/drivers/gpu/drm/Kconfig
++++ b/drivers/gpu/drm/Kconfig
+@@ -24,6 +24,7 @@ config DRM_KMS_HELPER
+ depends on DRM
+ select FB
+ select FRAMEBUFFER_CONSOLE if !EXPERT
++ select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
+ help
+ FB and CRTC helpers for KMS drivers.
+
+diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
+index 9507204..11d7a72 100644
+--- a/drivers/gpu/drm/drm_fb_helper.c
++++ b/drivers/gpu/drm/drm_fb_helper.c
+@@ -342,9 +342,22 @@ int drm_fb_helper_debug_leave(struct fb_info *info)
+ }
+ EXPORT_SYMBOL(drm_fb_helper_debug_leave);
+
++bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
++{
++ bool error = false;
++ int i, ret;
++ for (i = 0; i < fb_helper->crtc_count; i++) {
++ struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
++ ret = drm_crtc_helper_set_config(mode_set);
++ if (ret)
++ error = true;
++ }
++ return error;
++}
++EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode);
++
+ bool drm_fb_helper_force_kernel_mode(void)
+ {
+- int i = 0;
+ bool ret, error = false;
+ struct drm_fb_helper *helper;
+
+@@ -352,12 +365,12 @@ bool drm_fb_helper_force_kernel_mode(void)
+ return false;
+
+ list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
+- for (i = 0; i < helper->crtc_count; i++) {
+- struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set;
+- ret = drm_crtc_helper_set_config(mode_set);
+- if (ret)
+- error = true;
+- }
++ if (helper->dev->switch_power_state == DRM_SWITCH_POWER_OFF)
++ continue;
++
++ ret = drm_fb_helper_restore_fbdev_mode(helper);
++ if (ret)
++ error = true;
+ }
+ return error;
+ }
+diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
+index 7273037..12876f2 100644
+--- a/drivers/gpu/drm/i915/i915_dma.c
++++ b/drivers/gpu/drm/i915/i915_dma.c
+@@ -2207,7 +2207,7 @@ void i915_driver_lastclose(struct drm_device * dev)
+ drm_i915_private_t *dev_priv = dev->dev_private;
+
+ if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) {
+- drm_fb_helper_restore();
++ intel_fb_restore_mode(dev);
+ vga_switcheroo_process_delayed_switch();
+ return;
+ }
+diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
+index f5b0d83..1d20712 100644
+--- a/drivers/gpu/drm/i915/intel_drv.h
++++ b/drivers/gpu/drm/i915/intel_drv.h
+@@ -338,4 +338,5 @@ extern int intel_overlay_attrs(struct drm_device *dev, void *data,
+ struct drm_file *file_priv);
+
+ extern void intel_fb_output_poll_changed(struct drm_device *dev);
++extern void intel_fb_restore_mode(struct drm_device *dev);
+ #endif /* __INTEL_DRV_H__ */
+diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
+index 5127827..ec49bae 100644
+--- a/drivers/gpu/drm/i915/intel_fb.c
++++ b/drivers/gpu/drm/i915/intel_fb.c
+@@ -264,3 +264,13 @@ void intel_fb_output_poll_changed(struct drm_device *dev)
+ drm_i915_private_t *dev_priv = dev->dev_private;
+ drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper);
+ }
++
++void intel_fb_restore_mode(struct drm_device *dev)
++{
++ int ret;
++ drm_i915_private_t *dev_priv = dev->dev_private;
++
++ ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
++ if (ret)
++ DRM_DEBUG("failed to restore crtc mode\n");
++}
+diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
+index bf7d4c0..871df03 100644
+--- a/drivers/gpu/drm/radeon/radeon_kms.c
++++ b/drivers/gpu/drm/radeon/radeon_kms.c
+@@ -221,6 +221,19 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+ return -EINVAL;
+ }
+ break;
++ case RADEON_INFO_NUM_TILE_PIPES:
++ if (rdev->family >= CHIP_CAYMAN)
++ value = rdev->config.cayman.max_tile_pipes;
++ else if (rdev->family >= CHIP_CEDAR)
++ value = rdev->config.evergreen.max_tile_pipes;
++ else if (rdev->family >= CHIP_RV770)
++ value = rdev->config.rv770.max_tile_pipes;
++ else if (rdev->family >= CHIP_R600)
++ value = rdev->config.r600.max_tile_pipes;
++ else {
++ return -EINVAL;
++ }
++ break;
+ default:
+ DRM_DEBUG_KMS("Invalid request %d\n", info->request);
+ return -EINVAL;
+diff --git a/drivers/gpu/drm/radeon/reg_srcs/r600 b/drivers/gpu/drm/radeon/reg_srcs/r600
+index af0da4a..92f1900 100644
+--- a/drivers/gpu/drm/radeon/reg_srcs/r600
++++ b/drivers/gpu/drm/radeon/reg_srcs/r600
+@@ -708,6 +708,7 @@ r600 0x9400
+ 0x00028D0C DB_RENDER_CONTROL
+ 0x00028D10 DB_RENDER_OVERRIDE
+ 0x0002880C DB_SHADER_CONTROL
++0x00028D28 DB_SRESULTS_COMPARE_STATE0
+ 0x00028D2C DB_SRESULTS_COMPARE_STATE1
+ 0x00028430 DB_STENCILREFMASK
+ 0x00028434 DB_STENCILREFMASK_BF
+diff --git a/drivers/infiniband/hw/qib/qib_iba6120.c b/drivers/infiniband/hw/qib/qib_iba6120.c
+index 7de4b7e..d8ca0a0 100644
+--- a/drivers/infiniband/hw/qib/qib_iba6120.c
++++ b/drivers/infiniband/hw/qib/qib_iba6120.c
+@@ -1799,7 +1799,7 @@ static int qib_6120_setup_reset(struct qib_devdata *dd)
+ /*
+ * Keep chip from being accessed until we are ready. Use
+ * writeq() directly, to allow the write even though QIB_PRESENT
+- * isn't' set.
++ * isn't set.
+ */
+ dd->flags &= ~(QIB_INITTED | QIB_PRESENT);
+ dd->int_counter = 0; /* so we check interrupts work again */
+diff --git a/drivers/infiniband/hw/qib/qib_iba7220.c b/drivers/infiniband/hw/qib/qib_iba7220.c
+index 74fe036..c765a2e 100644
+--- a/drivers/infiniband/hw/qib/qib_iba7220.c
++++ b/drivers/infiniband/hw/qib/qib_iba7220.c
+@@ -2111,7 +2111,7 @@ static int qib_setup_7220_reset(struct qib_devdata *dd)
+ /*
+ * Keep chip from being accessed until we are ready. Use
+ * writeq() directly, to allow the write even though QIB_PRESENT
+- * isn't' set.
++ * isn't set.
+ */
+ dd->flags &= ~(QIB_INITTED | QIB_PRESENT);
+ dd->int_counter = 0; /* so we check interrupts work again */
+diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c
+index 55de3cf..6bab3ea 100644
+--- a/drivers/infiniband/hw/qib/qib_iba7322.c
++++ b/drivers/infiniband/hw/qib/qib_iba7322.c
+@@ -3299,7 +3299,7 @@ static int qib_do_7322_reset(struct qib_devdata *dd)
+ /*
+ * Keep chip from being accessed until we are ready. Use
+ * writeq() directly, to allow the write even though QIB_PRESENT
+- * isn't' set.
++ * isn't set.
+ */
+ dd->flags &= ~(QIB_INITTED | QIB_PRESENT | QIB_BADINTR);
+ dd->flags |= QIB_DOING_RESET;
+diff --git a/drivers/media/common/tuners/tda18271-common.c b/drivers/media/common/tuners/tda18271-common.c
+index 5466d47..aae40e5 100644
+--- a/drivers/media/common/tuners/tda18271-common.c
++++ b/drivers/media/common/tuners/tda18271-common.c
+@@ -533,16 +533,7 @@ int tda18271_calc_main_pll(struct dvb_frontend *fe, u32 freq)
+ if (tda_fail(ret))
+ goto fail;
+
+- regs[R_MPD] = (0x77 & pd);
+-
+- switch (priv->mode) {
+- case TDA18271_ANALOG:
+- regs[R_MPD] &= ~0x08;
+- break;
+- case TDA18271_DIGITAL:
+- regs[R_MPD] |= 0x08;
+- break;
+- }
++ regs[R_MPD] = (0x7f & pd);
+
+ div = ((d * (freq / 1000)) << 7) / 125;
+
+diff --git a/drivers/media/common/tuners/tda18271-fe.c b/drivers/media/common/tuners/tda18271-fe.c
+index 9ad4454..d884f5e 100644
+--- a/drivers/media/common/tuners/tda18271-fe.c
++++ b/drivers/media/common/tuners/tda18271-fe.c
+@@ -579,8 +579,8 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq)
+ #define RF3 2
+ u32 rf_default[3];
+ u32 rf_freq[3];
+- u8 prog_cal[3];
+- u8 prog_tab[3];
++ s32 prog_cal[3];
++ s32 prog_tab[3];
+
+ i = tda18271_lookup_rf_band(fe, &freq, NULL);
+
+@@ -602,32 +602,33 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq)
+ return bcal;
+
+ tda18271_calc_rf_cal(fe, &rf_freq[rf]);
+- prog_tab[rf] = regs[R_EB14];
++ prog_tab[rf] = (s32)regs[R_EB14];
+
+ if (1 == bcal)
+- prog_cal[rf] = tda18271_calibrate_rf(fe, rf_freq[rf]);
++ prog_cal[rf] =
++ (s32)tda18271_calibrate_rf(fe, rf_freq[rf]);
+ else
+ prog_cal[rf] = prog_tab[rf];
+
+ switch (rf) {
+ case RF1:
+ map[i].rf_a1 = 0;
+- map[i].rf_b1 = (s32)(prog_cal[RF1] - prog_tab[RF1]);
++ map[i].rf_b1 = (prog_cal[RF1] - prog_tab[RF1]);
+ map[i].rf1 = rf_freq[RF1] / 1000;
+ break;
+ case RF2:
+- dividend = (s32)(prog_cal[RF2] - prog_tab[RF2]) -
+- (s32)(prog_cal[RF1] + prog_tab[RF1]);
++ dividend = (prog_cal[RF2] - prog_tab[RF2] -
++ prog_cal[RF1] + prog_tab[RF1]);
+ divisor = (s32)(rf_freq[RF2] - rf_freq[RF1]) / 1000;
+ map[i].rf_a1 = (dividend / divisor);
+ map[i].rf2 = rf_freq[RF2] / 1000;
+ break;
+ case RF3:
+- dividend = (s32)(prog_cal[RF3] - prog_tab[RF3]) -
+- (s32)(prog_cal[RF2] + prog_tab[RF2]);
++ dividend = (prog_cal[RF3] - prog_tab[RF3] -
++ prog_cal[RF2] + prog_tab[RF2]);
+ divisor = (s32)(rf_freq[RF3] - rf_freq[RF2]) / 1000;
+ map[i].rf_a2 = (dividend / divisor);
+- map[i].rf_b2 = (s32)(prog_cal[RF2] - prog_tab[RF2]);
++ map[i].rf_b2 = (prog_cal[RF2] - prog_tab[RF2]);
+ map[i].rf3 = rf_freq[RF3] / 1000;
+ break;
+ default:
+diff --git a/drivers/media/common/tuners/tda18271-maps.c b/drivers/media/common/tuners/tda18271-maps.c
+index e7f84c7..3d5b6ab 100644
+--- a/drivers/media/common/tuners/tda18271-maps.c
++++ b/drivers/media/common/tuners/tda18271-maps.c
+@@ -229,8 +229,7 @@ static struct tda18271_map tda18271c2_km[] = {
+ static struct tda18271_map tda18271_rf_band[] = {
+ { .rfmax = 47900, .val = 0x00 },
+ { .rfmax = 61100, .val = 0x01 },
+-/* { .rfmax = 152600, .val = 0x02 }, */
+- { .rfmax = 121200, .val = 0x02 },
++ { .rfmax = 152600, .val = 0x02 },
+ { .rfmax = 164700, .val = 0x03 },
+ { .rfmax = 203500, .val = 0x04 },
+ { .rfmax = 457800, .val = 0x05 },
+@@ -448,7 +447,7 @@ static struct tda18271_map tda18271c2_rf_cal[] = {
+ { .rfmax = 150000, .val = 0xb0 },
+ { .rfmax = 151000, .val = 0xb1 },
+ { .rfmax = 152000, .val = 0xb7 },
+- { .rfmax = 153000, .val = 0xbd },
++ { .rfmax = 152600, .val = 0xbd },
+ { .rfmax = 154000, .val = 0x20 },
+ { .rfmax = 155000, .val = 0x22 },
+ { .rfmax = 156000, .val = 0x24 },
+@@ -459,7 +458,7 @@ static struct tda18271_map tda18271c2_rf_cal[] = {
+ { .rfmax = 161000, .val = 0x2d },
+ { .rfmax = 163000, .val = 0x2e },
+ { .rfmax = 164000, .val = 0x2f },
+- { .rfmax = 165000, .val = 0x30 },
++ { .rfmax = 164700, .val = 0x30 },
+ { .rfmax = 166000, .val = 0x11 },
+ { .rfmax = 167000, .val = 0x12 },
+ { .rfmax = 168000, .val = 0x13 },
+@@ -510,7 +509,8 @@ static struct tda18271_map tda18271c2_rf_cal[] = {
+ { .rfmax = 236000, .val = 0x1b },
+ { .rfmax = 237000, .val = 0x1c },
+ { .rfmax = 240000, .val = 0x1d },
+- { .rfmax = 242000, .val = 0x1f },
++ { .rfmax = 242000, .val = 0x1e },
++ { .rfmax = 244000, .val = 0x1f },
+ { .rfmax = 247000, .val = 0x20 },
+ { .rfmax = 249000, .val = 0x21 },
+ { .rfmax = 252000, .val = 0x22 },
+@@ -624,7 +624,7 @@ static struct tda18271_map tda18271c2_rf_cal[] = {
+ { .rfmax = 453000, .val = 0x93 },
+ { .rfmax = 454000, .val = 0x94 },
+ { .rfmax = 456000, .val = 0x96 },
+- { .rfmax = 457000, .val = 0x98 },
++ { .rfmax = 457800, .val = 0x98 },
+ { .rfmax = 461000, .val = 0x11 },
+ { .rfmax = 468000, .val = 0x12 },
+ { .rfmax = 472000, .val = 0x13 },
+diff --git a/drivers/media/dvb/b2c2/flexcop-pci.c b/drivers/media/dvb/b2c2/flexcop-pci.c
+index 9552540..03f96d6 100644
+--- a/drivers/media/dvb/b2c2/flexcop-pci.c
++++ b/drivers/media/dvb/b2c2/flexcop-pci.c
+@@ -38,7 +38,7 @@ MODULE_PARM_DESC(debug,
+ DEBSTATUS);
+
+ #define DRIVER_VERSION "0.1"
+-#define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV PCI Driver"
++#define DRIVER_NAME "flexcop-pci"
+ #define DRIVER_AUTHOR "Patrick Boettcher "
+
+ struct flexcop_pci {
+diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
+index fe4f894..ccbd39a 100644
+--- a/drivers/media/dvb/dvb-usb/Kconfig
++++ b/drivers/media/dvb/dvb-usb/Kconfig
+@@ -362,7 +362,7 @@ config DVB_USB_LME2510
+ config DVB_USB_TECHNISAT_USB2
+ tristate "Technisat DVB-S/S2 USB2.0 support"
+ depends on DVB_USB
+- select DVB_STB0899 if !DVB_FE_CUSTOMISE
+- select DVB_STB6100 if !DVB_FE_CUSTOMISE
++ select DVB_STV090x if !DVB_FE_CUSTOMISE
++ select DVB_STV6110x if !DVB_FE_CUSTOMISE
+ help
+ Say Y here to support the Technisat USB2 DVB-S/S2 device
+diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c
+index 97af266..65214af 100644
+--- a/drivers/media/dvb/dvb-usb/dib0700_devices.c
++++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c
+@@ -2162,7 +2162,7 @@ struct dibx000_agc_config dib7090_agc_config[2] = {
+ .agc1_pt3 = 98,
+ .agc1_slope1 = 0,
+ .agc1_slope2 = 167,
+- .agc1_pt1 = 98,
++ .agc2_pt1 = 98,
+ .agc2_pt2 = 255,
+ .agc2_slope1 = 104,
+ .agc2_slope2 = 0,
+@@ -2440,11 +2440,11 @@ static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
+ dib0700_set_i2c_speed(adap->dev, 340);
+ adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
+
+- dib7090_slave_reset(adap->fe);
+-
+ if (adap->fe == NULL)
+ return -ENODEV;
+
++ dib7090_slave_reset(adap->fe);
++
+ return 0;
+ }
+
+diff --git a/drivers/media/media-entity.c b/drivers/media/media-entity.c
+index 23640ed..056138f 100644
+--- a/drivers/media/media-entity.c
++++ b/drivers/media/media-entity.c
+@@ -378,7 +378,6 @@ EXPORT_SYMBOL_GPL(media_entity_create_link);
+
+ static int __media_entity_setup_link_notify(struct media_link *link, u32 flags)
+ {
+- const u32 mask = MEDIA_LNK_FL_ENABLED;
+ int ret;
+
+ /* Notify both entities. */
+@@ -395,7 +394,7 @@ static int __media_entity_setup_link_notify(struct media_link *link, u32 flags)
+ return ret;
+ }
+
+- link->flags = (link->flags & ~mask) | (flags & mask);
++ link->flags = flags;
+ link->reverse->flags = link->flags;
+
+ return 0;
+@@ -417,6 +416,7 @@ static int __media_entity_setup_link_notify(struct media_link *link, u32 flags)
+ */
+ int __media_entity_setup_link(struct media_link *link, u32 flags)
+ {
++ const u32 mask = MEDIA_LNK_FL_ENABLED;
+ struct media_device *mdev;
+ struct media_entity *source, *sink;
+ int ret = -EBUSY;
+@@ -424,6 +424,10 @@ int __media_entity_setup_link(struct media_link *link, u32 flags)
+ if (link == NULL)
+ return -EINVAL;
+
++ /* The non-modifiable link flags must not be modified. */
++ if ((link->flags & ~mask) != (flags & ~mask))
++ return -EINVAL;
++
+ if (link->flags & MEDIA_LNK_FL_IMMUTABLE)
+ return link->flags == flags ? 0 : -EINVAL;
+
+diff --git a/drivers/media/radio/radio-sf16fmr2.c b/drivers/media/radio/radio-sf16fmr2.c
+index dc3f04c..87bad76 100644
+--- a/drivers/media/radio/radio-sf16fmr2.c
++++ b/drivers/media/radio/radio-sf16fmr2.c
+@@ -170,7 +170,7 @@ static int fmr2_setfreq(struct fmr2 *dev)
+ return 0;
+ }
+
+-/* !!! not tested, in my card this does't work !!! */
++/* !!! not tested, in my card this doesn't work !!! */
+ static int fmr2_setvolume(struct fmr2 *dev)
+ {
+ int vol[16] = { 0x021, 0x084, 0x090, 0x104,
+diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
+index 4498b94..00f51dd 100644
+--- a/drivers/media/video/Kconfig
++++ b/drivers/media/video/Kconfig
+@@ -875,7 +875,7 @@ config MX3_VIDEO
+ config VIDEO_MX3
+ tristate "i.MX3x Camera Sensor Interface driver"
+ depends on VIDEO_DEV && MX3_IPU && SOC_CAMERA
+- select VIDEOBUF_DMA_CONTIG
++ select VIDEOBUF2_DMA_CONTIG
+ select MX3_VIDEO
+ ---help---
+ This is a v4l2 driver for the i.MX3x Camera Sensor Interface
+diff --git a/drivers/media/video/cx18/cx18-streams.c b/drivers/media/video/cx18/cx18-streams.c
+index c6e2ca3..6fbc356 100644
+--- a/drivers/media/video/cx18/cx18-streams.c
++++ b/drivers/media/video/cx18/cx18-streams.c
+@@ -350,9 +350,17 @@ void cx18_streams_cleanup(struct cx18 *cx, int unregister)
+
+ /* No struct video_device, but can have buffers allocated */
+ if (type == CX18_ENC_STREAM_TYPE_IDX) {
++ /* If the module params didn't inhibit IDX ... */
+ if (cx->stream_buffers[type] != 0) {
+ cx->stream_buffers[type] = 0;
+- cx18_stream_free(&cx->streams[type]);
++ /*
++ * Before calling cx18_stream_free(),
++ * check if the IDX stream was actually set up.
++ * Needed, since the cx18_probe() error path
++ * exits through here as well as normal clean up
++ */
++ if (cx->streams[type].buffers != 0)
++ cx18_stream_free(&cx->streams[type]);
+ }
+ continue;
+ }
+diff --git a/drivers/media/video/cx23885/Kconfig b/drivers/media/video/cx23885/Kconfig
+index 3b6e7f2..caab1bf 100644
+--- a/drivers/media/video/cx23885/Kconfig
++++ b/drivers/media/video/cx23885/Kconfig
+@@ -22,6 +22,7 @@ config VIDEO_CX23885
+ select DVB_CX24116 if !DVB_FE_CUSTOMISE
+ select DVB_STV0900 if !DVB_FE_CUSTOMISE
+ select DVB_DS3000 if !DVB_FE_CUSTOMISE
++ select DVB_STV0367 if !DVB_FE_CUSTOMISE
+ select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMISE
+ select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE
+ select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE
+diff --git a/drivers/media/video/imx074.c b/drivers/media/video/imx074.c
+index 1a11691..0382ea7 100644
+--- a/drivers/media/video/imx074.c
++++ b/drivers/media/video/imx074.c
+@@ -298,7 +298,7 @@ static unsigned long imx074_query_bus_param(struct soc_camera_device *icd)
+ static int imx074_set_bus_param(struct soc_camera_device *icd,
+ unsigned long flags)
+ {
+- return -1;
++ return -EINVAL;
+ }
+
+ static struct soc_camera_ops imx074_ops = {
+diff --git a/drivers/media/video/omap3isp/isp.c b/drivers/media/video/omap3isp/isp.c
+index 503bd79..472a693 100644
+--- a/drivers/media/video/omap3isp/isp.c
++++ b/drivers/media/video/omap3isp/isp.c
+@@ -215,20 +215,21 @@ static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel)
+ }
+
+ switch (xclksel) {
+- case 0:
++ case ISP_XCLK_A:
+ isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
+ ISPTCTRL_CTRL_DIVA_MASK,
+ divisor << ISPTCTRL_CTRL_DIVA_SHIFT);
+ dev_dbg(isp->dev, "isp_set_xclk(): cam_xclka set to %d Hz\n",
+ currentxclk);
+ break;
+- case 1:
++ case ISP_XCLK_B:
+ isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
+ ISPTCTRL_CTRL_DIVB_MASK,
+ divisor << ISPTCTRL_CTRL_DIVB_SHIFT);
+ dev_dbg(isp->dev, "isp_set_xclk(): cam_xclkb set to %d Hz\n",
+ currentxclk);
+ break;
++ case ISP_XCLK_NONE:
+ default:
+ omap3isp_put(isp);
+ dev_dbg(isp->dev, "ISP_ERR: isp_set_xclk(): Invalid requested "
+@@ -237,13 +238,13 @@ static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel)
+ }
+
+ /* Do we go from stable whatever to clock? */
+- if (divisor >= 2 && isp->xclk_divisor[xclksel] < 2)
++ if (divisor >= 2 && isp->xclk_divisor[xclksel - 1] < 2)
+ omap3isp_get(isp);
+ /* Stopping the clock. */
+- else if (divisor < 2 && isp->xclk_divisor[xclksel] >= 2)
++ else if (divisor < 2 && isp->xclk_divisor[xclksel - 1] >= 2)
+ omap3isp_put(isp);
+
+- isp->xclk_divisor[xclksel] = divisor;
++ isp->xclk_divisor[xclksel - 1] = divisor;
+
+ omap3isp_put(isp);
+
+@@ -285,7 +286,8 @@ static void isp_power_settings(struct isp_device *isp, int idle)
+ */
+ void omap3isp_configure_bridge(struct isp_device *isp,
+ enum ccdc_input_entity input,
+- const struct isp_parallel_platform_data *pdata)
++ const struct isp_parallel_platform_data *pdata,
++ unsigned int shift)
+ {
+ u32 ispctrl_val;
+
+@@ -298,9 +300,9 @@ void omap3isp_configure_bridge(struct isp_device *isp,
+ switch (input) {
+ case CCDC_INPUT_PARALLEL:
+ ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_PARALLEL;
+- ispctrl_val |= pdata->data_lane_shift << ISPCTRL_SHIFT_SHIFT;
+ ispctrl_val |= pdata->clk_pol << ISPCTRL_PAR_CLK_POL_SHIFT;
+ ispctrl_val |= pdata->bridge << ISPCTRL_PAR_BRIDGE_SHIFT;
++ shift += pdata->data_lane_shift * 2;
+ break;
+
+ case CCDC_INPUT_CSI2A:
+@@ -319,6 +321,8 @@ void omap3isp_configure_bridge(struct isp_device *isp,
+ return;
+ }
+
++ ispctrl_val |= ((shift/2) << ISPCTRL_SHIFT_SHIFT) & ISPCTRL_SHIFT_MASK;
++
+ ispctrl_val &= ~ISPCTRL_SYNC_DETECT_MASK;
+ ispctrl_val |= ISPCTRL_SYNC_DETECT_VSRISE;
+
+@@ -658,6 +662,8 @@ int omap3isp_pipeline_pm_use(struct media_entity *entity, int use)
+
+ /* Apply power change to connected non-nodes. */
+ ret = isp_pipeline_pm_power(entity, change);
++ if (ret < 0)
++ entity->use_count -= change;
+
+ mutex_unlock(&entity->parent->graph_mutex);
+
+@@ -872,6 +878,9 @@ static int isp_pipeline_disable(struct isp_pipeline *pipe)
+ }
+ }
+
++ if (failure < 0)
++ isp->needs_reset = true;
++
+ return failure;
+ }
+
+@@ -884,7 +893,8 @@ static int isp_pipeline_disable(struct isp_pipeline *pipe)
+ * single-shot or continuous mode.
+ *
+ * Return 0 if successful, or the return value of the failed video::s_stream
+- * operation otherwise.
++ * operation otherwise. The pipeline state is not updated when the operation
++ * fails, except when stopping the pipeline.
+ */
+ int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe,
+ enum isp_pipeline_stream_state state)
+@@ -895,7 +905,9 @@ int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe,
+ ret = isp_pipeline_disable(pipe);
+ else
+ ret = isp_pipeline_enable(pipe, state);
+- pipe->stream_state = state;
++
++ if (ret == 0 || state == ISP_PIPELINE_STREAM_STOPPED)
++ pipe->stream_state = state;
+
+ return ret;
+ }
+@@ -1481,6 +1493,10 @@ void omap3isp_put(struct isp_device *isp)
+ if (--isp->ref_count == 0) {
+ isp_disable_interrupts(isp);
+ isp_save_ctx(isp);
++ if (isp->needs_reset) {
++ isp_reset(isp);
++ isp->needs_reset = false;
++ }
+ isp_disable_clocks(isp);
+ }
+ mutex_unlock(&isp->isp_mutex);
+diff --git a/drivers/media/video/omap3isp/isp.h b/drivers/media/video/omap3isp/isp.h
+index cf5214e..2620c40 100644
+--- a/drivers/media/video/omap3isp/isp.h
++++ b/drivers/media/video/omap3isp/isp.h
+@@ -132,7 +132,6 @@ struct isp_reg {
+
+ /**
+ * struct isp_parallel_platform_data - Parallel interface platform data
+- * @width: Parallel bus width in bits (8, 10, 11 or 12)
+ * @data_lane_shift: Data lane shifter
+ * 0 - CAMEXT[13:0] -> CAM[13:0]
+ * 1 - CAMEXT[13:2] -> CAM[11:0]
+@@ -146,7 +145,6 @@ struct isp_reg {
+ * ISPCTRL_PAR_BRIDGE_BENDIAN - Big endian
+ */
+ struct isp_parallel_platform_data {
+- unsigned int width;
+ unsigned int data_lane_shift:2;
+ unsigned int clk_pol:1;
+ unsigned int bridge:4;
+@@ -262,6 +260,7 @@ struct isp_device {
+ /* ISP Obj */
+ spinlock_t stat_lock; /* common lock for statistic drivers */
+ struct mutex isp_mutex; /* For handling ref_count field */
++ bool needs_reset;
+ int has_context;
+ int ref_count;
+ unsigned int autoidle;
+@@ -311,11 +310,12 @@ int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe,
+ enum isp_pipeline_stream_state state);
+ void omap3isp_configure_bridge(struct isp_device *isp,
+ enum ccdc_input_entity input,
+- const struct isp_parallel_platform_data *pdata);
++ const struct isp_parallel_platform_data *pdata,
++ unsigned int shift);
+
+-#define ISP_XCLK_NONE -1
+-#define ISP_XCLK_A 0
+-#define ISP_XCLK_B 1
++#define ISP_XCLK_NONE 0
++#define ISP_XCLK_A 1
++#define ISP_XCLK_B 2
+
+ struct isp_device *omap3isp_get(struct isp_device *isp);
+ void omap3isp_put(struct isp_device *isp);
+diff --git a/drivers/media/video/omap3isp/ispccdc.c b/drivers/media/video/omap3isp/ispccdc.c
+index 5ff9d14..39d501b 100644
+--- a/drivers/media/video/omap3isp/ispccdc.c
++++ b/drivers/media/video/omap3isp/ispccdc.c
+@@ -43,6 +43,12 @@ __ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
+
+ static const unsigned int ccdc_fmts[] = {
+ V4L2_MBUS_FMT_Y8_1X8,
++ V4L2_MBUS_FMT_Y10_1X10,
++ V4L2_MBUS_FMT_Y12_1X12,
++ V4L2_MBUS_FMT_SGRBG8_1X8,
++ V4L2_MBUS_FMT_SRGGB8_1X8,
++ V4L2_MBUS_FMT_SBGGR8_1X8,
++ V4L2_MBUS_FMT_SGBRG8_1X8,
+ V4L2_MBUS_FMT_SGRBG10_1X10,
+ V4L2_MBUS_FMT_SRGGB10_1X10,
+ V4L2_MBUS_FMT_SBGGR10_1X10,
+@@ -1110,21 +1116,38 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)
+ struct isp_parallel_platform_data *pdata = NULL;
+ struct v4l2_subdev *sensor;
+ struct v4l2_mbus_framefmt *format;
++ const struct isp_format_info *fmt_info;
++ struct v4l2_subdev_format fmt_src;
++ unsigned int depth_out;
++ unsigned int depth_in = 0;
+ struct media_pad *pad;
+ unsigned long flags;
++ unsigned int shift;
+ u32 syn_mode;
+ u32 ccdc_pattern;
+
+- if (ccdc->input == CCDC_INPUT_PARALLEL) {
+- pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]);
+- sensor = media_entity_to_v4l2_subdev(pad->entity);
++ pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]);
++ sensor = media_entity_to_v4l2_subdev(pad->entity);
++ if (ccdc->input == CCDC_INPUT_PARALLEL)
+ pdata = &((struct isp_v4l2_subdevs_group *)sensor->host_priv)
+ ->bus.parallel;
++
++ /* Compute shift value for lane shifter to configure the bridge. */
++ fmt_src.pad = pad->index;
++ fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE;
++ if (!v4l2_subdev_call(sensor, pad, get_fmt, NULL, &fmt_src)) {
++ fmt_info = omap3isp_video_format_info(fmt_src.format.code);
++ depth_in = fmt_info->bpp;
+ }
+
+- omap3isp_configure_bridge(isp, ccdc->input, pdata);
++ fmt_info = omap3isp_video_format_info
++ (isp->isp_ccdc.formats[CCDC_PAD_SINK].code);
++ depth_out = fmt_info->bpp;
++
++ shift = depth_in - depth_out;
++ omap3isp_configure_bridge(isp, ccdc->input, pdata, shift);
+
+- ccdc->syncif.datsz = pdata ? pdata->width : 10;
++ ccdc->syncif.datsz = depth_out;
+ ccdc_config_sync_if(ccdc, &ccdc->syncif);
+
+ /* CCDC_PAD_SINK */
+@@ -1338,7 +1361,7 @@ static int ccdc_sbl_wait_idle(struct isp_ccdc_device *ccdc,
+ * @ccdc: Pointer to ISP CCDC device.
+ * @event: Pointing which event trigger handler
+ *
+- * Return 1 when the event and stopping request combination is satisfyied,
++ * Return 1 when the event and stopping request combination is satisfied,
+ * zero otherwise.
+ */
+ static int __ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event)
+@@ -1618,7 +1641,7 @@ static int ccdc_video_queue(struct isp_video *video, struct isp_buffer *buffer)
+
+ ccdc_set_outaddr(ccdc, buffer->isp_addr);
+
+- /* We now have a buffer queued on the output, restart the pipeline in
++ /* We now have a buffer queued on the output, restart the pipeline
+ * on the next CCDC interrupt if running in continuous mode (or when
+ * starting the stream).
+ */
+diff --git a/drivers/media/video/omap3isp/isppreview.c b/drivers/media/video/omap3isp/isppreview.c
+index 2b16988..aba537a 100644
+--- a/drivers/media/video/omap3isp/isppreview.c
++++ b/drivers/media/video/omap3isp/isppreview.c
+@@ -755,7 +755,7 @@ static struct preview_update update_attrs[] = {
+ * @configs - pointer to update config structure.
+ * @config - return pointer to appropriate structure field.
+ * @bit - for which feature to return pointers.
+- * Return size of coresponding prev_params member
++ * Return size of corresponding prev_params member
+ */
+ static u32
+ __preview_get_ptrs(struct prev_params *params, void **param,
+diff --git a/drivers/media/video/omap3isp/ispqueue.c b/drivers/media/video/omap3isp/ispqueue.c
+index 8fddc58..9c31714 100644
+--- a/drivers/media/video/omap3isp/ispqueue.c
++++ b/drivers/media/video/omap3isp/ispqueue.c
+@@ -339,7 +339,7 @@ static int isp_video_buffer_prepare_user(struct isp_video_buffer *buf)
+ up_read(¤t->mm->mmap_sem);
+
+ if (ret != buf->npages) {
+- buf->npages = ret;
++ buf->npages = ret < 0 ? 0 : ret;
+ isp_video_buffer_cleanup(buf);
+ return -EFAULT;
+ }
+@@ -408,8 +408,8 @@ done:
+ * isp_video_buffer_prepare_vm_flags - Get VMA flags for a userspace address
+ *
+ * This function locates the VMAs for the buffer's userspace address and checks
+- * that their flags match. The onlflag that we need to care for at the moment is
+- * VM_PFNMAP.
++ * that their flags match. The only flag that we need to care for at the moment
++ * is VM_PFNMAP.
+ *
+ * The buffer vm_flags field is set to the first VMA flags.
+ *
+diff --git a/drivers/media/video/omap3isp/ispresizer.c b/drivers/media/video/omap3isp/ispresizer.c
+index 653f88b..0bb0f8c 100644
+--- a/drivers/media/video/omap3isp/ispresizer.c
++++ b/drivers/media/video/omap3isp/ispresizer.c
+@@ -714,19 +714,50 @@ static void resizer_print_status(struct isp_res_device *res)
+ * iw and ih are the input width and height after cropping. Those equations need
+ * to be satisfied exactly for the resizer to work correctly.
+ *
+- * Reverting the equations, we can compute the resizing ratios with
++ * The equations can't be easily reverted, as the >> 8 operation is not linear.
++ * In addition, not all input sizes can be achieved for a given output size. To
++ * get the highest input size lower than or equal to the requested input size,
++ * we need to compute the highest resizing ratio that satisfies the following
++ * inequality (taking the 4-tap mode width equation as an example)
++ *
++ * iw >= (32 * sph + (ow - 1) * hrsz + 16) >> 8 - 7
++ *
++ * (where iw is the requested input width) which can be rewritten as
++ *
++ * iw - 7 >= (32 * sph + (ow - 1) * hrsz + 16) >> 8
++ * (iw - 7) << 8 >= 32 * sph + (ow - 1) * hrsz + 16 - b
++ * ((iw - 7) << 8) + b >= 32 * sph + (ow - 1) * hrsz + 16
++ *
++ * where b is the value of the 8 least significant bits of the right hand side
++ * expression of the last inequality. The highest resizing ratio value will be
++ * achieved when b is equal to its maximum value of 255. That resizing ratio
++ * value will still satisfy the original inequality, as b will disappear when
++ * the expression will be shifted right by 8.
++ *
++ * The reverted the equations thus become
+ *
+ * - 8-phase, 4-tap mode
+- * hrsz = ((iw - 7) * 256 - 16 - 32 * sph) / (ow - 1)
+- * vrsz = ((ih - 4) * 256 - 16 - 32 * spv) / (oh - 1)
++ * hrsz = ((iw - 7) * 256 + 255 - 16 - 32 * sph) / (ow - 1)
++ * vrsz = ((ih - 4) * 256 + 255 - 16 - 32 * spv) / (oh - 1)
+ * - 4-phase, 7-tap mode
+- * hrsz = ((iw - 7) * 256 - 32 - 64 * sph) / (ow - 1)
+- * vrsz = ((ih - 7) * 256 - 32 - 64 * spv) / (oh - 1)
++ * hrsz = ((iw - 7) * 256 + 255 - 32 - 64 * sph) / (ow - 1)
++ * vrsz = ((ih - 7) * 256 + 255 - 32 - 64 * spv) / (oh - 1)
+ *
+- * The ratios are integer values, and must be rounded down to ensure that the
+- * cropped input size is not bigger than the uncropped input size. As the ratio
+- * in 7-tap mode is always smaller than the ratio in 4-tap mode, we can use the
+- * 7-tap mode equations to compute a ratio approximation.
++ * The ratios are integer values, and are rounded down to ensure that the
++ * cropped input size is not bigger than the uncropped input size.
++ *
++ * As the number of phases/taps, used to select the correct equations to compute
++ * the ratio, depends on the ratio, we start with the 4-tap mode equations to
++ * compute an approximation of the ratio, and switch to the 7-tap mode equations
++ * if the approximation is higher than the ratio threshold.
++ *
++ * As the 7-tap mode equations will return a ratio smaller than or equal to the
++ * 4-tap mode equations, the resulting ratio could become lower than or equal to
++ * the ratio threshold. This 'equations loop' isn't an issue as long as the
++ * correct equations are used to compute the final input size. Starting with the
++ * 4-tap mode equations ensure that, in case of values resulting in a 'ratio
++ * loop', the smallest of the ratio values will be used, never exceeding the
++ * requested input size.
+ *
+ * We first clamp the output size according to the hardware capabilitie to avoid
+ * auto-cropping the input more than required to satisfy the TRM equations. The
+@@ -775,6 +806,8 @@ static void resizer_calc_ratios(struct isp_res_device *res,
+ unsigned int max_width;
+ unsigned int max_height;
+ unsigned int width_alignment;
++ unsigned int width;
++ unsigned int height;
+
+ /*
+ * Clamp the output height based on the hardware capabilities and
+@@ -786,19 +819,22 @@ static void resizer_calc_ratios(struct isp_res_device *res,
+ max_height = min_t(unsigned int, max_height, MAX_OUT_HEIGHT);
+ output->height = clamp(output->height, min_height, max_height);
+
+- ratio->vert = ((input->height - 7) * 256 - 32 - 64 * spv)
++ ratio->vert = ((input->height - 4) * 256 + 255 - 16 - 32 * spv)
+ / (output->height - 1);
++ if (ratio->vert > MID_RESIZE_VALUE)
++ ratio->vert = ((input->height - 7) * 256 + 255 - 32 - 64 * spv)
++ / (output->height - 1);
+ ratio->vert = clamp_t(unsigned int, ratio->vert,
+ MIN_RESIZE_VALUE, MAX_RESIZE_VALUE);
+
+ if (ratio->vert <= MID_RESIZE_VALUE) {
+ upscaled_height = (output->height - 1) * ratio->vert
+ + 32 * spv + 16;
+- input->height = (upscaled_height >> 8) + 4;
++ height = (upscaled_height >> 8) + 4;
+ } else {
+ upscaled_height = (output->height - 1) * ratio->vert
+ + 64 * spv + 32;
+- input->height = (upscaled_height >> 8) + 7;
++ height = (upscaled_height >> 8) + 7;
+ }
+
+ /*
+@@ -854,20 +890,29 @@ static void resizer_calc_ratios(struct isp_res_device *res,
+ max_width & ~(width_alignment - 1));
+ output->width = ALIGN(output->width, width_alignment);
+
+- ratio->horz = ((input->width - 7) * 256 - 32 - 64 * sph)
++ ratio->horz = ((input->width - 7) * 256 + 255 - 16 - 32 * sph)
+ / (output->width - 1);
++ if (ratio->horz > MID_RESIZE_VALUE)
++ ratio->horz = ((input->width - 7) * 256 + 255 - 32 - 64 * sph)
++ / (output->width - 1);
+ ratio->horz = clamp_t(unsigned int, ratio->horz,
+ MIN_RESIZE_VALUE, MAX_RESIZE_VALUE);
+
+ if (ratio->horz <= MID_RESIZE_VALUE) {
+ upscaled_width = (output->width - 1) * ratio->horz
+ + 32 * sph + 16;
+- input->width = (upscaled_width >> 8) + 7;
++ width = (upscaled_width >> 8) + 7;
+ } else {
+ upscaled_width = (output->width - 1) * ratio->horz
+ + 64 * sph + 32;
+- input->width = (upscaled_width >> 8) + 7;
++ width = (upscaled_width >> 8) + 7;
+ }
++
++ /* Center the new crop rectangle. */
++ input->left += (input->width - width) / 2;
++ input->top += (input->height - height) / 2;
++ input->width = width;
++ input->height = height;
+ }
+
+ /*
+diff --git a/drivers/media/video/omap3isp/ispstat.h b/drivers/media/video/omap3isp/ispstat.h
+index 820950c..d86da94 100644
+--- a/drivers/media/video/omap3isp/ispstat.h
++++ b/drivers/media/video/omap3isp/ispstat.h
+@@ -131,9 +131,9 @@ struct ispstat {
+ struct ispstat_generic_config {
+ /*
+ * Fields must be in the same order as in:
+- * - isph3a_aewb_config
+- * - isph3a_af_config
+- * - isphist_config
++ * - omap3isp_h3a_aewb_config
++ * - omap3isp_h3a_af_config
++ * - omap3isp_hist_config
+ */
+ u32 buf_size;
+ u16 config_counter;
+diff --git a/drivers/media/video/omap3isp/ispvideo.c b/drivers/media/video/omap3isp/ispvideo.c
+index 208a7ec..9cd8f1a 100644
+--- a/drivers/media/video/omap3isp/ispvideo.c
++++ b/drivers/media/video/omap3isp/ispvideo.c
+@@ -47,29 +47,59 @@
+
+ static struct isp_format_info formats[] = {
+ { V4L2_MBUS_FMT_Y8_1X8, V4L2_MBUS_FMT_Y8_1X8,
+- V4L2_MBUS_FMT_Y8_1X8, V4L2_PIX_FMT_GREY, 8, },
++ V4L2_MBUS_FMT_Y8_1X8, V4L2_MBUS_FMT_Y8_1X8,
++ V4L2_PIX_FMT_GREY, 8, },
++ { V4L2_MBUS_FMT_Y10_1X10, V4L2_MBUS_FMT_Y10_1X10,
++ V4L2_MBUS_FMT_Y10_1X10, V4L2_MBUS_FMT_Y8_1X8,
++ V4L2_PIX_FMT_Y10, 10, },
++ { V4L2_MBUS_FMT_Y12_1X12, V4L2_MBUS_FMT_Y10_1X10,
++ V4L2_MBUS_FMT_Y12_1X12, V4L2_MBUS_FMT_Y8_1X8,
++ V4L2_PIX_FMT_Y12, 12, },
++ { V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_MBUS_FMT_SBGGR8_1X8,
++ V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_MBUS_FMT_SBGGR8_1X8,
++ V4L2_PIX_FMT_SBGGR8, 8, },
++ { V4L2_MBUS_FMT_SGBRG8_1X8, V4L2_MBUS_FMT_SGBRG8_1X8,
++ V4L2_MBUS_FMT_SGBRG8_1X8, V4L2_MBUS_FMT_SGBRG8_1X8,
++ V4L2_PIX_FMT_SGBRG8, 8, },
++ { V4L2_MBUS_FMT_SGRBG8_1X8, V4L2_MBUS_FMT_SGRBG8_1X8,
++ V4L2_MBUS_FMT_SGRBG8_1X8, V4L2_MBUS_FMT_SGRBG8_1X8,
++ V4L2_PIX_FMT_SGRBG8, 8, },
++ { V4L2_MBUS_FMT_SRGGB8_1X8, V4L2_MBUS_FMT_SRGGB8_1X8,
++ V4L2_MBUS_FMT_SRGGB8_1X8, V4L2_MBUS_FMT_SRGGB8_1X8,
++ V4L2_PIX_FMT_SRGGB8, 8, },
+ { V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8, V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8,
+- V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_PIX_FMT_SGRBG10DPCM8, 8, },
++ V4L2_MBUS_FMT_SGRBG10_1X10, 0,
++ V4L2_PIX_FMT_SGRBG10DPCM8, 8, },
+ { V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_MBUS_FMT_SBGGR10_1X10,
+- V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_PIX_FMT_SBGGR10, 10, },
++ V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_MBUS_FMT_SBGGR8_1X8,
++ V4L2_PIX_FMT_SBGGR10, 10, },
+ { V4L2_MBUS_FMT_SGBRG10_1X10, V4L2_MBUS_FMT_SGBRG10_1X10,
+- V4L2_MBUS_FMT_SGBRG10_1X10, V4L2_PIX_FMT_SGBRG10, 10, },
++ V4L2_MBUS_FMT_SGBRG10_1X10, V4L2_MBUS_FMT_SGBRG8_1X8,
++ V4L2_PIX_FMT_SGBRG10, 10, },
+ { V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_MBUS_FMT_SGRBG10_1X10,
+- V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_PIX_FMT_SGRBG10, 10, },
++ V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_MBUS_FMT_SGRBG8_1X8,
++ V4L2_PIX_FMT_SGRBG10, 10, },
+ { V4L2_MBUS_FMT_SRGGB10_1X10, V4L2_MBUS_FMT_SRGGB10_1X10,
+- V4L2_MBUS_FMT_SRGGB10_1X10, V4L2_PIX_FMT_SRGGB10, 10, },
++ V4L2_MBUS_FMT_SRGGB10_1X10, V4L2_MBUS_FMT_SRGGB8_1X8,
++ V4L2_PIX_FMT_SRGGB10, 10, },
+ { V4L2_MBUS_FMT_SBGGR12_1X12, V4L2_MBUS_FMT_SBGGR10_1X10,
+- V4L2_MBUS_FMT_SBGGR12_1X12, V4L2_PIX_FMT_SBGGR12, 12, },
++ V4L2_MBUS_FMT_SBGGR12_1X12, V4L2_MBUS_FMT_SBGGR8_1X8,
++ V4L2_PIX_FMT_SBGGR12, 12, },
+ { V4L2_MBUS_FMT_SGBRG12_1X12, V4L2_MBUS_FMT_SGBRG10_1X10,
+- V4L2_MBUS_FMT_SGBRG12_1X12, V4L2_PIX_FMT_SGBRG12, 12, },
++ V4L2_MBUS_FMT_SGBRG12_1X12, V4L2_MBUS_FMT_SGBRG8_1X8,
++ V4L2_PIX_FMT_SGBRG12, 12, },
+ { V4L2_MBUS_FMT_SGRBG12_1X12, V4L2_MBUS_FMT_SGRBG10_1X10,
+- V4L2_MBUS_FMT_SGRBG12_1X12, V4L2_PIX_FMT_SGRBG12, 12, },
++ V4L2_MBUS_FMT_SGRBG12_1X12, V4L2_MBUS_FMT_SGRBG8_1X8,
++ V4L2_PIX_FMT_SGRBG12, 12, },
+ { V4L2_MBUS_FMT_SRGGB12_1X12, V4L2_MBUS_FMT_SRGGB10_1X10,
+- V4L2_MBUS_FMT_SRGGB12_1X12, V4L2_PIX_FMT_SRGGB12, 12, },
++ V4L2_MBUS_FMT_SRGGB12_1X12, V4L2_MBUS_FMT_SRGGB8_1X8,
++ V4L2_PIX_FMT_SRGGB12, 12, },
+ { V4L2_MBUS_FMT_UYVY8_1X16, V4L2_MBUS_FMT_UYVY8_1X16,
+- V4L2_MBUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_UYVY, 16, },
++ V4L2_MBUS_FMT_UYVY8_1X16, 0,
++ V4L2_PIX_FMT_UYVY, 16, },
+ { V4L2_MBUS_FMT_YUYV8_1X16, V4L2_MBUS_FMT_YUYV8_1X16,
+- V4L2_MBUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_YUYV, 16, },
++ V4L2_MBUS_FMT_YUYV8_1X16, 0,
++ V4L2_PIX_FMT_YUYV, 16, },
+ };
+
+ const struct isp_format_info *
+@@ -86,6 +116,37 @@ omap3isp_video_format_info(enum v4l2_mbus_pixelcode code)
+ }
+
+ /*
++ * Decide whether desired output pixel code can be obtained with
++ * the lane shifter by shifting the input pixel code.
++ * @in: input pixelcode to shifter
++ * @out: output pixelcode from shifter
++ * @additional_shift: # of bits the sensor's LSB is offset from CAMEXT[0]
++ *
++ * return true if the combination is possible
++ * return false otherwise
++ */
++static bool isp_video_is_shiftable(enum v4l2_mbus_pixelcode in,
++ enum v4l2_mbus_pixelcode out,
++ unsigned int additional_shift)
++{
++ const struct isp_format_info *in_info, *out_info;
++
++ if (in == out)
++ return true;
++
++ in_info = omap3isp_video_format_info(in);
++ out_info = omap3isp_video_format_info(out);
++
++ if ((in_info->flavor == 0) || (out_info->flavor == 0))
++ return false;
++
++ if (in_info->flavor != out_info->flavor)
++ return false;
++
++ return in_info->bpp - out_info->bpp + additional_shift <= 6;
++}
++
++/*
+ * isp_video_mbus_to_pix - Convert v4l2_mbus_framefmt to v4l2_pix_format
+ * @video: ISP video instance
+ * @mbus: v4l2_mbus_framefmt format (input)
+@@ -235,6 +296,7 @@ static int isp_video_validate_pipeline(struct isp_pipeline *pipe)
+ return -EPIPE;
+
+ while (1) {
++ unsigned int shifter_link;
+ /* Retrieve the sink format */
+ pad = &subdev->entity.pads[0];
+ if (!(pad->flags & MEDIA_PAD_FL_SINK))
+@@ -263,6 +325,10 @@ static int isp_video_validate_pipeline(struct isp_pipeline *pipe)
+ return -ENOSPC;
+ }
+
++ /* If sink pad is on CCDC, the link has the lane shifter
++ * in the middle of it. */
++ shifter_link = subdev == &isp->isp_ccdc.subdev;
++
+ /* Retrieve the source format */
+ pad = media_entity_remote_source(pad);
+ if (pad == NULL ||
+@@ -278,10 +344,24 @@ static int isp_video_validate_pipeline(struct isp_pipeline *pipe)
+ return -EPIPE;
+
+ /* Check if the two ends match */
+- if (fmt_source.format.code != fmt_sink.format.code ||
+- fmt_source.format.width != fmt_sink.format.width ||
++ if (fmt_source.format.width != fmt_sink.format.width ||
+ fmt_source.format.height != fmt_sink.format.height)
+ return -EPIPE;
++
++ if (shifter_link) {
++ unsigned int parallel_shift = 0;
++ if (isp->isp_ccdc.input == CCDC_INPUT_PARALLEL) {
++ struct isp_parallel_platform_data *pdata =
++ &((struct isp_v4l2_subdevs_group *)
++ subdev->host_priv)->bus.parallel;
++ parallel_shift = pdata->data_lane_shift * 2;
++ }
++ if (!isp_video_is_shiftable(fmt_source.format.code,
++ fmt_sink.format.code,
++ parallel_shift))
++ return -EPIPE;
++ } else if (fmt_source.format.code != fmt_sink.format.code)
++ return -EPIPE;
+ }
+
+ return 0;
+diff --git a/drivers/media/video/omap3isp/ispvideo.h b/drivers/media/video/omap3isp/ispvideo.h
+index 524a1ac..911bea6 100644
+--- a/drivers/media/video/omap3isp/ispvideo.h
++++ b/drivers/media/video/omap3isp/ispvideo.h
+@@ -49,6 +49,8 @@ struct v4l2_pix_format;
+ * bits. Identical to @code if the format is 10 bits wide or less.
+ * @uncompressed: V4L2 media bus format code for the corresponding uncompressed
+ * format. Identical to @code if the format is not DPCM compressed.
++ * @flavor: V4L2 media bus format code for the same pixel layout but
++ * shifted to be 8 bits per pixel. =0 if format is not shiftable.
+ * @pixelformat: V4L2 pixel format FCC identifier
+ * @bpp: Bits per pixel
+ */
+@@ -56,6 +58,7 @@ struct isp_format_info {
+ enum v4l2_mbus_pixelcode code;
+ enum v4l2_mbus_pixelcode truncated;
+ enum v4l2_mbus_pixelcode uncompressed;
++ enum v4l2_mbus_pixelcode flavor;
+ u32 pixelformat;
+ unsigned int bpp;
+ };
+diff --git a/drivers/media/video/s5p-fimc/fimc-capture.c b/drivers/media/video/s5p-fimc/fimc-capture.c
+index 95f8b4e1..d142b40 100644
+--- a/drivers/media/video/s5p-fimc/fimc-capture.c
++++ b/drivers/media/video/s5p-fimc/fimc-capture.c
+@@ -527,7 +527,7 @@ static int fimc_cap_s_fmt_mplane(struct file *file, void *priv,
+ if (ret)
+ return ret;
+
+- if (vb2_is_streaming(&fimc->vid_cap.vbq) || fimc_capture_active(fimc))
++ if (vb2_is_busy(&fimc->vid_cap.vbq) || fimc_capture_active(fimc))
+ return -EBUSY;
+
+ frame = &ctx->d_frame;
+@@ -539,8 +539,10 @@ static int fimc_cap_s_fmt_mplane(struct file *file, void *priv,
+ return -EINVAL;
+ }
+
+- for (i = 0; i < frame->fmt->colplanes; i++)
+- frame->payload[i] = pix->plane_fmt[i].bytesperline * pix->height;
++ for (i = 0; i < frame->fmt->colplanes; i++) {
++ frame->payload[i] =
++ (pix->width * pix->height * frame->fmt->depth[i]) >> 3;
++ }
+
+ /* Output DMA frame pixel size and offsets. */
+ frame->f_width = pix->plane_fmt[0].bytesperline * 8
+diff --git a/drivers/media/video/s5p-fimc/fimc-core.c b/drivers/media/video/s5p-fimc/fimc-core.c
+index 6c919b3..dc91a85 100644
+--- a/drivers/media/video/s5p-fimc/fimc-core.c
++++ b/drivers/media/video/s5p-fimc/fimc-core.c
+@@ -361,10 +361,20 @@ static void fimc_capture_irq_handler(struct fimc_dev *fimc)
+ {
+ struct fimc_vid_cap *cap = &fimc->vid_cap;
+ struct fimc_vid_buffer *v_buf;
++ struct timeval *tv;
++ struct timespec ts;
+
+ if (!list_empty(&cap->active_buf_q) &&
+ test_bit(ST_CAPT_RUN, &fimc->state)) {
++ ktime_get_real_ts(&ts);
++
+ v_buf = active_queue_pop(cap);
++
++ tv = &v_buf->vb.v4l2_buf.timestamp;
++ tv->tv_sec = ts.tv_sec;
++ tv->tv_usec = ts.tv_nsec / NSEC_PER_USEC;
++ v_buf->vb.v4l2_buf.sequence = cap->frame_count++;
++
+ vb2_buffer_done(&v_buf->vb, VB2_BUF_STATE_DONE);
+ }
+
+@@ -758,7 +768,7 @@ static void fimc_unlock(struct vb2_queue *vq)
+ mutex_unlock(&ctx->fimc_dev->lock);
+ }
+
+-struct vb2_ops fimc_qops = {
++static struct vb2_ops fimc_qops = {
+ .queue_setup = fimc_queue_setup,
+ .buf_prepare = fimc_buf_prepare,
+ .buf_queue = fimc_buf_queue,
+@@ -927,23 +937,23 @@ int fimc_vidioc_try_fmt_mplane(struct file *file, void *priv,
+ pix->num_planes = fmt->memplanes;
+ pix->colorspace = V4L2_COLORSPACE_JPEG;
+
+- for (i = 0; i < pix->num_planes; ++i) {
+- int bpl = pix->plane_fmt[i].bytesperline;
+
+- dbg("[%d] bpl: %d, depth: %d, w: %d, h: %d",
+- i, bpl, fmt->depth[i], pix->width, pix->height);
++ for (i = 0; i < pix->num_planes; ++i) {
++ u32 bpl = pix->plane_fmt[i].bytesperline;
++ u32 *sizeimage = &pix->plane_fmt[i].sizeimage;
+
+- if (!bpl || (bpl * 8 / fmt->depth[i]) > pix->width)
+- bpl = (pix->width * fmt->depth[0]) >> 3;
++ if (fmt->colplanes > 1 && (bpl == 0 || bpl < pix->width))
++ bpl = pix->width; /* Planar */
+
+- if (!pix->plane_fmt[i].sizeimage)
+- pix->plane_fmt[i].sizeimage = pix->height * bpl;
++ if (fmt->colplanes == 1 && /* Packed */
++ (bpl == 0 || ((bpl * 8) / fmt->depth[i]) < pix->width))
++ bpl = (pix->width * fmt->depth[0]) / 8;
+
+- pix->plane_fmt[i].bytesperline = bpl;
++ if (i == 0) /* Same bytesperline for each plane. */
++ mod_x = bpl;
+
+- dbg("[%d]: bpl: %d, sizeimage: %d",
+- i, pix->plane_fmt[i].bytesperline,
+- pix->plane_fmt[i].sizeimage);
++ pix->plane_fmt[i].bytesperline = mod_x;
++ *sizeimage = (pix->width * pix->height * fmt->depth[i]) / 8;
+ }
+
+ return 0;
+@@ -965,7 +975,7 @@ static int fimc_m2m_s_fmt_mplane(struct file *file, void *priv,
+
+ vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
+
+- if (vb2_is_streaming(vq)) {
++ if (vb2_is_busy(vq)) {
+ v4l2_err(&fimc->m2m.v4l2_dev, "queue (%d) busy\n", f->type);
+ return -EBUSY;
+ }
+@@ -985,8 +995,10 @@ static int fimc_m2m_s_fmt_mplane(struct file *file, void *priv,
+ if (!frame->fmt)
+ return -EINVAL;
+
+- for (i = 0; i < frame->fmt->colplanes; i++)
+- frame->payload[i] = pix->plane_fmt[i].bytesperline * pix->height;
++ for (i = 0; i < frame->fmt->colplanes; i++) {
++ frame->payload[i] =
++ (pix->width * pix->height * frame->fmt->depth[i]) / 8;
++ }
+
+ frame->f_width = pix->plane_fmt[0].bytesperline * 8 /
+ frame->fmt->depth[0];
+@@ -1750,7 +1762,7 @@ static int __devexit fimc_remove(struct platform_device *pdev)
+ }
+
+ /* Image pixel limits, similar across several FIMC HW revisions. */
+-static struct fimc_pix_limit s5p_pix_limit[3] = {
++static struct fimc_pix_limit s5p_pix_limit[4] = {
+ [0] = {
+ .scaler_en_w = 3264,
+ .scaler_dis_w = 8192,
+@@ -1775,6 +1787,14 @@ static struct fimc_pix_limit s5p_pix_limit[3] = {
+ .out_rot_en_w = 1280,
+ .out_rot_dis_w = 1920,
+ },
++ [3] = {
++ .scaler_en_w = 1920,
++ .scaler_dis_w = 8192,
++ .in_rot_en_h = 1366,
++ .in_rot_dis_w = 8192,
++ .out_rot_en_w = 1366,
++ .out_rot_dis_w = 1920,
++ },
+ };
+
+ static struct samsung_fimc_variant fimc0_variant_s5p = {
+@@ -1827,7 +1847,7 @@ static struct samsung_fimc_variant fimc2_variant_s5pv210 = {
+ .pix_limit = &s5p_pix_limit[2],
+ };
+
+-static struct samsung_fimc_variant fimc0_variant_s5pv310 = {
++static struct samsung_fimc_variant fimc0_variant_exynos4 = {
+ .pix_hoff = 1,
+ .has_inp_rot = 1,
+ .has_out_rot = 1,
+@@ -1840,7 +1860,7 @@ static struct samsung_fimc_variant fimc0_variant_s5pv310 = {
+ .pix_limit = &s5p_pix_limit[1],
+ };
+
+-static struct samsung_fimc_variant fimc2_variant_s5pv310 = {
++static struct samsung_fimc_variant fimc2_variant_exynos4 = {
+ .pix_hoff = 1,
+ .has_cistatus2 = 1,
+ .has_mainscaler_ext = 1,
+@@ -1848,7 +1868,7 @@ static struct samsung_fimc_variant fimc2_variant_s5pv310 = {
+ .min_out_pixsize = 16,
+ .hor_offs_align = 1,
+ .out_buf_count = 32,
+- .pix_limit = &s5p_pix_limit[2],
++ .pix_limit = &s5p_pix_limit[3],
+ };
+
+ /* S5PC100 */
+@@ -1874,12 +1894,12 @@ static struct samsung_fimc_driverdata fimc_drvdata_s5pv210 = {
+ };
+
+ /* S5PV310, S5PC210 */
+-static struct samsung_fimc_driverdata fimc_drvdata_s5pv310 = {
++static struct samsung_fimc_driverdata fimc_drvdata_exynos4 = {
+ .variant = {
+- [0] = &fimc0_variant_s5pv310,
+- [1] = &fimc0_variant_s5pv310,
+- [2] = &fimc0_variant_s5pv310,
+- [3] = &fimc2_variant_s5pv310,
++ [0] = &fimc0_variant_exynos4,
++ [1] = &fimc0_variant_exynos4,
++ [2] = &fimc0_variant_exynos4,
++ [3] = &fimc2_variant_exynos4,
+ },
+ .num_entities = 4,
+ .lclk_frequency = 166000000UL,
+@@ -1893,8 +1913,8 @@ static struct platform_device_id fimc_driver_ids[] = {
+ .name = "s5pv210-fimc",
+ .driver_data = (unsigned long)&fimc_drvdata_s5pv210,
+ }, {
+- .name = "s5pv310-fimc",
+- .driver_data = (unsigned long)&fimc_drvdata_s5pv310,
++ .name = "exynos4-fimc",
++ .driver_data = (unsigned long)&fimc_drvdata_exynos4,
+ },
+ {},
+ };
+diff --git a/drivers/media/video/sh_mobile_ceu_camera.c b/drivers/media/video/sh_mobile_ceu_camera.c
+index 3fe54bf..134e86b 100644
+--- a/drivers/media/video/sh_mobile_ceu_camera.c
++++ b/drivers/media/video/sh_mobile_ceu_camera.c
+@@ -922,7 +922,7 @@ static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int
+ /* Try 2560x1920, 1280x960, 640x480, 320x240 */
+ mf.width = 2560 >> shift;
+ mf.height = 1920 >> shift;
+- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
++ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
+ s_mbus_fmt, &mf);
+ if (ret < 0)
+ return ret;
+@@ -1224,7 +1224,7 @@ static int client_s_fmt(struct soc_camera_device *icd,
+ struct v4l2_cropcap cap;
+ int ret;
+
+- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
++ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
+ s_mbus_fmt, mf);
+ if (ret < 0)
+ return ret;
+@@ -1254,7 +1254,7 @@ static int client_s_fmt(struct soc_camera_device *icd,
+ tmp_h = min(2 * tmp_h, max_height);
+ mf->width = tmp_w;
+ mf->height = tmp_h;
+- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
++ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
+ s_mbus_fmt, mf);
+ dev_geo(dev, "Camera scaled to %ux%u\n",
+ mf->width, mf->height);
+@@ -1658,7 +1658,7 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
+ mf.code = xlate->code;
+ mf.colorspace = pix->colorspace;
+
+- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, try_mbus_fmt, &mf);
++ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf);
+ if (ret < 0)
+ return ret;
+
+@@ -1682,7 +1682,7 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
+ */
+ mf.width = 2560;
+ mf.height = 1920;
+- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
++ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
+ try_mbus_fmt, &mf);
+ if (ret < 0) {
+ /* Shouldn't actually happen... */
+diff --git a/drivers/media/video/sh_mobile_csi2.c b/drivers/media/video/sh_mobile_csi2.c
+index dd1b81b..98b8748 100644
+--- a/drivers/media/video/sh_mobile_csi2.c
++++ b/drivers/media/video/sh_mobile_csi2.c
+@@ -38,6 +38,8 @@ struct sh_csi2 {
+ void __iomem *base;
+ struct platform_device *pdev;
+ struct sh_csi2_client_config *client;
++ unsigned long (*query_bus_param)(struct soc_camera_device *);
++ int (*set_bus_param)(struct soc_camera_device *, unsigned long);
+ };
+
+ static int sh_csi2_try_fmt(struct v4l2_subdev *sd,
+@@ -208,6 +210,7 @@ static int sh_csi2_notify(struct notifier_block *nb,
+ case BUS_NOTIFY_BOUND_DRIVER:
+ snprintf(priv->subdev.name, V4L2_SUBDEV_NAME_SIZE, "%s%s",
+ dev_name(v4l2_dev->dev), ".mipi-csi");
++ priv->subdev.grp_id = (long)icd;
+ ret = v4l2_device_register_subdev(v4l2_dev, &priv->subdev);
+ dev_dbg(dev, "%s(%p): ret(register_subdev) = %d\n", __func__, priv, ret);
+ if (ret < 0)
+@@ -215,6 +218,8 @@ static int sh_csi2_notify(struct notifier_block *nb,
+
+ priv->client = pdata->clients + i;
+
++ priv->set_bus_param = icd->ops->set_bus_param;
++ priv->query_bus_param = icd->ops->query_bus_param;
+ icd->ops->set_bus_param = sh_csi2_set_bus_param;
+ icd->ops->query_bus_param = sh_csi2_query_bus_param;
+
+@@ -226,8 +231,10 @@ static int sh_csi2_notify(struct notifier_block *nb,
+ priv->client = NULL;
+
+ /* Driver is about to be unbound */
+- icd->ops->set_bus_param = NULL;
+- icd->ops->query_bus_param = NULL;
++ icd->ops->set_bus_param = priv->set_bus_param;
++ icd->ops->query_bus_param = priv->query_bus_param;
++ priv->set_bus_param = NULL;
++ priv->query_bus_param = NULL;
+
+ v4l2_device_unregister_subdev(&priv->subdev);
+
+diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c
+index 4628448..3973f9a 100644
+--- a/drivers/media/video/soc_camera.c
++++ b/drivers/media/video/soc_camera.c
+@@ -996,10 +996,11 @@ static void soc_camera_free_i2c(struct soc_camera_device *icd)
+ {
+ struct i2c_client *client =
+ to_i2c_client(to_soc_camera_control(icd));
++ struct i2c_adapter *adap = client->adapter;
+ dev_set_drvdata(&icd->dev, NULL);
+ v4l2_device_unregister_subdev(i2c_get_clientdata(client));
+ i2c_unregister_device(client);
+- i2c_put_adapter(client->adapter);
++ i2c_put_adapter(adap);
+ }
+ #else
+ #define soc_camera_init_i2c(icd, icl) (-ENODEV)
+@@ -1071,6 +1072,9 @@ static int soc_camera_probe(struct device *dev)
+ }
+ }
+
++ sd = soc_camera_to_subdev(icd);
++ sd->grp_id = (long)icd;
++
+ /* At this point client .probe() should have run already */
+ ret = soc_camera_init_user_formats(icd);
+ if (ret < 0)
+@@ -1092,7 +1096,6 @@ static int soc_camera_probe(struct device *dev)
+ goto evidstart;
+
+ /* Try to improve our guess of a reasonable window format */
+- sd = soc_camera_to_subdev(icd);
+ if (!v4l2_subdev_call(sd, video, g_mbus_fmt, &mf)) {
+ icd->user_width = mf.width;
+ icd->user_height = mf.height;
+diff --git a/drivers/media/video/v4l2-dev.c b/drivers/media/video/v4l2-dev.c
+index 498e674..6dc7196 100644
+--- a/drivers/media/video/v4l2-dev.c
++++ b/drivers/media/video/v4l2-dev.c
+@@ -389,7 +389,8 @@ static int v4l2_open(struct inode *inode, struct file *filp)
+ video_get(vdev);
+ mutex_unlock(&videodev_lock);
+ #if defined(CONFIG_MEDIA_CONTROLLER)
+- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) {
++ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev &&
++ vdev->vfl_type != VFL_TYPE_SUBDEV) {
+ entity = media_entity_get(&vdev->entity);
+ if (!entity) {
+ ret = -EBUSY;
+@@ -415,7 +416,8 @@ err:
+ /* decrease the refcount in case of an error */
+ if (ret) {
+ #if defined(CONFIG_MEDIA_CONTROLLER)
+- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev)
++ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev &&
++ vdev->vfl_type != VFL_TYPE_SUBDEV)
+ media_entity_put(entity);
+ #endif
+ video_put(vdev);
+@@ -437,7 +439,8 @@ static int v4l2_release(struct inode *inode, struct file *filp)
+ mutex_unlock(vdev->lock);
+ }
+ #if defined(CONFIG_MEDIA_CONTROLLER)
+- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev)
++ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev &&
++ vdev->vfl_type != VFL_TYPE_SUBDEV)
+ media_entity_put(&vdev->entity);
+ #endif
+ /* decrease the refcount unconditionally since the release()
+@@ -686,7 +689,8 @@ int __video_register_device(struct video_device *vdev, int type, int nr,
+
+ #if defined(CONFIG_MEDIA_CONTROLLER)
+ /* Part 5: Register the entity. */
+- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) {
++ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev &&
++ vdev->vfl_type != VFL_TYPE_SUBDEV) {
+ vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L;
+ vdev->entity.name = vdev->name;
+ vdev->entity.v4l.major = VIDEO_MAJOR;
+@@ -733,7 +737,8 @@ void video_unregister_device(struct video_device *vdev)
+ return;
+
+ #if defined(CONFIG_MEDIA_CONTROLLER)
+- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev)
++ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev &&
++ vdev->vfl_type != VFL_TYPE_SUBDEV)
+ media_device_unregister_entity(&vdev->entity);
+ #endif
+
+diff --git a/drivers/media/video/videobuf2-core.c b/drivers/media/video/videobuf2-core.c
+index 6698c77..6ba1461 100644
+--- a/drivers/media/video/videobuf2-core.c
++++ b/drivers/media/video/videobuf2-core.c
+@@ -37,6 +37,9 @@ module_param(debug, int, 0644);
+ #define call_qop(q, op, args...) \
+ (((q)->ops->op) ? ((q)->ops->op(args)) : 0)
+
++#define V4L2_BUFFER_STATE_FLAGS (V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_QUEUED | \
++ V4L2_BUF_FLAG_DONE | V4L2_BUF_FLAG_ERROR)
++
+ /**
+ * __vb2_buf_mem_alloc() - allocate video memory for the given buffer
+ */
+@@ -51,7 +54,7 @@ static int __vb2_buf_mem_alloc(struct vb2_buffer *vb,
+ for (plane = 0; plane < vb->num_planes; ++plane) {
+ mem_priv = call_memop(q, plane, alloc, q->alloc_ctx[plane],
+ plane_sizes[plane]);
+- if (!mem_priv)
++ if (IS_ERR_OR_NULL(mem_priv))
+ goto free;
+
+ /* Associate allocator private data with this plane */
+@@ -284,7 +287,7 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b)
+ struct vb2_queue *q = vb->vb2_queue;
+ int ret = 0;
+
+- /* Copy back data such as timestamp, input, etc. */
++ /* Copy back data such as timestamp, flags, input, etc. */
+ memcpy(b, &vb->v4l2_buf, offsetof(struct v4l2_buffer, m));
+ b->input = vb->v4l2_buf.input;
+ b->reserved = vb->v4l2_buf.reserved;
+@@ -313,7 +316,10 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b)
+ b->m.userptr = vb->v4l2_planes[0].m.userptr;
+ }
+
+- b->flags = 0;
++ /*
++ * Clear any buffer state related flags.
++ */
++ b->flags &= ~V4L2_BUFFER_STATE_FLAGS;
+
+ switch (vb->state) {
+ case VB2_BUF_STATE_QUEUED:
+@@ -519,6 +525,7 @@ int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)
+ num_buffers = min_t(unsigned int, req->count, VIDEO_MAX_FRAME);
+ memset(plane_sizes, 0, sizeof(plane_sizes));
+ memset(q->alloc_ctx, 0, sizeof(q->alloc_ctx));
++ q->memory = req->memory;
+
+ /*
+ * Ask the driver how many buffers and planes per buffer it requires.
+@@ -560,8 +567,6 @@ int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)
+ ret = num_buffers;
+ }
+
+- q->memory = req->memory;
+-
+ /*
+ * Return the number of successfully allocated buffers
+ * to the userspace.
+@@ -715,6 +720,8 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b,
+
+ vb->v4l2_buf.field = b->field;
+ vb->v4l2_buf.timestamp = b->timestamp;
++ vb->v4l2_buf.input = b->input;
++ vb->v4l2_buf.flags = b->flags & ~V4L2_BUFFER_STATE_FLAGS;
+
+ return 0;
+ }
+diff --git a/drivers/media/video/videobuf2-dma-contig.c b/drivers/media/video/videobuf2-dma-contig.c
+index 58205d5..a790a5f 100644
+--- a/drivers/media/video/videobuf2-dma-contig.c
++++ b/drivers/media/video/videobuf2-dma-contig.c
+@@ -46,7 +46,7 @@ static void *vb2_dma_contig_alloc(void *alloc_ctx, unsigned long size)
+ GFP_KERNEL);
+ if (!buf->vaddr) {
+ dev_err(conf->dev, "dma_alloc_coherent of size %ld failed\n",
+- buf->size);
++ size);
+ kfree(buf);
+ return ERR_PTR(-ENOMEM);
+ }
+diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
+index 96c0b34..657b9f4 100644
+--- a/drivers/mtd/nand/diskonchip.c
++++ b/drivers/mtd/nand/diskonchip.c
+@@ -400,7 +400,7 @@ static uint16_t __init doc200x_ident_chip(struct mtd_info *mtd, int nr)
+ doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE);
+ doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
+
+- /* We can't' use dev_ready here, but at least we wait for the
++ /* We can't use dev_ready here, but at least we wait for the
+ * command to complete
+ */
+ udelay(50);
+diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c
+index fe77e82..e8c19de 100644
+--- a/drivers/pcmcia/pcmcia_resource.c
++++ b/drivers/pcmcia/pcmcia_resource.c
+@@ -173,7 +173,7 @@ static int pcmcia_access_config(struct pcmcia_device *p_dev,
+ c = p_dev->function_config;
+
+ if (!(c->state & CONFIG_LOCKED)) {
+- dev_dbg(&p_dev->dev, "Configuration isn't't locked\n");
++ dev_dbg(&p_dev->dev, "Configuration isn't locked\n");
+ mutex_unlock(&s->ops_mutex);
+ return -EACCES;
+ }
+diff --git a/drivers/staging/rt2860/common/cmm_data_pci.c b/drivers/staging/rt2860/common/cmm_data_pci.c
+index bef0bbd..f01a51c 100644
+--- a/drivers/staging/rt2860/common/cmm_data_pci.c
++++ b/drivers/staging/rt2860/common/cmm_data_pci.c
+@@ -444,7 +444,7 @@ int RTMPCheckRxError(struct rt_rtmp_adapter *pAd,
+ return (NDIS_STATUS_FAILURE);
+ }
+ }
+- /* Drop not U2M frames, can't's drop here because we will drop beacon in this case */
++ /* Drop not U2M frames, can't drop here because we will drop beacon in this case */
+ /* I am kind of doubting the U2M bit operation */
+ /* if (pRxD->U2M == 0) */
+ /* return(NDIS_STATUS_FAILURE); */
+diff --git a/drivers/staging/rt2860/common/cmm_data_usb.c b/drivers/staging/rt2860/common/cmm_data_usb.c
+index 5637857..83a62fa 100644
+--- a/drivers/staging/rt2860/common/cmm_data_usb.c
++++ b/drivers/staging/rt2860/common/cmm_data_usb.c
+@@ -860,7 +860,7 @@ int RTMPCheckRxError(struct rt_rtmp_adapter *pAd,
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("received packet too long\n"));
+ return NDIS_STATUS_FAILURE;
+ }
+- /* Drop not U2M frames, can't's drop here because we will drop beacon in this case */
++ /* Drop not U2M frames, can't drop here because we will drop beacon in this case */
+ /* I am kind of doubting the U2M bit operation */
+ /* if (pRxD->U2M == 0) */
+ /* return(NDIS_STATUS_FAILURE); */
+diff --git a/drivers/staging/spectra/ffsport.c b/drivers/staging/spectra/ffsport.c
+index 20dae73..506547b 100644
+--- a/drivers/staging/spectra/ffsport.c
++++ b/drivers/staging/spectra/ffsport.c
+@@ -653,7 +653,7 @@ static int SBD_setup_device(struct spectra_nand_dev *dev, int which)
+ }
+ dev->queue->queuedata = dev;
+
+- /* As Linux block layer does't support >4KB hardware sector, */
++ /* As Linux block layer doesn't support >4KB hardware sector, */
+ /* Here we force report 512 byte hardware sector size to Kernel */
+ blk_queue_logical_block_size(dev->queue, 512);
+
+diff --git a/drivers/staging/tidspbridge/dynload/cload.c b/drivers/staging/tidspbridge/dynload/cload.c
+index 5cecd23..fe1ef0a 100644
+--- a/drivers/staging/tidspbridge/dynload/cload.c
++++ b/drivers/staging/tidspbridge/dynload/cload.c
+@@ -718,7 +718,7 @@ static void dload_symbols(struct dload_state *dlthis)
+ * as a temporary for .dllview record construction.
+ * Allocate storage for the whole table. Add 1 to the section count
+ * in case a trampoline section is auto-generated as well as the
+- * size of the trampoline section name so DLLView does't get lost.
++ * size of the trampoline section name so DLLView doesn't get lost.
+ */
+
+ siz = sym_count * sizeof(struct local_symbol);
+diff --git a/drivers/staging/tty/specialix.c b/drivers/staging/tty/specialix.c
+index cb24c6d..5c3598e 100644
+--- a/drivers/staging/tty/specialix.c
++++ b/drivers/staging/tty/specialix.c
+@@ -978,7 +978,7 @@ static void sx_change_speed(struct specialix_board *bp,
+ spin_lock_irqsave(&bp->lock, flags);
+ sx_out(bp, CD186x_CAR, port_No(port));
+
+- /* The Specialix board does't implement the RTS lines.
++ /* The Specialix board doesn't implement the RTS lines.
+ They are used to set the IRQ level. Don't touch them. */
+ if (sx_crtscts(tty))
+ port->MSVR = MSVR_DTR | (sx_in(bp, CD186x_MSVR) & MSVR_RTS);
+diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
+index 2e61fe1..8f4b81d 100644
+--- a/fs/btrfs/ctree.h
++++ b/fs/btrfs/ctree.h
+@@ -718,7 +718,7 @@ struct btrfs_space_info {
+ u64 total_bytes; /* total bytes in the space,
+ this doesn't take mirrors into account */
+ u64 bytes_used; /* total bytes used,
+- this does't take mirrors into account */
++ this doesn't take mirrors into account */
+ u64 bytes_pinned; /* total bytes pinned, will be freed when the
+ transaction finishes */
+ u64 bytes_reserved; /* total bytes the allocator has reserved for
+diff --git a/fs/file.c b/fs/file.c
+index 0be3447..4c6992d 100644
+--- a/fs/file.c
++++ b/fs/file.c
+@@ -9,6 +9,7 @@
+ #include
+ #include
+ #include
++#include
+ #include
+ #include
+ #include
+@@ -39,14 +40,17 @@ int sysctl_nr_open_max = 1024 * 1024; /* raised later */
+ */
+ static DEFINE_PER_CPU(struct fdtable_defer, fdtable_defer_list);
+
+-static inline void *alloc_fdmem(unsigned int size)
++static void *alloc_fdmem(unsigned int size)
+ {
+- void *data;
+-
+- data = kmalloc(size, GFP_KERNEL|__GFP_NOWARN);
+- if (data != NULL)
+- return data;
+-
++ /*
++ * Very large allocations can stress page reclaim, so fall back to
++ * vmalloc() if the allocation size will be considered "large" by the VM.
++ */
++ if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) {
++ void *data = kmalloc(size, GFP_KERNEL|__GFP_NOWARN);
++ if (data != NULL)
++ return data;
++ }
+ return vmalloc(size);
+ }
+
+diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
+index 89fc160..1f063ba 100644
+--- a/fs/nfs/namespace.c
++++ b/fs/nfs/namespace.c
+@@ -119,7 +119,7 @@ Elong:
+ }
+
+ #ifdef CONFIG_NFS_V4
+-static rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors, struct inode *inode)
++static rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors)
+ {
+ struct gss_api_mech *mech;
+ struct xdr_netobj oid;
+@@ -166,7 +166,7 @@ static int nfs_negotiate_security(const struct dentry *parent,
+ }
+ flavors = page_address(page);
+ ret = secinfo(parent->d_inode, &dentry->d_name, flavors);
+- *flavor = nfs_find_best_sec(flavors, dentry->d_inode);
++ *flavor = nfs_find_best_sec(flavors);
+ put_page(page);
+ }
+
+diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
+index e1c261d..c4a6983 100644
+--- a/fs/nfs/nfs4_fs.h
++++ b/fs/nfs/nfs4_fs.h
+@@ -47,6 +47,7 @@ enum nfs4_client_state {
+ NFS4CLNT_LAYOUTRECALL,
+ NFS4CLNT_SESSION_RESET,
+ NFS4CLNT_RECALL_SLOT,
++ NFS4CLNT_LEASE_CONFIRM,
+ };
+
+ enum nfs4_session_state {
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 9bf41ea..69c0f3c 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -46,6 +46,7 @@
+ #include
+ #include
+ #include
++#include
+ #include
+ #include
+ #include
+@@ -443,8 +444,8 @@ static int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *
+ if (res->sr_status == 1)
+ res->sr_status = NFS_OK;
+
+- /* -ERESTARTSYS can result in skipping nfs41_sequence_setup */
+- if (!res->sr_slot)
++ /* don't increment the sequence number if the task wasn't sent */
++ if (!RPC_WAS_SENT(task))
+ goto out;
+
+ /* Check the SEQUENCE operation status */
+@@ -2185,9 +2186,14 @@ static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
+ struct nfs4_exception exception = { };
+ int err;
+ do {
+- err = nfs4_handle_exception(server,
+- _nfs4_lookup_root(server, fhandle, info),
+- &exception);
++ err = _nfs4_lookup_root(server, fhandle, info);
++ switch (err) {
++ case 0:
++ case -NFS4ERR_WRONGSEC:
++ break;
++ default:
++ err = nfs4_handle_exception(server, err, &exception);
++ }
+ } while (exception.retry);
+ return err;
+ }
+@@ -2208,25 +2214,47 @@ out:
+ return ret;
+ }
+
+-/*
+- * get the file handle for the "/" directory on the server
+- */
+-static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
++static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
+ struct nfs_fsinfo *info)
+ {
+ int i, len, status = 0;
+- rpc_authflavor_t flav_array[NFS_MAX_SECFLAVORS + 2];
++ rpc_authflavor_t flav_array[NFS_MAX_SECFLAVORS];
+
+- flav_array[0] = RPC_AUTH_UNIX;
+- len = gss_mech_list_pseudoflavors(&flav_array[1]);
+- flav_array[1+len] = RPC_AUTH_NULL;
+- len += 2;
++ len = gss_mech_list_pseudoflavors(&flav_array[0]);
++ flav_array[len] = RPC_AUTH_NULL;
++ len += 1;
+
+ for (i = 0; i < len; i++) {
+ status = nfs4_lookup_root_sec(server, fhandle, info, flav_array[i]);
+- if (status != -EPERM)
+- break;
++ if (status == -NFS4ERR_WRONGSEC || status == -EACCES)
++ continue;
++ break;
+ }
++ /*
++ * -EACCESS could mean that the user doesn't have correct permissions
++ * to access the mount. It could also mean that we tried to mount
++ * with a gss auth flavor, but rpc.gssd isn't running. Either way,
++ * existing mount programs don't handle -EACCES very well so it should
++ * be mapped to -EPERM instead.
++ */
++ if (status == -EACCES)
++ status = -EPERM;
++ return status;
++}
++
++/*
++ * get the file handle for the "/" directory on the server
++ */
++static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
++ struct nfs_fsinfo *info)
++{
++ int status = nfs4_lookup_root(server, fhandle, info);
++ if ((status == -NFS4ERR_WRONGSEC) && !(server->flags & NFS_MOUNT_SECFLAVOUR))
++ /*
++ * A status of -NFS4ERR_WRONGSEC will be mapped to -EPERM
++ * by nfs4_map_errors() as this function exits.
++ */
++ status = nfs4_find_root_sec(server, fhandle, info);
+ if (status == 0)
+ status = nfs4_server_capabilities(server, fhandle);
+ if (status == 0)
+@@ -3723,21 +3751,20 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program,
+ sizeof(setclientid.sc_uaddr), "%s.%u.%u",
+ clp->cl_ipaddr, port >> 8, port & 255);
+
+- status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
++ status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ if (status != -NFS4ERR_CLID_INUSE)
+ break;
+- if (signalled())
++ if (loop != 0) {
++ ++clp->cl_id_uniquifier;
+ break;
+- if (loop++ & 1)
+- ssleep(clp->cl_lease_time / HZ + 1);
+- else
+- if (++clp->cl_id_uniquifier == 0)
+- break;
++ }
++ ++loop;
++ ssleep(clp->cl_lease_time / HZ + 1);
+ }
+ return status;
+ }
+
+-static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp,
++int nfs4_proc_setclientid_confirm(struct nfs_client *clp,
+ struct nfs4_setclientid_res *arg,
+ struct rpc_cred *cred)
+ {
+@@ -3752,7 +3779,7 @@ static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp,
+ int status;
+
+ now = jiffies;
+- status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
++ status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ if (status == 0) {
+ spin_lock(&clp->cl_lock);
+ clp->cl_lease_time = fsinfo.lease_time * HZ;
+@@ -3762,26 +3789,6 @@ static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp,
+ return status;
+ }
+
+-int nfs4_proc_setclientid_confirm(struct nfs_client *clp,
+- struct nfs4_setclientid_res *arg,
+- struct rpc_cred *cred)
+-{
+- long timeout = 0;
+- int err;
+- do {
+- err = _nfs4_proc_setclientid_confirm(clp, arg, cred);
+- switch (err) {
+- case 0:
+- return err;
+- case -NFS4ERR_RESOURCE:
+- /* The IBM lawyers misread another document! */
+- case -NFS4ERR_DELAY:
+- err = nfs4_delay(clp->cl_rpcclient, &timeout);
+- }
+- } while (err == 0);
+- return err;
+-}
+-
+ struct nfs4_delegreturndata {
+ struct nfs4_delegreturnargs args;
+ struct nfs4_delegreturnres res;
+@@ -4786,7 +4793,7 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
+ init_utsname()->domainname,
+ clp->cl_rpcclient->cl_auth->au_flavor);
+
+- status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
++ status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ if (!status)
+ status = nfs4_check_cl_exchange_flags(clp->cl_exchange_flags);
+ dprintk("<-- %s status= %d\n", __func__, status);
+@@ -4869,7 +4876,8 @@ int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo)
+ .rpc_client = clp->cl_rpcclient,
+ .rpc_message = &msg,
+ .callback_ops = &nfs4_get_lease_time_ops,
+- .callback_data = &data
++ .callback_data = &data,
++ .flags = RPC_TASK_TIMEOUT,
+ };
+ int status;
+
+@@ -5171,7 +5179,7 @@ static int _nfs4_proc_create_session(struct nfs_client *clp)
+ nfs4_init_channel_attrs(&args);
+ args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN);
+
+- status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0);
++ status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+
+ if (!status)
+ /* Verify the session's negotiated channel_attrs values */
+@@ -5194,20 +5202,10 @@ int nfs4_proc_create_session(struct nfs_client *clp)
+ int status;
+ unsigned *ptr;
+ struct nfs4_session *session = clp->cl_session;
+- long timeout = 0;
+- int err;
+
+ dprintk("--> %s clp=%p session=%p\n", __func__, clp, session);
+
+- do {
+- status = _nfs4_proc_create_session(clp);
+- if (status == -NFS4ERR_DELAY) {
+- err = nfs4_delay(clp->cl_rpcclient, &timeout);
+- if (err)
+- status = err;
+- }
+- } while (status == -NFS4ERR_DELAY);
+-
++ status = _nfs4_proc_create_session(clp);
+ if (status)
+ goto out;
+
+@@ -5248,7 +5246,7 @@ int nfs4_proc_destroy_session(struct nfs4_session *session)
+ msg.rpc_argp = session;
+ msg.rpc_resp = NULL;
+ msg.rpc_cred = NULL;
+- status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0);
++ status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+
+ if (status)
+ printk(KERN_WARNING
+diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
+index a6804f7..036f5ad 100644
+--- a/fs/nfs/nfs4state.c
++++ b/fs/nfs/nfs4state.c
+@@ -64,10 +64,15 @@ static LIST_HEAD(nfs4_clientid_list);
+
+ int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
+ {
+- struct nfs4_setclientid_res clid;
++ struct nfs4_setclientid_res clid = {
++ .clientid = clp->cl_clientid,
++ .confirm = clp->cl_confirm,
++ };
+ unsigned short port;
+ int status;
+
++ if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
++ goto do_confirm;
+ port = nfs_callback_tcpport;
+ if (clp->cl_addr.ss_family == AF_INET6)
+ port = nfs_callback_tcpport6;
+@@ -75,10 +80,14 @@ int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
+ status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid);
+ if (status != 0)
+ goto out;
++ clp->cl_clientid = clid.clientid;
++ clp->cl_confirm = clid.confirm;
++ set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
++do_confirm:
+ status = nfs4_proc_setclientid_confirm(clp, &clid, cred);
+ if (status != 0)
+ goto out;
+- clp->cl_clientid = clid.clientid;
++ clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
+ nfs4_schedule_state_renewal(clp);
+ out:
+ return status;
+@@ -230,13 +239,18 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
+ {
+ int status;
+
++ if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
++ goto do_confirm;
+ nfs4_begin_drain_session(clp);
+ status = nfs4_proc_exchange_id(clp, cred);
+ if (status != 0)
+ goto out;
++ set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
++do_confirm:
+ status = nfs4_proc_create_session(clp);
+ if (status != 0)
+ goto out;
++ clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
+ nfs41_setup_state_renewal(clp);
+ nfs_mark_client_ready(clp, NFS_CS_READY);
+ out:
+@@ -1584,20 +1598,23 @@ static int nfs4_recall_slot(struct nfs_client *clp) { return 0; }
+ */
+ static void nfs4_set_lease_expired(struct nfs_client *clp, int status)
+ {
+- if (nfs4_has_session(clp)) {
+- switch (status) {
+- case -NFS4ERR_DELAY:
+- case -NFS4ERR_CLID_INUSE:
+- case -EAGAIN:
+- break;
++ switch (status) {
++ case -NFS4ERR_CLID_INUSE:
++ case -NFS4ERR_STALE_CLIENTID:
++ clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
++ break;
++ case -NFS4ERR_DELAY:
++ case -ETIMEDOUT:
++ case -EAGAIN:
++ ssleep(1);
++ break;
+
+- case -EKEYEXPIRED:
+- nfs4_warn_keyexpired(clp->cl_hostname);
+- case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
+- * in nfs4_exchange_id */
+- default:
+- return;
+- }
++ case -EKEYEXPIRED:
++ nfs4_warn_keyexpired(clp->cl_hostname);
++ case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
++ * in nfs4_exchange_id */
++ default:
++ return;
+ }
+ set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
+ }
+@@ -1607,7 +1624,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
+ int status = 0;
+
+ /* Ensure exclusive access to NFSv4 state */
+- for(;;) {
++ do {
+ if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) {
+ /* We're going to have to re-establish a clientid */
+ status = nfs4_reclaim_lease(clp);
+@@ -1691,7 +1708,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
+ break;
+ if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
+ break;
+- }
++ } while (atomic_read(&clp->cl_count) > 1);
+ return;
+ out_error:
+ printk(KERN_WARNING "Error: state manager failed on NFSv4 server %s"
+diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
+index dddfb57..c3ccd2c 100644
+--- a/fs/nfs/nfs4xdr.c
++++ b/fs/nfs/nfs4xdr.c
+@@ -1452,26 +1452,25 @@ static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args,
+
+ static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req, struct compound_hdr *hdr)
+ {
+- uint32_t attrs[2] = {0, 0};
++ uint32_t attrs[2] = {
++ FATTR4_WORD0_RDATTR_ERROR,
++ FATTR4_WORD1_MOUNTED_ON_FILEID,
++ };
+ uint32_t dircount = readdir->count >> 1;
+ __be32 *p;
+
+ if (readdir->plus) {
+ attrs[0] |= FATTR4_WORD0_TYPE|FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE|
+- FATTR4_WORD0_FSID|FATTR4_WORD0_FILEHANDLE;
++ FATTR4_WORD0_FSID|FATTR4_WORD0_FILEHANDLE|FATTR4_WORD0_FILEID;
+ attrs[1] |= FATTR4_WORD1_MODE|FATTR4_WORD1_NUMLINKS|FATTR4_WORD1_OWNER|
+ FATTR4_WORD1_OWNER_GROUP|FATTR4_WORD1_RAWDEV|
+ FATTR4_WORD1_SPACE_USED|FATTR4_WORD1_TIME_ACCESS|
+ FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY;
+ dircount >>= 1;
+ }
+- attrs[0] |= FATTR4_WORD0_RDATTR_ERROR|FATTR4_WORD0_FILEID;
+- attrs[1] |= FATTR4_WORD1_MOUNTED_ON_FILEID;
+- /* Switch to mounted_on_fileid if the server supports it */
+- if (readdir->bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)
+- attrs[0] &= ~FATTR4_WORD0_FILEID;
+- else
+- attrs[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
++ /* Use mounted_on_fileid only if the server supports it */
++ if (!(readdir->bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID))
++ attrs[0] |= FATTR4_WORD0_FILEID;
+
+ p = reserve_space(xdr, 12+NFS4_VERIFIER_SIZE+20);
+ *p++ = cpu_to_be32(OP_READDIR);
+@@ -3140,7 +3139,7 @@ static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitma
+ goto out_overflow;
+ xdr_decode_hyper(p, fileid);
+ bitmap[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
+- ret = NFS_ATTR_FATTR_FILEID;
++ ret = NFS_ATTR_FATTR_MOUNTED_ON_FILEID;
+ }
+ dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid);
+ return ret;
+@@ -4002,7 +4001,6 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
+ {
+ int status;
+ umode_t fmode = 0;
+- uint64_t fileid;
+ uint32_t type;
+
+ status = decode_attr_type(xdr, bitmap, &type);
+@@ -4101,13 +4099,10 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
+ goto xdr_error;
+ fattr->valid |= status;
+
+- status = decode_attr_mounted_on_fileid(xdr, bitmap, &fileid);
++ status = decode_attr_mounted_on_fileid(xdr, bitmap, &fattr->mounted_on_fileid);
+ if (status < 0)
+ goto xdr_error;
+- if (status != 0 && !(fattr->valid & status)) {
+- fattr->fileid = fileid;
+- fattr->valid |= status;
+- }
++ fattr->valid |= status;
+
+ xdr_error:
+ dprintk("%s: xdr returned %d\n", __func__, -status);
+@@ -4838,17 +4833,21 @@ static int decode_secinfo(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
+ struct nfs4_secinfo_flavor *sec_flavor;
+ int status;
+ __be32 *p;
+- int i;
++ int i, num_flavors;
+
+ status = decode_op_hdr(xdr, OP_SECINFO);
++ if (status)
++ goto out;
+ p = xdr_inline_decode(xdr, 4);
+ if (unlikely(!p))
+ goto out_overflow;
+- res->flavors->num_flavors = be32_to_cpup(p);
+
+- for (i = 0; i < res->flavors->num_flavors; i++) {
++ res->flavors->num_flavors = 0;
++ num_flavors = be32_to_cpup(p);
++
++ for (i = 0; i < num_flavors; i++) {
+ sec_flavor = &res->flavors->flavors[i];
+- if ((char *)&sec_flavor[1] - (char *)res > PAGE_SIZE)
++ if ((char *)&sec_flavor[1] - (char *)res->flavors > PAGE_SIZE)
+ break;
+
+ p = xdr_inline_decode(xdr, 4);
+@@ -4857,13 +4856,15 @@ static int decode_secinfo(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
+ sec_flavor->flavor = be32_to_cpup(p);
+
+ if (sec_flavor->flavor == RPC_AUTH_GSS) {
+- if (decode_secinfo_gss(xdr, sec_flavor))
+- break;
++ status = decode_secinfo_gss(xdr, sec_flavor);
++ if (status)
++ goto out;
+ }
++ res->flavors->num_flavors++;
+ }
+
+- return 0;
+-
++out:
++ return status;
+ out_overflow:
+ print_overflow_msg(__func__, xdr);
+ return -EIO;
+@@ -6408,7 +6409,9 @@ int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
+ if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh,
+ entry->server, 1) < 0)
+ goto out_overflow;
+- if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID)
++ if (entry->fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID)
++ entry->ino = entry->fattr->mounted_on_fileid;
++ else if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID)
+ entry->ino = entry->fattr->fileid;
+
+ entry->d_type = DT_UNKNOWN;
+diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
+index d9ab972..ff681ab 100644
+--- a/fs/nfs/pnfs.c
++++ b/fs/nfs/pnfs.c
+@@ -1004,6 +1004,7 @@ pnfs_set_layoutcommit(struct nfs_write_data *wdata)
+ {
+ struct nfs_inode *nfsi = NFS_I(wdata->inode);
+ loff_t end_pos = wdata->args.offset + wdata->res.count;
++ bool mark_as_dirty = false;
+
+ spin_lock(&nfsi->vfs_inode.i_lock);
+ if (!test_and_set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) {
+@@ -1011,13 +1012,18 @@ pnfs_set_layoutcommit(struct nfs_write_data *wdata)
+ get_lseg(wdata->lseg);
+ wdata->lseg->pls_lc_cred =
+ get_rpccred(wdata->args.context->state->owner->so_cred);
+- mark_inode_dirty_sync(wdata->inode);
++ mark_as_dirty = true;
+ dprintk("%s: Set layoutcommit for inode %lu ",
+ __func__, wdata->inode->i_ino);
+ }
+ if (end_pos > wdata->lseg->pls_end_pos)
+ wdata->lseg->pls_end_pos = end_pos;
+ spin_unlock(&nfsi->vfs_inode.i_lock);
++
++ /* if pnfs_layoutcommit_inode() runs between inode locks, the next one
++ * will be a noop because NFS_INO_LAYOUTCOMMIT will not be set */
++ if (mark_as_dirty)
++ mark_inode_dirty_sync(wdata->inode);
+ }
+ EXPORT_SYMBOL_GPL(pnfs_set_layoutcommit);
+
+diff --git a/fs/nfs/super.c b/fs/nfs/super.c
+index 2b8e9a5..e288f06 100644
+--- a/fs/nfs/super.c
++++ b/fs/nfs/super.c
+@@ -1004,6 +1004,7 @@ static int nfs_parse_security_flavors(char *value,
+ return 0;
+ }
+
++ mnt->flags |= NFS_MOUNT_SECFLAVOUR;
+ mnt->auth_flavor_len = 1;
+ return 1;
+ }
+@@ -1976,6 +1977,15 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data)
+ if (error < 0)
+ goto out;
+
++ /*
++ * noac is a special case. It implies -o sync, but that's not
++ * necessarily reflected in the mtab options. do_remount_sb
++ * will clear MS_SYNCHRONOUS if -o sync wasn't specified in the
++ * remount options, so we have to explicitly reset it.
++ */
++ if (data->flags & NFS_MOUNT_NOAC)
++ *flags |= MS_SYNCHRONOUS;
++
+ /* compare new mount options with old ones */
+ error = nfs_compare_remount_data(nfss, data);
+ out:
+@@ -2235,8 +2245,7 @@ static struct dentry *nfs_fs_mount(struct file_system_type *fs_type,
+ if (!s->s_root) {
+ /* initial superblock/root creation */
+ nfs_fill_super(s, data);
+- nfs_fscache_get_super_cookie(
+- s, data ? data->fscache_uniq : NULL, NULL);
++ nfs_fscache_get_super_cookie(s, data->fscache_uniq, NULL);
+ }
+
+ mntroot = nfs_get_root(s, mntfh, dev_name);
+diff --git a/fs/nfs/write.c b/fs/nfs/write.c
+index e4cbc11..3bd5d7e 100644
+--- a/fs/nfs/write.c
++++ b/fs/nfs/write.c
+@@ -680,7 +680,6 @@ static int nfs_writepage_setup(struct nfs_open_context *ctx, struct page *page,
+ req = nfs_setup_write_request(ctx, page, offset, count);
+ if (IS_ERR(req))
+ return PTR_ERR(req);
+- nfs_mark_request_dirty(req);
+ /* Update file length */
+ nfs_grow_file(page, offset, count);
+ nfs_mark_uptodate(page, req->wb_pgbase, req->wb_bytes);
+@@ -1418,8 +1417,7 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata)
+ task->tk_pid, task->tk_status);
+
+ /* Call the NFS version-specific code */
+- if (NFS_PROTO(data->inode)->commit_done(task, data) != 0)
+- return;
++ NFS_PROTO(data->inode)->commit_done(task, data);
+ }
+
+ void nfs_commit_release_pages(struct nfs_write_data *data)
+diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
+index b68f87a..938387a 100644
+--- a/fs/ocfs2/ocfs2_fs.h
++++ b/fs/ocfs2/ocfs2_fs.h
+@@ -1019,7 +1019,7 @@ struct ocfs2_xattr_entry {
+ __le16 xe_name_offset; /* byte offset from the 1st entry in the
+ local xattr storage(inode, xattr block or
+ xattr bucket). */
+- __u8 xe_name_len; /* xattr name len, does't include prefix. */
++ __u8 xe_name_len; /* xattr name len, doesn't include prefix. */
+ __u8 xe_type; /* the low 7 bits indicate the name prefix
+ * type and the highest bit indicates whether
+ * the EA is stored in the local storage. */
+diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
+index f22e7fe..ade09d7 100644
+--- a/include/drm/drm_fb_helper.h
++++ b/include/drm/drm_fb_helper.h
+@@ -118,6 +118,7 @@ int drm_fb_helper_setcolreg(unsigned regno,
+ unsigned transp,
+ struct fb_info *info);
+
++bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper);
+ void drm_fb_helper_restore(void);
+ void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,
+ uint32_t fb_width, uint32_t fb_height);
+diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h
+index 3bce1a4..7aa5ddd 100644
+--- a/include/drm/radeon_drm.h
++++ b/include/drm/radeon_drm.h
+@@ -909,6 +909,7 @@ struct drm_radeon_cs {
+ #define RADEON_INFO_WANT_CMASK 0x08 /* get access to CMASK on r300 */
+ #define RADEON_INFO_CLOCK_CRYSTAL_FREQ 0x09 /* clock crystal frequency */
+ #define RADEON_INFO_NUM_BACKENDS 0x0a /* DB/backends for r600+ - need for OQ */
++#define RADEON_INFO_NUM_TILE_PIPES 0x0b /* tile pipes for r600+ */
+
+ struct drm_radeon_info {
+ uint32_t request;
+diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
+index df29c8f..8847c8c 100644
+--- a/include/linux/huge_mm.h
++++ b/include/linux/huge_mm.h
+@@ -117,7 +117,7 @@ static inline void vma_adjust_trans_huge(struct vm_area_struct *vma,
+ unsigned long end,
+ long adjust_next)
+ {
+- if (!vma->anon_vma || vma->vm_ops || vma->vm_file)
++ if (!vma->anon_vma || vma->vm_ops)
+ return;
+ __vma_adjust_trans_huge(vma, start, end, adjust_next);
+ }
+diff --git a/include/linux/mm.h b/include/linux/mm.h
+index 692dbae..2348db2 100644
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -137,7 +137,8 @@ extern unsigned int kobjsize(const void *objp);
+ #define VM_RandomReadHint(v) ((v)->vm_flags & VM_RAND_READ)
+
+ /*
+- * special vmas that are non-mergable, non-mlock()able
++ * Special vmas that are non-mergable, non-mlock()able.
++ * Note: mm/huge_memory.c VM_NO_THP depends on this definition.
+ */
+ #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_RESERVED | VM_PFNMAP)
+
+diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
+index 216cea5..87694ca 100644
+--- a/include/linux/nfs_fs_sb.h
++++ b/include/linux/nfs_fs_sb.h
+@@ -47,6 +47,7 @@ struct nfs_client {
+
+ #ifdef CONFIG_NFS_V4
+ u64 cl_clientid; /* constant */
++ nfs4_verifier cl_confirm; /* Clientid verifier */
+ unsigned long cl_state;
+
+ spinlock_t cl_lock;
+diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
+index 78b101e..890dce2 100644
+--- a/include/linux/nfs_xdr.h
++++ b/include/linux/nfs_xdr.h
+@@ -50,6 +50,7 @@ struct nfs_fattr {
+ } du;
+ struct nfs_fsid fsid;
+ __u64 fileid;
++ __u64 mounted_on_fileid;
+ struct timespec atime;
+ struct timespec mtime;
+ struct timespec ctime;
+@@ -83,6 +84,7 @@ struct nfs_fattr {
+ #define NFS_ATTR_FATTR_PRECHANGE (1U << 18)
+ #define NFS_ATTR_FATTR_V4_REFERRAL (1U << 19) /* NFSv4 referral */
+ #define NFS_ATTR_FATTR_MOUNTPOINT (1U << 20) /* Treat as mountpoint */
++#define NFS_ATTR_FATTR_MOUNTED_ON_FILEID (1U << 21)
+
+ #define NFS_ATTR_FATTR (NFS_ATTR_FATTR_TYPE \
+ | NFS_ATTR_FATTR_MODE \
+diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h
+index d81db80..f73c482 100644
+--- a/include/linux/sunrpc/sched.h
++++ b/include/linux/sunrpc/sched.h
+@@ -127,13 +127,16 @@ struct rpc_task_setup {
+ #define RPC_TASK_KILLED 0x0100 /* task was killed */
+ #define RPC_TASK_SOFT 0x0200 /* Use soft timeouts */
+ #define RPC_TASK_SOFTCONN 0x0400 /* Fail if can't connect */
++#define RPC_TASK_SENT 0x0800 /* message was sent */
++#define RPC_TASK_TIMEOUT 0x1000 /* fail with ETIMEDOUT on timeout */
+
+ #define RPC_IS_ASYNC(t) ((t)->tk_flags & RPC_TASK_ASYNC)
+ #define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER)
+ #define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS)
+ #define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED)
+-#define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT)
++#define RPC_IS_SOFT(t) ((t)->tk_flags & (RPC_TASK_SOFT|RPC_TASK_TIMEOUT))
+ #define RPC_IS_SOFTCONN(t) ((t)->tk_flags & RPC_TASK_SOFTCONN)
++#define RPC_WAS_SENT(t) ((t)->tk_flags & RPC_TASK_SENT)
+
+ #define RPC_TASK_RUNNING 0
+ #define RPC_TASK_QUEUED 1
+diff --git a/include/linux/v4l2-mediabus.h b/include/linux/v4l2-mediabus.h
+index 7054a7a..de5c159 100644
+--- a/include/linux/v4l2-mediabus.h
++++ b/include/linux/v4l2-mediabus.h
+@@ -47,7 +47,7 @@ enum v4l2_mbus_pixelcode {
+ V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007,
+ V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008,
+
+- /* YUV (including grey) - next is 0x2013 */
++ /* YUV (including grey) - next is 0x2014 */
+ V4L2_MBUS_FMT_Y8_1X8 = 0x2001,
+ V4L2_MBUS_FMT_UYVY8_1_5X8 = 0x2002,
+ V4L2_MBUS_FMT_VYUY8_1_5X8 = 0x2003,
+@@ -60,6 +60,7 @@ enum v4l2_mbus_pixelcode {
+ V4L2_MBUS_FMT_Y10_1X10 = 0x200a,
+ V4L2_MBUS_FMT_YUYV10_2X10 = 0x200b,
+ V4L2_MBUS_FMT_YVYU10_2X10 = 0x200c,
++ V4L2_MBUS_FMT_Y12_1X12 = 0x2013,
+ V4L2_MBUS_FMT_UYVY8_1X16 = 0x200f,
+ V4L2_MBUS_FMT_VYUY8_1X16 = 0x2010,
+ V4L2_MBUS_FMT_YUYV8_1X16 = 0x2011,
+@@ -67,9 +68,11 @@ enum v4l2_mbus_pixelcode {
+ V4L2_MBUS_FMT_YUYV10_1X20 = 0x200d,
+ V4L2_MBUS_FMT_YVYU10_1X20 = 0x200e,
+
+- /* Bayer - next is 0x3013 */
++ /* Bayer - next is 0x3015 */
+ V4L2_MBUS_FMT_SBGGR8_1X8 = 0x3001,
++ V4L2_MBUS_FMT_SGBRG8_1X8 = 0x3013,
+ V4L2_MBUS_FMT_SGRBG8_1X8 = 0x3002,
++ V4L2_MBUS_FMT_SRGGB8_1X8 = 0x3014,
+ V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8 = 0x300b,
+ V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8 = 0x300c,
+ V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8 = 0x3009,
+diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
+index aa6c393..be82c8e 100644
+--- a/include/linux/videodev2.h
++++ b/include/linux/videodev2.h
+@@ -308,6 +308,7 @@ struct v4l2_pix_format {
+ #define V4L2_PIX_FMT_Y4 v4l2_fourcc('Y', '0', '4', ' ') /* 4 Greyscale */
+ #define V4L2_PIX_FMT_Y6 v4l2_fourcc('Y', '0', '6', ' ') /* 6 Greyscale */
+ #define V4L2_PIX_FMT_Y10 v4l2_fourcc('Y', '1', '0', ' ') /* 10 Greyscale */
++#define V4L2_PIX_FMT_Y12 v4l2_fourcc('Y', '1', '2', ' ') /* 12 Greyscale */
+ #define V4L2_PIX_FMT_Y16 v4l2_fourcc('Y', '1', '6', ' ') /* 16 Greyscale */
+
+ /* Palette formats */
+diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h
+index bd102cf..d61febf 100644
+--- a/include/media/v4l2-device.h
++++ b/include/media/v4l2-device.h
+@@ -163,7 +163,7 @@ v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev);
+ ({ \
+ struct v4l2_subdev *__sd; \
+ __v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd, cond, o, \
+- f, args...); \
++ f , ##args); \
+ })
+
+ /* Call the specified callback for all subdevs matching grp_id (if 0, then
+diff --git a/init/Kconfig b/init/Kconfig
+index 7a71e0a..d886b1e 100644
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -1226,6 +1226,7 @@ config SLAB
+ per cpu and per node queues.
+
+ config SLUB
++ depends on BROKEN || NUMA || !DISCONTIGMEM
+ bool "SLUB (Unqueued Allocator)"
+ help
+ SLUB is a slab allocator that minimizes cache line usage
+diff --git a/kernel/watchdog.c b/kernel/watchdog.c
+index 140dce7..14733d4 100644
+--- a/kernel/watchdog.c
++++ b/kernel/watchdog.c
+@@ -430,9 +430,12 @@ static int watchdog_enable(int cpu)
+ p = kthread_create(watchdog, (void *)(unsigned long)cpu, "watchdog/%d", cpu);
+ if (IS_ERR(p)) {
+ printk(KERN_ERR "softlockup watchdog for %i failed\n", cpu);
+- if (!err)
++ if (!err) {
+ /* if hardlockup hasn't already set this */
+ err = PTR_ERR(p);
++ /* and disable the perf event */
++ watchdog_nmi_disable(cpu);
++ }
+ goto out;
+ }
+ kthread_bind(p, cpu);
+diff --git a/mm/huge_memory.c b/mm/huge_memory.c
+index 470dcda..83326ad 100644
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -1408,6 +1408,9 @@ out:
+ return ret;
+ }
+
++#define VM_NO_THP (VM_SPECIAL|VM_INSERTPAGE|VM_MIXEDMAP|VM_SAO| \
++ VM_HUGETLB|VM_SHARED|VM_MAYSHARE)
++
+ int hugepage_madvise(struct vm_area_struct *vma,
+ unsigned long *vm_flags, int advice)
+ {
+@@ -1416,11 +1419,7 @@ int hugepage_madvise(struct vm_area_struct *vma,
+ /*
+ * Be somewhat over-protective like KSM for now!
+ */
+- if (*vm_flags & (VM_HUGEPAGE |
+- VM_SHARED | VM_MAYSHARE |
+- VM_PFNMAP | VM_IO | VM_DONTEXPAND |
+- VM_RESERVED | VM_HUGETLB | VM_INSERTPAGE |
+- VM_MIXEDMAP | VM_SAO))
++ if (*vm_flags & (VM_HUGEPAGE | VM_NO_THP))
+ return -EINVAL;
+ *vm_flags &= ~VM_NOHUGEPAGE;
+ *vm_flags |= VM_HUGEPAGE;
+@@ -1436,11 +1435,7 @@ int hugepage_madvise(struct vm_area_struct *vma,
+ /*
+ * Be somewhat over-protective like KSM for now!
+ */
+- if (*vm_flags & (VM_NOHUGEPAGE |
+- VM_SHARED | VM_MAYSHARE |
+- VM_PFNMAP | VM_IO | VM_DONTEXPAND |
+- VM_RESERVED | VM_HUGETLB | VM_INSERTPAGE |
+- VM_MIXEDMAP | VM_SAO))
++ if (*vm_flags & (VM_NOHUGEPAGE | VM_NO_THP))
+ return -EINVAL;
+ *vm_flags &= ~VM_HUGEPAGE;
+ *vm_flags |= VM_NOHUGEPAGE;
+@@ -1574,10 +1569,14 @@ int khugepaged_enter_vma_merge(struct vm_area_struct *vma)
+ * page fault if needed.
+ */
+ return 0;
+- if (vma->vm_file || vma->vm_ops)
++ if (vma->vm_ops)
+ /* khugepaged not yet working on file or special mappings */
+ return 0;
+- VM_BUG_ON(is_linear_pfn_mapping(vma) || is_pfn_mapping(vma));
++ /*
++ * If is_pfn_mapping() is true is_learn_pfn_mapping() must be
++ * true too, verify it here.
++ */
++ VM_BUG_ON(is_linear_pfn_mapping(vma) || vma->vm_flags & VM_NO_THP);
+ hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK;
+ hend = vma->vm_end & HPAGE_PMD_MASK;
+ if (hstart < hend)
+@@ -1828,12 +1827,15 @@ static void collapse_huge_page(struct mm_struct *mm,
+ (vma->vm_flags & VM_NOHUGEPAGE))
+ goto out;
+
+- /* VM_PFNMAP vmas may have vm_ops null but vm_file set */
+- if (!vma->anon_vma || vma->vm_ops || vma->vm_file)
++ if (!vma->anon_vma || vma->vm_ops)
+ goto out;
+ if (is_vma_temporary_stack(vma))
+ goto out;
+- VM_BUG_ON(is_linear_pfn_mapping(vma) || is_pfn_mapping(vma));
++ /*
++ * If is_pfn_mapping() is true is_learn_pfn_mapping() must be
++ * true too, verify it here.
++ */
++ VM_BUG_ON(is_linear_pfn_mapping(vma) || vma->vm_flags & VM_NO_THP);
+
+ pgd = pgd_offset(mm, address);
+ if (!pgd_present(*pgd))
+@@ -2066,13 +2068,16 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages,
+ progress++;
+ continue;
+ }
+- /* VM_PFNMAP vmas may have vm_ops null but vm_file set */
+- if (!vma->anon_vma || vma->vm_ops || vma->vm_file)
++ if (!vma->anon_vma || vma->vm_ops)
+ goto skip;
+ if (is_vma_temporary_stack(vma))
+ goto skip;
+-
+- VM_BUG_ON(is_linear_pfn_mapping(vma) || is_pfn_mapping(vma));
++ /*
++ * If is_pfn_mapping() is true is_learn_pfn_mapping()
++ * must be true too, verify it here.
++ */
++ VM_BUG_ON(is_linear_pfn_mapping(vma) ||
++ vma->vm_flags & VM_NO_THP);
+
+ hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK;
+ hend = vma->vm_end & HPAGE_PMD_MASK;
+diff --git a/mm/memory.c b/mm/memory.c
+index ce22a25..607098d4 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -3396,7 +3396,7 @@ int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+ * run pte_offset_map on the pmd, if an huge pmd could
+ * materialize from under us from a different thread.
+ */
+- if (unlikely(__pte_alloc(mm, vma, pmd, address)))
++ if (unlikely(pmd_none(*pmd)) && __pte_alloc(mm, vma, pmd, address))
+ return VM_FAULT_OOM;
+ /* if an huge pmd materialized from under us just retry later */
+ if (unlikely(pmd_trans_huge(*pmd)))
+diff --git a/mm/oom_kill.c b/mm/oom_kill.c
+index 83fb72c1..f52e85c 100644
+--- a/mm/oom_kill.c
++++ b/mm/oom_kill.c
+@@ -172,10 +172,13 @@ unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem,
+
+ /*
+ * The baseline for the badness score is the proportion of RAM that each
+- * task's rss and swap space use.
++ * task's rss, pagetable and swap space use.
+ */
+- points = (get_mm_rss(p->mm) + get_mm_counter(p->mm, MM_SWAPENTS)) * 1000 /
+- totalpages;
++ points = get_mm_rss(p->mm) + p->mm->nr_ptes;
++ points += get_mm_counter(p->mm, MM_SWAPENTS);
++
++ points *= 1000;
++ points /= totalpages;
+ task_unlock(p);
+
+ /*
+diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c
+index fce9bd3..5c04f3e 100644
+--- a/net/l2tp/l2tp_ip.c
++++ b/net/l2tp/l2tp_ip.c
+@@ -667,7 +667,7 @@ MODULE_AUTHOR("James Chapman ");
+ MODULE_DESCRIPTION("L2TP over IP");
+ MODULE_VERSION("1.0");
+
+-/* Use the value of SOCK_DGRAM (2) directory, because __stringify does't like
++/* Use the value of SOCK_DGRAM (2) directory, because __stringify doesn't like
+ * enums
+ */
+ MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 2, IPPROTO_L2TP);
+diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c
+index dff27d5..61b1f5a 100644
+--- a/net/sctp/ulpevent.c
++++ b/net/sctp/ulpevent.c
+@@ -554,7 +554,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_send_failed(
+ memcpy(&ssf->ssf_info, &chunk->sinfo, sizeof(struct sctp_sndrcvinfo));
+
+ /* Per TSVWG discussion with Randy. Allow the application to
+- * resemble a fragmented message.
++ * reassemble a fragmented message.
+ */
+ ssf->ssf_info.sinfo_flags = chunk->chunk_hdr->flags;
+
+diff --git a/net/sunrpc/Kconfig b/net/sunrpc/Kconfig
+index 8873fd8..b2198e6 100644
+--- a/net/sunrpc/Kconfig
++++ b/net/sunrpc/Kconfig
+@@ -18,14 +18,13 @@ config SUNRPC_XPRT_RDMA
+ If unsure, say N.
+
+ config RPCSEC_GSS_KRB5
+- tristate
++ tristate "Secure RPC: Kerberos V mechanism"
+ depends on SUNRPC && CRYPTO
+- prompt "Secure RPC: Kerberos V mechanism" if !(NFS_V4 || NFSD_V4)
++ depends on CRYPTO_MD5 && CRYPTO_DES && CRYPTO_CBC && CRYPTO_CTS
++ depends on CRYPTO_ECB && CRYPTO_HMAC && CRYPTO_SHA1 && CRYPTO_AES
++ depends on CRYPTO_ARC4
+ default y
+ select SUNRPC_GSS
+- select CRYPTO_MD5
+- select CRYPTO_DES
+- select CRYPTO_CBC
+ help
+ Choose Y here to enable Secure RPC using the Kerberos version 5
+ GSS-API mechanism (RFC 1964).
+diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
+index f3914d0..339ba64 100644
+--- a/net/sunrpc/auth_gss/auth_gss.c
++++ b/net/sunrpc/auth_gss/auth_gss.c
+@@ -520,7 +520,7 @@ gss_refresh_upcall(struct rpc_task *task)
+ warn_gssd();
+ task->tk_timeout = 15*HZ;
+ rpc_sleep_on(&pipe_version_rpc_waitqueue, task, NULL);
+- return 0;
++ return -EAGAIN;
+ }
+ if (IS_ERR(gss_msg)) {
+ err = PTR_ERR(gss_msg);
+@@ -563,10 +563,12 @@ retry:
+ if (PTR_ERR(gss_msg) == -EAGAIN) {
+ err = wait_event_interruptible_timeout(pipe_version_waitqueue,
+ pipe_version >= 0, 15*HZ);
++ if (pipe_version < 0) {
++ warn_gssd();
++ err = -EACCES;
++ }
+ if (err)
+ goto out;
+- if (pipe_version < 0)
+- warn_gssd();
+ goto retry;
+ }
+ if (IS_ERR(gss_msg)) {
+diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
+index e7a96e4..8d83f9d 100644
+--- a/net/sunrpc/clnt.c
++++ b/net/sunrpc/clnt.c
+@@ -1508,7 +1508,10 @@ call_timeout(struct rpc_task *task)
+ if (clnt->cl_chatty)
+ printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
+ clnt->cl_protname, clnt->cl_server);
+- rpc_exit(task, -EIO);
++ if (task->tk_flags & RPC_TASK_TIMEOUT)
++ rpc_exit(task, -ETIMEDOUT);
++ else
++ rpc_exit(task, -EIO);
+ return;
+ }
+
+diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
+index 9494c37..ce5eb68 100644
+--- a/net/sunrpc/xprt.c
++++ b/net/sunrpc/xprt.c
+@@ -906,6 +906,7 @@ void xprt_transmit(struct rpc_task *task)
+ }
+
+ dprintk("RPC: %5u xmit complete\n", task->tk_pid);
++ task->tk_flags |= RPC_TASK_SENT;
+ spin_lock_bh(&xprt->transport_lock);
+
+ xprt->ops->set_retrans_timeout(task);
+diff --git a/sound/aoa/codecs/tas.c b/sound/aoa/codecs/tas.c
+index 58804c7..fd2188c 100644
+--- a/sound/aoa/codecs/tas.c
++++ b/sound/aoa/codecs/tas.c
+@@ -170,7 +170,7 @@ static void tas_set_volume(struct tas *tas)
+ /* analysing the volume and mixer tables shows
+ * that they are similar enough when we shift
+ * the mixer table down by 4 bits. The error
+- * is minuscule, in just one item the error
++ * is miniscule, in just one item the error
+ * is 1, at a value of 0x07f17b (mixer table
+ * value is 0x07f17a) */
+ tmp = tas_gaintable[left];
diff --git a/packages/linux/patches/linux-2.6.39-rc5-071-silence_i915_agp-module-0.1.patch b/packages/linux/patches/linux-2.6.39-rc5-071-silence_i915_agp-module-0.1.patch
new file mode 100644
index 0000000000..81bbc8c362
--- /dev/null
+++ b/packages/linux/patches/linux-2.6.39-rc5-071-silence_i915_agp-module-0.1.patch
@@ -0,0 +1,12 @@
+diff -Naur linux-2.6.39-rc5/drivers/gpu/drm/i915/i915_drv.c linux-2.6.39-rc5.patch/drivers/gpu/drm/i915/i915_drv.c
+--- linux-2.6.39-rc5/drivers/gpu/drm/i915/i915_drv.c 2011-04-27 05:48:50.000000000 +0200
++++ linux-2.6.39-rc5.patch/drivers/gpu/drm/i915/i915_drv.c 2011-04-29 02:51:28.773622809 +0200
+@@ -760,7 +760,7 @@
+ static int __init i915_init(void)
+ {
+ if (!intel_agp_enabled) {
+- DRM_ERROR("drm/i915 can't work without intel_agp module!\n");
++ DRM_INFO("drm/i915 can't work without intel_agp module!\n");
+ return -ENODEV;
+ }
+
diff --git a/packages/linux/patches/linux-2.6.39-rc5-720_usb-wakeup.patch b/packages/linux/patches/linux-2.6.39-rc5-720_usb-wakeup.patch
deleted file mode 100644
index 0303fd210b..0000000000
--- a/packages/linux/patches/linux-2.6.39-rc5-720_usb-wakeup.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-===================================================================
---- linux-2.6.orig/drivers/base/power/main.c
-+++ linux-2.6/drivers/base/power/main.c
-@@ -63,6 +63,7 @@ void device_pm_init(struct device *dev)
- dev->power.wakeup = NULL;
- spin_lock_init(&dev->power.lock);
- pm_runtime_init(dev);
-+ INIT_LIST_HEAD(&dev->power.entry);
- }
-
- /**
-Index: linux-2.6/drivers/base/power/wakeup.c
-===================================================================
---- linux-2.6.orig/drivers/base/power/wakeup.c
-+++ linux-2.6/drivers/base/power/wakeup.c
-@@ -258,7 +258,7 @@ void device_set_wakeup_capable(struct de
- if (!!dev->power.can_wakeup == !!capable)
- return;
-
-- if (device_is_registered(dev)) {
-+ if (device_is_registered(dev) && !list_empty(&dev->power.entry)) {
- if (capable) {
- if (wakeup_sysfs_add(dev))
- return;
---
-To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
-the body of a message to majordomo@vger.kernel.org
-More majordomo info at http://vger.kernel.org/majordomo-info.html
-Please read the FAQ at http://www.tux.org/lkml/
-
-
\ No newline at end of file
diff --git a/packages/python/devel/Cheetah/build b/packages/python/devel/Cheetah/build
index 3d37a7f15b..3a7c2afbd8 100755
--- a/packages/python/devel/Cheetah/build
+++ b/packages/python/devel/Cheetah/build
@@ -27,10 +27,4 @@ export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
cd $PKG_BUILD
-python setup.py build --cross-compile
-python setup.py install -O1 --skip-build --prefix /usr --root .install
-
-find .install -name "*.py" -exec rm -rf "{}" ";"
-find .install -name "*.pyo" -exec rm -rf "{}" ";"
-
-rm -rf .install/usr/bin
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/devel/Cheetah/install b/packages/python/devel/Cheetah/install
index a9c8b9924b..d2be73015e 100755
--- a/packages/python/devel/Cheetah/install
+++ b/packages/python/devel/Cheetah/install
@@ -22,4 +22,9 @@
. config/options $1
-cp -PR $PKG_BUILD/.install/* $INSTALL
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/devel/distribute/install b/packages/python/devel/distribute/install
index 74e11f0ca6..65715ed51c 100755
--- a/packages/python/devel/distribute/install
+++ b/packages/python/devel/distribute/install
@@ -27,4 +27,4 @@ PKG_SRC_DIR=`ls -d $PKG_BUILD`
PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
-$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --prefix=$INSTALL/usr $PKG_SRC_DIR
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR
diff --git a/packages/python/devel/distribute/meta b/packages/python/devel/distribute/meta
index a9e651e43f..e11b069a2f 100644
--- a/packages/python/devel/distribute/meta
+++ b/packages/python/devel/distribute/meta
@@ -19,11 +19,11 @@
################################################################################
PKG_NAME="distribute"
-PKG_VERSION="0.6.14"
+PKG_VERSION="0.6.15"
PKG_REV="1"
PKG_ARCH="any"
PKG_LICENSE="OSS"
-PKG_SITE="http://peak.telecommunity.com/DevCenter/setuptools"
+PKG_SITE="http://pypi.python.org/pypi/distribute"
PKG_URL="http://pypi.python.org/packages/source/d/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz"
PKG_DEPENDS="Python"
PKG_BUILD_DEPENDS="toolchain Python"
diff --git a/packages/python/graphics/Imaging/build b/packages/python/graphics/Imaging/build
index 3d37a7f15b..3a7c2afbd8 100755
--- a/packages/python/graphics/Imaging/build
+++ b/packages/python/graphics/Imaging/build
@@ -27,10 +27,4 @@ export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
cd $PKG_BUILD
-python setup.py build --cross-compile
-python setup.py install -O1 --skip-build --prefix /usr --root .install
-
-find .install -name "*.py" -exec rm -rf "{}" ";"
-find .install -name "*.pyo" -exec rm -rf "{}" ";"
-
-rm -rf .install/usr/bin
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/graphics/Imaging/install b/packages/python/graphics/Imaging/install
index a9c8b9924b..d2be73015e 100755
--- a/packages/python/graphics/Imaging/install
+++ b/packages/python/graphics/Imaging/install
@@ -22,4 +22,9 @@
. config/options $1
-cp -PR $PKG_BUILD/.install/* $INSTALL
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/security/pyOpenSSL/build b/packages/python/security/pyOpenSSL/build
index 3d37a7f15b..3a7c2afbd8 100755
--- a/packages/python/security/pyOpenSSL/build
+++ b/packages/python/security/pyOpenSSL/build
@@ -27,10 +27,4 @@ export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
cd $PKG_BUILD
-python setup.py build --cross-compile
-python setup.py install -O1 --skip-build --prefix /usr --root .install
-
-find .install -name "*.py" -exec rm -rf "{}" ";"
-find .install -name "*.pyo" -exec rm -rf "{}" ";"
-
-rm -rf .install/usr/bin
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/security/pyOpenSSL/install b/packages/python/security/pyOpenSSL/install
index a9c8b9924b..d2be73015e 100755
--- a/packages/python/security/pyOpenSSL/install
+++ b/packages/python/security/pyOpenSSL/install
@@ -22,4 +22,9 @@
. config/options $1
-cp -PR $PKG_BUILD/.install/* $INSTALL
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/system/configobj/build b/packages/python/system/configobj/build
index 3d37a7f15b..3a7c2afbd8 100755
--- a/packages/python/system/configobj/build
+++ b/packages/python/system/configobj/build
@@ -27,10 +27,4 @@ export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
cd $PKG_BUILD
-python setup.py build --cross-compile
-python setup.py install -O1 --skip-build --prefix /usr --root .install
-
-find .install -name "*.py" -exec rm -rf "{}" ";"
-find .install -name "*.pyo" -exec rm -rf "{}" ";"
-
-rm -rf .install/usr/bin
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/system/configobj/install b/packages/python/system/configobj/install
index a9c8b9924b..d2be73015e 100755
--- a/packages/python/system/configobj/install
+++ b/packages/python/system/configobj/install
@@ -22,4 +22,9 @@
. config/options $1
-cp -PR $PKG_BUILD/.install/* $INSTALL
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/system/hotqueue/build b/packages/python/system/hotqueue/build
new file mode 100755
index 0000000000..3a7c2afbd8
--- /dev/null
+++ b/packages/python/system/hotqueue/build
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+export PYTHONXCPREFIX="$SYSROOT_PREFIX/usr"
+export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
+
+cd $PKG_BUILD
+
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/system/hotqueue/install b/packages/python/system/hotqueue/install
new file mode 100755
index 0000000000..d2be73015e
--- /dev/null
+++ b/packages/python/system/hotqueue/install
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/system/hotqueue/meta b/packages/python/system/hotqueue/meta
new file mode 100644
index 0000000000..af2c682420
--- /dev/null
+++ b/packages/python/system/hotqueue/meta
@@ -0,0 +1,36 @@
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+PKG_NAME="hotqueue"
+PKG_VERSION="0.2.5"
+PKG_REV="1"
+PKG_ARCH="any"
+PKG_LICENSE="OSS"
+PKG_SITE="https://github.com/richardhenry/hotqueue"
+PKG_URL="$OPENELEC_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2"
+PKG_DEPENDS="Python distribute redis-py"
+PKG_BUILD_DEPENDS="toolchain Python distribute distutilscross"
+PKG_PRIORITY="optional"
+PKG_SECTION="python/system"
+PKG_SHORTDESC="hotqueue a Python library that allows you to use Redis as a message queue within your Python programs"
+PKG_LONGDESC="HotQueue is a Python library that allows you to use Redis as a message queue within your Python programs."
+PKG_IS_ADDON="no"
+
+PKG_AUTORECONF="no"
diff --git a/packages/python/system/pyasn1-modules/build b/packages/python/system/pyasn1-modules/build
new file mode 100755
index 0000000000..3a7c2afbd8
--- /dev/null
+++ b/packages/python/system/pyasn1-modules/build
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+export PYTHONXCPREFIX="$SYSROOT_PREFIX/usr"
+export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
+
+cd $PKG_BUILD
+
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/system/pyasn1-modules/install b/packages/python/system/pyasn1-modules/install
new file mode 100755
index 0000000000..d2be73015e
--- /dev/null
+++ b/packages/python/system/pyasn1-modules/install
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/system/pyasn1-modules/meta b/packages/python/system/pyasn1-modules/meta
new file mode 100644
index 0000000000..786bceb4d1
--- /dev/null
+++ b/packages/python/system/pyasn1-modules/meta
@@ -0,0 +1,36 @@
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+PKG_NAME="pyasn1-modules"
+PKG_VERSION="0.0.1a"
+PKG_REV="1"
+PKG_ARCH="any"
+PKG_LICENSE="BSD"
+PKG_SITE="http://sourceforge.net/projects/pyasn1/"
+PKG_URL="$SOURCEFORGE_SRC/pyasn1/pyasn1-modules/$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.gz"
+PKG_DEPENDS="Python distribute pyasn1"
+PKG_BUILD_DEPENDS="toolchain Python distribute distutilscross"
+PKG_PRIORITY="optional"
+PKG_SECTION="python/system"
+PKG_SHORTDESC="pyasn1-modules: a collection of protocols modules written in ASN.1 language."
+PKG_LONGDESC="pyasn1-modules is a collection of protocols modules written in ASN.1 language."
+PKG_IS_ADDON="no"
+
+PKG_AUTORECONF="no"
diff --git a/packages/python/system/pyasn1/build b/packages/python/system/pyasn1/build
new file mode 100755
index 0000000000..3a7c2afbd8
--- /dev/null
+++ b/packages/python/system/pyasn1/build
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+export PYTHONXCPREFIX="$SYSROOT_PREFIX/usr"
+export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
+
+cd $PKG_BUILD
+
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/system/pyasn1/install b/packages/python/system/pyasn1/install
new file mode 100755
index 0000000000..d2be73015e
--- /dev/null
+++ b/packages/python/system/pyasn1/install
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/system/pyasn1/meta b/packages/python/system/pyasn1/meta
new file mode 100644
index 0000000000..78f9ee7bf9
--- /dev/null
+++ b/packages/python/system/pyasn1/meta
@@ -0,0 +1,36 @@
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+PKG_NAME="pyasn1"
+PKG_VERSION="0.0.13b"
+PKG_REV="1"
+PKG_ARCH="any"
+PKG_LICENSE="BSD"
+PKG_SITE="http://sourceforge.net/projects/pyasn1/"
+PKG_URL="$SOURCEFORGE_SRC/pyasn1/pyasn1-devel/$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.gz"
+PKG_DEPENDS="Python distribute"
+PKG_BUILD_DEPENDS="toolchain Python distribute distutilscross"
+PKG_PRIORITY="optional"
+PKG_SECTION="python/system"
+PKG_SHORTDESC="pyasn1: ASN.1 types and codecs"
+PKG_LONGDESC="pyasn1: ASN.1 types and codecs."
+PKG_IS_ADDON="no"
+
+PKG_AUTORECONF="no"
diff --git a/packages/python/system/redis-py/build b/packages/python/system/redis-py/build
new file mode 100755
index 0000000000..3a7c2afbd8
--- /dev/null
+++ b/packages/python/system/redis-py/build
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+export PYTHONXCPREFIX="$SYSROOT_PREFIX/usr"
+export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
+
+cd $PKG_BUILD
+
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/system/redis-py/install b/packages/python/system/redis-py/install
new file mode 100755
index 0000000000..d2be73015e
--- /dev/null
+++ b/packages/python/system/redis-py/install
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/system/redis-py/meta b/packages/python/system/redis-py/meta
new file mode 100644
index 0000000000..b8ca73e808
--- /dev/null
+++ b/packages/python/system/redis-py/meta
@@ -0,0 +1,36 @@
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+PKG_NAME="redis-py"
+PKG_VERSION="2.2.4"
+PKG_REV="1"
+PKG_ARCH="any"
+PKG_LICENSE="OSS"
+PKG_SITE="https://github.com/andymccurdy/redis-py"
+PKG_URL="$OPENELEC_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2"
+PKG_DEPENDS="Python distribute redis"
+PKG_BUILD_DEPENDS="toolchain Python distribute distutilscross"
+PKG_PRIORITY="optional"
+PKG_SECTION="python/system"
+PKG_SHORTDESC="redis-py: the Python interface to the Redis key-value store"
+PKG_LONGDESC="This is the Python interface to the Redis key-value store."
+PKG_IS_ADDON="no"
+
+PKG_AUTORECONF="no"
diff --git a/packages/python/system/simplejson/build b/packages/python/system/simplejson/build
index 3d37a7f15b..3a7c2afbd8 100755
--- a/packages/python/system/simplejson/build
+++ b/packages/python/system/simplejson/build
@@ -27,10 +27,4 @@ export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
cd $PKG_BUILD
-python setup.py build --cross-compile
-python setup.py install -O1 --skip-build --prefix /usr --root .install
-
-find .install -name "*.py" -exec rm -rf "{}" ";"
-find .install -name "*.pyo" -exec rm -rf "{}" ";"
-
-rm -rf .install/usr/bin
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/system/simplejson/install b/packages/python/system/simplejson/install
index a9c8b9924b..d2be73015e 100755
--- a/packages/python/system/simplejson/install
+++ b/packages/python/system/simplejson/install
@@ -22,4 +22,9 @@
. config/options $1
-cp -PR $PKG_BUILD/.install/* $INSTALL
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/system/yenc/build b/packages/python/system/yenc/build
index 3d37a7f15b..3a7c2afbd8 100755
--- a/packages/python/system/yenc/build
+++ b/packages/python/system/yenc/build
@@ -27,10 +27,4 @@ export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
cd $PKG_BUILD
-python setup.py build --cross-compile
-python setup.py install -O1 --skip-build --prefix /usr --root .install
-
-find .install -name "*.py" -exec rm -rf "{}" ";"
-find .install -name "*.pyo" -exec rm -rf "{}" ";"
-
-rm -rf .install/usr/bin
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/system/yenc/install b/packages/python/system/yenc/install
index a9c8b9924b..d2be73015e 100755
--- a/packages/python/system/yenc/install
+++ b/packages/python/system/yenc/install
@@ -22,4 +22,9 @@
. config/options $1
-cp -PR $PKG_BUILD/.install/* $INSTALL
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/python/web/TwistedConch/meta b/packages/python/web/TwistedConch/meta
index e122c9c524..92710e119c 100644
--- a/packages/python/web/TwistedConch/meta
+++ b/packages/python/web/TwistedConch/meta
@@ -25,7 +25,7 @@ PKG_ARCH="any"
PKG_LICENSE="MIT"
PKG_SITE="http://twistedmatrix.com/"
PKG_URL="http://twistedmatrix.com/Releases/Conch/11.0/$PKG_NAME-$PKG_VERSION.tar.bz2"
-PKG_DEPENDS="Python distribute TwistedCore"
+PKG_DEPENDS="Python distribute TwistedCore pyasn1"
PKG_BUILD_DEPENDS="toolchain Python distribute distutilscross TwistedCore"
PKG_PRIORITY="optional"
PKG_SECTION="python/web"
diff --git a/packages/python/web/wokkel/build b/packages/python/web/wokkel/build
index 06c6528a9b..3a7c2afbd8 100755
--- a/packages/python/web/wokkel/build
+++ b/packages/python/web/wokkel/build
@@ -27,10 +27,4 @@ export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/usr/lib -L$SYSROOT_PREFIX/lib"
cd $PKG_BUILD
-python setup.py build --cross-compile
-python setup.py install -O1 --skip-build --prefix /usr --root .install
-
-find .install -name "*.py" -exec rm -rf "{}" ";"
-find .install -name "*.pyo" -exec rm -rf "{}" ";"
-
-rm -rf .install/usr/lib/python*/site-packages/wokkel/test
+python setup.py build --cross-compile bdist_egg --exclude-source-files
diff --git a/packages/python/web/wokkel/install b/packages/python/web/wokkel/install
index f5b110db15..d2be73015e 100755
--- a/packages/python/web/wokkel/install
+++ b/packages/python/web/wokkel/install
@@ -22,4 +22,9 @@
. config/options $1
-cp -PR $PKG_BUILD/.install/* $INSTALL
\ No newline at end of file
+PKG_SRC_DIR=`ls -d $PKG_BUILD`
+
+PYTHON_IMAGE_DIR="`ls -d $INSTALL/usr/lib/python*`"
+export PYTHONPATH="$PYTHON_IMAGE_DIR/site-packages"
+
+$TOOLCHAIN/bin/easy_install --exclude-scripts --zip-ok --no-deps --quiet --prefix=$INSTALL/usr $PKG_SRC_DIR/dist/*.egg
diff --git a/packages/sysutils/redis/build b/packages/sysutils/redis/build
new file mode 100755
index 0000000000..ce39c77de2
--- /dev/null
+++ b/packages/sysutils/redis/build
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+cd $PKG_BUILD
+
+make
+
+$STRIP src/redis-server
+$STRIP src/redis-cli
diff --git a/packages/sysutils/redis/init.d/58_redis b/packages/sysutils/redis/init.d/58_redis
new file mode 100644
index 0000000000..2f4e8de0a4
--- /dev/null
+++ b/packages/sysutils/redis/init.d/58_redis
@@ -0,0 +1,30 @@
+################################################################################
+# Copyright (C) 2009-2010 OpenELEC.tv
+# http://www.openelec.tv
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+# Starting Redis Server
+#
+# runlevels: openelec, textmode
+
+(
+ wait_for_network
+
+ progress "starting Redis server"
+ /usr/sbin/redis-server /etc/redis.conf
+)&
diff --git a/packages/sysutils/redis/install b/packages/sysutils/redis/install
new file mode 100755
index 0000000000..97203fe750
--- /dev/null
+++ b/packages/sysutils/redis/install
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+. config/options $1
+
+mkdir -p $INSTALL/etc
+ cp -P $PKG_BUILD/redis.conf $INSTALL/etc
+
+mkdir -p $INSTALL/usr/bin
+ cp -P $PKG_BUILD/src/redis-cli $INSTALL/usr/bin
+
+mkdir -p $INSTALL/usr/sbin
+ cp -P $PKG_BUILD/src/redis-server $INSTALL/usr/sbin
+
diff --git a/packages/sysutils/redis/meta b/packages/sysutils/redis/meta
new file mode 100644
index 0000000000..e31d42bdd4
--- /dev/null
+++ b/packages/sysutils/redis/meta
@@ -0,0 +1,36 @@
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv)
+#
+# This Program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This Program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenELEC.tv; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# http://www.gnu.org/copyleft/gpl.html
+################################################################################
+
+PKG_NAME="redis"
+PKG_VERSION="2.2.4"
+PKG_REV="1"
+PKG_ARCH="any"
+PKG_LICENSE="OpenSource"
+PKG_SITE="http://www.redis.io"
+PKG_URL="http://redis.googlecode.com/files/$PKG_NAME-$PKG_VERSION.tar.gz"
+PKG_DEPENDS=""
+PKG_BUILD_DEPENDS="toolchain"
+PKG_PRIORITY="optional"
+PKG_SECTION="sysutils"
+PKG_SHORTDESC="redis: an open source, advanced key-value store"
+PKG_LONGDESC="Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets."
+PKG_IS_ADDON="no"
+
+PKG_AUTORECONF="no"
diff --git a/projects/Generic/linux/linux.i386.conf b/projects/Generic/linux/linux.i386.conf
index 3b2af66d1b..6c16b942c1 100644
--- a/projects/Generic/linux/linux.i386.conf
+++ b/projects/Generic/linux/linux.i386.conf
@@ -2174,7 +2174,8 @@ CONFIG_USB_SUSPEND=y
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_XHCI_HCD is not set
+CONFIG_USB_XHCI_HCD=y
+# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
diff --git a/projects/ION/linux/linux.i386.conf b/projects/ION/linux/linux.i386.conf
index 0da45c234c..63cd04cfa8 100644
--- a/projects/ION/linux/linux.i386.conf
+++ b/projects/ION/linux/linux.i386.conf
@@ -2056,7 +2056,8 @@ CONFIG_USB_SUSPEND=y
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_XHCI_HCD is not set
+CONFIG_USB_XHCI_HCD=y
+# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
diff --git a/projects/ION/linux/linux.x86_64.conf b/projects/ION/linux/linux.x86_64.conf
index af189f3481..019bd951cd 100644
--- a/projects/ION/linux/linux.x86_64.conf
+++ b/projects/ION/linux/linux.x86_64.conf
@@ -1991,7 +1991,8 @@ CONFIG_USB_SUSPEND=y
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_XHCI_HCD is not set
+CONFIG_USB_XHCI_HCD=y
+# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
diff --git a/projects/Intel/linux/linux.i386.conf b/projects/Intel/linux/linux.i386.conf
index 3e33b00ac8..5cd9ab02cc 100644
--- a/projects/Intel/linux/linux.i386.conf
+++ b/projects/Intel/linux/linux.i386.conf
@@ -1,6 +1,6 @@
#
# Automatically generated make config: don't edit
-# Linux/i386 2.6.39-rc3 Kernel Configuration
+# Linux/i386 2.6.39-rc5 Kernel Configuration
#
# CONFIG_64BIT is not set
CONFIG_X86_32=y
@@ -141,7 +141,6 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
CONFIG_EXPERT=y
-CONFIG_EMBEDDED=y
CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y
# CONFIG_KALLSYMS is not set
@@ -158,6 +157,7 @@ CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
+CONFIG_EMBEDDED=y
CONFIG_HAVE_PERF_EVENTS=y
#
@@ -516,6 +516,7 @@ CONFIG_PCI_MSI=y
CONFIG_HT_IRQ=y
# CONFIG_PCI_IOV is not set
CONFIG_PCI_IOAPIC=y
+CONFIG_PCI_LABEL=y
CONFIG_ISA_DMA_API=y
# CONFIG_ISA is not set
# CONFIG_MCA is not set
@@ -2045,7 +2046,8 @@ CONFIG_USB_SUSPEND=y
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_XHCI_HCD is not set
+CONFIG_USB_XHCI_HCD=y
+# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
@@ -2365,7 +2367,6 @@ CONFIG_VT6656=m
# CONFIG_CS5535_GPIO is not set
# CONFIG_XVMALLOC is not set
# CONFIG_ZRAM is not set
-# CONFIG_SAMSUNG_LAPTOP is not set
# CONFIG_FB_SM7XX is not set
# CONFIG_CRYSTALHD is not set
# CONFIG_FB_XGI is not set
diff --git a/projects/Intel/linux/linux.x86_64.conf b/projects/Intel/linux/linux.x86_64.conf
index ef90885918..f15af0cce0 100644
--- a/projects/Intel/linux/linux.x86_64.conf
+++ b/projects/Intel/linux/linux.x86_64.conf
@@ -1986,7 +1986,8 @@ CONFIG_USB_SUSPEND=y
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_XHCI_HCD is not set
+CONFIG_USB_XHCI_HCD=y
+# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not set