summaryrefslogtreecommitdiff
path: root/target/linux/patches
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2014-03-11 17:13:27 +0100
committerWaldemar Brodkorb <wbx@openadk.org>2014-03-11 17:13:27 +0100
commit5e9198fbda131c3c3a1dde9091dfe9d935d28c5a (patch)
treecc7f962216665b82cedb1da09cebc599adfd435e /target/linux/patches
parent8f148a08f29ccb6c21f108549e20aa8e0bb04b79 (diff)
sync patch with upstream 3.13.y branch
Diffstat (limited to 'target/linux/patches')
-rw-r--r--target/linux/patches/3.13.6/raspberry.patch7944
1 files changed, 1402 insertions, 6542 deletions
diff --git a/target/linux/patches/3.13.6/raspberry.patch b/target/linux/patches/3.13.6/raspberry.patch
index 980740e8d..1e2050a44 100644
--- a/target/linux/patches/3.13.6/raspberry.patch
+++ b/target/linux/patches/3.13.6/raspberry.patch
@@ -1,6 +1,6 @@
-diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_cutdown_defconfig linux-3.13.6/arch/arm/configs/bcmrpi_cutdown_defconfig
---- linux-3.13.6.orig/arch/arm/configs/bcmrpi_cutdown_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/configs/bcmrpi_cutdown_defconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/configs/bcmrpi_cutdown_defconfig linux-raspberry-pi/arch/arm/configs/bcmrpi_cutdown_defconfig
+--- linux-3.13.6/arch/arm/configs/bcmrpi_cutdown_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/configs/bcmrpi_cutdown_defconfig 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,503 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
@@ -505,10 +505,10 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_cutdown_defconfig linux-3.13
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_BCM2708=m
-diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_defconfig linux-3.13.6/arch/arm/configs/bcmrpi_defconfig
---- linux-3.13.6.orig/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/configs/bcmrpi_defconfig 2014-03-10 14:41:55.000000000 +0100
-@@ -0,0 +1,1088 @@
+diff -Nur linux-3.13.6/arch/arm/configs/bcmrpi_defconfig linux-raspberry-pi/arch/arm/configs/bcmrpi_defconfig
+--- linux-3.13.6/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/configs/bcmrpi_defconfig 2014-03-11 16:54:55.000000000 +0100
+@@ -0,0 +1,1089 @@
+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
@@ -901,6 +901,7 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_defconfig linux-3.13.6/arch/
+CONFIG_CHR_DEV_ST=m
+CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SR=m
++CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_ISCSI_ATTRS=y
+CONFIG_ISCSI_TCP=m
@@ -1597,9 +1598,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_defconfig linux-3.13.6/arch/
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_emergency_defconfig linux-3.13.6/arch/arm/configs/bcmrpi_emergency_defconfig
---- linux-3.13.6.orig/arch/arm/configs/bcmrpi_emergency_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/configs/bcmrpi_emergency_defconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/configs/bcmrpi_emergency_defconfig linux-raspberry-pi/arch/arm/configs/bcmrpi_emergency_defconfig
+--- linux-3.13.6/arch/arm/configs/bcmrpi_emergency_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/configs/bcmrpi_emergency_defconfig 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,532 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
@@ -2133,9 +2134,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_emergency_defconfig linux-3.
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_quick_defconfig linux-3.13.6/arch/arm/configs/bcmrpi_quick_defconfig
---- linux-3.13.6.orig/arch/arm/configs/bcmrpi_quick_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/configs/bcmrpi_quick_defconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/configs/bcmrpi_quick_defconfig linux-raspberry-pi/arch/arm/configs/bcmrpi_quick_defconfig
+--- linux-3.13.6/arch/arm/configs/bcmrpi_quick_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/configs/bcmrpi_quick_defconfig 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,197 @@
+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
+CONFIG_LOCALVERSION="-quick"
@@ -2334,9 +2335,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_quick_defconfig linux-3.13.6
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.13.6.orig/arch/arm/include/asm/fiq.h linux-3.13.6/arch/arm/include/asm/fiq.h
---- linux-3.13.6.orig/arch/arm/include/asm/fiq.h 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/include/asm/fiq.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/include/asm/fiq.h linux-raspberry-pi/arch/arm/include/asm/fiq.h
+--- linux-3.13.6/arch/arm/include/asm/fiq.h 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/include/asm/fiq.h 2014-03-11 16:51:54.000000000 +0100
@@ -42,6 +42,7 @@
/* helpers defined in fiqasm.S: */
extern void __set_fiq_regs(unsigned long const *regs);
@@ -2345,9 +2346,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/include/asm/fiq.h linux-3.13.6/arch/arm/inc
static inline void set_fiq_regs(struct pt_regs const *regs)
{
-diff -Nur linux-3.13.6.orig/arch/arm/Kconfig linux-3.13.6/arch/arm/Kconfig
---- linux-3.13.6.orig/arch/arm/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/Kconfig linux-raspberry-pi/arch/arm/Kconfig
+--- linux-3.13.6/arch/arm/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/Kconfig 2014-03-11 16:54:55.000000000 +0100
@@ -373,6 +373,24 @@
This enables support for systems based on Atmel
AT91RM9200 and AT91SAM9* processors.
@@ -2381,9 +2382,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/Kconfig linux-3.13.6/arch/arm/Kconfig
source "arch/arm/mach-zynq/Kconfig"
-diff -Nur linux-3.13.6.orig/arch/arm/Kconfig.debug linux-3.13.6/arch/arm/Kconfig.debug
---- linux-3.13.6.orig/arch/arm/Kconfig.debug 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/Kconfig.debug 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/Kconfig.debug linux-raspberry-pi/arch/arm/Kconfig.debug
+--- linux-3.13.6/arch/arm/Kconfig.debug 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/Kconfig.debug 2014-03-11 16:54:55.000000000 +0100
@@ -882,6 +882,14 @@
options; the platform specific options are deprecated
and will be soon removed.
@@ -2399,9 +2400,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/Kconfig.debug linux-3.13.6/arch/arm/Kconfig
endchoice
config DEBUG_EXYNOS_UART
-diff -Nur linux-3.13.6.orig/arch/arm/kernel/fiqasm.S linux-3.13.6/arch/arm/kernel/fiqasm.S
---- linux-3.13.6.orig/arch/arm/kernel/fiqasm.S 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/kernel/fiqasm.S 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/kernel/fiqasm.S linux-raspberry-pi/arch/arm/kernel/fiqasm.S
+--- linux-3.13.6/arch/arm/kernel/fiqasm.S 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/kernel/fiqasm.S 2014-03-11 16:51:54.000000000 +0100
@@ -25,6 +25,9 @@
ENTRY(__set_fiq_regs)
mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE
@@ -2420,9 +2421,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/kernel/fiqasm.S linux-3.13.6/arch/arm/kerne
+ENTRY(__FIQ_Branch)
+ mov pc, r8
+ENDPROC(__FIQ_Branch)
-diff -Nur linux-3.13.6.orig/arch/arm/kernel/fiq.c linux-3.13.6/arch/arm/kernel/fiq.c
---- linux-3.13.6.orig/arch/arm/kernel/fiq.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/kernel/fiq.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/kernel/fiq.c linux-raspberry-pi/arch/arm/kernel/fiq.c
+--- linux-3.13.6/arch/arm/kernel/fiq.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/kernel/fiq.c 2014-03-11 16:51:54.000000000 +0100
@@ -142,6 +142,7 @@
EXPORT_SYMBOL(set_fiq_handler);
EXPORT_SYMBOL(__set_fiq_regs); /* defined in fiqasm.S */
@@ -2431,9 +2432,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/kernel/fiq.c linux-3.13.6/arch/arm/kernel/f
EXPORT_SYMBOL(claim_fiq);
EXPORT_SYMBOL(release_fiq);
EXPORT_SYMBOL(enable_fiq);
-diff -Nur linux-3.13.6.orig/arch/arm/kernel/process.c linux-3.13.6/arch/arm/kernel/process.c
---- linux-3.13.6.orig/arch/arm/kernel/process.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/kernel/process.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/kernel/process.c linux-raspberry-pi/arch/arm/kernel/process.c
+--- linux-3.13.6/arch/arm/kernel/process.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/kernel/process.c 2014-03-11 16:54:55.000000000 +0100
@@ -176,6 +176,16 @@
default_idle();
}
@@ -2451,9 +2452,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/kernel/process.c linux-3.13.6/arch/arm/kern
/*
* Called by kexec, immediately prior to machine_kexec().
*
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.c linux-3.13.6/arch/arm/mach-bcm2708/armctrl.c
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/armctrl.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/armctrl.c linux-raspberry-pi/arch/arm/mach-bcm2708/armctrl.c
+--- linux-3.13.6/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/armctrl.c 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,219 @@
+/*
+ * linux/arch/arm/mach-bcm2708/armctrl.c
@@ -2674,9 +2675,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.c linux-3.13.6/arch/ar
+ init_FIQ(FIQ_START);
+ return 0;
+}
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.h linux-3.13.6/arch/arm/mach-bcm2708/armctrl.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/armctrl.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/armctrl.h linux-raspberry-pi/arch/arm/mach-bcm2708/armctrl.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/armctrl.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,27 @@
+/*
+ * linux/arch/arm/mach-bcm2708/armctrl.h
@@ -2705,9 +2706,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.h linux-3.13.6/arch/ar
+ u32 armctrl_sources, u32 resume_sources);
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.c linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.c
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.c linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708.c
+--- linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708.c 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,1129 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708.c
@@ -3838,9 +3839,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.c linux-3.13.6/arch/ar
+module_param(disk_led_gpio, uint, 0644);
+module_param(disk_led_active_low, uint, 0644);
+module_param(reboot_part, uint, 0644);
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-3.13.6/arch/arm/mach-bcm2708/bcm2708_gpio.c
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/bcm2708_gpio.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708_gpio.c
+--- linux-3.13.6/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708_gpio.c 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,361 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708_gpio.c
@@ -4203,9 +4204,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-3.13.6/ar
+
+MODULE_DESCRIPTION("Broadcom BCM2708 GPIO driver");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.h linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.h linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708.h 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,49 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708.h
@@ -4256,9 +4257,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.h linux-3.13.6/arch/ar
+}
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.c linux-3.13.6/arch/arm/mach-bcm2708/clock.c
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/clock.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/clock.c linux-raspberry-pi/arch/arm/mach-bcm2708/clock.c
+--- linux-3.13.6/arch/arm/mach-bcm2708/clock.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/clock.c 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,61 @@
+/*
+ * linux/arch/arm/mach-bcm2708/clock.c
@@ -4321,9 +4322,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.c linux-3.13.6/arch/arm/
+ return -EIO;
+}
+EXPORT_SYMBOL(clk_set_rate);
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.h linux-3.13.6/arch/arm/mach-bcm2708/clock.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/clock.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/clock.h linux-raspberry-pi/arch/arm/mach-bcm2708/clock.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/clock.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/clock.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,24 @@
+/*
+ * linux/arch/arm/mach-bcm2708/clock.h
@@ -4349,9 +4350,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.h linux-3.13.6/arch/arm/
+struct clk {
+ unsigned long rate;
+};
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/dma.c linux-3.13.6/arch/arm/mach-bcm2708/dma.c
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/dma.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/dma.c linux-raspberry-pi/arch/arm/mach-bcm2708/dma.c
+--- linux-3.13.6/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/dma.c 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,407 @@
+/*
+ * linux/arch/arm/mach-bcm2708/dma.c
@@ -4760,9 +4761,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/dma.c linux-3.13.6/arch/arm/ma
+MODULE_LICENSE("GPL");
+
+MODULE_PARM_DESC(dmachans, "Bitmap of DMA channels available to the ARM");
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_control.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_control.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/arm_control.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/arm_control.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,419 @@
+/*
+ * linux/arch/arm/mach-bcm2708/arm_control.h
@@ -5183,9 +5184,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_control.h lin
+#define AJBTDO HW_REGISTER_RW(AJB_BASE+0x0c)
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_power.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_power.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/arm_power.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/arm_power.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,60 @@
+/*
+ * linux/arch/arm/mach-bcm2708/include/mach/arm_power.h
@@ -5247,9 +5248,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_power.h linux
+};
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/clkdev.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/clkdev.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/clkdev.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/clkdev.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,7 @@
+#ifndef __ASM_MACH_CLKDEV_H
+#define __ASM_MACH_CLKDEV_H
@@ -5258,9 +5259,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-3.
+#define __clk_put(clk) do { } while (0)
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-3.13.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/debug-macro.S
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,22 @@
+/* arch/arm/mach-bcm2708/include/mach/debug-macro.S
+ *
@@ -5284,9 +5285,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/debug-macro.S lin
+ .endm
+
+#include <debug/pl01x.S>
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/dma.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/dma.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/dma.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/dma.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/dma.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/dma.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,90 @@
+/*
+ * linux/arch/arm/mach-bcm2708/include/mach/dma.h
@@ -5378,9 +5379,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/dma.h linux-3.13.
+
+
+#endif /* _MACH_BCM2708_DMA_H */
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-3.13.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/entry-macro.S
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,69 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/entry-macro.S
@@ -5451,9 +5452,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/entry-macro.S lin
+1020: @ EQ will be set if no irqs pending
+
+ .endm
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/frc.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/frc.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/frc.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/frc.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/frc.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/frc.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/timex.h
@@ -5493,9 +5494,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/frc.h linux-3.13.
+extern unsigned long long frc_clock_ticks63(void);
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/gpio.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/gpio.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/gpio.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/gpio.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/gpio.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/gpio.h 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,17 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/gpio.h
@@ -5514,9 +5515,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/gpio.h linux-3.13
+#define irq_to_gpio(x) ((x) - GPIO_IRQ_START)
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/hardware.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/hardware.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/hardware.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/hardware.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/hardware.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/hardware.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,28 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/hardware.h
@@ -5546,9 +5547,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/hardware.h linux-
+#include <mach/platform.h>
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/io.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/io.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/io.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/io.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/io.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/io.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,27 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/io.h
@@ -5577,9 +5578,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/io.h linux-3.13.6
+#define __io(a) __typesafe_io(a)
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/irqs.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/irqs.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/irqs.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/irqs.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/irqs.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/irqs.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,199 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/irqs.h
@@ -5780,9 +5781,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/irqs.h linux-3.13
+
+
+#endif /* _BCM2708_IRQS_H_ */
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/memory.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/memory.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/memory.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/memory.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/memory.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/memory.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,57 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/memory.h
@@ -5841,9 +5842,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/memory.h linux-3.
+#define __bus_to_pfn(x) __phys_to_pfn((x) - (BUS_OFFSET - PLAT_PHYS_OFFSET))
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/platform.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/platform.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/platform.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/platform.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/platform.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/platform.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,228 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/platform.h
@@ -6073,9 +6074,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/platform.h linux-
+#endif
+
+/* END */
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/power.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/power.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/power.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/power.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/power.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/power.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,26 @@
+/*
+ * linux/arch/arm/mach-bcm2708/power.h
@@ -6103,9 +6104,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/power.h linux-3.1
+extern int bcm_power_close(BCM_POWER_HANDLE_T handle);
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/system.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/system.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/system.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/system.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/system.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/system.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/system.h
@@ -6145,9 +6146,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/system.h linux-3.
+}
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/timex.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/timex.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/timex.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/timex.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/timex.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/timex.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,23 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/timex.h
@@ -6172,9 +6173,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/timex.h linux-3.1
+ */
+
+#define CLOCK_TICK_RATE (1000000)
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/uncompress.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/uncompress.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/uncompress.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/uncompress.h 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,84 @@
+/*
+ * arch/arm/mach-bcn2708/include/mach/uncompress.h
@@ -6260,9 +6261,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/uncompress.h linu
+ * nothing to do
+ */
+#define arch_decomp_wdog()
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vcio.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vcio.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vcio.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vcio.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vcio.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vcio.h 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,141 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/vcio.h
@@ -6405,9 +6406,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vcio.h linux-3.13
+#define DEVICE_FILE_NAME "char_dev"
+
+#endif
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vc_mem.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,35 @@
+/*****************************************************************************
+* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved.
@@ -6444,9 +6445,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-3.
+#endif
+
+#endif /* VC_MEM_H */
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vmalloc.h
+--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,20 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/vmalloc.h
@@ -6468,9 +6469,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-3
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#define VMALLOC_END (0xe8000000)
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Kconfig linux-3.13.6/arch/arm/mach-bcm2708/Kconfig
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/Kconfig linux-raspberry-pi/arch/arm/mach-bcm2708/Kconfig
+--- linux-3.13.6/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/Kconfig 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,41 @@
+menu "Broadcom BCM2708 Implementations"
+ depends on ARCH_BCM2708
@@ -6513,9 +6514,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Kconfig linux-3.13.6/arch/arm/
+ help
+ Binds spidev driver to the SPI0 master
+endmenu
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile linux-3.13.6/arch/arm/mach-bcm2708/Makefile
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/Makefile linux-raspberry-pi/arch/arm/mach-bcm2708/Makefile
+--- linux-3.13.6/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/Makefile 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,7 @@
+#
+# Makefile for the linux kernel.
@@ -6524,16 +6525,16 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile linux-3.13.6/arch/arm
+obj-$(CONFIG_MACH_BCM2708) += clock.o bcm2708.o armctrl.o vcio.o power.o dma.o
+obj-$(CONFIG_BCM2708_GPIO) += bcm2708_gpio.o
+obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile.boot linux-3.13.6/arch/arm/mach-bcm2708/Makefile.boot
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/Makefile.boot 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/Makefile.boot linux-raspberry-pi/arch/arm/mach-bcm2708/Makefile.boot
+--- linux-3.13.6/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/Makefile.boot 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,3 @@
+ zreladdr-y := 0x00008000
+params_phys-y := 0x00000100
+initrd_phys-y := 0x00800000
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/power.c linux-3.13.6/arch/arm/mach-bcm2708/power.c
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/power.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/power.c linux-raspberry-pi/arch/arm/mach-bcm2708/power.c
+--- linux-3.13.6/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/power.c 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,194 @@
+/*
+ * linux/arch/arm/mach-bcm2708/power.c
@@ -6729,9 +6730,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/power.c linux-3.13.6/arch/arm/
+MODULE_AUTHOR("Phil Elwell");
+MODULE_DESCRIPTION("Interface to BCM2708 power management");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/vcio.c linux-3.13.6/arch/arm/mach-bcm2708/vcio.c
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/vcio.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/vcio.c linux-raspberry-pi/arch/arm/mach-bcm2708/vcio.c
+--- linux-3.13.6/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/vcio.c 2014-03-11 16:54:55.000000000 +0100
@@ -0,0 +1,474 @@
+/*
+ * linux/arch/arm/mach-bcm2708/vcio.c
@@ -7207,9 +7208,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/vcio.c linux-3.13.6/arch/arm/m
+MODULE_DESCRIPTION("ARM I/O to VideoCore processor");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:bcm-mbox");
-diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/vc_mem.c linux-3.13.6/arch/arm/mach-bcm2708/vc_mem.c
---- linux-3.13.6.orig/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/arch/arm/mach-bcm2708/vc_mem.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/vc_mem.c linux-raspberry-pi/arch/arm/mach-bcm2708/vc_mem.c
+--- linux-3.13.6/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mach-bcm2708/vc_mem.c 2014-03-11 16:51:54.000000000 +0100
@@ -0,0 +1,432 @@
+/*****************************************************************************
+* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved.
@@ -7643,9 +7644,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/vc_mem.c linux-3.13.6/arch/arm
+module_param(mem_size, uint, 0644);
+module_param(mem_base, uint, 0644);
+
-diff -Nur linux-3.13.6.orig/arch/arm/Makefile linux-3.13.6/arch/arm/Makefile
---- linux-3.13.6.orig/arch/arm/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/Makefile linux-raspberry-pi/arch/arm/Makefile
+--- linux-3.13.6/arch/arm/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/Makefile 2014-03-11 16:54:55.000000000 +0100
@@ -147,6 +147,7 @@
# by CONFIG_* macro name.
machine-$(CONFIG_ARCH_AT91) += at91
@@ -7654,9 +7655,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/Makefile linux-3.13.6/arch/arm/Makefile
machine-$(CONFIG_ARCH_BCM2835) += bcm2835
machine-$(CONFIG_ARCH_CLPS711X) += clps711x
machine-$(CONFIG_ARCH_CNS3XXX) += cns3xxx
-diff -Nur linux-3.13.6.orig/arch/arm/mm/Kconfig linux-3.13.6/arch/arm/mm/Kconfig
---- linux-3.13.6.orig/arch/arm/mm/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/mm/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mm/Kconfig linux-raspberry-pi/arch/arm/mm/Kconfig
+--- linux-3.13.6/arch/arm/mm/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mm/Kconfig 2014-03-11 16:54:55.000000000 +0100
@@ -358,7 +358,7 @@
# ARMv6
@@ -7666,9 +7667,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mm/Kconfig linux-3.13.6/arch/arm/mm/Kconfig
select CPU_32v6
select CPU_ABRT_EV6
select CPU_CACHE_V6
-diff -Nur linux-3.13.6.orig/arch/arm/mm/proc-v6.S linux-3.13.6/arch/arm/mm/proc-v6.S
---- linux-3.13.6.orig/arch/arm/mm/proc-v6.S 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/mm/proc-v6.S 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/mm/proc-v6.S linux-raspberry-pi/arch/arm/mm/proc-v6.S
+--- linux-3.13.6/arch/arm/mm/proc-v6.S 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/mm/proc-v6.S 2014-03-11 16:54:55.000000000 +0100
@@ -73,10 +73,19 @@
*
* IRQs are already disabled.
@@ -7692,9 +7693,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mm/proc-v6.S linux-3.13.6/arch/arm/mm/proc-
mov pc, lr
ENTRY(cpu_v6_dcache_clean_area)
-diff -Nur linux-3.13.6.orig/arch/arm/tools/mach-types linux-3.13.6/arch/arm/tools/mach-types
---- linux-3.13.6.orig/arch/arm/tools/mach-types 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/arch/arm/tools/mach-types 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/arch/arm/tools/mach-types linux-raspberry-pi/arch/arm/tools/mach-types
+--- linux-3.13.6/arch/arm/tools/mach-types 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/arch/arm/tools/mach-types 2014-03-11 16:51:56.000000000 +0100
@@ -522,6 +522,7 @@
prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103
paz00 MACH_PAZ00 PAZ00 3128
@@ -7703,9 +7704,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/tools/mach-types linux-3.13.6/arch/arm/tool
ag5evm MACH_AG5EVM AG5EVM 3189
ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206
wlf_cragg_6410 MACH_WLF_CRAGG_6410 WLF_CRAGG_6410 3207
-diff -Nur linux-3.13.6.orig/Documentation/video4linux/bcm2835-v4l2.txt linux-3.13.6/Documentation/video4linux/bcm2835-v4l2.txt
---- linux-3.13.6.orig/Documentation/video4linux/bcm2835-v4l2.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/Documentation/video4linux/bcm2835-v4l2.txt 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/Documentation/video4linux/bcm2835-v4l2.txt linux-raspberry-pi/Documentation/video4linux/bcm2835-v4l2.txt
+--- linux-3.13.6/Documentation/video4linux/bcm2835-v4l2.txt 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/Documentation/video4linux/bcm2835-v4l2.txt 2014-03-11 16:51:47.000000000 +0100
@@ -0,0 +1,60 @@
+
+BCM2835 (aka Raspberry Pi) V4L2 driver
@@ -7767,9 +7768,9 @@ diff -Nur linux-3.13.6.orig/Documentation/video4linux/bcm2835-v4l2.txt linux-3.1
+List of available formats:
+
+$ v4l2-ctl --list-formats
-diff -Nur linux-3.13.6.orig/drivers/char/broadcom/Kconfig linux-3.13.6/drivers/char/broadcom/Kconfig
---- linux-3.13.6.orig/drivers/char/broadcom/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/char/broadcom/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/char/broadcom/Kconfig linux-raspberry-pi/drivers/char/broadcom/Kconfig
+--- linux-3.13.6/drivers/char/broadcom/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/char/broadcom/Kconfig 2014-03-11 16:54:56.000000000 +0100
@@ -0,0 +1,16 @@
+#
+# Broadcom char driver config
@@ -7787,14 +7788,14 @@ diff -Nur linux-3.13.6.orig/drivers/char/broadcom/Kconfig linux-3.13.6/drivers/c
+ help
+ Helper for videocore CMA access.
+
-diff -Nur linux-3.13.6.orig/drivers/char/broadcom/Makefile linux-3.13.6/drivers/char/broadcom/Makefile
---- linux-3.13.6.orig/drivers/char/broadcom/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/char/broadcom/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/char/broadcom/Makefile linux-raspberry-pi/drivers/char/broadcom/Makefile
+--- linux-3.13.6/drivers/char/broadcom/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/char/broadcom/Makefile 2014-03-11 16:54:56.000000000 +0100
@@ -0,0 +1 @@
+obj-$(CONFIG_BCM_VC_CMA) += vc_cma/
-diff -Nur linux-3.13.6.orig/drivers/char/broadcom/vc_cma/Makefile linux-3.13.6/drivers/char/broadcom/vc_cma/Makefile
---- linux-3.13.6.orig/drivers/char/broadcom/vc_cma/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/char/broadcom/vc_cma/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/char/broadcom/vc_cma/Makefile linux-raspberry-pi/drivers/char/broadcom/vc_cma/Makefile
+--- linux-3.13.6/drivers/char/broadcom/vc_cma/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/char/broadcom/vc_cma/Makefile 2014-03-11 16:54:56.000000000 +0100
@@ -0,0 +1,14 @@
+EXTRA_CFLAGS += -Wall -Wstrict-prototypes -Wno-trigraphs
+EXTRA_CFLAGS += -Werror
@@ -7810,9 +7811,9 @@ diff -Nur linux-3.13.6.orig/drivers/char/broadcom/vc_cma/Makefile linux-3.13.6/d
+obj-$(CONFIG_BCM_VC_CMA) += vc-cma.o
+
+vc-cma-objs := vc_cma.o
-diff -Nur linux-3.13.6.orig/drivers/char/broadcom/vc_cma/vc_cma.c linux-3.13.6/drivers/char/broadcom/vc_cma/vc_cma.c
---- linux-3.13.6.orig/drivers/char/broadcom/vc_cma/vc_cma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/char/broadcom/vc_cma/vc_cma.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-raspberry-pi/drivers/char/broadcom/vc_cma/vc_cma.c
+--- linux-3.13.6/drivers/char/broadcom/vc_cma/vc_cma.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/char/broadcom/vc_cma/vc_cma.c 2014-03-11 16:54:56.000000000 +0100
@@ -0,0 +1,1143 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -8957,9 +8958,9 @@ diff -Nur linux-3.13.6.orig/drivers/char/broadcom/vc_cma/vc_cma.c linux-3.13.6/d
+module_exit(vc_cma_exit);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Broadcom Corporation");
-diff -Nur linux-3.13.6.orig/drivers/char/hw_random/bcm2708-rng.c linux-3.13.6/drivers/char/hw_random/bcm2708-rng.c
---- linux-3.13.6.orig/drivers/char/hw_random/bcm2708-rng.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/char/hw_random/bcm2708-rng.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/char/hw_random/bcm2708-rng.c linux-raspberry-pi/drivers/char/hw_random/bcm2708-rng.c
+--- linux-3.13.6/drivers/char/hw_random/bcm2708-rng.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/char/hw_random/bcm2708-rng.c 2014-03-11 16:52:29.000000000 +0100
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -9078,9 +9079,9 @@ diff -Nur linux-3.13.6.orig/drivers/char/hw_random/bcm2708-rng.c linux-3.13.6/dr
+
+MODULE_DESCRIPTION("BCM2708 H/W Random Number Generator (RNG) driver");
+MODULE_LICENSE("GPL and additional rights");
-diff -Nur linux-3.13.6.orig/drivers/char/hw_random/Kconfig linux-3.13.6/drivers/char/hw_random/Kconfig
---- linux-3.13.6.orig/drivers/char/hw_random/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/char/hw_random/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/char/hw_random/Kconfig linux-raspberry-pi/drivers/char/hw_random/Kconfig
+--- linux-3.13.6/drivers/char/hw_random/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/char/hw_random/Kconfig 2014-03-11 16:54:56.000000000 +0100
@@ -341,6 +341,17 @@
If unsure, say Y.
@@ -9099,18 +9100,18 @@ diff -Nur linux-3.13.6.orig/drivers/char/hw_random/Kconfig linux-3.13.6/drivers/
config HW_RANDOM_MSM
tristate "Qualcomm MSM Random Number Generator support"
depends on HW_RANDOM && ARCH_MSM
-diff -Nur linux-3.13.6.orig/drivers/char/hw_random/Makefile linux-3.13.6/drivers/char/hw_random/Makefile
---- linux-3.13.6.orig/drivers/char/hw_random/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/char/hw_random/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/char/hw_random/Makefile linux-raspberry-pi/drivers/char/hw_random/Makefile
+--- linux-3.13.6/drivers/char/hw_random/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/char/hw_random/Makefile 2014-03-11 16:54:56.000000000 +0100
@@ -29,4 +29,5 @@
obj-$(CONFIG_HW_RANDOM_EXYNOS) += exynos-rng.o
obj-$(CONFIG_HW_RANDOM_TPM) += tpm-rng.o
obj-$(CONFIG_HW_RANDOM_BCM2835) += bcm2835-rng.o
+obj-$(CONFIG_HW_RANDOM_BCM2708) += bcm2708-rng.o
obj-$(CONFIG_HW_RANDOM_MSM) += msm-rng.o
-diff -Nur linux-3.13.6.orig/drivers/char/Kconfig linux-3.13.6/drivers/char/Kconfig
---- linux-3.13.6.orig/drivers/char/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/char/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/char/Kconfig linux-raspberry-pi/drivers/char/Kconfig
+--- linux-3.13.6/drivers/char/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/char/Kconfig 2014-03-11 16:54:56.000000000 +0100
@@ -580,6 +580,8 @@
source "drivers/s390/char/Kconfig"
@@ -9120,18 +9121,18 @@ diff -Nur linux-3.13.6.orig/drivers/char/Kconfig linux-3.13.6/drivers/char/Kconf
config MSM_SMD_PKT
bool "Enable device interface for some SMD packet ports"
default n
-diff -Nur linux-3.13.6.orig/drivers/char/Makefile linux-3.13.6/drivers/char/Makefile
---- linux-3.13.6.orig/drivers/char/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/char/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/char/Makefile linux-raspberry-pi/drivers/char/Makefile
+--- linux-3.13.6/drivers/char/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/char/Makefile 2014-03-11 16:54:56.000000000 +0100
@@ -62,3 +62,5 @@
js-rtc-y = rtc.o
obj-$(CONFIG_TILE_SROM) += tile-srom.o
+
+obj-$(CONFIG_BRCM_CHAR_DRIVERS) += broadcom/
-diff -Nur linux-3.13.6.orig/drivers/cpufreq/bcm2835-cpufreq.c linux-3.13.6/drivers/cpufreq/bcm2835-cpufreq.c
---- linux-3.13.6.orig/drivers/cpufreq/bcm2835-cpufreq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/cpufreq/bcm2835-cpufreq.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/cpufreq/bcm2835-cpufreq.c linux-raspberry-pi/drivers/cpufreq/bcm2835-cpufreq.c
+--- linux-3.13.6/drivers/cpufreq/bcm2835-cpufreq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/cpufreq/bcm2835-cpufreq.c 2014-03-11 16:54:56.000000000 +0100
@@ -0,0 +1,239 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -9372,9 +9373,9 @@ diff -Nur linux-3.13.6.orig/drivers/cpufreq/bcm2835-cpufreq.c linux-3.13.6/drive
+
+module_init(bcm2835_cpufreq_module_init);
+module_exit(bcm2835_cpufreq_module_exit);
-diff -Nur linux-3.13.6.orig/drivers/cpufreq/Kconfig.arm linux-3.13.6/drivers/cpufreq/Kconfig.arm
---- linux-3.13.6.orig/drivers/cpufreq/Kconfig.arm 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/cpufreq/Kconfig.arm 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/cpufreq/Kconfig.arm linux-raspberry-pi/drivers/cpufreq/Kconfig.arm
+--- linux-3.13.6/drivers/cpufreq/Kconfig.arm 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/cpufreq/Kconfig.arm 2014-03-11 16:54:56.000000000 +0100
@@ -218,6 +218,14 @@
help
This adds the CPUFreq driver support for SPEAr SOCs.
@@ -9390,9 +9391,9 @@ diff -Nur linux-3.13.6.orig/drivers/cpufreq/Kconfig.arm linux-3.13.6/drivers/cpu
config ARM_TEGRA_CPUFREQ
bool "TEGRA CPUFreq support"
depends on ARCH_TEGRA
-diff -Nur linux-3.13.6.orig/drivers/cpufreq/Makefile linux-3.13.6/drivers/cpufreq/Makefile
---- linux-3.13.6.orig/drivers/cpufreq/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/cpufreq/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/cpufreq/Makefile linux-raspberry-pi/drivers/cpufreq/Makefile
+--- linux-3.13.6/drivers/cpufreq/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/cpufreq/Makefile 2014-03-11 16:54:56.000000000 +0100
@@ -73,6 +73,7 @@
obj-$(CONFIG_ARM_SA1100_CPUFREQ) += sa1100-cpufreq.o
obj-$(CONFIG_ARM_SA1110_CPUFREQ) += sa1110-cpufreq.o
@@ -9401,9 +9402,9 @@ diff -Nur linux-3.13.6.orig/drivers/cpufreq/Makefile linux-3.13.6/drivers/cpufre
obj-$(CONFIG_ARM_TEGRA_CPUFREQ) += tegra-cpufreq.o
obj-$(CONFIG_ARM_VEXPRESS_SPC_CPUFREQ) += vexpress-spc-cpufreq.o
-diff -Nur linux-3.13.6.orig/drivers/dma/bcm2708-dmaengine.c linux-3.13.6/drivers/dma/bcm2708-dmaengine.c
---- linux-3.13.6.orig/drivers/dma/bcm2708-dmaengine.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/dma/bcm2708-dmaengine.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/dma/bcm2708-dmaengine.c linux-raspberry-pi/drivers/dma/bcm2708-dmaengine.c
+--- linux-3.13.6/drivers/dma/bcm2708-dmaengine.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/dma/bcm2708-dmaengine.c 2014-03-11 16:54:56.000000000 +0100
@@ -0,0 +1,588 @@
+/*
+ * BCM2708 DMA engine support
@@ -9993,9 +9994,9 @@ diff -Nur linux-3.13.6.orig/drivers/dma/bcm2708-dmaengine.c linux-3.13.6/drivers
+MODULE_DESCRIPTION("BCM2708 DMA engine driver");
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.13.6.orig/drivers/dma/Kconfig linux-3.13.6/drivers/dma/Kconfig
---- linux-3.13.6.orig/drivers/dma/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/dma/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/dma/Kconfig linux-raspberry-pi/drivers/dma/Kconfig
+--- linux-3.13.6/drivers/dma/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/dma/Kconfig 2014-03-11 16:54:56.000000000 +0100
@@ -312,6 +312,12 @@
The Communications Port Programming Interface (CPPI) 4.1 DMA engine
is currently used by the USB driver on AM335x platforms.
@@ -10009,9 +10010,9 @@ diff -Nur linux-3.13.6.orig/drivers/dma/Kconfig linux-3.13.6/drivers/dma/Kconfig
config MMP_PDMA
bool "MMP PDMA support"
depends on (ARCH_MMP || ARCH_PXA)
-diff -Nur linux-3.13.6.orig/drivers/dma/Makefile linux-3.13.6/drivers/dma/Makefile
---- linux-3.13.6.orig/drivers/dma/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/dma/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/dma/Makefile linux-raspberry-pi/drivers/dma/Makefile
+--- linux-3.13.6/drivers/dma/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/dma/Makefile 2014-03-11 16:54:56.000000000 +0100
@@ -38,6 +38,7 @@
obj-$(CONFIG_DMA_SA11X0) += sa11x0-dma.o
obj-$(CONFIG_MMP_TDMA) += mmp_tdma.o
@@ -10020,9 +10021,9 @@ diff -Nur linux-3.13.6.orig/drivers/dma/Makefile linux-3.13.6/drivers/dma/Makefi
obj-$(CONFIG_MMP_PDMA) += mmp_pdma.o
obj-$(CONFIG_DMA_JZ4740) += dma-jz4740.o
obj-$(CONFIG_TI_CPPI41) += cppi41.o
-diff -Nur linux-3.13.6.orig/drivers/hwmon/bcm2835-hwmon.c linux-3.13.6/drivers/hwmon/bcm2835-hwmon.c
---- linux-3.13.6.orig/drivers/hwmon/bcm2835-hwmon.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/hwmon/bcm2835-hwmon.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/hwmon/bcm2835-hwmon.c linux-raspberry-pi/drivers/hwmon/bcm2835-hwmon.c
+--- linux-3.13.6/drivers/hwmon/bcm2835-hwmon.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/hwmon/bcm2835-hwmon.c 2014-03-11 16:52:40.000000000 +0100
@@ -0,0 +1,219 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -10243,9 +10244,9 @@ diff -Nur linux-3.13.6.orig/drivers/hwmon/bcm2835-hwmon.c linux-3.13.6/drivers/h
+MODULE_DESCRIPTION("HW Monitor driver for bcm2835 chip");
+
+module_platform_driver(bcm2835_hwmon_driver);
-diff -Nur linux-3.13.6.orig/drivers/hwmon/Kconfig linux-3.13.6/drivers/hwmon/Kconfig
---- linux-3.13.6.orig/drivers/hwmon/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/hwmon/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/hwmon/Kconfig linux-raspberry-pi/drivers/hwmon/Kconfig
+--- linux-3.13.6/drivers/hwmon/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/hwmon/Kconfig 2014-03-11 16:54:57.000000000 +0100
@@ -1554,6 +1554,16 @@
help
Support for the A/D converter on MC13783 and MC13892 PMIC.
@@ -10263,9 +10264,9 @@ diff -Nur linux-3.13.6.orig/drivers/hwmon/Kconfig linux-3.13.6/drivers/hwmon/Kco
if ACPI
comment "ACPI drivers"
-diff -Nur linux-3.13.6.orig/drivers/hwmon/Makefile linux-3.13.6/drivers/hwmon/Makefile
---- linux-3.13.6.orig/drivers/hwmon/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/hwmon/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/hwmon/Makefile linux-raspberry-pi/drivers/hwmon/Makefile
+--- linux-3.13.6/drivers/hwmon/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/hwmon/Makefile 2014-03-11 16:54:57.000000000 +0100
@@ -142,6 +142,7 @@
obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o
obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o
@@ -10274,9 +10275,9 @@ diff -Nur linux-3.13.6.orig/drivers/hwmon/Makefile linux-3.13.6/drivers/hwmon/Ma
obj-$(CONFIG_PMBUS) += pmbus/
-diff -Nur linux-3.13.6.orig/drivers/i2c/busses/i2c-bcm2708.c linux-3.13.6/drivers/i2c/busses/i2c-bcm2708.c
---- linux-3.13.6.orig/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/i2c/busses/i2c-bcm2708.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/i2c/busses/i2c-bcm2708.c linux-raspberry-pi/drivers/i2c/busses/i2c-bcm2708.c
+--- linux-3.13.6/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/i2c/busses/i2c-bcm2708.c 2014-03-11 16:54:57.000000000 +0100
@@ -0,0 +1,408 @@
+/*
+ * Driver for Broadcom BCM2708 BSC Controllers
@@ -10686,9 +10687,9 @@ diff -Nur linux-3.13.6.orig/drivers/i2c/busses/i2c-bcm2708.c linux-3.13.6/driver
+MODULE_AUTHOR("Chris Boot <bootc@bootc.net>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRV_NAME);
-diff -Nur linux-3.13.6.orig/drivers/i2c/busses/Kconfig linux-3.13.6/drivers/i2c/busses/Kconfig
---- linux-3.13.6.orig/drivers/i2c/busses/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/i2c/busses/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/i2c/busses/Kconfig linux-raspberry-pi/drivers/i2c/busses/Kconfig
+--- linux-3.13.6/drivers/i2c/busses/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/i2c/busses/Kconfig 2014-03-11 16:54:57.000000000 +0100
@@ -347,6 +347,25 @@
This support is also available as a module. If so, the module
will be called i2c-bcm2835.
@@ -10715,9 +10716,9 @@ diff -Nur linux-3.13.6.orig/drivers/i2c/busses/Kconfig linux-3.13.6/drivers/i2c/
config I2C_BCM_KONA
tristate "BCM Kona I2C adapter"
depends on ARCH_BCM_MOBILE
-diff -Nur linux-3.13.6.orig/drivers/i2c/busses/Makefile linux-3.13.6/drivers/i2c/busses/Makefile
---- linux-3.13.6.orig/drivers/i2c/busses/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/i2c/busses/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/i2c/busses/Makefile linux-raspberry-pi/drivers/i2c/busses/Makefile
+--- linux-3.13.6/drivers/i2c/busses/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/i2c/busses/Makefile 2014-03-11 16:54:57.000000000 +0100
@@ -32,6 +32,7 @@
obj-$(CONFIG_I2C_AT91) += i2c-at91.o
obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o
@@ -10726,9 +10727,9 @@ diff -Nur linux-3.13.6.orig/drivers/i2c/busses/Makefile linux-3.13.6/drivers/i2c
obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o
obj-$(CONFIG_I2C_CBUS_GPIO) += i2c-cbus-gpio.o
obj-$(CONFIG_I2C_CPM) += i2c-cpm.o
-diff -Nur linux-3.13.6.orig/drivers/media/dvb-core/dvb-usb-ids.h linux-3.13.6/drivers/media/dvb-core/dvb-usb-ids.h
---- linux-3.13.6.orig/drivers/media/dvb-core/dvb-usb-ids.h 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/media/dvb-core/dvb-usb-ids.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/dvb-core/dvb-usb-ids.h linux-raspberry-pi/drivers/media/dvb-core/dvb-usb-ids.h
+--- linux-3.13.6/drivers/media/dvb-core/dvb-usb-ids.h 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/media/dvb-core/dvb-usb-ids.h 2014-03-11 16:54:57.000000000 +0100
@@ -366,6 +366,7 @@
#define USB_PID_TERRATEC_DVBS2CI_V2 0x10ac
#define USB_PID_TECHNISAT_USB2_HDCI_V1 0x0001
@@ -10737,10 +10738,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/dvb-core/dvb-usb-ids.h linux-3.13.6/dr
#define USB_PID_TECHNISAT_AIRSTAR_TELESTICK_2 0x0004
#define USB_PID_TECHNISAT_USB2_DVB_S2 0x0500
#define USB_PID_CPYTO_REDI_PC50A 0xa803
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.c
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.c 2014-03-10 14:41:55.000000000 +0100
-@@ -0,0 +1,1622 @@
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.c linux-raspberry-pi/drivers/media/platform/bcm2835/bcm2835-camera.c
+--- linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/bcm2835-camera.c 2014-03-11 16:52:42.000000000 +0100
+@@ -0,0 +1,1695 @@
+/*
+ * Broadcom BM2835 V4L2 driver
+ *
@@ -10779,7 +10780,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+
+#define BM2835_MMAL_VERSION "0.0.2"
+#define BM2835_MMAL_MODULE_NAME "bcm2835-v4l2"
-+
++#define MIN_WIDTH 16
++#define MIN_HEIGHT 16
+#define MAX_WIDTH 2592
+#define MAX_HEIGHT 1944
+#define MIN_BUFFER_SIZE (80*1024)
@@ -10799,7 +10801,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+static struct bm2835_mmal_dev *gdev; /* global device data */
+
+#define FPS_MIN 1
-+#define FPS_MAX 30
++#define FPS_MAX 90
+
+/* timeperframe: min/max and default */
+static const struct v4l2_fract
@@ -10812,6 +10814,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ {
+ .name = "4:2:0, packed YUV",
+ .fourcc = V4L2_PIX_FMT_YUV420,
++ .flags = 0,
+ .mmal = MMAL_ENCODING_I420,
+ .depth = 12,
+ .mmal_component = MMAL_COMPONENT_CAMERA,
@@ -10819,13 +10822,15 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ {
+ .name = "4:2:2, packed, YUYV",
+ .fourcc = V4L2_PIX_FMT_YUYV,
++ .flags = 0,
+ .mmal = MMAL_ENCODING_YUYV,
+ .depth = 16,
+ .mmal_component = MMAL_COMPONENT_CAMERA,
+ },
+ {
-+ .name = "RGB24 (BE)",
-+ .fourcc = V4L2_PIX_FMT_BGR24,
++ .name = "RGB24 (LE)",
++ .fourcc = V4L2_PIX_FMT_RGB24,
++ .flags = 0,
+ .mmal = MMAL_ENCODING_BGR24,
+ .depth = 24,
+ .mmal_component = MMAL_COMPONENT_CAMERA,
@@ -10833,6 +10838,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ {
+ .name = "JPEG",
+ .fourcc = V4L2_PIX_FMT_JPEG,
++ .flags = V4L2_FMT_FLAG_COMPRESSED,
+ .mmal = MMAL_ENCODING_JPEG,
+ .depth = 8,
+ .mmal_component = MMAL_COMPONENT_IMAGE_ENCODE,
@@ -10840,10 +10846,51 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ {
+ .name = "H264",
+ .fourcc = V4L2_PIX_FMT_H264,
++ .flags = V4L2_FMT_FLAG_COMPRESSED,
+ .mmal = MMAL_ENCODING_H264,
+ .depth = 8,
+ .mmal_component = MMAL_COMPONENT_VIDEO_ENCODE,
-+ }
++ },
++ {
++ .name = "MJPEG",
++ .fourcc = V4L2_PIX_FMT_MJPEG,
++ .flags = V4L2_FMT_FLAG_COMPRESSED,
++ .mmal = MMAL_ENCODING_MJPEG,
++ .depth = 8,
++ .mmal_component = MMAL_COMPONENT_VIDEO_ENCODE,
++ },
++ {
++ .name = "4:2:2, packed, YVYU",
++ .fourcc = V4L2_PIX_FMT_YVYU,
++ .flags = 0,
++ .mmal = MMAL_ENCODING_YVYU,
++ .depth = 16,
++ .mmal_component = MMAL_COMPONENT_CAMERA,
++ },
++ {
++ .name = "4:2:2, packed, VYUY",
++ .fourcc = V4L2_PIX_FMT_VYUY,
++ .flags = 0,
++ .mmal = MMAL_ENCODING_VYUY,
++ .depth = 16,
++ .mmal_component = MMAL_COMPONENT_CAMERA,
++ },
++ {
++ .name = "4:2:2, packed, UYVY",
++ .fourcc = V4L2_PIX_FMT_UYVY,
++ .flags = 0,
++ .mmal = MMAL_ENCODING_UYVY,
++ .depth = 16,
++ .mmal_component = MMAL_COMPONENT_CAMERA,
++ },
++ {
++ .name = "4:2:0, packed, NV12",
++ .fourcc = V4L2_PIX_FMT_NV12,
++ .flags = 0,
++ .mmal = MMAL_ENCODING_NV12,
++ .depth = 12,
++ .mmal_component = MMAL_COMPONENT_CAMERA,
++ },
+};
+
+static struct mmal_fmt *get_format(struct v4l2_format *f)
@@ -11291,6 +11338,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+
+ strlcpy(f->description, fmt->name, sizeof(f->description));
+ f->pixelformat = fmt->fourcc;
++ f->flags = fmt->flags;
+
+ return 0;
+}
@@ -11419,7 +11467,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ a->fmt.bytesperline = (preview_port->es.video.width * 3)>>1;
+ a->fmt.sizeimage = (preview_port->es.video.width *
+ preview_port->es.video.height * 3)>>1;
-+ a->fmt.colorspace = V4L2_COLORSPACE_SMPTE170M;
++ a->fmt.colorspace = V4L2_COLORSPACE_JPEG;
+
+ return 0;
+}
@@ -11486,6 +11534,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+
+ strlcpy(f->description, fmt->name, sizeof(f->description));
+ f->pixelformat = fmt->fourcc;
++ f->flags = fmt->flags;
++
+ return 0;
+}
+
@@ -11630,10 +11680,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ camera_port->es.video.crop.y = 0;
+ camera_port->es.video.crop.width = f->fmt.pix.width;
+ camera_port->es.video.crop.height = f->fmt.pix.height;
-+ camera_port->es.video.frame_rate.num =
-+ dev->capture.timeperframe.denominator;
-+ camera_port->es.video.frame_rate.den =
-+ dev->capture.timeperframe.numerator;
++ camera_port->es.video.frame_rate.num = 0;
++ camera_port->es.video.frame_rate.den = 1;
+
+ ret = vchiq_mmal_port_set_format(dev->instance, camera_port);
+
@@ -11667,8 +11715,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ preview_port->es.video.crop.y = 0;
+ preview_port->es.video.crop.width = f->fmt.pix.width;
+ preview_port->es.video.crop.height = f->fmt.pix.height;
-+ preview_port->es.video.frame_rate.num = 30;
-+ preview_port->es.video.frame_rate.den = 1;
++ preview_port->es.video.frame_rate.num =
++ dev->capture.timeperframe.denominator;
++ preview_port->es.video.frame_rate.den =
++ dev->capture.timeperframe.numerator;
+ ret = vchiq_mmal_port_set_format(dev->instance, preview_port);
+ if (overlay_enabled) {
+ ret = vchiq_mmal_port_connect_tunnel(
@@ -11843,22 +11893,56 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ }
+
+ ret = mmal_setup_components(dev, f);
-+ if (ret != 0)
++ if (ret != 0) {
+ v4l2_err(&dev->v4l2_dev,
+ "%s: failed to setup mmal components: %d\n",
+ __func__, ret);
++ ret = -EINVAL;
++ }
+
+ return ret;
+}
+
++int vidioc_enum_framesizes(struct file *file, void *fh,
++ struct v4l2_frmsizeenum *fsize)
++{
++ static const struct v4l2_frmsize_stepwise sizes = {
++ MIN_WIDTH, MAX_WIDTH, 2,
++ MIN_HEIGHT, MAX_HEIGHT, 2
++ };
++ int i;
++
++ if (fsize->index)
++ return -EINVAL;
++ for (i = 0; i < ARRAY_SIZE(formats); i++)
++ if (formats[i].fourcc == fsize->pixel_format)
++ break;
++ if (i == ARRAY_SIZE(formats))
++ return -EINVAL;
++ fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
++ fsize->stepwise = sizes;
++ return 0;
++}
++
+/* timeperframe is arbitrary and continous */
+static int vidioc_enum_frameintervals(struct file *file, void *priv,
+ struct v4l2_frmivalenum *fival)
+{
++ int i;
++
+ if (fival->index)
+ return -EINVAL;
+
-+ /* regarding width & height - we support any */
++ for (i = 0; i < ARRAY_SIZE(formats); i++)
++ if (formats[i].fourcc == fival->pixel_format)
++ break;
++ if (i == ARRAY_SIZE(formats))
++ return -EINVAL;
++
++ /* regarding width & height - we support any within range */
++ if (fival->width < MIN_WIDTH || fival->width > MAX_WIDTH ||
++ fival->height < MIN_HEIGHT || fival->height > MAX_HEIGHT)
++ return -EINVAL;
+
+ fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS;
+
@@ -11894,7 +11978,6 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ struct bm2835_mmal_dev *dev = video_drvdata(file);
+ struct v4l2_fract tpf;
+ struct mmal_parameter_rational fps_param;
-+ int ret;
+
+ if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ return -EINVAL;
@@ -11910,27 +11993,11 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ parm->parm.capture.timeperframe = tpf;
+ parm->parm.capture.readbuffers = 1;
+
-+ fps_param.num = dev->capture.timeperframe.denominator;
-+ fps_param.den = dev->capture.timeperframe.numerator;
-+ ret = vchiq_mmal_port_parameter_set(dev->instance,
-+ &dev->component[MMAL_COMPONENT_CAMERA]->
-+ output[MMAL_CAMERA_PORT_PREVIEW],
-+ MMAL_PARAMETER_VIDEO_FRAME_RATE,
-+ &fps_param, sizeof(fps_param));
-+ ret += vchiq_mmal_port_parameter_set(dev->instance,
-+ &dev->component[MMAL_COMPONENT_CAMERA]->
-+ output[MMAL_CAMERA_PORT_VIDEO],
-+ MMAL_PARAMETER_VIDEO_FRAME_RATE,
-+ &fps_param, sizeof(fps_param));
-+ ret += vchiq_mmal_port_parameter_set(dev->instance,
-+ &dev->component[MMAL_COMPONENT_CAMERA]->
-+ output[MMAL_CAMERA_PORT_CAPTURE],
-+ MMAL_PARAMETER_VIDEO_FRAME_RATE,
-+ &fps_param, sizeof(fps_param));
-+ if (ret)
-+ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
-+ "Failed to set fps ret %d\n",
-+ ret);
++ fps_param.num = 0; /* Select variable fps, and then use
++ * FPS_RANGE to select the actual limits.
++ */
++ fps_param.den = 1;
++ set_framerate_params(dev);
+
+ return 0;
+}
@@ -11963,6 +12030,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ .vidioc_querybuf = vb2_ioctl_querybuf,
+ .vidioc_qbuf = vb2_ioctl_qbuf,
+ .vidioc_dqbuf = vb2_ioctl_dqbuf,
++ .vidioc_enum_framesizes = vidioc_enum_framesizes,
+ .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
+ .vidioc_g_parm = vidioc_g_parm,
+ .vidioc_s_parm = vidioc_s_parm,
@@ -12058,10 +12126,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ format->es->video.crop.y = 0;
+ format->es->video.crop.width = 1024;
+ format->es->video.crop.height = 768;
-+ format->es->video.frame_rate.num =
-+ dev->capture.timeperframe.denominator;
-+ format->es->video.frame_rate.den =
-+ dev->capture.timeperframe.numerator;
++ format->es->video.frame_rate.num = 0; /* Rely on fps_range */
++ format->es->video.frame_rate.den = 1;
+
+ format =
+ &dev->component[MMAL_COMPONENT_CAMERA]->
@@ -12076,10 +12142,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ format->es->video.crop.y = 0;
+ format->es->video.crop.width = 1024;
+ format->es->video.crop.height = 768;
-+ format->es->video.frame_rate.num =
-+ dev->capture.timeperframe.denominator;
-+ format->es->video.frame_rate.den =
-+ dev->capture.timeperframe.numerator;
++ format->es->video.frame_rate.num = 0; /* Rely on fps_range */
++ format->es->video.frame_rate.den = 1;
+
+ format =
+ &dev->component[MMAL_COMPONENT_CAMERA]->
@@ -12093,7 +12157,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ format->es->video.crop.y = 0;
+ format->es->video.crop.width = 2592;
+ format->es->video.crop.height = 1944;
-+ format->es->video.frame_rate.num = 30;
++ format->es->video.frame_rate.num = 0; /* Rely on fps_range */
+ format->es->video.frame_rate.den = 1;
+
+ dev->capture.width = format->es->video.width;
@@ -12101,6 +12165,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ dev->capture.fmt = &formats[0];
+ dev->capture.encode_component = NULL;
+ dev->capture.timeperframe = tpf_default;
++ dev->capture.enc_profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
++ dev->capture.enc_level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
+
+ /* get the preview component ready */
+ ret = vchiq_mmal_component_init(
@@ -12147,6 +12213,14 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+ }
+
+ {
++ struct vchiq_mmal_port *encoder_port =
++ &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
++ encoder_port->format.encoding = MMAL_ENCODING_H264;
++ ret = vchiq_mmal_port_set_format(dev->instance,
++ encoder_port);
++ }
++
++ {
+ unsigned int enable = 1;
+ vchiq_mmal_port_parameter_set(
+ dev->instance,
@@ -12363,10 +12437,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+
+module_init(bm2835_mmal_init);
+module_exit(bm2835_mmal_exit);
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.h
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.h 2014-03-10 14:41:55.000000000 +0100
-@@ -0,0 +1,113 @@
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.h linux-raspberry-pi/drivers/media/platform/bcm2835/bcm2835-camera.h
+--- linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/bcm2835-camera.h 2014-03-11 16:52:42.000000000 +0100
+@@ -0,0 +1,123 @@
+/*
+ * Broadcom BM2835 V4L2 driver
+ *
@@ -12384,7 +12458,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu
+ * core driver device
+ */
+
-+#define V4L2_CTRL_COUNT 21 /* number of v4l controls */
++#define V4L2_CTRL_COUNT 25 /* number of v4l controls */
+
+enum {
+ MMAL_COMPONENT_CAMERA = 0,
@@ -12414,11 +12488,17 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu
+ /* controls */
+ struct v4l2_ctrl_handler ctrl_handler;
+ struct v4l2_ctrl *ctrls[V4L2_CTRL_COUNT];
++ enum v4l2_scene_mode scene_mode;
+ struct mmal_colourfx colourfx;
+ int hflip;
+ int vflip;
-+ enum mmal_parameter_exposuremode exposure_mode;
++ enum mmal_parameter_exposuremode exposure_mode_user;
++ enum v4l2_exposure_auto_type exposure_mode_v4l2_user;
++ /* active exposure mode may differ if selected via a scene mode */
++ enum mmal_parameter_exposuremode exposure_mode_active;
++ enum mmal_parameter_exposuremeteringmode metering_mode;
+ unsigned int manual_shutter_speed;
++ bool exp_auto_priority;
+
+ /* allocated mmal instance and components */
+ struct vchiq_mmal_instance *instance;
@@ -12432,12 +12512,16 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu
+ unsigned int height; /* height */
+ unsigned int stride; /* stride */
+ struct mmal_fmt *fmt;
-+ struct v4l2_fract timeperframe;
++ struct v4l2_fract timeperframe;
+
+ /* H264 encode bitrate */
+ int encode_bitrate;
+ /* H264 bitrate mode. CBR/VBR */
+ int encode_bitrate_mode;
++ /* H264 profile */
++ enum v4l2_mpeg_video_h264_profile enc_profile;
++ /* H264 level */
++ enum v4l2_mpeg_video_h264_level enc_level;
+ /* JPEG Q-factor */
+ int q_factor;
+
@@ -12467,7 +12551,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu
+ struct v4l2_ctrl_handler *hdl);
+
+int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev);
-+
++int set_framerate_params(struct bm2835_mmal_dev *dev);
+
+/* Debug helpers */
+
@@ -12480,10 +12564,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu
+ (pix_fmt)->pixelformat, (pix_fmt)->bytesperline, \
+ (pix_fmt)->sizeimage, (pix_fmt)->colorspace, (pix_fmt)->priv); \
+}
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13.6/drivers/media/platform/bcm2835/controls.c
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/controls.c 2014-03-10 14:41:55.000000000 +0100
-@@ -0,0 +1,902 @@
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/controls.c linux-raspberry-pi/drivers/media/platform/bcm2835/controls.c
+--- linux-3.13.6/drivers/media/platform/bcm2835/controls.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/controls.c 2014-03-11 16:52:42.000000000 +0100
+@@ -0,0 +1,1278 @@
+/*
+ * Broadcom BM2835 V4L2 driver
+ *
@@ -12555,7 +12639,6 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ (s64)V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
+};
+
-+
+enum bm2835_mmal_ctrl_type {
+ MMAL_CONTROL_TYPE_STD,
+ MMAL_CONTROL_TYPE_STD_MENU,
@@ -12632,6 +12715,25 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ 1, 1, 0, 0, 0, {0, 0, 0, 0, 0} }
+};
+
++struct v4l2_mmal_scene_config {
++ enum v4l2_scene_mode v4l2_scene;
++ enum mmal_parameter_exposuremode exposure_mode;
++ enum mmal_parameter_exposuremeteringmode metering_mode;
++};
++
++static const struct v4l2_mmal_scene_config scene_configs[] = {
++ /* V4L2_SCENE_MODE_NONE automatically added */
++ {
++ V4L2_SCENE_MODE_NIGHT,
++ MMAL_PARAM_EXPOSUREMODE_NIGHT,
++ MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
++ },
++ {
++ V4L2_SCENE_MODE_SPORTS,
++ MMAL_PARAM_EXPOSUREMODE_SPORTS,
++ MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
++ },
++};
+
+/* control handlers*/
+
@@ -12783,7 +12885,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ struct v4l2_ctrl *ctrl,
+ const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
+{
-+ enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode;
++ enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode_user;
+ u32 shutter_speed = 0;
+ struct vchiq_mmal_port *control;
+ int ret = 0;
@@ -12804,28 +12906,34 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ case V4L2_EXPOSURE_MANUAL:
+ exp_mode = MMAL_PARAM_EXPOSUREMODE_OFF;
+ break;
-+
-+ case V4L2_EXPOSURE_SHUTTER_PRIORITY:
-+ exp_mode = MMAL_PARAM_EXPOSUREMODE_SPORTS;
-+ break;
-+
-+ case V4L2_EXPOSURE_APERTURE_PRIORITY:
-+ exp_mode = MMAL_PARAM_EXPOSUREMODE_NIGHT;
-+ break;
-+
+ }
-+ dev->exposure_mode = exp_mode;
-+ }
-+
-+ if (dev->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
-+ shutter_speed = dev->manual_shutter_speed;
++ dev->exposure_mode_user = exp_mode;
++ dev->exposure_mode_v4l2_user = ctrl->val;
++ } else if (mmal_ctrl->id == V4L2_CID_EXPOSURE_AUTO_PRIORITY) {
++ dev->exp_auto_priority = ctrl->val;
++ }
++
++ if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
++ if (exp_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
++ shutter_speed = dev->manual_shutter_speed;
++
++ ret = vchiq_mmal_port_parameter_set(dev->instance,
++ control,
++ MMAL_PARAMETER_SHUTTER_SPEED,
++ &shutter_speed,
++ sizeof(shutter_speed));
++ ret += vchiq_mmal_port_parameter_set(dev->instance,
++ control,
++ MMAL_PARAMETER_EXPOSURE_MODE,
++ &exp_mode,
++ sizeof(u32));
++ dev->exposure_mode_active = exp_mode;
++ }
++ /* exposure_dynamic_framerate (V4L2_CID_EXPOSURE_AUTO_PRIORITY) should
++ * always apply irrespective of scene mode.
++ */
++ ret += set_framerate_params(dev);
+
-+ ret = vchiq_mmal_port_parameter_set(dev->instance, control,
-+ MMAL_PARAMETER_SHUTTER_SPEED,
-+ &shutter_speed, sizeof(shutter_speed));
-+ ret += vchiq_mmal_port_parameter_set(dev->instance, control,
-+ MMAL_PARAMETER_EXPOSURE_MODE,
-+ &exp_mode, sizeof(u32));
+ return ret;
+}
+
@@ -12833,35 +12941,38 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ struct v4l2_ctrl *ctrl,
+ const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
+{
-+ u32 u32_value;
-+ struct vchiq_mmal_port *control;
-+
-+ control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
-+
+ switch (ctrl->val) {
+ case V4L2_EXPOSURE_METERING_AVERAGE:
-+ u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE;
++ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE;
+ break;
+
+ case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED:
-+ u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT;
++ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT;
+ break;
+
+ case V4L2_EXPOSURE_METERING_SPOT:
-+ u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT;
++ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT;
+ break;
+
+ /* todo matrix weighting not added to Linux API till 3.9
+ case V4L2_EXPOSURE_METERING_MATRIX:
-+ u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX;
++ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX;
+ break;
+ */
+
+ }
+
-+ return vchiq_mmal_port_parameter_set(dev->instance, control,
++ if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
++ struct vchiq_mmal_port *control;
++ u32 u32_value = dev->metering_mode;
++
++ control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
++
++ return vchiq_mmal_port_parameter_set(dev->instance, control,
+ mmal_ctrl->mmal_id,
+ &u32_value, sizeof(u32_value));
++ } else
++ return 0;
+}
+
+static int ctrl_set_flicker_avoidance(struct bm2835_mmal_dev *dev,
@@ -13026,8 +13137,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ &dev->colourfx, sizeof(dev->colourfx));
+
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
-+ "After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
-+ mmal_ctrl, ctrl->id, ctrl->val, ret,
++ "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
++ __func__, mmal_ctrl, ctrl->id, ctrl->val, ret,
+ (ret == 0 ? 0 : -EINVAL));
+ return (ret == 0 ? 0 : EINVAL);
+}
@@ -13109,6 +13220,224 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ &u32_value, sizeof(u32_value));
+}
+
++static int ctrl_set_video_encode_profile_level(struct bm2835_mmal_dev *dev,
++ struct v4l2_ctrl *ctrl,
++ const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
++{
++ struct mmal_parameter_video_profile param;
++ int ret = 0;
++
++ if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_PROFILE) {
++ switch (ctrl->val) {
++ case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
++ case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
++ case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
++ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
++ dev->capture.enc_profile = ctrl->val;
++ break;
++ default:
++ ret = -EINVAL;
++ break;
++ }
++ } else if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_LEVEL) {
++ switch (ctrl->val) {
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
++ case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
++ dev->capture.enc_level = ctrl->val;
++ break;
++ default:
++ ret = -EINVAL;
++ break;
++ }
++ }
++
++ if (!ret) {
++ switch (dev->capture.enc_profile) {
++ case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
++ param.profile = MMAL_VIDEO_PROFILE_H264_BASELINE;
++ break;
++ case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
++ param.profile =
++ MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE;
++ break;
++ case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
++ param.profile = MMAL_VIDEO_PROFILE_H264_MAIN;
++ break;
++ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
++ param.profile = MMAL_VIDEO_PROFILE_H264_HIGH;
++ break;
++ default:
++ /* Should never get here */
++ break;
++ }
++
++ switch (dev->capture.enc_level) {
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
++ param.level = MMAL_VIDEO_LEVEL_H264_1;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
++ param.level = MMAL_VIDEO_LEVEL_H264_1b;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
++ param.level = MMAL_VIDEO_LEVEL_H264_11;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
++ param.level = MMAL_VIDEO_LEVEL_H264_12;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
++ param.level = MMAL_VIDEO_LEVEL_H264_13;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
++ param.level = MMAL_VIDEO_LEVEL_H264_2;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
++ param.level = MMAL_VIDEO_LEVEL_H264_21;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
++ param.level = MMAL_VIDEO_LEVEL_H264_22;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
++ param.level = MMAL_VIDEO_LEVEL_H264_3;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
++ param.level = MMAL_VIDEO_LEVEL_H264_31;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
++ param.level = MMAL_VIDEO_LEVEL_H264_32;
++ break;
++ case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
++ param.level = MMAL_VIDEO_LEVEL_H264_4;
++ break;
++ default:
++ /* Should never get here */
++ break;
++ }
++
++ ret = vchiq_mmal_port_parameter_set(dev->instance,
++ &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0],
++ mmal_ctrl->mmal_id,
++ &param, sizeof(param));
++ }
++ return ret;
++}
++
++static int ctrl_set_scene_mode(struct bm2835_mmal_dev *dev,
++ struct v4l2_ctrl *ctrl,
++ const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
++{
++ int ret = 0;
++ int shutter_speed;
++ struct vchiq_mmal_port *control;
++
++ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
++ "scene mode selected %d, was %d\n", ctrl->val,
++ dev->scene_mode);
++ control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
++
++ if (ctrl->val == dev->scene_mode)
++ return 0;
++
++ if (ctrl->val == V4L2_SCENE_MODE_NONE) {
++ /* Restore all user selections */
++ dev->scene_mode = V4L2_SCENE_MODE_NONE;
++
++ if (dev->exposure_mode_user == MMAL_PARAM_EXPOSUREMODE_OFF)
++ shutter_speed = dev->manual_shutter_speed;
++ else
++ shutter_speed = 0;
++
++ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
++ "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
++ __func__, shutter_speed, dev->exposure_mode_user,
++ dev->metering_mode);
++ ret = vchiq_mmal_port_parameter_set(dev->instance,
++ control,
++ MMAL_PARAMETER_SHUTTER_SPEED,
++ &shutter_speed,
++ sizeof(shutter_speed));
++ ret += vchiq_mmal_port_parameter_set(dev->instance,
++ control,
++ MMAL_PARAMETER_EXPOSURE_MODE,
++ &dev->exposure_mode_user,
++ sizeof(u32));
++ dev->exposure_mode_active = dev->exposure_mode_user;
++ ret += vchiq_mmal_port_parameter_set(dev->instance,
++ control,
++ MMAL_PARAMETER_EXP_METERING_MODE,
++ &dev->metering_mode,
++ sizeof(u32));
++ ret += set_framerate_params(dev);
++ } else {
++ /* Set up scene mode */
++ int i;
++ const struct v4l2_mmal_scene_config *scene = NULL;
++ int shutter_speed;
++ enum mmal_parameter_exposuremode exposure_mode;
++ enum mmal_parameter_exposuremeteringmode metering_mode;
++
++ for (i = 0; i < ARRAY_SIZE(scene_configs); i++) {
++ if (scene_configs[i].v4l2_scene ==
++ ctrl->val) {
++ scene = &scene_configs[i];
++ break;
++ }
++ }
++ if (i >= ARRAY_SIZE(scene_configs))
++ return -EINVAL;
++
++ /* Set all the values */
++ dev->scene_mode = ctrl->val;
++
++ if (scene->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
++ shutter_speed = dev->manual_shutter_speed;
++ else
++ shutter_speed = 0;
++ exposure_mode = scene->exposure_mode;
++ metering_mode = scene->metering_mode;
++
++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
++ "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
++ __func__, shutter_speed, exposure_mode, metering_mode);
++
++ ret = vchiq_mmal_port_parameter_set(dev->instance, control,
++ MMAL_PARAMETER_SHUTTER_SPEED,
++ &shutter_speed,
++ sizeof(shutter_speed));
++ ret += vchiq_mmal_port_parameter_set(dev->instance,
++ control,
++ MMAL_PARAMETER_EXPOSURE_MODE,
++ &exposure_mode,
++ sizeof(u32));
++ dev->exposure_mode_active = exposure_mode;
++ ret += vchiq_mmal_port_parameter_set(dev->instance, control,
++ MMAL_PARAMETER_EXPOSURE_MODE,
++ &exposure_mode,
++ sizeof(u32));
++ ret += vchiq_mmal_port_parameter_set(dev->instance, control,
++ MMAL_PARAMETER_EXP_METERING_MODE,
++ &metering_mode,
++ sizeof(u32));
++ ret += set_framerate_params(dev);
++ }
++ if (ret) {
++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
++ "%s: Setting scene to %d, ret=%d\n",
++ __func__, ctrl->val, ret);
++ ret = -EINVAL;
++ }
++ return 0;
++}
++
+static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+ struct bm2835_mmal_dev *dev =
@@ -13125,6 +13454,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ }
+
+ ret = mmal_ctrl->setter(dev, ctrl, mmal_ctrl);
++ if (ret)
++ pr_warn("ctrl id:%d/MMAL param %08X- returned ret %d\n",
++ ctrl->id, mmal_ctrl->mmal_id, ret);
+ if (mmal_ctrl->ignore_errors)
+ ret = 0;
+ return ret;
@@ -13211,6 +13543,14 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ false
+ },
+ {
++ V4L2_CID_EXPOSURE_AUTO_PRIORITY, MMAL_CONTROL_TYPE_STD,
++ 0, 1,
++ 0, 1, NULL,
++ 0, /* Dummy MMAL ID as it gets mapped into FPS range*/
++ &ctrl_set_exposure,
++ false
++ },
++ {
+ V4L2_CID_EXPOSURE_METERING,
+ MMAL_CONTROL_TYPE_STD_MENU,
+ ~0x7, 2, V4L2_EXPOSURE_METERING_AVERAGE, 0, NULL,
@@ -13300,6 +13640,48 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ &ctrl_set_video_encode_param_output,
+ true /* Errors ignored as requires latest firmware to work */
+ },
++ {
++ V4L2_CID_MPEG_VIDEO_H264_PROFILE,
++ MMAL_CONTROL_TYPE_STD_MENU,
++ ~((1<<V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
++ (1<<V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
++ (1<<V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
++ (1<<V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
++ V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
++ V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, 1, NULL,
++ MMAL_PARAMETER_PROFILE,
++ &ctrl_set_video_encode_profile_level,
++ false
++ },
++ {
++ V4L2_CID_MPEG_VIDEO_H264_LEVEL, MMAL_CONTROL_TYPE_STD_MENU,
++ ~((1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_4_0)),
++ V4L2_MPEG_VIDEO_H264_LEVEL_4_0,
++ V4L2_MPEG_VIDEO_H264_LEVEL_4_0, 1, NULL,
++ MMAL_PARAMETER_PROFILE,
++ &ctrl_set_video_encode_profile_level,
++ false
++ },
++ {
++ V4L2_CID_SCENE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
++ -1, /* Min is computed at runtime */
++ V4L2_SCENE_MODE_TEXT,
++ V4L2_SCENE_MODE_NONE, 1, NULL,
++ MMAL_PARAMETER_PROFILE,
++ &ctrl_set_scene_mode,
++ false
++ },
+};
+
+int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev)
@@ -13311,13 +13693,71 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ if ((dev->ctrls[c]) && (v4l2_ctrls[c].setter)) {
+ ret = v4l2_ctrls[c].setter(dev, dev->ctrls[c],
+ &v4l2_ctrls[c]);
-+ if (!v4l2_ctrls[c]. ignore_errors && ret)
++ if (!v4l2_ctrls[c].ignore_errors && ret) {
++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
++ "Failed when setting default values for ctrl %d\n",
++ c);
+ break;
++ }
+ }
+ }
+ return ret;
+}
+
++int set_framerate_params(struct bm2835_mmal_dev *dev)
++{
++ struct mmal_parameter_fps_range fps_range;
++ int ret;
++
++ if ((dev->exposure_mode_active != MMAL_PARAM_EXPOSUREMODE_OFF) &&
++ (dev->exp_auto_priority)) {
++ /* Variable FPS. Define min FPS as 1fps.
++ * Max as max defined FPS.
++ */
++ fps_range.fps_low.num = 1;
++ fps_range.fps_low.den = 1;
++ fps_range.fps_high.num = dev->capture.timeperframe.denominator;
++ fps_range.fps_high.den = dev->capture.timeperframe.numerator;
++ } else {
++ /* Fixed FPS - set min and max to be the same */
++ fps_range.fps_low.num = fps_range.fps_high.num =
++ dev->capture.timeperframe.denominator;
++ fps_range.fps_low.den = fps_range.fps_high.den =
++ dev->capture.timeperframe.numerator;
++ }
++
++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
++ "Set fps range to %d/%d to %d/%d\n",
++ fps_range.fps_low.num,
++ fps_range.fps_low.den,
++ fps_range.fps_high.num,
++ fps_range.fps_high.den
++ );
++
++ ret = vchiq_mmal_port_parameter_set(dev->instance,
++ &dev->component[MMAL_COMPONENT_CAMERA]->
++ output[MMAL_CAMERA_PORT_PREVIEW],
++ MMAL_PARAMETER_FPS_RANGE,
++ &fps_range, sizeof(fps_range));
++ ret += vchiq_mmal_port_parameter_set(dev->instance,
++ &dev->component[MMAL_COMPONENT_CAMERA]->
++ output[MMAL_CAMERA_PORT_VIDEO],
++ MMAL_PARAMETER_FPS_RANGE,
++ &fps_range, sizeof(fps_range));
++ ret += vchiq_mmal_port_parameter_set(dev->instance,
++ &dev->component[MMAL_COMPONENT_CAMERA]->
++ output[MMAL_CAMERA_PORT_CAPTURE],
++ MMAL_PARAMETER_FPS_RANGE,
++ &fps_range, sizeof(fps_range));
++ if (ret)
++ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
++ "Failed to set fps ret %d\n",
++ ret);
++
++ return ret;
++
++}
++
+int bm2835_mmal_init_controls(struct bm2835_mmal_dev *dev,
+ struct v4l2_ctrl_handler *hdl)
+{
@@ -13337,10 +13777,30 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+ break;
+
+ case MMAL_CONTROL_TYPE_STD_MENU:
++ {
++ int mask = ctrl->min;
++
++ if (ctrl->id == V4L2_CID_SCENE_MODE) {
++ /* Special handling to work out the mask
++ * value based on the scene_configs array
++ * at runtime. Reduces the chance of
++ * mismatches.
++ */
++ int i;
++ mask = 1<<V4L2_SCENE_MODE_NONE;
++ for (i = 0;
++ i < ARRAY_SIZE(scene_configs);
++ i++) {
++ mask |= 1<<scene_configs[i].v4l2_scene;
++ }
++ mask = ~mask;
++ }
++
+ dev->ctrls[c] = v4l2_ctrl_new_std_menu(hdl,
+ &bm2835_mmal_ctrl_ops, ctrl->id,
-+ ctrl->max, ctrl->min, ctrl->def);
++ ctrl->max, mask, ctrl->def);
+ break;
++ }
+
+ case MMAL_CONTROL_TYPE_INT_MENU:
+ dev->ctrls[c] = v4l2_ctrl_new_int_menu(hdl,
@@ -13386,9 +13846,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+
+ return 0;
+}
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/Kconfig linux-3.13.6/drivers/media/platform/bcm2835/Kconfig
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/Kconfig linux-raspberry-pi/drivers/media/platform/bcm2835/Kconfig
+--- linux-3.13.6/drivers/media/platform/bcm2835/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/Kconfig 2014-03-11 16:52:42.000000000 +0100
@@ -0,0 +1,25 @@
+# Broadcom VideoCore IV v4l2 camera support
+
@@ -13415,19 +13875,19 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/Kconfig linux-3.13.6/
+
+
+endif # VIDEO_BM2835
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/Makefile linux-3.13.6/drivers/media/platform/bcm2835/Makefile
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/Makefile linux-raspberry-pi/drivers/media/platform/bcm2835/Makefile
+--- linux-3.13.6/drivers/media/platform/bcm2835/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/Makefile 2014-03-11 16:52:42.000000000 +0100
@@ -0,0 +1,5 @@
+bcm2835-v4l2-objs := bcm2835-camera.o controls.o mmal-vchiq.o
+
+obj-$(CONFIG_VIDEO_BCM2835_MMAL) += bcm2835-v4l2.o
+
+ccflags-$(CONFIG_VIDEO_BCM2835) += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-common.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-common.h
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-common.h 2014-03-10 14:41:55.000000000 +0100
-@@ -0,0 +1,52 @@
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-common.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-common.h
+--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-common.h 2014-03-11 16:52:42.000000000 +0100
+@@ -0,0 +1,53 @@
+/*
+ * Broadcom BM2835 V4L2 driver
+ *
@@ -13456,6 +13916,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-common.h linux-3
+struct mmal_fmt {
+ char *name;
+ u32 fourcc; /* v4l2 format id */
++ int flags; /* v4l2 flags field */
+ u32 mmal;
+ int depth;
+ u32 mmal_component; /* MMAL component index to be used to encode */
@@ -13480,10 +13941,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-common.h linux-3
+ u32 v;
+};
+
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-encodings.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-encodings.h
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-encodings.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-encodings.h 2014-03-10 14:41:55.000000000 +0100
-@@ -0,0 +1,93 @@
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-encodings.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-encodings.h
+--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-encodings.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-encodings.h 2014-03-11 16:52:42.000000000 +0100
+@@ -0,0 +1,94 @@
+/*
+ * Broadcom BM2835 V4L2 driver
+ *
@@ -13513,6 +13974,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-encodings.h linu
+#define MMAL_ENCODING_VP6 MMAL_FOURCC('V', 'P', '6', ' ')
+#define MMAL_ENCODING_THEORA MMAL_FOURCC('T', 'H', 'E', 'O')
+#define MMAL_ENCODING_SPARK MMAL_FOURCC('S', 'P', 'R', 'K')
++#define MMAL_ENCODING_MJPEG MMAL_FOURCC('M', 'J', 'P', 'G')
+
+#define MMAL_ENCODING_JPEG MMAL_FOURCC('J', 'P', 'E', 'G')
+#define MMAL_ENCODING_GIF MMAL_FOURCC('G', 'I', 'F', ' ')
@@ -13577,9 +14039,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-encodings.h linu
+#define MMAL_ENCODING_VARIANT_H264_AVC1 MMAL_FOURCC('A', 'V', 'C', '1')
+/** Implicitly delineated NAL units without emulation prevention */
+#define MMAL_ENCODING_VARIANT_H264_RAW MMAL_FOURCC('R', 'A', 'W', ' ')
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-common.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-common.h
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-common.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-common.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-common.h
+--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-common.h 2014-03-11 16:52:42.000000000 +0100
@@ -0,0 +1,50 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -13631,9 +14093,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-common.h lin
+};
+
+#endif /* MMAL_MSG_COMMON_H */
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-format.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-format.h
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-format.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-format.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-format.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-format.h
+--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-format.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-format.h 2014-03-11 16:52:42.000000000 +0100
@@ -0,0 +1,81 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -13716,9 +14178,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-format.h lin
+};
+
+#endif /* MMAL_MSG_FORMAT_H */
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg.h
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg.h
+--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg.h 2014-03-11 16:52:42.000000000 +0100
@@ -0,0 +1,404 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -14124,9 +14586,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg.h linux-3.13
+ u8 payload[MMAL_MSG_MAX_PAYLOAD];
+ } u;
+};
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-port.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-port.h
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-port.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-port.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-port.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-port.h
+--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-port.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-port.h 2014-03-11 16:52:42.000000000 +0100
@@ -0,0 +1,107 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -14235,10 +14697,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-port.h linux
+ */
+
+};
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-parameters.h
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-parameters.h 2014-03-10 14:41:55.000000000 +0100
-@@ -0,0 +1,562 @@
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-parameters.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-parameters.h
+--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-parameters.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-parameters.h 2014-03-11 16:52:42.000000000 +0100
+@@ -0,0 +1,649 @@
+/*
+ * Broadcom BM2835 V4L2 driver
+ *
@@ -14423,6 +14885,14 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h lin
+ */
+};
+
++struct mmal_parameter_fps_range {
++ /**< Low end of the permitted framerate range */
++ struct mmal_parameter_rational fps_low;
++ /**< High end of the permitted framerate range */
++ struct mmal_parameter_rational fps_high;
++};
++
++
+/* camera configuration parameter */
+struct mmal_parameter_camera_config {
+ /* Parameters for setting up the image pools */
@@ -14534,6 +15004,85 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h lin
+ MMAL_VIDEO_RATECONTROL_CONSTANT_SKIP_FRAMES
+};
+
++enum mmal_video_profile {
++ MMAL_VIDEO_PROFILE_H263_BASELINE,
++ MMAL_VIDEO_PROFILE_H263_H320CODING,
++ MMAL_VIDEO_PROFILE_H263_BACKWARDCOMPATIBLE,
++ MMAL_VIDEO_PROFILE_H263_ISWV2,
++ MMAL_VIDEO_PROFILE_H263_ISWV3,
++ MMAL_VIDEO_PROFILE_H263_HIGHCOMPRESSION,
++ MMAL_VIDEO_PROFILE_H263_INTERNET,
++ MMAL_VIDEO_PROFILE_H263_INTERLACE,
++ MMAL_VIDEO_PROFILE_H263_HIGHLATENCY,
++ MMAL_VIDEO_PROFILE_MP4V_SIMPLE,
++ MMAL_VIDEO_PROFILE_MP4V_SIMPLESCALABLE,
++ MMAL_VIDEO_PROFILE_MP4V_CORE,
++ MMAL_VIDEO_PROFILE_MP4V_MAIN,
++ MMAL_VIDEO_PROFILE_MP4V_NBIT,
++ MMAL_VIDEO_PROFILE_MP4V_SCALABLETEXTURE,
++ MMAL_VIDEO_PROFILE_MP4V_SIMPLEFACE,
++ MMAL_VIDEO_PROFILE_MP4V_SIMPLEFBA,
++ MMAL_VIDEO_PROFILE_MP4V_BASICANIMATED,
++ MMAL_VIDEO_PROFILE_MP4V_HYBRID,
++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDREALTIME,
++ MMAL_VIDEO_PROFILE_MP4V_CORESCALABLE,
++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCODING,
++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCORE,
++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSCALABLE,
++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSIMPLE,
++ MMAL_VIDEO_PROFILE_H264_BASELINE,
++ MMAL_VIDEO_PROFILE_H264_MAIN,
++ MMAL_VIDEO_PROFILE_H264_EXTENDED,
++ MMAL_VIDEO_PROFILE_H264_HIGH,
++ MMAL_VIDEO_PROFILE_H264_HIGH10,
++ MMAL_VIDEO_PROFILE_H264_HIGH422,
++ MMAL_VIDEO_PROFILE_H264_HIGH444,
++ MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE,
++ MMAL_VIDEO_PROFILE_DUMMY = 0x7FFFFFFF
++};
++
++enum mmal_video_level {
++ MMAL_VIDEO_LEVEL_H263_10,
++ MMAL_VIDEO_LEVEL_H263_20,
++ MMAL_VIDEO_LEVEL_H263_30,
++ MMAL_VIDEO_LEVEL_H263_40,
++ MMAL_VIDEO_LEVEL_H263_45,
++ MMAL_VIDEO_LEVEL_H263_50,
++ MMAL_VIDEO_LEVEL_H263_60,
++ MMAL_VIDEO_LEVEL_H263_70,
++ MMAL_VIDEO_LEVEL_MP4V_0,
++ MMAL_VIDEO_LEVEL_MP4V_0b,
++ MMAL_VIDEO_LEVEL_MP4V_1,
++ MMAL_VIDEO_LEVEL_MP4V_2,
++ MMAL_VIDEO_LEVEL_MP4V_3,
++ MMAL_VIDEO_LEVEL_MP4V_4,
++ MMAL_VIDEO_LEVEL_MP4V_4a,
++ MMAL_VIDEO_LEVEL_MP4V_5,
++ MMAL_VIDEO_LEVEL_MP4V_6,
++ MMAL_VIDEO_LEVEL_H264_1,
++ MMAL_VIDEO_LEVEL_H264_1b,
++ MMAL_VIDEO_LEVEL_H264_11,
++ MMAL_VIDEO_LEVEL_H264_12,
++ MMAL_VIDEO_LEVEL_H264_13,
++ MMAL_VIDEO_LEVEL_H264_2,
++ MMAL_VIDEO_LEVEL_H264_21,
++ MMAL_VIDEO_LEVEL_H264_22,
++ MMAL_VIDEO_LEVEL_H264_3,
++ MMAL_VIDEO_LEVEL_H264_31,
++ MMAL_VIDEO_LEVEL_H264_32,
++ MMAL_VIDEO_LEVEL_H264_4,
++ MMAL_VIDEO_LEVEL_H264_41,
++ MMAL_VIDEO_LEVEL_H264_42,
++ MMAL_VIDEO_LEVEL_H264_5,
++ MMAL_VIDEO_LEVEL_H264_51,
++ MMAL_VIDEO_LEVEL_DUMMY = 0x7FFFFFFF
++};
++
++struct mmal_parameter_video_profile {
++ enum mmal_video_profile profile;
++ enum mmal_video_level level;
++};
++
+/* video parameters */
+
+enum mmal_parameter_video_type {
@@ -14801,9 +15350,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h lin
+ u32 num_effect_params;
+ u32 effect_parameter[MMAL_MAX_IMAGEFX_PARAMETERS];
+};
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.c linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.c
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.c linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-vchiq.c
+--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-vchiq.c 2014-03-11 16:54:57.000000000 +0100
@@ -0,0 +1,1916 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -16133,7 +16682,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.c linux-3.
+ memcpy(value, &rmsg->u.port_parameter_get_reply.value,
+ rmsg->u.port_parameter_get_reply.size);
+
-+ pr_info("%s:result:%d component:0x%x port:%d parameter:%d\n", __func__,
++ pr_debug("%s:result:%d component:0x%x port:%d parameter:%d\n", __func__,
+ ret, port->component->handle, port->handle, parameter_id);
+
+release_msg:
@@ -16721,9 +17270,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.c linux-3.
+ kfree(instance);
+ return -ENODEV;
+}
-diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.h
---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-vchiq.h
+--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-vchiq.h 2014-03-11 16:52:42.000000000 +0100
@@ -0,0 +1,178 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -16903,9 +17452,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.h linux-3.
+ struct mmal_buffer *buf);
+
+#endif /* MMAL_VCHIQ_H */
-diff -Nur linux-3.13.6.orig/drivers/media/platform/Kconfig linux-3.13.6/drivers/media/platform/Kconfig
---- linux-3.13.6.orig/drivers/media/platform/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/Kconfig linux-raspberry-pi/drivers/media/platform/Kconfig
+--- linux-3.13.6/drivers/media/platform/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/Kconfig 2014-03-11 16:54:57.000000000 +0100
@@ -124,6 +124,7 @@
source "drivers/media/platform/soc_camera/Kconfig"
source "drivers/media/platform/exynos4-is/Kconfig"
@@ -16914,9 +17463,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/Kconfig linux-3.13.6/drivers/
endif # V4L_PLATFORM_DRIVERS
-diff -Nur linux-3.13.6.orig/drivers/media/platform/Makefile linux-3.13.6/drivers/media/platform/Makefile
---- linux-3.13.6.orig/drivers/media/platform/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/media/platform/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/platform/Makefile linux-raspberry-pi/drivers/media/platform/Makefile
+--- linux-3.13.6/drivers/media/platform/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/media/platform/Makefile 2014-03-11 16:54:57.000000000 +0100
@@ -54,4 +54,6 @@
obj-$(CONFIG_ARCH_OMAP) += omap/
@@ -16924,9 +17473,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/Makefile linux-3.13.6/drivers
+obj-$(CONFIG_VIDEO_BCM2835) += bcm2835/
+
ccflags-y += -I$(srctree)/drivers/media/i2c
-diff -Nur linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/az6007.c linux-3.13.6/drivers/media/usb/dvb-usb-v2/az6007.c
---- linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/az6007.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/media/usb/dvb-usb-v2/az6007.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/usb/dvb-usb-v2/az6007.c linux-raspberry-pi/drivers/media/usb/dvb-usb-v2/az6007.c
+--- linux-3.13.6/drivers/media/usb/dvb-usb-v2/az6007.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/media/usb/dvb-usb-v2/az6007.c 2014-03-11 16:52:43.000000000 +0100
@@ -68,6 +68,19 @@
.microcode_name = "dvb-usb-terratec-h7-drxk.fw",
};
@@ -17014,9 +17563,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/az6007.c linux-3.13.6/d
{0},
};
-diff -Nur linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-3.13.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
---- linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-raspberry-pi/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
+--- linux-3.13.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-03-11 16:54:57.000000000 +0100
@@ -1423,6 +1423,10 @@
&rtl2832u_props, "Compro VideoMate U620F", NULL) },
{ DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394,
@@ -17028,9 +17577,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-3.13.6
{ DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a03,
&rtl2832u_props, "Leadtek WinFast DTV Dongle mini", NULL) },
{ DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_CPYTO_REDI_PC50A,
-diff -Nur linux-3.13.6.orig/drivers/misc/Kconfig linux-3.13.6/drivers/misc/Kconfig
---- linux-3.13.6.orig/drivers/misc/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/misc/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/Kconfig linux-raspberry-pi/drivers/misc/Kconfig
+--- linux-3.13.6/drivers/misc/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/Kconfig 2014-03-11 16:54:57.000000000 +0100
@@ -524,5 +524,6 @@
source "drivers/misc/altera-stapl/Kconfig"
source "drivers/misc/mei/Kconfig"
@@ -17038,18 +17587,18 @@ diff -Nur linux-3.13.6.orig/drivers/misc/Kconfig linux-3.13.6/drivers/misc/Kconf
+source "drivers/misc/vc04_services/Kconfig"
source "drivers/misc/mic/Kconfig"
endmenu
-diff -Nur linux-3.13.6.orig/drivers/misc/Makefile linux-3.13.6/drivers/misc/Makefile
---- linux-3.13.6.orig/drivers/misc/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/misc/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/Makefile linux-raspberry-pi/drivers/misc/Makefile
+--- linux-3.13.6/drivers/misc/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/Makefile 2014-03-11 16:54:57.000000000 +0100
@@ -52,4 +52,5 @@
obj-$(CONFIG_VMWARE_VMCI) += vmw_vmci/
obj-$(CONFIG_LATTICE_ECP3_CONFIG) += lattice-ecp3-config.o
obj-$(CONFIG_SRAM) += sram.o
+obj-$(CONFIG_BCM2708_VCHIQ) += vc04_services/
obj-y += mic/
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/connections/connection.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,328 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -17379,9 +17928,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/connection
+#endif /* CONNECTION_H_ */
+
+/****************************** End of file **********************************/
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -17587,9 +18136,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/message_dr
+#endif // _VCHI_MESSAGE_H_
+
+/****************************** End of file ***********************************/
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,224 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -17815,9 +18364,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h
+#endif /* VCHI_CFG_H_ */
+
+/****************************** End of file **********************************/
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -17890,9 +18439,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg_i
+//#define VCHI_RX_NANOLOCKS
+
+#endif /*VCHI_CFG_INTERNAL_H_*/
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_common.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -18057,9 +18606,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_commo
+
+
+#endif // VCHI_COMMON_H_
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,373 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -18434,9 +18983,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi.h lin
+#endif /* VCHI_H_ */
+
+/****************************** End of file **********************************/
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_mh.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -18480,9 +19029,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_mh.h
+#define VCHI_MEM_HANDLE_INVALID 0
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,561 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -19045,9 +19594,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+
+ kfree(pagelist);
+}
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -19091,9 +19640,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+#define VCHIQ_PLATFORM_FRAGMENTS_COUNT_IDX 1
+
+#endif /* VCHIQ_2835_H */
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2014-03-11 16:54:58.000000000 +0100
@@ -0,0 +1,2813 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -21908,9 +22457,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+module_exit(vchiq_exit);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Broadcom Corporation");
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22124,9 +22673,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+
+
+#endif /* VCHIQ_ARM_H */
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22165,9 +22714,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+const char *vchiq_get_build_version(void);
+const char *vchiq_get_build_time(void);
+const char *vchiq_get_build_date(void);
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22229,9 +22778,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+#endif
+
+#endif /* VCHIQ_CFG_H */
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22352,9 +22901,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ mutex_unlock(&g_connected_mutex);
+}
+EXPORT_SYMBOL(vchiq_add_connected_callback);
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2014-03-11 16:54:58.000000000 +0100
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22406,9 +22955,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+void vchiq_call_connected_callbacks(void);
+
+#endif /* VCHIQ_CONNECTED_H */
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,3824 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -26234,9 +26783,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ numBytes = 0;
+ }
+}
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,706 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -26944,9 +27493,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ size_t numBytes);
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 2014-03-11 16:54:58.000000000 +0100
@@ -0,0 +1,87 @@
+#!/usr/bin/perl -w
+
@@ -27035,9 +27584,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ return vchiq_build_time;
+}
+EOF
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2014-03-11 16:54:58.000000000 +0100
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27079,9 +27628,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+#include "vchiq_util.h"
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27271,9 +27820,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ short *peer_version);
+
+#endif /* VCHIQ_IF_H */
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27404,9 +27953,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+#define VCHIQ_IOC_MAX 15
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,456 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27864,9 +28413,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+
+ return status;
+}
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27939,9 +28488,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ const VCHIQ_PLATFORM_DATA_T * platform_data);
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -28001,9 +28550,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+} FRAGMENTS_T;
+
+#endif /* VCHIQ_PAGELIST_H */
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 2014-03-11 16:54:58.000000000 +0100
@@ -0,0 +1,253 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -28258,9 +28807,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+}
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,828 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -29090,9 +29639,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ return ret;
+}
+EXPORT_SYMBOL(vchi_service_release);
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -29245,9 +29794,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+
+ return header;
+}
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2014-03-11 16:54:58.000000000 +0100
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -29330,9 +29879,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+extern VCHIQ_HEADER_T *vchiu_queue_pop(VCHIU_QUEUE_T *queue);
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c
---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c
+--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 2014-03-11 16:52:43.000000000 +0100
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -29393,9 +29942,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+{
+ return vchiq_build_time;
+}
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/Kconfig linux-3.13.6/drivers/misc/vc04_services/Kconfig
---- linux-3.13.6.orig/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/Kconfig linux-raspberry-pi/drivers/misc/vc04_services/Kconfig
+--- linux-3.13.6/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/Kconfig 2014-03-11 16:54:58.000000000 +0100
@@ -0,0 +1,9 @@
+config BCM2708_VCHIQ
+ tristate "Videocore VCHIQ"
@@ -29406,9 +29955,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/Kconfig linux-3.13.6/driv
+ BCM2708 family of products.
+ Defaults to Y when the Broadcom Videocore services
+ are included in the build, N otherwise.
-diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/Makefile linux-3.13.6/drivers/misc/vc04_services/Makefile
---- linux-3.13.6.orig/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/misc/vc04_services/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/misc/vc04_services/Makefile linux-raspberry-pi/drivers/misc/vc04_services/Makefile
+--- linux-3.13.6/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/misc/vc04_services/Makefile 2014-03-11 16:54:58.000000000 +0100
@@ -0,0 +1,17 @@
+ifeq ($(CONFIG_MACH_BCM2708),y)
+
@@ -29427,9 +29976,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/Makefile linux-3.13.6/dri
+EXTRA_CFLAGS += -DVCOS_VERIFY_BKPTS=1 -Idrivers/misc/vc04_services -DUSE_VCHIQ_ARM -D__VCCOREVER__=0x04000000
+
+endif
-diff -Nur linux-3.13.6.orig/drivers/mmc/card/block.c linux-3.13.6/drivers/mmc/card/block.c
---- linux-3.13.6.orig/drivers/mmc/card/block.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/mmc/card/block.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/mmc/card/block.c linux-raspberry-pi/drivers/mmc/card/block.c
+--- linux-3.13.6/drivers/mmc/card/block.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/mmc/card/block.c 2014-03-11 16:54:58.000000000 +0100
@@ -1361,7 +1361,7 @@
brq->data.blocks = 1;
}
@@ -29439,9 +29988,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/card/block.c linux-3.13.6/drivers/mmc/ca
/* SPI multiblock writes terminate using a special
* token, not a STOP_TRANSMISSION request.
*/
-diff -Nur linux-3.13.6.orig/drivers/mmc/core/sd.c linux-3.13.6/drivers/mmc/core/sd.c
---- linux-3.13.6.orig/drivers/mmc/core/sd.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/mmc/core/sd.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/mmc/core/sd.c linux-raspberry-pi/drivers/mmc/core/sd.c
+--- linux-3.13.6/drivers/mmc/core/sd.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/mmc/core/sd.c 2014-03-11 16:54:58.000000000 +0100
@@ -15,6 +15,8 @@
#include <linux/slab.h>
#include <linux/stat.h>
@@ -29596,9 +30145,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/core/sd.c linux-3.13.6/drivers/mmc/core/
return err;
/*
-diff -Nur linux-3.13.6.orig/drivers/mmc/host/Kconfig linux-3.13.6/drivers/mmc/host/Kconfig
---- linux-3.13.6.orig/drivers/mmc/host/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/mmc/host/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/mmc/host/Kconfig linux-raspberry-pi/drivers/mmc/host/Kconfig
+--- linux-3.13.6/drivers/mmc/host/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/mmc/host/Kconfig 2014-03-11 16:54:58.000000000 +0100
@@ -260,6 +260,27 @@
If you have a controller with this interface, say Y or M here.
@@ -29627,9 +30176,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/Kconfig linux-3.13.6/drivers/mmc/ho
config MMC_SDHCI_BCM2835
tristate "SDHCI platform support for the BCM2835 SD/MMC Controller"
depends on ARCH_BCM2835
-diff -Nur linux-3.13.6.orig/drivers/mmc/host/Makefile linux-3.13.6/drivers/mmc/host/Makefile
---- linux-3.13.6.orig/drivers/mmc/host/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/mmc/host/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/mmc/host/Makefile linux-raspberry-pi/drivers/mmc/host/Makefile
+--- linux-3.13.6/drivers/mmc/host/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/mmc/host/Makefile 2014-03-11 16:54:58.000000000 +0100
@@ -15,6 +15,7 @@
obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o
obj-$(CONFIG_MMC_SDHCI_SIRF) += sdhci-sirf.o
@@ -29638,9 +30187,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/Makefile linux-3.13.6/drivers/mmc/h
obj-$(CONFIG_MMC_WBSD) += wbsd.o
obj-$(CONFIG_MMC_AU1X) += au1xmmc.o
obj-$(CONFIG_MMC_OMAP) += omap.o
-diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci-bcm2708.c linux-3.13.6/drivers/mmc/host/sdhci-bcm2708.c
---- linux-3.13.6.orig/drivers/mmc/host/sdhci-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/mmc/host/sdhci-bcm2708.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/mmc/host/sdhci-bcm2708.c linux-raspberry-pi/drivers/mmc/host/sdhci-bcm2708.c
+--- linux-3.13.6/drivers/mmc/host/sdhci-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/mmc/host/sdhci-bcm2708.c 2014-03-11 16:54:58.000000000 +0100
@@ -0,0 +1,1410 @@
+/*
+ * sdhci-bcm2708.c Support for SDHCI device on BCM2708
@@ -31052,9 +31601,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci-bcm2708.c linux-3.13.6/driver
+MODULE_PARM_DESC(extra_messages, "Enable more sdcard warning messages");
+
+
-diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci.c linux-3.13.6/drivers/mmc/host/sdhci.c
---- linux-3.13.6.orig/drivers/mmc/host/sdhci.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/mmc/host/sdhci.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/mmc/host/sdhci.c linux-raspberry-pi/drivers/mmc/host/sdhci.c
+--- linux-3.13.6/drivers/mmc/host/sdhci.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/mmc/host/sdhci.c 2014-03-11 16:54:58.000000000 +0100
@@ -28,6 +28,7 @@
#include <linux/mmc/mmc.h>
#include <linux/mmc/host.h>
@@ -31896,21 +32445,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci.c linux-3.13.6/drivers/mmc/ho
}
sdhci_disable_card_detection(host);
-diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci-esdhc-imx.c linux-3.13.6/drivers/mmc/host/sdhci-esdhc-imx.c
---- linux-3.13.6.orig/drivers/mmc/host/sdhci-esdhc-imx.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/mmc/host/sdhci-esdhc-imx.c 2014-03-10 14:41:55.000000000 +0100
-@@ -112,6 +112,8 @@
- /* The IP has SDHCI_CAPABILITIES_1 register */
- #define ESDHC_FLAG_HAVE_CAP1 BIT(6)
-
-+bool enable_llm = 0;
-+
- struct esdhc_soc_data {
- u32 flags;
- };
-diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci.h linux-3.13.6/drivers/mmc/host/sdhci.h
---- linux-3.13.6.orig/drivers/mmc/host/sdhci.h 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/mmc/host/sdhci.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/mmc/host/sdhci.h linux-raspberry-pi/drivers/mmc/host/sdhci.h
+--- linux-3.13.6/drivers/mmc/host/sdhci.h 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/mmc/host/sdhci.h 2014-03-11 16:54:58.000000000 +0100
@@ -290,6 +290,18 @@
void (*platform_reset_exit)(struct sdhci_host *host, u8 mask);
int (*platform_execute_tuning)(struct sdhci_host *host, u32 opcode);
@@ -31969,9 +32506,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci.h linux-3.13.6/drivers/mmc/ho
+
+
#endif /* __SDHCI_HW_H */
-diff -Nur linux-3.13.6.orig/drivers/net/usb/smsc95xx.c linux-3.13.6/drivers/net/usb/smsc95xx.c
---- linux-3.13.6.orig/drivers/net/usb/smsc95xx.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/net/usb/smsc95xx.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/net/usb/smsc95xx.c linux-raspberry-pi/drivers/net/usb/smsc95xx.c
+--- linux-3.13.6/drivers/net/usb/smsc95xx.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/net/usb/smsc95xx.c 2014-03-11 16:52:52.000000000 +0100
@@ -61,6 +61,7 @@
#define SUSPEND_SUSPEND3 (0x08)
#define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \
@@ -32051,9 +32588,9 @@ diff -Nur linux-3.13.6.orig/drivers/net/usb/smsc95xx.c linux-3.13.6/drivers/net/
/* try reading mac address from EEPROM */
if (smsc95xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
dev->net->dev_addr) == 0) {
-diff -Nur linux-3.13.6.orig/drivers/spi/Kconfig linux-3.13.6/drivers/spi/Kconfig
---- linux-3.13.6.orig/drivers/spi/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/spi/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/spi/Kconfig linux-raspberry-pi/drivers/spi/Kconfig
+--- linux-3.13.6/drivers/spi/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/spi/Kconfig 2014-03-11 16:55:26.000000000 +0100
@@ -85,6 +85,14 @@
is for the regular SPI controller. Slave mode operation is not also
not supported.
@@ -32069,9 +32606,9 @@ diff -Nur linux-3.13.6.orig/drivers/spi/Kconfig linux-3.13.6/drivers/spi/Kconfig
config SPI_BFIN5XX
tristate "SPI controller driver for ADI Blackfin5xx"
depends on BLACKFIN && !BF60x
-diff -Nur linux-3.13.6.orig/drivers/spi/Makefile linux-3.13.6/drivers/spi/Makefile
---- linux-3.13.6.orig/drivers/spi/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/spi/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/spi/Makefile linux-raspberry-pi/drivers/spi/Makefile
+--- linux-3.13.6/drivers/spi/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/spi/Makefile 2014-03-11 16:55:26.000000000 +0100
@@ -18,6 +18,7 @@
obj-$(CONFIG_SPI_BCM63XX) += spi-bcm63xx.o
obj-$(CONFIG_SPI_BFIN5XX) += spi-bfin5xx.o
@@ -32080,9 +32617,9 @@ diff -Nur linux-3.13.6.orig/drivers/spi/Makefile linux-3.13.6/drivers/spi/Makefi
obj-$(CONFIG_SPI_BFIN_SPORT) += spi-bfin-sport.o
obj-$(CONFIG_SPI_BITBANG) += spi-bitbang.o
obj-$(CONFIG_SPI_BUTTERFLY) += spi-butterfly.o
-diff -Nur linux-3.13.6.orig/drivers/spi/spi-bcm2708.c linux-3.13.6/drivers/spi/spi-bcm2708.c
---- linux-3.13.6.orig/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/spi/spi-bcm2708.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/spi/spi-bcm2708.c linux-raspberry-pi/drivers/spi/spi-bcm2708.c
+--- linux-3.13.6/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/spi/spi-bcm2708.c 2014-03-11 16:55:26.000000000 +0100
@@ -0,0 +1,626 @@
+/*
+ * Driver for Broadcom BCM2708 SPI Controllers
@@ -32710,9 +33247,9 @@ diff -Nur linux-3.13.6.orig/drivers/spi/spi-bcm2708.c linux-3.13.6/drivers/spi/s
+MODULE_AUTHOR("Chris Boot <bootc@bootc.net>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRV_NAME);
-diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/Kconfig linux-3.13.6/drivers/staging/media/lirc/Kconfig
---- linux-3.13.6.orig/drivers/staging/media/lirc/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/staging/media/lirc/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/staging/media/lirc/Kconfig linux-raspberry-pi/drivers/staging/media/lirc/Kconfig
+--- linux-3.13.6/drivers/staging/media/lirc/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/staging/media/lirc/Kconfig 2014-03-11 16:53:00.000000000 +0100
@@ -38,6 +38,12 @@
help
Driver for Homebrew Parallel Port Receivers
@@ -32726,9 +33263,9 @@ diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/Kconfig linux-3.13.6/driv
config LIRC_SASEM
tristate "Sasem USB IR Remote"
depends on LIRC && USB
-diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/lirc_rpi.c linux-3.13.6/drivers/staging/media/lirc/lirc_rpi.c
---- linux-3.13.6.orig/drivers/staging/media/lirc/lirc_rpi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/staging/media/lirc/lirc_rpi.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/staging/media/lirc/lirc_rpi.c linux-raspberry-pi/drivers/staging/media/lirc/lirc_rpi.c
+--- linux-3.13.6/drivers/staging/media/lirc/lirc_rpi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/staging/media/lirc/lirc_rpi.c 2014-03-11 16:53:00.000000000 +0100
@@ -0,0 +1,693 @@
+/*
+ * lirc_rpi.c
@@ -33423,9 +33960,9 @@ diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/lirc_rpi.c linux-3.13.6/d
+
+module_param(debug, bool, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(debug, "Enable debugging messages");
-diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/Makefile linux-3.13.6/drivers/staging/media/lirc/Makefile
---- linux-3.13.6.orig/drivers/staging/media/lirc/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/staging/media/lirc/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/staging/media/lirc/Makefile linux-raspberry-pi/drivers/staging/media/lirc/Makefile
+--- linux-3.13.6/drivers/staging/media/lirc/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/staging/media/lirc/Makefile 2014-03-11 16:53:00.000000000 +0100
@@ -7,6 +7,7 @@
obj-$(CONFIG_LIRC_IGORPLUGUSB) += lirc_igorplugusb.o
obj-$(CONFIG_LIRC_IMON) += lirc_imon.o
@@ -33434,9 +33971,9 @@ diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/Makefile linux-3.13.6/dri
obj-$(CONFIG_LIRC_SASEM) += lirc_sasem.o
obj-$(CONFIG_LIRC_SERIAL) += lirc_serial.o
obj-$(CONFIG_LIRC_SIR) += lirc_sir.o
-diff -Nur linux-3.13.6.orig/drivers/thermal/bcm2835-thermal.c linux-3.13.6/drivers/thermal/bcm2835-thermal.c
---- linux-3.13.6.orig/drivers/thermal/bcm2835-thermal.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/thermal/bcm2835-thermal.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/thermal/bcm2835-thermal.c linux-raspberry-pi/drivers/thermal/bcm2835-thermal.c
+--- linux-3.13.6/drivers/thermal/bcm2835-thermal.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/thermal/bcm2835-thermal.c 2014-03-11 16:53:09.000000000 +0100
@@ -0,0 +1,184 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -33622,9 +34159,9 @@ diff -Nur linux-3.13.6.orig/drivers/thermal/bcm2835-thermal.c linux-3.13.6/drive
+MODULE_DESCRIPTION("Thermal driver for bcm2835 chip");
+
+module_platform_driver(bcm2835_thermal_driver);
-diff -Nur linux-3.13.6.orig/drivers/thermal/Kconfig linux-3.13.6/drivers/thermal/Kconfig
---- linux-3.13.6.orig/drivers/thermal/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/thermal/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/thermal/Kconfig linux-raspberry-pi/drivers/thermal/Kconfig
+--- linux-3.13.6/drivers/thermal/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/thermal/Kconfig 2014-03-11 16:55:36.000000000 +0100
@@ -181,6 +181,12 @@
enforce idle time which results in more package C-state residency. The
user interface is exposed via generic thermal framework.
@@ -33638,9 +34175,9 @@ diff -Nur linux-3.13.6.orig/drivers/thermal/Kconfig linux-3.13.6/drivers/thermal
config X86_PKG_TEMP_THERMAL
tristate "X86 package temperature thermal driver"
depends on X86_THERMAL_VECTOR
-diff -Nur linux-3.13.6.orig/drivers/thermal/Makefile linux-3.13.6/drivers/thermal/Makefile
---- linux-3.13.6.orig/drivers/thermal/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/thermal/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/thermal/Makefile linux-raspberry-pi/drivers/thermal/Makefile
+--- linux-3.13.6/drivers/thermal/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/thermal/Makefile 2014-03-11 16:55:36.000000000 +0100
@@ -27,5 +27,6 @@
obj-$(CONFIG_IMX_THERMAL) += imx_thermal.o
obj-$(CONFIG_DB8500_CPUFREQ_COOLING) += db8500_cpufreq_cooling.o
@@ -33648,9 +34185,9 @@ diff -Nur linux-3.13.6.orig/drivers/thermal/Makefile linux-3.13.6/drivers/therma
+obj-$(CONFIG_THERMAL_BCM2835) += bcm2835-thermal.o
obj-$(CONFIG_X86_PKG_TEMP_THERMAL) += x86_pkg_temp_thermal.o
obj-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/
-diff -Nur linux-3.13.6.orig/drivers/tty/serial/amba-pl011.c linux-3.13.6/drivers/tty/serial/amba-pl011.c
---- linux-3.13.6.orig/drivers/tty/serial/amba-pl011.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/tty/serial/amba-pl011.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/tty/serial/amba-pl011.c linux-raspberry-pi/drivers/tty/serial/amba-pl011.c
+--- linux-3.13.6/drivers/tty/serial/amba-pl011.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/tty/serial/amba-pl011.c 2014-03-11 16:55:36.000000000 +0100
@@ -84,7 +84,7 @@
static unsigned int get_fifosize_arm(struct amba_device *dev)
@@ -33660,9 +34197,9 @@ diff -Nur linux-3.13.6.orig/drivers/tty/serial/amba-pl011.c linux-3.13.6/drivers
}
static struct vendor_data vendor_arm = {
-diff -Nur linux-3.13.6.orig/drivers/usb/core/generic.c linux-3.13.6/drivers/usb/core/generic.c
---- linux-3.13.6.orig/drivers/usb/core/generic.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/usb/core/generic.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/core/generic.c linux-raspberry-pi/drivers/usb/core/generic.c
+--- linux-3.13.6/drivers/usb/core/generic.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/core/generic.c 2014-03-11 16:53:09.000000000 +0100
@@ -152,6 +152,7 @@
dev_warn(&udev->dev,
"no configuration chosen from %d choice%s\n",
@@ -33671,9 +34208,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/core/generic.c linux-3.13.6/drivers/usb/
}
return i;
}
-diff -Nur linux-3.13.6.orig/drivers/usb/core/message.c linux-3.13.6/drivers/usb/core/message.c
---- linux-3.13.6.orig/drivers/usb/core/message.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/usb/core/message.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/core/message.c linux-raspberry-pi/drivers/usb/core/message.c
+--- linux-3.13.6/drivers/usb/core/message.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/core/message.c 2014-03-11 16:55:37.000000000 +0100
@@ -1889,6 +1889,85 @@
if (cp->string == NULL &&
!(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
@@ -33760,9 +34297,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/core/message.c linux-3.13.6/drivers/usb/
/* Now that the interfaces are installed, re-enable LPM. */
usb_unlocked_enable_lpm(dev);
-diff -Nur linux-3.13.6.orig/drivers/usb/core/otg_whitelist.h linux-3.13.6/drivers/usb/core/otg_whitelist.h
---- linux-3.13.6.orig/drivers/usb/core/otg_whitelist.h 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/usb/core/otg_whitelist.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/core/otg_whitelist.h linux-raspberry-pi/drivers/usb/core/otg_whitelist.h
+--- linux-3.13.6/drivers/usb/core/otg_whitelist.h 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/core/otg_whitelist.h 2014-03-11 16:55:37.000000000 +0100
@@ -19,33 +19,82 @@
static struct usb_device_id whitelist_table [] = {
@@ -33978,9 +34515,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/core/otg_whitelist.h linux-3.13.6/driver
#endif
}
-diff -Nur linux-3.13.6.orig/drivers/usb/gadget/file_storage.c linux-3.13.6/drivers/usb/gadget/file_storage.c
---- linux-3.13.6.orig/drivers/usb/gadget/file_storage.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/gadget/file_storage.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/gadget/file_storage.c linux-raspberry-pi/drivers/usb/gadget/file_storage.c
+--- linux-3.13.6/drivers/usb/gadget/file_storage.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/gadget/file_storage.c 2014-03-11 16:53:10.000000000 +0100
@@ -0,0 +1,3676 @@
+/*
+ * file_storage.c -- File-backed USB Storage Gadget, for USB development
@@ -37658,9 +38195,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/gadget/file_storage.c linux-3.13.6/drive
+ kref_put(&fsg->ref, fsg_release);
+}
+module_exit(fsg_cleanup);
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/changes.txt linux-3.13.6/drivers/usb/host/dwc_common_port/changes.txt
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/changes.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/changes.txt 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/changes.txt linux-raspberry-pi/drivers/usb/host/dwc_common_port/changes.txt
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/changes.txt 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/changes.txt 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,174 @@
+
+dwc_read_reg32() and friends now take an additional parameter, a pointer to an
@@ -37836,9 +38373,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/changes.txt linux-3
+A DWC_LIBMODULE #define has also been added. If this is not defined, then the
+module code in dwc_common_linux.c is not compiled in. This allows linking the
+library code directly into a driver module, instead of as a standalone module.
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-3.13.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-raspberry-pi/drivers/usb/host/dwc_common_port/doc/doxygen.cfg
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,270 @@
+# Doxyfile 1.4.5
+
@@ -38110,9 +38647,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/doc/doxygen.cfg lin
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_cc.c
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_cc.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,532 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.c $
@@ -38646,9 +39183,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.c linux-3.13
+}
+
+#endif /* DWC_CCLIB */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_cc.h
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_cc.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,224 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.h $
@@ -38874,9 +39411,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.h linux-3.13
+#endif
+
+#endif /* _DWC_CC_H_ */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,1308 @@
+#include "dwc_os.h"
+#include "dwc_list.h"
@@ -40186,9 +40723,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c l
+{
+ return wq->pending;
+}
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_linux.c
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,1431 @@
+#include <linux/kernel.h>
+#include <linux/init.h>
@@ -41621,9 +42158,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_linux.c
+MODULE_LICENSE ("GPL");
+
+#endif /* DWC_LIBMODULE */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,1275 @@
+#include "dwc_os.h"
+#include "dwc_list.h"
@@ -42900,9 +43437,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c l
+{
+ return wq->pending;
+}
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_crypto.c
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_crypto.c 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,308 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.c $
@@ -43212,9 +43749,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-
+}
+
+#endif /* DWC_CRYPTOLIB */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_crypto.h
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_crypto.h 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,111 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.h $
@@ -43327,9 +43864,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-
+#endif
+
+#endif /* _DWC_CRYPTO_H_ */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_dh.c
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_dh.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,291 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.c $
@@ -43622,9 +44159,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.c linux-3.13
+#endif /* !CONFIG_MACH_IPMATE */
+
+#endif /* DWC_CRYPTOLIB */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_dh.h
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_dh.h 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,106 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.h $
@@ -43732,9 +44269,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.h linux-3.13
+#endif
+
+#endif /* _DWC_DH_H_ */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_list.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_list.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_list.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_list.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_list.h
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_list.h 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,594 @@
+/* $OpenBSD: queue.h,v 1.26 2004/05/04 16:59:32 grange Exp $ */
+/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */
@@ -44330,9 +44867,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_list.h linux-3.
+#endif
+
+#endif /* _DWC_LIST_H_ */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_mem.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_mem.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_mem.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_mem.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_mem.c
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_mem.c 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,245 @@
+/* Memory Debugging */
+#ifdef DWC_DEBUG_MEMORY
@@ -44579,9 +45116,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_mem.c linux-3.1
+}
+
+#endif /* DWC_DEBUG_MEMORY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_modpow.c
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_modpow.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,636 @@
+/* Bignum routines adapted from PUTTY sources. PuTTY copyright notice follows.
+ *
@@ -45219,9 +45756,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-
+#endif /* CONFIG_MACH_IPMATE */
+
+#endif /*DWC_CRYPTOLIB */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_modpow.h
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_modpow.h 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,34 @@
+/*
+ * dwc_modpow.h
@@ -45257,9 +45794,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-
+#endif
+
+#endif /* _LINUX_BIGNUM_H */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_notifier.c
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_notifier.c 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,319 @@
+#ifdef DWC_NOTIFYLIB
+
@@ -45580,9 +46117,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.c linu
+}
+
+#endif /* DWC_NOTIFYLIB */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_notifier.h
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_notifier.h 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,122 @@
+
+#ifndef __DWC_NOTIFIER_H__
@@ -45706,9 +46243,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.h linu
+#endif
+
+#endif /* __DWC_NOTIFIER_H__ */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_os.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_os.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_os.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_os.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_os.h
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_os.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,1262 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_os.h $
@@ -46972,9 +47509,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_os.h linux-3.13
+#endif
+
+#endif /* _DWC_OS_H_ */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,58 @@
+#
+# Makefile for DWC_common library
@@ -47034,9 +47571,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile linux-3.13
+
+clean:
+ rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.fbsd
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.fbsd 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.fbsd 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile.fbsd
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.fbsd 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile.fbsd 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,17 @@
+CFLAGS += -I/sys/i386/compile/GENERIC -I/sys/i386/include -I/usr/include
+CFLAGS += -DDWC_FREEBSD
@@ -47055,9 +47592,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.fbsd linux
+ dwc_common_fbsd.c dwc_mem.c
+
+.include <bsd.kmod.mk>
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.linux linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.linux
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.linux 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.linux linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile.linux
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile.linux 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,49 @@
+#
+# Makefile for DWC_common library
@@ -47108,9 +47645,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.linux linu
+
+clean:
+ rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/usb.h linux-3.13.6/drivers/usb/host/dwc_common_port/usb.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_common_port/usb.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/usb.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/usb.h
+--- linux-3.13.6/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/usb.h 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,946 @@
+/*
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -48058,9 +48595,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/usb.h linux-3.13.6/
+#endif
+
+#endif /* _USB_H_ */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-3.13.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-raspberry-pi/drivers/usb/host/dwc_otg/doc/doxygen.cfg
+--- linux-3.13.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/doc/doxygen.cfg 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,224 @@
+# Doxyfile 1.3.9.1
+
@@ -48286,9 +48823,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-3.13.
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dummy_audio.c linux-3.13.6/drivers/usb/host/dwc_otg/dummy_audio.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dummy_audio.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dummy_audio.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dummy_audio.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dummy_audio.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,1575 @@
+/*
+ * zero.c -- Gadget Zero, for USB development
@@ -49865,9 +50402,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dummy_audio.c linux-3.13.6/
+ remove_proc_entry("isoc_test", NULL);
+}
+module_exit (cleanup);
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_cfi_common.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,142 @@
+/* ==========================================================================
+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
@@ -50011,9 +50548,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-3.13
+typedef struct cfi_string cfi_string_t;
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_adp.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_adp.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,854 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.c $
@@ -50869,9 +51406,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-3.13.6/
+#endif
+ return 1;
+}
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_adp.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_adp.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,80 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.h $
@@ -50953,9 +51490,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-3.13.6/
+extern int32_t dwc_otg_adp_handle_srp_intr(dwc_otg_core_if_t * core_if);
+
+#endif //__DWC_OTG_ADP_H__
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_attr.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,1210 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.c $
@@ -52167,9 +52704,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-3.13.6
+ device_remove_file(&dev->dev, &dev_attr_sleep_status);
+#endif
+}
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_attr.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,89 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.h $
@@ -52260,9 +52797,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-3.13.6
+#endif
+ );
+#endif
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cfi.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,1876 @@
+/* ==========================================================================
+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
@@ -54140,9 +54677,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-3.13.6/
+}
+
+#endif //DWC_UTE_CFI
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cfi.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,320 @@
+/* ==========================================================================
+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
@@ -54464,9 +55001,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-3.13.6/
+int cfi_setup(struct dwc_otg_pcd *pcd, struct cfi_usb_ctrlrequest *ctrl);
+
+#endif /* (__DWC_OTG_CFI_H__) */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,7151 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.c $
@@ -61619,9 +62156,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-3.13.6/
+ dwc_otg_pcd_start_srp_timer(core_if);
+ return;
+}
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,1464 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.h $
@@ -63087,9 +63624,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-3.13.6/
+//////////////////////////////////////////////////////////////////////
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,1588 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil_intr.c $
@@ -64679,9 +65216,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-3.
+
+ return retval;
+}
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_core_if.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,705 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_core_if.h $
@@ -65388,9 +65925,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-3.1
+/** @} */
+
+#endif /* __DWC_CORE_IF_H__ */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_dbg.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,117 @@
+/* ==========================================================================
+ *
@@ -65509,9 +66046,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-3.13.6/
+
+#endif /*DEBUG*/
+#endif
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_driver.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,1742 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.c $
@@ -67255,9 +67792,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-3.13
+ </td></tr>
+
+*/
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_driver.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,86 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.h $
@@ -67345,9 +67882,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-3.13
+#endif
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,3685 @@
+
+/* ==========================================================================
@@ -71034,9 +71571,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-3.13.6/
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,1132 @@
+/*==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_ddma.c $
@@ -72170,9 +72707,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-3.
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,851 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd.h $
@@ -73025,9 +73562,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-3.13.6/
+#endif
+#endif
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,417 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_if.h $
@@ -73446,9 +73983,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-3.13
+
+#endif /* __DWC_HCD_IF_H__ */
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,2741 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_intr.c $
@@ -76191,9 +76728,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-3.
+ return retval;
+}
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,972 @@
+
+/* ==========================================================================
@@ -77167,9 +77704,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-3
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,959 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_queue.c $
@@ -78130,9 +78667,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-3
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,113 @@
+#include "dwc_otg_regs.h"
+#include "dwc_otg_dbg.h"
@@ -78247,9 +78784,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-3.
+
+ return;
+}
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,48 @@
+#ifndef __DWC_OTG_MPHI_FIX_H__
+#define __DWC_OTG_MPHI_FIX_H__
@@ -78299,9 +78836,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-3.
+extern bool fiq_fix_enable, nak_holdoff_enable, fiq_split_enable;
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,188 @@
+#ifndef _DWC_OS_DEP_H_
+#define _DWC_OS_DEP_H_
@@ -78491,9 +79028,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-3.13
+
+
+#endif /* _DWC_OS_DEP_H_ */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,2708 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.c $
@@ -81203,9 +81740,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-3.13.6/
+}
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,266 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.h $
@@ -81473,9 +82010,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-3.13.6/
+extern void do_test_mode(void *data);
+#endif
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,360 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_if.h $
@@ -81837,9 +82374,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-3.13
+#endif /* __DWC_PCD_IF_H__ */
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,5147 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_intr.c $
@@ -86988,9 +87525,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-3.
+}
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,1358 @@
+ /* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_linux.c $
@@ -88350,9 +88887,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-3
+EXPORT_SYMBOL(usb_gadget_unregister_driver);
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_regs.h
+--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,2550 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_regs.h $
@@ -90904,9 +91441,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-3.13.6
+} gpwrdn_data_t;
+
+#endif
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/Makefile linux-3.13.6/drivers/usb/host/dwc_otg/Makefile
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/Makefile linux-raspberry-pi/drivers/usb/host/dwc_otg/Makefile
+--- linux-3.13.6/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/Makefile 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,81 @@
+#
+# Makefile for DWC_otg Highspeed USB controller driver
@@ -90989,9 +91526,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/Makefile linux-3.13.6/drive
+ rm -rf *.o *.ko .*cmd *.mod.c .tmp_versions Module.symvers
+
+endif
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-3.13.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-raspberry-pi/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm
+--- linux-3.13.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,337 @@
+package dwc_otg_test;
+
@@ -91330,9 +91867,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-
+);
+
+1;
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/Makefile linux-3.13.6/drivers/usb/host/dwc_otg/test/Makefile
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/test/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/test/Makefile linux-raspberry-pi/drivers/usb/host/dwc_otg/test/Makefile
+--- linux-3.13.6/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/test/Makefile 2014-03-11 16:53:12.000000000 +0100
@@ -0,0 +1,16 @@
+
+PERL=/usr/bin/perl
@@ -91350,9 +91887,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/Makefile linux-3.13.6/
+ else echo "=======> $$test, FAILED" ; \
+ fi \
+ done
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-3.13.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-raspberry-pi/drivers/usb/host/dwc_otg/test/test_mod_param.pl
+--- linux-3.13.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,133 @@
+#!/usr/bin/perl -w
+#
@@ -91487,9 +92024,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_mod_param.pl linu
+
+test_main();
+0;
-diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-3.13.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl
---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-raspberry-pi/drivers/usb/host/dwc_otg/test/test_sysfs.pl
+--- linux-3.13.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,193 @@
+#!/usr/bin/perl -w
+#
@@ -91684,9 +92221,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-3.
+
+test_main();
+0;
-diff -Nur linux-3.13.6.orig/drivers/usb/host/Kconfig linux-3.13.6/drivers/usb/host/Kconfig
---- linux-3.13.6.orig/drivers/usb/host/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/Kconfig linux-raspberry-pi/drivers/usb/host/Kconfig
+--- linux-3.13.6/drivers/usb/host/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/Kconfig 2014-03-11 16:55:38.000000000 +0100
@@ -689,6 +689,19 @@
To compile this driver a module, choose M here: the module
will be called "hwa-hc".
@@ -91707,9 +92244,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/Kconfig linux-3.13.6/drivers/usb/ho
config USB_IMX21_HCD
tristate "i.MX21 HCD support"
depends on ARM && ARCH_MXC
-diff -Nur linux-3.13.6.orig/drivers/usb/host/Makefile linux-3.13.6/drivers/usb/host/Makefile
---- linux-3.13.6.orig/drivers/usb/host/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/usb/host/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/host/Makefile linux-raspberry-pi/drivers/usb/host/Makefile
+--- linux-3.13.6/drivers/usb/host/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/host/Makefile 2014-03-11 16:55:38.000000000 +0100
@@ -65,6 +65,8 @@
obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o
obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o
@@ -91719,9 +92256,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/Makefile linux-3.13.6/drivers/usb/h
obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o
obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o
obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o
-diff -Nur linux-3.13.6.orig/drivers/usb/Makefile linux-3.13.6/drivers/usb/Makefile
---- linux-3.13.6.orig/drivers/usb/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/usb/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/usb/Makefile linux-raspberry-pi/drivers/usb/Makefile
+--- linux-3.13.6/drivers/usb/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/usb/Makefile 2014-03-11 16:55:37.000000000 +0100
@@ -23,6 +23,7 @@
obj-$(CONFIG_USB_R8A66597_HCD) += host/
obj-$(CONFIG_USB_HWA_HCD) += host/
@@ -91730,9 +92267,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/Makefile linux-3.13.6/drivers/usb/Makefi
obj-$(CONFIG_USB_IMX21_HCD) += host/
obj-$(CONFIG_USB_FSL_MPH_DR_OF) += host/
obj-$(CONFIG_USB_FUSBH200_HCD) += host/
-diff -Nur linux-3.13.6.orig/drivers/video/bcm2708_fb.c linux-3.13.6/drivers/video/bcm2708_fb.c
---- linux-3.13.6.orig/drivers/video/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/video/bcm2708_fb.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/video/bcm2708_fb.c linux-raspberry-pi/drivers/video/bcm2708_fb.c
+--- linux-3.13.6/drivers/video/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/video/bcm2708_fb.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,765 @@
+/*
+ * linux/drivers/video/bcm2708_fb.c
@@ -92499,9 +93036,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/bcm2708_fb.c linux-3.13.6/drivers/vide
+MODULE_PARM_DESC(fbheight, "Height of ARM Framebuffer");
+MODULE_PARM_DESC(fbdepth, "Bit depth of ARM Framebuffer");
+MODULE_PARM_DESC(fbswap, "Swap order of red and blue in 24 and 32 bit modes");
-diff -Nur linux-3.13.6.orig/drivers/video/cfbimgblt.c linux-3.13.6/drivers/video/cfbimgblt.c
---- linux-3.13.6.orig/drivers/video/cfbimgblt.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/video/cfbimgblt.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/video/cfbimgblt.c linux-raspberry-pi/drivers/video/cfbimgblt.c
+--- linux-3.13.6/drivers/video/cfbimgblt.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/video/cfbimgblt.c 2014-03-11 16:55:38.000000000 +0100
@@ -28,6 +28,11 @@
*
* Also need to add code to deal with cards endians that are different than
@@ -92675,9 +93212,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/cfbimgblt.c linux-3.13.6/drivers/video
slow_imageblit(image, p, dst1, fgcolor, bgcolor,
start_index, pitch_index);
} else
-diff -Nur linux-3.13.6.orig/drivers/video/fbmem.c linux-3.13.6/drivers/video/fbmem.c
---- linux-3.13.6.orig/drivers/video/fbmem.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/video/fbmem.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/video/fbmem.c linux-raspberry-pi/drivers/video/fbmem.c
+--- linux-3.13.6/drivers/video/fbmem.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/video/fbmem.c 2014-03-11 16:55:38.000000000 +0100
@@ -1083,6 +1083,25 @@
}
EXPORT_SYMBOL(fb_blank);
@@ -92736,9 +93273,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/fbmem.c linux-3.13.6/drivers/video/fbm
arg = (unsigned long) compat_ptr(arg);
case FBIOBLANK:
ret = do_fb_ioctl(info, cmd, arg);
-diff -Nur linux-3.13.6.orig/drivers/video/Kconfig linux-3.13.6/drivers/video/Kconfig
---- linux-3.13.6.orig/drivers/video/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/video/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/video/Kconfig linux-raspberry-pi/drivers/video/Kconfig
+--- linux-3.13.6/drivers/video/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/video/Kconfig 2014-03-11 16:55:38.000000000 +0100
@@ -310,6 +310,20 @@
help
Support the Permedia2 FIFO disconnect feature.
@@ -92760,9 +93297,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/Kconfig linux-3.13.6/drivers/video/Kco
config FB_ARMCLCD
tristate "ARM PrimeCell PL110 support"
depends on FB && ARM && ARM_AMBA
-diff -Nur linux-3.13.6.orig/drivers/video/logo/logo_linux_clut224.ppm linux-3.13.6/drivers/video/logo/logo_linux_clut224.ppm
---- linux-3.13.6.orig/drivers/video/logo/logo_linux_clut224.ppm 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/video/logo/logo_linux_clut224.ppm 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/video/logo/logo_linux_clut224.ppm linux-raspberry-pi/drivers/video/logo/logo_linux_clut224.ppm
+--- linux-3.13.6/drivers/video/logo/logo_linux_clut224.ppm 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/video/logo/logo_linux_clut224.ppm 2014-03-11 16:53:13.000000000 +0100
@@ -1,1604 +1,883 @@
P3
-# Standard 224-color Linux logo
@@ -95249,9 +95786,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/logo/logo_linux_clut224.ppm linux-3.13
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0
-diff -Nur linux-3.13.6.orig/drivers/video/Makefile linux-3.13.6/drivers/video/Makefile
---- linux-3.13.6.orig/drivers/video/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/video/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/video/Makefile linux-raspberry-pi/drivers/video/Makefile
+--- linux-3.13.6/drivers/video/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/video/Makefile 2014-03-11 16:53:13.000000000 +0100
@@ -100,6 +100,7 @@
obj-$(CONFIG_FB_VOODOO1) += sstfb.o
obj-$(CONFIG_FB_ARMCLCD) += amba-clcd.o
@@ -95260,9 +95797,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/Makefile linux-3.13.6/drivers/video/Ma
obj-$(CONFIG_FB_68328) += 68328fb.o
obj-$(CONFIG_FB_GBE) += gbefb.o
obj-$(CONFIG_FB_CIRRUS) += cirrusfb.o
-diff -Nur linux-3.13.6.orig/drivers/w1/masters/w1-gpio.c linux-3.13.6/drivers/w1/masters/w1-gpio.c
---- linux-3.13.6.orig/drivers/w1/masters/w1-gpio.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/w1/masters/w1-gpio.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/w1/masters/w1-gpio.c linux-raspberry-pi/drivers/w1/masters/w1-gpio.c
+--- linux-3.13.6/drivers/w1/masters/w1-gpio.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/w1/masters/w1-gpio.c 2014-03-11 16:55:38.000000000 +0100
@@ -22,6 +22,9 @@
#include "../w1.h"
#include "../w1_int.h"
@@ -95304,9 +95841,9 @@ diff -Nur linux-3.13.6.orig/drivers/w1/masters/w1-gpio.c linux-3.13.6/drivers/w1
err = w1_add_master_device(master);
if (err) {
dev_err(&pdev->dev, "w1_add_master device failed\n");
-diff -Nur linux-3.13.6.orig/drivers/w1/w1.h linux-3.13.6/drivers/w1/w1.h
---- linux-3.13.6.orig/drivers/w1/w1.h 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/w1/w1.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/w1/w1.h linux-raspberry-pi/drivers/w1/w1.h
+--- linux-3.13.6/drivers/w1/w1.h 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/w1/w1.h 2014-03-11 16:55:38.000000000 +0100
@@ -148,6 +148,12 @@
*/
u8 (*set_pullup)(void *, int);
@@ -95320,9 +95857,9 @@ diff -Nur linux-3.13.6.orig/drivers/w1/w1.h linux-3.13.6/drivers/w1/w1.h
/** Really nice hardware can handles the different types of ROM search
* w1_master* is passed to the slave found callback.
*/
-diff -Nur linux-3.13.6.orig/drivers/w1/w1_int.c linux-3.13.6/drivers/w1/w1_int.c
---- linux-3.13.6.orig/drivers/w1/w1_int.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/w1/w1_int.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/w1/w1_int.c linux-raspberry-pi/drivers/w1/w1_int.c
+--- linux-3.13.6/drivers/w1/w1_int.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/w1/w1_int.c 2014-03-11 16:53:14.000000000 +0100
@@ -117,19 +117,21 @@
printk(KERN_ERR "w1_add_master_device: invalid function set\n");
return(-EINVAL);
@@ -95352,9 +95889,9 @@ diff -Nur linux-3.13.6.orig/drivers/w1/w1_int.c linux-3.13.6/drivers/w1/w1_int.c
/* Lock until the device is added (or not) to w1_masters. */
mutex_lock(&w1_mlock);
/* Search for the first available id (starting at 1). */
-diff -Nur linux-3.13.6.orig/drivers/w1/w1_io.c linux-3.13.6/drivers/w1/w1_io.c
---- linux-3.13.6.orig/drivers/w1/w1_io.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/w1/w1_io.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/w1/w1_io.c linux-raspberry-pi/drivers/w1/w1_io.c
+--- linux-3.13.6/drivers/w1/w1_io.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/w1/w1_io.c 2014-03-11 16:53:14.000000000 +0100
@@ -127,10 +127,22 @@
static void w1_post_write(struct w1_master *dev)
{
@@ -95381,9 +95918,9 @@ diff -Nur linux-3.13.6.orig/drivers/w1/w1_io.c linux-3.13.6/drivers/w1/w1_io.c
dev->pullup_duration = 0;
}
}
-diff -Nur linux-3.13.6.orig/drivers/watchdog/bcm2708_wdog.c linux-3.13.6/drivers/watchdog/bcm2708_wdog.c
---- linux-3.13.6.orig/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/drivers/watchdog/bcm2708_wdog.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/watchdog/bcm2708_wdog.c linux-raspberry-pi/drivers/watchdog/bcm2708_wdog.c
+--- linux-3.13.6/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/drivers/watchdog/bcm2708_wdog.c 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,384 @@
+/*
+ * Broadcom BCM2708 watchdog driver.
@@ -95769,9 +96306,9 @@ diff -Nur linux-3.13.6.orig/drivers/watchdog/bcm2708_wdog.c linux-3.13.6/drivers
+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
+MODULE_ALIAS_MISCDEV(TEMP_MINOR);
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.6.orig/drivers/watchdog/Kconfig linux-3.13.6/drivers/watchdog/Kconfig
---- linux-3.13.6.orig/drivers/watchdog/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/watchdog/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/watchdog/Kconfig linux-raspberry-pi/drivers/watchdog/Kconfig
+--- linux-3.13.6/drivers/watchdog/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/watchdog/Kconfig 2014-03-11 16:55:38.000000000 +0100
@@ -392,6 +392,12 @@
To compile this driver as a module, choose M here: the
module will be called retu_wdt.
@@ -95785,9 +96322,9 @@ diff -Nur linux-3.13.6.orig/drivers/watchdog/Kconfig linux-3.13.6/drivers/watchd
config MOXART_WDT
tristate "MOXART watchdog"
depends on ARCH_MOXART
-diff -Nur linux-3.13.6.orig/drivers/watchdog/Makefile linux-3.13.6/drivers/watchdog/Makefile
---- linux-3.13.6.orig/drivers/watchdog/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/drivers/watchdog/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/drivers/watchdog/Makefile linux-raspberry-pi/drivers/watchdog/Makefile
+--- linux-3.13.6/drivers/watchdog/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/drivers/watchdog/Makefile 2014-03-11 16:55:38.000000000 +0100
@@ -54,6 +54,7 @@
obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
obj-$(CONFIG_UX500_WATCHDOG) += ux500_wdt.o
@@ -95796,9 +96333,9 @@ diff -Nur linux-3.13.6.orig/drivers/watchdog/Makefile linux-3.13.6/drivers/watch
obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
obj-$(CONFIG_MOXART_WDT) += moxart_wdt.o
obj-$(CONFIG_SIRFSOC_WATCHDOG) += sirfsoc_wdt.o
-diff -Nur linux-3.13.6.orig/include/linux/broadcom/vc_cma.h linux-3.13.6/include/linux/broadcom/vc_cma.h
---- linux-3.13.6.orig/include/linux/broadcom/vc_cma.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/include/linux/broadcom/vc_cma.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/include/linux/broadcom/vc_cma.h linux-raspberry-pi/include/linux/broadcom/vc_cma.h
+--- linux-3.13.6/include/linux/broadcom/vc_cma.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/include/linux/broadcom/vc_cma.h 2014-03-11 16:55:38.000000000 +0100
@@ -0,0 +1,29 @@
+/*****************************************************************************
+* Copyright 2012 Broadcom Corporation. All rights reserved.
@@ -95829,9 +96366,9 @@ diff -Nur linux-3.13.6.orig/include/linux/broadcom/vc_cma.h linux-3.13.6/include
+#endif
+
+#endif /* VC_CMA_H */
-diff -Nur linux-3.13.6.orig/include/linux/mmc/host.h linux-3.13.6/include/linux/mmc/host.h
---- linux-3.13.6.orig/include/linux/mmc/host.h 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/include/linux/mmc/host.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/include/linux/mmc/host.h linux-raspberry-pi/include/linux/mmc/host.h
+--- linux-3.13.6/include/linux/mmc/host.h 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/include/linux/mmc/host.h 2014-03-11 16:55:39.000000000 +0100
@@ -282,6 +282,7 @@
MMC_CAP2_PACKED_WR)
#define MMC_CAP2_NO_PRESCAN_POWERUP (1 << 14) /* Don't power up before scan */
@@ -95840,9 +96377,9 @@ diff -Nur linux-3.13.6.orig/include/linux/mmc/host.h linux-3.13.6/include/linux/
mmc_pm_flag_t pm_caps; /* supported pm features */
-diff -Nur linux-3.13.6.orig/include/linux/mmc/sdhci.h linux-3.13.6/include/linux/mmc/sdhci.h
---- linux-3.13.6.orig/include/linux/mmc/sdhci.h 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/include/linux/mmc/sdhci.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/include/linux/mmc/sdhci.h linux-raspberry-pi/include/linux/mmc/sdhci.h
+--- linux-3.13.6/include/linux/mmc/sdhci.h 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/include/linux/mmc/sdhci.h 2014-03-11 16:55:39.000000000 +0100
@@ -102,6 +102,7 @@
#define SDHCI_QUIRK2_BROKEN_HS200 (1<<6)
@@ -95867,9 +96404,9 @@ diff -Nur linux-3.13.6.orig/include/linux/mmc/sdhci.h linux-3.13.6/include/linux
struct mmc_data *data; /* Current data request */
unsigned int data_early:1; /* Data finished before cmd */
-diff -Nur linux-3.13.6.orig/include/uapi/linux/fb.h linux-3.13.6/include/uapi/linux/fb.h
---- linux-3.13.6.orig/include/uapi/linux/fb.h 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/include/uapi/linux/fb.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/include/uapi/linux/fb.h linux-raspberry-pi/include/uapi/linux/fb.h
+--- linux-3.13.6/include/uapi/linux/fb.h 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/include/uapi/linux/fb.h 2014-03-11 16:53:22.000000000 +0100
@@ -34,6 +34,11 @@
#define FBIOPUT_MODEINFO 0x4617
#define FBIOGET_DISPINFO 0x4618
@@ -95882,9 +96419,9 @@ diff -Nur linux-3.13.6.orig/include/uapi/linux/fb.h linux-3.13.6/include/uapi/li
#define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */
#define FB_TYPE_PLANES 1 /* Non interleaved planes */
-diff -Nur linux-3.13.6.orig/kernel/cgroup.c linux-3.13.6/kernel/cgroup.c
---- linux-3.13.6.orig/kernel/cgroup.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/kernel/cgroup.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/kernel/cgroup.c linux-raspberry-pi/kernel/cgroup.c
+--- linux-3.13.6/kernel/cgroup.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/kernel/cgroup.c 2014-03-11 16:55:43.000000000 +0100
@@ -5485,6 +5485,33 @@
}
__setup("cgroup_disable=", cgroup_disable);
@@ -95919,5686 +96456,9 @@ diff -Nur linux-3.13.6.orig/kernel/cgroup.c linux-3.13.6/kernel/cgroup.c
/**
* css_from_dir - get corresponding css from the dentry of a cgroup dir
* @dentry: directory dentry of interest
-diff -Nur linux-3.13.6.orig/kernel/cgroup.c.orig linux-3.13.6/kernel/cgroup.c.orig
---- linux-3.13.6.orig/kernel/cgroup.c.orig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/kernel/cgroup.c.orig 2014-03-07 07:07:02.000000000 +0100
-@@ -0,0 +1,5673 @@
-+/*
-+ * Generic process-grouping system.
-+ *
-+ * Based originally on the cpuset system, extracted by Paul Menage
-+ * Copyright (C) 2006 Google, Inc
-+ *
-+ * Notifications support
-+ * Copyright (C) 2009 Nokia Corporation
-+ * Author: Kirill A. Shutemov
-+ *
-+ * Copyright notices from the original cpuset code:
-+ * --------------------------------------------------
-+ * Copyright (C) 2003 BULL SA.
-+ * Copyright (C) 2004-2006 Silicon Graphics, Inc.
-+ *
-+ * Portions derived from Patrick Mochel's sysfs code.
-+ * sysfs is Copyright (c) 2001-3 Patrick Mochel
-+ *
-+ * 2003-10-10 Written by Simon Derr.
-+ * 2003-10-22 Updates by Stephen Hemminger.
-+ * 2004 May-July Rework by Paul Jackson.
-+ * ---------------------------------------------------
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file COPYING in the main directory of the Linux
-+ * distribution for more details.
-+ */
-+
-+#include <linux/cgroup.h>
-+#include <linux/cred.h>
-+#include <linux/ctype.h>
-+#include <linux/errno.h>
-+#include <linux/init_task.h>
-+#include <linux/kernel.h>
-+#include <linux/list.h>
-+#include <linux/mm.h>
-+#include <linux/mutex.h>
-+#include <linux/mount.h>
-+#include <linux/pagemap.h>
-+#include <linux/proc_fs.h>
-+#include <linux/rcupdate.h>
-+#include <linux/sched.h>
-+#include <linux/backing-dev.h>
-+#include <linux/seq_file.h>
-+#include <linux/slab.h>
-+#include <linux/magic.h>
-+#include <linux/spinlock.h>
-+#include <linux/string.h>
-+#include <linux/sort.h>
-+#include <linux/kmod.h>
-+#include <linux/module.h>
-+#include <linux/delayacct.h>
-+#include <linux/cgroupstats.h>
-+#include <linux/hashtable.h>
-+#include <linux/namei.h>
-+#include <linux/pid_namespace.h>
-+#include <linux/idr.h>
-+#include <linux/vmalloc.h> /* TODO: replace with more sophisticated array */
-+#include <linux/eventfd.h>
-+#include <linux/poll.h>
-+#include <linux/flex_array.h> /* used in cgroup_attach_task */
-+#include <linux/kthread.h>
-+#include <linux/file.h>
-+
-+#include <linux/atomic.h>
-+
-+/*
-+ * cgroup_mutex is the master lock. Any modification to cgroup or its
-+ * hierarchy must be performed while holding it.
-+ *
-+ * cgroup_root_mutex nests inside cgroup_mutex and should be held to modify
-+ * cgroupfs_root of any cgroup hierarchy - subsys list, flags,
-+ * release_agent_path and so on. Modifying requires both cgroup_mutex and
-+ * cgroup_root_mutex. Readers can acquire either of the two. This is to
-+ * break the following locking order cycle.
-+ *
-+ * A. cgroup_mutex -> cred_guard_mutex -> s_type->i_mutex_key -> namespace_sem
-+ * B. namespace_sem -> cgroup_mutex
-+ *
-+ * B happens only through cgroup_show_options() and using cgroup_root_mutex
-+ * breaks it.
-+ */
-+#ifdef CONFIG_PROVE_RCU
-+DEFINE_MUTEX(cgroup_mutex);
-+EXPORT_SYMBOL_GPL(cgroup_mutex); /* only for lockdep */
-+#else
-+static DEFINE_MUTEX(cgroup_mutex);
-+#endif
-+
-+static DEFINE_MUTEX(cgroup_root_mutex);
-+
-+/*
-+ * cgroup destruction makes heavy use of work items and there can be a lot
-+ * of concurrent destructions. Use a separate workqueue so that cgroup
-+ * destruction work items don't end up filling up max_active of system_wq
-+ * which may lead to deadlock.
-+ */
-+static struct workqueue_struct *cgroup_destroy_wq;
-+
-+/*
-+ * Generate an array of cgroup subsystem pointers. At boot time, this is
-+ * populated with the built in subsystems, and modular subsystems are
-+ * registered after that. The mutable section of this array is protected by
-+ * cgroup_mutex.
-+ */
-+#define SUBSYS(_x) [_x ## _subsys_id] = &_x ## _subsys,
-+#define IS_SUBSYS_ENABLED(option) IS_BUILTIN(option)
-+static struct cgroup_subsys *cgroup_subsys[CGROUP_SUBSYS_COUNT] = {
-+#include <linux/cgroup_subsys.h>
-+};
-+
-+/*
-+ * The dummy hierarchy, reserved for the subsystems that are otherwise
-+ * unattached - it never has more than a single cgroup, and all tasks are
-+ * part of that cgroup.
-+ */
-+static struct cgroupfs_root cgroup_dummy_root;
-+
-+/* dummy_top is a shorthand for the dummy hierarchy's top cgroup */
-+static struct cgroup * const cgroup_dummy_top = &cgroup_dummy_root.top_cgroup;
-+
-+/*
-+ * cgroupfs file entry, pointed to from leaf dentry->d_fsdata.
-+ */
-+struct cfent {
-+ struct list_head node;
-+ struct dentry *dentry;
-+ struct cftype *type;
-+ struct cgroup_subsys_state *css;
-+
-+ /* file xattrs */
-+ struct simple_xattrs xattrs;
-+};
-+
-+/*
-+ * cgroup_event represents events which userspace want to receive.
-+ */
-+struct cgroup_event {
-+ /*
-+ * css which the event belongs to.
-+ */
-+ struct cgroup_subsys_state *css;
-+ /*
-+ * Control file which the event associated.
-+ */
-+ struct cftype *cft;
-+ /*
-+ * eventfd to signal userspace about the event.
-+ */
-+ struct eventfd_ctx *eventfd;
-+ /*
-+ * Each of these stored in a list by the cgroup.
-+ */
-+ struct list_head list;
-+ /*
-+ * All fields below needed to unregister event when
-+ * userspace closes eventfd.
-+ */
-+ poll_table pt;
-+ wait_queue_head_t *wqh;
-+ wait_queue_t wait;
-+ struct work_struct remove;
-+};
-+
-+/* The list of hierarchy roots */
-+
-+static LIST_HEAD(cgroup_roots);
-+static int cgroup_root_count;
-+
-+/*
-+ * Hierarchy ID allocation and mapping. It follows the same exclusion
-+ * rules as other root ops - both cgroup_mutex and cgroup_root_mutex for
-+ * writes, either for reads.
-+ */
-+static DEFINE_IDR(cgroup_hierarchy_idr);
-+
-+static struct cgroup_name root_cgroup_name = { .name = "/" };
-+
-+/*
-+ * Assign a monotonically increasing serial number to cgroups. It
-+ * guarantees cgroups with bigger numbers are newer than those with smaller
-+ * numbers. Also, as cgroups are always appended to the parent's
-+ * ->children list, it guarantees that sibling cgroups are always sorted in
-+ * the ascending serial number order on the list. Protected by
-+ * cgroup_mutex.
-+ */
-+static u64 cgroup_serial_nr_next = 1;
-+
-+/* This flag indicates whether tasks in the fork and exit paths should
-+ * check for fork/exit handlers to call. This avoids us having to do
-+ * extra work in the fork/exit path if none of the subsystems need to
-+ * be called.
-+ */
-+static int need_forkexit_callback __read_mostly;
-+
-+static struct cftype cgroup_base_files[];
-+
-+static void cgroup_destroy_css_killed(struct cgroup *cgrp);
-+static int cgroup_destroy_locked(struct cgroup *cgrp);
-+static int cgroup_addrm_files(struct cgroup *cgrp, struct cftype cfts[],
-+ bool is_add);
-+static int cgroup_file_release(struct inode *inode, struct file *file);
-+
-+/**
-+ * cgroup_css - obtain a cgroup's css for the specified subsystem
-+ * @cgrp: the cgroup of interest
-+ * @ss: the subsystem of interest (%NULL returns the dummy_css)
-+ *
-+ * Return @cgrp's css (cgroup_subsys_state) associated with @ss. This
-+ * function must be called either under cgroup_mutex or rcu_read_lock() and
-+ * the caller is responsible for pinning the returned css if it wants to
-+ * keep accessing it outside the said locks. This function may return
-+ * %NULL if @cgrp doesn't have @subsys_id enabled.
-+ */
-+static struct cgroup_subsys_state *cgroup_css(struct cgroup *cgrp,
-+ struct cgroup_subsys *ss)
-+{
-+ if (ss)
-+ return rcu_dereference_check(cgrp->subsys[ss->subsys_id],
-+ lockdep_is_held(&cgroup_mutex));
-+ else
-+ return &cgrp->dummy_css;
-+}
-+
-+/* convenient tests for these bits */
-+static inline bool cgroup_is_dead(const struct cgroup *cgrp)
-+{
-+ return test_bit(CGRP_DEAD, &cgrp->flags);
-+}
-+
-+/**
-+ * cgroup_is_descendant - test ancestry
-+ * @cgrp: the cgroup to be tested
-+ * @ancestor: possible ancestor of @cgrp
-+ *
-+ * Test whether @cgrp is a descendant of @ancestor. It also returns %true
-+ * if @cgrp == @ancestor. This function is safe to call as long as @cgrp
-+ * and @ancestor are accessible.
-+ */
-+bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor)
-+{
-+ while (cgrp) {
-+ if (cgrp == ancestor)
-+ return true;
-+ cgrp = cgrp->parent;
-+ }
-+ return false;
-+}
-+EXPORT_SYMBOL_GPL(cgroup_is_descendant);
-+
-+static int cgroup_is_releasable(const struct cgroup *cgrp)
-+{
-+ const int bits =
-+ (1 << CGRP_RELEASABLE) |
-+ (1 << CGRP_NOTIFY_ON_RELEASE);
-+ return (cgrp->flags & bits) == bits;
-+}
-+
-+static int notify_on_release(const struct cgroup *cgrp)
-+{
-+ return test_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags);
-+}
-+
-+/**
-+ * for_each_subsys - iterate all loaded cgroup subsystems
-+ * @ss: the iteration cursor
-+ * @i: the index of @ss, CGROUP_SUBSYS_COUNT after reaching the end
-+ *
-+ * Should be called under cgroup_mutex.
-+ */
-+#define for_each_subsys(ss, i) \
-+ for ((i) = 0; (i) < CGROUP_SUBSYS_COUNT; (i)++) \
-+ if (({ lockdep_assert_held(&cgroup_mutex); \
-+ !((ss) = cgroup_subsys[i]); })) { } \
-+ else
-+
-+/**
-+ * for_each_builtin_subsys - iterate all built-in cgroup subsystems
-+ * @ss: the iteration cursor
-+ * @i: the index of @ss, CGROUP_BUILTIN_SUBSYS_COUNT after reaching the end
-+ *
-+ * Bulit-in subsystems are always present and iteration itself doesn't
-+ * require any synchronization.
-+ */
-+#define for_each_builtin_subsys(ss, i) \
-+ for ((i) = 0; (i) < CGROUP_BUILTIN_SUBSYS_COUNT && \
-+ (((ss) = cgroup_subsys[i]) || true); (i)++)
-+
-+/* iterate each subsystem attached to a hierarchy */
-+#define for_each_root_subsys(root, ss) \
-+ list_for_each_entry((ss), &(root)->subsys_list, sibling)
-+
-+/* iterate across the active hierarchies */
-+#define for_each_active_root(root) \
-+ list_for_each_entry((root), &cgroup_roots, root_list)
-+
-+static inline struct cgroup *__d_cgrp(struct dentry *dentry)
-+{
-+ return dentry->d_fsdata;
-+}
-+
-+static inline struct cfent *__d_cfe(struct dentry *dentry)
-+{
-+ return dentry->d_fsdata;
-+}
-+
-+static inline struct cftype *__d_cft(struct dentry *dentry)
-+{
-+ return __d_cfe(dentry)->type;
-+}
-+
-+/**
-+ * cgroup_lock_live_group - take cgroup_mutex and check that cgrp is alive.
-+ * @cgrp: the cgroup to be checked for liveness
-+ *
-+ * On success, returns true; the mutex should be later unlocked. On
-+ * failure returns false with no lock held.
-+ */
-+static bool cgroup_lock_live_group(struct cgroup *cgrp)
-+{
-+ mutex_lock(&cgroup_mutex);
-+ if (cgroup_is_dead(cgrp)) {
-+ mutex_unlock(&cgroup_mutex);
-+ return false;
-+ }
-+ return true;
-+}
-+
-+/* the list of cgroups eligible for automatic release. Protected by
-+ * release_list_lock */
-+static LIST_HEAD(release_list);
-+static DEFINE_RAW_SPINLOCK(release_list_lock);
-+static void cgroup_release_agent(struct work_struct *work);
-+static DECLARE_WORK(release_agent_work, cgroup_release_agent);
-+static void check_for_release(struct cgroup *cgrp);
-+
-+/*
-+ * A cgroup can be associated with multiple css_sets as different tasks may
-+ * belong to different cgroups on different hierarchies. In the other
-+ * direction, a css_set is naturally associated with multiple cgroups.
-+ * This M:N relationship is represented by the following link structure
-+ * which exists for each association and allows traversing the associations
-+ * from both sides.
-+ */
-+struct cgrp_cset_link {
-+ /* the cgroup and css_set this link associates */
-+ struct cgroup *cgrp;
-+ struct css_set *cset;
-+
-+ /* list of cgrp_cset_links anchored at cgrp->cset_links */
-+ struct list_head cset_link;
-+
-+ /* list of cgrp_cset_links anchored at css_set->cgrp_links */
-+ struct list_head cgrp_link;
-+};
-+
-+/* The default css_set - used by init and its children prior to any
-+ * hierarchies being mounted. It contains a pointer to the root state
-+ * for each subsystem. Also used to anchor the list of css_sets. Not
-+ * reference-counted, to improve performance when child cgroups
-+ * haven't been created.
-+ */
-+
-+static struct css_set init_css_set;
-+static struct cgrp_cset_link init_cgrp_cset_link;
-+
-+/*
-+ * css_set_lock protects the list of css_set objects, and the chain of
-+ * tasks off each css_set. Nests outside task->alloc_lock due to
-+ * css_task_iter_start().
-+ */
-+static DEFINE_RWLOCK(css_set_lock);
-+static int css_set_count;
-+
-+/*
-+ * hash table for cgroup groups. This improves the performance to find
-+ * an existing css_set. This hash doesn't (currently) take into
-+ * account cgroups in empty hierarchies.
-+ */
-+#define CSS_SET_HASH_BITS 7
-+static DEFINE_HASHTABLE(css_set_table, CSS_SET_HASH_BITS);
-+
-+static unsigned long css_set_hash(struct cgroup_subsys_state *css[])
-+{
-+ unsigned long key = 0UL;
-+ struct cgroup_subsys *ss;
-+ int i;
-+
-+ for_each_subsys(ss, i)
-+ key += (unsigned long)css[i];
-+ key = (key >> 16) ^ key;
-+
-+ return key;
-+}
-+
-+/*
-+ * We don't maintain the lists running through each css_set to its task
-+ * until after the first call to css_task_iter_start(). This reduces the
-+ * fork()/exit() overhead for people who have cgroups compiled into their
-+ * kernel but not actually in use.
-+ */
-+static int use_task_css_set_links __read_mostly;
-+
-+static void __put_css_set(struct css_set *cset, int taskexit)
-+{
-+ struct cgrp_cset_link *link, *tmp_link;
-+
-+ /*
-+ * Ensure that the refcount doesn't hit zero while any readers
-+ * can see it. Similar to atomic_dec_and_lock(), but for an
-+ * rwlock
-+ */
-+ if (atomic_add_unless(&cset->refcount, -1, 1))
-+ return;
-+ write_lock(&css_set_lock);
-+ if (!atomic_dec_and_test(&cset->refcount)) {
-+ write_unlock(&css_set_lock);
-+ return;
-+ }
-+
-+ /* This css_set is dead. unlink it and release cgroup refcounts */
-+ hash_del(&cset->hlist);
-+ css_set_count--;
-+
-+ list_for_each_entry_safe(link, tmp_link, &cset->cgrp_links, cgrp_link) {
-+ struct cgroup *cgrp = link->cgrp;
-+
-+ list_del(&link->cset_link);
-+ list_del(&link->cgrp_link);
-+
-+ /* @cgrp can't go away while we're holding css_set_lock */
-+ if (list_empty(&cgrp->cset_links) && notify_on_release(cgrp)) {
-+ if (taskexit)
-+ set_bit(CGRP_RELEASABLE, &cgrp->flags);
-+ check_for_release(cgrp);
-+ }
-+
-+ kfree(link);
-+ }
-+
-+ write_unlock(&css_set_lock);
-+ kfree_rcu(cset, rcu_head);
-+}
-+
-+/*
-+ * refcounted get/put for css_set objects
-+ */
-+static inline void get_css_set(struct css_set *cset)
-+{
-+ atomic_inc(&cset->refcount);
-+}
-+
-+static inline void put_css_set(struct css_set *cset)
-+{
-+ __put_css_set(cset, 0);
-+}
-+
-+static inline void put_css_set_taskexit(struct css_set *cset)
-+{
-+ __put_css_set(cset, 1);
-+}
-+
-+/**
-+ * compare_css_sets - helper function for find_existing_css_set().
-+ * @cset: candidate css_set being tested
-+ * @old_cset: existing css_set for a task
-+ * @new_cgrp: cgroup that's being entered by the task
-+ * @template: desired set of css pointers in css_set (pre-calculated)
-+ *
-+ * Returns true if "cset" matches "old_cset" except for the hierarchy
-+ * which "new_cgrp" belongs to, for which it should match "new_cgrp".
-+ */
-+static bool compare_css_sets(struct css_set *cset,
-+ struct css_set *old_cset,
-+ struct cgroup *new_cgrp,
-+ struct cgroup_subsys_state *template[])
-+{
-+ struct list_head *l1, *l2;
-+
-+ if (memcmp(template, cset->subsys, sizeof(cset->subsys))) {
-+ /* Not all subsystems matched */
-+ return false;
-+ }
-+
-+ /*
-+ * Compare cgroup pointers in order to distinguish between
-+ * different cgroups in heirarchies with no subsystems. We
-+ * could get by with just this check alone (and skip the
-+ * memcmp above) but on most setups the memcmp check will
-+ * avoid the need for this more expensive check on almost all
-+ * candidates.
-+ */
-+
-+ l1 = &cset->cgrp_links;
-+ l2 = &old_cset->cgrp_links;
-+ while (1) {
-+ struct cgrp_cset_link *link1, *link2;
-+ struct cgroup *cgrp1, *cgrp2;
-+
-+ l1 = l1->next;
-+ l2 = l2->next;
-+ /* See if we reached the end - both lists are equal length. */
-+ if (l1 == &cset->cgrp_links) {
-+ BUG_ON(l2 != &old_cset->cgrp_links);
-+ break;
-+ } else {
-+ BUG_ON(l2 == &old_cset->cgrp_links);
-+ }
-+ /* Locate the cgroups associated with these links. */
-+ link1 = list_entry(l1, struct cgrp_cset_link, cgrp_link);
-+ link2 = list_entry(l2, struct cgrp_cset_link, cgrp_link);
-+ cgrp1 = link1->cgrp;
-+ cgrp2 = link2->cgrp;
-+ /* Hierarchies should be linked in the same order. */
-+ BUG_ON(cgrp1->root != cgrp2->root);
-+
-+ /*
-+ * If this hierarchy is the hierarchy of the cgroup
-+ * that's changing, then we need to check that this
-+ * css_set points to the new cgroup; if it's any other
-+ * hierarchy, then this css_set should point to the
-+ * same cgroup as the old css_set.
-+ */
-+ if (cgrp1->root == new_cgrp->root) {
-+ if (cgrp1 != new_cgrp)
-+ return false;
-+ } else {
-+ if (cgrp1 != cgrp2)
-+ return false;
-+ }
-+ }
-+ return true;
-+}
-+
-+/**
-+ * find_existing_css_set - init css array and find the matching css_set
-+ * @old_cset: the css_set that we're using before the cgroup transition
-+ * @cgrp: the cgroup that we're moving into
-+ * @template: out param for the new set of csses, should be clear on entry
-+ */
-+static struct css_set *find_existing_css_set(struct css_set *old_cset,
-+ struct cgroup *cgrp,
-+ struct cgroup_subsys_state *template[])
-+{
-+ struct cgroupfs_root *root = cgrp->root;
-+ struct cgroup_subsys *ss;
-+ struct css_set *cset;
-+ unsigned long key;
-+ int i;
-+
-+ /*
-+ * Build the set of subsystem state objects that we want to see in the
-+ * new css_set. while subsystems can change globally, the entries here
-+ * won't change, so no need for locking.
-+ */
-+ for_each_subsys(ss, i) {
-+ if (root->subsys_mask & (1UL << i)) {
-+ /* Subsystem is in this hierarchy. So we want
-+ * the subsystem state from the new
-+ * cgroup */
-+ template[i] = cgroup_css(cgrp, ss);
-+ } else {
-+ /* Subsystem is not in this hierarchy, so we
-+ * don't want to change the subsystem state */
-+ template[i] = old_cset->subsys[i];
-+ }
-+ }
-+
-+ key = css_set_hash(template);
-+ hash_for_each_possible(css_set_table, cset, hlist, key) {
-+ if (!compare_css_sets(cset, old_cset, cgrp, template))
-+ continue;
-+
-+ /* This css_set matches what we need */
-+ return cset;
-+ }
-+
-+ /* No existing cgroup group matched */
-+ return NULL;
-+}
-+
-+static void free_cgrp_cset_links(struct list_head *links_to_free)
-+{
-+ struct cgrp_cset_link *link, *tmp_link;
-+
-+ list_for_each_entry_safe(link, tmp_link, links_to_free, cset_link) {
-+ list_del(&link->cset_link);
-+ kfree(link);
-+ }
-+}
-+
-+/**
-+ * allocate_cgrp_cset_links - allocate cgrp_cset_links
-+ * @count: the number of links to allocate
-+ * @tmp_links: list_head the allocated links are put on
-+ *
-+ * Allocate @count cgrp_cset_link structures and chain them on @tmp_links
-+ * through ->cset_link. Returns 0 on success or -errno.
-+ */
-+static int allocate_cgrp_cset_links(int count, struct list_head *tmp_links)
-+{
-+ struct cgrp_cset_link *link;
-+ int i;
-+
-+ INIT_LIST_HEAD(tmp_links);
-+
-+ for (i = 0; i < count; i++) {
-+ link = kzalloc(sizeof(*link), GFP_KERNEL);
-+ if (!link) {
-+ free_cgrp_cset_links(tmp_links);
-+ return -ENOMEM;
-+ }
-+ list_add(&link->cset_link, tmp_links);
-+ }
-+ return 0;
-+}
-+
-+/**
-+ * link_css_set - a helper function to link a css_set to a cgroup
-+ * @tmp_links: cgrp_cset_link objects allocated by allocate_cgrp_cset_links()
-+ * @cset: the css_set to be linked
-+ * @cgrp: the destination cgroup
-+ */
-+static void link_css_set(struct list_head *tmp_links, struct css_set *cset,
-+ struct cgroup *cgrp)
-+{
-+ struct cgrp_cset_link *link;
-+
-+ BUG_ON(list_empty(tmp_links));
-+ link = list_first_entry(tmp_links, struct cgrp_cset_link, cset_link);
-+ link->cset = cset;
-+ link->cgrp = cgrp;
-+ list_move(&link->cset_link, &cgrp->cset_links);
-+ /*
-+ * Always add links to the tail of the list so that the list
-+ * is sorted by order of hierarchy creation
-+ */
-+ list_add_tail(&link->cgrp_link, &cset->cgrp_links);
-+}
-+
-+/**
-+ * find_css_set - return a new css_set with one cgroup updated
-+ * @old_cset: the baseline css_set
-+ * @cgrp: the cgroup to be updated
-+ *
-+ * Return a new css_set that's equivalent to @old_cset, but with @cgrp
-+ * substituted into the appropriate hierarchy.
-+ */
-+static struct css_set *find_css_set(struct css_set *old_cset,
-+ struct cgroup *cgrp)
-+{
-+ struct cgroup_subsys_state *template[CGROUP_SUBSYS_COUNT] = { };
-+ struct css_set *cset;
-+ struct list_head tmp_links;
-+ struct cgrp_cset_link *link;
-+ unsigned long key;
-+
-+ lockdep_assert_held(&cgroup_mutex);
-+
-+ /* First see if we already have a cgroup group that matches
-+ * the desired set */
-+ read_lock(&css_set_lock);
-+ cset = find_existing_css_set(old_cset, cgrp, template);
-+ if (cset)
-+ get_css_set(cset);
-+ read_unlock(&css_set_lock);
-+
-+ if (cset)
-+ return cset;
-+
-+ cset = kzalloc(sizeof(*cset), GFP_KERNEL);
-+ if (!cset)
-+ return NULL;
-+
-+ /* Allocate all the cgrp_cset_link objects that we'll need */
-+ if (allocate_cgrp_cset_links(cgroup_root_count, &tmp_links) < 0) {
-+ kfree(cset);
-+ return NULL;
-+ }
-+
-+ atomic_set(&cset->refcount, 1);
-+ INIT_LIST_HEAD(&cset->cgrp_links);
-+ INIT_LIST_HEAD(&cset->tasks);
-+ INIT_HLIST_NODE(&cset->hlist);
-+
-+ /* Copy the set of subsystem state objects generated in
-+ * find_existing_css_set() */
-+ memcpy(cset->subsys, template, sizeof(cset->subsys));
-+
-+ write_lock(&css_set_lock);
-+ /* Add reference counts and links from the new css_set. */
-+ list_for_each_entry(link, &old_cset->cgrp_links, cgrp_link) {
-+ struct cgroup *c = link->cgrp;
-+
-+ if (c->root == cgrp->root)
-+ c = cgrp;
-+ link_css_set(&tmp_links, cset, c);
-+ }
-+
-+ BUG_ON(!list_empty(&tmp_links));
-+
-+ css_set_count++;
-+
-+ /* Add this cgroup group to the hash table */
-+ key = css_set_hash(cset->subsys);
-+ hash_add(css_set_table, &cset->hlist, key);
-+
-+ write_unlock(&css_set_lock);
-+
-+ return cset;
-+}
-+
-+/*
-+ * Return the cgroup for "task" from the given hierarchy. Must be
-+ * called with cgroup_mutex held.
-+ */
-+static struct cgroup *task_cgroup_from_root(struct task_struct *task,
-+ struct cgroupfs_root *root)
-+{
-+ struct css_set *cset;
-+ struct cgroup *res = NULL;
-+
-+ BUG_ON(!mutex_is_locked(&cgroup_mutex));
-+ read_lock(&css_set_lock);
-+ /*
-+ * No need to lock the task - since we hold cgroup_mutex the
-+ * task can't change groups, so the only thing that can happen
-+ * is that it exits and its css is set back to init_css_set.
-+ */
-+ cset = task_css_set(task);
-+ if (cset == &init_css_set) {
-+ res = &root->top_cgroup;
-+ } else {
-+ struct cgrp_cset_link *link;
-+
-+ list_for_each_entry(link, &cset->cgrp_links, cgrp_link) {
-+ struct cgroup *c = link->cgrp;
-+
-+ if (c->root == root) {
-+ res = c;
-+ break;
-+ }
-+ }
-+ }
-+ read_unlock(&css_set_lock);
-+ BUG_ON(!res);
-+ return res;
-+}
-+
-+/*
-+ * There is one global cgroup mutex. We also require taking
-+ * task_lock() when dereferencing a task's cgroup subsys pointers.
-+ * See "The task_lock() exception", at the end of this comment.
-+ *
-+ * A task must hold cgroup_mutex to modify cgroups.
-+ *
-+ * Any task can increment and decrement the count field without lock.
-+ * So in general, code holding cgroup_mutex can't rely on the count
-+ * field not changing. However, if the count goes to zero, then only
-+ * cgroup_attach_task() can increment it again. Because a count of zero
-+ * means that no tasks are currently attached, therefore there is no
-+ * way a task attached to that cgroup can fork (the other way to
-+ * increment the count). So code holding cgroup_mutex can safely
-+ * assume that if the count is zero, it will stay zero. Similarly, if
-+ * a task holds cgroup_mutex on a cgroup with zero count, it
-+ * knows that the cgroup won't be removed, as cgroup_rmdir()
-+ * needs that mutex.
-+ *
-+ * The fork and exit callbacks cgroup_fork() and cgroup_exit(), don't
-+ * (usually) take cgroup_mutex. These are the two most performance
-+ * critical pieces of code here. The exception occurs on cgroup_exit(),
-+ * when a task in a notify_on_release cgroup exits. Then cgroup_mutex
-+ * is taken, and if the cgroup count is zero, a usermode call made
-+ * to the release agent with the name of the cgroup (path relative to
-+ * the root of cgroup file system) as the argument.
-+ *
-+ * A cgroup can only be deleted if both its 'count' of using tasks
-+ * is zero, and its list of 'children' cgroups is empty. Since all
-+ * tasks in the system use _some_ cgroup, and since there is always at
-+ * least one task in the system (init, pid == 1), therefore, top_cgroup
-+ * always has either children cgroups and/or using tasks. So we don't
-+ * need a special hack to ensure that top_cgroup cannot be deleted.
-+ *
-+ * The task_lock() exception
-+ *
-+ * The need for this exception arises from the action of
-+ * cgroup_attach_task(), which overwrites one task's cgroup pointer with
-+ * another. It does so using cgroup_mutex, however there are
-+ * several performance critical places that need to reference
-+ * task->cgroup without the expense of grabbing a system global
-+ * mutex. Therefore except as noted below, when dereferencing or, as
-+ * in cgroup_attach_task(), modifying a task's cgroup pointer we use
-+ * task_lock(), which acts on a spinlock (task->alloc_lock) already in
-+ * the task_struct routinely used for such matters.
-+ *
-+ * P.S. One more locking exception. RCU is used to guard the
-+ * update of a tasks cgroup pointer by cgroup_attach_task()
-+ */
-+
-+/*
-+ * A couple of forward declarations required, due to cyclic reference loop:
-+ * cgroup_mkdir -> cgroup_create -> cgroup_populate_dir ->
-+ * cgroup_add_file -> cgroup_create_file -> cgroup_dir_inode_operations
-+ * -> cgroup_mkdir.
-+ */
-+
-+static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode);
-+static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry);
-+static int cgroup_populate_dir(struct cgroup *cgrp, unsigned long subsys_mask);
-+static const struct inode_operations cgroup_dir_inode_operations;
-+static const struct file_operations proc_cgroupstats_operations;
-+
-+static struct backing_dev_info cgroup_backing_dev_info = {
-+ .name = "cgroup",
-+ .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK,
-+};
-+
-+static struct inode *cgroup_new_inode(umode_t mode, struct super_block *sb)
-+{
-+ struct inode *inode = new_inode(sb);
-+
-+ if (inode) {
-+ inode->i_ino = get_next_ino();
-+ inode->i_mode = mode;
-+ inode->i_uid = current_fsuid();
-+ inode->i_gid = current_fsgid();
-+ inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
-+ inode->i_mapping->backing_dev_info = &cgroup_backing_dev_info;
-+ }
-+ return inode;
-+}
-+
-+static struct cgroup_name *cgroup_alloc_name(struct dentry *dentry)
-+{
-+ struct cgroup_name *name;
-+
-+ name = kmalloc(sizeof(*name) + dentry->d_name.len + 1, GFP_KERNEL);
-+ if (!name)
-+ return NULL;
-+ strcpy(name->name, dentry->d_name.name);
-+ return name;
-+}
-+
-+static void cgroup_free_fn(struct work_struct *work)
-+{
-+ struct cgroup *cgrp = container_of(work, struct cgroup, destroy_work);
-+
-+ mutex_lock(&cgroup_mutex);
-+ cgrp->root->number_of_cgroups--;
-+ mutex_unlock(&cgroup_mutex);
-+
-+ /*
-+ * We get a ref to the parent's dentry, and put the ref when
-+ * this cgroup is being freed, so it's guaranteed that the
-+ * parent won't be destroyed before its children.
-+ */
-+ dput(cgrp->parent->dentry);
-+
-+ /*
-+ * Drop the active superblock reference that we took when we
-+ * created the cgroup. This will free cgrp->root, if we are
-+ * holding the last reference to @sb.
-+ */
-+ deactivate_super(cgrp->root->sb);
-+
-+ /*
-+ * if we're getting rid of the cgroup, refcount should ensure
-+ * that there are no pidlists left.
-+ */
-+ BUG_ON(!list_empty(&cgrp->pidlists));
-+
-+ simple_xattrs_free(&cgrp->xattrs);
-+
-+ kfree(rcu_dereference_raw(cgrp->name));
-+ kfree(cgrp);
-+}
-+
-+static void cgroup_free_rcu(struct rcu_head *head)
-+{
-+ struct cgroup *cgrp = container_of(head, struct cgroup, rcu_head);
-+
-+ INIT_WORK(&cgrp->destroy_work, cgroup_free_fn);
-+ queue_work(cgroup_destroy_wq, &cgrp->destroy_work);
-+}
-+
-+static void cgroup_diput(struct dentry *dentry, struct inode *inode)
-+{
-+ /* is dentry a directory ? if so, kfree() associated cgroup */
-+ if (S_ISDIR(inode->i_mode)) {
-+ struct cgroup *cgrp = dentry->d_fsdata;
-+
-+ BUG_ON(!(cgroup_is_dead(cgrp)));
-+
-+ /*
-+ * XXX: cgrp->id is only used to look up css's. As cgroup
-+ * and css's lifetimes will be decoupled, it should be made
-+ * per-subsystem and moved to css->id so that lookups are
-+ * successful until the target css is released.
-+ */
-+ idr_remove(&cgrp->root->cgroup_idr, cgrp->id);
-+ cgrp->id = -1;
-+
-+ call_rcu(&cgrp->rcu_head, cgroup_free_rcu);
-+ } else {
-+ struct cfent *cfe = __d_cfe(dentry);
-+ struct cgroup *cgrp = dentry->d_parent->d_fsdata;
-+
-+ WARN_ONCE(!list_empty(&cfe->node) &&
-+ cgrp != &cgrp->root->top_cgroup,
-+ "cfe still linked for %s\n", cfe->type->name);
-+ simple_xattrs_free(&cfe->xattrs);
-+ kfree(cfe);
-+ }
-+ iput(inode);
-+}
-+
-+static void remove_dir(struct dentry *d)
-+{
-+ struct dentry *parent = dget(d->d_parent);
-+
-+ d_delete(d);
-+ simple_rmdir(parent->d_inode, d);
-+ dput(parent);
-+}
-+
-+static void cgroup_rm_file(struct cgroup *cgrp, const struct cftype *cft)
-+{
-+ struct cfent *cfe;
-+
-+ lockdep_assert_held(&cgrp->dentry->d_inode->i_mutex);
-+ lockdep_assert_held(&cgroup_mutex);
-+
-+ /*
-+ * If we're doing cleanup due to failure of cgroup_create(),
-+ * the corresponding @cfe may not exist.
-+ */
-+ list_for_each_entry(cfe, &cgrp->files, node) {
-+ struct dentry *d = cfe->dentry;
-+
-+ if (cft && cfe->type != cft)
-+ continue;
-+
-+ dget(d);
-+ d_delete(d);
-+ simple_unlink(cgrp->dentry->d_inode, d);
-+ list_del_init(&cfe->node);
-+ dput(d);
-+
-+ break;
-+ }
-+}
-+
-+/**
-+ * cgroup_clear_dir - remove subsys files in a cgroup directory
-+ * @cgrp: target cgroup
-+ * @subsys_mask: mask of the subsystem ids whose files should be removed
-+ */
-+static void cgroup_clear_dir(struct cgroup *cgrp, unsigned long subsys_mask)
-+{
-+ struct cgroup_subsys *ss;
-+ int i;
-+
-+ for_each_subsys(ss, i) {
-+ struct cftype_set *set;
-+
-+ if (!test_bit(i, &subsys_mask))
-+ continue;
-+ list_for_each_entry(set, &ss->cftsets, node)
-+ cgroup_addrm_files(cgrp, set->cfts, false);
-+ }
-+}
-+
-+/*
-+ * NOTE : the dentry must have been dget()'ed
-+ */
-+static void cgroup_d_remove_dir(struct dentry *dentry)
-+{
-+ struct dentry *parent;
-+
-+ parent = dentry->d_parent;
-+ spin_lock(&parent->d_lock);
-+ spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
-+ list_del_init(&dentry->d_u.d_child);
-+ spin_unlock(&dentry->d_lock);
-+ spin_unlock(&parent->d_lock);
-+ remove_dir(dentry);
-+}
-+
-+/*
-+ * Call with cgroup_mutex held. Drops reference counts on modules, including
-+ * any duplicate ones that parse_cgroupfs_options took. If this function
-+ * returns an error, no reference counts are touched.
-+ */
-+static int rebind_subsystems(struct cgroupfs_root *root,
-+ unsigned long added_mask, unsigned removed_mask)
-+{
-+ struct cgroup *cgrp = &root->top_cgroup;
-+ struct cgroup_subsys *ss;
-+ unsigned long pinned = 0;
-+ int i, ret;
-+
-+ BUG_ON(!mutex_is_locked(&cgroup_mutex));
-+ BUG_ON(!mutex_is_locked(&cgroup_root_mutex));
-+
-+ /* Check that any added subsystems are currently free */
-+ for_each_subsys(ss, i) {
-+ if (!(added_mask & (1 << i)))
-+ continue;
-+
-+ /* is the subsystem mounted elsewhere? */
-+ if (ss->root != &cgroup_dummy_root) {
-+ ret = -EBUSY;
-+ goto out_put;
-+ }
-+
-+ /* pin the module */
-+ if (!try_module_get(ss->module)) {
-+ ret = -ENOENT;
-+ goto out_put;
-+ }
-+ pinned |= 1 << i;
-+ }
-+
-+ /* subsys could be missing if unloaded between parsing and here */
-+ if (added_mask != pinned) {
-+ ret = -ENOENT;
-+ goto out_put;
-+ }
-+
-+ ret = cgroup_populate_dir(cgrp, added_mask);
-+ if (ret)
-+ goto out_put;
-+
-+ /*
-+ * Nothing can fail from this point on. Remove files for the
-+ * removed subsystems and rebind each subsystem.
-+ */
-+ cgroup_clear_dir(cgrp, removed_mask);
-+
-+ for_each_subsys(ss, i) {
-+ unsigned long bit = 1UL << i;
-+
-+ if (bit & added_mask) {
-+ /* We're binding this subsystem to this hierarchy */
-+ BUG_ON(cgroup_css(cgrp, ss));
-+ BUG_ON(!cgroup_css(cgroup_dummy_top, ss));
-+ BUG_ON(cgroup_css(cgroup_dummy_top, ss)->cgroup != cgroup_dummy_top);
-+
-+ rcu_assign_pointer(cgrp->subsys[i],
-+ cgroup_css(cgroup_dummy_top, ss));
-+ cgroup_css(cgrp, ss)->cgroup = cgrp;
-+
-+ list_move(&ss->sibling, &root->subsys_list);
-+ ss->root = root;
-+ if (ss->bind)
-+ ss->bind(cgroup_css(cgrp, ss));
-+
-+ /* refcount was already taken, and we're keeping it */
-+ root->subsys_mask |= bit;
-+ } else if (bit & removed_mask) {
-+ /* We're removing this subsystem */
-+ BUG_ON(cgroup_css(cgrp, ss) != cgroup_css(cgroup_dummy_top, ss));
-+ BUG_ON(cgroup_css(cgrp, ss)->cgroup != cgrp);
-+
-+ if (ss->bind)
-+ ss->bind(cgroup_css(cgroup_dummy_top, ss));
-+
-+ cgroup_css(cgroup_dummy_top, ss)->cgroup = cgroup_dummy_top;
-+ RCU_INIT_POINTER(cgrp->subsys[i], NULL);
-+
-+ cgroup_subsys[i]->root = &cgroup_dummy_root;
-+ list_move(&ss->sibling, &cgroup_dummy_root.subsys_list);
-+
-+ /* subsystem is now free - drop reference on module */
-+ module_put(ss->module);
-+ root->subsys_mask &= ~bit;
-+ }
-+ }
-+
-+ /*
-+ * Mark @root has finished binding subsystems. @root->subsys_mask
-+ * now matches the bound subsystems.
-+ */
-+ root->flags |= CGRP_ROOT_SUBSYS_BOUND;
-+
-+ return 0;
-+
-+out_put:
-+ for_each_subsys(ss, i)
-+ if (pinned & (1 << i))
-+ module_put(ss->module);
-+ return ret;
-+}
-+
-+static int cgroup_show_options(struct seq_file *seq, struct dentry *dentry)
-+{
-+ struct cgroupfs_root *root = dentry->d_sb->s_fs_info;
-+ struct cgroup_subsys *ss;
-+
-+ mutex_lock(&cgroup_root_mutex);
-+ for_each_root_subsys(root, ss)
-+ seq_printf(seq, ",%s", ss->name);
-+ if (root->flags & CGRP_ROOT_SANE_BEHAVIOR)
-+ seq_puts(seq, ",sane_behavior");
-+ if (root->flags & CGRP_ROOT_NOPREFIX)
-+ seq_puts(seq, ",noprefix");
-+ if (root->flags & CGRP_ROOT_XATTR)
-+ seq_puts(seq, ",xattr");
-+ if (strlen(root->release_agent_path))
-+ seq_printf(seq, ",release_agent=%s", root->release_agent_path);
-+ if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->top_cgroup.flags))
-+ seq_puts(seq, ",clone_children");
-+ if (strlen(root->name))
-+ seq_printf(seq, ",name=%s", root->name);
-+ mutex_unlock(&cgroup_root_mutex);
-+ return 0;
-+}
-+
-+struct cgroup_sb_opts {
-+ unsigned long subsys_mask;
-+ unsigned long flags;
-+ char *release_agent;
-+ bool cpuset_clone_children;
-+ char *name;
-+ /* User explicitly requested empty subsystem */
-+ bool none;
-+
-+ struct cgroupfs_root *new_root;
-+
-+};
-+
-+/*
-+ * Convert a hierarchy specifier into a bitmask of subsystems and
-+ * flags. Call with cgroup_mutex held to protect the cgroup_subsys[]
-+ * array. This function takes refcounts on subsystems to be used, unless it
-+ * returns error, in which case no refcounts are taken.
-+ */
-+static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
-+{
-+ char *token, *o = data;
-+ bool all_ss = false, one_ss = false;
-+ unsigned long mask = (unsigned long)-1;
-+ struct cgroup_subsys *ss;
-+ int i;
-+
-+ BUG_ON(!mutex_is_locked(&cgroup_mutex));
-+
-+#ifdef CONFIG_CPUSETS
-+ mask = ~(1UL << cpuset_subsys_id);
-+#endif
-+
-+ memset(opts, 0, sizeof(*opts));
-+
-+ while ((token = strsep(&o, ",")) != NULL) {
-+ if (!*token)
-+ return -EINVAL;
-+ if (!strcmp(token, "none")) {
-+ /* Explicitly have no subsystems */
-+ opts->none = true;
-+ continue;
-+ }
-+ if (!strcmp(token, "all")) {
-+ /* Mutually exclusive option 'all' + subsystem name */
-+ if (one_ss)
-+ return -EINVAL;
-+ all_ss = true;
-+ continue;
-+ }
-+ if (!strcmp(token, "__DEVEL__sane_behavior")) {
-+ opts->flags |= CGRP_ROOT_SANE_BEHAVIOR;
-+ continue;
-+ }
-+ if (!strcmp(token, "noprefix")) {
-+ opts->flags |= CGRP_ROOT_NOPREFIX;
-+ continue;
-+ }
-+ if (!strcmp(token, "clone_children")) {
-+ opts->cpuset_clone_children = true;
-+ continue;
-+ }
-+ if (!strcmp(token, "xattr")) {
-+ opts->flags |= CGRP_ROOT_XATTR;
-+ continue;
-+ }
-+ if (!strncmp(token, "release_agent=", 14)) {
-+ /* Specifying two release agents is forbidden */
-+ if (opts->release_agent)
-+ return -EINVAL;
-+ opts->release_agent =
-+ kstrndup(token + 14, PATH_MAX - 1, GFP_KERNEL);
-+ if (!opts->release_agent)
-+ return -ENOMEM;
-+ continue;
-+ }
-+ if (!strncmp(token, "name=", 5)) {
-+ const char *name = token + 5;
-+ /* Can't specify an empty name */
-+ if (!strlen(name))
-+ return -EINVAL;
-+ /* Must match [\w.-]+ */
-+ for (i = 0; i < strlen(name); i++) {
-+ char c = name[i];
-+ if (isalnum(c))
-+ continue;
-+ if ((c == '.') || (c == '-') || (c == '_'))
-+ continue;
-+ return -EINVAL;
-+ }
-+ /* Specifying two names is forbidden */
-+ if (opts->name)
-+ return -EINVAL;
-+ opts->name = kstrndup(name,
-+ MAX_CGROUP_ROOT_NAMELEN - 1,
-+ GFP_KERNEL);
-+ if (!opts->name)
-+ return -ENOMEM;
-+
-+ continue;
-+ }
-+
-+ for_each_subsys(ss, i) {
-+ if (strcmp(token, ss->name))
-+ continue;
-+ if (ss->disabled)
-+ continue;
-+
-+ /* Mutually exclusive option 'all' + subsystem name */
-+ if (all_ss)
-+ return -EINVAL;
-+ set_bit(i, &opts->subsys_mask);
-+ one_ss = true;
-+
-+ break;
-+ }
-+ if (i == CGROUP_SUBSYS_COUNT)
-+ return -ENOENT;
-+ }
-+
-+ /*
-+ * If the 'all' option was specified select all the subsystems,
-+ * otherwise if 'none', 'name=' and a subsystem name options
-+ * were not specified, let's default to 'all'
-+ */
-+ if (all_ss || (!one_ss && !opts->none && !opts->name))
-+ for_each_subsys(ss, i)
-+ if (!ss->disabled)
-+ set_bit(i, &opts->subsys_mask);
-+
-+ /* Consistency checks */
-+
-+ if (opts->flags & CGRP_ROOT_SANE_BEHAVIOR) {
-+ pr_warning("cgroup: sane_behavior: this is still under development and its behaviors will change, proceed at your own risk\n");
-+
-+ if (opts->flags & CGRP_ROOT_NOPREFIX) {
-+ pr_err("cgroup: sane_behavior: noprefix is not allowed\n");
-+ return -EINVAL;
-+ }
-+
-+ if (opts->cpuset_clone_children) {
-+ pr_err("cgroup: sane_behavior: clone_children is not allowed\n");
-+ return -EINVAL;
-+ }
-+ }
-+
-+ /*
-+ * Option noprefix was introduced just for backward compatibility
-+ * with the old cpuset, so we allow noprefix only if mounting just
-+ * the cpuset subsystem.
-+ */
-+ if ((opts->flags & CGRP_ROOT_NOPREFIX) && (opts->subsys_mask & mask))
-+ return -EINVAL;
-+
-+
-+ /* Can't specify "none" and some subsystems */
-+ if (opts->subsys_mask && opts->none)
-+ return -EINVAL;
-+
-+ /*
-+ * We either have to specify by name or by subsystems. (So all
-+ * empty hierarchies must have a name).
-+ */
-+ if (!opts->subsys_mask && !opts->name)
-+ return -EINVAL;
-+
-+ return 0;
-+}
-+
-+static int cgroup_remount(struct super_block *sb, int *flags, char *data)
-+{
-+ int ret = 0;
-+ struct cgroupfs_root *root = sb->s_fs_info;
-+ struct cgroup *cgrp = &root->top_cgroup;
-+ struct cgroup_sb_opts opts;
-+ unsigned long added_mask, removed_mask;
-+
-+ if (root->flags & CGRP_ROOT_SANE_BEHAVIOR) {
-+ pr_err("cgroup: sane_behavior: remount is not allowed\n");
-+ return -EINVAL;
-+ }
-+
-+ mutex_lock(&cgrp->dentry->d_inode->i_mutex);
-+ mutex_lock(&cgroup_mutex);
-+ mutex_lock(&cgroup_root_mutex);
-+
-+ /* See what subsystems are wanted */
-+ ret = parse_cgroupfs_options(data, &opts);
-+ if (ret)
-+ goto out_unlock;
-+
-+ if (opts.subsys_mask != root->subsys_mask || opts.release_agent)
-+ pr_warning("cgroup: option changes via remount are deprecated (pid=%d comm=%s)\n",
-+ task_tgid_nr(current), current->comm);
-+
-+ added_mask = opts.subsys_mask & ~root->subsys_mask;
-+ removed_mask = root->subsys_mask & ~opts.subsys_mask;
-+
-+ /* Don't allow flags or name to change at remount */
-+ if (((opts.flags ^ root->flags) & CGRP_ROOT_OPTION_MASK) ||
-+ (opts.name && strcmp(opts.name, root->name))) {
-+ pr_err("cgroup: option or name mismatch, new: 0x%lx \"%s\", old: 0x%lx \"%s\"\n",
-+ opts.flags & CGRP_ROOT_OPTION_MASK, opts.name ?: "",
-+ root->flags & CGRP_ROOT_OPTION_MASK, root->name);
-+ ret = -EINVAL;
-+ goto out_unlock;
-+ }
-+
-+ /* remounting is not allowed for populated hierarchies */
-+ if (root->number_of_cgroups > 1) {
-+ ret = -EBUSY;
-+ goto out_unlock;
-+ }
-+
-+ ret = rebind_subsystems(root, added_mask, removed_mask);
-+ if (ret)
-+ goto out_unlock;
-+
-+ if (opts.release_agent)
-+ strcpy(root->release_agent_path, opts.release_agent);
-+ out_unlock:
-+ kfree(opts.release_agent);
-+ kfree(opts.name);
-+ mutex_unlock(&cgroup_root_mutex);
-+ mutex_unlock(&cgroup_mutex);
-+ mutex_unlock(&cgrp->dentry->d_inode->i_mutex);
-+ return ret;
-+}
-+
-+static const struct super_operations cgroup_ops = {
-+ .statfs = simple_statfs,
-+ .drop_inode = generic_delete_inode,
-+ .show_options = cgroup_show_options,
-+ .remount_fs = cgroup_remount,
-+};
-+
-+static void init_cgroup_housekeeping(struct cgroup *cgrp)
-+{
-+ INIT_LIST_HEAD(&cgrp->sibling);
-+ INIT_LIST_HEAD(&cgrp->children);
-+ INIT_LIST_HEAD(&cgrp->files);
-+ INIT_LIST_HEAD(&cgrp->cset_links);
-+ INIT_LIST_HEAD(&cgrp->release_list);
-+ INIT_LIST_HEAD(&cgrp->pidlists);
-+ mutex_init(&cgrp->pidlist_mutex);
-+ cgrp->dummy_css.cgroup = cgrp;
-+ INIT_LIST_HEAD(&cgrp->event_list);
-+ spin_lock_init(&cgrp->event_list_lock);
-+ simple_xattrs_init(&cgrp->xattrs);
-+}
-+
-+static void init_cgroup_root(struct cgroupfs_root *root)
-+{
-+ struct cgroup *cgrp = &root->top_cgroup;
-+
-+ INIT_LIST_HEAD(&root->subsys_list);
-+ INIT_LIST_HEAD(&root->root_list);
-+ root->number_of_cgroups = 1;
-+ cgrp->root = root;
-+ RCU_INIT_POINTER(cgrp->name, &root_cgroup_name);
-+ init_cgroup_housekeeping(cgrp);
-+ idr_init(&root->cgroup_idr);
-+}
-+
-+static int cgroup_init_root_id(struct cgroupfs_root *root, int start, int end)
-+{
-+ int id;
-+
-+ lockdep_assert_held(&cgroup_mutex);
-+ lockdep_assert_held(&cgroup_root_mutex);
-+
-+ id = idr_alloc_cyclic(&cgroup_hierarchy_idr, root, start, end,
-+ GFP_KERNEL);
-+ if (id < 0)
-+ return id;
-+
-+ root->hierarchy_id = id;
-+ return 0;
-+}
-+
-+static void cgroup_exit_root_id(struct cgroupfs_root *root)
-+{
-+ lockdep_assert_held(&cgroup_mutex);
-+ lockdep_assert_held(&cgroup_root_mutex);
-+
-+ if (root->hierarchy_id) {
-+ idr_remove(&cgroup_hierarchy_idr, root->hierarchy_id);
-+ root->hierarchy_id = 0;
-+ }
-+}
-+
-+static int cgroup_test_super(struct super_block *sb, void *data)
-+{
-+ struct cgroup_sb_opts *opts = data;
-+ struct cgroupfs_root *root = sb->s_fs_info;
-+
-+ /* If we asked for a name then it must match */
-+ if (opts->name && strcmp(opts->name, root->name))
-+ return 0;
-+
-+ /*
-+ * If we asked for subsystems (or explicitly for no
-+ * subsystems) then they must match
-+ */
-+ if ((opts->subsys_mask || opts->none)
-+ && (opts->subsys_mask != root->subsys_mask))
-+ return 0;
-+
-+ return 1;
-+}
-+
-+static struct cgroupfs_root *cgroup_root_from_opts(struct cgroup_sb_opts *opts)
-+{
-+ struct cgroupfs_root *root;
-+
-+ if (!opts->subsys_mask && !opts->none)
-+ return NULL;
-+
-+ root = kzalloc(sizeof(*root), GFP_KERNEL);
-+ if (!root)
-+ return ERR_PTR(-ENOMEM);
-+
-+ init_cgroup_root(root);
-+
-+ /*
-+ * We need to set @root->subsys_mask now so that @root can be
-+ * matched by cgroup_test_super() before it finishes
-+ * initialization; otherwise, competing mounts with the same
-+ * options may try to bind the same subsystems instead of waiting
-+ * for the first one leading to unexpected mount errors.
-+ * SUBSYS_BOUND will be set once actual binding is complete.
-+ */
-+ root->subsys_mask = opts->subsys_mask;
-+ root->flags = opts->flags;
-+ if (opts->release_agent)
-+ strcpy(root->release_agent_path, opts->release_agent);
-+ if (opts->name)
-+ strcpy(root->name, opts->name);
-+ if (opts->cpuset_clone_children)
-+ set_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->top_cgroup.flags);
-+ return root;
-+}
-+
-+static void cgroup_free_root(struct cgroupfs_root *root)
-+{
-+ if (root) {
-+ /* hierarhcy ID shoulid already have been released */
-+ WARN_ON_ONCE(root->hierarchy_id);
-+
-+ idr_destroy(&root->cgroup_idr);
-+ kfree(root);
-+ }
-+}
-+
-+static int cgroup_set_super(struct super_block *sb, void *data)
-+{
-+ int ret;
-+ struct cgroup_sb_opts *opts = data;
-+
-+ /* If we don't have a new root, we can't set up a new sb */
-+ if (!opts->new_root)
-+ return -EINVAL;
-+
-+ BUG_ON(!opts->subsys_mask && !opts->none);
-+
-+ ret = set_anon_super(sb, NULL);
-+ if (ret)
-+ return ret;
-+
-+ sb->s_fs_info = opts->new_root;
-+ opts->new_root->sb = sb;
-+
-+ sb->s_blocksize = PAGE_CACHE_SIZE;
-+ sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
-+ sb->s_magic = CGROUP_SUPER_MAGIC;
-+ sb->s_op = &cgroup_ops;
-+
-+ return 0;
-+}
-+
-+static int cgroup_get_rootdir(struct super_block *sb)
-+{
-+ static const struct dentry_operations cgroup_dops = {
-+ .d_iput = cgroup_diput,
-+ .d_delete = always_delete_dentry,
-+ };
-+
-+ struct inode *inode =
-+ cgroup_new_inode(S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR, sb);
-+
-+ if (!inode)
-+ return -ENOMEM;
-+
-+ inode->i_fop = &simple_dir_operations;
-+ inode->i_op = &cgroup_dir_inode_operations;
-+ /* directories start off with i_nlink == 2 (for "." entry) */
-+ inc_nlink(inode);
-+ sb->s_root = d_make_root(inode);
-+ if (!sb->s_root)
-+ return -ENOMEM;
-+ /* for everything else we want ->d_op set */
-+ sb->s_d_op = &cgroup_dops;
-+ return 0;
-+}
-+
-+static struct dentry *cgroup_mount(struct file_system_type *fs_type,
-+ int flags, const char *unused_dev_name,
-+ void *data)
-+{
-+ struct cgroup_sb_opts opts;
-+ struct cgroupfs_root *root;
-+ int ret = 0;
-+ struct super_block *sb;
-+ struct cgroupfs_root *new_root;
-+ struct list_head tmp_links;
-+ struct inode *inode;
-+ const struct cred *cred;
-+
-+ /* First find the desired set of subsystems */
-+ mutex_lock(&cgroup_mutex);
-+ ret = parse_cgroupfs_options(data, &opts);
-+ mutex_unlock(&cgroup_mutex);
-+ if (ret)
-+ goto out_err;
-+
-+ /*
-+ * Allocate a new cgroup root. We may not need it if we're
-+ * reusing an existing hierarchy.
-+ */
-+ new_root = cgroup_root_from_opts(&opts);
-+ if (IS_ERR(new_root)) {
-+ ret = PTR_ERR(new_root);
-+ goto out_err;
-+ }
-+ opts.new_root = new_root;
-+
-+ /* Locate an existing or new sb for this hierarchy */
-+ sb = sget(fs_type, cgroup_test_super, cgroup_set_super, 0, &opts);
-+ if (IS_ERR(sb)) {
-+ ret = PTR_ERR(sb);
-+ cgroup_free_root(opts.new_root);
-+ goto out_err;
-+ }
-+
-+ root = sb->s_fs_info;
-+ BUG_ON(!root);
-+ if (root == opts.new_root) {
-+ /* We used the new root structure, so this is a new hierarchy */
-+ struct cgroup *root_cgrp = &root->top_cgroup;
-+ struct cgroupfs_root *existing_root;
-+ int i;
-+ struct css_set *cset;
-+
-+ BUG_ON(sb->s_root != NULL);
-+
-+ ret = cgroup_get_rootdir(sb);
-+ if (ret)
-+ goto drop_new_super;
-+ inode = sb->s_root->d_inode;
-+
-+ mutex_lock(&inode->i_mutex);
-+ mutex_lock(&cgroup_mutex);
-+ mutex_lock(&cgroup_root_mutex);
-+
-+ ret = idr_alloc(&root->cgroup_idr, root_cgrp, 0, 1, GFP_KERNEL);
-+ if (ret < 0)
-+ goto unlock_drop;
-+ root_cgrp->id = ret;
-+
-+ /* Check for name clashes with existing mounts */
-+ ret = -EBUSY;
-+ if (strlen(root->name))
-+ for_each_active_root(existing_root)
-+ if (!strcmp(existing_root->name, root->name))
-+ goto unlock_drop;
-+
-+ /*
-+ * We're accessing css_set_count without locking
-+ * css_set_lock here, but that's OK - it can only be
-+ * increased by someone holding cgroup_lock, and
-+ * that's us. The worst that can happen is that we
-+ * have some link structures left over
-+ */
-+ ret = allocate_cgrp_cset_links(css_set_count, &tmp_links);
-+ if (ret)
-+ goto unlock_drop;
-+
-+ /* ID 0 is reserved for dummy root, 1 for unified hierarchy */
-+ ret = cgroup_init_root_id(root, 2, 0);
-+ if (ret)
-+ goto unlock_drop;
-+
-+ sb->s_root->d_fsdata = root_cgrp;
-+ root_cgrp->dentry = sb->s_root;
-+
-+ /*
-+ * We're inside get_sb() and will call lookup_one_len() to
-+ * create the root files, which doesn't work if SELinux is
-+ * in use. The following cred dancing somehow works around
-+ * it. See 2ce9738ba ("cgroupfs: use init_cred when
-+ * populating new cgroupfs mount") for more details.
-+ */
-+ cred = override_creds(&init_cred);
-+
-+ ret = cgroup_addrm_files(root_cgrp, cgroup_base_files, true);
-+ if (ret)
-+ goto rm_base_files;
-+
-+ ret = rebind_subsystems(root, root->subsys_mask, 0);
-+ if (ret)
-+ goto rm_base_files;
-+
-+ revert_creds(cred);
-+
-+ /*
-+ * There must be no failure case after here, since rebinding
-+ * takes care of subsystems' refcounts, which are explicitly
-+ * dropped in the failure exit path.
-+ */
-+
-+ list_add(&root->root_list, &cgroup_roots);
-+ cgroup_root_count++;
-+
-+ /* Link the top cgroup in this hierarchy into all
-+ * the css_set objects */
-+ write_lock(&css_set_lock);
-+ hash_for_each(css_set_table, i, cset, hlist)
-+ link_css_set(&tmp_links, cset, root_cgrp);
-+ write_unlock(&css_set_lock);
-+
-+ free_cgrp_cset_links(&tmp_links);
-+
-+ BUG_ON(!list_empty(&root_cgrp->children));
-+ BUG_ON(root->number_of_cgroups != 1);
-+
-+ mutex_unlock(&cgroup_root_mutex);
-+ mutex_unlock(&cgroup_mutex);
-+ mutex_unlock(&inode->i_mutex);
-+ } else {
-+ /*
-+ * We re-used an existing hierarchy - the new root (if
-+ * any) is not needed
-+ */
-+ cgroup_free_root(opts.new_root);
-+
-+ if ((root->flags ^ opts.flags) & CGRP_ROOT_OPTION_MASK) {
-+ if ((root->flags | opts.flags) & CGRP_ROOT_SANE_BEHAVIOR) {
-+ pr_err("cgroup: sane_behavior: new mount options should match the existing superblock\n");
-+ ret = -EINVAL;
-+ goto drop_new_super;
-+ } else {
-+ pr_warning("cgroup: new mount options do not match the existing superblock, will be ignored\n");
-+ }
-+ }
-+ }
-+
-+ kfree(opts.release_agent);
-+ kfree(opts.name);
-+ return dget(sb->s_root);
-+
-+ rm_base_files:
-+ free_cgrp_cset_links(&tmp_links);
-+ cgroup_addrm_files(&root->top_cgroup, cgroup_base_files, false);
-+ revert_creds(cred);
-+ unlock_drop:
-+ cgroup_exit_root_id(root);
-+ mutex_unlock(&cgroup_root_mutex);
-+ mutex_unlock(&cgroup_mutex);
-+ mutex_unlock(&inode->i_mutex);
-+ drop_new_super:
-+ deactivate_locked_super(sb);
-+ out_err:
-+ kfree(opts.release_agent);
-+ kfree(opts.name);
-+ return ERR_PTR(ret);
-+}
-+
-+static void cgroup_kill_sb(struct super_block *sb) {
-+ struct cgroupfs_root *root = sb->s_fs_info;
-+ struct cgroup *cgrp = &root->top_cgroup;
-+ struct cgrp_cset_link *link, *tmp_link;
-+ int ret;
-+
-+ BUG_ON(!root);
-+
-+ BUG_ON(root->number_of_cgroups != 1);
-+ BUG_ON(!list_empty(&cgrp->children));
-+
-+ mutex_lock(&cgrp->dentry->d_inode->i_mutex);
-+ mutex_lock(&cgroup_mutex);
-+ mutex_lock(&cgroup_root_mutex);
-+
-+ /* Rebind all subsystems back to the default hierarchy */
-+ if (root->flags & CGRP_ROOT_SUBSYS_BOUND) {
-+ ret = rebind_subsystems(root, 0, root->subsys_mask);
-+ /* Shouldn't be able to fail ... */
-+ BUG_ON(ret);
-+ }
-+
-+ /*
-+ * Release all the links from cset_links to this hierarchy's
-+ * root cgroup
-+ */
-+ write_lock(&css_set_lock);
-+
-+ list_for_each_entry_safe(link, tmp_link, &cgrp->cset_links, cset_link) {
-+ list_del(&link->cset_link);
-+ list_del(&link->cgrp_link);
-+ kfree(link);
-+ }
-+ write_unlock(&css_set_lock);
-+
-+ if (!list_empty(&root->root_list)) {
-+ list_del(&root->root_list);
-+ cgroup_root_count--;
-+ }
-+
-+ cgroup_exit_root_id(root);
-+
-+ mutex_unlock(&cgroup_root_mutex);
-+ mutex_unlock(&cgroup_mutex);
-+ mutex_unlock(&cgrp->dentry->d_inode->i_mutex);
-+
-+ simple_xattrs_free(&cgrp->xattrs);
-+
-+ kill_litter_super(sb);
-+ cgroup_free_root(root);
-+}
-+
-+static struct file_system_type cgroup_fs_type = {
-+ .name = "cgroup",
-+ .mount = cgroup_mount,
-+ .kill_sb = cgroup_kill_sb,
-+};
-+
-+static struct kobject *cgroup_kobj;
-+
-+/**
-+ * cgroup_path - generate the path of a cgroup
-+ * @cgrp: the cgroup in question
-+ * @buf: the buffer to write the path into
-+ * @buflen: the length of the buffer
-+ *
-+ * Writes path of cgroup into buf. Returns 0 on success, -errno on error.
-+ *
-+ * We can't generate cgroup path using dentry->d_name, as accessing
-+ * dentry->name must be protected by irq-unsafe dentry->d_lock or parent
-+ * inode's i_mutex, while on the other hand cgroup_path() can be called
-+ * with some irq-safe spinlocks held.
-+ */
-+int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen)
-+{
-+ int ret = -ENAMETOOLONG;
-+ char *start;
-+
-+ if (!cgrp->parent) {
-+ if (strlcpy(buf, "/", buflen) >= buflen)
-+ return -ENAMETOOLONG;
-+ return 0;
-+ }
-+
-+ start = buf + buflen - 1;
-+ *start = '\0';
-+
-+ rcu_read_lock();
-+ do {
-+ const char *name = cgroup_name(cgrp);
-+ int len;
-+
-+ len = strlen(name);
-+ if ((start -= len) < buf)
-+ goto out;
-+ memcpy(start, name, len);
-+
-+ if (--start < buf)
-+ goto out;
-+ *start = '/';
-+
-+ cgrp = cgrp->parent;
-+ } while (cgrp->parent);
-+ ret = 0;
-+ memmove(buf, start, buf + buflen - start);
-+out:
-+ rcu_read_unlock();
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(cgroup_path);
-+
-+/**
-+ * task_cgroup_path - cgroup path of a task in the first cgroup hierarchy
-+ * @task: target task
-+ * @buf: the buffer to write the path into
-+ * @buflen: the length of the buffer
-+ *
-+ * Determine @task's cgroup on the first (the one with the lowest non-zero
-+ * hierarchy_id) cgroup hierarchy and copy its path into @buf. This
-+ * function grabs cgroup_mutex and shouldn't be used inside locks used by
-+ * cgroup controller callbacks.
-+ *
-+ * Returns 0 on success, fails with -%ENAMETOOLONG if @buflen is too short.
-+ */
-+int task_cgroup_path(struct task_struct *task, char *buf, size_t buflen)
-+{
-+ struct cgroupfs_root *root;
-+ struct cgroup *cgrp;
-+ int hierarchy_id = 1, ret = 0;
-+
-+ if (buflen < 2)
-+ return -ENAMETOOLONG;
-+
-+ mutex_lock(&cgroup_mutex);
-+
-+ root = idr_get_next(&cgroup_hierarchy_idr, &hierarchy_id);
-+
-+ if (root) {
-+ cgrp = task_cgroup_from_root(task, root);
-+ ret = cgroup_path(cgrp, buf, buflen);
-+ } else {
-+ /* if no hierarchy exists, everyone is in "/" */
-+ memcpy(buf, "/", 2);
-+ }
-+
-+ mutex_unlock(&cgroup_mutex);
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(task_cgroup_path);
-+
-+/*
-+ * Control Group taskset
-+ */
-+struct task_and_cgroup {
-+ struct task_struct *task;
-+ struct cgroup *cgrp;
-+ struct css_set *cset;
-+};
-+
-+struct cgroup_taskset {
-+ struct task_and_cgroup single;
-+ struct flex_array *tc_array;
-+ int tc_array_len;
-+ int idx;
-+ struct cgroup *cur_cgrp;
-+};
-+
-+/**
-+ * cgroup_taskset_first - reset taskset and return the first task
-+ * @tset: taskset of interest
-+ *
-+ * @tset iteration is initialized and the first task is returned.
-+ */
-+struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset)
-+{
-+ if (tset->tc_array) {
-+ tset->idx = 0;
-+ return cgroup_taskset_next(tset);
-+ } else {
-+ tset->cur_cgrp = tset->single.cgrp;
-+ return tset->single.task;
-+ }
-+}
-+EXPORT_SYMBOL_GPL(cgroup_taskset_first);
-+
-+/**
-+ * cgroup_taskset_next - iterate to the next task in taskset
-+ * @tset: taskset of interest
-+ *
-+ * Return the next task in @tset. Iteration must have been initialized
-+ * with cgroup_taskset_first().
-+ */
-+struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset)
-+{
-+ struct task_and_cgroup *tc;
-+
-+ if (!tset->tc_array || tset->idx >= tset->tc_array_len)
-+ return NULL;
-+
-+ tc = flex_array_get(tset->tc_array, tset->idx++);
-+ tset->cur_cgrp = tc->cgrp;
-+ return tc->task;
-+}
-+EXPORT_SYMBOL_GPL(cgroup_taskset_next);
-+
-+/**
-+ * cgroup_taskset_cur_css - return the matching css for the current task
-+ * @tset: taskset of interest
-+ * @subsys_id: the ID of the target subsystem
-+ *
-+ * Return the css for the current (last returned) task of @tset for
-+ * subsystem specified by @subsys_id. This function must be preceded by
-+ * either cgroup_taskset_first() or cgroup_taskset_next().
-+ */
-+struct cgroup_subsys_state *cgroup_taskset_cur_css(struct cgroup_taskset *tset,
-+ int subsys_id)
-+{
-+ return cgroup_css(tset->cur_cgrp, cgroup_subsys[subsys_id]);
-+}
-+EXPORT_SYMBOL_GPL(cgroup_taskset_cur_css);
-+
-+/**
-+ * cgroup_taskset_size - return the number of tasks in taskset
-+ * @tset: taskset of interest
-+ */
-+int cgroup_taskset_size(struct cgroup_taskset *tset)
-+{
-+ return tset->tc_array ? tset->tc_array_len : 1;
-+}
-+EXPORT_SYMBOL_GPL(cgroup_taskset_size);
-+
-+
-+/*
-+ * cgroup_task_migrate - move a task from one cgroup to another.
-+ *
-+ * Must be called with cgroup_mutex and threadgroup locked.
-+ */
-+static void cgroup_task_migrate(struct cgroup *old_cgrp,
-+ struct task_struct *tsk,
-+ struct css_set *new_cset)
-+{
-+ struct css_set *old_cset;
-+
-+ /*
-+ * We are synchronized through threadgroup_lock() against PF_EXITING
-+ * setting such that we can't race against cgroup_exit() changing the
-+ * css_set to init_css_set and dropping the old one.
-+ */
-+ WARN_ON_ONCE(tsk->flags & PF_EXITING);
-+ old_cset = task_css_set(tsk);
-+
-+ task_lock(tsk);
-+ rcu_assign_pointer(tsk->cgroups, new_cset);
-+ task_unlock(tsk);
-+
-+ /* Update the css_set linked lists if we're using them */
-+ write_lock(&css_set_lock);
-+ if (!list_empty(&tsk->cg_list))
-+ list_move(&tsk->cg_list, &new_cset->tasks);
-+ write_unlock(&css_set_lock);
-+
-+ /*
-+ * We just gained a reference on old_cset by taking it from the
-+ * task. As trading it for new_cset is protected by cgroup_mutex,
-+ * we're safe to drop it here; it will be freed under RCU.
-+ */
-+ set_bit(CGRP_RELEASABLE, &old_cgrp->flags);
-+ put_css_set(old_cset);
-+}
-+
-+/**
-+ * cgroup_attach_task - attach a task or a whole threadgroup to a cgroup
-+ * @cgrp: the cgroup to attach to
-+ * @tsk: the task or the leader of the threadgroup to be attached
-+ * @threadgroup: attach the whole threadgroup?
-+ *
-+ * Call holding cgroup_mutex and the group_rwsem of the leader. Will take
-+ * task_lock of @tsk or each thread in the threadgroup individually in turn.
-+ */
-+static int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk,
-+ bool threadgroup)
-+{
-+ int retval, i, group_size;
-+ struct cgroup_subsys *ss, *failed_ss = NULL;
-+ struct cgroupfs_root *root = cgrp->root;
-+ /* threadgroup list cursor and array */
-+ struct task_struct *leader = tsk;
-+ struct task_and_cgroup *tc;
-+ struct flex_array *group;
-+ struct cgroup_taskset tset = { };
-+
-+ /*
-+ * step 0: in order to do expensive, possibly blocking operations for
-+ * every thread, we cannot iterate the thread group list, since it needs
-+ * rcu or tasklist locked. instead, build an array of all threads in the
-+ * group - group_rwsem prevents new threads from appearing, and if
-+ * threads exit, this will just be an over-estimate.
-+ */
-+ if (threadgroup)
-+ group_size = get_nr_threads(tsk);
-+ else
-+ group_size = 1;
-+ /* flex_array supports very large thread-groups better than kmalloc. */
-+ group = flex_array_alloc(sizeof(*tc), group_size, GFP_KERNEL);
-+ if (!group)
-+ return -ENOMEM;
-+ /* pre-allocate to guarantee space while iterating in rcu read-side. */
-+ retval = flex_array_prealloc(group, 0, group_size, GFP_KERNEL);
-+ if (retval)
-+ goto out_free_group_list;
-+
-+ i = 0;
-+ /*
-+ * Prevent freeing of tasks while we take a snapshot. Tasks that are
-+ * already PF_EXITING could be freed from underneath us unless we
-+ * take an rcu_read_lock.
-+ */
-+ rcu_read_lock();
-+ do {
-+ struct task_and_cgroup ent;
-+
-+ /* @tsk either already exited or can't exit until the end */
-+ if (tsk->flags & PF_EXITING)
-+ goto next;
-+
-+ /* as per above, nr_threads may decrease, but not increase. */
-+ BUG_ON(i >= group_size);
-+ ent.task = tsk;
-+ ent.cgrp = task_cgroup_from_root(tsk, root);
-+ /* nothing to do if this task is already in the cgroup */
-+ if (ent.cgrp == cgrp)
-+ goto next;
-+ /*
-+ * saying GFP_ATOMIC has no effect here because we did prealloc
-+ * earlier, but it's good form to communicate our expectations.
-+ */
-+ retval = flex_array_put(group, i, &ent, GFP_ATOMIC);
-+ BUG_ON(retval != 0);
-+ i++;
-+ next:
-+ if (!threadgroup)
-+ break;
-+ } while_each_thread(leader, tsk);
-+ rcu_read_unlock();
-+ /* remember the number of threads in the array for later. */
-+ group_size = i;
-+ tset.tc_array = group;
-+ tset.tc_array_len = group_size;
-+
-+ /* methods shouldn't be called if no task is actually migrating */
-+ retval = 0;
-+ if (!group_size)
-+ goto out_free_group_list;
-+
-+ /*
-+ * step 1: check that we can legitimately attach to the cgroup.
-+ */
-+ for_each_root_subsys(root, ss) {
-+ struct cgroup_subsys_state *css = cgroup_css(cgrp, ss);
-+
-+ if (ss->can_attach) {
-+ retval = ss->can_attach(css, &tset);
-+ if (retval) {
-+ failed_ss = ss;
-+ goto out_cancel_attach;
-+ }
-+ }
-+ }
-+
-+ /*
-+ * step 2: make sure css_sets exist for all threads to be migrated.
-+ * we use find_css_set, which allocates a new one if necessary.
-+ */
-+ for (i = 0; i < group_size; i++) {
-+ struct css_set *old_cset;
-+
-+ tc = flex_array_get(group, i);
-+ old_cset = task_css_set(tc->task);
-+ tc->cset = find_css_set(old_cset, cgrp);
-+ if (!tc->cset) {
-+ retval = -ENOMEM;
-+ goto out_put_css_set_refs;
-+ }
-+ }
-+
-+ /*
-+ * step 3: now that we're guaranteed success wrt the css_sets,
-+ * proceed to move all tasks to the new cgroup. There are no
-+ * failure cases after here, so this is the commit point.
-+ */
-+ for (i = 0; i < group_size; i++) {
-+ tc = flex_array_get(group, i);
-+ cgroup_task_migrate(tc->cgrp, tc->task, tc->cset);
-+ }
-+ /* nothing is sensitive to fork() after this point. */
-+
-+ /*
-+ * step 4: do subsystem attach callbacks.
-+ */
-+ for_each_root_subsys(root, ss) {
-+ struct cgroup_subsys_state *css = cgroup_css(cgrp, ss);
-+
-+ if (ss->attach)
-+ ss->attach(css, &tset);
-+ }
-+
-+ /*
-+ * step 5: success! and cleanup
-+ */
-+ retval = 0;
-+out_put_css_set_refs:
-+ if (retval) {
-+ for (i = 0; i < group_size; i++) {
-+ tc = flex_array_get(group, i);
-+ if (!tc->cset)
-+ break;
-+ put_css_set(tc->cset);
-+ }
-+ }
-+out_cancel_attach:
-+ if (retval) {
-+ for_each_root_subsys(root, ss) {
-+ struct cgroup_subsys_state *css = cgroup_css(cgrp, ss);
-+
-+ if (ss == failed_ss)
-+ break;
-+ if (ss->cancel_attach)
-+ ss->cancel_attach(css, &tset);
-+ }
-+ }
-+out_free_group_list:
-+ flex_array_free(group);
-+ return retval;
-+}
-+
-+/*
-+ * Find the task_struct of the task to attach by vpid and pass it along to the
-+ * function to attach either it or all tasks in its threadgroup. Will lock
-+ * cgroup_mutex and threadgroup; may take task_lock of task.
-+ */
-+static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup)
-+{
-+ struct task_struct *tsk;
-+ const struct cred *cred = current_cred(), *tcred;
-+ int ret;
-+
-+ if (!cgroup_lock_live_group(cgrp))
-+ return -ENODEV;
-+
-+retry_find_task:
-+ rcu_read_lock();
-+ if (pid) {
-+ tsk = find_task_by_vpid(pid);
-+ if (!tsk) {
-+ rcu_read_unlock();
-+ ret= -ESRCH;
-+ goto out_unlock_cgroup;
-+ }
-+ /*
-+ * even if we're attaching all tasks in the thread group, we
-+ * only need to check permissions on one of them.
-+ */
-+ tcred = __task_cred(tsk);
-+ if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) &&
-+ !uid_eq(cred->euid, tcred->uid) &&
-+ !uid_eq(cred->euid, tcred->suid)) {
-+ rcu_read_unlock();
-+ ret = -EACCES;
-+ goto out_unlock_cgroup;
-+ }
-+ } else
-+ tsk = current;
-+
-+ if (threadgroup)
-+ tsk = tsk->group_leader;
-+
-+ /*
-+ * Workqueue threads may acquire PF_NO_SETAFFINITY and become
-+ * trapped in a cpuset, or RT worker may be born in a cgroup
-+ * with no rt_runtime allocated. Just say no.
-+ */
-+ if (tsk == kthreadd_task || (tsk->flags & PF_NO_SETAFFINITY)) {
-+ ret = -EINVAL;
-+ rcu_read_unlock();
-+ goto out_unlock_cgroup;
-+ }
-+
-+ get_task_struct(tsk);
-+ rcu_read_unlock();
-+
-+ threadgroup_lock(tsk);
-+ if (threadgroup) {
-+ if (!thread_group_leader(tsk)) {
-+ /*
-+ * a race with de_thread from another thread's exec()
-+ * may strip us of our leadership, if this happens,
-+ * there is no choice but to throw this task away and
-+ * try again; this is
-+ * "double-double-toil-and-trouble-check locking".
-+ */
-+ threadgroup_unlock(tsk);
-+ put_task_struct(tsk);
-+ goto retry_find_task;
-+ }
-+ }
-+
-+ ret = cgroup_attach_task(cgrp, tsk, threadgroup);
-+
-+ threadgroup_unlock(tsk);
-+
-+ put_task_struct(tsk);
-+out_unlock_cgroup:
-+ mutex_unlock(&cgroup_mutex);
-+ return ret;
-+}
-+
-+/**
-+ * cgroup_attach_task_all - attach task 'tsk' to all cgroups of task 'from'
-+ * @from: attach to all cgroups of a given task
-+ * @tsk: the task to be attached
-+ */
-+int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk)
-+{
-+ struct cgroupfs_root *root;
-+ int retval = 0;
-+
-+ mutex_lock(&cgroup_mutex);
-+ for_each_active_root(root) {
-+ struct cgroup *from_cgrp = task_cgroup_from_root(from, root);
-+
-+ retval = cgroup_attach_task(from_cgrp, tsk, false);
-+ if (retval)
-+ break;
-+ }
-+ mutex_unlock(&cgroup_mutex);
-+
-+ return retval;
-+}
-+EXPORT_SYMBOL_GPL(cgroup_attach_task_all);
-+
-+static int cgroup_tasks_write(struct cgroup_subsys_state *css,
-+ struct cftype *cft, u64 pid)
-+{
-+ return attach_task_by_pid(css->cgroup, pid, false);
-+}
-+
-+static int cgroup_procs_write(struct cgroup_subsys_state *css,
-+ struct cftype *cft, u64 tgid)
-+{
-+ return attach_task_by_pid(css->cgroup, tgid, true);
-+}
-+
-+static int cgroup_release_agent_write(struct cgroup_subsys_state *css,
-+ struct cftype *cft, const char *buffer)
-+{
-+ BUILD_BUG_ON(sizeof(css->cgroup->root->release_agent_path) < PATH_MAX);
-+ if (strlen(buffer) >= PATH_MAX)
-+ return -EINVAL;
-+ if (!cgroup_lock_live_group(css->cgroup))
-+ return -ENODEV;
-+ mutex_lock(&cgroup_root_mutex);
-+ strcpy(css->cgroup->root->release_agent_path, buffer);
-+ mutex_unlock(&cgroup_root_mutex);
-+ mutex_unlock(&cgroup_mutex);
-+ return 0;
-+}
-+
-+static int cgroup_release_agent_show(struct cgroup_subsys_state *css,
-+ struct cftype *cft, struct seq_file *seq)
-+{
-+ struct cgroup *cgrp = css->cgroup;
-+
-+ if (!cgroup_lock_live_group(cgrp))
-+ return -ENODEV;
-+ seq_puts(seq, cgrp->root->release_agent_path);
-+ seq_putc(seq, '\n');
-+ mutex_unlock(&cgroup_mutex);
-+ return 0;
-+}
-+
-+static int cgroup_sane_behavior_show(struct cgroup_subsys_state *css,
-+ struct cftype *cft, struct seq_file *seq)
-+{
-+ seq_printf(seq, "%d\n", cgroup_sane_behavior(css->cgroup));
-+ return 0;
-+}
-+
-+/* A buffer size big enough for numbers or short strings */
-+#define CGROUP_LOCAL_BUFFER_SIZE 64
-+
-+static ssize_t cgroup_write_X64(struct cgroup_subsys_state *css,
-+ struct cftype *cft, struct file *file,
-+ const char __user *userbuf, size_t nbytes,
-+ loff_t *unused_ppos)
-+{
-+ char buffer[CGROUP_LOCAL_BUFFER_SIZE];
-+ int retval = 0;
-+ char *end;
-+
-+ if (!nbytes)
-+ return -EINVAL;
-+ if (nbytes >= sizeof(buffer))
-+ return -E2BIG;
-+ if (copy_from_user(buffer, userbuf, nbytes))
-+ return -EFAULT;
-+
-+ buffer[nbytes] = 0; /* nul-terminate */
-+ if (cft->write_u64) {
-+ u64 val = simple_strtoull(strstrip(buffer), &end, 0);
-+ if (*end)
-+ return -EINVAL;
-+ retval = cft->write_u64(css, cft, val);
-+ } else {
-+ s64 val = simple_strtoll(strstrip(buffer), &end, 0);
-+ if (*end)
-+ return -EINVAL;
-+ retval = cft->write_s64(css, cft, val);
-+ }
-+ if (!retval)
-+ retval = nbytes;
-+ return retval;
-+}
-+
-+static ssize_t cgroup_write_string(struct cgroup_subsys_state *css,
-+ struct cftype *cft, struct file *file,
-+ const char __user *userbuf, size_t nbytes,
-+ loff_t *unused_ppos)
-+{
-+ char local_buffer[CGROUP_LOCAL_BUFFER_SIZE];
-+ int retval = 0;
-+ size_t max_bytes = cft->max_write_len;
-+ char *buffer = local_buffer;
-+
-+ if (!max_bytes)
-+ max_bytes = sizeof(local_buffer) - 1;
-+ if (nbytes >= max_bytes)
-+ return -E2BIG;
-+ /* Allocate a dynamic buffer if we need one */
-+ if (nbytes >= sizeof(local_buffer)) {
-+ buffer = kmalloc(nbytes + 1, GFP_KERNEL);
-+ if (buffer == NULL)
-+ return -ENOMEM;
-+ }
-+ if (nbytes && copy_from_user(buffer, userbuf, nbytes)) {
-+ retval = -EFAULT;
-+ goto out;
-+ }
-+
-+ buffer[nbytes] = 0; /* nul-terminate */
-+ retval = cft->write_string(css, cft, strstrip(buffer));
-+ if (!retval)
-+ retval = nbytes;
-+out:
-+ if (buffer != local_buffer)
-+ kfree(buffer);
-+ return retval;
-+}
-+
-+static ssize_t cgroup_file_write(struct file *file, const char __user *buf,
-+ size_t nbytes, loff_t *ppos)
-+{
-+ struct cfent *cfe = __d_cfe(file->f_dentry);
-+ struct cftype *cft = __d_cft(file->f_dentry);
-+ struct cgroup_subsys_state *css = cfe->css;
-+
-+ if (cft->write)
-+ return cft->write(css, cft, file, buf, nbytes, ppos);
-+ if (cft->write_u64 || cft->write_s64)
-+ return cgroup_write_X64(css, cft, file, buf, nbytes, ppos);
-+ if (cft->write_string)
-+ return cgroup_write_string(css, cft, file, buf, nbytes, ppos);
-+ if (cft->trigger) {
-+ int ret = cft->trigger(css, (unsigned int)cft->private);
-+ return ret ? ret : nbytes;
-+ }
-+ return -EINVAL;
-+}
-+
-+static ssize_t cgroup_read_u64(struct cgroup_subsys_state *css,
-+ struct cftype *cft, struct file *file,
-+ char __user *buf, size_t nbytes, loff_t *ppos)
-+{
-+ char tmp[CGROUP_LOCAL_BUFFER_SIZE];
-+ u64 val = cft->read_u64(css, cft);
-+ int len = sprintf(tmp, "%llu\n", (unsigned long long) val);
-+
-+ return simple_read_from_buffer(buf, nbytes, ppos, tmp, len);
-+}
-+
-+static ssize_t cgroup_read_s64(struct cgroup_subsys_state *css,
-+ struct cftype *cft, struct file *file,
-+ char __user *buf, size_t nbytes, loff_t *ppos)
-+{
-+ char tmp[CGROUP_LOCAL_BUFFER_SIZE];
-+ s64 val = cft->read_s64(css, cft);
-+ int len = sprintf(tmp, "%lld\n", (long long) val);
-+
-+ return simple_read_from_buffer(buf, nbytes, ppos, tmp, len);
-+}
-+
-+static ssize_t cgroup_file_read(struct file *file, char __user *buf,
-+ size_t nbytes, loff_t *ppos)
-+{
-+ struct cfent *cfe = __d_cfe(file->f_dentry);
-+ struct cftype *cft = __d_cft(file->f_dentry);
-+ struct cgroup_subsys_state *css = cfe->css;
-+
-+ if (cft->read)
-+ return cft->read(css, cft, file, buf, nbytes, ppos);
-+ if (cft->read_u64)
-+ return cgroup_read_u64(css, cft, file, buf, nbytes, ppos);
-+ if (cft->read_s64)
-+ return cgroup_read_s64(css, cft, file, buf, nbytes, ppos);
-+ return -EINVAL;
-+}
-+
-+/*
-+ * seqfile ops/methods for returning structured data. Currently just
-+ * supports string->u64 maps, but can be extended in future.
-+ */
-+
-+static int cgroup_map_add(struct cgroup_map_cb *cb, const char *key, u64 value)
-+{
-+ struct seq_file *sf = cb->state;
-+ return seq_printf(sf, "%s %llu\n", key, (unsigned long long)value);
-+}
-+
-+static int cgroup_seqfile_show(struct seq_file *m, void *arg)
-+{
-+ struct cfent *cfe = m->private;
-+ struct cftype *cft = cfe->type;
-+ struct cgroup_subsys_state *css = cfe->css;
-+
-+ if (cft->read_map) {
-+ struct cgroup_map_cb cb = {
-+ .fill = cgroup_map_add,
-+ .state = m,
-+ };
-+ return cft->read_map(css, cft, &cb);
-+ }
-+ return cft->read_seq_string(css, cft, m);
-+}
-+
-+static const struct file_operations cgroup_seqfile_operations = {
-+ .read = seq_read,
-+ .write = cgroup_file_write,
-+ .llseek = seq_lseek,
-+ .release = cgroup_file_release,
-+};
-+
-+static int cgroup_file_open(struct inode *inode, struct file *file)
-+{
-+ struct cfent *cfe = __d_cfe(file->f_dentry);
-+ struct cftype *cft = __d_cft(file->f_dentry);
-+ struct cgroup *cgrp = __d_cgrp(cfe->dentry->d_parent);
-+ struct cgroup_subsys_state *css;
-+ int err;
-+
-+ err = generic_file_open(inode, file);
-+ if (err)
-+ return err;
-+
-+ /*
-+ * If the file belongs to a subsystem, pin the css. Will be
-+ * unpinned either on open failure or release. This ensures that
-+ * @css stays alive for all file operations.
-+ */
-+ rcu_read_lock();
-+ css = cgroup_css(cgrp, cft->ss);
-+ if (cft->ss && !css_tryget(css))
-+ css = NULL;
-+ rcu_read_unlock();
-+
-+ if (!css)
-+ return -ENODEV;
-+
-+ /*
-+ * @cfe->css is used by read/write/close to determine the
-+ * associated css. @file->private_data would be a better place but
-+ * that's already used by seqfile. Multiple accessors may use it
-+ * simultaneously which is okay as the association never changes.
-+ */
-+ WARN_ON_ONCE(cfe->css && cfe->css != css);
-+ cfe->css = css;
-+
-+ if (cft->read_map || cft->read_seq_string) {
-+ file->f_op = &cgroup_seqfile_operations;
-+ err = single_open(file, cgroup_seqfile_show, cfe);
-+ } else if (cft->open) {
-+ err = cft->open(inode, file);
-+ }
-+
-+ if (css->ss && err)
-+ css_put(css);
-+ return err;
-+}
-+
-+static int cgroup_file_release(struct inode *inode, struct file *file)
-+{
-+ struct cfent *cfe = __d_cfe(file->f_dentry);
-+ struct cftype *cft = __d_cft(file->f_dentry);
-+ struct cgroup_subsys_state *css = cfe->css;
-+ int ret = 0;
-+
-+ if (cft->release)
-+ ret = cft->release(inode, file);
-+ if (css->ss)
-+ css_put(css);
-+ if (file->f_op == &cgroup_seqfile_operations)
-+ single_release(inode, file);
-+ return ret;
-+}
-+
-+/*
-+ * cgroup_rename - Only allow simple rename of directories in place.
-+ */
-+static int cgroup_rename(struct inode *old_dir, struct dentry *old_dentry,
-+ struct inode *new_dir, struct dentry *new_dentry)
-+{
-+ int ret;
-+ struct cgroup_name *name, *old_name;
-+ struct cgroup *cgrp;
-+
-+ /*
-+ * It's convinient to use parent dir's i_mutex to protected
-+ * cgrp->name.
-+ */
-+ lockdep_assert_held(&old_dir->i_mutex);
-+
-+ if (!S_ISDIR(old_dentry->d_inode->i_mode))
-+ return -ENOTDIR;
-+ if (new_dentry->d_inode)
-+ return -EEXIST;
-+ if (old_dir != new_dir)
-+ return -EIO;
-+
-+ cgrp = __d_cgrp(old_dentry);
-+
-+ /*
-+ * This isn't a proper migration and its usefulness is very
-+ * limited. Disallow if sane_behavior.
-+ */
-+ if (cgroup_sane_behavior(cgrp))
-+ return -EPERM;
-+
-+ name = cgroup_alloc_name(new_dentry);
-+ if (!name)
-+ return -ENOMEM;
-+
-+ ret = simple_rename(old_dir, old_dentry, new_dir, new_dentry);
-+ if (ret) {
-+ kfree(name);
-+ return ret;
-+ }
-+
-+ old_name = rcu_dereference_protected(cgrp->name, true);
-+ rcu_assign_pointer(cgrp->name, name);
-+
-+ kfree_rcu(old_name, rcu_head);
-+ return 0;
-+}
-+
-+static struct simple_xattrs *__d_xattrs(struct dentry *dentry)
-+{
-+ if (S_ISDIR(dentry->d_inode->i_mode))
-+ return &__d_cgrp(dentry)->xattrs;
-+ else
-+ return &__d_cfe(dentry)->xattrs;
-+}
-+
-+static inline int xattr_enabled(struct dentry *dentry)
-+{
-+ struct cgroupfs_root *root = dentry->d_sb->s_fs_info;
-+ return root->flags & CGRP_ROOT_XATTR;
-+}
-+
-+static bool is_valid_xattr(const char *name)
-+{
-+ if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) ||
-+ !strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN))
-+ return true;
-+ return false;
-+}
-+
-+static int cgroup_setxattr(struct dentry *dentry, const char *name,
-+ const void *val, size_t size, int flags)
-+{
-+ if (!xattr_enabled(dentry))
-+ return -EOPNOTSUPP;
-+ if (!is_valid_xattr(name))
-+ return -EINVAL;
-+ return simple_xattr_set(__d_xattrs(dentry), name, val, size, flags);
-+}
-+
-+static int cgroup_removexattr(struct dentry *dentry, const char *name)
-+{
-+ if (!xattr_enabled(dentry))
-+ return -EOPNOTSUPP;
-+ if (!is_valid_xattr(name))
-+ return -EINVAL;
-+ return simple_xattr_remove(__d_xattrs(dentry), name);
-+}
-+
-+static ssize_t cgroup_getxattr(struct dentry *dentry, const char *name,
-+ void *buf, size_t size)
-+{
-+ if (!xattr_enabled(dentry))
-+ return -EOPNOTSUPP;
-+ if (!is_valid_xattr(name))
-+ return -EINVAL;
-+ return simple_xattr_get(__d_xattrs(dentry), name, buf, size);
-+}
-+
-+static ssize_t cgroup_listxattr(struct dentry *dentry, char *buf, size_t size)
-+{
-+ if (!xattr_enabled(dentry))
-+ return -EOPNOTSUPP;
-+ return simple_xattr_list(__d_xattrs(dentry), buf, size);
-+}
-+
-+static const struct file_operations cgroup_file_operations = {
-+ .read = cgroup_file_read,
-+ .write = cgroup_file_write,
-+ .llseek = generic_file_llseek,
-+ .open = cgroup_file_open,
-+ .release = cgroup_file_release,
-+};
-+
-+static const struct inode_operations cgroup_file_inode_operations = {
-+ .setxattr = cgroup_setxattr,
-+ .getxattr = cgroup_getxattr,
-+ .listxattr = cgroup_listxattr,
-+ .removexattr = cgroup_removexattr,
-+};
-+
-+static const struct inode_operations cgroup_dir_inode_operations = {
-+ .lookup = simple_lookup,
-+ .mkdir = cgroup_mkdir,
-+ .rmdir = cgroup_rmdir,
-+ .rename = cgroup_rename,
-+ .setxattr = cgroup_setxattr,
-+ .getxattr = cgroup_getxattr,
-+ .listxattr = cgroup_listxattr,
-+ .removexattr = cgroup_removexattr,
-+};
-+
-+/*
-+ * Check if a file is a control file
-+ */
-+static inline struct cftype *__file_cft(struct file *file)
-+{
-+ if (file_inode(file)->i_fop != &cgroup_file_operations)
-+ return ERR_PTR(-EINVAL);
-+ return __d_cft(file->f_dentry);
-+}
-+
-+static int cgroup_create_file(struct dentry *dentry, umode_t mode,
-+ struct super_block *sb)
-+{
-+ struct inode *inode;
-+
-+ if (!dentry)
-+ return -ENOENT;
-+ if (dentry->d_inode)
-+ return -EEXIST;
-+
-+ inode = cgroup_new_inode(mode, sb);
-+ if (!inode)
-+ return -ENOMEM;
-+
-+ if (S_ISDIR(mode)) {
-+ inode->i_op = &cgroup_dir_inode_operations;
-+ inode->i_fop = &simple_dir_operations;
-+
-+ /* start off with i_nlink == 2 (for "." entry) */
-+ inc_nlink(inode);
-+ inc_nlink(dentry->d_parent->d_inode);
-+
-+ /*
-+ * Control reaches here with cgroup_mutex held.
-+ * @inode->i_mutex should nest outside cgroup_mutex but we
-+ * want to populate it immediately without releasing
-+ * cgroup_mutex. As @inode isn't visible to anyone else
-+ * yet, trylock will always succeed without affecting
-+ * lockdep checks.
-+ */
-+ WARN_ON_ONCE(!mutex_trylock(&inode->i_mutex));
-+ } else if (S_ISREG(mode)) {
-+ inode->i_size = 0;
-+ inode->i_fop = &cgroup_file_operations;
-+ inode->i_op = &cgroup_file_inode_operations;
-+ }
-+ d_instantiate(dentry, inode);
-+ dget(dentry); /* Extra count - pin the dentry in core */
-+ return 0;
-+}
-+
-+/**
-+ * cgroup_file_mode - deduce file mode of a control file
-+ * @cft: the control file in question
-+ *
-+ * returns cft->mode if ->mode is not 0
-+ * returns S_IRUGO|S_IWUSR if it has both a read and a write handler
-+ * returns S_IRUGO if it has only a read handler
-+ * returns S_IWUSR if it has only a write hander
-+ */
-+static umode_t cgroup_file_mode(const struct cftype *cft)
-+{
-+ umode_t mode = 0;
-+
-+ if (cft->mode)
-+ return cft->mode;
-+
-+ if (cft->read || cft->read_u64 || cft->read_s64 ||
-+ cft->read_map || cft->read_seq_string)
-+ mode |= S_IRUGO;
-+
-+ if (cft->write || cft->write_u64 || cft->write_s64 ||
-+ cft->write_string || cft->trigger)
-+ mode |= S_IWUSR;
-+
-+ return mode;
-+}
-+
-+static int cgroup_add_file(struct cgroup *cgrp, struct cftype *cft)
-+{
-+ struct dentry *dir = cgrp->dentry;
-+ struct cgroup *parent = __d_cgrp(dir);
-+ struct dentry *dentry;
-+ struct cfent *cfe;
-+ int error;
-+ umode_t mode;
-+ char name[MAX_CGROUP_TYPE_NAMELEN + MAX_CFTYPE_NAME + 2] = { 0 };
-+
-+ if (cft->ss && !(cft->flags & CFTYPE_NO_PREFIX) &&
-+ !(cgrp->root->flags & CGRP_ROOT_NOPREFIX)) {
-+ strcpy(name, cft->ss->name);
-+ strcat(name, ".");
-+ }
-+ strcat(name, cft->name);
-+
-+ BUG_ON(!mutex_is_locked(&dir->d_inode->i_mutex));
-+
-+ cfe = kzalloc(sizeof(*cfe), GFP_KERNEL);
-+ if (!cfe)
-+ return -ENOMEM;
-+
-+ dentry = lookup_one_len(name, dir, strlen(name));
-+ if (IS_ERR(dentry)) {
-+ error = PTR_ERR(dentry);
-+ goto out;
-+ }
-+
-+ cfe->type = (void *)cft;
-+ cfe->dentry = dentry;
-+ dentry->d_fsdata = cfe;
-+ simple_xattrs_init(&cfe->xattrs);
-+
-+ mode = cgroup_file_mode(cft);
-+ error = cgroup_create_file(dentry, mode | S_IFREG, cgrp->root->sb);
-+ if (!error) {
-+ list_add_tail(&cfe->node, &parent->files);
-+ cfe = NULL;
-+ }
-+ dput(dentry);
-+out:
-+ kfree(cfe);
-+ return error;
-+}
-+
-+/**
-+ * cgroup_addrm_files - add or remove files to a cgroup directory
-+ * @cgrp: the target cgroup
-+ * @cfts: array of cftypes to be added
-+ * @is_add: whether to add or remove
-+ *
-+ * Depending on @is_add, add or remove files defined by @cfts on @cgrp.
-+ * For removals, this function never fails. If addition fails, this
-+ * function doesn't remove files already added. The caller is responsible
-+ * for cleaning up.
-+ */
-+static int cgroup_addrm_files(struct cgroup *cgrp, struct cftype cfts[],
-+ bool is_add)
-+{
-+ struct cftype *cft;
-+ int ret;
-+
-+ lockdep_assert_held(&cgrp->dentry->d_inode->i_mutex);
-+ lockdep_assert_held(&cgroup_mutex);
-+
-+ for (cft = cfts; cft->name[0] != '\0'; cft++) {
-+ /* does cft->flags tell us to skip this file on @cgrp? */
-+ if ((cft->flags & CFTYPE_INSANE) && cgroup_sane_behavior(cgrp))
-+ continue;
-+ if ((cft->flags & CFTYPE_NOT_ON_ROOT) && !cgrp->parent)
-+ continue;
-+ if ((cft->flags & CFTYPE_ONLY_ON_ROOT) && cgrp->parent)
-+ continue;
-+
-+ if (is_add) {
-+ ret = cgroup_add_file(cgrp, cft);
-+ if (ret) {
-+ pr_warn("cgroup_addrm_files: failed to add %s, err=%d\n",
-+ cft->name, ret);
-+ return ret;
-+ }
-+ } else {
-+ cgroup_rm_file(cgrp, cft);
-+ }
-+ }
-+ return 0;
-+}
-+
-+static void cgroup_cfts_prepare(void)
-+ __acquires(&cgroup_mutex)
-+{
-+ /*
-+ * Thanks to the entanglement with vfs inode locking, we can't walk
-+ * the existing cgroups under cgroup_mutex and create files.
-+ * Instead, we use css_for_each_descendant_pre() and drop RCU read
-+ * lock before calling cgroup_addrm_files().
-+ */
-+ mutex_lock(&cgroup_mutex);
-+}
-+
-+static int cgroup_cfts_commit(struct cftype *cfts, bool is_add)
-+ __releases(&cgroup_mutex)
-+{
-+ LIST_HEAD(pending);
-+ struct cgroup_subsys *ss = cfts[0].ss;
-+ struct cgroup *root = &ss->root->top_cgroup;
-+ struct super_block *sb = ss->root->sb;
-+ struct dentry *prev = NULL;
-+ struct inode *inode;
-+ struct cgroup_subsys_state *css;
-+ u64 update_before;
-+ int ret = 0;
-+
-+ /* %NULL @cfts indicates abort and don't bother if @ss isn't attached */
-+ if (!cfts || ss->root == &cgroup_dummy_root ||
-+ !atomic_inc_not_zero(&sb->s_active)) {
-+ mutex_unlock(&cgroup_mutex);
-+ return 0;
-+ }
-+
-+ /*
-+ * All cgroups which are created after we drop cgroup_mutex will
-+ * have the updated set of files, so we only need to update the
-+ * cgroups created before the current @cgroup_serial_nr_next.
-+ */
-+ update_before = cgroup_serial_nr_next;
-+
-+ /* add/rm files for all cgroups created before */
-+ css_for_each_descendant_pre(css, cgroup_css(root, ss)) {
-+ struct cgroup *cgrp = css->cgroup;
-+
-+ if (cgroup_is_dead(cgrp))
-+ continue;
-+
-+ inode = cgrp->dentry->d_inode;
-+ dget(cgrp->dentry);
-+ dput(prev);
-+ prev = cgrp->dentry;
-+
-+ mutex_unlock(&cgroup_mutex);
-+ mutex_lock(&inode->i_mutex);
-+ mutex_lock(&cgroup_mutex);
-+ if (cgrp->serial_nr < update_before && !cgroup_is_dead(cgrp))
-+ ret = cgroup_addrm_files(cgrp, cfts, is_add);
-+ mutex_unlock(&inode->i_mutex);
-+ if (ret)
-+ break;
-+ }
-+ mutex_unlock(&cgroup_mutex);
-+ dput(prev);
-+ deactivate_super(sb);
-+ return ret;
-+}
-+
-+/**
-+ * cgroup_add_cftypes - add an array of cftypes to a subsystem
-+ * @ss: target cgroup subsystem
-+ * @cfts: zero-length name terminated array of cftypes
-+ *
-+ * Register @cfts to @ss. Files described by @cfts are created for all
-+ * existing cgroups to which @ss is attached and all future cgroups will
-+ * have them too. This function can be called anytime whether @ss is
-+ * attached or not.
-+ *
-+ * Returns 0 on successful registration, -errno on failure. Note that this
-+ * function currently returns 0 as long as @cfts registration is successful
-+ * even if some file creation attempts on existing cgroups fail.
-+ */
-+int cgroup_add_cftypes(struct cgroup_subsys *ss, struct cftype *cfts)
-+{
-+ struct cftype_set *set;
-+ struct cftype *cft;
-+ int ret;
-+
-+ set = kzalloc(sizeof(*set), GFP_KERNEL);
-+ if (!set)
-+ return -ENOMEM;
-+
-+ for (cft = cfts; cft->name[0] != '\0'; cft++)
-+ cft->ss = ss;
-+
-+ cgroup_cfts_prepare();
-+ set->cfts = cfts;
-+ list_add_tail(&set->node, &ss->cftsets);
-+ ret = cgroup_cfts_commit(cfts, true);
-+ if (ret)
-+ cgroup_rm_cftypes(cfts);
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(cgroup_add_cftypes);
-+
-+/**
-+ * cgroup_rm_cftypes - remove an array of cftypes from a subsystem
-+ * @cfts: zero-length name terminated array of cftypes
-+ *
-+ * Unregister @cfts. Files described by @cfts are removed from all
-+ * existing cgroups and all future cgroups won't have them either. This
-+ * function can be called anytime whether @cfts' subsys is attached or not.
-+ *
-+ * Returns 0 on successful unregistration, -ENOENT if @cfts is not
-+ * registered.
-+ */
-+int cgroup_rm_cftypes(struct cftype *cfts)
-+{
-+ struct cftype_set *set;
-+
-+ if (!cfts || !cfts[0].ss)
-+ return -ENOENT;
-+
-+ cgroup_cfts_prepare();
-+
-+ list_for_each_entry(set, &cfts[0].ss->cftsets, node) {
-+ if (set->cfts == cfts) {
-+ list_del(&set->node);
-+ kfree(set);
-+ cgroup_cfts_commit(cfts, false);
-+ return 0;
-+ }
-+ }
-+
-+ cgroup_cfts_commit(NULL, false);
-+ return -ENOENT;
-+}
-+
-+/**
-+ * cgroup_task_count - count the number of tasks in a cgroup.
-+ * @cgrp: the cgroup in question
-+ *
-+ * Return the number of tasks in the cgroup.
-+ */
-+int cgroup_task_count(const struct cgroup *cgrp)
-+{
-+ int count = 0;
-+ struct cgrp_cset_link *link;
-+
-+ read_lock(&css_set_lock);
-+ list_for_each_entry(link, &cgrp->cset_links, cset_link)
-+ count += atomic_read(&link->cset->refcount);
-+ read_unlock(&css_set_lock);
-+ return count;
-+}
-+
-+/*
-+ * To reduce the fork() overhead for systems that are not actually using
-+ * their cgroups capability, we don't maintain the lists running through
-+ * each css_set to its tasks until we see the list actually used - in other
-+ * words after the first call to css_task_iter_start().
-+ */
-+static void cgroup_enable_task_cg_lists(void)
-+{
-+ struct task_struct *p, *g;
-+ write_lock(&css_set_lock);
-+ use_task_css_set_links = 1;
-+ /*
-+ * We need tasklist_lock because RCU is not safe against
-+ * while_each_thread(). Besides, a forking task that has passed
-+ * cgroup_post_fork() without seeing use_task_css_set_links = 1
-+ * is not guaranteed to have its child immediately visible in the
-+ * tasklist if we walk through it with RCU.
-+ */
-+ read_lock(&tasklist_lock);
-+ do_each_thread(g, p) {
-+ task_lock(p);
-+ /*
-+ * We should check if the process is exiting, otherwise
-+ * it will race with cgroup_exit() in that the list
-+ * entry won't be deleted though the process has exited.
-+ * Do it while holding siglock so that we don't end up
-+ * racing against cgroup_exit().
-+ */
-+ spin_lock_irq(&p->sighand->siglock);
-+ if (!(p->flags & PF_EXITING) && list_empty(&p->cg_list))
-+ list_add(&p->cg_list, &task_css_set(p)->tasks);
-+ spin_unlock_irq(&p->sighand->siglock);
-+
-+ task_unlock(p);
-+ } while_each_thread(g, p);
-+ read_unlock(&tasklist_lock);
-+ write_unlock(&css_set_lock);
-+}
-+
-+/**
-+ * css_next_child - find the next child of a given css
-+ * @pos_css: the current position (%NULL to initiate traversal)
-+ * @parent_css: css whose children to walk
-+ *
-+ * This function returns the next child of @parent_css and should be called
-+ * under RCU read lock. The only requirement is that @parent_css and
-+ * @pos_css are accessible. The next sibling is guaranteed to be returned
-+ * regardless of their states.
-+ */
-+struct cgroup_subsys_state *
-+css_next_child(struct cgroup_subsys_state *pos_css,
-+ struct cgroup_subsys_state *parent_css)
-+{
-+ struct cgroup *pos = pos_css ? pos_css->cgroup : NULL;
-+ struct cgroup *cgrp = parent_css->cgroup;
-+ struct cgroup *next;
-+
-+ WARN_ON_ONCE(!rcu_read_lock_held());
-+
-+ /*
-+ * @pos could already have been removed. Once a cgroup is removed,
-+ * its ->sibling.next is no longer updated when its next sibling
-+ * changes. As CGRP_DEAD assertion is serialized and happens
-+ * before the cgroup is taken off the ->sibling list, if we see it
-+ * unasserted, it's guaranteed that the next sibling hasn't
-+ * finished its grace period even if it's already removed, and thus
-+ * safe to dereference from this RCU critical section. If
-+ * ->sibling.next is inaccessible, cgroup_is_dead() is guaranteed
-+ * to be visible as %true here.
-+ *
-+ * If @pos is dead, its next pointer can't be dereferenced;
-+ * however, as each cgroup is given a monotonically increasing
-+ * unique serial number and always appended to the sibling list,
-+ * the next one can be found by walking the parent's children until
-+ * we see a cgroup with higher serial number than @pos's. While
-+ * this path can be slower, it's taken only when either the current
-+ * cgroup is removed or iteration and removal race.
-+ */
-+ if (!pos) {
-+ next = list_entry_rcu(cgrp->children.next, struct cgroup, sibling);
-+ } else if (likely(!cgroup_is_dead(pos))) {
-+ next = list_entry_rcu(pos->sibling.next, struct cgroup, sibling);
-+ } else {
-+ list_for_each_entry_rcu(next, &cgrp->children, sibling)
-+ if (next->serial_nr > pos->serial_nr)
-+ break;
-+ }
-+
-+ if (&next->sibling == &cgrp->children)
-+ return NULL;
-+
-+ return cgroup_css(next, parent_css->ss);
-+}
-+EXPORT_SYMBOL_GPL(css_next_child);
-+
-+/**
-+ * css_next_descendant_pre - find the next descendant for pre-order walk
-+ * @pos: the current position (%NULL to initiate traversal)
-+ * @root: css whose descendants to walk
-+ *
-+ * To be used by css_for_each_descendant_pre(). Find the next descendant
-+ * to visit for pre-order traversal of @root's descendants. @root is
-+ * included in the iteration and the first node to be visited.
-+ *
-+ * While this function requires RCU read locking, it doesn't require the
-+ * whole traversal to be contained in a single RCU critical section. This
-+ * function will return the correct next descendant as long as both @pos
-+ * and @root are accessible and @pos is a descendant of @root.
-+ */
-+struct cgroup_subsys_state *
-+css_next_descendant_pre(struct cgroup_subsys_state *pos,
-+ struct cgroup_subsys_state *root)
-+{
-+ struct cgroup_subsys_state *next;
-+
-+ WARN_ON_ONCE(!rcu_read_lock_held());
-+
-+ /* if first iteration, visit @root */
-+ if (!pos)
-+ return root;
-+
-+ /* visit the first child if exists */
-+ next = css_next_child(NULL, pos);
-+ if (next)
-+ return next;
-+
-+ /* no child, visit my or the closest ancestor's next sibling */
-+ while (pos != root) {
-+ next = css_next_child(pos, css_parent(pos));
-+ if (next)
-+ return next;
-+ pos = css_parent(pos);
-+ }
-+
-+ return NULL;
-+}
-+EXPORT_SYMBOL_GPL(css_next_descendant_pre);
-+
-+/**
-+ * css_rightmost_descendant - return the rightmost descendant of a css
-+ * @pos: css of interest
-+ *
-+ * Return the rightmost descendant of @pos. If there's no descendant, @pos
-+ * is returned. This can be used during pre-order traversal to skip
-+ * subtree of @pos.
-+ *
-+ * While this function requires RCU read locking, it doesn't require the
-+ * whole traversal to be contained in a single RCU critical section. This
-+ * function will return the correct rightmost descendant as long as @pos is
-+ * accessible.
-+ */
-+struct cgroup_subsys_state *
-+css_rightmost_descendant(struct cgroup_subsys_state *pos)
-+{
-+ struct cgroup_subsys_state *last, *tmp;
-+
-+ WARN_ON_ONCE(!rcu_read_lock_held());
-+
-+ do {
-+ last = pos;
-+ /* ->prev isn't RCU safe, walk ->next till the end */
-+ pos = NULL;
-+ css_for_each_child(tmp, last)
-+ pos = tmp;
-+ } while (pos);
-+
-+ return last;
-+}
-+EXPORT_SYMBOL_GPL(css_rightmost_descendant);
-+
-+static struct cgroup_subsys_state *
-+css_leftmost_descendant(struct cgroup_subsys_state *pos)
-+{
-+ struct cgroup_subsys_state *last;
-+
-+ do {
-+ last = pos;
-+ pos = css_next_child(NULL, pos);
-+ } while (pos);
-+
-+ return last;
-+}
-+
-+/**
-+ * css_next_descendant_post - find the next descendant for post-order walk
-+ * @pos: the current position (%NULL to initiate traversal)
-+ * @root: css whose descendants to walk
-+ *
-+ * To be used by css_for_each_descendant_post(). Find the next descendant
-+ * to visit for post-order traversal of @root's descendants. @root is
-+ * included in the iteration and the last node to be visited.
-+ *
-+ * While this function requires RCU read locking, it doesn't require the
-+ * whole traversal to be contained in a single RCU critical section. This
-+ * function will return the correct next descendant as long as both @pos
-+ * and @cgroup are accessible and @pos is a descendant of @cgroup.
-+ */
-+struct cgroup_subsys_state *
-+css_next_descendant_post(struct cgroup_subsys_state *pos,
-+ struct cgroup_subsys_state *root)
-+{
-+ struct cgroup_subsys_state *next;
-+
-+ WARN_ON_ONCE(!rcu_read_lock_held());
-+
-+ /* if first iteration, visit leftmost descendant which may be @root */
-+ if (!pos)
-+ return css_leftmost_descendant(root);
-+
-+ /* if we visited @root, we're done */
-+ if (pos == root)
-+ return NULL;
-+
-+ /* if there's an unvisited sibling, visit its leftmost descendant */
-+ next = css_next_child(pos, css_parent(pos));
-+ if (next)
-+ return css_leftmost_descendant(next);
-+
-+ /* no sibling left, visit parent */
-+ return css_parent(pos);
-+}
-+EXPORT_SYMBOL_GPL(css_next_descendant_post);
-+
-+/**
-+ * css_advance_task_iter - advance a task itererator to the next css_set
-+ * @it: the iterator to advance
-+ *
-+ * Advance @it to the next css_set to walk.
-+ */
-+static void css_advance_task_iter(struct css_task_iter *it)
-+{
-+ struct list_head *l = it->cset_link;
-+ struct cgrp_cset_link *link;
-+ struct css_set *cset;
-+
-+ /* Advance to the next non-empty css_set */
-+ do {
-+ l = l->next;
-+ if (l == &it->origin_css->cgroup->cset_links) {
-+ it->cset_link = NULL;
-+ return;
-+ }
-+ link = list_entry(l, struct cgrp_cset_link, cset_link);
-+ cset = link->cset;
-+ } while (list_empty(&cset->tasks));
-+ it->cset_link = l;
-+ it->task = cset->tasks.next;
-+}
-+
-+/**
-+ * css_task_iter_start - initiate task iteration
-+ * @css: the css to walk tasks of
-+ * @it: the task iterator to use
-+ *
-+ * Initiate iteration through the tasks of @css. The caller can call
-+ * css_task_iter_next() to walk through the tasks until the function
-+ * returns NULL. On completion of iteration, css_task_iter_end() must be
-+ * called.
-+ *
-+ * Note that this function acquires a lock which is released when the
-+ * iteration finishes. The caller can't sleep while iteration is in
-+ * progress.
-+ */
-+void css_task_iter_start(struct cgroup_subsys_state *css,
-+ struct css_task_iter *it)
-+ __acquires(css_set_lock)
-+{
-+ /*
-+ * The first time anyone tries to iterate across a css, we need to
-+ * enable the list linking each css_set to its tasks, and fix up
-+ * all existing tasks.
-+ */
-+ if (!use_task_css_set_links)
-+ cgroup_enable_task_cg_lists();
-+
-+ read_lock(&css_set_lock);
-+
-+ it->origin_css = css;
-+ it->cset_link = &css->cgroup->cset_links;
-+
-+ css_advance_task_iter(it);
-+}
-+
-+/**
-+ * css_task_iter_next - return the next task for the iterator
-+ * @it: the task iterator being iterated
-+ *
-+ * The "next" function for task iteration. @it should have been
-+ * initialized via css_task_iter_start(). Returns NULL when the iteration
-+ * reaches the end.
-+ */
-+struct task_struct *css_task_iter_next(struct css_task_iter *it)
-+{
-+ struct task_struct *res;
-+ struct list_head *l = it->task;
-+ struct cgrp_cset_link *link;
-+
-+ /* If the iterator cg is NULL, we have no tasks */
-+ if (!it->cset_link)
-+ return NULL;
-+ res = list_entry(l, struct task_struct, cg_list);
-+ /* Advance iterator to find next entry */
-+ l = l->next;
-+ link = list_entry(it->cset_link, struct cgrp_cset_link, cset_link);
-+ if (l == &link->cset->tasks) {
-+ /*
-+ * We reached the end of this task list - move on to the
-+ * next cgrp_cset_link.
-+ */
-+ css_advance_task_iter(it);
-+ } else {
-+ it->task = l;
-+ }
-+ return res;
-+}
-+
-+/**
-+ * css_task_iter_end - finish task iteration
-+ * @it: the task iterator to finish
-+ *
-+ * Finish task iteration started by css_task_iter_start().
-+ */
-+void css_task_iter_end(struct css_task_iter *it)
-+ __releases(css_set_lock)
-+{
-+ read_unlock(&css_set_lock);
-+}
-+
-+static inline int started_after_time(struct task_struct *t1,
-+ struct timespec *time,
-+ struct task_struct *t2)
-+{
-+ int start_diff = timespec_compare(&t1->start_time, time);
-+ if (start_diff > 0) {
-+ return 1;
-+ } else if (start_diff < 0) {
-+ return 0;
-+ } else {
-+ /*
-+ * Arbitrarily, if two processes started at the same
-+ * time, we'll say that the lower pointer value
-+ * started first. Note that t2 may have exited by now
-+ * so this may not be a valid pointer any longer, but
-+ * that's fine - it still serves to distinguish
-+ * between two tasks started (effectively) simultaneously.
-+ */
-+ return t1 > t2;
-+ }
-+}
-+
-+/*
-+ * This function is a callback from heap_insert() and is used to order
-+ * the heap.
-+ * In this case we order the heap in descending task start time.
-+ */
-+static inline int started_after(void *p1, void *p2)
-+{
-+ struct task_struct *t1 = p1;
-+ struct task_struct *t2 = p2;
-+ return started_after_time(t1, &t2->start_time, t2);
-+}
-+
-+/**
-+ * css_scan_tasks - iterate though all the tasks in a css
-+ * @css: the css to iterate tasks of
-+ * @test: optional test callback
-+ * @process: process callback
-+ * @data: data passed to @test and @process
-+ * @heap: optional pre-allocated heap used for task iteration
-+ *
-+ * Iterate through all the tasks in @css, calling @test for each, and if it
-+ * returns %true, call @process for it also.
-+ *
-+ * @test may be NULL, meaning always true (select all tasks), which
-+ * effectively duplicates css_task_iter_{start,next,end}() but does not
-+ * lock css_set_lock for the call to @process.
-+ *
-+ * It is guaranteed that @process will act on every task that is a member
-+ * of @css for the duration of this call. This function may or may not
-+ * call @process for tasks that exit or move to a different css during the
-+ * call, or are forked or move into the css during the call.
-+ *
-+ * Note that @test may be called with locks held, and may in some
-+ * situations be called multiple times for the same task, so it should be
-+ * cheap.
-+ *
-+ * If @heap is non-NULL, a heap has been pre-allocated and will be used for
-+ * heap operations (and its "gt" member will be overwritten), else a
-+ * temporary heap will be used (allocation of which may cause this function
-+ * to fail).
-+ */
-+int css_scan_tasks(struct cgroup_subsys_state *css,
-+ bool (*test)(struct task_struct *, void *),
-+ void (*process)(struct task_struct *, void *),
-+ void *data, struct ptr_heap *heap)
-+{
-+ int retval, i;
-+ struct css_task_iter it;
-+ struct task_struct *p, *dropped;
-+ /* Never dereference latest_task, since it's not refcounted */
-+ struct task_struct *latest_task = NULL;
-+ struct ptr_heap tmp_heap;
-+ struct timespec latest_time = { 0, 0 };
-+
-+ if (heap) {
-+ /* The caller supplied our heap and pre-allocated its memory */
-+ heap->gt = &started_after;
-+ } else {
-+ /* We need to allocate our own heap memory */
-+ heap = &tmp_heap;
-+ retval = heap_init(heap, PAGE_SIZE, GFP_KERNEL, &started_after);
-+ if (retval)
-+ /* cannot allocate the heap */
-+ return retval;
-+ }
-+
-+ again:
-+ /*
-+ * Scan tasks in the css, using the @test callback to determine
-+ * which are of interest, and invoking @process callback on the
-+ * ones which need an update. Since we don't want to hold any
-+ * locks during the task updates, gather tasks to be processed in a
-+ * heap structure. The heap is sorted by descending task start
-+ * time. If the statically-sized heap fills up, we overflow tasks
-+ * that started later, and in future iterations only consider tasks
-+ * that started after the latest task in the previous pass. This
-+ * guarantees forward progress and that we don't miss any tasks.
-+ */
-+ heap->size = 0;
-+ css_task_iter_start(css, &it);
-+ while ((p = css_task_iter_next(&it))) {
-+ /*
-+ * Only affect tasks that qualify per the caller's callback,
-+ * if he provided one
-+ */
-+ if (test && !test(p, data))
-+ continue;
-+ /*
-+ * Only process tasks that started after the last task
-+ * we processed
-+ */
-+ if (!started_after_time(p, &latest_time, latest_task))
-+ continue;
-+ dropped = heap_insert(heap, p);
-+ if (dropped == NULL) {
-+ /*
-+ * The new task was inserted; the heap wasn't
-+ * previously full
-+ */
-+ get_task_struct(p);
-+ } else if (dropped != p) {
-+ /*
-+ * The new task was inserted, and pushed out a
-+ * different task
-+ */
-+ get_task_struct(p);
-+ put_task_struct(dropped);
-+ }
-+ /*
-+ * Else the new task was newer than anything already in
-+ * the heap and wasn't inserted
-+ */
-+ }
-+ css_task_iter_end(&it);
-+
-+ if (heap->size) {
-+ for (i = 0; i < heap->size; i++) {
-+ struct task_struct *q = heap->ptrs[i];
-+ if (i == 0) {
-+ latest_time = q->start_time;
-+ latest_task = q;
-+ }
-+ /* Process the task per the caller's callback */
-+ process(q, data);
-+ put_task_struct(q);
-+ }
-+ /*
-+ * If we had to process any tasks at all, scan again
-+ * in case some of them were in the middle of forking
-+ * children that didn't get processed.
-+ * Not the most efficient way to do it, but it avoids
-+ * having to take callback_mutex in the fork path
-+ */
-+ goto again;
-+ }
-+ if (heap == &tmp_heap)
-+ heap_free(&tmp_heap);
-+ return 0;
-+}
-+
-+static void cgroup_transfer_one_task(struct task_struct *task, void *data)
-+{
-+ struct cgroup *new_cgroup = data;
-+
-+ mutex_lock(&cgroup_mutex);
-+ cgroup_attach_task(new_cgroup, task, false);
-+ mutex_unlock(&cgroup_mutex);
-+}
-+
-+/**
-+ * cgroup_trasnsfer_tasks - move tasks from one cgroup to another
-+ * @to: cgroup to which the tasks will be moved
-+ * @from: cgroup in which the tasks currently reside
-+ */
-+int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)
-+{
-+ return css_scan_tasks(&from->dummy_css, NULL, cgroup_transfer_one_task,
-+ to, NULL);
-+}
-+
-+/*
-+ * Stuff for reading the 'tasks'/'procs' files.
-+ *
-+ * Reading this file can return large amounts of data if a cgroup has
-+ * *lots* of attached tasks. So it may need several calls to read(),
-+ * but we cannot guarantee that the information we produce is correct
-+ * unless we produce it entirely atomically.
-+ *
-+ */
-+
-+/* which pidlist file are we talking about? */
-+enum cgroup_filetype {
-+ CGROUP_FILE_PROCS,
-+ CGROUP_FILE_TASKS,
-+};
-+
-+/*
-+ * A pidlist is a list of pids that virtually represents the contents of one
-+ * of the cgroup files ("procs" or "tasks"). We keep a list of such pidlists,
-+ * a pair (one each for procs, tasks) for each pid namespace that's relevant
-+ * to the cgroup.
-+ */
-+struct cgroup_pidlist {
-+ /*
-+ * used to find which pidlist is wanted. doesn't change as long as
-+ * this particular list stays in the list.
-+ */
-+ struct { enum cgroup_filetype type; struct pid_namespace *ns; } key;
-+ /* array of xids */
-+ pid_t *list;
-+ /* how many elements the above list has */
-+ int length;
-+ /* how many files are using the current array */
-+ int use_count;
-+ /* each of these stored in a list by its cgroup */
-+ struct list_head links;
-+ /* pointer to the cgroup we belong to, for list removal purposes */
-+ struct cgroup *owner;
-+ /* protects the other fields */
-+ struct rw_semaphore rwsem;
-+};
-+
-+/*
-+ * The following two functions "fix" the issue where there are more pids
-+ * than kmalloc will give memory for; in such cases, we use vmalloc/vfree.
-+ * TODO: replace with a kernel-wide solution to this problem
-+ */
-+#define PIDLIST_TOO_LARGE(c) ((c) * sizeof(pid_t) > (PAGE_SIZE * 2))
-+static void *pidlist_allocate(int count)
-+{
-+ if (PIDLIST_TOO_LARGE(count))
-+ return vmalloc(count * sizeof(pid_t));
-+ else
-+ return kmalloc(count * sizeof(pid_t), GFP_KERNEL);
-+}
-+static void pidlist_free(void *p)
-+{
-+ if (is_vmalloc_addr(p))
-+ vfree(p);
-+ else
-+ kfree(p);
-+}
-+
-+/*
-+ * pidlist_uniq - given a kmalloc()ed list, strip out all duplicate entries
-+ * Returns the number of unique elements.
-+ */
-+static int pidlist_uniq(pid_t *list, int length)
-+{
-+ int src, dest = 1;
-+
-+ /*
-+ * we presume the 0th element is unique, so i starts at 1. trivial
-+ * edge cases first; no work needs to be done for either
-+ */
-+ if (length == 0 || length == 1)
-+ return length;
-+ /* src and dest walk down the list; dest counts unique elements */
-+ for (src = 1; src < length; src++) {
-+ /* find next unique element */
-+ while (list[src] == list[src-1]) {
-+ src++;
-+ if (src == length)
-+ goto after;
-+ }
-+ /* dest always points to where the next unique element goes */
-+ list[dest] = list[src];
-+ dest++;
-+ }
-+after:
-+ return dest;
-+}
-+
-+static int cmppid(const void *a, const void *b)
-+{
-+ return *(pid_t *)a - *(pid_t *)b;
-+}
-+
-+/*
-+ * find the appropriate pidlist for our purpose (given procs vs tasks)
-+ * returns with the lock on that pidlist already held, and takes care
-+ * of the use count, or returns NULL with no locks held if we're out of
-+ * memory.
-+ */
-+static struct cgroup_pidlist *cgroup_pidlist_find(struct cgroup *cgrp,
-+ enum cgroup_filetype type)
-+{
-+ struct cgroup_pidlist *l;
-+ /* don't need task_nsproxy() if we're looking at ourself */
-+ struct pid_namespace *ns = task_active_pid_ns(current);
-+
-+ /*
-+ * We can't drop the pidlist_mutex before taking the l->rwsem in case
-+ * the last ref-holder is trying to remove l from the list at the same
-+ * time. Holding the pidlist_mutex precludes somebody taking whichever
-+ * list we find out from under us - compare release_pid_array().
-+ */
-+ mutex_lock(&cgrp->pidlist_mutex);
-+ list_for_each_entry(l, &cgrp->pidlists, links) {
-+ if (l->key.type == type && l->key.ns == ns) {
-+ /* make sure l doesn't vanish out from under us */
-+ down_write(&l->rwsem);
-+ mutex_unlock(&cgrp->pidlist_mutex);
-+ return l;
-+ }
-+ }
-+ /* entry not found; create a new one */
-+ l = kzalloc(sizeof(struct cgroup_pidlist), GFP_KERNEL);
-+ if (!l) {
-+ mutex_unlock(&cgrp->pidlist_mutex);
-+ return l;
-+ }
-+ init_rwsem(&l->rwsem);
-+ down_write(&l->rwsem);
-+ l->key.type = type;
-+ l->key.ns = get_pid_ns(ns);
-+ l->owner = cgrp;
-+ list_add(&l->links, &cgrp->pidlists);
-+ mutex_unlock(&cgrp->pidlist_mutex);
-+ return l;
-+}
-+
-+/*
-+ * Load a cgroup's pidarray with either procs' tgids or tasks' pids
-+ */
-+static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type,
-+ struct cgroup_pidlist **lp)
-+{
-+ pid_t *array;
-+ int length;
-+ int pid, n = 0; /* used for populating the array */
-+ struct css_task_iter it;
-+ struct task_struct *tsk;
-+ struct cgroup_pidlist *l;
-+
-+ /*
-+ * If cgroup gets more users after we read count, we won't have
-+ * enough space - tough. This race is indistinguishable to the
-+ * caller from the case that the additional cgroup users didn't
-+ * show up until sometime later on.
-+ */
-+ length = cgroup_task_count(cgrp);
-+ array = pidlist_allocate(length);
-+ if (!array)
-+ return -ENOMEM;
-+ /* now, populate the array */
-+ css_task_iter_start(&cgrp->dummy_css, &it);
-+ while ((tsk = css_task_iter_next(&it))) {
-+ if (unlikely(n == length))
-+ break;
-+ /* get tgid or pid for procs or tasks file respectively */
-+ if (type == CGROUP_FILE_PROCS)
-+ pid = task_tgid_vnr(tsk);
-+ else
-+ pid = task_pid_vnr(tsk);
-+ if (pid > 0) /* make sure to only use valid results */
-+ array[n++] = pid;
-+ }
-+ css_task_iter_end(&it);
-+ length = n;
-+ /* now sort & (if procs) strip out duplicates */
-+ sort(array, length, sizeof(pid_t), cmppid, NULL);
-+ if (type == CGROUP_FILE_PROCS)
-+ length = pidlist_uniq(array, length);
-+ l = cgroup_pidlist_find(cgrp, type);
-+ if (!l) {
-+ pidlist_free(array);
-+ return -ENOMEM;
-+ }
-+ /* store array, freeing old if necessary - lock already held */
-+ pidlist_free(l->list);
-+ l->list = array;
-+ l->length = length;
-+ l->use_count++;
-+ up_write(&l->rwsem);
-+ *lp = l;
-+ return 0;
-+}
-+
-+/**
-+ * cgroupstats_build - build and fill cgroupstats
-+ * @stats: cgroupstats to fill information into
-+ * @dentry: A dentry entry belonging to the cgroup for which stats have
-+ * been requested.
-+ *
-+ * Build and fill cgroupstats so that taskstats can export it to user
-+ * space.
-+ */
-+int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry)
-+{
-+ int ret = -EINVAL;
-+ struct cgroup *cgrp;
-+ struct css_task_iter it;
-+ struct task_struct *tsk;
-+
-+ /*
-+ * Validate dentry by checking the superblock operations,
-+ * and make sure it's a directory.
-+ */
-+ if (dentry->d_sb->s_op != &cgroup_ops ||
-+ !S_ISDIR(dentry->d_inode->i_mode))
-+ goto err;
-+
-+ ret = 0;
-+ cgrp = dentry->d_fsdata;
-+
-+ css_task_iter_start(&cgrp->dummy_css, &it);
-+ while ((tsk = css_task_iter_next(&it))) {
-+ switch (tsk->state) {
-+ case TASK_RUNNING:
-+ stats->nr_running++;
-+ break;
-+ case TASK_INTERRUPTIBLE:
-+ stats->nr_sleeping++;
-+ break;
-+ case TASK_UNINTERRUPTIBLE:
-+ stats->nr_uninterruptible++;
-+ break;
-+ case TASK_STOPPED:
-+ stats->nr_stopped++;
-+ break;
-+ default:
-+ if (delayacct_is_task_waiting_on_io(tsk))
-+ stats->nr_io_wait++;
-+ break;
-+ }
-+ }
-+ css_task_iter_end(&it);
-+
-+err:
-+ return ret;
-+}
-+
-+
-+/*
-+ * seq_file methods for the tasks/procs files. The seq_file position is the
-+ * next pid to display; the seq_file iterator is a pointer to the pid
-+ * in the cgroup->l->list array.
-+ */
-+
-+static void *cgroup_pidlist_start(struct seq_file *s, loff_t *pos)
-+{
-+ /*
-+ * Initially we receive a position value that corresponds to
-+ * one more than the last pid shown (or 0 on the first call or
-+ * after a seek to the start). Use a binary-search to find the
-+ * next pid to display, if any
-+ */
-+ struct cgroup_pidlist *l = s->private;
-+ int index = 0, pid = *pos;
-+ int *iter;
-+
-+ down_read(&l->rwsem);
-+ if (pid) {
-+ int end = l->length;
-+
-+ while (index < end) {
-+ int mid = (index + end) / 2;
-+ if (l->list[mid] == pid) {
-+ index = mid;
-+ break;
-+ } else if (l->list[mid] <= pid)
-+ index = mid + 1;
-+ else
-+ end = mid;
-+ }
-+ }
-+ /* If we're off the end of the array, we're done */
-+ if (index >= l->length)
-+ return NULL;
-+ /* Update the abstract position to be the actual pid that we found */
-+ iter = l->list + index;
-+ *pos = *iter;
-+ return iter;
-+}
-+
-+static void cgroup_pidlist_stop(struct seq_file *s, void *v)
-+{
-+ struct cgroup_pidlist *l = s->private;
-+ up_read(&l->rwsem);
-+}
-+
-+static void *cgroup_pidlist_next(struct seq_file *s, void *v, loff_t *pos)
-+{
-+ struct cgroup_pidlist *l = s->private;
-+ pid_t *p = v;
-+ pid_t *end = l->list + l->length;
-+ /*
-+ * Advance to the next pid in the array. If this goes off the
-+ * end, we're done
-+ */
-+ p++;
-+ if (p >= end) {
-+ return NULL;
-+ } else {
-+ *pos = *p;
-+ return p;
-+ }
-+}
-+
-+static int cgroup_pidlist_show(struct seq_file *s, void *v)
-+{
-+ return seq_printf(s, "%d\n", *(int *)v);
-+}
-+
-+/*
-+ * seq_operations functions for iterating on pidlists through seq_file -
-+ * independent of whether it's tasks or procs
-+ */
-+static const struct seq_operations cgroup_pidlist_seq_operations = {
-+ .start = cgroup_pidlist_start,
-+ .stop = cgroup_pidlist_stop,
-+ .next = cgroup_pidlist_next,
-+ .show = cgroup_pidlist_show,
-+};
-+
-+static void cgroup_release_pid_array(struct cgroup_pidlist *l)
-+{
-+ /*
-+ * the case where we're the last user of this particular pidlist will
-+ * have us remove it from the cgroup's list, which entails taking the
-+ * mutex. since in pidlist_find the pidlist->lock depends on cgroup->
-+ * pidlist_mutex, we have to take pidlist_mutex first.
-+ */
-+ mutex_lock(&l->owner->pidlist_mutex);
-+ down_write(&l->rwsem);
-+ BUG_ON(!l->use_count);
-+ if (!--l->use_count) {
-+ /* we're the last user if refcount is 0; remove and free */
-+ list_del(&l->links);
-+ mutex_unlock(&l->owner->pidlist_mutex);
-+ pidlist_free(l->list);
-+ put_pid_ns(l->key.ns);
-+ up_write(&l->rwsem);
-+ kfree(l);
-+ return;
-+ }
-+ mutex_unlock(&l->owner->pidlist_mutex);
-+ up_write(&l->rwsem);
-+}
-+
-+static int cgroup_pidlist_release(struct inode *inode, struct file *file)
-+{
-+ struct cgroup_pidlist *l;
-+ if (!(file->f_mode & FMODE_READ))
-+ return 0;
-+ /*
-+ * the seq_file will only be initialized if the file was opened for
-+ * reading; hence we check if it's not null only in that case.
-+ */
-+ l = ((struct seq_file *)file->private_data)->private;
-+ cgroup_release_pid_array(l);
-+ return seq_release(inode, file);
-+}
-+
-+static const struct file_operations cgroup_pidlist_operations = {
-+ .read = seq_read,
-+ .llseek = seq_lseek,
-+ .write = cgroup_file_write,
-+ .release = cgroup_pidlist_release,
-+};
-+
-+/*
-+ * The following functions handle opens on a file that displays a pidlist
-+ * (tasks or procs). Prepare an array of the process/thread IDs of whoever's
-+ * in the cgroup.
-+ */
-+/* helper function for the two below it */
-+static int cgroup_pidlist_open(struct file *file, enum cgroup_filetype type)
-+{
-+ struct cgroup *cgrp = __d_cgrp(file->f_dentry->d_parent);
-+ struct cgroup_pidlist *l;
-+ int retval;
-+
-+ /* Nothing to do for write-only files */
-+ if (!(file->f_mode & FMODE_READ))
-+ return 0;
-+
-+ /* have the array populated */
-+ retval = pidlist_array_load(cgrp, type, &l);
-+ if (retval)
-+ return retval;
-+ /* configure file information */
-+ file->f_op = &cgroup_pidlist_operations;
-+
-+ retval = seq_open(file, &cgroup_pidlist_seq_operations);
-+ if (retval) {
-+ cgroup_release_pid_array(l);
-+ return retval;
-+ }
-+ ((struct seq_file *)file->private_data)->private = l;
-+ return 0;
-+}
-+static int cgroup_tasks_open(struct inode *unused, struct file *file)
-+{
-+ return cgroup_pidlist_open(file, CGROUP_FILE_TASKS);
-+}
-+static int cgroup_procs_open(struct inode *unused, struct file *file)
-+{
-+ return cgroup_pidlist_open(file, CGROUP_FILE_PROCS);
-+}
-+
-+static u64 cgroup_read_notify_on_release(struct cgroup_subsys_state *css,
-+ struct cftype *cft)
-+{
-+ return notify_on_release(css->cgroup);
-+}
-+
-+static int cgroup_write_notify_on_release(struct cgroup_subsys_state *css,
-+ struct cftype *cft, u64 val)
-+{
-+ clear_bit(CGRP_RELEASABLE, &css->cgroup->flags);
-+ if (val)
-+ set_bit(CGRP_NOTIFY_ON_RELEASE, &css->cgroup->flags);
-+ else
-+ clear_bit(CGRP_NOTIFY_ON_RELEASE, &css->cgroup->flags);
-+ return 0;
-+}
-+
-+/*
-+ * When dput() is called asynchronously, if umount has been done and
-+ * then deactivate_super() in cgroup_free_fn() kills the superblock,
-+ * there's a small window that vfs will see the root dentry with non-zero
-+ * refcnt and trigger BUG().
-+ *
-+ * That's why we hold a reference before dput() and drop it right after.
-+ */
-+static void cgroup_dput(struct cgroup *cgrp)
-+{
-+ struct super_block *sb = cgrp->root->sb;
-+
-+ atomic_inc(&sb->s_active);
-+ dput(cgrp->dentry);
-+ deactivate_super(sb);
-+}
-+
-+/*
-+ * Unregister event and free resources.
-+ *
-+ * Gets called from workqueue.
-+ */
-+static void cgroup_event_remove(struct work_struct *work)
-+{
-+ struct cgroup_event *event = container_of(work, struct cgroup_event,
-+ remove);
-+ struct cgroup_subsys_state *css = event->css;
-+
-+ remove_wait_queue(event->wqh, &event->wait);
-+
-+ event->cft->unregister_event(css, event->cft, event->eventfd);
-+
-+ /* Notify userspace the event is going away. */
-+ eventfd_signal(event->eventfd, 1);
-+
-+ eventfd_ctx_put(event->eventfd);
-+ kfree(event);
-+ css_put(css);
-+}
-+
-+/*
-+ * Gets called on POLLHUP on eventfd when user closes it.
-+ *
-+ * Called with wqh->lock held and interrupts disabled.
-+ */
-+static int cgroup_event_wake(wait_queue_t *wait, unsigned mode,
-+ int sync, void *key)
-+{
-+ struct cgroup_event *event = container_of(wait,
-+ struct cgroup_event, wait);
-+ struct cgroup *cgrp = event->css->cgroup;
-+ unsigned long flags = (unsigned long)key;
-+
-+ if (flags & POLLHUP) {
-+ /*
-+ * If the event has been detached at cgroup removal, we
-+ * can simply return knowing the other side will cleanup
-+ * for us.
-+ *
-+ * We can't race against event freeing since the other
-+ * side will require wqh->lock via remove_wait_queue(),
-+ * which we hold.
-+ */
-+ spin_lock(&cgrp->event_list_lock);
-+ if (!list_empty(&event->list)) {
-+ list_del_init(&event->list);
-+ /*
-+ * We are in atomic context, but cgroup_event_remove()
-+ * may sleep, so we have to call it in workqueue.
-+ */
-+ schedule_work(&event->remove);
-+ }
-+ spin_unlock(&cgrp->event_list_lock);
-+ }
-+
-+ return 0;
-+}
-+
-+static void cgroup_event_ptable_queue_proc(struct file *file,
-+ wait_queue_head_t *wqh, poll_table *pt)
-+{
-+ struct cgroup_event *event = container_of(pt,
-+ struct cgroup_event, pt);
-+
-+ event->wqh = wqh;
-+ add_wait_queue(wqh, &event->wait);
-+}
-+
-+/*
-+ * Parse input and register new cgroup event handler.
-+ *
-+ * Input must be in format '<event_fd> <control_fd> <args>'.
-+ * Interpretation of args is defined by control file implementation.
-+ */
-+static int cgroup_write_event_control(struct cgroup_subsys_state *dummy_css,
-+ struct cftype *cft, const char *buffer)
-+{
-+ struct cgroup *cgrp = dummy_css->cgroup;
-+ struct cgroup_event *event;
-+ struct cgroup_subsys_state *cfile_css;
-+ unsigned int efd, cfd;
-+ struct fd efile;
-+ struct fd cfile;
-+ char *endp;
-+ int ret;
-+
-+ efd = simple_strtoul(buffer, &endp, 10);
-+ if (*endp != ' ')
-+ return -EINVAL;
-+ buffer = endp + 1;
-+
-+ cfd = simple_strtoul(buffer, &endp, 10);
-+ if ((*endp != ' ') && (*endp != '\0'))
-+ return -EINVAL;
-+ buffer = endp + 1;
-+
-+ event = kzalloc(sizeof(*event), GFP_KERNEL);
-+ if (!event)
-+ return -ENOMEM;
-+
-+ INIT_LIST_HEAD(&event->list);
-+ init_poll_funcptr(&event->pt, cgroup_event_ptable_queue_proc);
-+ init_waitqueue_func_entry(&event->wait, cgroup_event_wake);
-+ INIT_WORK(&event->remove, cgroup_event_remove);
-+
-+ efile = fdget(efd);
-+ if (!efile.file) {
-+ ret = -EBADF;
-+ goto out_kfree;
-+ }
-+
-+ event->eventfd = eventfd_ctx_fileget(efile.file);
-+ if (IS_ERR(event->eventfd)) {
-+ ret = PTR_ERR(event->eventfd);
-+ goto out_put_efile;
-+ }
-+
-+ cfile = fdget(cfd);
-+ if (!cfile.file) {
-+ ret = -EBADF;
-+ goto out_put_eventfd;
-+ }
-+
-+ /* the process need read permission on control file */
-+ /* AV: shouldn't we check that it's been opened for read instead? */
-+ ret = inode_permission(file_inode(cfile.file), MAY_READ);
-+ if (ret < 0)
-+ goto out_put_cfile;
-+
-+ event->cft = __file_cft(cfile.file);
-+ if (IS_ERR(event->cft)) {
-+ ret = PTR_ERR(event->cft);
-+ goto out_put_cfile;
-+ }
-+
-+ if (!event->cft->ss) {
-+ ret = -EBADF;
-+ goto out_put_cfile;
-+ }
-+
-+ /*
-+ * Determine the css of @cfile, verify it belongs to the same
-+ * cgroup as cgroup.event_control, and associate @event with it.
-+ * Remaining events are automatically removed on cgroup destruction
-+ * but the removal is asynchronous, so take an extra ref.
-+ */
-+ rcu_read_lock();
-+
-+ ret = -EINVAL;
-+ event->css = cgroup_css(cgrp, event->cft->ss);
-+ cfile_css = css_from_dir(cfile.file->f_dentry->d_parent, event->cft->ss);
-+ if (event->css && event->css == cfile_css && css_tryget(event->css))
-+ ret = 0;
-+
-+ rcu_read_unlock();
-+ if (ret)
-+ goto out_put_cfile;
-+
-+ if (!event->cft->register_event || !event->cft->unregister_event) {
-+ ret = -EINVAL;
-+ goto out_put_css;
-+ }
-+
-+ ret = event->cft->register_event(event->css, event->cft,
-+ event->eventfd, buffer);
-+ if (ret)
-+ goto out_put_css;
-+
-+ efile.file->f_op->poll(efile.file, &event->pt);
-+
-+ spin_lock(&cgrp->event_list_lock);
-+ list_add(&event->list, &cgrp->event_list);
-+ spin_unlock(&cgrp->event_list_lock);
-+
-+ fdput(cfile);
-+ fdput(efile);
-+
-+ return 0;
-+
-+out_put_css:
-+ css_put(event->css);
-+out_put_cfile:
-+ fdput(cfile);
-+out_put_eventfd:
-+ eventfd_ctx_put(event->eventfd);
-+out_put_efile:
-+ fdput(efile);
-+out_kfree:
-+ kfree(event);
-+
-+ return ret;
-+}
-+
-+static u64 cgroup_clone_children_read(struct cgroup_subsys_state *css,
-+ struct cftype *cft)
-+{
-+ return test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags);
-+}
-+
-+static int cgroup_clone_children_write(struct cgroup_subsys_state *css,
-+ struct cftype *cft, u64 val)
-+{
-+ if (val)
-+ set_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags);
-+ else
-+ clear_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags);
-+ return 0;
-+}
-+
-+static struct cftype cgroup_base_files[] = {
-+ {
-+ .name = "cgroup.procs",
-+ .open = cgroup_procs_open,
-+ .write_u64 = cgroup_procs_write,
-+ .release = cgroup_pidlist_release,
-+ .mode = S_IRUGO | S_IWUSR,
-+ },
-+ {
-+ .name = "cgroup.event_control",
-+ .write_string = cgroup_write_event_control,
-+ .mode = S_IWUGO,
-+ },
-+ {
-+ .name = "cgroup.clone_children",
-+ .flags = CFTYPE_INSANE,
-+ .read_u64 = cgroup_clone_children_read,
-+ .write_u64 = cgroup_clone_children_write,
-+ },
-+ {
-+ .name = "cgroup.sane_behavior",
-+ .flags = CFTYPE_ONLY_ON_ROOT,
-+ .read_seq_string = cgroup_sane_behavior_show,
-+ },
-+
-+ /*
-+ * Historical crazy stuff. These don't have "cgroup." prefix and
-+ * don't exist if sane_behavior. If you're depending on these, be
-+ * prepared to be burned.
-+ */
-+ {
-+ .name = "tasks",
-+ .flags = CFTYPE_INSANE, /* use "procs" instead */
-+ .open = cgroup_tasks_open,
-+ .write_u64 = cgroup_tasks_write,
-+ .release = cgroup_pidlist_release,
-+ .mode = S_IRUGO | S_IWUSR,
-+ },
-+ {
-+ .name = "notify_on_release",
-+ .flags = CFTYPE_INSANE,
-+ .read_u64 = cgroup_read_notify_on_release,
-+ .write_u64 = cgroup_write_notify_on_release,
-+ },
-+ {
-+ .name = "release_agent",
-+ .flags = CFTYPE_INSANE | CFTYPE_ONLY_ON_ROOT,
-+ .read_seq_string = cgroup_release_agent_show,
-+ .write_string = cgroup_release_agent_write,
-+ .max_write_len = PATH_MAX,
-+ },
-+ { } /* terminate */
-+};
-+
-+/**
-+ * cgroup_populate_dir - create subsys files in a cgroup directory
-+ * @cgrp: target cgroup
-+ * @subsys_mask: mask of the subsystem ids whose files should be added
-+ *
-+ * On failure, no file is added.
-+ */
-+static int cgroup_populate_dir(struct cgroup *cgrp, unsigned long subsys_mask)
-+{
-+ struct cgroup_subsys *ss;
-+ int i, ret = 0;
-+
-+ /* process cftsets of each subsystem */
-+ for_each_subsys(ss, i) {
-+ struct cftype_set *set;
-+
-+ if (!test_bit(i, &subsys_mask))
-+ continue;
-+
-+ list_for_each_entry(set, &ss->cftsets, node) {
-+ ret = cgroup_addrm_files(cgrp, set->cfts, true);
-+ if (ret < 0)
-+ goto err;
-+ }
-+ }
-+ return 0;
-+err:
-+ cgroup_clear_dir(cgrp, subsys_mask);
-+ return ret;
-+}
-+
-+/*
-+ * css destruction is four-stage process.
-+ *
-+ * 1. Destruction starts. Killing of the percpu_ref is initiated.
-+ * Implemented in kill_css().
-+ *
-+ * 2. When the percpu_ref is confirmed to be visible as killed on all CPUs
-+ * and thus css_tryget() is guaranteed to fail, the css can be offlined
-+ * by invoking offline_css(). After offlining, the base ref is put.
-+ * Implemented in css_killed_work_fn().
-+ *
-+ * 3. When the percpu_ref reaches zero, the only possible remaining
-+ * accessors are inside RCU read sections. css_release() schedules the
-+ * RCU callback.
-+ *
-+ * 4. After the grace period, the css can be freed. Implemented in
-+ * css_free_work_fn().
-+ *
-+ * It is actually hairier because both step 2 and 4 require process context
-+ * and thus involve punting to css->destroy_work adding two additional
-+ * steps to the already complex sequence.
-+ */
-+static void css_free_work_fn(struct work_struct *work)
-+{
-+ struct cgroup_subsys_state *css =
-+ container_of(work, struct cgroup_subsys_state, destroy_work);
-+ struct cgroup *cgrp = css->cgroup;
-+
-+ if (css->parent)
-+ css_put(css->parent);
-+
-+ css->ss->css_free(css);
-+ cgroup_dput(cgrp);
-+}
-+
-+static void css_free_rcu_fn(struct rcu_head *rcu_head)
-+{
-+ struct cgroup_subsys_state *css =
-+ container_of(rcu_head, struct cgroup_subsys_state, rcu_head);
-+
-+ /*
-+ * css holds an extra ref to @cgrp->dentry which is put on the last
-+ * css_put(). dput() requires process context which we don't have.
-+ */
-+ INIT_WORK(&css->destroy_work, css_free_work_fn);
-+ queue_work(cgroup_destroy_wq, &css->destroy_work);
-+}
-+
-+static void css_release(struct percpu_ref *ref)
-+{
-+ struct cgroup_subsys_state *css =
-+ container_of(ref, struct cgroup_subsys_state, refcnt);
-+
-+ rcu_assign_pointer(css->cgroup->subsys[css->ss->subsys_id], NULL);
-+ call_rcu(&css->rcu_head, css_free_rcu_fn);
-+}
-+
-+static void init_css(struct cgroup_subsys_state *css, struct cgroup_subsys *ss,
-+ struct cgroup *cgrp)
-+{
-+ css->cgroup = cgrp;
-+ css->ss = ss;
-+ css->flags = 0;
-+
-+ if (cgrp->parent)
-+ css->parent = cgroup_css(cgrp->parent, ss);
-+ else
-+ css->flags |= CSS_ROOT;
-+
-+ BUG_ON(cgroup_css(cgrp, ss));
-+}
-+
-+/* invoke ->css_online() on a new CSS and mark it online if successful */
-+static int online_css(struct cgroup_subsys_state *css)
-+{
-+ struct cgroup_subsys *ss = css->ss;
-+ int ret = 0;
-+
-+ lockdep_assert_held(&cgroup_mutex);
-+
-+ if (ss->css_online)
-+ ret = ss->css_online(css);
-+ if (!ret) {
-+ css->flags |= CSS_ONLINE;
-+ css->cgroup->nr_css++;
-+ rcu_assign_pointer(css->cgroup->subsys[ss->subsys_id], css);
-+ }
-+ return ret;
-+}
-+
-+/* if the CSS is online, invoke ->css_offline() on it and mark it offline */
-+static void offline_css(struct cgroup_subsys_state *css)
-+{
-+ struct cgroup_subsys *ss = css->ss;
-+
-+ lockdep_assert_held(&cgroup_mutex);
-+
-+ if (!(css->flags & CSS_ONLINE))
-+ return;
-+
-+ if (ss->css_offline)
-+ ss->css_offline(css);
-+
-+ css->flags &= ~CSS_ONLINE;
-+ css->cgroup->nr_css--;
-+ RCU_INIT_POINTER(css->cgroup->subsys[ss->subsys_id], css);
-+}
-+
-+/*
-+ * cgroup_create - create a cgroup
-+ * @parent: cgroup that will be parent of the new cgroup
-+ * @dentry: dentry of the new cgroup
-+ * @mode: mode to set on new inode
-+ *
-+ * Must be called with the mutex on the parent inode held
-+ */
-+static long cgroup_create(struct cgroup *parent, struct dentry *dentry,
-+ umode_t mode)
-+{
-+ struct cgroup_subsys_state *css_ar[CGROUP_SUBSYS_COUNT] = { };
-+ struct cgroup *cgrp;
-+ struct cgroup_name *name;
-+ struct cgroupfs_root *root = parent->root;
-+ int err;
-+ struct cgroup_subsys *ss;
-+ struct super_block *sb = root->sb;
-+
-+ /* allocate the cgroup and its ID, 0 is reserved for the root */
-+ cgrp = kzalloc(sizeof(*cgrp), GFP_KERNEL);
-+ if (!cgrp)
-+ return -ENOMEM;
-+
-+ name = cgroup_alloc_name(dentry);
-+ if (!name) {
-+ err = -ENOMEM;
-+ goto err_free_cgrp;
-+ }
-+ rcu_assign_pointer(cgrp->name, name);
-+
-+ /*
-+ * Temporarily set the pointer to NULL, so idr_find() won't return
-+ * a half-baked cgroup.
-+ */
-+ cgrp->id = idr_alloc(&root->cgroup_idr, NULL, 1, 0, GFP_KERNEL);
-+ if (cgrp->id < 0) {
-+ err = -ENOMEM;
-+ goto err_free_name;
-+ }
-+
-+ /*
-+ * Only live parents can have children. Note that the liveliness
-+ * check isn't strictly necessary because cgroup_mkdir() and
-+ * cgroup_rmdir() are fully synchronized by i_mutex; however, do it
-+ * anyway so that locking is contained inside cgroup proper and we
-+ * don't get nasty surprises if we ever grow another caller.
-+ */
-+ if (!cgroup_lock_live_group(parent)) {
-+ err = -ENODEV;
-+ goto err_free_id;
-+ }
-+
-+ /* Grab a reference on the superblock so the hierarchy doesn't
-+ * get deleted on unmount if there are child cgroups. This
-+ * can be done outside cgroup_mutex, since the sb can't
-+ * disappear while someone has an open control file on the
-+ * fs */
-+ atomic_inc(&sb->s_active);
-+
-+ init_cgroup_housekeeping(cgrp);
-+
-+ dentry->d_fsdata = cgrp;
-+ cgrp->dentry = dentry;
-+
-+ cgrp->parent = parent;
-+ cgrp->dummy_css.parent = &parent->dummy_css;
-+ cgrp->root = parent->root;
-+
-+ if (notify_on_release(parent))
-+ set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags);
-+
-+ if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &parent->flags))
-+ set_bit(CGRP_CPUSET_CLONE_CHILDREN, &cgrp->flags);
-+
-+ for_each_root_subsys(root, ss) {
-+ struct cgroup_subsys_state *css;
-+
-+ css = ss->css_alloc(cgroup_css(parent, ss));
-+ if (IS_ERR(css)) {
-+ err = PTR_ERR(css);
-+ goto err_free_all;
-+ }
-+ css_ar[ss->subsys_id] = css;
-+
-+ err = percpu_ref_init(&css->refcnt, css_release);
-+ if (err)
-+ goto err_free_all;
-+
-+ init_css(css, ss, cgrp);
-+ }
-+
-+ /*
-+ * Create directory. cgroup_create_file() returns with the new
-+ * directory locked on success so that it can be populated without
-+ * dropping cgroup_mutex.
-+ */
-+ err = cgroup_create_file(dentry, S_IFDIR | mode, sb);
-+ if (err < 0)
-+ goto err_free_all;
-+ lockdep_assert_held(&dentry->d_inode->i_mutex);
-+
-+ cgrp->serial_nr = cgroup_serial_nr_next++;
-+
-+ /* allocation complete, commit to creation */
-+ list_add_tail_rcu(&cgrp->sibling, &cgrp->parent->children);
-+ root->number_of_cgroups++;
-+
-+ /* hold a ref to the parent's dentry */
-+ dget(parent->dentry);
-+
-+ /* creation succeeded, notify subsystems */
-+ for_each_root_subsys(root, ss) {
-+ struct cgroup_subsys_state *css = css_ar[ss->subsys_id];
-+
-+ err = online_css(css);
-+ if (err)
-+ goto err_destroy;
-+
-+ /* each css holds a ref to the cgroup's dentry and parent css */
-+ dget(dentry);
-+ css_get(css->parent);
-+
-+ /* mark it consumed for error path */
-+ css_ar[ss->subsys_id] = NULL;
-+
-+ if (ss->broken_hierarchy && !ss->warned_broken_hierarchy &&
-+ parent->parent) {
-+ pr_warning("cgroup: %s (%d) created nested cgroup for controller \"%s\" which has incomplete hierarchy support. Nested cgroups may change behavior in the future.\n",
-+ current->comm, current->pid, ss->name);
-+ if (!strcmp(ss->name, "memory"))
-+ pr_warning("cgroup: \"memory\" requires setting use_hierarchy to 1 on the root.\n");
-+ ss->warned_broken_hierarchy = true;
-+ }
-+ }
-+
-+ idr_replace(&root->cgroup_idr, cgrp, cgrp->id);
-+
-+ err = cgroup_addrm_files(cgrp, cgroup_base_files, true);
-+ if (err)
-+ goto err_destroy;
-+
-+ err = cgroup_populate_dir(cgrp, root->subsys_mask);
-+ if (err)
-+ goto err_destroy;
-+
-+ mutex_unlock(&cgroup_mutex);
-+ mutex_unlock(&cgrp->dentry->d_inode->i_mutex);
-+
-+ return 0;
-+
-+err_free_all:
-+ for_each_root_subsys(root, ss) {
-+ struct cgroup_subsys_state *css = css_ar[ss->subsys_id];
-+
-+ if (css) {
-+ percpu_ref_cancel_init(&css->refcnt);
-+ ss->css_free(css);
-+ }
-+ }
-+ mutex_unlock(&cgroup_mutex);
-+ /* Release the reference count that we took on the superblock */
-+ deactivate_super(sb);
-+err_free_id:
-+ idr_remove(&root->cgroup_idr, cgrp->id);
-+err_free_name:
-+ kfree(rcu_dereference_raw(cgrp->name));
-+err_free_cgrp:
-+ kfree(cgrp);
-+ return err;
-+
-+err_destroy:
-+ for_each_root_subsys(root, ss) {
-+ struct cgroup_subsys_state *css = css_ar[ss->subsys_id];
-+
-+ if (css) {
-+ percpu_ref_cancel_init(&css->refcnt);
-+ ss->css_free(css);
-+ }
-+ }
-+ cgroup_destroy_locked(cgrp);
-+ mutex_unlock(&cgroup_mutex);
-+ mutex_unlock(&dentry->d_inode->i_mutex);
-+ return err;
-+}
-+
-+static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
-+{
-+ struct cgroup *c_parent = dentry->d_parent->d_fsdata;
-+
-+ /* the vfs holds inode->i_mutex already */
-+ return cgroup_create(c_parent, dentry, mode | S_IFDIR);
-+}
-+
-+/*
-+ * This is called when the refcnt of a css is confirmed to be killed.
-+ * css_tryget() is now guaranteed to fail.
-+ */
-+static void css_killed_work_fn(struct work_struct *work)
-+{
-+ struct cgroup_subsys_state *css =
-+ container_of(work, struct cgroup_subsys_state, destroy_work);
-+ struct cgroup *cgrp = css->cgroup;
-+
-+ mutex_lock(&cgroup_mutex);
-+
-+ /*
-+ * css_tryget() is guaranteed to fail now. Tell subsystems to
-+ * initate destruction.
-+ */
-+ offline_css(css);
-+
-+ /*
-+ * If @cgrp is marked dead, it's waiting for refs of all css's to
-+ * be disabled before proceeding to the second phase of cgroup
-+ * destruction. If we are the last one, kick it off.
-+ */
-+ if (!cgrp->nr_css && cgroup_is_dead(cgrp))
-+ cgroup_destroy_css_killed(cgrp);
-+
-+ mutex_unlock(&cgroup_mutex);
-+
-+ /*
-+ * Put the css refs from kill_css(). Each css holds an extra
-+ * reference to the cgroup's dentry and cgroup removal proceeds
-+ * regardless of css refs. On the last put of each css, whenever
-+ * that may be, the extra dentry ref is put so that dentry
-+ * destruction happens only after all css's are released.
-+ */
-+ css_put(css);
-+}
-+
-+/* css kill confirmation processing requires process context, bounce */
-+static void css_killed_ref_fn(struct percpu_ref *ref)
-+{
-+ struct cgroup_subsys_state *css =
-+ container_of(ref, struct cgroup_subsys_state, refcnt);
-+
-+ INIT_WORK(&css->destroy_work, css_killed_work_fn);
-+ queue_work(cgroup_destroy_wq, &css->destroy_work);
-+}
-+
-+/**
-+ * kill_css - destroy a css
-+ * @css: css to destroy
-+ *
-+ * This function initiates destruction of @css by removing cgroup interface
-+ * files and putting its base reference. ->css_offline() will be invoked
-+ * asynchronously once css_tryget() is guaranteed to fail and when the
-+ * reference count reaches zero, @css will be released.
-+ */
-+static void kill_css(struct cgroup_subsys_state *css)
-+{
-+ cgroup_clear_dir(css->cgroup, 1 << css->ss->subsys_id);
-+
-+ /*
-+ * Killing would put the base ref, but we need to keep it alive
-+ * until after ->css_offline().
-+ */
-+ css_get(css);
-+
-+ /*
-+ * cgroup core guarantees that, by the time ->css_offline() is
-+ * invoked, no new css reference will be given out via
-+ * css_tryget(). We can't simply call percpu_ref_kill() and
-+ * proceed to offlining css's because percpu_ref_kill() doesn't
-+ * guarantee that the ref is seen as killed on all CPUs on return.
-+ *
-+ * Use percpu_ref_kill_and_confirm() to get notifications as each
-+ * css is confirmed to be seen as killed on all CPUs.
-+ */
-+ percpu_ref_kill_and_confirm(&css->refcnt, css_killed_ref_fn);
-+}
-+
-+/**
-+ * cgroup_destroy_locked - the first stage of cgroup destruction
-+ * @cgrp: cgroup to be destroyed
-+ *
-+ * css's make use of percpu refcnts whose killing latency shouldn't be
-+ * exposed to userland and are RCU protected. Also, cgroup core needs to
-+ * guarantee that css_tryget() won't succeed by the time ->css_offline() is
-+ * invoked. To satisfy all the requirements, destruction is implemented in
-+ * the following two steps.
-+ *
-+ * s1. Verify @cgrp can be destroyed and mark it dying. Remove all
-+ * userland visible parts and start killing the percpu refcnts of
-+ * css's. Set up so that the next stage will be kicked off once all
-+ * the percpu refcnts are confirmed to be killed.
-+ *
-+ * s2. Invoke ->css_offline(), mark the cgroup dead and proceed with the
-+ * rest of destruction. Once all cgroup references are gone, the
-+ * cgroup is RCU-freed.
-+ *
-+ * This function implements s1. After this step, @cgrp is gone as far as
-+ * the userland is concerned and a new cgroup with the same name may be
-+ * created. As cgroup doesn't care about the names internally, this
-+ * doesn't cause any problem.
-+ */
-+static int cgroup_destroy_locked(struct cgroup *cgrp)
-+ __releases(&cgroup_mutex) __acquires(&cgroup_mutex)
-+{
-+ struct dentry *d = cgrp->dentry;
-+ struct cgroup_event *event, *tmp;
-+ struct cgroup_subsys *ss;
-+ struct cgroup *child;
-+ bool empty;
-+
-+ lockdep_assert_held(&d->d_inode->i_mutex);
-+ lockdep_assert_held(&cgroup_mutex);
-+
-+ /*
-+ * css_set_lock synchronizes access to ->cset_links and prevents
-+ * @cgrp from being removed while __put_css_set() is in progress.
-+ */
-+ read_lock(&css_set_lock);
-+ empty = list_empty(&cgrp->cset_links);
-+ read_unlock(&css_set_lock);
-+ if (!empty)
-+ return -EBUSY;
-+
-+ /*
-+ * Make sure there's no live children. We can't test ->children
-+ * emptiness as dead children linger on it while being destroyed;
-+ * otherwise, "rmdir parent/child parent" may fail with -EBUSY.
-+ */
-+ empty = true;
-+ rcu_read_lock();
-+ list_for_each_entry_rcu(child, &cgrp->children, sibling) {
-+ empty = cgroup_is_dead(child);
-+ if (!empty)
-+ break;
-+ }
-+ rcu_read_unlock();
-+ if (!empty)
-+ return -EBUSY;
-+
-+ /*
-+ * Initiate massacre of all css's. cgroup_destroy_css_killed()
-+ * will be invoked to perform the rest of destruction once the
-+ * percpu refs of all css's are confirmed to be killed.
-+ */
-+ for_each_root_subsys(cgrp->root, ss) {
-+ struct cgroup_subsys_state *css = cgroup_css(cgrp, ss);
-+
-+ if (css)
-+ kill_css(css);
-+ }
-+
-+ /*
-+ * Mark @cgrp dead. This prevents further task migration and child
-+ * creation by disabling cgroup_lock_live_group(). Note that
-+ * CGRP_DEAD assertion is depended upon by css_next_child() to
-+ * resume iteration after dropping RCU read lock. See
-+ * css_next_child() for details.
-+ */
-+ set_bit(CGRP_DEAD, &cgrp->flags);
-+
-+ /* CGRP_DEAD is set, remove from ->release_list for the last time */
-+ raw_spin_lock(&release_list_lock);
-+ if (!list_empty(&cgrp->release_list))
-+ list_del_init(&cgrp->release_list);
-+ raw_spin_unlock(&release_list_lock);
-+
-+ /*
-+ * If @cgrp has css's attached, the second stage of cgroup
-+ * destruction is kicked off from css_killed_work_fn() after the
-+ * refs of all attached css's are killed. If @cgrp doesn't have
-+ * any css, we kick it off here.
-+ */
-+ if (!cgrp->nr_css)
-+ cgroup_destroy_css_killed(cgrp);
-+
-+ /*
-+ * Clear the base files and remove @cgrp directory. The removal
-+ * puts the base ref but we aren't quite done with @cgrp yet, so
-+ * hold onto it.
-+ */
-+ cgroup_addrm_files(cgrp, cgroup_base_files, false);
-+ dget(d);
-+ cgroup_d_remove_dir(d);
-+
-+ /*
-+ * Unregister events and notify userspace.
-+ * Notify userspace about cgroup removing only after rmdir of cgroup
-+ * directory to avoid race between userspace and kernelspace.
-+ */
-+ spin_lock(&cgrp->event_list_lock);
-+ list_for_each_entry_safe(event, tmp, &cgrp->event_list, list) {
-+ list_del_init(&event->list);
-+ schedule_work(&event->remove);
-+ }
-+ spin_unlock(&cgrp->event_list_lock);
-+
-+ return 0;
-+};
-+
-+/**
-+ * cgroup_destroy_css_killed - the second step of cgroup destruction
-+ * @work: cgroup->destroy_free_work
-+ *
-+ * This function is invoked from a work item for a cgroup which is being
-+ * destroyed after all css's are offlined and performs the rest of
-+ * destruction. This is the second step of destruction described in the
-+ * comment above cgroup_destroy_locked().
-+ */
-+static void cgroup_destroy_css_killed(struct cgroup *cgrp)
-+{
-+ struct cgroup *parent = cgrp->parent;
-+ struct dentry *d = cgrp->dentry;
-+
-+ lockdep_assert_held(&cgroup_mutex);
-+
-+ /* delete this cgroup from parent->children */
-+ list_del_rcu(&cgrp->sibling);
-+
-+ dput(d);
-+
-+ set_bit(CGRP_RELEASABLE, &parent->flags);
-+ check_for_release(parent);
-+}
-+
-+static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry)
-+{
-+ int ret;
-+
-+ mutex_lock(&cgroup_mutex);
-+ ret = cgroup_destroy_locked(dentry->d_fsdata);
-+ mutex_unlock(&cgroup_mutex);
-+
-+ return ret;
-+}
-+
-+static void __init_or_module cgroup_init_cftsets(struct cgroup_subsys *ss)
-+{
-+ INIT_LIST_HEAD(&ss->cftsets);
-+
-+ /*
-+ * base_cftset is embedded in subsys itself, no need to worry about
-+ * deregistration.
-+ */
-+ if (ss->base_cftypes) {
-+ struct cftype *cft;
-+
-+ for (cft = ss->base_cftypes; cft->name[0] != '\0'; cft++)
-+ cft->ss = ss;
-+
-+ ss->base_cftset.cfts = ss->base_cftypes;
-+ list_add_tail(&ss->base_cftset.node, &ss->cftsets);
-+ }
-+}
-+
-+static void __init cgroup_init_subsys(struct cgroup_subsys *ss)
-+{
-+ struct cgroup_subsys_state *css;
-+
-+ printk(KERN_INFO "Initializing cgroup subsys %s\n", ss->name);
-+
-+ mutex_lock(&cgroup_mutex);
-+
-+ /* init base cftset */
-+ cgroup_init_cftsets(ss);
-+
-+ /* Create the top cgroup state for this subsystem */
-+ list_add(&ss->sibling, &cgroup_dummy_root.subsys_list);
-+ ss->root = &cgroup_dummy_root;
-+ css = ss->css_alloc(cgroup_css(cgroup_dummy_top, ss));
-+ /* We don't handle early failures gracefully */
-+ BUG_ON(IS_ERR(css));
-+ init_css(css, ss, cgroup_dummy_top);
-+
-+ /* Update the init_css_set to contain a subsys
-+ * pointer to this state - since the subsystem is
-+ * newly registered, all tasks and hence the
-+ * init_css_set is in the subsystem's top cgroup. */
-+ init_css_set.subsys[ss->subsys_id] = css;
-+
-+ need_forkexit_callback |= ss->fork || ss->exit;
-+
-+ /* At system boot, before all subsystems have been
-+ * registered, no tasks have been forked, so we don't
-+ * need to invoke fork callbacks here. */
-+ BUG_ON(!list_empty(&init_task.tasks));
-+
-+ BUG_ON(online_css(css));
-+
-+ mutex_unlock(&cgroup_mutex);
-+
-+ /* this function shouldn't be used with modular subsystems, since they
-+ * need to register a subsys_id, among other things */
-+ BUG_ON(ss->module);
-+}
-+
-+/**
-+ * cgroup_load_subsys: load and register a modular subsystem at runtime
-+ * @ss: the subsystem to load
-+ *
-+ * This function should be called in a modular subsystem's initcall. If the
-+ * subsystem is built as a module, it will be assigned a new subsys_id and set
-+ * up for use. If the subsystem is built-in anyway, work is delegated to the
-+ * simpler cgroup_init_subsys.
-+ */
-+int __init_or_module cgroup_load_subsys(struct cgroup_subsys *ss)
-+{
-+ struct cgroup_subsys_state *css;
-+ int i, ret;
-+ struct hlist_node *tmp;
-+ struct css_set *cset;
-+ unsigned long key;
-+
-+ /* check name and function validity */
-+ if (ss->name == NULL || strlen(ss->name) > MAX_CGROUP_TYPE_NAMELEN ||
-+ ss->css_alloc == NULL || ss->css_free == NULL)
-+ return -EINVAL;
-+
-+ /*
-+ * we don't support callbacks in modular subsystems. this check is
-+ * before the ss->module check for consistency; a subsystem that could
-+ * be a module should still have no callbacks even if the user isn't
-+ * compiling it as one.
-+ */
-+ if (ss->fork || ss->exit)
-+ return -EINVAL;
-+
-+ /*
-+ * an optionally modular subsystem is built-in: we want to do nothing,
-+ * since cgroup_init_subsys will have already taken care of it.
-+ */
-+ if (ss->module == NULL) {
-+ /* a sanity check */
-+ BUG_ON(cgroup_subsys[ss->subsys_id] != ss);
-+ return 0;
-+ }
-+
-+ /* init base cftset */
-+ cgroup_init_cftsets(ss);
-+
-+ mutex_lock(&cgroup_mutex);
-+ cgroup_subsys[ss->subsys_id] = ss;
-+
-+ /*
-+ * no ss->css_alloc seems to need anything important in the ss
-+ * struct, so this can happen first (i.e. before the dummy root
-+ * attachment).
-+ */
-+ css = ss->css_alloc(cgroup_css(cgroup_dummy_top, ss));
-+ if (IS_ERR(css)) {
-+ /* failure case - need to deassign the cgroup_subsys[] slot. */
-+ cgroup_subsys[ss->subsys_id] = NULL;
-+ mutex_unlock(&cgroup_mutex);
-+ return PTR_ERR(css);
-+ }
-+
-+ list_add(&ss->sibling, &cgroup_dummy_root.subsys_list);
-+ ss->root = &cgroup_dummy_root;
-+
-+ /* our new subsystem will be attached to the dummy hierarchy. */
-+ init_css(css, ss, cgroup_dummy_top);
-+
-+ /*
-+ * Now we need to entangle the css into the existing css_sets. unlike
-+ * in cgroup_init_subsys, there are now multiple css_sets, so each one
-+ * will need a new pointer to it; done by iterating the css_set_table.
-+ * furthermore, modifying the existing css_sets will corrupt the hash
-+ * table state, so each changed css_set will need its hash recomputed.
-+ * this is all done under the css_set_lock.
-+ */
-+ write_lock(&css_set_lock);
-+ hash_for_each_safe(css_set_table, i, tmp, cset, hlist) {
-+ /* skip entries that we already rehashed */
-+ if (cset->subsys[ss->subsys_id])
-+ continue;
-+ /* remove existing entry */
-+ hash_del(&cset->hlist);
-+ /* set new value */
-+ cset->subsys[ss->subsys_id] = css;
-+ /* recompute hash and restore entry */
-+ key = css_set_hash(cset->subsys);
-+ hash_add(css_set_table, &cset->hlist, key);
-+ }
-+ write_unlock(&css_set_lock);
-+
-+ ret = online_css(css);
-+ if (ret)
-+ goto err_unload;
-+
-+ /* success! */
-+ mutex_unlock(&cgroup_mutex);
-+ return 0;
-+
-+err_unload:
-+ mutex_unlock(&cgroup_mutex);
-+ /* @ss can't be mounted here as try_module_get() would fail */
-+ cgroup_unload_subsys(ss);
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(cgroup_load_subsys);
-+
-+/**
-+ * cgroup_unload_subsys: unload a modular subsystem
-+ * @ss: the subsystem to unload
-+ *
-+ * This function should be called in a modular subsystem's exitcall. When this
-+ * function is invoked, the refcount on the subsystem's module will be 0, so
-+ * the subsystem will not be attached to any hierarchy.
-+ */
-+void cgroup_unload_subsys(struct cgroup_subsys *ss)
-+{
-+ struct cgrp_cset_link *link;
-+
-+ BUG_ON(ss->module == NULL);
-+
-+ /*
-+ * we shouldn't be called if the subsystem is in use, and the use of
-+ * try_module_get() in rebind_subsystems() should ensure that it
-+ * doesn't start being used while we're killing it off.
-+ */
-+ BUG_ON(ss->root != &cgroup_dummy_root);
-+
-+ mutex_lock(&cgroup_mutex);
-+
-+ offline_css(cgroup_css(cgroup_dummy_top, ss));
-+
-+ /* deassign the subsys_id */
-+ cgroup_subsys[ss->subsys_id] = NULL;
-+
-+ /* remove subsystem from the dummy root's list of subsystems */
-+ list_del_init(&ss->sibling);
-+
-+ /*
-+ * disentangle the css from all css_sets attached to the dummy
-+ * top. as in loading, we need to pay our respects to the hashtable
-+ * gods.
-+ */
-+ write_lock(&css_set_lock);
-+ list_for_each_entry(link, &cgroup_dummy_top->cset_links, cset_link) {
-+ struct css_set *cset = link->cset;
-+ unsigned long key;
-+
-+ hash_del(&cset->hlist);
-+ cset->subsys[ss->subsys_id] = NULL;
-+ key = css_set_hash(cset->subsys);
-+ hash_add(css_set_table, &cset->hlist, key);
-+ }
-+ write_unlock(&css_set_lock);
-+
-+ /*
-+ * remove subsystem's css from the cgroup_dummy_top and free it -
-+ * need to free before marking as null because ss->css_free needs
-+ * the cgrp->subsys pointer to find their state.
-+ */
-+ ss->css_free(cgroup_css(cgroup_dummy_top, ss));
-+ RCU_INIT_POINTER(cgroup_dummy_top->subsys[ss->subsys_id], NULL);
-+
-+ mutex_unlock(&cgroup_mutex);
-+}
-+EXPORT_SYMBOL_GPL(cgroup_unload_subsys);
-+
-+/**
-+ * cgroup_init_early - cgroup initialization at system boot
-+ *
-+ * Initialize cgroups at system boot, and initialize any
-+ * subsystems that request early init.
-+ */
-+int __init cgroup_init_early(void)
-+{
-+ struct cgroup_subsys *ss;
-+ int i;
-+
-+ atomic_set(&init_css_set.refcount, 1);
-+ INIT_LIST_HEAD(&init_css_set.cgrp_links);
-+ INIT_LIST_HEAD(&init_css_set.tasks);
-+ INIT_HLIST_NODE(&init_css_set.hlist);
-+ css_set_count = 1;
-+ init_cgroup_root(&cgroup_dummy_root);
-+ cgroup_root_count = 1;
-+ RCU_INIT_POINTER(init_task.cgroups, &init_css_set);
-+
-+ init_cgrp_cset_link.cset = &init_css_set;
-+ init_cgrp_cset_link.cgrp = cgroup_dummy_top;
-+ list_add(&init_cgrp_cset_link.cset_link, &cgroup_dummy_top->cset_links);
-+ list_add(&init_cgrp_cset_link.cgrp_link, &init_css_set.cgrp_links);
-+
-+ /* at bootup time, we don't worry about modular subsystems */
-+ for_each_builtin_subsys(ss, i) {
-+ BUG_ON(!ss->name);
-+ BUG_ON(strlen(ss->name) > MAX_CGROUP_TYPE_NAMELEN);
-+ BUG_ON(!ss->css_alloc);
-+ BUG_ON(!ss->css_free);
-+ if (ss->subsys_id != i) {
-+ printk(KERN_ERR "cgroup: Subsys %s id == %d\n",
-+ ss->name, ss->subsys_id);
-+ BUG();
-+ }
-+
-+ if (ss->early_init)
-+ cgroup_init_subsys(ss);
-+ }
-+ return 0;
-+}
-+
-+/**
-+ * cgroup_init - cgroup initialization
-+ *
-+ * Register cgroup filesystem and /proc file, and initialize
-+ * any subsystems that didn't request early init.
-+ */
-+int __init cgroup_init(void)
-+{
-+ struct cgroup_subsys *ss;
-+ unsigned long key;
-+ int i, err;
-+
-+ err = bdi_init(&cgroup_backing_dev_info);
-+ if (err)
-+ return err;
-+
-+ for_each_builtin_subsys(ss, i) {
-+ if (!ss->early_init)
-+ cgroup_init_subsys(ss);
-+ }
-+
-+ /* allocate id for the dummy hierarchy */
-+ mutex_lock(&cgroup_mutex);
-+ mutex_lock(&cgroup_root_mutex);
-+
-+ /* Add init_css_set to the hash table */
-+ key = css_set_hash(init_css_set.subsys);
-+ hash_add(css_set_table, &init_css_set.hlist, key);
-+
-+ BUG_ON(cgroup_init_root_id(&cgroup_dummy_root, 0, 1));
-+
-+ err = idr_alloc(&cgroup_dummy_root.cgroup_idr, cgroup_dummy_top,
-+ 0, 1, GFP_KERNEL);
-+ BUG_ON(err < 0);
-+
-+ mutex_unlock(&cgroup_root_mutex);
-+ mutex_unlock(&cgroup_mutex);
-+
-+ cgroup_kobj = kobject_create_and_add("cgroup", fs_kobj);
-+ if (!cgroup_kobj) {
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ err = register_filesystem(&cgroup_fs_type);
-+ if (err < 0) {
-+ kobject_put(cgroup_kobj);
-+ goto out;
-+ }
-+
-+ proc_create("cgroups", 0, NULL, &proc_cgroupstats_operations);
-+
-+out:
-+ if (err)
-+ bdi_destroy(&cgroup_backing_dev_info);
-+
-+ return err;
-+}
-+
-+static int __init cgroup_wq_init(void)
-+{
-+ /*
-+ * There isn't much point in executing destruction path in
-+ * parallel. Good chunk is serialized with cgroup_mutex anyway.
-+ * Use 1 for @max_active.
-+ *
-+ * We would prefer to do this in cgroup_init() above, but that
-+ * is called before init_workqueues(): so leave this until after.
-+ */
-+ cgroup_destroy_wq = alloc_workqueue("cgroup_destroy", 0, 1);
-+ BUG_ON(!cgroup_destroy_wq);
-+ return 0;
-+}
-+core_initcall(cgroup_wq_init);
-+
-+/*
-+ * proc_cgroup_show()
-+ * - Print task's cgroup paths into seq_file, one line for each hierarchy
-+ * - Used for /proc/<pid>/cgroup.
-+ * - No need to task_lock(tsk) on this tsk->cgroup reference, as it
-+ * doesn't really matter if tsk->cgroup changes after we read it,
-+ * and we take cgroup_mutex, keeping cgroup_attach_task() from changing it
-+ * anyway. No need to check that tsk->cgroup != NULL, thanks to
-+ * the_top_cgroup_hack in cgroup_exit(), which sets an exiting tasks
-+ * cgroup to top_cgroup.
-+ */
-+
-+/* TODO: Use a proper seq_file iterator */
-+int proc_cgroup_show(struct seq_file *m, void *v)
-+{
-+ struct pid *pid;
-+ struct task_struct *tsk;
-+ char *buf;
-+ int retval;
-+ struct cgroupfs_root *root;
-+
-+ retval = -ENOMEM;
-+ buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
-+ if (!buf)
-+ goto out;
-+
-+ retval = -ESRCH;
-+ pid = m->private;
-+ tsk = get_pid_task(pid, PIDTYPE_PID);
-+ if (!tsk)
-+ goto out_free;
-+
-+ retval = 0;
-+
-+ mutex_lock(&cgroup_mutex);
-+
-+ for_each_active_root(root) {
-+ struct cgroup_subsys *ss;
-+ struct cgroup *cgrp;
-+ int count = 0;
-+
-+ seq_printf(m, "%d:", root->hierarchy_id);
-+ for_each_root_subsys(root, ss)
-+ seq_printf(m, "%s%s", count++ ? "," : "", ss->name);
-+ if (strlen(root->name))
-+ seq_printf(m, "%sname=%s", count ? "," : "",
-+ root->name);
-+ seq_putc(m, ':');
-+ cgrp = task_cgroup_from_root(tsk, root);
-+ retval = cgroup_path(cgrp, buf, PAGE_SIZE);
-+ if (retval < 0)
-+ goto out_unlock;
-+ seq_puts(m, buf);
-+ seq_putc(m, '\n');
-+ }
-+
-+out_unlock:
-+ mutex_unlock(&cgroup_mutex);
-+ put_task_struct(tsk);
-+out_free:
-+ kfree(buf);
-+out:
-+ return retval;
-+}
-+
-+/* Display information about each subsystem and each hierarchy */
-+static int proc_cgroupstats_show(struct seq_file *m, void *v)
-+{
-+ struct cgroup_subsys *ss;
-+ int i;
-+
-+ seq_puts(m, "#subsys_name\thierarchy\tnum_cgroups\tenabled\n");
-+ /*
-+ * ideally we don't want subsystems moving around while we do this.
-+ * cgroup_mutex is also necessary to guarantee an atomic snapshot of
-+ * subsys/hierarchy state.
-+ */
-+ mutex_lock(&cgroup_mutex);
-+
-+ for_each_subsys(ss, i)
-+ seq_printf(m, "%s\t%d\t%d\t%d\n",
-+ ss->name, ss->root->hierarchy_id,
-+ ss->root->number_of_cgroups, !ss->disabled);
-+
-+ mutex_unlock(&cgroup_mutex);
-+ return 0;
-+}
-+
-+static int cgroupstats_open(struct inode *inode, struct file *file)
-+{
-+ return single_open(file, proc_cgroupstats_show, NULL);
-+}
-+
-+static const struct file_operations proc_cgroupstats_operations = {
-+ .open = cgroupstats_open,
-+ .read = seq_read,
-+ .llseek = seq_lseek,
-+ .release = single_release,
-+};
-+
-+/**
-+ * cgroup_fork - attach newly forked task to its parents cgroup.
-+ * @child: pointer to task_struct of forking parent process.
-+ *
-+ * Description: A task inherits its parent's cgroup at fork().
-+ *
-+ * A pointer to the shared css_set was automatically copied in
-+ * fork.c by dup_task_struct(). However, we ignore that copy, since
-+ * it was not made under the protection of RCU or cgroup_mutex, so
-+ * might no longer be a valid cgroup pointer. cgroup_attach_task() might
-+ * have already changed current->cgroups, allowing the previously
-+ * referenced cgroup group to be removed and freed.
-+ *
-+ * At the point that cgroup_fork() is called, 'current' is the parent
-+ * task, and the passed argument 'child' points to the child task.
-+ */
-+void cgroup_fork(struct task_struct *child)
-+{
-+ task_lock(current);
-+ get_css_set(task_css_set(current));
-+ child->cgroups = current->cgroups;
-+ task_unlock(current);
-+ INIT_LIST_HEAD(&child->cg_list);
-+}
-+
-+/**
-+ * cgroup_post_fork - called on a new task after adding it to the task list
-+ * @child: the task in question
-+ *
-+ * Adds the task to the list running through its css_set if necessary and
-+ * call the subsystem fork() callbacks. Has to be after the task is
-+ * visible on the task list in case we race with the first call to
-+ * cgroup_task_iter_start() - to guarantee that the new task ends up on its
-+ * list.
-+ */
-+void cgroup_post_fork(struct task_struct *child)
-+{
-+ struct cgroup_subsys *ss;
-+ int i;
-+
-+ /*
-+ * use_task_css_set_links is set to 1 before we walk the tasklist
-+ * under the tasklist_lock and we read it here after we added the child
-+ * to the tasklist under the tasklist_lock as well. If the child wasn't
-+ * yet in the tasklist when we walked through it from
-+ * cgroup_enable_task_cg_lists(), then use_task_css_set_links value
-+ * should be visible now due to the paired locking and barriers implied
-+ * by LOCK/UNLOCK: it is written before the tasklist_lock unlock
-+ * in cgroup_enable_task_cg_lists() and read here after the tasklist_lock
-+ * lock on fork.
-+ */
-+ if (use_task_css_set_links) {
-+ write_lock(&css_set_lock);
-+ task_lock(child);
-+ if (list_empty(&child->cg_list))
-+ list_add(&child->cg_list, &task_css_set(child)->tasks);
-+ task_unlock(child);
-+ write_unlock(&css_set_lock);
-+ }
-+
-+ /*
-+ * Call ss->fork(). This must happen after @child is linked on
-+ * css_set; otherwise, @child might change state between ->fork()
-+ * and addition to css_set.
-+ */
-+ if (need_forkexit_callback) {
-+ /*
-+ * fork/exit callbacks are supported only for builtin
-+ * subsystems, and the builtin section of the subsys
-+ * array is immutable, so we don't need to lock the
-+ * subsys array here. On the other hand, modular section
-+ * of the array can be freed at module unload, so we
-+ * can't touch that.
-+ */
-+ for_each_builtin_subsys(ss, i)
-+ if (ss->fork)
-+ ss->fork(child);
-+ }
-+}
-+
-+/**
-+ * cgroup_exit - detach cgroup from exiting task
-+ * @tsk: pointer to task_struct of exiting process
-+ * @run_callback: run exit callbacks?
-+ *
-+ * Description: Detach cgroup from @tsk and release it.
-+ *
-+ * Note that cgroups marked notify_on_release force every task in
-+ * them to take the global cgroup_mutex mutex when exiting.
-+ * This could impact scaling on very large systems. Be reluctant to
-+ * use notify_on_release cgroups where very high task exit scaling
-+ * is required on large systems.
-+ *
-+ * the_top_cgroup_hack:
-+ *
-+ * Set the exiting tasks cgroup to the root cgroup (top_cgroup).
-+ *
-+ * We call cgroup_exit() while the task is still competent to
-+ * handle notify_on_release(), then leave the task attached to the
-+ * root cgroup in each hierarchy for the remainder of its exit.
-+ *
-+ * To do this properly, we would increment the reference count on
-+ * top_cgroup, and near the very end of the kernel/exit.c do_exit()
-+ * code we would add a second cgroup function call, to drop that
-+ * reference. This would just create an unnecessary hot spot on
-+ * the top_cgroup reference count, to no avail.
-+ *
-+ * Normally, holding a reference to a cgroup without bumping its
-+ * count is unsafe. The cgroup could go away, or someone could
-+ * attach us to a different cgroup, decrementing the count on
-+ * the first cgroup that we never incremented. But in this case,
-+ * top_cgroup isn't going away, and either task has PF_EXITING set,
-+ * which wards off any cgroup_attach_task() attempts, or task is a failed
-+ * fork, never visible to cgroup_attach_task.
-+ */
-+void cgroup_exit(struct task_struct *tsk, int run_callbacks)
-+{
-+ struct cgroup_subsys *ss;
-+ struct css_set *cset;
-+ int i;
-+
-+ /*
-+ * Unlink from the css_set task list if necessary.
-+ * Optimistically check cg_list before taking
-+ * css_set_lock
-+ */
-+ if (!list_empty(&tsk->cg_list)) {
-+ write_lock(&css_set_lock);
-+ if (!list_empty(&tsk->cg_list))
-+ list_del_init(&tsk->cg_list);
-+ write_unlock(&css_set_lock);
-+ }
-+
-+ /* Reassign the task to the init_css_set. */
-+ task_lock(tsk);
-+ cset = task_css_set(tsk);
-+ RCU_INIT_POINTER(tsk->cgroups, &init_css_set);
-+
-+ if (run_callbacks && need_forkexit_callback) {
-+ /*
-+ * fork/exit callbacks are supported only for builtin
-+ * subsystems, see cgroup_post_fork() for details.
-+ */
-+ for_each_builtin_subsys(ss, i) {
-+ if (ss->exit) {
-+ struct cgroup_subsys_state *old_css = cset->subsys[i];
-+ struct cgroup_subsys_state *css = task_css(tsk, i);
-+
-+ ss->exit(css, old_css, tsk);
-+ }
-+ }
-+ }
-+ task_unlock(tsk);
-+
-+ put_css_set_taskexit(cset);
-+}
-+
-+static void check_for_release(struct cgroup *cgrp)
-+{
-+ if (cgroup_is_releasable(cgrp) &&
-+ list_empty(&cgrp->cset_links) && list_empty(&cgrp->children)) {
-+ /*
-+ * Control Group is currently removeable. If it's not
-+ * already queued for a userspace notification, queue
-+ * it now
-+ */
-+ int need_schedule_work = 0;
-+
-+ raw_spin_lock(&release_list_lock);
-+ if (!cgroup_is_dead(cgrp) &&
-+ list_empty(&cgrp->release_list)) {
-+ list_add(&cgrp->release_list, &release_list);
-+ need_schedule_work = 1;
-+ }
-+ raw_spin_unlock(&release_list_lock);
-+ if (need_schedule_work)
-+ schedule_work(&release_agent_work);
-+ }
-+}
-+
-+/*
-+ * Notify userspace when a cgroup is released, by running the
-+ * configured release agent with the name of the cgroup (path
-+ * relative to the root of cgroup file system) as the argument.
-+ *
-+ * Most likely, this user command will try to rmdir this cgroup.
-+ *
-+ * This races with the possibility that some other task will be
-+ * attached to this cgroup before it is removed, or that some other
-+ * user task will 'mkdir' a child cgroup of this cgroup. That's ok.
-+ * The presumed 'rmdir' will fail quietly if this cgroup is no longer
-+ * unused, and this cgroup will be reprieved from its death sentence,
-+ * to continue to serve a useful existence. Next time it's released,
-+ * we will get notified again, if it still has 'notify_on_release' set.
-+ *
-+ * The final arg to call_usermodehelper() is UMH_WAIT_EXEC, which
-+ * means only wait until the task is successfully execve()'d. The
-+ * separate release agent task is forked by call_usermodehelper(),
-+ * then control in this thread returns here, without waiting for the
-+ * release agent task. We don't bother to wait because the caller of
-+ * this routine has no use for the exit status of the release agent
-+ * task, so no sense holding our caller up for that.
-+ */
-+static void cgroup_release_agent(struct work_struct *work)
-+{
-+ BUG_ON(work != &release_agent_work);
-+ mutex_lock(&cgroup_mutex);
-+ raw_spin_lock(&release_list_lock);
-+ while (!list_empty(&release_list)) {
-+ char *argv[3], *envp[3];
-+ int i;
-+ char *pathbuf = NULL, *agentbuf = NULL;
-+ struct cgroup *cgrp = list_entry(release_list.next,
-+ struct cgroup,
-+ release_list);
-+ list_del_init(&cgrp->release_list);
-+ raw_spin_unlock(&release_list_lock);
-+ pathbuf = kmalloc(PAGE_SIZE, GFP_KERNEL);
-+ if (!pathbuf)
-+ goto continue_free;
-+ if (cgroup_path(cgrp, pathbuf, PAGE_SIZE) < 0)
-+ goto continue_free;
-+ agentbuf = kstrdup(cgrp->root->release_agent_path, GFP_KERNEL);
-+ if (!agentbuf)
-+ goto continue_free;
-+
-+ i = 0;
-+ argv[i++] = agentbuf;
-+ argv[i++] = pathbuf;
-+ argv[i] = NULL;
-+
-+ i = 0;
-+ /* minimal command environment */
-+ envp[i++] = "HOME=/";
-+ envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
-+ envp[i] = NULL;
-+
-+ /* Drop the lock while we invoke the usermode helper,
-+ * since the exec could involve hitting disk and hence
-+ * be a slow process */
-+ mutex_unlock(&cgroup_mutex);
-+ call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
-+ mutex_lock(&cgroup_mutex);
-+ continue_free:
-+ kfree(pathbuf);
-+ kfree(agentbuf);
-+ raw_spin_lock(&release_list_lock);
-+ }
-+ raw_spin_unlock(&release_list_lock);
-+ mutex_unlock(&cgroup_mutex);
-+}
-+
-+static int __init cgroup_disable(char *str)
-+{
-+ struct cgroup_subsys *ss;
-+ char *token;
-+ int i;
-+
-+ while ((token = strsep(&str, ",")) != NULL) {
-+ if (!*token)
-+ continue;
-+
-+ /*
-+ * cgroup_disable, being at boot time, can't know about
-+ * module subsystems, so we don't worry about them.
-+ */
-+ for_each_builtin_subsys(ss, i) {
-+ if (!strcmp(token, ss->name)) {
-+ ss->disabled = 1;
-+ printk(KERN_INFO "Disabling %s control group"
-+ " subsystem\n", ss->name);
-+ break;
-+ }
-+ }
-+ }
-+ return 1;
-+}
-+__setup("cgroup_disable=", cgroup_disable);
-+
-+/**
-+ * css_from_dir - get corresponding css from the dentry of a cgroup dir
-+ * @dentry: directory dentry of interest
-+ * @ss: subsystem of interest
-+ *
-+ * Must be called under RCU read lock. The caller is responsible for
-+ * pinning the returned css if it needs to be accessed outside the RCU
-+ * critical section.
-+ */
-+struct cgroup_subsys_state *css_from_dir(struct dentry *dentry,
-+ struct cgroup_subsys *ss)
-+{
-+ struct cgroup *cgrp;
-+
-+ WARN_ON_ONCE(!rcu_read_lock_held());
-+
-+ /* is @dentry a cgroup dir? */
-+ if (!dentry->d_inode ||
-+ dentry->d_inode->i_op != &cgroup_dir_inode_operations)
-+ return ERR_PTR(-EBADF);
-+
-+ cgrp = __d_cgrp(dentry);
-+ return cgroup_css(cgrp, ss) ?: ERR_PTR(-ENOENT);
-+}
-+
-+/**
-+ * css_from_id - lookup css by id
-+ * @id: the cgroup id
-+ * @ss: cgroup subsys to be looked into
-+ *
-+ * Returns the css if there's valid one with @id, otherwise returns NULL.
-+ * Should be called under rcu_read_lock().
-+ */
-+struct cgroup_subsys_state *css_from_id(int id, struct cgroup_subsys *ss)
-+{
-+ struct cgroup *cgrp;
-+
-+ rcu_lockdep_assert(rcu_read_lock_held() ||
-+ lockdep_is_held(&cgroup_mutex),
-+ "css_from_id() needs proper protection");
-+
-+ cgrp = idr_find(&ss->root->cgroup_idr, id);
-+ if (cgrp)
-+ return cgroup_css(cgrp, ss);
-+ return NULL;
-+}
-+
-+#ifdef CONFIG_CGROUP_DEBUG
-+static struct cgroup_subsys_state *
-+debug_css_alloc(struct cgroup_subsys_state *parent_css)
-+{
-+ struct cgroup_subsys_state *css = kzalloc(sizeof(*css), GFP_KERNEL);
-+
-+ if (!css)
-+ return ERR_PTR(-ENOMEM);
-+
-+ return css;
-+}
-+
-+static void debug_css_free(struct cgroup_subsys_state *css)
-+{
-+ kfree(css);
-+}
-+
-+static u64 debug_taskcount_read(struct cgroup_subsys_state *css,
-+ struct cftype *cft)
-+{
-+ return cgroup_task_count(css->cgroup);
-+}
-+
-+static u64 current_css_set_read(struct cgroup_subsys_state *css,
-+ struct cftype *cft)
-+{
-+ return (u64)(unsigned long)current->cgroups;
-+}
-+
-+static u64 current_css_set_refcount_read(struct cgroup_subsys_state *css,
-+ struct cftype *cft)
-+{
-+ u64 count;
-+
-+ rcu_read_lock();
-+ count = atomic_read(&task_css_set(current)->refcount);
-+ rcu_read_unlock();
-+ return count;
-+}
-+
-+static int current_css_set_cg_links_read(struct cgroup_subsys_state *css,
-+ struct cftype *cft,
-+ struct seq_file *seq)
-+{
-+ struct cgrp_cset_link *link;
-+ struct css_set *cset;
-+
-+ read_lock(&css_set_lock);
-+ rcu_read_lock();
-+ cset = rcu_dereference(current->cgroups);
-+ list_for_each_entry(link, &cset->cgrp_links, cgrp_link) {
-+ struct cgroup *c = link->cgrp;
-+ const char *name;
-+
-+ if (c->dentry)
-+ name = c->dentry->d_name.name;
-+ else
-+ name = "?";
-+ seq_printf(seq, "Root %d group %s\n",
-+ c->root->hierarchy_id, name);
-+ }
-+ rcu_read_unlock();
-+ read_unlock(&css_set_lock);
-+ return 0;
-+}
-+
-+#define MAX_TASKS_SHOWN_PER_CSS 25
-+static int cgroup_css_links_read(struct cgroup_subsys_state *css,
-+ struct cftype *cft, struct seq_file *seq)
-+{
-+ struct cgrp_cset_link *link;
-+
-+ read_lock(&css_set_lock);
-+ list_for_each_entry(link, &css->cgroup->cset_links, cset_link) {
-+ struct css_set *cset = link->cset;
-+ struct task_struct *task;
-+ int count = 0;
-+ seq_printf(seq, "css_set %p\n", cset);
-+ list_for_each_entry(task, &cset->tasks, cg_list) {
-+ if (count++ > MAX_TASKS_SHOWN_PER_CSS) {
-+ seq_puts(seq, " ...\n");
-+ break;
-+ } else {
-+ seq_printf(seq, " task %d\n",
-+ task_pid_vnr(task));
-+ }
-+ }
-+ }
-+ read_unlock(&css_set_lock);
-+ return 0;
-+}
-+
-+static u64 releasable_read(struct cgroup_subsys_state *css, struct cftype *cft)
-+{
-+ return test_bit(CGRP_RELEASABLE, &css->cgroup->flags);
-+}
-+
-+static struct cftype debug_files[] = {
-+ {
-+ .name = "taskcount",
-+ .read_u64 = debug_taskcount_read,
-+ },
-+
-+ {
-+ .name = "current_css_set",
-+ .read_u64 = current_css_set_read,
-+ },
-+
-+ {
-+ .name = "current_css_set_refcount",
-+ .read_u64 = current_css_set_refcount_read,
-+ },
-+
-+ {
-+ .name = "current_css_set_cg_links",
-+ .read_seq_string = current_css_set_cg_links_read,
-+ },
-+
-+ {
-+ .name = "cgroup_css_links",
-+ .read_seq_string = cgroup_css_links_read,
-+ },
-+
-+ {
-+ .name = "releasable",
-+ .read_u64 = releasable_read,
-+ },
-+
-+ { } /* terminate */
-+};
-+
-+struct cgroup_subsys debug_subsys = {
-+ .name = "debug",
-+ .css_alloc = debug_css_alloc,
-+ .css_free = debug_css_free,
-+ .subsys_id = debug_subsys_id,
-+ .base_cftypes = debug_files,
-+};
-+#endif /* CONFIG_CGROUP_DEBUG */
-diff -Nur linux-3.13.6.orig/mm/memcontrol.c linux-3.13.6/mm/memcontrol.c
---- linux-3.13.6.orig/mm/memcontrol.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/mm/memcontrol.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/mm/memcontrol.c linux-raspberry-pi/mm/memcontrol.c
+--- linux-3.13.6/mm/memcontrol.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/mm/memcontrol.c 2014-03-11 16:55:47.000000000 +0100
@@ -7030,6 +7030,7 @@
.bind = mem_cgroup_bind,
.base_cftypes = mem_cgroup_files,
@@ -101607,9 +96467,9 @@ diff -Nur linux-3.13.6.orig/mm/memcontrol.c linux-3.13.6/mm/memcontrol.c
};
#ifdef CONFIG_MEMCG_SWAP
-diff -Nur linux-3.13.6.orig/sound/arm/bcm2835.c linux-3.13.6/sound/arm/bcm2835.c
---- linux-3.13.6.orig/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/arm/bcm2835.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/arm/bcm2835.c linux-raspberry-pi/sound/arm/bcm2835.c
+--- linux-3.13.6/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/arm/bcm2835.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,413 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -102024,9 +96884,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835.c linux-3.13.6/sound/arm/bcm2835.c
+MODULE_DESCRIPTION("Alsa driver for BCM2835 chip");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:bcm2835_alsa");
-diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-ctl.c linux-3.13.6/sound/arm/bcm2835-ctl.c
---- linux-3.13.6.orig/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/arm/bcm2835-ctl.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/arm/bcm2835-ctl.c linux-raspberry-pi/sound/arm/bcm2835-ctl.c
+--- linux-3.13.6/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/arm/bcm2835-ctl.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,200 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -102228,9 +97088,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-ctl.c linux-3.13.6/sound/arm/bcm28
+ }
+ return 0;
+}
-diff -Nur linux-3.13.6.orig/sound/arm/bcm2835.h linux-3.13.6/sound/arm/bcm2835.h
---- linux-3.13.6.orig/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/arm/bcm2835.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/arm/bcm2835.h linux-raspberry-pi/sound/arm/bcm2835.h
+--- linux-3.13.6/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/arm/bcm2835.h 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,157 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -102389,9 +97249,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835.h linux-3.13.6/sound/arm/bcm2835.h
+void bcm2835_audio_flush_playback_buffers(bcm2835_alsa_stream_t * alsa_stream);
+
+#endif /* __SOUND_ARM_BCM2835_H */
-diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-pcm.c linux-3.13.6/sound/arm/bcm2835-pcm.c
---- linux-3.13.6.orig/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/arm/bcm2835-pcm.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/arm/bcm2835-pcm.c linux-raspberry-pi/sound/arm/bcm2835-pcm.c
+--- linux-3.13.6/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/arm/bcm2835-pcm.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,426 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -102819,9 +97679,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-pcm.c linux-3.13.6/sound/arm/bcm28
+
+ return 0;
+}
-diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-vchiq.c linux-3.13.6/sound/arm/bcm2835-vchiq.c
---- linux-3.13.6.orig/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/arm/bcm2835-vchiq.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/arm/bcm2835-vchiq.c linux-raspberry-pi/sound/arm/bcm2835-vchiq.c
+--- linux-3.13.6/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/arm/bcm2835-vchiq.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,879 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -103003,7 +97863,7 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-vchiq.c linux-3.13.6/sound/arm/bcm
+
+void my_workqueue_init(bcm2835_alsa_stream_t * alsa_stream)
+{
-+ alsa_stream->my_wq = create_workqueue("my_queue");
++ alsa_stream->my_wq = alloc_workqueue("my_queue", WQ_HIGHPRI, 1);
+ return;
+}
+
@@ -103702,9 +98562,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-vchiq.c linux-3.13.6/sound/arm/bcm
+
+module_param(force_bulk, bool, 0444);
+MODULE_PARM_DESC(force_bulk, "Force use of vchiq bulk for audio");
-diff -Nur linux-3.13.6.orig/sound/arm/Kconfig linux-3.13.6/sound/arm/Kconfig
---- linux-3.13.6.orig/sound/arm/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/sound/arm/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/arm/Kconfig linux-raspberry-pi/sound/arm/Kconfig
+--- linux-3.13.6/sound/arm/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/sound/arm/Kconfig 2014-03-11 16:53:23.000000000 +0100
@@ -39,5 +39,12 @@
Say Y or M if you want to support any AC97 codec attached to
the PXA2xx AC97 interface.
@@ -103718,9 +98578,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/Kconfig linux-3.13.6/sound/arm/Kconfig
+
endif # SND_ARM
-diff -Nur linux-3.13.6.orig/sound/arm/Makefile linux-3.13.6/sound/arm/Makefile
---- linux-3.13.6.orig/sound/arm/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/sound/arm/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/arm/Makefile linux-raspberry-pi/sound/arm/Makefile
+--- linux-3.13.6/sound/arm/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/sound/arm/Makefile 2014-03-11 16:55:50.000000000 +0100
@@ -14,3 +14,8 @@
obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o
@@ -103730,9 +98590,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/Makefile linux-3.13.6/sound/arm/Makefile
+snd-bcm2835-objs := bcm2835.o bcm2835-ctl.o bcm2835-pcm.o bcm2835-vchiq.o
+
+EXTRA_CFLAGS += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000
-diff -Nur linux-3.13.6.orig/sound/arm/vc_vchi_audioserv_defs.h linux-3.13.6/sound/arm/vc_vchi_audioserv_defs.h
---- linux-3.13.6.orig/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/arm/vc_vchi_audioserv_defs.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/arm/vc_vchi_audioserv_defs.h linux-raspberry-pi/sound/arm/vc_vchi_audioserv_defs.h
+--- linux-3.13.6/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/arm/vc_vchi_audioserv_defs.h 2014-03-11 16:53:23.000000000 +0100
@@ -0,0 +1,116 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -103850,9 +98710,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/vc_vchi_audioserv_defs.h linux-3.13.6/soun
+} VC_AUDIO_MSG_T;
+
+#endif // _VC_AUDIO_DEFS_H_
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/bcm2708-i2s.c linux-3.13.6/sound/soc/bcm/bcm2708-i2s.c
---- linux-3.13.6.orig/sound/soc/bcm/bcm2708-i2s.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/bcm2708-i2s.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/bcm2708-i2s.c linux-raspberry-pi/sound/soc/bcm/bcm2708-i2s.c
+--- linux-3.13.6/sound/soc/bcm/bcm2708-i2s.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/bcm2708-i2s.c 2014-03-11 16:53:24.000000000 +0100
@@ -0,0 +1,945 @@
+/*
+ * ALSA SoC I2S Audio Layer for Broadcom BCM2708 SoC
@@ -104799,9 +99659,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/bcm2708-i2s.c linux-3.13.6/sound/soc/b
+MODULE_DESCRIPTION("BCM2708 I2S interface");
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/hifiberry_dac.c linux-3.13.6/sound/soc/bcm/hifiberry_dac.c
---- linux-3.13.6.orig/sound/soc/bcm/hifiberry_dac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/hifiberry_dac.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/hifiberry_dac.c linux-raspberry-pi/sound/soc/bcm/hifiberry_dac.c
+--- linux-3.13.6/sound/soc/bcm/hifiberry_dac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/hifiberry_dac.c 2014-03-11 16:53:24.000000000 +0100
@@ -0,0 +1,100 @@
+/*
+ * ASoC Driver for HifiBerry DAC
@@ -104903,9 +99763,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/hifiberry_dac.c linux-3.13.6/sound/soc
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_DESCRIPTION("ASoC Driver for HifiBerry DAC");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/hifiberry_digi.c linux-3.13.6/sound/soc/bcm/hifiberry_digi.c
---- linux-3.13.6.orig/sound/soc/bcm/hifiberry_digi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/hifiberry_digi.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/hifiberry_digi.c linux-raspberry-pi/sound/soc/bcm/hifiberry_digi.c
+--- linux-3.13.6/sound/soc/bcm/hifiberry_digi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/hifiberry_digi.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,153 @@
+/*
+ * ASoC Driver for HifiBerry Digi
@@ -105060,9 +99920,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/hifiberry_digi.c linux-3.13.6/sound/so
+MODULE_AUTHOR("Daniel Matuschek <info@crazy-audio.com>");
+MODULE_DESCRIPTION("ASoC Driver for HifiBerry Digi");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/Kconfig linux-3.13.6/sound/soc/bcm/Kconfig
---- linux-3.13.6.orig/sound/soc/bcm/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/Kconfig 2014-03-10 14:42:21.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/Kconfig linux-raspberry-pi/sound/soc/bcm/Kconfig
+--- linux-3.13.6/sound/soc/bcm/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/Kconfig 2014-03-11 16:57:48.000000000 +0100
@@ -0,0 +1,73 @@
+config SND_BCM2708_SOC_I2S
+ tristate "SoC Audio support for the Broadcom BCM2708 I2S module"
@@ -105137,9 +99997,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/Kconfig linux-3.13.6/sound/soc/bcm/Kco
+ select SND_SOC_PCM5102A
+ help
+ Say Y if you want to add support for PCM5102A
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/Makefile linux-3.13.6/sound/soc/bcm/Makefile
---- linux-3.13.6.orig/sound/soc/bcm/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/Makefile linux-raspberry-pi/sound/soc/bcm/Makefile
+--- linux-3.13.6/sound/soc/bcm/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/Makefile 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,23 @@
+# BCM2708 Platform Support
+snd-soc-bcm2708-i2s-objs := bcm2708-i2s.o
@@ -105164,9 +100024,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/Makefile linux-3.13.6/sound/soc/bcm/Ma
+obj-$(CONFIG_SND_BCM2708_SOC_RPI_CODEC_PROTO) += snd-soc-rpi-proto.o
+obj-$(CONFIG_SND_BCM2708_SOC_RPI_CODEC_ESS9018) += snd-soc-rpi-ess9018.o
+obj-$(CONFIG_SND_BCM2708_SOC_RPI_CODEC_PCM5102A) += snd-soc-rpi-pcm5102a.o
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-cs534x.c linux-3.13.6/sound/soc/bcm/rpi-cs534x.c
---- linux-3.13.6.orig/sound/soc/bcm/rpi-cs534x.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/rpi-cs534x.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/rpi-cs534x.c linux-raspberry-pi/sound/soc/bcm/rpi-cs534x.c
+--- linux-3.13.6/sound/soc/bcm/rpi-cs534x.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/rpi-cs534x.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,105 @@
+/*
+ * ASoC driver for CS5343/CS5344 ADC
@@ -105273,9 +100133,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-cs534x.c linux-3.13.6/sound/soc/bc
+MODULE_AUTHOR("Wojciech M. Zabolotny");
+MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to a cs534x");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-dac.c linux-3.13.6/sound/soc/bcm/rpi-dac.c
---- linux-3.13.6.orig/sound/soc/bcm/rpi-dac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/rpi-dac.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/rpi-dac.c linux-raspberry-pi/sound/soc/bcm/rpi-dac.c
+--- linux-3.13.6/sound/soc/bcm/rpi-dac.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/rpi-dac.c 2014-03-11 16:53:24.000000000 +0100
@@ -0,0 +1,97 @@
+/*
+ * ASoC Driver for RPi-DAC.
@@ -105374,9 +100234,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-dac.c linux-3.13.6/sound/soc/bcm/r
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_DESCRIPTION("ASoC Driver for RPi-DAC");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-ess9018.c linux-3.13.6/sound/soc/bcm/rpi-ess9018.c
---- linux-3.13.6.orig/sound/soc/bcm/rpi-ess9018.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/rpi-ess9018.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/rpi-ess9018.c linux-raspberry-pi/sound/soc/bcm/rpi-ess9018.c
+--- linux-3.13.6/sound/soc/bcm/rpi-ess9018.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/rpi-ess9018.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,92 @@
+/*
+ * ASoC driver for ESS9018 codec
@@ -105470,9 +100330,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-ess9018.c linux-3.13.6/sound/soc/b
+MODULE_AUTHOR("Florian Meier");
+MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to a ESS9018");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-mbed.c linux-3.13.6/sound/soc/bcm/rpi-mbed.c
---- linux-3.13.6.orig/sound/soc/bcm/rpi-mbed.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/rpi-mbed.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/rpi-mbed.c linux-raspberry-pi/sound/soc/bcm/rpi-mbed.c
+--- linux-3.13.6/sound/soc/bcm/rpi-mbed.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/rpi-mbed.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,103 @@
+/*
+ * ASoC driver for mbed AudioCODEC (with a TLV320AIC23b)
@@ -105577,9 +100437,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-mbed.c linux-3.13.6/sound/soc/bcm/
+MODULE_AUTHOR("Florian Meier");
+MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to mbed AudioCODEC");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-pcm5102a.c linux-3.13.6/sound/soc/bcm/rpi-pcm5102a.c
---- linux-3.13.6.orig/sound/soc/bcm/rpi-pcm5102a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/rpi-pcm5102a.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/rpi-pcm5102a.c linux-raspberry-pi/sound/soc/bcm/rpi-pcm5102a.c
+--- linux-3.13.6/sound/soc/bcm/rpi-pcm5102a.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/rpi-pcm5102a.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,93 @@
+/*
+ * ASoC driver for PCM5102A codec
@@ -105674,9 +100534,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-pcm5102a.c linux-3.13.6/sound/soc/
+MODULE_AUTHOR("Francesco Valla");
+MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to a PCM5102A");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-proto.c linux-3.13.6/sound/soc/bcm/rpi-proto.c
---- linux-3.13.6.orig/sound/soc/bcm/rpi-proto.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/rpi-proto.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/rpi-proto.c linux-raspberry-pi/sound/soc/bcm/rpi-proto.c
+--- linux-3.13.6/sound/soc/bcm/rpi-proto.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/rpi-proto.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,130 @@
+/*
+ * ASoC driver for PROTO AudioCODEC (with a WM8731)
@@ -105808,9 +100668,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-proto.c linux-3.13.6/sound/soc/bcm
+MODULE_AUTHOR("Florian Meier");
+MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to PROTO board (WM8731)");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-tda1541a.c linux-3.13.6/sound/soc/bcm/rpi-tda1541a.c
---- linux-3.13.6.orig/sound/soc/bcm/rpi-tda1541a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/bcm/rpi-tda1541a.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/bcm/rpi-tda1541a.c linux-raspberry-pi/sound/soc/bcm/rpi-tda1541a.c
+--- linux-3.13.6/sound/soc/bcm/rpi-tda1541a.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/bcm/rpi-tda1541a.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,92 @@
+/*
+ * ASoC driver for TDA1541A codec
@@ -105904,9 +100764,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-tda1541a.c linux-3.13.6/sound/soc/
+MODULE_AUTHOR("Florian Meier");
+MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to a TDA1541A");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.6.orig/sound/soc/codecs/Kconfig linux-3.13.6/sound/soc/codecs/Kconfig
---- linux-3.13.6.orig/sound/soc/codecs/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/sound/soc/codecs/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/codecs/Kconfig linux-raspberry-pi/sound/soc/codecs/Kconfig
+--- linux-3.13.6/sound/soc/codecs/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/sound/soc/codecs/Kconfig 2014-03-11 16:55:50.000000000 +0100
@@ -59,6 +59,8 @@
select SND_SOC_PCM1681 if I2C
select SND_SOC_PCM1792A if SPI_MASTER
@@ -105929,9 +100789,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/Kconfig linux-3.13.6/sound/soc/code
config SND_SOC_RT5631
tristate
-diff -Nur linux-3.13.6.orig/sound/soc/codecs/Makefile linux-3.13.6/sound/soc/codecs/Makefile
---- linux-3.13.6.orig/sound/soc/codecs/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/sound/soc/codecs/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/codecs/Makefile linux-raspberry-pi/sound/soc/codecs/Makefile
+--- linux-3.13.6/sound/soc/codecs/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/sound/soc/codecs/Makefile 2014-03-11 16:55:50.000000000 +0100
@@ -46,6 +46,8 @@
snd-soc-pcm1681-objs := pcm1681.o
snd-soc-pcm1792a-codec-objs := pcm1792a.o
@@ -105950,9 +100810,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/Makefile linux-3.13.6/sound/soc/cod
obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o
obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o
obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o
-diff -Nur linux-3.13.6.orig/sound/soc/codecs/pcm1794a.c linux-3.13.6/sound/soc/codecs/pcm1794a.c
---- linux-3.13.6.orig/sound/soc/codecs/pcm1794a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/codecs/pcm1794a.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/codecs/pcm1794a.c linux-raspberry-pi/sound/soc/codecs/pcm1794a.c
+--- linux-3.13.6/sound/soc/codecs/pcm1794a.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/codecs/pcm1794a.c 2014-03-11 16:53:24.000000000 +0100
@@ -0,0 +1,62 @@
+/*
+ * Driver for the PCM1794A codec
@@ -106016,9 +100876,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/pcm1794a.c linux-3.13.6/sound/soc/c
+MODULE_DESCRIPTION("ASoC PCM1794A codec driver");
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.13.6.orig/sound/soc/codecs/pcm5102a.c linux-3.13.6/sound/soc/codecs/pcm5102a.c
---- linux-3.13.6.orig/sound/soc/codecs/pcm5102a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.6/sound/soc/codecs/pcm5102a.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/codecs/pcm5102a.c linux-raspberry-pi/sound/soc/codecs/pcm5102a.c
+--- linux-3.13.6/sound/soc/codecs/pcm5102a.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-raspberry-pi/sound/soc/codecs/pcm5102a.c 2014-03-11 16:55:50.000000000 +0100
@@ -0,0 +1,63 @@
+/*
+ * Driver for the PCM5102A codec
@@ -106083,9 +100943,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/pcm5102a.c linux-3.13.6/sound/soc/c
+MODULE_DESCRIPTION("ASoC PCM5102A codec driver");
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.13.6.orig/sound/soc/codecs/wm8804.c linux-3.13.6/sound/soc/codecs/wm8804.c
---- linux-3.13.6.orig/sound/soc/codecs/wm8804.c 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/sound/soc/codecs/wm8804.c 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/codecs/wm8804.c linux-raspberry-pi/sound/soc/codecs/wm8804.c
+--- linux-3.13.6/sound/soc/codecs/wm8804.c 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/sound/soc/codecs/wm8804.c 2014-03-11 16:53:24.000000000 +0100
@@ -63,6 +63,7 @@
struct regmap *regmap;
struct regulator_bulk_data supplies[WM8804_NUM_SUPPLIES];
@@ -106171,9 +101031,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/wm8804.c linux-3.13.6/sound/soc/cod
.controls = wm8804_snd_controls,
.num_controls = ARRAY_SIZE(wm8804_snd_controls),
-diff -Nur linux-3.13.6.orig/sound/soc/codecs/wm8804.h linux-3.13.6/sound/soc/codecs/wm8804.h
---- linux-3.13.6.orig/sound/soc/codecs/wm8804.h 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/sound/soc/codecs/wm8804.h 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/codecs/wm8804.h linux-raspberry-pi/sound/soc/codecs/wm8804.h
+--- linux-3.13.6/sound/soc/codecs/wm8804.h 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/sound/soc/codecs/wm8804.h 2014-03-11 16:53:24.000000000 +0100
@@ -57,5 +57,9 @@
#define WM8804_CLKOUT_SRC_OSCCLK 4
@@ -106184,9 +101044,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/wm8804.h linux-3.13.6/sound/soc/cod
+#define WM8804_MCLKDIV_128FS 1
#endif /* _WM8804_H */
-diff -Nur linux-3.13.6.orig/sound/soc/Kconfig linux-3.13.6/sound/soc/Kconfig
---- linux-3.13.6.orig/sound/soc/Kconfig 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/sound/soc/Kconfig 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/Kconfig linux-raspberry-pi/sound/soc/Kconfig
+--- linux-3.13.6/sound/soc/Kconfig 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/sound/soc/Kconfig 2014-03-11 16:55:50.000000000 +0100
@@ -33,6 +33,7 @@
# All the supported SoCs
source "sound/soc/atmel/Kconfig"
@@ -106195,9 +101055,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/Kconfig linux-3.13.6/sound/soc/Kconfig
source "sound/soc/blackfin/Kconfig"
source "sound/soc/cirrus/Kconfig"
source "sound/soc/davinci/Kconfig"
-diff -Nur linux-3.13.6.orig/sound/soc/Makefile linux-3.13.6/sound/soc/Makefile
---- linux-3.13.6.orig/sound/soc/Makefile 2014-03-07 07:07:02.000000000 +0100
-+++ linux-3.13.6/sound/soc/Makefile 2014-03-10 14:41:55.000000000 +0100
+diff -Nur linux-3.13.6/sound/soc/Makefile linux-raspberry-pi/sound/soc/Makefile
+--- linux-3.13.6/sound/soc/Makefile 2014-03-07 07:07:02.000000000 +0100
++++ linux-raspberry-pi/sound/soc/Makefile 2014-03-11 16:55:50.000000000 +0100
@@ -10,6 +10,7 @@
obj-$(CONFIG_SND_SOC) += generic/
obj-$(CONFIG_SND_SOC) += atmel/