summaryrefslogtreecommitdiff
path: root/target/linux
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2014-03-10 16:16:12 +0100
committerWaldemar Brodkorb <wbx@openadk.org>2014-03-10 16:16:12 +0100
commit5ab921af6386c3c9ba3f2dd8b3e0db9bfd8903f4 (patch)
tree3fcbe68bf9aef3ef59eff3c17c02d9b5005e52c1 /target/linux
parent7a22456611f068b55d84fb8d36b16f8d8a408849 (diff)
kernel bump, add hifiberry device drivers
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/config/Config.in.audio33
-rw-r--r--target/linux/config/Config.in.netfilter.ip411
-rw-r--r--target/linux/patches/3.13.6/bsd-compatibility.patch (renamed from target/linux/patches/3.13.5/bsd-compatibility.patch)0
-rw-r--r--target/linux/patches/3.13.6/defaults.patch (renamed from target/linux/patches/3.13.5/defaults.patch)0
-rw-r--r--target/linux/patches/3.13.6/disable-netfilter.patch (renamed from target/linux/patches/3.13.5/disable-netfilter.patch)0
-rw-r--r--target/linux/patches/3.13.6/export-symbol-for-exmap.patch (renamed from target/linux/patches/3.13.5/export-symbol-for-exmap.patch)0
-rw-r--r--target/linux/patches/3.13.6/gemalto.patch (renamed from target/linux/patches/3.13.5/gemalto.patch)0
-rw-r--r--target/linux/patches/3.13.6/lemote-rfkill.patch (renamed from target/linux/patches/3.13.5/lemote-rfkill.patch)0
-rw-r--r--target/linux/patches/3.13.6/microblaze-axi.patch (renamed from target/linux/patches/3.13.5/microblaze-axi.patch)0
-rw-r--r--target/linux/patches/3.13.6/microblaze-ethernet.patch (renamed from target/linux/patches/3.13.5/microblaze-ethernet.patch)0
-rw-r--r--target/linux/patches/3.13.6/microblaze-setup.patch (renamed from target/linux/patches/3.13.5/microblaze-setup.patch)0
-rw-r--r--target/linux/patches/3.13.6/mtd-rootfs.patch (renamed from target/linux/patches/3.13.5/mtd-rootfs.patch)0
-rw-r--r--target/linux/patches/3.13.6/non-static.patch (renamed from target/linux/patches/3.13.5/non-static.patch)0
-rw-r--r--target/linux/patches/3.13.6/ppc64-missing-zlib.patch (renamed from target/linux/patches/3.13.5/ppc64-missing-zlib.patch)0
-rw-r--r--target/linux/patches/3.13.6/ppc64-missing_arch_random.patch (renamed from target/linux/patches/3.13.5/ppc64-missing_arch_random.patch)0
-rw-r--r--target/linux/patches/3.13.6/raspberry.patch (renamed from target/linux/patches/3.13.5/raspberry.patch)7216
-rw-r--r--target/linux/patches/3.13.6/startup.patch (renamed from target/linux/patches/3.13.5/startup.patch)0
-rw-r--r--target/linux/patches/3.13.6/uuid.patch (renamed from target/linux/patches/3.13.5/uuid.patch)0
-rw-r--r--target/linux/patches/3.13.6/vga-cons-default-off.patch (renamed from target/linux/patches/3.13.5/vga-cons-default-off.patch)0
-rw-r--r--target/linux/patches/3.13.6/wlan-cf.patch (renamed from target/linux/patches/3.13.5/wlan-cf.patch)0
-rw-r--r--target/linux/patches/3.13.6/xargs.patch (renamed from target/linux/patches/3.13.5/xargs.patch)0
-rw-r--r--target/linux/patches/3.13.6/zlib-inflate.patch (renamed from target/linux/patches/3.13.5/zlib-inflate.patch)0
22 files changed, 6476 insertions, 784 deletions
diff --git a/target/linux/config/Config.in.audio b/target/linux/config/Config.in.audio
index 76c353f0c..c466bed45 100644
--- a/target/linux/config/Config.in.audio
+++ b/target/linux/config/Config.in.audio
@@ -7,9 +7,6 @@ config ADK_KERNEL_SND_ARM
config ADK_KERNEL_SND_USB
boolean
-config ADK_KERNEL_SND_SOC
- boolean
-
config ADK_KERNEL_SND_PXA2XX_AC97
boolean
@@ -105,6 +102,10 @@ config ADK_KPACKAGE_KMOD_SND_CS5535AUDIO
help
ALSA AMD CS5535 driver
+config ADK_KPACKAGE_KMOD_SND_SOC
+ tristate
+ default n
+
config ADK_KERNEL_SND_PXA2XX_SOC
tristate
default n
@@ -113,10 +114,10 @@ config ADK_KPACKAGE_KMOD_SND_PXA2XX_SOC_SPITZ
prompt "kmod-snd-pxa2xx-soc-spitz..... ALSA SOC Sharp Zaurus"
tristate
select ADK_KERNEL_SND_ARM
- select ADK_KERNEL_SND_SOC
select ADK_KERNEL_SND_PXA2XX_AC97
- select ADK_KPACKAGE_KMOD_SND_AC97_CODEC
select ADK_KPACKAGE_KMOD_SND
+ select ADK_KPACKAGE_KMOD_SND_AC97_CODEC
+ select ADK_KPACKAGE_KMOD_SND_SOC
select ADK_KERNEL_SND_PXA2XX_SOC
depends on ADK_TARGET_SYSTEM_SHARP_ZAURUS
default y if ADK_TARGET_SYSTEM_SHARP_ZAURUS
@@ -131,4 +132,26 @@ config ADK_KPACKAGE_KMOD_SND_BCM2835
default y if ADK_TARGET_SYSTEM_RASPBERRY_PI
default n
+config ADK_KPACKAGE_KMOD_SND_BCM2708_SOC_I2S
+ prompt "kmod-snd-bcm2708-soc-i2s........ ALSA SOC I2S Raspberry PI"
+ select ADK_KPACKAGE_KMOD_SND
+ select ADK_KERNEL_SND_ARM
+ select ADK_KPACKAGE_KMOD_SND_SOC
+ boolean
+ default n
+
+config ADK_KPACKAGE_KMOD_SND_BCM2708_SOC_HIFIBERRY_DAC
+ prompt "kmod-snd-bcm2708-hifiberry-dac.... ALSA for Raspberry PI with hifiberry DAC"
+ tristate
+ select ADK_KPACKAGE_KMOD_SND_BCM2708_SOC_I2S
+ depends on ADK_TARGET_SYSTEM_RASPBERRY_PI
+ default n
+
+config ADK_KPACKAGE_KMOD_SND_BCM2708_SOC_HIFIBERRY_DIGI
+ prompt "kmod-snd-bcm2708-hifiberry-digi... ALSA for Raspberry PI with hifiberry DIGI"
+ tristate
+ select ADK_KPACKAGE_KMOD_SND_BCM2708_SOC_I2S
+ depends on ADK_TARGET_SYSTEM_RASPBERRY_PI
+ default n
+
endmenu
diff --git a/target/linux/config/Config.in.netfilter.ip4 b/target/linux/config/Config.in.netfilter.ip4
index cf33c02a2..b43a566b9 100644
--- a/target/linux/config/Config.in.netfilter.ip4
+++ b/target/linux/config/Config.in.netfilter.ip4
@@ -37,9 +37,10 @@ config ADK_KPACKAGE_KMOD_IP_NF_FILTER
config ADK_KPACKAGE_KMOD_FULL_NAT
tristate "Meta package for Full NAT"
select ADK_KPACKAGE_KMOD_NF_NAT if ADK_KERNEL_VERSION_3_4_82
+ select ADK_KPACKAGE_KMOD_NF_NAT_IPV4 if ADK_KERNEL_VERSION_3_10_30
select ADK_KPACKAGE_KMOD_NF_NAT_IPV4 if ADK_KERNEL_VERSION_3_11_10
- select ADK_KPACKAGE_KMOD_NF_NAT_IPV4 if ADK_KERNEL_VERSION_3_12_11
- select ADK_KPACKAGE_KMOD_NF_NAT_IPV4 if ADK_KERNEL_VERSION_3_13_5
+ select ADK_KPACKAGE_KMOD_NF_NAT_IPV4 if ADK_KERNEL_VERSION_3_12_13
+ select ADK_KPACKAGE_KMOD_NF_NAT_IPV4 if ADK_KERNEL_VERSION_3_13_6
config ADK_KPACKAGE_KMOD_NF_NAT
tristate 'Full NAT'
@@ -53,8 +54,10 @@ config ADK_KPACKAGE_KMOD_NF_NAT
config ADK_KPACKAGE_KMOD_NF_NAT_IPV4
tristate 'Full NAT'
depends on ADK_KPACKAGE_KMOD_IP_NF_IPTABLES
- depends on ADK_KERNEL_VERSION_3_11_10 || ADK_KERNEL_VERSION_3_12_11 \
- || ADK_KERNEL_VERSION_3_13_5
+ depends on ADK_KERNEL_VERSION_3_10_30 \
+ || ADK_KERNEL_VERSION_3_11_10 \
+ || ADK_KERNEL_VERSION_3_12_13 \
+ || ADK_KERNEL_VERSION_3_13_6
help
The Full NAT option allows masquerading, port forwarding and other
forms of full Network Address Port Translation. It is controlled by
diff --git a/target/linux/patches/3.13.5/bsd-compatibility.patch b/target/linux/patches/3.13.6/bsd-compatibility.patch
index b954b658f..b954b658f 100644
--- a/target/linux/patches/3.13.5/bsd-compatibility.patch
+++ b/target/linux/patches/3.13.6/bsd-compatibility.patch
diff --git a/target/linux/patches/3.13.5/defaults.patch b/target/linux/patches/3.13.6/defaults.patch
index 6cdca084e..6cdca084e 100644
--- a/target/linux/patches/3.13.5/defaults.patch
+++ b/target/linux/patches/3.13.6/defaults.patch
diff --git a/target/linux/patches/3.13.5/disable-netfilter.patch b/target/linux/patches/3.13.6/disable-netfilter.patch
index 7b1ca013a..7b1ca013a 100644
--- a/target/linux/patches/3.13.5/disable-netfilter.patch
+++ b/target/linux/patches/3.13.6/disable-netfilter.patch
diff --git a/target/linux/patches/3.13.5/export-symbol-for-exmap.patch b/target/linux/patches/3.13.6/export-symbol-for-exmap.patch
index 4f0fc8449..4f0fc8449 100644
--- a/target/linux/patches/3.13.5/export-symbol-for-exmap.patch
+++ b/target/linux/patches/3.13.6/export-symbol-for-exmap.patch
diff --git a/target/linux/patches/3.13.5/gemalto.patch b/target/linux/patches/3.13.6/gemalto.patch
index 65f7af1d7..65f7af1d7 100644
--- a/target/linux/patches/3.13.5/gemalto.patch
+++ b/target/linux/patches/3.13.6/gemalto.patch
diff --git a/target/linux/patches/3.13.5/lemote-rfkill.patch b/target/linux/patches/3.13.6/lemote-rfkill.patch
index a61488434..a61488434 100644
--- a/target/linux/patches/3.13.5/lemote-rfkill.patch
+++ b/target/linux/patches/3.13.6/lemote-rfkill.patch
diff --git a/target/linux/patches/3.13.5/microblaze-axi.patch b/target/linux/patches/3.13.6/microblaze-axi.patch
index 1a4b17d8c..1a4b17d8c 100644
--- a/target/linux/patches/3.13.5/microblaze-axi.patch
+++ b/target/linux/patches/3.13.6/microblaze-axi.patch
diff --git a/target/linux/patches/3.13.5/microblaze-ethernet.patch b/target/linux/patches/3.13.6/microblaze-ethernet.patch
index 742ab477e..742ab477e 100644
--- a/target/linux/patches/3.13.5/microblaze-ethernet.patch
+++ b/target/linux/patches/3.13.6/microblaze-ethernet.patch
diff --git a/target/linux/patches/3.13.5/microblaze-setup.patch b/target/linux/patches/3.13.6/microblaze-setup.patch
index 43815f274..43815f274 100644
--- a/target/linux/patches/3.13.5/microblaze-setup.patch
+++ b/target/linux/patches/3.13.6/microblaze-setup.patch
diff --git a/target/linux/patches/3.13.5/mtd-rootfs.patch b/target/linux/patches/3.13.6/mtd-rootfs.patch
index 775d5fc80..775d5fc80 100644
--- a/target/linux/patches/3.13.5/mtd-rootfs.patch
+++ b/target/linux/patches/3.13.6/mtd-rootfs.patch
diff --git a/target/linux/patches/3.13.5/non-static.patch b/target/linux/patches/3.13.6/non-static.patch
index a967703d0..a967703d0 100644
--- a/target/linux/patches/3.13.5/non-static.patch
+++ b/target/linux/patches/3.13.6/non-static.patch
diff --git a/target/linux/patches/3.13.5/ppc64-missing-zlib.patch b/target/linux/patches/3.13.6/ppc64-missing-zlib.patch
index c6e0616be..c6e0616be 100644
--- a/target/linux/patches/3.13.5/ppc64-missing-zlib.patch
+++ b/target/linux/patches/3.13.6/ppc64-missing-zlib.patch
diff --git a/target/linux/patches/3.13.5/ppc64-missing_arch_random.patch b/target/linux/patches/3.13.6/ppc64-missing_arch_random.patch
index b341a7be5..b341a7be5 100644
--- a/target/linux/patches/3.13.5/ppc64-missing_arch_random.patch
+++ b/target/linux/patches/3.13.6/ppc64-missing_arch_random.patch
diff --git a/target/linux/patches/3.13.5/raspberry.patch b/target/linux/patches/3.13.6/raspberry.patch
index 777a04436..980740e8d 100644
--- a/target/linux/patches/3.13.5/raspberry.patch
+++ b/target/linux/patches/3.13.6/raspberry.patch
@@ -1,6 +1,6 @@
-diff -Nur linux-3.13.3.orig/arch/arm/configs/bcmrpi_cutdown_defconfig linux-3.13.3/arch/arm/configs/bcmrpi_cutdown_defconfig
---- linux-3.13.3.orig/arch/arm/configs/bcmrpi_cutdown_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/configs/bcmrpi_cutdown_defconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,503 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
@@ -505,9 +505,9 @@ diff -Nur linux-3.13.3.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.3.orig/arch/arm/configs/bcmrpi_defconfig linux-3.13.3/arch/arm/configs/bcmrpi_defconfig
---- linux-3.13.3.orig/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/configs/bcmrpi_defconfig 2014-02-17 22:41:01.000000000 +0100
+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 @@
+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
+# CONFIG_LOCALVERSION_AUTO is not set
@@ -1597,9 +1597,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/configs/bcmrpi_defconfig linux-3.13.3/arch/
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.13.3.orig/arch/arm/configs/bcmrpi_emergency_defconfig linux-3.13.3/arch/arm/configs/bcmrpi_emergency_defconfig
---- linux-3.13.3.orig/arch/arm/configs/bcmrpi_emergency_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/configs/bcmrpi_emergency_defconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,532 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
@@ -2133,9 +2133,9 @@ diff -Nur linux-3.13.3.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.3.orig/arch/arm/configs/bcmrpi_quick_defconfig linux-3.13.3/arch/arm/configs/bcmrpi_quick_defconfig
---- linux-3.13.3.orig/arch/arm/configs/bcmrpi_quick_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/configs/bcmrpi_quick_defconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,197 @@
+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
+CONFIG_LOCALVERSION="-quick"
@@ -2334,9 +2334,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/configs/bcmrpi_quick_defconfig linux-3.13.3
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_LIBCRC32C=y
-diff -Nur linux-3.13.3.orig/arch/arm/include/asm/fiq.h linux-3.13.3/arch/arm/include/asm/fiq.h
---- linux-3.13.3.orig/arch/arm/include/asm/fiq.h 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/include/asm/fiq.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -42,6 +42,7 @@
/* helpers defined in fiqasm.S: */
extern void __set_fiq_regs(unsigned long const *regs);
@@ -2345,9 +2345,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/include/asm/fiq.h linux-3.13.3/arch/arm/inc
static inline void set_fiq_regs(struct pt_regs const *regs)
{
-diff -Nur linux-3.13.3.orig/arch/arm/Kconfig linux-3.13.3/arch/arm/Kconfig
---- linux-3.13.3.orig/arch/arm/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -373,6 +373,24 @@
This enables support for systems based on Atmel
AT91RM9200 and AT91SAM9* processors.
@@ -2381,9 +2381,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/Kconfig linux-3.13.3/arch/arm/Kconfig
source "arch/arm/mach-zynq/Kconfig"
-diff -Nur linux-3.13.3.orig/arch/arm/Kconfig.debug linux-3.13.3/arch/arm/Kconfig.debug
---- linux-3.13.3.orig/arch/arm/Kconfig.debug 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/Kconfig.debug 2014-02-17 22:41:01.000000000 +0100
+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
@@ -882,6 +882,14 @@
options; the platform specific options are deprecated
and will be soon removed.
@@ -2399,9 +2399,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/Kconfig.debug linux-3.13.3/arch/arm/Kconfig
endchoice
config DEBUG_EXYNOS_UART
-diff -Nur linux-3.13.3.orig/arch/arm/kernel/fiqasm.S linux-3.13.3/arch/arm/kernel/fiqasm.S
---- linux-3.13.3.orig/arch/arm/kernel/fiqasm.S 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/kernel/fiqasm.S 2014-02-17 22:41:01.000000000 +0100
+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
@@ -25,6 +25,9 @@
ENTRY(__set_fiq_regs)
mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE
@@ -2420,9 +2420,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/kernel/fiqasm.S linux-3.13.3/arch/arm/kerne
+ENTRY(__FIQ_Branch)
+ mov pc, r8
+ENDPROC(__FIQ_Branch)
-diff -Nur linux-3.13.3.orig/arch/arm/kernel/fiq.c linux-3.13.3/arch/arm/kernel/fiq.c
---- linux-3.13.3.orig/arch/arm/kernel/fiq.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/kernel/fiq.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -142,6 +142,7 @@
EXPORT_SYMBOL(set_fiq_handler);
EXPORT_SYMBOL(__set_fiq_regs); /* defined in fiqasm.S */
@@ -2431,9 +2431,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/kernel/fiq.c linux-3.13.3/arch/arm/kernel/f
EXPORT_SYMBOL(claim_fiq);
EXPORT_SYMBOL(release_fiq);
EXPORT_SYMBOL(enable_fiq);
-diff -Nur linux-3.13.3.orig/arch/arm/kernel/process.c linux-3.13.3/arch/arm/kernel/process.c
---- linux-3.13.3.orig/arch/arm/kernel/process.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/kernel/process.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -176,6 +176,16 @@
default_idle();
}
@@ -2451,9 +2451,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/kernel/process.c linux-3.13.3/arch/arm/kern
/*
* Called by kexec, immediately prior to machine_kexec().
*
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/armctrl.c linux-3.13.3/arch/arm/mach-bcm2708/armctrl.c
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/armctrl.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,219 @@
+/*
+ * linux/arch/arm/mach-bcm2708/armctrl.c
@@ -2674,9 +2674,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/armctrl.c linux-3.13.3/arch/ar
+ init_FIQ(FIQ_START);
+ return 0;
+}
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/armctrl.h linux-3.13.3/arch/arm/mach-bcm2708/armctrl.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/armctrl.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,27 @@
+/*
+ * linux/arch/arm/mach-bcm2708/armctrl.h
@@ -2705,9 +2705,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/armctrl.h linux-3.13.3/arch/ar
+ u32 armctrl_sources, u32 resume_sources);
+
+#endif
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/bcm2708.c linux-3.13.3/arch/arm/mach-bcm2708/bcm2708.c
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/bcm2708.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1129 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708.c
@@ -3838,9 +3838,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/bcm2708.c linux-3.13.3/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.3.orig/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-3.13.3/arch/arm/mach-bcm2708/bcm2708_gpio.c
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/bcm2708_gpio.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,361 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708_gpio.c
@@ -4203,9 +4203,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-3.13.3/ar
+
+MODULE_DESCRIPTION("Broadcom BCM2708 GPIO driver");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/bcm2708.h linux-3.13.3/arch/arm/mach-bcm2708/bcm2708.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/bcm2708.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,49 @@
+/*
+ * linux/arch/arm/mach-bcm2708/bcm2708.h
@@ -4256,9 +4256,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/bcm2708.h linux-3.13.3/arch/ar
+}
+
+#endif
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/clock.c linux-3.13.3/arch/arm/mach-bcm2708/clock.c
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/clock.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/clock.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,61 @@
+/*
+ * linux/arch/arm/mach-bcm2708/clock.c
@@ -4321,9 +4321,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/clock.c linux-3.13.3/arch/arm/
+ return -EIO;
+}
+EXPORT_SYMBOL(clk_set_rate);
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/clock.h linux-3.13.3/arch/arm/mach-bcm2708/clock.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/clock.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/clock.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,24 @@
+/*
+ * linux/arch/arm/mach-bcm2708/clock.h
@@ -4349,9 +4349,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/clock.h linux-3.13.3/arch/arm/
+struct clk {
+ unsigned long rate;
+};
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/dma.c linux-3.13.3/arch/arm/mach-bcm2708/dma.c
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/dma.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,407 @@
+/*
+ * linux/arch/arm/mach-bcm2708/dma.c
@@ -4760,9 +4760,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/dma.c linux-3.13.3/arch/arm/ma
+MODULE_LICENSE("GPL");
+
+MODULE_PARM_DESC(dmachans, "Bitmap of DMA channels available to the ARM");
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/arm_control.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/arm_control.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,419 @@
+/*
+ * linux/arch/arm/mach-bcm2708/arm_control.h
@@ -5183,9 +5183,9 @@ diff -Nur linux-3.13.3.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.3.orig/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/arm_power.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/arm_power.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,60 @@
+/*
+ * linux/arch/arm/mach-bcm2708/include/mach/arm_power.h
@@ -5247,9 +5247,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/arm_power.h linux
+};
+
+#endif
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/clkdev.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/clkdev.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,7 @@
+#ifndef __ASM_MACH_CLKDEV_H
+#define __ASM_MACH_CLKDEV_H
@@ -5258,9 +5258,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-3.
+#define __clk_put(clk) do { } while (0)
+
+#endif
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-3.13.3/arch/arm/mach-bcm2708/include/mach/debug-macro.S
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,22 @@
+/* arch/arm/mach-bcm2708/include/mach/debug-macro.S
+ *
@@ -5284,9 +5284,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/debug-macro.S lin
+ .endm
+
+#include <debug/pl01x.S>
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/dma.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/dma.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/dma.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,90 @@
+/*
+ * linux/arch/arm/mach-bcm2708/include/mach/dma.h
@@ -5378,9 +5378,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/dma.h linux-3.13.
+
+
+#endif /* _MACH_BCM2708_DMA_H */
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-3.13.3/arch/arm/mach-bcm2708/include/mach/entry-macro.S
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,69 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/entry-macro.S
@@ -5451,9 +5451,9 @@ diff -Nur linux-3.13.3.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.3.orig/arch/arm/mach-bcm2708/include/mach/frc.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/frc.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/frc.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/timex.h
@@ -5493,9 +5493,9 @@ diff -Nur linux-3.13.3.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.3.orig/arch/arm/mach-bcm2708/include/mach/gpio.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/gpio.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/gpio.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,17 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/gpio.h
@@ -5514,9 +5514,9 @@ diff -Nur linux-3.13.3.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.3.orig/arch/arm/mach-bcm2708/include/mach/hardware.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/hardware.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/hardware.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,28 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/hardware.h
@@ -5546,9 +5546,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/hardware.h linux-
+#include <mach/platform.h>
+
+#endif
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/io.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/io.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/io.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,27 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/io.h
@@ -5577,9 +5577,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/io.h linux-3.13.3
+#define __io(a) __typesafe_io(a)
+
+#endif
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/irqs.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/irqs.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/irqs.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,199 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/irqs.h
@@ -5780,9 +5780,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/irqs.h linux-3.13
+
+
+#endif /* _BCM2708_IRQS_H_ */
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/memory.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/memory.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/memory.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,57 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/memory.h
@@ -5841,9 +5841,9 @@ diff -Nur linux-3.13.3.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.3.orig/arch/arm/mach-bcm2708/include/mach/platform.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/platform.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/platform.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,228 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/platform.h
@@ -6073,9 +6073,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/platform.h linux-
+#endif
+
+/* END */
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/power.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/power.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/power.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,26 @@
+/*
+ * linux/arch/arm/mach-bcm2708/power.h
@@ -6103,9 +6103,9 @@ diff -Nur linux-3.13.3.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.3.orig/arch/arm/mach-bcm2708/include/mach/system.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/system.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/system.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/system.h
@@ -6145,9 +6145,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/system.h linux-3.
+}
+
+#endif
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/timex.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/timex.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/timex.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,23 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/timex.h
@@ -6172,9 +6172,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/timex.h linux-3.1
+ */
+
+#define CLOCK_TICK_RATE (1000000)
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/uncompress.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/uncompress.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,84 @@
+/*
+ * arch/arm/mach-bcn2708/include/mach/uncompress.h
@@ -6260,9 +6260,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/uncompress.h linu
+ * nothing to do
+ */
+#define arch_decomp_wdog()
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/vcio.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/vcio.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/vcio.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,141 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/vcio.h
@@ -6405,9 +6405,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/vcio.h linux-3.13
+#define DEVICE_FILE_NAME "char_dev"
+
+#endif
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/vc_mem.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,35 @@
+/*****************************************************************************
+* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved.
@@ -6444,9 +6444,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-3.
+#endif
+
+#endif /* VC_MEM_H */
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-3.13.3/arch/arm/mach-bcm2708/include/mach/vmalloc.h
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,20 @@
+/*
+ * arch/arm/mach-bcm2708/include/mach/vmalloc.h
@@ -6468,9 +6468,9 @@ diff -Nur linux-3.13.3.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.3.orig/arch/arm/mach-bcm2708/Kconfig linux-3.13.3/arch/arm/mach-bcm2708/Kconfig
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,41 @@
+menu "Broadcom BCM2708 Implementations"
+ depends on ARCH_BCM2708
@@ -6513,9 +6513,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/Kconfig linux-3.13.3/arch/arm/
+ help
+ Binds spidev driver to the SPI0 master
+endmenu
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/Makefile linux-3.13.3/arch/arm/mach-bcm2708/Makefile
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,7 @@
+#
+# Makefile for the linux kernel.
@@ -6524,16 +6524,16 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/Makefile linux-3.13.3/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.3.orig/arch/arm/mach-bcm2708/Makefile.boot linux-3.13.3/arch/arm/mach-bcm2708/Makefile.boot
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/Makefile.boot 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,3 @@
+ zreladdr-y := 0x00008000
+params_phys-y := 0x00000100
+initrd_phys-y := 0x00800000
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/power.c linux-3.13.3/arch/arm/mach-bcm2708/power.c
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/power.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,194 @@
+/*
+ * linux/arch/arm/mach-bcm2708/power.c
@@ -6729,9 +6729,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/power.c linux-3.13.3/arch/arm/
+MODULE_AUTHOR("Phil Elwell");
+MODULE_DESCRIPTION("Interface to BCM2708 power management");
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/vcio.c linux-3.13.3/arch/arm/mach-bcm2708/vcio.c
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/vcio.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,474 @@
+/*
+ * linux/arch/arm/mach-bcm2708/vcio.c
@@ -7207,9 +7207,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/vcio.c linux-3.13.3/arch/arm/m
+MODULE_DESCRIPTION("ARM I/O to VideoCore processor");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:bcm-mbox");
-diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/vc_mem.c linux-3.13.3/arch/arm/mach-bcm2708/vc_mem.c
---- linux-3.13.3.orig/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/arch/arm/mach-bcm2708/vc_mem.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,432 @@
+/*****************************************************************************
+* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved.
@@ -7643,9 +7643,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mach-bcm2708/vc_mem.c linux-3.13.3/arch/arm
+module_param(mem_size, uint, 0644);
+module_param(mem_base, uint, 0644);
+
-diff -Nur linux-3.13.3.orig/arch/arm/Makefile linux-3.13.3/arch/arm/Makefile
---- linux-3.13.3.orig/arch/arm/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -147,6 +147,7 @@
# by CONFIG_* macro name.
machine-$(CONFIG_ARCH_AT91) += at91
@@ -7654,9 +7654,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/Makefile linux-3.13.3/arch/arm/Makefile
machine-$(CONFIG_ARCH_BCM2835) += bcm2835
machine-$(CONFIG_ARCH_CLPS711X) += clps711x
machine-$(CONFIG_ARCH_CNS3XXX) += cns3xxx
-diff -Nur linux-3.13.3.orig/arch/arm/mm/Kconfig linux-3.13.3/arch/arm/mm/Kconfig
---- linux-3.13.3.orig/arch/arm/mm/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/mm/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -358,7 +358,7 @@
# ARMv6
@@ -7666,9 +7666,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mm/Kconfig linux-3.13.3/arch/arm/mm/Kconfig
select CPU_32v6
select CPU_ABRT_EV6
select CPU_CACHE_V6
-diff -Nur linux-3.13.3.orig/arch/arm/mm/proc-v6.S linux-3.13.3/arch/arm/mm/proc-v6.S
---- linux-3.13.3.orig/arch/arm/mm/proc-v6.S 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/mm/proc-v6.S 2014-02-17 22:41:01.000000000 +0100
+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
@@ -73,10 +73,19 @@
*
* IRQs are already disabled.
@@ -7692,9 +7692,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/mm/proc-v6.S linux-3.13.3/arch/arm/mm/proc-
mov pc, lr
ENTRY(cpu_v6_dcache_clean_area)
-diff -Nur linux-3.13.3.orig/arch/arm/tools/mach-types linux-3.13.3/arch/arm/tools/mach-types
---- linux-3.13.3.orig/arch/arm/tools/mach-types 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/arch/arm/tools/mach-types 2014-02-17 22:41:01.000000000 +0100
+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
@@ -522,6 +522,7 @@
prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103
paz00 MACH_PAZ00 PAZ00 3128
@@ -7703,9 +7703,9 @@ diff -Nur linux-3.13.3.orig/arch/arm/tools/mach-types linux-3.13.3/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.3.orig/Documentation/video4linux/bcm2835-v4l2.txt linux-3.13.3/Documentation/video4linux/bcm2835-v4l2.txt
---- linux-3.13.3.orig/Documentation/video4linux/bcm2835-v4l2.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/Documentation/video4linux/bcm2835-v4l2.txt 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,60 @@
+
+BCM2835 (aka Raspberry Pi) V4L2 driver
@@ -7767,9 +7767,9 @@ diff -Nur linux-3.13.3.orig/Documentation/video4linux/bcm2835-v4l2.txt linux-3.1
+List of available formats:
+
+$ v4l2-ctl --list-formats
-diff -Nur linux-3.13.3.orig/drivers/char/broadcom/Kconfig linux-3.13.3/drivers/char/broadcom/Kconfig
---- linux-3.13.3.orig/drivers/char/broadcom/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/char/broadcom/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,16 @@
+#
+# Broadcom char driver config
@@ -7787,14 +7787,14 @@ diff -Nur linux-3.13.3.orig/drivers/char/broadcom/Kconfig linux-3.13.3/drivers/c
+ help
+ Helper for videocore CMA access.
+
-diff -Nur linux-3.13.3.orig/drivers/char/broadcom/Makefile linux-3.13.3/drivers/char/broadcom/Makefile
---- linux-3.13.3.orig/drivers/char/broadcom/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/char/broadcom/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1 @@
+obj-$(CONFIG_BCM_VC_CMA) += vc_cma/
-diff -Nur linux-3.13.3.orig/drivers/char/broadcom/vc_cma/Makefile linux-3.13.3/drivers/char/broadcom/vc_cma/Makefile
---- linux-3.13.3.orig/drivers/char/broadcom/vc_cma/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/char/broadcom/vc_cma/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,14 @@
+EXTRA_CFLAGS += -Wall -Wstrict-prototypes -Wno-trigraphs
+EXTRA_CFLAGS += -Werror
@@ -7810,9 +7810,9 @@ diff -Nur linux-3.13.3.orig/drivers/char/broadcom/vc_cma/Makefile linux-3.13.3/d
+obj-$(CONFIG_BCM_VC_CMA) += vc-cma.o
+
+vc-cma-objs := vc_cma.o
-diff -Nur linux-3.13.3.orig/drivers/char/broadcom/vc_cma/vc_cma.c linux-3.13.3/drivers/char/broadcom/vc_cma/vc_cma.c
---- linux-3.13.3.orig/drivers/char/broadcom/vc_cma/vc_cma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/char/broadcom/vc_cma/vc_cma.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1143 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -8957,9 +8957,9 @@ diff -Nur linux-3.13.3.orig/drivers/char/broadcom/vc_cma/vc_cma.c linux-3.13.3/d
+module_exit(vc_cma_exit);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Broadcom Corporation");
-diff -Nur linux-3.13.3.orig/drivers/char/hw_random/bcm2708-rng.c linux-3.13.3/drivers/char/hw_random/bcm2708-rng.c
---- linux-3.13.3.orig/drivers/char/hw_random/bcm2708-rng.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/char/hw_random/bcm2708-rng.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -9078,9 +9078,9 @@ diff -Nur linux-3.13.3.orig/drivers/char/hw_random/bcm2708-rng.c linux-3.13.3/dr
+
+MODULE_DESCRIPTION("BCM2708 H/W Random Number Generator (RNG) driver");
+MODULE_LICENSE("GPL and additional rights");
-diff -Nur linux-3.13.3.orig/drivers/char/hw_random/Kconfig linux-3.13.3/drivers/char/hw_random/Kconfig
---- linux-3.13.3.orig/drivers/char/hw_random/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/char/hw_random/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -341,6 +341,17 @@
If unsure, say Y.
@@ -9099,18 +9099,18 @@ diff -Nur linux-3.13.3.orig/drivers/char/hw_random/Kconfig linux-3.13.3/drivers/
config HW_RANDOM_MSM
tristate "Qualcomm MSM Random Number Generator support"
depends on HW_RANDOM && ARCH_MSM
-diff -Nur linux-3.13.3.orig/drivers/char/hw_random/Makefile linux-3.13.3/drivers/char/hw_random/Makefile
---- linux-3.13.3.orig/drivers/char/hw_random/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/char/hw_random/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -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.3.orig/drivers/char/Kconfig linux-3.13.3/drivers/char/Kconfig
---- linux-3.13.3.orig/drivers/char/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/char/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -580,6 +580,8 @@
source "drivers/s390/char/Kconfig"
@@ -9120,18 +9120,18 @@ diff -Nur linux-3.13.3.orig/drivers/char/Kconfig linux-3.13.3/drivers/char/Kconf
config MSM_SMD_PKT
bool "Enable device interface for some SMD packet ports"
default n
-diff -Nur linux-3.13.3.orig/drivers/char/Makefile linux-3.13.3/drivers/char/Makefile
---- linux-3.13.3.orig/drivers/char/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/char/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -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.3.orig/drivers/cpufreq/bcm2835-cpufreq.c linux-3.13.3/drivers/cpufreq/bcm2835-cpufreq.c
---- linux-3.13.3.orig/drivers/cpufreq/bcm2835-cpufreq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/cpufreq/bcm2835-cpufreq.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,239 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -9372,9 +9372,9 @@ diff -Nur linux-3.13.3.orig/drivers/cpufreq/bcm2835-cpufreq.c linux-3.13.3/drive
+
+module_init(bcm2835_cpufreq_module_init);
+module_exit(bcm2835_cpufreq_module_exit);
-diff -Nur linux-3.13.3.orig/drivers/cpufreq/Kconfig.arm linux-3.13.3/drivers/cpufreq/Kconfig.arm
---- linux-3.13.3.orig/drivers/cpufreq/Kconfig.arm 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/cpufreq/Kconfig.arm 2014-02-17 22:41:01.000000000 +0100
+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
@@ -218,6 +218,14 @@
help
This adds the CPUFreq driver support for SPEAr SOCs.
@@ -9390,9 +9390,9 @@ diff -Nur linux-3.13.3.orig/drivers/cpufreq/Kconfig.arm linux-3.13.3/drivers/cpu
config ARM_TEGRA_CPUFREQ
bool "TEGRA CPUFreq support"
depends on ARCH_TEGRA
-diff -Nur linux-3.13.3.orig/drivers/cpufreq/Makefile linux-3.13.3/drivers/cpufreq/Makefile
---- linux-3.13.3.orig/drivers/cpufreq/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/cpufreq/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -73,6 +73,7 @@
obj-$(CONFIG_ARM_SA1100_CPUFREQ) += sa1100-cpufreq.o
obj-$(CONFIG_ARM_SA1110_CPUFREQ) += sa1110-cpufreq.o
@@ -9401,9 +9401,9 @@ diff -Nur linux-3.13.3.orig/drivers/cpufreq/Makefile linux-3.13.3/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.3.orig/drivers/dma/bcm2708-dmaengine.c linux-3.13.3/drivers/dma/bcm2708-dmaengine.c
---- linux-3.13.3.orig/drivers/dma/bcm2708-dmaengine.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/dma/bcm2708-dmaengine.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,588 @@
+/*
+ * BCM2708 DMA engine support
@@ -9993,9 +9993,9 @@ diff -Nur linux-3.13.3.orig/drivers/dma/bcm2708-dmaengine.c linux-3.13.3/drivers
+MODULE_DESCRIPTION("BCM2708 DMA engine driver");
+MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+MODULE_LICENSE("GPL v2");
-diff -Nur linux-3.13.3.orig/drivers/dma/Kconfig linux-3.13.3/drivers/dma/Kconfig
---- linux-3.13.3.orig/drivers/dma/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/dma/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -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 +10009,9 @@ diff -Nur linux-3.13.3.orig/drivers/dma/Kconfig linux-3.13.3/drivers/dma/Kconfig
config MMP_PDMA
bool "MMP PDMA support"
depends on (ARCH_MMP || ARCH_PXA)
-diff -Nur linux-3.13.3.orig/drivers/dma/Makefile linux-3.13.3/drivers/dma/Makefile
---- linux-3.13.3.orig/drivers/dma/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/dma/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -38,6 +38,7 @@
obj-$(CONFIG_DMA_SA11X0) += sa11x0-dma.o
obj-$(CONFIG_MMP_TDMA) += mmp_tdma.o
@@ -10020,9 +10020,9 @@ diff -Nur linux-3.13.3.orig/drivers/dma/Makefile linux-3.13.3/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.3.orig/drivers/hwmon/bcm2835-hwmon.c linux-3.13.3/drivers/hwmon/bcm2835-hwmon.c
---- linux-3.13.3.orig/drivers/hwmon/bcm2835-hwmon.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/hwmon/bcm2835-hwmon.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,219 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -10243,9 +10243,9 @@ diff -Nur linux-3.13.3.orig/drivers/hwmon/bcm2835-hwmon.c linux-3.13.3/drivers/h
+MODULE_DESCRIPTION("HW Monitor driver for bcm2835 chip");
+
+module_platform_driver(bcm2835_hwmon_driver);
-diff -Nur linux-3.13.3.orig/drivers/hwmon/Kconfig linux-3.13.3/drivers/hwmon/Kconfig
---- linux-3.13.3.orig/drivers/hwmon/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/hwmon/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -1554,6 +1554,16 @@
help
Support for the A/D converter on MC13783 and MC13892 PMIC.
@@ -10263,9 +10263,9 @@ diff -Nur linux-3.13.3.orig/drivers/hwmon/Kconfig linux-3.13.3/drivers/hwmon/Kco
if ACPI
comment "ACPI drivers"
-diff -Nur linux-3.13.3.orig/drivers/hwmon/Makefile linux-3.13.3/drivers/hwmon/Makefile
---- linux-3.13.3.orig/drivers/hwmon/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/hwmon/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -142,6 +142,7 @@
obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o
obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o
@@ -10274,9 +10274,9 @@ diff -Nur linux-3.13.3.orig/drivers/hwmon/Makefile linux-3.13.3/drivers/hwmon/Ma
obj-$(CONFIG_PMBUS) += pmbus/
-diff -Nur linux-3.13.3.orig/drivers/i2c/busses/i2c-bcm2708.c linux-3.13.3/drivers/i2c/busses/i2c-bcm2708.c
---- linux-3.13.3.orig/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/i2c/busses/i2c-bcm2708.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,408 @@
+/*
+ * Driver for Broadcom BCM2708 BSC Controllers
@@ -10686,9 +10686,9 @@ diff -Nur linux-3.13.3.orig/drivers/i2c/busses/i2c-bcm2708.c linux-3.13.3/driver
+MODULE_AUTHOR("Chris Boot <bootc@bootc.net>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRV_NAME);
-diff -Nur linux-3.13.3.orig/drivers/i2c/busses/Kconfig linux-3.13.3/drivers/i2c/busses/Kconfig
---- linux-3.13.3.orig/drivers/i2c/busses/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/i2c/busses/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -347,6 +347,25 @@
This support is also available as a module. If so, the module
will be called i2c-bcm2835.
@@ -10715,9 +10715,9 @@ diff -Nur linux-3.13.3.orig/drivers/i2c/busses/Kconfig linux-3.13.3/drivers/i2c/
config I2C_BCM_KONA
tristate "BCM Kona I2C adapter"
depends on ARCH_BCM_MOBILE
-diff -Nur linux-3.13.3.orig/drivers/i2c/busses/Makefile linux-3.13.3/drivers/i2c/busses/Makefile
---- linux-3.13.3.orig/drivers/i2c/busses/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/i2c/busses/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -32,6 +32,7 @@
obj-$(CONFIG_I2C_AT91) += i2c-at91.o
obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o
@@ -10726,9 +10726,9 @@ diff -Nur linux-3.13.3.orig/drivers/i2c/busses/Makefile linux-3.13.3/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.3.orig/drivers/media/dvb-core/dvb-usb-ids.h linux-3.13.3/drivers/media/dvb-core/dvb-usb-ids.h
---- linux-3.13.3.orig/drivers/media/dvb-core/dvb-usb-ids.h 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/media/dvb-core/dvb-usb-ids.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -366,6 +366,7 @@
#define USB_PID_TERRATEC_DVBS2CI_V2 0x10ac
#define USB_PID_TECHNISAT_USB2_HDCI_V1 0x0001
@@ -10737,9 +10737,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/dvb-core/dvb-usb-ids.h linux-3.13.3/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.3.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linux-3.13.3/drivers/media/platform/bcm2835/bcm2835-camera.c
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/bcm2835-camera.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/bcm2835-camera.c 2014-02-17 22:41:01.000000000 +0100
+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 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -12363,9 +12363,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu
+
+module_init(bm2835_mmal_init);
+module_exit(bm2835_mmal_exit);
-diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linux-3.13.3/drivers/media/platform/bcm2835/bcm2835-camera.h
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/bcm2835-camera.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/bcm2835-camera.h 2014-02-17 22:41:01.000000000 +0100
+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 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -12480,9 +12480,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/media/platform/bcm2835/controls.c linux-3.13.3/drivers/media/platform/bcm2835/controls.c
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/controls.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/controls.c 2014-02-17 22:41:01.000000000 +0100
+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 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -13386,9 +13386,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/controls.c linux-3.13
+
+ return 0;
+}
-diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/Kconfig linux-3.13.3/drivers/media/platform/bcm2835/Kconfig
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,25 @@
+# Broadcom VideoCore IV v4l2 camera support
+
@@ -13415,18 +13415,18 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/Kconfig linux-3.13.3/
+
+
+endif # VIDEO_BM2835
-diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/Makefile linux-3.13.3/drivers/media/platform/bcm2835/Makefile
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -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.3.orig/drivers/media/platform/bcm2835/mmal-common.h linux-3.13.3/drivers/media/platform/bcm2835/mmal-common.h
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/mmal-common.h 2014-02-17 22:41:01.000000000 +0100
+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 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -13480,9 +13480,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-common.h linux-3
+ u32 v;
+};
+
-diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-encodings.h linux-3.13.3/drivers/media/platform/bcm2835/mmal-encodings.h
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-encodings.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/mmal-encodings.h 2014-02-17 22:41:01.000000000 +0100
+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 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -13577,9 +13577,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/media/platform/bcm2835/mmal-msg-common.h linux-3.13.3/drivers/media/platform/bcm2835/mmal-msg-common.h
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg-common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/mmal-msg-common.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,50 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -13631,9 +13631,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg-common.h lin
+};
+
+#endif /* MMAL_MSG_COMMON_H */
-diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg-format.h linux-3.13.3/drivers/media/platform/bcm2835/mmal-msg-format.h
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg-format.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/mmal-msg-format.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,81 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -13716,9 +13716,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg-format.h lin
+};
+
+#endif /* MMAL_MSG_FORMAT_H */
-diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg.h linux-3.13.3/drivers/media/platform/bcm2835/mmal-msg.h
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/mmal-msg.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,404 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -14124,9 +14124,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg.h linux-3.13
+ u8 payload[MMAL_MSG_MAX_PAYLOAD];
+ } u;
+};
-diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg-port.h linux-3.13.3/drivers/media/platform/bcm2835/mmal-msg-port.h
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg-port.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/mmal-msg-port.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,107 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -14235,9 +14235,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-msg-port.h linux
+ */
+
+};
-diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-parameters.h linux-3.13.3/drivers/media/platform/bcm2835/mmal-parameters.h
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-parameters.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/mmal-parameters.h 2014-02-17 22:41:01.000000000 +0100
+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 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -14801,9 +14801,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/media/platform/bcm2835/mmal-vchiq.c linux-3.13.3/drivers/media/platform/bcm2835/mmal-vchiq.c
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-vchiq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/mmal-vchiq.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1916 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -16721,9 +16721,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-vchiq.c linux-3.
+ kfree(instance);
+ return -ENODEV;
+}
-diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-vchiq.h linux-3.13.3/drivers/media/platform/bcm2835/mmal-vchiq.h
---- linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-vchiq.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/bcm2835/mmal-vchiq.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,178 @@
+/*
+ * Broadcom BM2835 V4L2 driver
@@ -16903,9 +16903,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/bcm2835/mmal-vchiq.h linux-3.
+ struct mmal_buffer *buf);
+
+#endif /* MMAL_VCHIQ_H */
-diff -Nur linux-3.13.3.orig/drivers/media/platform/Kconfig linux-3.13.3/drivers/media/platform/Kconfig
---- linux-3.13.3.orig/drivers/media/platform/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -124,6 +124,7 @@
source "drivers/media/platform/soc_camera/Kconfig"
source "drivers/media/platform/exynos4-is/Kconfig"
@@ -16914,9 +16914,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/Kconfig linux-3.13.3/drivers/
endif # V4L_PLATFORM_DRIVERS
-diff -Nur linux-3.13.3.orig/drivers/media/platform/Makefile linux-3.13.3/drivers/media/platform/Makefile
---- linux-3.13.3.orig/drivers/media/platform/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/media/platform/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -54,4 +54,6 @@
obj-$(CONFIG_ARCH_OMAP) += omap/
@@ -16924,9 +16924,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/platform/Makefile linux-3.13.3/drivers
+obj-$(CONFIG_VIDEO_BCM2835) += bcm2835/
+
ccflags-y += -I$(srctree)/drivers/media/i2c
-diff -Nur linux-3.13.3.orig/drivers/media/usb/dvb-usb-v2/az6007.c linux-3.13.3/drivers/media/usb/dvb-usb-v2/az6007.c
---- linux-3.13.3.orig/drivers/media/usb/dvb-usb-v2/az6007.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/media/usb/dvb-usb-v2/az6007.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -68,6 +68,19 @@
.microcode_name = "dvb-usb-terratec-h7-drxk.fw",
};
@@ -17014,9 +17014,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/usb/dvb-usb-v2/az6007.c linux-3.13.3/d
{0},
};
-diff -Nur linux-3.13.3.orig/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-3.13.3/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
---- linux-3.13.3.orig/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -1423,6 +1423,10 @@
&rtl2832u_props, "Compro VideoMate U620F", NULL) },
{ DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394,
@@ -17028,9 +17028,9 @@ diff -Nur linux-3.13.3.orig/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-3.13.3
{ 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.3.orig/drivers/misc/Kconfig linux-3.13.3/drivers/misc/Kconfig
---- linux-3.13.3.orig/drivers/misc/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/misc/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -524,5 +524,6 @@
source "drivers/misc/altera-stapl/Kconfig"
source "drivers/misc/mei/Kconfig"
@@ -17038,18 +17038,18 @@ diff -Nur linux-3.13.3.orig/drivers/misc/Kconfig linux-3.13.3/drivers/misc/Kconf
+source "drivers/misc/vc04_services/Kconfig"
source "drivers/misc/mic/Kconfig"
endmenu
-diff -Nur linux-3.13.3.orig/drivers/misc/Makefile linux-3.13.3/drivers/misc/Makefile
---- linux-3.13.3.orig/drivers/misc/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/misc/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -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.3.orig/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-3.13.3/drivers/misc/vc04_services/interface/vchi/connections/connection.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,328 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -17379,9 +17379,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/connection
+#endif /* CONNECTION_H_ */
+
+/****************************** End of file **********************************/
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-3.13.3/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -17587,9 +17587,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/message_dr
+#endif // _VCHI_MESSAGE_H_
+
+/****************************** End of file ***********************************/
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,224 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -17815,9 +17815,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h
+#endif /* VCHI_CFG_H_ */
+
+/****************************** End of file **********************************/
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -17890,9 +17890,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg_i
+//#define VCHI_RX_NANOLOCKS
+
+#endif /*VCHI_CFG_INTERNAL_H_*/
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi_common.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -18057,9 +18057,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_commo
+
+
+#endif // VCHI_COMMON_H_
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi.h linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,373 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -18434,9 +18434,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi.h lin
+#endif /* VCHI_H_ */
+
+/****************************** End of file **********************************/
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi_mh.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -18480,9 +18480,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchi/vchi_mh.h
+#define VCHI_MEM_HANDLE_INVALID 0
+
+#endif
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,561 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -19045,9 +19045,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+
+ kfree(pagelist);
+}
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -19091,9 +19091,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,2813 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -21908,9 +21908,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22124,9 +22124,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+
+
+#endif /* VCHIQ_ARM_H */
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22165,9 +22165,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22229,9 +22229,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+#endif
+
+#endif /* VCHIQ_CFG_H */
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22352,9 +22352,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -22406,9 +22406,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+void vchiq_call_connected_callbacks(void);
+
+#endif /* VCHIQ_CONNECTED_H */
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,3824 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -26234,9 +26234,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ numBytes = 0;
+ }
+}
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,706 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -26944,9 +26944,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ size_t numBytes);
+
+#endif
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,87 @@
+#!/usr/bin/perl -w
+
@@ -27035,9 +27035,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ return vchiq_build_time;
+}
+EOF
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27079,9 +27079,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+#include "vchiq_util.h"
+
+#endif
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27271,9 +27271,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ short *peer_version);
+
+#endif /* VCHIQ_IF_H */
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27404,9 +27404,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+#define VCHIQ_IOC_MAX 15
+
+#endif
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,456 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27864,9 +27864,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+
+ return status;
+}
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -27939,9 +27939,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ const VCHIQ_PLATFORM_DATA_T * platform_data);
+
+#endif
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -28001,9 +28001,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+} FRAGMENTS_T;
+
+#endif /* VCHIQ_PAGELIST_H */
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,253 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -28258,9 +28258,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+}
+
+#endif
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,828 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -29090,9 +29090,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+ return ret;
+}
+EXPORT_SYMBOL(vchi_service_release);
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -29245,9 +29245,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+
+ return header;
+}
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -29330,9 +29330,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c
---- linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2010-2012 Broadcom. All rights reserved.
@@ -29393,9 +29393,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq
+{
+ return vchiq_build_time;
+}
-diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/Kconfig linux-3.13.3/drivers/misc/vc04_services/Kconfig
---- linux-3.13.3.orig/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,9 @@
+config BCM2708_VCHIQ
+ tristate "Videocore VCHIQ"
@@ -29406,9 +29406,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/Kconfig linux-3.13.3/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.3.orig/drivers/misc/vc04_services/Makefile linux-3.13.3/drivers/misc/vc04_services/Makefile
---- linux-3.13.3.orig/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/misc/vc04_services/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,17 @@
+ifeq ($(CONFIG_MACH_BCM2708),y)
+
@@ -29427,9 +29427,9 @@ diff -Nur linux-3.13.3.orig/drivers/misc/vc04_services/Makefile linux-3.13.3/dri
+EXTRA_CFLAGS += -DVCOS_VERIFY_BKPTS=1 -Idrivers/misc/vc04_services -DUSE_VCHIQ_ARM -D__VCCOREVER__=0x04000000
+
+endif
-diff -Nur linux-3.13.3.orig/drivers/mmc/card/block.c linux-3.13.3/drivers/mmc/card/block.c
---- linux-3.13.3.orig/drivers/mmc/card/block.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/mmc/card/block.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -1361,7 +1361,7 @@
brq->data.blocks = 1;
}
@@ -29439,9 +29439,9 @@ diff -Nur linux-3.13.3.orig/drivers/mmc/card/block.c linux-3.13.3/drivers/mmc/ca
/* SPI multiblock writes terminate using a special
* token, not a STOP_TRANSMISSION request.
*/
-diff -Nur linux-3.13.3.orig/drivers/mmc/core/sd.c linux-3.13.3/drivers/mmc/core/sd.c
---- linux-3.13.3.orig/drivers/mmc/core/sd.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/mmc/core/sd.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -15,6 +15,8 @@
#include <linux/slab.h>
#include <linux/stat.h>
@@ -29596,9 +29596,9 @@ diff -Nur linux-3.13.3.orig/drivers/mmc/core/sd.c linux-3.13.3/drivers/mmc/core/
return err;
/*
-diff -Nur linux-3.13.3.orig/drivers/mmc/host/Kconfig linux-3.13.3/drivers/mmc/host/Kconfig
---- linux-3.13.3.orig/drivers/mmc/host/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/mmc/host/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -260,6 +260,27 @@
If you have a controller with this interface, say Y or M here.
@@ -29627,9 +29627,9 @@ diff -Nur linux-3.13.3.orig/drivers/mmc/host/Kconfig linux-3.13.3/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.3.orig/drivers/mmc/host/Makefile linux-3.13.3/drivers/mmc/host/Makefile
---- linux-3.13.3.orig/drivers/mmc/host/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/mmc/host/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -15,6 +15,7 @@
obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o
obj-$(CONFIG_MMC_SDHCI_SIRF) += sdhci-sirf.o
@@ -29638,9 +29638,9 @@ diff -Nur linux-3.13.3.orig/drivers/mmc/host/Makefile linux-3.13.3/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.3.orig/drivers/mmc/host/sdhci-bcm2708.c linux-3.13.3/drivers/mmc/host/sdhci-bcm2708.c
---- linux-3.13.3.orig/drivers/mmc/host/sdhci-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/mmc/host/sdhci-bcm2708.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1410 @@
+/*
+ * sdhci-bcm2708.c Support for SDHCI device on BCM2708
@@ -31052,9 +31052,9 @@ diff -Nur linux-3.13.3.orig/drivers/mmc/host/sdhci-bcm2708.c linux-3.13.3/driver
+MODULE_PARM_DESC(extra_messages, "Enable more sdcard warning messages");
+
+
-diff -Nur linux-3.13.3.orig/drivers/mmc/host/sdhci.c linux-3.13.3/drivers/mmc/host/sdhci.c
---- linux-3.13.3.orig/drivers/mmc/host/sdhci.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/mmc/host/sdhci.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -28,6 +28,7 @@
#include <linux/mmc/mmc.h>
#include <linux/mmc/host.h>
@@ -31896,9 +31896,9 @@ diff -Nur linux-3.13.3.orig/drivers/mmc/host/sdhci.c linux-3.13.3/drivers/mmc/ho
}
sdhci_disable_card_detection(host);
-diff -Nur linux-3.13.3.orig/drivers/mmc/host/sdhci-esdhc-imx.c linux-3.13.3/drivers/mmc/host/sdhci-esdhc-imx.c
---- linux-3.13.3.orig/drivers/mmc/host/sdhci-esdhc-imx.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/mmc/host/sdhci-esdhc-imx.c 2014-02-17 22:45:44.000000000 +0100
+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)
@@ -31908,9 +31908,9 @@ diff -Nur linux-3.13.3.orig/drivers/mmc/host/sdhci-esdhc-imx.c linux-3.13.3/driv
struct esdhc_soc_data {
u32 flags;
};
-diff -Nur linux-3.13.3.orig/drivers/mmc/host/sdhci.h linux-3.13.3/drivers/mmc/host/sdhci.h
---- linux-3.13.3.orig/drivers/mmc/host/sdhci.h 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/mmc/host/sdhci.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -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 +31969,9 @@ diff -Nur linux-3.13.3.orig/drivers/mmc/host/sdhci.h linux-3.13.3/drivers/mmc/ho
+
+
#endif /* __SDHCI_HW_H */
-diff -Nur linux-3.13.3.orig/drivers/net/usb/smsc95xx.c linux-3.13.3/drivers/net/usb/smsc95xx.c
---- linux-3.13.3.orig/drivers/net/usb/smsc95xx.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/net/usb/smsc95xx.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -61,6 +61,7 @@
#define SUSPEND_SUSPEND3 (0x08)
#define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \
@@ -32051,9 +32051,9 @@ diff -Nur linux-3.13.3.orig/drivers/net/usb/smsc95xx.c linux-3.13.3/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.3.orig/drivers/spi/Kconfig linux-3.13.3/drivers/spi/Kconfig
---- linux-3.13.3.orig/drivers/spi/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/spi/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -85,6 +85,14 @@
is for the regular SPI controller. Slave mode operation is not also
not supported.
@@ -32069,9 +32069,9 @@ diff -Nur linux-3.13.3.orig/drivers/spi/Kconfig linux-3.13.3/drivers/spi/Kconfig
config SPI_BFIN5XX
tristate "SPI controller driver for ADI Blackfin5xx"
depends on BLACKFIN && !BF60x
-diff -Nur linux-3.13.3.orig/drivers/spi/Makefile linux-3.13.3/drivers/spi/Makefile
---- linux-3.13.3.orig/drivers/spi/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/spi/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -18,6 +18,7 @@
obj-$(CONFIG_SPI_BCM63XX) += spi-bcm63xx.o
obj-$(CONFIG_SPI_BFIN5XX) += spi-bfin5xx.o
@@ -32080,9 +32080,9 @@ diff -Nur linux-3.13.3.orig/drivers/spi/Makefile linux-3.13.3/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.3.orig/drivers/spi/spi-bcm2708.c linux-3.13.3/drivers/spi/spi-bcm2708.c
---- linux-3.13.3.orig/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/spi/spi-bcm2708.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,626 @@
+/*
+ * Driver for Broadcom BCM2708 SPI Controllers
@@ -32710,9 +32710,9 @@ diff -Nur linux-3.13.3.orig/drivers/spi/spi-bcm2708.c linux-3.13.3/drivers/spi/s
+MODULE_AUTHOR("Chris Boot <bootc@bootc.net>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRV_NAME);
-diff -Nur linux-3.13.3.orig/drivers/staging/media/lirc/Kconfig linux-3.13.3/drivers/staging/media/lirc/Kconfig
---- linux-3.13.3.orig/drivers/staging/media/lirc/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/staging/media/lirc/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -38,6 +38,12 @@
help
Driver for Homebrew Parallel Port Receivers
@@ -32726,9 +32726,9 @@ diff -Nur linux-3.13.3.orig/drivers/staging/media/lirc/Kconfig linux-3.13.3/driv
config LIRC_SASEM
tristate "Sasem USB IR Remote"
depends on LIRC && USB
-diff -Nur linux-3.13.3.orig/drivers/staging/media/lirc/lirc_rpi.c linux-3.13.3/drivers/staging/media/lirc/lirc_rpi.c
---- linux-3.13.3.orig/drivers/staging/media/lirc/lirc_rpi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/staging/media/lirc/lirc_rpi.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,693 @@
+/*
+ * lirc_rpi.c
@@ -33423,9 +33423,9 @@ diff -Nur linux-3.13.3.orig/drivers/staging/media/lirc/lirc_rpi.c linux-3.13.3/d
+
+module_param(debug, bool, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(debug, "Enable debugging messages");
-diff -Nur linux-3.13.3.orig/drivers/staging/media/lirc/Makefile linux-3.13.3/drivers/staging/media/lirc/Makefile
---- linux-3.13.3.orig/drivers/staging/media/lirc/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/staging/media/lirc/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -7,6 +7,7 @@
obj-$(CONFIG_LIRC_IGORPLUGUSB) += lirc_igorplugusb.o
obj-$(CONFIG_LIRC_IMON) += lirc_imon.o
@@ -33434,9 +33434,9 @@ diff -Nur linux-3.13.3.orig/drivers/staging/media/lirc/Makefile linux-3.13.3/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.3.orig/drivers/thermal/bcm2835-thermal.c linux-3.13.3/drivers/thermal/bcm2835-thermal.c
---- linux-3.13.3.orig/drivers/thermal/bcm2835-thermal.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/thermal/bcm2835-thermal.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,184 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -33622,9 +33622,9 @@ diff -Nur linux-3.13.3.orig/drivers/thermal/bcm2835-thermal.c linux-3.13.3/drive
+MODULE_DESCRIPTION("Thermal driver for bcm2835 chip");
+
+module_platform_driver(bcm2835_thermal_driver);
-diff -Nur linux-3.13.3.orig/drivers/thermal/Kconfig linux-3.13.3/drivers/thermal/Kconfig
---- linux-3.13.3.orig/drivers/thermal/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/thermal/Kconfig 2014-02-17 22:41:01.000000000 +0100
+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
@@ -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 +33638,9 @@ diff -Nur linux-3.13.3.orig/drivers/thermal/Kconfig linux-3.13.3/drivers/thermal
config X86_PKG_TEMP_THERMAL
tristate "X86 package temperature thermal driver"
depends on X86_THERMAL_VECTOR
-diff -Nur linux-3.13.3.orig/drivers/thermal/Makefile linux-3.13.3/drivers/thermal/Makefile
---- linux-3.13.3.orig/drivers/thermal/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/thermal/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -27,5 +27,6 @@
obj-$(CONFIG_IMX_THERMAL) += imx_thermal.o
obj-$(CONFIG_DB8500_CPUFREQ_COOLING) += db8500_cpufreq_cooling.o
@@ -33648,9 +33648,9 @@ diff -Nur linux-3.13.3.orig/drivers/thermal/Makefile linux-3.13.3/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.3.orig/drivers/tty/serial/amba-pl011.c linux-3.13.3/drivers/tty/serial/amba-pl011.c
---- linux-3.13.3.orig/drivers/tty/serial/amba-pl011.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/tty/serial/amba-pl011.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -84,7 +84,7 @@
static unsigned int get_fifosize_arm(struct amba_device *dev)
@@ -33660,9 +33660,9 @@ diff -Nur linux-3.13.3.orig/drivers/tty/serial/amba-pl011.c linux-3.13.3/drivers
}
static struct vendor_data vendor_arm = {
-diff -Nur linux-3.13.3.orig/drivers/usb/core/generic.c linux-3.13.3/drivers/usb/core/generic.c
---- linux-3.13.3.orig/drivers/usb/core/generic.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/usb/core/generic.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -152,6 +152,7 @@
dev_warn(&udev->dev,
"no configuration chosen from %d choice%s\n",
@@ -33671,9 +33671,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/core/generic.c linux-3.13.3/drivers/usb/
}
return i;
}
-diff -Nur linux-3.13.3.orig/drivers/usb/core/message.c linux-3.13.3/drivers/usb/core/message.c
---- linux-3.13.3.orig/drivers/usb/core/message.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/usb/core/message.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -1889,6 +1889,85 @@
if (cp->string == NULL &&
!(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
@@ -33760,9 +33760,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/core/message.c linux-3.13.3/drivers/usb/
/* Now that the interfaces are installed, re-enable LPM. */
usb_unlocked_enable_lpm(dev);
-diff -Nur linux-3.13.3.orig/drivers/usb/core/otg_whitelist.h linux-3.13.3/drivers/usb/core/otg_whitelist.h
---- linux-3.13.3.orig/drivers/usb/core/otg_whitelist.h 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/usb/core/otg_whitelist.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -19,33 +19,82 @@
static struct usb_device_id whitelist_table [] = {
@@ -33978,9 +33978,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/core/otg_whitelist.h linux-3.13.3/driver
#endif
}
-diff -Nur linux-3.13.3.orig/drivers/usb/gadget/file_storage.c linux-3.13.3/drivers/usb/gadget/file_storage.c
---- linux-3.13.3.orig/drivers/usb/gadget/file_storage.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/gadget/file_storage.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,3676 @@
+/*
+ * file_storage.c -- File-backed USB Storage Gadget, for USB development
@@ -37658,9 +37658,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/gadget/file_storage.c linux-3.13.3/drive
+ kref_put(&fsg->ref, fsg_release);
+}
+module_exit(fsg_cleanup);
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/changes.txt linux-3.13.3/drivers/usb/host/dwc_common_port/changes.txt
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/changes.txt 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/changes.txt 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,174 @@
+
+dwc_read_reg32() and friends now take an additional parameter, a pointer to an
@@ -37836,9 +37836,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-3.13.3/drivers/usb/host/dwc_common_port/doc/doxygen.cfg
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,270 @@
+# Doxyfile 1.4.5
+
@@ -38110,9 +38110,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_common_port/dwc_cc.c linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_cc.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_cc.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,532 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.c $
@@ -38646,9 +38646,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_cc.c linux-3.13
+}
+
+#endif /* DWC_CCLIB */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_cc.h linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_cc.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_cc.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,224 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.h $
@@ -38874,9 +38874,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_cc.h linux-3.13
+#endif
+
+#endif /* _DWC_CC_H_ */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1308 @@
+#include "dwc_os.h"
+#include "dwc_list.h"
@@ -40186,9 +40186,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c l
+{
+ return wq->pending;
+}
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_common_linux.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1431 @@
+#include <linux/kernel.h>
+#include <linux/init.h>
@@ -41621,9 +41621,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_common_linux.c
+MODULE_LICENSE ("GPL");
+
+#endif /* DWC_LIBMODULE */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1275 @@
+#include "dwc_os.h"
+#include "dwc_list.h"
@@ -42900,9 +42900,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c l
+{
+ return wq->pending;
+}
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_crypto.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_crypto.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_crypto.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,308 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.c $
@@ -43212,9 +43212,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-
+}
+
+#endif /* DWC_CRYPTOLIB */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_crypto.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_crypto.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_crypto.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,111 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.h $
@@ -43327,9 +43327,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-
+#endif
+
+#endif /* _DWC_CRYPTO_H_ */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_dh.c linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_dh.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_dh.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_dh.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,291 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.c $
@@ -43622,9 +43622,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_common_port/dwc_dh.h linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_dh.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_dh.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_dh.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,106 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.h $
@@ -43732,9 +43732,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_dh.h linux-3.13
+#endif
+
+#endif /* _DWC_DH_H_ */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_list.h linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_list.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_list.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -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 +44330,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_list.h linux-3.
+#endif
+
+#endif /* _DWC_LIST_H_ */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_mem.c linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_mem.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_mem.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,245 @@
+/* Memory Debugging */
+#ifdef DWC_DEBUG_MEMORY
@@ -44579,9 +44579,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_mem.c linux-3.1
+}
+
+#endif /* DWC_DEBUG_MEMORY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_modpow.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_modpow.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_modpow.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,636 @@
+/* Bignum routines adapted from PUTTY sources. PuTTY copyright notice follows.
+ *
@@ -45219,9 +45219,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-
+#endif /* CONFIG_MACH_IPMATE */
+
+#endif /*DWC_CRYPTOLIB */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_modpow.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_modpow.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_modpow.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,34 @@
+/*
+ * dwc_modpow.h
@@ -45257,9 +45257,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-
+#endif
+
+#endif /* _LINUX_BIGNUM_H */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_notifier.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_notifier.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,319 @@
+#ifdef DWC_NOTIFYLIB
+
@@ -45580,9 +45580,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_notifier.c linu
+}
+
+#endif /* DWC_NOTIFYLIB */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_notifier.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_notifier.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,122 @@
+
+#ifndef __DWC_NOTIFIER_H__
@@ -45706,9 +45706,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_notifier.h linu
+#endif
+
+#endif /* __DWC_NOTIFIER_H__ */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_os.h linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_os.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/dwc_os.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1262 @@
+/* =========================================================================
+ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_os.h $
@@ -46972,9 +46972,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/dwc_os.h linux-3.13
+#endif
+
+#endif /* _DWC_OS_H_ */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/Makefile linux-3.13.3/drivers/usb/host/dwc_common_port/Makefile
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,58 @@
+#
+# Makefile for DWC_common library
@@ -47034,9 +47034,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-3.13.3/drivers/usb/host/dwc_common_port/Makefile.fbsd
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/Makefile.fbsd 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/Makefile.fbsd 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,17 @@
+CFLAGS += -I/sys/i386/compile/GENERIC -I/sys/i386/include -I/usr/include
+CFLAGS += -DDWC_FREEBSD
@@ -47055,9 +47055,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_common_port/Makefile.linux linux-3.13.3/drivers/usb/host/dwc_common_port/Makefile.linux
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/Makefile.linux 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,49 @@
+#
+# Makefile for DWC_common library
@@ -47108,9 +47108,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_common_port/usb.h linux-3.13.3/drivers/usb/host/dwc_common_port/usb.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_common_port/usb.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,946 @@
+/*
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -48058,9 +48058,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_common_port/usb.h linux-3.13.3/
+#endif
+
+#endif /* _USB_H_ */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-3.13.3/drivers/usb/host/dwc_otg/doc/doxygen.cfg
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/doc/doxygen.cfg 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,224 @@
+# Doxyfile 1.3.9.1
+
@@ -48286,9 +48286,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_otg/dummy_audio.c linux-3.13.3/drivers/usb/host/dwc_otg/dummy_audio.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dummy_audio.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1575 @@
+/*
+ * zero.c -- Gadget Zero, for USB development
@@ -49865,9 +49865,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dummy_audio.c linux-3.13.3/
+ remove_proc_entry("isoc_test", NULL);
+}
+module_exit (cleanup);
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_cfi_common.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,142 @@
+/* ==========================================================================
+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
@@ -50011,9 +50011,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_adp.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_adp.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,854 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.c $
@@ -50869,9 +50869,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-3.13.3/
+#endif
+ return 1;
+}
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_adp.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_adp.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,80 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.h $
@@ -50953,9 +50953,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-3.13.3/
+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.3.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_attr.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1210 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.c $
@@ -52167,9 +52167,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-3.13.3
+ device_remove_file(&dev->dev, &dev_attr_sleep_status);
+#endif
+}
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_attr.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,89 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.h $
@@ -52260,9 +52260,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-3.13.3
+#endif
+ );
+#endif
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cfi.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1876 @@
+/* ==========================================================================
+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
@@ -54140,9 +54140,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-3.13.3/
+}
+
+#endif //DWC_UTE_CFI
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cfi.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,320 @@
+/* ==========================================================================
+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
@@ -54464,9 +54464,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-3.13.3/
+int cfi_setup(struct dwc_otg_pcd *pcd, struct cfi_usb_ctrlrequest *ctrl);
+
+#endif /* (__DWC_OTG_CFI_H__) */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cil.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,7151 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.c $
@@ -61619,9 +61619,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-3.13.3/
+ dwc_otg_pcd_start_srp_timer(core_if);
+ return;
+}
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cil.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1464 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.h $
@@ -63087,9 +63087,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-3.13.3/
+//////////////////////////////////////////////////////////////////////
+
+#endif
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1588 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil_intr.c $
@@ -64679,9 +64679,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-3.
+
+ return retval;
+}
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_core_if.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,705 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_core_if.h $
@@ -65388,9 +65388,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-3.1
+/** @} */
+
+#endif /* __DWC_CORE_IF_H__ */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_dbg.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,117 @@
+/* ==========================================================================
+ *
@@ -65509,9 +65509,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-3.13.3/
+
+#endif /*DEBUG*/
+#endif
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_driver.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1742 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.c $
@@ -67255,9 +67255,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-3.13
+ </td></tr>
+
+*/
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_driver.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,86 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.h $
@@ -67345,9 +67345,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-3.13
+#endif
+
+#endif
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,3685 @@
+
+/* ==========================================================================
@@ -71034,9 +71034,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-3.13.3/
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1132 @@
+/*==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_ddma.c $
@@ -72170,9 +72170,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-3.
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,851 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd.h $
@@ -73025,9 +73025,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-3.13.3/
+#endif
+#endif
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,417 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_if.h $
@@ -73446,9 +73446,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,2741 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_intr.c $
@@ -76191,9 +76191,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-3.
+ return retval;
+}
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,972 @@
+
+/* ==========================================================================
@@ -77167,9 +77167,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-3
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,959 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_queue.c $
@@ -78130,9 +78130,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-3
+}
+
+#endif /* DWC_DEVICE_ONLY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,113 @@
+#include "dwc_otg_regs.h"
+#include "dwc_otg_dbg.h"
@@ -78247,9 +78247,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-3.
+
+ return;
+}
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,48 @@
+#ifndef __DWC_OTG_MPHI_FIX_H__
+#define __DWC_OTG_MPHI_FIX_H__
@@ -78299,9 +78299,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,188 @@
+#ifndef _DWC_OS_DEP_H_
+#define _DWC_OS_DEP_H_
@@ -78491,9 +78491,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-3.13
+
+
+#endif /* _DWC_OS_DEP_H_ */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,2708 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.c $
@@ -81203,9 +81203,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-3.13.3/
+}
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,266 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.h $
@@ -81473,9 +81473,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-3.13.3/
+extern void do_test_mode(void *data);
+#endif
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,360 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_if.h $
@@ -81837,9 +81837,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,5147 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_intr.c $
@@ -86988,9 +86988,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-3.
+}
+
+#endif /* DWC_HOST_ONLY */
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,1358 @@
+ /* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_linux.c $
@@ -88350,9 +88350,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_regs.h
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,2550 @@
+/* ==========================================================================
+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_regs.h $
@@ -90904,9 +90904,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-3.13.3
+} gpwrdn_data_t;
+
+#endif
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/Makefile linux-3.13.3/drivers/usb/host/dwc_otg/Makefile
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,81 @@
+#
+# Makefile for DWC_otg Highspeed USB controller driver
@@ -90989,9 +90989,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/Makefile linux-3.13.3/drive
+ rm -rf *.o *.ko .*cmd *.mod.c .tmp_versions Module.symvers
+
+endif
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-3.13.3/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,337 @@
+package dwc_otg_test;
+
@@ -91330,9 +91330,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-
+);
+
+1;
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/Makefile linux-3.13.3/drivers/usb/host/dwc_otg/test/Makefile
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/test/Makefile 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,16 @@
+
+PERL=/usr/bin/perl
@@ -91350,9 +91350,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/Makefile linux-3.13.3/
+ else echo "=======> $$test, FAILED" ; \
+ fi \
+ done
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-3.13.3/drivers/usb/host/dwc_otg/test/test_mod_param.pl
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,133 @@
+#!/usr/bin/perl -w
+#
@@ -91487,9 +91487,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/test_mod_param.pl linu
+
+test_main();
+0;
-diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-3.13.3/drivers/usb/host/dwc_otg/test/test_sysfs.pl
---- linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2014-02-17 22:41:01.000000000 +0100
+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
@@ -0,0 +1,193 @@
+#!/usr/bin/perl -w
+#
@@ -91684,9 +91684,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-3.
+
+test_main();
+0;
-diff -Nur linux-3.13.3.orig/drivers/usb/host/Kconfig linux-3.13.3/drivers/usb/host/Kconfig
---- linux-3.13.3.orig/drivers/usb/host/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/Kconfig 2014-02-17 22:41:02.000000000 +0100
+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
@@ -689,6 +689,19 @@
To compile this driver a module, choose M here: the module
will be called "hwa-hc".
@@ -91707,9 +91707,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/Kconfig linux-3.13.3/drivers/usb/ho
config USB_IMX21_HCD
tristate "i.MX21 HCD support"
depends on ARM && ARCH_MXC
-diff -Nur linux-3.13.3.orig/drivers/usb/host/Makefile linux-3.13.3/drivers/usb/host/Makefile
---- linux-3.13.3.orig/drivers/usb/host/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/usb/host/Makefile 2014-02-17 22:41:02.000000000 +0100
+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
@@ -65,6 +65,8 @@
obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o
obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o
@@ -91719,9 +91719,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/host/Makefile linux-3.13.3/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.3.orig/drivers/usb/Makefile linux-3.13.3/drivers/usb/Makefile
---- linux-3.13.3.orig/drivers/usb/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/usb/Makefile 2014-02-17 22:41:02.000000000 +0100
+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
@@ -23,6 +23,7 @@
obj-$(CONFIG_USB_R8A66597_HCD) += host/
obj-$(CONFIG_USB_HWA_HCD) += host/
@@ -91730,9 +91730,9 @@ diff -Nur linux-3.13.3.orig/drivers/usb/Makefile linux-3.13.3/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.3.orig/drivers/video/bcm2708_fb.c linux-3.13.3/drivers/video/bcm2708_fb.c
---- linux-3.13.3.orig/drivers/video/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/video/bcm2708_fb.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,765 @@
+/*
+ * linux/drivers/video/bcm2708_fb.c
@@ -92499,9 +92499,9 @@ diff -Nur linux-3.13.3.orig/drivers/video/bcm2708_fb.c linux-3.13.3/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.3.orig/drivers/video/cfbimgblt.c linux-3.13.3/drivers/video/cfbimgblt.c
---- linux-3.13.3.orig/drivers/video/cfbimgblt.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/video/cfbimgblt.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -28,6 +28,11 @@
*
* Also need to add code to deal with cards endians that are different than
@@ -92675,9 +92675,9 @@ diff -Nur linux-3.13.3.orig/drivers/video/cfbimgblt.c linux-3.13.3/drivers/video
slow_imageblit(image, p, dst1, fgcolor, bgcolor,
start_index, pitch_index);
} else
-diff -Nur linux-3.13.3.orig/drivers/video/fbmem.c linux-3.13.3/drivers/video/fbmem.c
---- linux-3.13.3.orig/drivers/video/fbmem.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/video/fbmem.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -1083,6 +1083,25 @@
}
EXPORT_SYMBOL(fb_blank);
@@ -92736,9 +92736,9 @@ diff -Nur linux-3.13.3.orig/drivers/video/fbmem.c linux-3.13.3/drivers/video/fbm
arg = (unsigned long) compat_ptr(arg);
case FBIOBLANK:
ret = do_fb_ioctl(info, cmd, arg);
-diff -Nur linux-3.13.3.orig/drivers/video/Kconfig linux-3.13.3/drivers/video/Kconfig
---- linux-3.13.3.orig/drivers/video/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/video/Kconfig 2014-02-17 22:41:02.000000000 +0100
+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
@@ -310,6 +310,20 @@
help
Support the Permedia2 FIFO disconnect feature.
@@ -92760,9 +92760,9 @@ diff -Nur linux-3.13.3.orig/drivers/video/Kconfig linux-3.13.3/drivers/video/Kco
config FB_ARMCLCD
tristate "ARM PrimeCell PL110 support"
depends on FB && ARM && ARM_AMBA
-diff -Nur linux-3.13.3.orig/drivers/video/logo/logo_linux_clut224.ppm linux-3.13.3/drivers/video/logo/logo_linux_clut224.ppm
---- linux-3.13.3.orig/drivers/video/logo/logo_linux_clut224.ppm 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/video/logo/logo_linux_clut224.ppm 2014-02-17 22:41:02.000000000 +0100
+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
@@ -1,1604 +1,883 @@
P3
-# Standard 224-color Linux logo
@@ -95249,9 +95249,9 @@ diff -Nur linux-3.13.3.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.3.orig/drivers/video/Makefile linux-3.13.3/drivers/video/Makefile
---- linux-3.13.3.orig/drivers/video/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/video/Makefile 2014-02-17 22:41:02.000000000 +0100
+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
@@ -100,6 +100,7 @@
obj-$(CONFIG_FB_VOODOO1) += sstfb.o
obj-$(CONFIG_FB_ARMCLCD) += amba-clcd.o
@@ -95260,9 +95260,9 @@ diff -Nur linux-3.13.3.orig/drivers/video/Makefile linux-3.13.3/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.3.orig/drivers/w1/masters/w1-gpio.c linux-3.13.3/drivers/w1/masters/w1-gpio.c
---- linux-3.13.3.orig/drivers/w1/masters/w1-gpio.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/w1/masters/w1-gpio.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -22,6 +22,9 @@
#include "../w1.h"
#include "../w1_int.h"
@@ -95304,9 +95304,9 @@ diff -Nur linux-3.13.3.orig/drivers/w1/masters/w1-gpio.c linux-3.13.3/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.3.orig/drivers/w1/w1.h linux-3.13.3/drivers/w1/w1.h
---- linux-3.13.3.orig/drivers/w1/w1.h 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/w1/w1.h 2014-02-17 22:41:02.000000000 +0100
+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
@@ -148,6 +148,12 @@
*/
u8 (*set_pullup)(void *, int);
@@ -95320,9 +95320,9 @@ diff -Nur linux-3.13.3.orig/drivers/w1/w1.h linux-3.13.3/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.3.orig/drivers/w1/w1_int.c linux-3.13.3/drivers/w1/w1_int.c
---- linux-3.13.3.orig/drivers/w1/w1_int.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/w1/w1_int.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -117,19 +117,21 @@
printk(KERN_ERR "w1_add_master_device: invalid function set\n");
return(-EINVAL);
@@ -95352,9 +95352,9 @@ diff -Nur linux-3.13.3.orig/drivers/w1/w1_int.c linux-3.13.3/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.3.orig/drivers/w1/w1_io.c linux-3.13.3/drivers/w1/w1_io.c
---- linux-3.13.3.orig/drivers/w1/w1_io.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/w1/w1_io.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -127,10 +127,22 @@
static void w1_post_write(struct w1_master *dev)
{
@@ -95381,9 +95381,9 @@ diff -Nur linux-3.13.3.orig/drivers/w1/w1_io.c linux-3.13.3/drivers/w1/w1_io.c
dev->pullup_duration = 0;
}
}
-diff -Nur linux-3.13.3.orig/drivers/watchdog/bcm2708_wdog.c linux-3.13.3/drivers/watchdog/bcm2708_wdog.c
---- linux-3.13.3.orig/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/drivers/watchdog/bcm2708_wdog.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,384 @@
+/*
+ * Broadcom BCM2708 watchdog driver.
@@ -95769,9 +95769,9 @@ diff -Nur linux-3.13.3.orig/drivers/watchdog/bcm2708_wdog.c linux-3.13.3/drivers
+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
+MODULE_ALIAS_MISCDEV(TEMP_MINOR);
+MODULE_LICENSE("GPL");
-diff -Nur linux-3.13.3.orig/drivers/watchdog/Kconfig linux-3.13.3/drivers/watchdog/Kconfig
---- linux-3.13.3.orig/drivers/watchdog/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/watchdog/Kconfig 2014-02-17 22:41:02.000000000 +0100
+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
@@ -392,6 +392,12 @@
To compile this driver as a module, choose M here: the
module will be called retu_wdt.
@@ -95785,9 +95785,9 @@ diff -Nur linux-3.13.3.orig/drivers/watchdog/Kconfig linux-3.13.3/drivers/watchd
config MOXART_WDT
tristate "MOXART watchdog"
depends on ARCH_MOXART
-diff -Nur linux-3.13.3.orig/drivers/watchdog/Makefile linux-3.13.3/drivers/watchdog/Makefile
---- linux-3.13.3.orig/drivers/watchdog/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/drivers/watchdog/Makefile 2014-02-17 22:41:02.000000000 +0100
+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
@@ -54,6 +54,7 @@
obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
obj-$(CONFIG_UX500_WATCHDOG) += ux500_wdt.o
@@ -95796,9 +95796,9 @@ diff -Nur linux-3.13.3.orig/drivers/watchdog/Makefile linux-3.13.3/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.3.orig/include/linux/broadcom/vc_cma.h linux-3.13.3/include/linux/broadcom/vc_cma.h
---- linux-3.13.3.orig/include/linux/broadcom/vc_cma.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/include/linux/broadcom/vc_cma.h 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,29 @@
+/*****************************************************************************
+* Copyright 2012 Broadcom Corporation. All rights reserved.
@@ -95829,9 +95829,9 @@ diff -Nur linux-3.13.3.orig/include/linux/broadcom/vc_cma.h linux-3.13.3/include
+#endif
+
+#endif /* VC_CMA_H */
-diff -Nur linux-3.13.3.orig/include/linux/mmc/host.h linux-3.13.3/include/linux/mmc/host.h
---- linux-3.13.3.orig/include/linux/mmc/host.h 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/include/linux/mmc/host.h 2014-02-17 22:41:02.000000000 +0100
+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
@@ -282,6 +282,7 @@
MMC_CAP2_PACKED_WR)
#define MMC_CAP2_NO_PRESCAN_POWERUP (1 << 14) /* Don't power up before scan */
@@ -95840,9 +95840,9 @@ diff -Nur linux-3.13.3.orig/include/linux/mmc/host.h linux-3.13.3/include/linux/
mmc_pm_flag_t pm_caps; /* supported pm features */
-diff -Nur linux-3.13.3.orig/include/linux/mmc/sdhci.h linux-3.13.3/include/linux/mmc/sdhci.h
---- linux-3.13.3.orig/include/linux/mmc/sdhci.h 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/include/linux/mmc/sdhci.h 2014-02-17 22:41:02.000000000 +0100
+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
@@ -102,6 +102,7 @@
#define SDHCI_QUIRK2_BROKEN_HS200 (1<<6)
@@ -95867,9 +95867,9 @@ diff -Nur linux-3.13.3.orig/include/linux/mmc/sdhci.h linux-3.13.3/include/linux
struct mmc_data *data; /* Current data request */
unsigned int data_early:1; /* Data finished before cmd */
-diff -Nur linux-3.13.3.orig/include/uapi/linux/fb.h linux-3.13.3/include/uapi/linux/fb.h
---- linux-3.13.3.orig/include/uapi/linux/fb.h 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/include/uapi/linux/fb.h 2014-02-17 22:41:02.000000000 +0100
+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
@@ -34,6 +34,11 @@
#define FBIOPUT_MODEINFO 0x4617
#define FBIOGET_DISPINFO 0x4618
@@ -95882,10 +95882,10 @@ diff -Nur linux-3.13.3.orig/include/uapi/linux/fb.h linux-3.13.3/include/uapi/li
#define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */
#define FB_TYPE_PLANES 1 /* Non interleaved planes */
-diff -Nur linux-3.13.3.orig/kernel/cgroup.c linux-3.13.3/kernel/cgroup.c
---- linux-3.13.3.orig/kernel/cgroup.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/kernel/cgroup.c 2014-02-17 22:41:02.000000000 +0100
-@@ -5483,6 +5483,33 @@
+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
+@@ -5485,6 +5485,33 @@
}
__setup("cgroup_disable=", cgroup_disable);
@@ -95919,9 +95919,5686 @@ diff -Nur linux-3.13.3.orig/kernel/cgroup.c linux-3.13.3/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.3.orig/mm/memcontrol.c linux-3.13.3/mm/memcontrol.c
---- linux-3.13.3.orig/mm/memcontrol.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/mm/memcontrol.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -7030,6 +7030,7 @@
.bind = mem_cgroup_bind,
.base_cftypes = mem_cgroup_files,
@@ -95930,9 +101607,9 @@ diff -Nur linux-3.13.3.orig/mm/memcontrol.c linux-3.13.3/mm/memcontrol.c
};
#ifdef CONFIG_MEMCG_SWAP
-diff -Nur linux-3.13.3.orig/sound/arm/bcm2835.c linux-3.13.3/sound/arm/bcm2835.c
---- linux-3.13.3.orig/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/arm/bcm2835.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,413 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -96347,9 +102024,9 @@ diff -Nur linux-3.13.3.orig/sound/arm/bcm2835.c linux-3.13.3/sound/arm/bcm2835.c
+MODULE_DESCRIPTION("Alsa driver for BCM2835 chip");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:bcm2835_alsa");
-diff -Nur linux-3.13.3.orig/sound/arm/bcm2835-ctl.c linux-3.13.3/sound/arm/bcm2835-ctl.c
---- linux-3.13.3.orig/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/arm/bcm2835-ctl.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,200 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -96551,9 +102228,9 @@ diff -Nur linux-3.13.3.orig/sound/arm/bcm2835-ctl.c linux-3.13.3/sound/arm/bcm28
+ }
+ return 0;
+}
-diff -Nur linux-3.13.3.orig/sound/arm/bcm2835.h linux-3.13.3/sound/arm/bcm2835.h
---- linux-3.13.3.orig/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/arm/bcm2835.h 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,157 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -96712,9 +102389,9 @@ diff -Nur linux-3.13.3.orig/sound/arm/bcm2835.h linux-3.13.3/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.3.orig/sound/arm/bcm2835-pcm.c linux-3.13.3/sound/arm/bcm2835-pcm.c
---- linux-3.13.3.orig/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/arm/bcm2835-pcm.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,426 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -97142,9 +102819,9 @@ diff -Nur linux-3.13.3.orig/sound/arm/bcm2835-pcm.c linux-3.13.3/sound/arm/bcm28
+
+ return 0;
+}
-diff -Nur linux-3.13.3.orig/sound/arm/bcm2835-vchiq.c linux-3.13.3/sound/arm/bcm2835-vchiq.c
---- linux-3.13.3.orig/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/arm/bcm2835-vchiq.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,879 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -98025,9 +103702,9 @@ diff -Nur linux-3.13.3.orig/sound/arm/bcm2835-vchiq.c linux-3.13.3/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.3.orig/sound/arm/Kconfig linux-3.13.3/sound/arm/Kconfig
---- linux-3.13.3.orig/sound/arm/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/sound/arm/Kconfig 2014-02-17 22:41:02.000000000 +0100
+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
@@ -39,5 +39,12 @@
Say Y or M if you want to support any AC97 codec attached to
the PXA2xx AC97 interface.
@@ -98041,9 +103718,9 @@ diff -Nur linux-3.13.3.orig/sound/arm/Kconfig linux-3.13.3/sound/arm/Kconfig
+
endif # SND_ARM
-diff -Nur linux-3.13.3.orig/sound/arm/Makefile linux-3.13.3/sound/arm/Makefile
---- linux-3.13.3.orig/sound/arm/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/sound/arm/Makefile 2014-02-17 22:41:02.000000000 +0100
+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
@@ -14,3 +14,8 @@
obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o
@@ -98053,9 +103730,9 @@ diff -Nur linux-3.13.3.orig/sound/arm/Makefile linux-3.13.3/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.3.orig/sound/arm/vc_vchi_audioserv_defs.h linux-3.13.3/sound/arm/vc_vchi_audioserv_defs.h
---- linux-3.13.3.orig/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/arm/vc_vchi_audioserv_defs.h 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,116 @@
+/*****************************************************************************
+* Copyright 2011 Broadcom Corporation. All rights reserved.
@@ -98173,9 +103850,9 @@ diff -Nur linux-3.13.3.orig/sound/arm/vc_vchi_audioserv_defs.h linux-3.13.3/soun
+} VC_AUDIO_MSG_T;
+
+#endif // _VC_AUDIO_DEFS_H_
-diff -Nur linux-3.13.3.orig/sound/soc/bcm/bcm2708-i2s.c linux-3.13.3/sound/soc/bcm/bcm2708-i2s.c
---- linux-3.13.3.orig/sound/soc/bcm/bcm2708-i2s.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/bcm2708-i2s.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,945 @@
+/*
+ * ALSA SoC I2S Audio Layer for Broadcom BCM2708 SoC
@@ -99122,9 +104799,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/bcm2708-i2s.c linux-3.13.3/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.3.orig/sound/soc/bcm/hifiberry_dac.c linux-3.13.3/sound/soc/bcm/hifiberry_dac.c
---- linux-3.13.3.orig/sound/soc/bcm/hifiberry_dac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/hifiberry_dac.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,100 @@
+/*
+ * ASoC Driver for HifiBerry DAC
@@ -99226,9 +104903,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/hifiberry_dac.c linux-3.13.3/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.3.orig/sound/soc/bcm/hifiberry_digi.c linux-3.13.3/sound/soc/bcm/hifiberry_digi.c
---- linux-3.13.3.orig/sound/soc/bcm/hifiberry_digi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/hifiberry_digi.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,153 @@
+/*
+ * ASoC Driver for HifiBerry Digi
@@ -99383,10 +105060,10 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/hifiberry_digi.c linux-3.13.3/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.3.orig/sound/soc/bcm/Kconfig linux-3.13.3/sound/soc/bcm/Kconfig
---- linux-3.13.3.orig/sound/soc/bcm/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/Kconfig 2014-02-17 22:41:02.000000000 +0100
-@@ -0,0 +1,84 @@
+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
+@@ -0,0 +1,73 @@
+config SND_BCM2708_SOC_I2S
+ tristate "SoC Audio support for the Broadcom BCM2708 I2S module"
+ depends on MACH_BCM2708
@@ -99419,17 +105096,6 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/Kconfig linux-3.13.3/sound/soc/bcm/Kco
+ help
+ Say Y or M if you want to add support for RPi-DAC.
+
-+config SND_BCM2708_SOC_I2S
-+ tristate "SoC Audio support for the Broadcom BCM2708 I2S module"
-+ depends on MACH_BCM2708
-+ select REGMAP_MMIO
-+ select SND_SOC_DMAENGINE_PCM
-+ select SND_SOC_GENERIC_DMAENGINE_PCM
-+ help
-+ Say Y or M if you want to add support for codecs attached to
-+ the BCM2708 I2S interface. You will also need
-+ to select the audio interfaces to support below.
-+
+config SND_BCM2708_SOC_HIFIBERRY_MINI
+ tristate "Support for HifiBerry Mini"
+ depends on SND_BCM2708_SOC_I2S
@@ -99471,9 +105137,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/Kconfig linux-3.13.3/sound/soc/bcm/Kco
+ select SND_SOC_PCM5102A
+ help
+ Say Y if you want to add support for PCM5102A
-diff -Nur linux-3.13.3.orig/sound/soc/bcm/Makefile linux-3.13.3/sound/soc/bcm/Makefile
---- linux-3.13.3.orig/sound/soc/bcm/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/Makefile 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,23 @@
+# BCM2708 Platform Support
+snd-soc-bcm2708-i2s-objs := bcm2708-i2s.o
@@ -99498,9 +105164,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/Makefile linux-3.13.3/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.3.orig/sound/soc/bcm/rpi-cs534x.c linux-3.13.3/sound/soc/bcm/rpi-cs534x.c
---- linux-3.13.3.orig/sound/soc/bcm/rpi-cs534x.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/rpi-cs534x.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,105 @@
+/*
+ * ASoC driver for CS5343/CS5344 ADC
@@ -99607,9 +105273,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/rpi-cs534x.c linux-3.13.3/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.3.orig/sound/soc/bcm/rpi-dac.c linux-3.13.3/sound/soc/bcm/rpi-dac.c
---- linux-3.13.3.orig/sound/soc/bcm/rpi-dac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/rpi-dac.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,97 @@
+/*
+ * ASoC Driver for RPi-DAC.
@@ -99708,9 +105374,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/rpi-dac.c linux-3.13.3/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.3.orig/sound/soc/bcm/rpi-ess9018.c linux-3.13.3/sound/soc/bcm/rpi-ess9018.c
---- linux-3.13.3.orig/sound/soc/bcm/rpi-ess9018.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/rpi-ess9018.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,92 @@
+/*
+ * ASoC driver for ESS9018 codec
@@ -99804,9 +105470,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/rpi-ess9018.c linux-3.13.3/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.3.orig/sound/soc/bcm/rpi-mbed.c linux-3.13.3/sound/soc/bcm/rpi-mbed.c
---- linux-3.13.3.orig/sound/soc/bcm/rpi-mbed.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/rpi-mbed.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,103 @@
+/*
+ * ASoC driver for mbed AudioCODEC (with a TLV320AIC23b)
@@ -99911,9 +105577,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/rpi-mbed.c linux-3.13.3/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.3.orig/sound/soc/bcm/rpi-pcm5102a.c linux-3.13.3/sound/soc/bcm/rpi-pcm5102a.c
---- linux-3.13.3.orig/sound/soc/bcm/rpi-pcm5102a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/rpi-pcm5102a.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,93 @@
+/*
+ * ASoC driver for PCM5102A codec
@@ -100008,9 +105674,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/rpi-pcm5102a.c linux-3.13.3/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.3.orig/sound/soc/bcm/rpi-proto.c linux-3.13.3/sound/soc/bcm/rpi-proto.c
---- linux-3.13.3.orig/sound/soc/bcm/rpi-proto.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/rpi-proto.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,130 @@
+/*
+ * ASoC driver for PROTO AudioCODEC (with a WM8731)
@@ -100142,9 +105808,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/rpi-proto.c linux-3.13.3/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.3.orig/sound/soc/bcm/rpi-tda1541a.c linux-3.13.3/sound/soc/bcm/rpi-tda1541a.c
---- linux-3.13.3.orig/sound/soc/bcm/rpi-tda1541a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/bcm/rpi-tda1541a.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,92 @@
+/*
+ * ASoC driver for TDA1541A codec
@@ -100238,9 +105904,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/bcm/rpi-tda1541a.c linux-3.13.3/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.3.orig/sound/soc/codecs/Kconfig linux-3.13.3/sound/soc/codecs/Kconfig
---- linux-3.13.3.orig/sound/soc/codecs/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/sound/soc/codecs/Kconfig 2014-02-17 22:41:02.000000000 +0100
+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
@@ -59,6 +59,8 @@
select SND_SOC_PCM1681 if I2C
select SND_SOC_PCM1792A if SPI_MASTER
@@ -100263,9 +105929,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/codecs/Kconfig linux-3.13.3/sound/soc/code
config SND_SOC_RT5631
tristate
-diff -Nur linux-3.13.3.orig/sound/soc/codecs/Makefile linux-3.13.3/sound/soc/codecs/Makefile
---- linux-3.13.3.orig/sound/soc/codecs/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/sound/soc/codecs/Makefile 2014-02-17 22:41:02.000000000 +0100
+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
@@ -46,6 +46,8 @@
snd-soc-pcm1681-objs := pcm1681.o
snd-soc-pcm1792a-codec-objs := pcm1792a.o
@@ -100284,9 +105950,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/codecs/Makefile linux-3.13.3/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.3.orig/sound/soc/codecs/pcm1794a.c linux-3.13.3/sound/soc/codecs/pcm1794a.c
---- linux-3.13.3.orig/sound/soc/codecs/pcm1794a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/codecs/pcm1794a.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,62 @@
+/*
+ * Driver for the PCM1794A codec
@@ -100350,9 +106016,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/codecs/pcm1794a.c linux-3.13.3/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.3.orig/sound/soc/codecs/pcm5102a.c linux-3.13.3/sound/soc/codecs/pcm5102a.c
---- linux-3.13.3.orig/sound/soc/codecs/pcm5102a.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.13.3/sound/soc/codecs/pcm5102a.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -0,0 +1,63 @@
+/*
+ * Driver for the PCM5102A codec
@@ -100417,9 +106083,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/codecs/pcm5102a.c linux-3.13.3/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.3.orig/sound/soc/codecs/wm8804.c linux-3.13.3/sound/soc/codecs/wm8804.c
---- linux-3.13.3.orig/sound/soc/codecs/wm8804.c 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/sound/soc/codecs/wm8804.c 2014-02-17 22:41:02.000000000 +0100
+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
@@ -63,6 +63,7 @@
struct regmap *regmap;
struct regulator_bulk_data supplies[WM8804_NUM_SUPPLIES];
@@ -100505,9 +106171,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/codecs/wm8804.c linux-3.13.3/sound/soc/cod
.controls = wm8804_snd_controls,
.num_controls = ARRAY_SIZE(wm8804_snd_controls),
-diff -Nur linux-3.13.3.orig/sound/soc/codecs/wm8804.h linux-3.13.3/sound/soc/codecs/wm8804.h
---- linux-3.13.3.orig/sound/soc/codecs/wm8804.h 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/sound/soc/codecs/wm8804.h 2014-02-17 22:41:02.000000000 +0100
+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
@@ -57,5 +57,9 @@
#define WM8804_CLKOUT_SRC_OSCCLK 4
@@ -100518,9 +106184,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/codecs/wm8804.h linux-3.13.3/sound/soc/cod
+#define WM8804_MCLKDIV_128FS 1
#endif /* _WM8804_H */
-diff -Nur linux-3.13.3.orig/sound/soc/Kconfig linux-3.13.3/sound/soc/Kconfig
---- linux-3.13.3.orig/sound/soc/Kconfig 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/sound/soc/Kconfig 2014-02-17 22:41:02.000000000 +0100
+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
@@ -33,6 +33,7 @@
# All the supported SoCs
source "sound/soc/atmel/Kconfig"
@@ -100529,9 +106195,9 @@ diff -Nur linux-3.13.3.orig/sound/soc/Kconfig linux-3.13.3/sound/soc/Kconfig
source "sound/soc/blackfin/Kconfig"
source "sound/soc/cirrus/Kconfig"
source "sound/soc/davinci/Kconfig"
-diff -Nur linux-3.13.3.orig/sound/soc/Makefile linux-3.13.3/sound/soc/Makefile
---- linux-3.13.3.orig/sound/soc/Makefile 2014-02-13 23:00:14.000000000 +0100
-+++ linux-3.13.3/sound/soc/Makefile 2014-02-17 22:41:02.000000000 +0100
+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
@@ -10,6 +10,7 @@
obj-$(CONFIG_SND_SOC) += generic/
obj-$(CONFIG_SND_SOC) += atmel/
diff --git a/target/linux/patches/3.13.5/startup.patch b/target/linux/patches/3.13.6/startup.patch
index be4ea469d..be4ea469d 100644
--- a/target/linux/patches/3.13.5/startup.patch
+++ b/target/linux/patches/3.13.6/startup.patch
diff --git a/target/linux/patches/3.13.5/uuid.patch b/target/linux/patches/3.13.6/uuid.patch
index ca23accdf..ca23accdf 100644
--- a/target/linux/patches/3.13.5/uuid.patch
+++ b/target/linux/patches/3.13.6/uuid.patch
diff --git a/target/linux/patches/3.13.5/vga-cons-default-off.patch b/target/linux/patches/3.13.6/vga-cons-default-off.patch
index 08a57f783..08a57f783 100644
--- a/target/linux/patches/3.13.5/vga-cons-default-off.patch
+++ b/target/linux/patches/3.13.6/vga-cons-default-off.patch
diff --git a/target/linux/patches/3.13.5/wlan-cf.patch b/target/linux/patches/3.13.6/wlan-cf.patch
index fc20759e2..fc20759e2 100644
--- a/target/linux/patches/3.13.5/wlan-cf.patch
+++ b/target/linux/patches/3.13.6/wlan-cf.patch
diff --git a/target/linux/patches/3.13.5/xargs.patch b/target/linux/patches/3.13.6/xargs.patch
index 2c7b3df59..2c7b3df59 100644
--- a/target/linux/patches/3.13.5/xargs.patch
+++ b/target/linux/patches/3.13.6/xargs.patch
diff --git a/target/linux/patches/3.13.5/zlib-inflate.patch b/target/linux/patches/3.13.6/zlib-inflate.patch
index 58e1f6d21..58e1f6d21 100644
--- a/target/linux/patches/3.13.5/zlib-inflate.patch
+++ b/target/linux/patches/3.13.6/zlib-inflate.patch