diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2014-03-10 16:16:12 +0100 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2014-03-10 16:16:12 +0100 |
commit | 5ab921af6386c3c9ba3f2dd8b3e0db9bfd8903f4 (patch) | |
tree | 3fcbe68bf9aef3ef59eff3c17c02d9b5005e52c1 /target/linux | |
parent | 7a22456611f068b55d84fb8d36b16f8d8a408849 (diff) |
kernel bump, add hifiberry device drivers
Diffstat (limited to 'target/linux')
-rw-r--r-- | target/linux/config/Config.in.audio | 33 | ||||
-rw-r--r-- | target/linux/config/Config.in.netfilter.ip4 | 11 | ||||
-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 |